无法弄清楚在以下代码中使用if(0)子句,因为还存在#pragma omp single子句。有什么想法吗?
答案 0 :(得分:1)
首先来自Specification的定义(我假设你知道):
当任务构造中存在if子句且if子句表达式的计算结果为false时,将生成未延迟的任务,并且遇到的线程必须挂起当前任务区域,在生成的任务之前无法执行该任务区域完成了。
将未定义任务定义为:
关于其生成任务区域不延迟执行的任务。也就是说,它的生成任务区域被暂停,直到完成未完成任务的执行。
从一般任务描述:
遇到的线程可以立即执行任务,或推迟执行。在后一种情况下,可以为团队中的任何线程分配任务。
总的来说,正如你所说的那样,结果与不使用if(0)
的结果相同。但正如我所理解的那样undeferred
意味着生成的任务由创建它的线程立即调用。
在此上下文中,通过将任务分配给先前空闲的线程,确保在没有上下文切换的情况下在“一个”步骤中创建任务A()到C(),或者在其间创建任务。