2013-07-25 147 views

回答

28

OpenMP 4.0规范在几天前完成并发布了here。它仍然强制要求的并行循环,应在规范形式(§2.6,第51页):

for (INIT-EXPR;测试EXPR;INCR-EXPR)构造块

该标准允许对提供在所有的表达式中使用的随机访问迭代容器,例如:

#pragma omp parallel for 
for (it = v.begin(); it < v.end(); it++) 
{ 
    ... 
} 

如果仍坚持使用C++ 11语法糖,如果它需要一个(比较)大量的时间来处理的stl_container每个元素,则可以使用单生产者任务图案:

#pragma omp parallel 
{ 
    #pragma omp single 
    { 
     for (auto x : stl_container) 
     { 
     #pragma omp task 
     { 
      // Do something with x, e.g. 
      compute(x); 
     } 
     } 
    } 
} 

任务会产生一定的开销,所以如果compute(x);花费很少的时间来完成,那么使用这种模式是没有意义的。

+0

我认为迭代器是现在的方法,但是如果你想让你的代码用gcc编译,你需要用!替换!=否则你会得到一个“无效的控制谓词”错误。顺便说一句,你知道为什么吗? – DarioP

+0

根据这个网站:http://www.cplusplus.com/reference/iterator/RandomAccessIterator/ 它应该工作... –

+0

在该网站,他们没有把任何编译指示周期之前。只是试着编译它:) – DarioP

相关问题