我想知道如何执行OpenMP任务队列的任务调度。OpenMP任务调度策略
Here我读到,默认情况下,OpenMP强加一个宽度优先的调度程序,并且他们对FIFO和LIFO做了一些测试,但他们没有提及任何有关默认值的内容。由于我只有一个线程(我使用单个指令)创建多个任务,因此我认为比较他们的广度优先和工作优先排序没有任何意义。
那么,默认的FIFO还是LIFO?有可能改变它吗?
感谢
我想知道如何执行OpenMP任务队列的任务调度。OpenMP任务调度策略
Here我读到,默认情况下,OpenMP强加一个宽度优先的调度程序,并且他们对FIFO和LIFO做了一些测试,但他们没有提及任何有关默认值的内容。由于我只有一个线程(我使用单个指令)创建多个任务,因此我认为比较他们的广度优先和工作优先排序没有任何意义。
那么,默认的FIFO还是LIFO?有可能改变它吗?
感谢
我想知道如何进行的OpenMP任务队列的任务调度
OpenMP中任务调度是实现定义,即使standard对算法施加了一些限制。如果您需要操作调度程序,那么要搜索的地方就是您所定位的特定OpenMP实施。
在其所有的任务调度机械定义的基本概念是,任务的调度点(见第2.11.3):
每当一个线程到达一个任务调度点,执行 可能导致它执行任务切换,开始或恢复绑定到当前团队的不同任务的执行 。
在笔记低于他们给的什么应该是预期的行为(重点煤矿)更广泛的解释:
任务调度点动态鸿沟任务的区域分成几部分。 每个部分从开始到结束不间断执行。相同任务区域的不同部分 按照遇到的 的顺序执行。在没有任务同步结构的情况下,线程执行不同可调度任务 的部分的顺序是未指定的。
正确的程序必须正确和一致的行为与那些与规则 上述 兼容所有 可以想象调度序列...
该标准还规定了其中任务调度点暗示:
- 立即任务区域
的完成点之后产生一个明确的任务- 的以下的点
- 在任务区域
- 在任务等待区域
- 在任务组区域
- 的隐式和显式屏障区域中的端
- 立即在开始时在生成一个目标数据区域
- 的目标区域
- 和结束之后的点目标更新区域
和什么当遇到其中一个线程可以这样做:
- 开始绑定到当前团队
- 恢复所有挂起的任务区域,绑定到当前团队绑任务的执行,向其中它被绑定
- 开始绑定到一个解开任务的执行目前团队
- 恢复任何被绑定到当前团队的暂停解开的任务区域。
它明确地说,虽然:
如果上面的选择多于一个可用,它是不确定的 作为将被选择。
为不同的符合行为留出空间。它仅规定4个约束:
- 的任务包括在生成的任务后立即执行。
- 新绑定任务的调度受限于当前绑定到该线程的任务区域集合,并且不是 挂起在障碍区域中。如果此集合为空,则可以安排任何新绑定任务 。否则,只有在该集合中的每个任务的后代任务为 时才可以安排新的并列任务。
- 一个依赖任务不应该被调度,直到它的任务依赖被满足。
- 当一个显式任务由一个包含if表达式的结构生成的表达式评估为false,并且之前的约束已满足时,将在 之后立即执行任务。
每个调度算法必须满足要考虑符合。
在队列中等待执行的任务是什么?任务队列的访问顺序是什么?有没有关于这方面的信息? – fc67
@ fc67除了四个约束之外,其他一切都是特定实现的特殊情况。 – Massimiliano
只是一个说明,我没有在答案中提到:在文章中你说他们说'OpenMP ...没有指定这些任务的调度应该如何完成(尽管它施加了一些限制)。我认为当你说'OpenMP强加一个广度优先调度程序'时,你可能误解了一些声明...... – Massimiliano