为什么OpenMP不能在for循环中包含部分?

时间:2017-12-21 00:39:32

标签: openmp

我试图通过使循环的每次迭代成为OpenMP部分来并行化OpenMP中基于范围的for循环。我想这样做:

#pragma omp parallel sections 
{

for ( auto x : range ) {
  #pragma omp section
  // LOTS OF CODE HERE
}

}

但是,这不起作用 - 编译器抱怨该部分必须在#pragma omp sections结构中。我做错了什么,或者OpenMP不够聪明,无法理解这部分是否在for循环中?

1 个答案:

答案 0 :(得分:2)

OpenMP部分用于可以并行执行的某些不相关的代码位。我们的想法是,在您的算法中,有不同的部分不是超级组织的,但可以按任何顺序执行,甚至可以并行执行。这是一种非常特别的并行化方式,您不希望在代码中看到太多。

无论如何,您的代码不符合标准,因为sections结构中的所有块都必须包含在section块内(但是第一个是可选的,因为它是隐式封闭的在第一个section区块中)。在这里,如果你在#pragma omp section循环之前在哪里添加这个隐式for,你就会发现代码的意义不大:循环在一个部分,而正文在另一个部分。 ..

这里,由于你有一个for循环,这可以很好地构建你的代码,并允许你使用omp parallel for指令。您只需要重写一下for,例如明确更好的循环边界。