如果我创建了一堆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运行时是否为我负责。
答案 0 :(得分:1)
OpenMP中的任务完成是隐式的,而非显式的(1.2.5任务术语)
任务完成 任务完成在结构化块的末尾与生成的结构相关联时发生任务已到达。
single
工作共享结构的末尾有一个隐含障碍。正如您所提到的,障碍等待明确的任务。因此,所有任务都将在single
区块完成。