在隐式障碍中等待OpenMP任务完成?

时间:2017-02-13 11:00:37

标签: c++ c task openmp barrier

如果我创建了一堆OpenMP任务而不使用taskwait,那么程序在哪里等待任务完成?请考虑以下示例:

#pragma omp parallel
{
   #pragma omp single
   {
      for (int i = 0; i < 1000; i++) {
         #pragma omp task
         ... // e.g., call some independent function
      }
      // no taskwait here
   }
   // all the tasks completed now?
}

程序是否在single块末尾的隐式屏障处等待任务完成?我假设如此,但在OpenMP规范中找不到有关此问题的任何信息。

修改

来自OpenMP规范中的barrier描述:

  

执行绑定并行区域的团队的所有线程必须   执行屏障区域并完成所有显式的执行   在任何允许继续之前绑定到此并行区域的任务   执行超越障碍。

但是,这并没有说明我是否负责完成任务,或者OpenMP运行时是否为我负责。

1 个答案:

答案 0 :(得分:1)

OpenMP中的任务完成是隐式的,而非显式的(1.2.5任务术语)

  

任务完成 任务完成结构化块的末尾与生成的结构相关联时发生任务已到达。

single工作共享结构的末尾有一个隐含障碍。正如您所提到的,障碍等待明确的任务。因此,所有任务都将在single区块完成。