我正在尝试使用openmp通过std :: set多线程循环.当我写下面的代码 -
#pragma omp parallel for
for (std::set<A>::const_iterator i = s.begin(); i != s.end(); ++i) {
const A a = *i;
operate(a);
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
error: invalid type for iteration variable 'i'
error: invalid controlling predicate
error: invalid increment expression.
Run Code Online (Sandbox Code Playgroud)
是否有另一种正确的方法来使用openmp迭代std容器?
我知道我可以使用int i
和迭代0
到s.size()
迭代器或operator[]
循环体,但这看起来不那么干净.
ste*_*han 25
stl迭代器的循环并行化仅适用于OpenMP 3.0,并且仅适用于随机访问迭代器(例如vector
和deque
).你应该可以做这样的事情:
#pragma omp parallel {
for (std::set<A>::const_iterator i = s.begin(); i != s.end(); ++i) {
#pragma omp single nowait {
operate(*i);
}
}
}
Run Code Online (Sandbox Code Playgroud)
虽然因为每个线程遍历整个序列(但只operate
在其中一些上执行),所以开销很大.使用a的int i
方法更有效.
作为替代方案,请看一下GCC的并行实现std::for_each
.看我的评论.
编辑:STL Parallism TS很可能是C++ 17的一部分,将来可能是迭代标准容器的好选择.