OpenMP:for循环中可能存在的不同条件

OpenMP: possible different condition in a for-loop

本文关键字:存在 条件 for 循环 OpenMP      更新时间:2023-10-16

我想使用OpenMP并行化for循环(我以前自己使用std::threads做过,但那个解决方案相当难看(,但每次迭代时它的条件可能会改变。以下是我的意思:

#pragma omp parallel for
for(int i = 0; i < someVector.size(); i++)
{
. . .
if(something)
   someVector.push_back(v);
}

然而,这并不奏效。循环似乎一直到初始的someVector.size((值。有没有一种方法可以在OpenMP中并行化这样的构造?

这段代码是不一致的:for语句没有规范要求的规范形式,不能成为可以用#pragma omp parallel for注释的循环(OpenMP 4.5规范的2.6节(。

问题出在条件表达式中:规范指出,如果条件表达式的形式为i relational-op expr,则expr必须是循环不变表达式,而代码不满足此约束。

OpenMP #pragma omp for了解for循环中的条件。它知道它在从0到某个最大值的数字上迭代,所以它在开始时计算最大值,然后将工作划分为几个线程。如果在循环执行过程中最大值发生变化,则不会产生任何效果。

此外,在其他线程使用std::vector时对其进行修改肯定不是安全操作。你会得到未定义的行为,可能是因为在向量移动存储的数据后访问释放的内存而崩溃。

您可以将std::vector替换为一些线程安全队列。然后,您可以在并行使用多个工作者时自由地弹出和推送值。