何时工作共享构造内部关键构造在 OpenMP 中有用?

When Worksharing Constructs Inside a critical Construct is useful in OpenMP?

在OpenMP示例中可以找到以下代码6.2 Worksharing Constructs Inside a critical Construct:

void critical_work()
{
  int i = 1;
  #pragma omp parallel sections
  {
    #pragma omp section
    {
      #pragma omp critical (name)
      {
        #pragma omp parallel
        {
          #pragma omp single
          {
            i++;
          }
        }
      }
    }
  }
}

你用过这种结构吗?在现实生活中什么情况下才是最好的选择?我唯一的猜测是它在错误处理中很有用,还有什么?

我认为这个具体的例子只是说明这种代码仍然符合标准。 如果问题只是关于在关键构造内(在工作共享构造内)有一个工作共享构造,我可以粗略地想象分层应用程序,其中通常有两层嵌套的 OpenMP 并行性,但大多数工作是在关键区域之外完成的,例如:

void mostly_uncritical_work()
{
  #pragma omp parallel
  {
    #pragma omp parallel
    {
      /* main workload */
    }
    #pragma omp critical (name)
    {
      #pragma omp parallel
      {
        /* smaller amount of work but still big enough */
        /* to profit from parallelization */
      }
    }
  }
}

所以最后问题归结为“是否有嵌套 OpenMP 并行性的应用程序?”我的回答肯定是肯定的。例如,我使用它在外部团队中有一个由 2 个线程组成的团队,其中一个在 GPU 上模拟事物,另一个使用内部线程团队分析 GPU 的输出。