OpenMP 和 STL 风格
我正在尝试使用 openMP 并行化我的程序。该程序大量使用 STL 迭代器。这是说的 openMP 3.0 可以处理这个问题:
std::vector<int> N(2*N_max+1);
std::vector<int>::const_iterator n,m;
#pragma omp parallel for
for (n=N.begin(); n!=N.end(); ++n){
//Task to be in parallel
};
但我收到以下错误:
error: invalid controlling predicate
我正在使用 gcc 4.5.0,(openMP3 在 4.4.0 中实现),我的构建字符串是:
g++ -O0 -g3 -Wall -c -fmessage-length=0 -fopenmp -MMD -MP
I'm trying to parallelize my program with openMP. The program is using STL-iterators heavily. It is said that openMP 3.0 can deal with this:
std::vector<int> N(2*N_max+1);
std::vector<int>::const_iterator n,m;
#pragma omp parallel for
for (n=N.begin(); n!=N.end(); ++n){
//Task to be in parallel
};
But I got the following error:
error: invalid controlling predicate
I'm using gcc 4.5.0, (openMP3 implemented in 4.4.0) and my build string is:
g++ -O0 -g3 -Wall -c -fmessage-length=0 -fopenmp -MMD -MP
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
标准 OpenMP 通常不支持 C++ 迭代器。该标准要求迭代器是具有恒定随机访问时间的随机访问迭代器。它还只允许在 for 的测试表达式中使用
<
和<=
或>
和>=
循环,但不是!=
。如果您大量使用迭代器和 STL,那么使用线程构建块可能会更好。
Standard OpenMP doesn't bear with C++ iterators in general. The standard requires iterators to be random access iterators with constant time for random access. It also only permits
<
and<=
or>
and>=
in test expressions of for loops, but not!=
.If you are using iterators and STL heavily, you might be better off with Thread building blocks.
不幸的是,OpenMP V3.0 规范并未将“!=”作为规范 for 循环的合法语法的一部分。但是,如果您可以访问最新的英特尔编译器,他们允许将其作为扩展。
Unfortunately the OpenMP V3.0 spec didn't include "!=" as part of the legal syntax for a canonical for loop. However, if you have access to a recent Intel compiler they allowed it as an extension.