【问题标题】:Mixing Boost FOREACH macro and OpenMP parallelization混合 Boost FOREACH 宏和 OpenMP 并行化
【发布时间】:2010-11-22 15:36:10
【问题描述】:

我目前有一个代码(用 C 语言编写),其外部循环是 OpenMP 并行化的(它在共享内存列表上本地运行)。我正在用 C++ 重写它,对于许多事情,我发现 BOOST_FOREACH 宏是一种非常好的语法,可以作为循环结构,用于迭代列表、数组等。

我的问题是:有没有办法既可以使用该语法又可以并行化循环 OpenMP 样式?

【问题讨论】:

    标签: c++ boost foreach openmp


    【解决方案1】:

    从终端复制值 1 千字:

    $ g++ a.cpp -I/opt/boost-1.45.0/include -O -fopenmp   
    a.cpp: In function ‘int main()’:
    a.cpp:12: error: for statement expected before ‘if’
    

    【讨论】:

      【解决方案2】:

      是的,它应该可以正常工作。 BOOST_FOREACH 只是 for 循环的辅助宏,因此 OpenMP 应该识别并并行化该循环。

      【讨论】:

      • 我不太确定...从标题中可以看出,BOOST_FOREACH 宏扩展为不止一个 for 循环,因为它首先包含一系列 if-@ 987654322@... 因此,如果我将 OpenMP 指令放在宏的正上方,它们就不会位于 for 循环本身的正上方。
      【解决方案3】:

      为什么不简单地尝试一下,然后分析结果呢?

      如果 OpenMP 瘫痪了 boost_foreach,我会印象深刻,因为 foreach 严重依赖模板技巧来推断容器类型。如果我处于你的位置,我会重写 foreach 以使用常规的 for 循环。

      【讨论】:

      • 见鬼,这个答案有很多错误的地方......计算机科学在很大程度上不是一门经验科学。就这一点而言,如果它在给定的系统上工作,使用给定的编译器(和一组选项),它不能保证它可以在任何其他系统或任何其他编译器上工作。
      • 科学和科学,如果它快 NUM_CORES-3 倍,我仍然很确定 openMP 会使 for 循环瘫痪
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 2015-03-26
      • 2015-08-10
      • 2010-09-26
      • 2020-09-26
      • 2017-05-09
      相关资源
      最近更新 更多