OpenMP任务(如果已完成)

时间:2018-12-05 22:34:40

标签: if-statement task openmp final

如果我不想再创建更多任务(数组长度<100)。 if(r - l >= 100)final(r - l < 100)是否满足此条件? (l = minIndex; r = maxIndex)

1 个答案:

答案 0 :(得分:0)

它们都起作用。规范的相关部分是:

  

未延期的任务   相对于其生成任务区域不延迟执行的任务。   也就是说,其生成任务区域将被挂起,直到执行未延迟的任务   完成。

     

包含的任务在生成任务区域中顺序包含执行的任务。也就是说,包含的任务是不延期的   并由遇到的线程立即执行。

     

最终任务强制所有子任务变为最终任务和包含任务的任务。

     

[...]

     

当if子句出现在任务构造上时,并且if子句   表达式的计算结果为false,将生成未延迟的任务,并且   遇到的线程必须暂停当前任务区域,因为   在生成的任务被执行之前,无法恢复执行   完成。在任务的if子句表达式中使用变量   构造会导致对所有变量的隐式引用   封闭的结构。

     

当任务中存在最终子句时   构造并且最终子句表达式的计算结果为true,   生成的任务将是最终任务。遇到的所有任务构造   在执行最终任务期间,将生成最终的和包含的   任务。请注意,在变量的最终子句表达式中使用变量   任务构造导致所有变量的隐式引用   封闭的结构。

----- OpenMP体系结构审查委员会。 “ OpenMP应用程序编程接口。”规范版本4.5,2015年11月。

这意味着if(false)final(true)都立即执行任务的内容。唯一的区别是,您的任务中是否还有其他任务构造。

#pragma omp task if(0)
{
     // this task is created and executed normally
     #pragma omp task
     foo();
}
#pragma omp task final(1)
{
     // this task is "included", i.e. executed sequentially and immediately
     #pragma omp task
     foo();
}

从措辞上说,{em>似乎 if(false)将创建一个任务并立即运行它,而final将简单地按顺序运行代码而不创建任务。但是,我不确定这是否正确,也不确定性能是否存在。