OpenMP:for循环中可能存在的不同条件
OpenMP: possible different condition in a for-loop
我想使用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
替换为一些线程安全队列。然后,您可以在并行使用多个工作者时自由地弹出和推送值。
相关文章:
- 模板元图.班级成员的条件存在
- 如果检查和内联条件之间是否存在编译器差异
- __has_include() 和后续 #include 之间是否存在争用条件
- 对条件表达式结果的赋值(其中第二个和第三个操作数是相同类型和值类别的变量)是否仍然存在?
- 根据成员变量的类型是否存在,有条件地定义该变量
- 放置多个条件时,循环是否存在限制
- 标准::condition_variable 中可能存在的争用条件
- 具有 3 个条件的 if 语句(三角形存在)
- 如果存在条件,是否有更简单的表示形式
- 检查前提条件是否存在原子增量,即原子值小于指定值
- 当只有一个线程写入 c++ 中的布尔变量时,是否存在争用条件
- 如何在Visual C++中有条件地包含一个不存在的文件
- C++ - 测试是否存在 DLL 以有条件地运行某些函数
- 在C++中,是否存在在特定条件下定义/运行宏的问题
- 循环中存在多个条件
- 存在多个条件时"IF"语句中的执行顺序
- if/else语句中存在多个条件
- 有条件地初始化一个结构体字段——仅当它存在于该结构体中时
- 如何声明在条件块之间持久存在的引用变量
- 在or条件语句中是否存在强制对两个表达式求值的模式或技巧?