具有主区域的OpenMP for循环:"主区域可能不会紧密嵌套在工作共享或显式任务区域内"

Ric*_*ard 6 c++ parallel-processing openmp

我有以下代码,我认为应该显示一个近似整个过程进度的进度条(因为循环的每个并行线程应该以大致相同的速率前进)

    #pragma omp parallel for
    for(long int x=0;x<elevations.size1();x++){
       #pragma omp master
       {
           progress_bar(x*omp_get_num_threads()); //Todo: Should I check to see if ftell fails here?
       }
           ........
    }
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

warning: master region may not be closely nested inside of work-sharing or explicit task region [enabled by default]
Run Code Online (Sandbox Code Playgroud)

现在,当我运行代码时,我确实得到了所需的结果.但我不喜欢警告.为什么这会给我一个警告,是否有更好的方法来实现这一目标?

谢谢!

App*_*234 7

它会向您发出警告,因为主区域可能不会紧密嵌套在工作共享,原子或显式任务区域中.

#pragma omp master顾名思义,#pragma omp parallel for它是一个主要区域,是一个任务共享区域.

它们是紧密嵌套的,因为没有函数调用或语句将它们分开.

为了避免警告,请更换#pragma omp master类似的东西

tid = omp_get_thread_num();
if(tid == 0)
{
   progress_bar(x*omp_get_num_threads());
}
Run Code Online (Sandbox Code Playgroud)

按照这里的例子.

有关更多信息和示例,请参阅OpenMP指南:用于C++的简单多线程编程.

有关详细信息,请参阅OpenMP规范或参见英特尔有关OpenMP构造的不正确嵌套的文档.