C++ OpenMP:for循环中可能存在的不同条件
我想使用OpenMP来并行化for循环(我以前也使用std::threads完成过,但那个解决方案相当难看),不过每次迭代时它的条件可能会改变。 下面是我的意思的例子:C++ OpenMP:for循环中可能存在的不同条件,c++,multithreading,for-loop,parallel-processing,openmp,C++,Multithreading,For Loop,Parallel Processing,Openmp,我想使用OpenMP来并行化for循环(我以前也使用std::threads完成过,但那个解决方案相当难看),不过每次迭代时它的条件可能会改变。 下面是我的意思的例子: #pragma omp parallel for for(int i = 0; i < someVector.size(); i++) { . . . if(something) someVector.push_back(v); } #pragma omp parallel for 对于(int i=0;i
#pragma omp parallel for
for(int i = 0; i < someVector.size(); i++)
{
. . .
if(something)
someVector.push_back(v);
}
#pragma omp parallel for
对于(int i=0;i
然而,这是行不通的。循环似乎一直延伸到初始的someVector.size()值。有没有办法在OpenMP中并行这种构造?OpenMP#pragma omp for
了解for循环中的条件。它知道它迭代从0到某个最大值的数字,因此它在开始时计算最大值,然后将工作划分为多个线程。如果最大值在循环执行过程中发生更改,则不会生效
此外,在其他线程使用时修改std::vector显然不安全。您将获得未定义的行为,可能是由于在向量增长时移动存储数据后访问释放的内存而崩溃
您可以用一些线程安全队列替换
std::vector
。然后,您可以使用多个辅助对象并行地自由地弹出和推入值。此代码不符合要求:for语句没有规范要求的规范形式,即可以使用#pragma omp parallel for
注释的循环(本规范第2.6节)
问题出在条件表达式中:规范规定,如果条件表达式的形式为
i relational op expr
,expr
必须是循环不变表达式,并且此约束不是由代码实现的。是依赖于i
的东西吗?否,它与此无关。如果它使用全局数据,那么您似乎不太可能将其并行化。