OpenMP任务计划策略

fc6*_*c67 3 parallel-processing scheduled-tasks task openmp

我想知道如何执行OpenMP任务队列的任务调度。

在这里,我了解到,默认情况下,OpenMP强制采用广度优先的调度程序,并且它们对FIFO与LIFO进行了一些测试,但是它们没有说明默认值。由于我只有一个线程(我使用单个指令)来创建多个任务,因此比较它们的广度优先与工作优先的调度没有任何意义。

那么,默认的FIFO还是LIFO?可以更改吗?

谢谢

Mas*_*ano 5

我想知道如何执行OpenMP任务队列的任务调度

摘要版本

尽管标准对该算法施加了一些限制,但OpenMP中的任务调度是由实现定义的。如果需要操纵调度程序,搜索的地点就是您要定位的特定OpenMP实现。

漫长的故事

定义所有任务计划机制的基本概念是任务计划点的概念(请参阅第2.11.3节):

每当线程到达任务调度点时,该实现可能会导致其执行任务切换,从而开始或继续执行绑定到当前团队的其他任务。

在下面的注释中,他们对预期的行为(强调我的行为)进行了更广泛的解释:

任务调度点将任务区域动态划分为多个部分。每个部分从头到尾不间断地执行。同一任务区域的不同部分按遇到它们的顺序执行。在没有任务同步结构的情况下,未指定线程执行不同可调度任务的部分的顺序。

正确的程序必须在与上述规则兼容的所有可能的调度序列中正确且一致地运行...

该标准还指定任务调度点的隐含位置:

  • 紧接产生明确任务的点
  • 在任务区域完成之后
  • 在任务产区
  • 在任务等待区域
  • 在任务组区域的末尾
  • 在隐性和显性障碍区域
  • 紧随目标区域生成之后的点
  • 在目标数据区域的开头和结尾
  • 在目标更新区域中

什么时候满足他们中的一个线程可以这样做:

  • 开始执行绑定到当前团队的绑定任务
  • 恢复绑定到当前团队的任何暂停的任务区域
  • 开始执行绑定到当前团队的未绑定任务
  • 恢复绑定到当前团队的任何暂停的未绑定任务区域。

它明确地说:

如果以上选择之一可用,则未指定将选择哪个。

为不同的顺应性行为留出空间。它仅施加四个约束:

  1. 生成任务后立即执行包含的任务。
  2. 新绑定任务的调度受当前绑定到线程且未暂停在障碍区域中的一组任务区域的约束。如果此集合为空,则可以安排任何新的绑定任务。否则,仅当新的捆绑任务是集合中每个任务的后代任务时,才可以安排该任务。
  3. 在满足其任务依赖性之前,不应调度从属任务。
  4. 当由包含if子句的构造生成显式任务时,如果该表达式的表达式评估为false,并且已经满足先前的约束,则在生成任务后立即执行该任务。

每个调度算法都必须满足才能被视为符合标准。