我想知道如何执行OpenMP任务队列的任务调度。
Here我读到,默认情况下,OpenMP强加了广度优先调度程序,并且他们对FIFO与LIFO进行了一些测试,但他们没有说出默认值。由于我只有一个线程(我使用单一指令)创建多个任务,我认为比较他们的广度优先与工作优先安排没有任何意义。
那么,是默认的FIFO还是LIFO?是否有可能改变它?
由于
答案 0 :(得分:4)
我想知道如何执行OpenMP任务队列的任务调度
OpenMP中的任务调度是实现定义的,即使standard对算法施加了一些限制。如果您需要操作调度程序,搜索的位置是您要定位的特定OpenMP实现。
定义所有任务调度机制的基本概念是任务调度点(参见第2.11.3节):
每当线程到达任务调度点时,执行 可能导致它执行任务切换,开始或恢复执行 当前团队的另一项任务。
在下面的注释中,他们更广泛地解释了预期的行为(强调我的):
任务计划点动态将任务区域划分为部分。 每个部分从头到尾不间断地执行。不同的部分 相同任务区域的顺序按它们的顺序执行 遇到。在没有任务同步构造的情况下 线程执行不同可调度任务的部分的顺序 没有具体说明。
正确的程序必须与所有程序正确且一致 可以想象的与规则兼容的调度序列 以上 ...
该标准还指定隐含其中任务调度点:
- 生成显式任务后的那一点
- 在完成任务区域之后
- 在taskyield区域
- 在taskwait区域
- 在任务组区域的末尾
- 在隐式和显式屏障区域
- 紧接在生成目标区域之后的点
- 位于目标数据区域的开头和结尾
目标更新区域中的
和什么线程遇到其中一个时可能会做什么:
- 开始执行绑定到当前团队的绑定任务
- 恢复任何已挂起的任务区域,绑定到与其绑定的当前团队
- 开始执行绑定到当前团队的未解决任务
- 恢复绑定到当前团队的任何暂停的未解决任务区域。
明确地说:
如果有多个上述选项可用,则未指定 哪个会被选中。
为不同的符合行为留出空间。它只强加了四个约束:
- 生成任务后立即执行包含的任务。
- 新绑定任务的调度受当前与线程绑定的任务区域集的约束,而不是 悬浮在障碍区域。如果此设置为空,则任何新的绑定任务 可能会安排。否则,只有在以下情况下才可以安排新的绑定任务 它是集合中每项任务的后代任务。
- 在满足任务依赖性之前,不得安排依赖任务。
- 当包含if子句的构造生成显式任务时,表达式的计算结果为false,以及前一个 约束已经满足,任务立即执行 生成任务。
醇>
每个调度算法必须满足才能被认为是符合要求。