我对动态调度和LPT调度感到困惑(我认为它是静态的)。
我学到的是基于块大小的动态调度选择任务,当一个线程完成了它的任务时,它会选择另一个任务。LPT调度根据每个任务所需的最长处理时间来选择任务。
因此,如果我根据处理时间对任务进行排序,然后应用块大小为1的动态调度,那么它是否与LPT调度相同?
例如,假设有一个15次迭代的循环。在每一次迭代中,计算向量的CartesianProduct。但在每个项目中,矢量的大小是不同的,这意味着负载是不平衡的。如果我计算出每个迭代的结果大小,并按降序排序,然后调度(dynamic,1),理论上这与LPT相同吗?
发布于 2019-09-27 08:56:36
首先,OpenMP调度子句适用于循环,而不是任务,因此在这种上下文中讨论任务是很混乱的,因为OpenMP也有任务(甚至taskloop
)。为了避免混淆,我将循环调度实体称为“块”,因为它是一个连续的迭代块。
假设您想讨论循环上的schedule
子句,那么
monotonic
或nonmonotonic
),它可以应用于dynamic
调度(以及其他调度),并影响调度所能生成的序列。OpenMP 5.0中的schedule(dynamic)
)等价于schedule(nonmonotonic:dynamic)
,后者允许使用schedule(monotonic:dynamic)
无法执行的序列,并且很可能破坏您的映射(不过,您可以使用schedule(monotonic:dynamic)
,所有的OpenMP调度行为都是根据机器的执行状态来描述的。)当然有可能产生的序列不是您所期望的,因为机器状态表示基本事实,反映来自其他机器负载的干扰等问题,而像LPT这样的调度方案是基于假设的执行时间先验知识,而实际情况中可能没有反映。您可以在schedule(nonmonotonic:dynamic)
上看到关于https://www.openmp.org/wp-content/uploads/SC18-BoothTalks-Cownie.pdf的讨论
https://stackoverflow.com/questions/58109820
复制相似问题