为什么OpenMP不能在for循环内部使用sections?

3

我正在尝试使用OpenMP并行化一个基于范围的for循环,通过将循环的每个迭代作为一个OpenMP段。我的目标是这样做:

#pragma omp parallel sections 
{

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

}

然而,这并不起作用——编译器会抱怨该部分必须在#pragma omp sections结构内。我做错了什么,还是OpenMP不够聪明,不能理解这个部分位于for循环内?

1
为什么不尝试使用“take”而不是“sections”?在我看来,这将是更自然的代码。 - Harald
1
你是指任务吗? - v2v1
1
糟糕!是的!我是指任务 :) - Harald
1个回答

3

OpenMP的sections用于执行可以并行执行的不太相关的代码片段。想法是,在您的算法中,有不同的部分没有很好地组织,但可以按任意顺序甚至并行执行。这是一种非常临时的并行化方式,您不希望在代码中看到太多。

无论如何,您的代码不符合标准,因为sections构造中的所有块都必须包含在一个section块内(但第一个块除外,因为它隐式包含在第一个section块中)。在这里,如果在您的for循环之前添加这个隐式的#pragma omp section,您会发现代码几乎没有意义:循环在一个部分中,而主体在另一个部分中...

在这里,由于您有一个for循环,所以这很好地结构化了您的代码,并应该允许您使用omp parallel for指令。您只需要稍微重写一下for,以更明确地表示循环边界即可。


我之所以明确这样做,是因为我需要使用基于范围的for循环。OpenMP不允许我在omp parallel for中使用这种基于范围的for循环。所以我使用了sections。我也可以使用tasks。 - v2v1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接