我试图通过使循环的每次迭代成为OpenMP部分来并行化OpenMP中基于范围的for循环。我想这样做:
#pragma omp parallel sections
{
for ( auto x : range ) {
#pragma omp section
// LOTS OF CODE HERE
}
}
但是,这不起作用 - 编译器抱怨该部分必须在#pragma omp sections结构中。我做错了什么,或者OpenMP不够聪明,无法理解这部分是否在for循环中?
答案 0 :(得分:2)
OpenMP部分用于可以并行执行的某些不相关的代码位。我们的想法是,在您的算法中,有不同的部分不是超级组织的,但可以按任何顺序执行,甚至可以并行执行。这是一种非常特别的并行化方式,您不希望在代码中看到太多。
无论如何,您的代码不符合标准,因为sections
结构中的所有块都必须包含在section
块内(但是第一个是可选的,因为它是隐式封闭的在第一个section
区块中)。在这里,如果你在#pragma omp section
循环之前在哪里添加这个隐式for
,你就会发现代码的意义不大:循环在一个部分,而正文在另一个部分。 ..
这里,由于你有一个for
循环,这可以很好地构建你的代码,并允许你使用omp parallel for
指令。您只需要重写一下for
,例如明确更好的循环边界。