2014-05-19 58 views
3

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

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

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

感谢

+0

只是一个说明,我没有在答案中提到:在文章中你说他们说'OpenMP ...没有指定这些任务的调度应该如何完成(尽管它施加了一些限制)。我认为当你说'OpenMP强加一个广度优先调度程序'时,你可能误解了一些声明...... – Massimiliano

回答

3

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

摘要版本

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

长故事

在其所有的任务调度机械定义的基本概念是,任务的调度点(见第2.11.3):

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

在笔记低于他们给的什么应该是预期的行为(重点煤矿)更广泛的解释:

任务调度点动态鸿沟任务的区域分成几部分。 每个部分从开始到结束不间断执行。相同任务区域的不同部分 按照遇到的 的顺序执行。在没有任务同步结构的情况下,线程执行不同可调度任务 的部分的顺序是未指定的。

正确的程序必须正确和一致的行为与那些与规则 上述 兼容所有 可以想象调度序列...

该标准还规定了其中任务调度点暗示:

  • 立即任务区域
  • 的完成点之后产生一个明确的任务
  • 的以下的点
  • 在任务区域
  • 在任务等待区域
  • 在任务组区域
  • 的隐式和显式屏障区域中的端
  • 立即在开始时在生成一个目标数据区域
  • 的目标区域
  • 和结束之后的点目标更新区域

什么当遇到其中一个线程可以这样做:

  • 开始绑定到当前团队
  • 恢复所有挂起的任务区域,绑定到当前团队绑任务的执行,向其中它被绑定
  • 开始绑定到一个解开任务的执行目前团队
  • 恢复任何被绑定到当前团队的暂停解开的任务区域。

它明确地说,虽然:

如果上面的选择多于一个可用,它是不确定的 作为将被选择。

为不同的符合行为留出空间。它仅规定4个约束:

  1. 的任务包括在生成的任务后立即执行。
  2. 新绑定任务的调度受限于当前绑定到该线程的任务区域集合,并且不是 挂起在障碍区域中。如果此集合为空,则可以安排任何新绑定任务 。否则,只有在该集合中的每个任务的后代任务为 时才可以安排新的并列任务。
  3. 一个依赖任务不应该被调度,直到它的任务依赖被满足。
  4. 当一个显式任务由一个包含if表达式的结构生成的表达式评估为false,并且之前的约束已满足时,将在 之后立即执行任务。

每个调度算法必须满足要考虑符合。

+0

在队列中等待执行的任务是什么?任务队列的访问顺序是什么?有没有关于这方面的信息? – fc67

+0

@ fc67除了四个约束之外,其他一切都是特定实现的特殊情况。 – Massimiliano