c++ - 主区域 : "master region may not be closely nested inside of work-sharing or explicit task region" 的 OpenMP for 循环

标签 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?
       }
           ........
    }

但是,我收到以下错误:

warning: master region may not be closely nested inside of work-sharing or explicit task region [enabled by default]

现在,当我运行代码时,我确实得到了想要的结果。但我不喜欢警告。为什么这会给我一个警告,是否有更好的方法来完成此操作?

谢谢!

最佳答案

它给你警告是因为 主区域不能紧密嵌套在工作共享、原子或显式任务区域中。

#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());
}

根据示例 here .

参见 Guide into OpenMP: Easy multithreading programming for C++获取更多信息和示例。

有关更多信息,请参阅 OpenMP Specification或查看 Intel's Documentation on Improper nesting of OpenMP constructs .

关于c++ - 主区域 : "master region may not be closely nested inside of work-sharing or explicit task region" 的 OpenMP for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9317788/

相关文章:

c++ - 从可用数字中形成最大数字?

需要以 OutputIterator 作为参数的成员函数的 C++ 概念

c - 使用 OpenMP 通过 2 个函数调用并行化代码

java - 我们可以提高 java 8 并行流以外的列表的性能吗

c++ - OpenMP 截断 float

c++ - '*' token 之前的预期初始值设定项

c# - 有效地将项目添加到列表<类>中并行 C#

c - 将 openMp 程序移植到 cuda c : correct grid_size/block_size and reduction

c++ - 在 C++ STL 类型的静态实例上使用 OpenMP threadprivate 指令

c++ - C++ 中任何好的范围查询库(使用 K-D 树、四叉树或 R 树)