如果我不想再创建更多任务(数组长度<100)。 if(r - l >= 100)
或final(r - l < 100)
是否满足此条件? (l = minIndex; r = maxIndex)
答案 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
将简单地按顺序运行代码而不创建任务。但是,我不确定这是否正确,也不确定性能是否存在。