OpenMP任务调度策略

时间:2014-05-19 14:17:27

标签: parallel-processing scheduled-tasks task openmp

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

Here我读到,默认情况下,OpenMP强加了广度优先调度程序,并且他们对FIFO与LIFO进行了一些测试,但他们没有说出默认值。由于我只有一个线程(我使用单一指令)创建多个任务,我认为比较他们的广度优先与工作优先安排没有任何意义。

那么,是默认的FIFO还是LIFO?是否有可能改变它?

由于

1 个答案:

答案 0 :(得分:4)

  

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

摘要版

OpenMP中的任务调度是实现定义的,即使standard对算法施加了一些限制。如果您需要操作调度程序,搜索的位置是您要定位的特定OpenMP实现。

长篇故事

定义所有任务调度机制的基本概念是任务调度点(参见第2.11.3节):

  

每当线程到达任务调度点时,执行   可能导致它执行任务切换,开始或恢复执行   当前团队的另一项任务。

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

  

任务计划点动态将任务区域划分为部分。   每个部分从头到尾不间断地执行。不同的部分   相同任务区域的顺序按它们的顺序执行   遇到。在没有任务同步构造的情况下   线程执行不同可调度任务的部分的顺序   没有具体说明。

     

正确的程序必须与所有程序正确且一致   可以想象的与规则兼容的调度序列   以上   ...

该标准还指定隐含其中任务调度点:

  
      
  • 生成显式任务后的那一点
  •   
  • 在完成任务区域之后
  •   
  • 在taskyield区域
  •   
  • 在taskwait区域
  •   
  • 在任务组区域的末尾
  •   
  • 在隐式和显式屏障区域
  •   
  • 紧接在生成目标区域之后的点
  •   
  • 位于目标数据区域的开头和结尾
  •   目标更新区域中的
  •   

什么线程遇到其中一个时可能会做什么:

  
      
  • 开始执行绑定到当前团队的绑定任务
  •   
  • 恢复任何已挂起的任务区域,绑定到与其绑定的当前团队
  •   
  • 开始执行绑定到当前团队的未解决任务
  •   
  • 恢复绑定到当前团队的任何暂停的未解决任务区域。
  •   

明确地说:

  

如果有多个上述选项可用,则未指定   哪个会被选中。

为不同的符合行为留出空间。它只强加了四个约束:

  
      
  1. 生成任务后立即执行包含的任务。
  2.   
  3. 新绑定任务的调度受当前与线程绑定的任务区域集的约束,而不是   悬浮在障碍区域。如果此设置为空,则任何新的绑定任务   可能会安排。否则,只有在以下情况下才可以安排新的绑定任务   它是集合中每项任务的后代任务。
  4.   
  5. 在满足任务依赖性之前,不得安排依赖任务。
  6.   
  7. 当包含if子句的构造生成显式任务时,表达式的计算结果为false,以及前一个   约束已经满足,任务立即执行   生成任务。
  8.   

每个调度算法必须满足才能被认为是符合要求。