【发布时间】:2010-11-22 15:36:10
【问题描述】:
我目前有一个代码(用 C 语言编写),其外部循环是 OpenMP 并行化的(它在共享内存列表上本地运行)。我正在用 C++ 重写它,对于许多事情,我发现 BOOST_FOREACH 宏是一种非常好的语法,可以作为循环结构,用于迭代列表、数组等。
我的问题是:有没有办法既可以使用该语法又可以并行化循环 OpenMP 样式?
【问题讨论】:
我目前有一个代码(用 C 语言编写),其外部循环是 OpenMP 并行化的(它在共享内存列表上本地运行)。我正在用 C++ 重写它,对于许多事情,我发现 BOOST_FOREACH 宏是一种非常好的语法,可以作为循环结构,用于迭代列表、数组等。
我的问题是:有没有办法既可以使用该语法又可以并行化循环 OpenMP 样式?
【问题讨论】:
从终端复制值 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’
【讨论】:
是的,它应该可以正常工作。 BOOST_FOREACH 只是 for 循环的辅助宏,因此 OpenMP 应该识别并并行化该循环。
【讨论】:
if-@ 987654322@... 因此,如果我将 OpenMP 指令放在宏的正上方,它们就不会位于 for 循环本身的正上方。
为什么不简单地尝试一下,然后分析结果呢?
如果 OpenMP 瘫痪了 boost_foreach,我会印象深刻,因为 foreach 严重依赖模板技巧来推断容器类型。如果我处于你的位置,我会重写 foreach 以使用常规的 for 循环。
【讨论】: