Parallel processing OpenMP任务调度策略

Parallel processing OpenMP任务调度策略,parallel-processing,scheduled-tasks,task,openmp,Parallel Processing,Scheduled Tasks,Task,Openmp,我想知道OpenMP任务队列的任务调度是如何执行的 我读到,默认情况下,OpenMP强制使用广度优先的调度程序,并且他们做了一些FIFO与LIFO的测试,但他们没有对默认设置做任何说明。因为我只有一个线程(我使用单指令)来创建多个任务,所以我认为比较广度优先和工作优先调度没有任何意义 那么,默认的先进先出还是后进先出?有可能改变吗 谢谢 我想知道OpenMP任务队列的任务调度是如何执行的 摘要版本 OpenMP中的任务调度是由实现定义的,尽管对算法施加了一些限制。如果您需要操作调度程序,搜索的地

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

我读到,默认情况下,OpenMP强制使用广度优先的调度程序,并且他们做了一些FIFO与LIFO的测试,但他们没有对默认设置做任何说明。因为我只有一个线程(我使用单指令)来创建多个任务,所以我认为比较广度优先和工作优先调度没有任何意义

那么,默认的先进先出还是后进先出?有可能改变吗

谢谢

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

摘要版本 OpenMP中的任务调度是由实现定义的,尽管对算法施加了一些限制。如果您需要操作调度程序,搜索的地方是您要针对的特定OpenMP实现

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

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

在下面的注释中,他们对预期行为(重点是我的行为)给出了更广泛的解释:

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

一个正确的程序必须正确且与所有 与规则兼容的可想象的调度序列 在上面

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

  • 生成显式任务后紧接着的点
  • 在任务区域的完成点之后
  • 在一个地区
  • 在taskwait区域中
  • 在任务组区域的末尾
  • 在隐式和显式势垒区域中
  • 生成目标区域后紧接着的点
  • 在目标数据区域的开始和结束处
  • 在目标更新区域中
线程遇到其中一个线程时可能执行的操作:

  • 开始执行绑定到当前团队的绑定任务
  • 恢复绑定到当前团队的任何挂起的任务区域
  • 开始执行绑定到当前团队的未绑定任务
  • 恢复绑定到当前团队的任何挂起的未绑定任务区域
但它明确表示:

如果以上选项中有多个可用,则未指定 至于选择哪一个

为不同的一致性行为留出空间。它只施加了四个约束:

  • 生成任务后,立即执行包含的任务
  • 新绑定任务的调度受当前绑定到线程且未绑定到线程的任务区域集的约束 悬浮在障碍区域。如果此集合为空,则任何新绑定的任务 可能会被安排。否则,只有在以下情况下才能计划新的绑定任务 它是集合中每个任务的子任务
  • 在完成任务依赖项之前,不应安排相关任务
  • 由包含if子句的构造生成显式任务时,表达式的计算结果为false,而前一个 约束已经满足,任务将立即执行 任务的生成

  • 每个调度算法都必须完成才能被视为符合要求。

    只是我没有在答案中加上一个注释:在你链接的文章中,他们说
    OpenMP…没有指定这些任务的调度应该如何完成(尽管它施加了一些限制)
    。我想你可能误解了一些说法,当你说
    OpenMP强加了一个广度优先的调度程序
    …那么队列中等待执行的任务呢?任务队列的访问顺序是什么?没有这方面的信息吗?@fc67除了这四个约束之外,其他一切都是特定实现特有的。