OpenMP与“静态”计划并行“用于”

时间:2019-02-28 12:08:52

标签: parallel-processing static openmp scheduling parallel-for

对于parallel for的时间表和默认块大小,static行为我感到困惑或误解。

例如下面的图片我除了拥有的是    主线程将需要额外的迭代,但我除外    在索引8而不是2!

具有默认块大小的静态调度算法将应用    在(#iterations / #threads)上轮循2种情况

  1. 如果#迭代次数可以被#threads(例如N = 8和#threads = 4)整除,则每个线程将以循环方式(直截了当的情况)进行相等数量的迭代

  2. 如果#iterations不能被#threads整除。它将计算除以#threads的最接近的迭代整数,并执行与上述相同的操作

  

N = 9-> 8的情况将除以2 2 2 2和1

     

N = 11-> 12的情况将被分为3 3 3和2

线程是0 1 2 3

enter image description here

2 个答案:

答案 0 :(得分:0)

使用静态调度时,如果线程数不能均匀地划分迭代次数,则OpenMP实现必须确保所有迭代都是由某个线程计算的。

从负载平衡的角度来看,编译器将尝试为每个线程分配大致相同的迭代次数,并避免一个线程接收到所有超出除法范围的剩余迭代。因此,在您的示例中,N = 11并且有四个线程,其余的将为3,而前三个线程0..2将获得一个额外的迭代,而不是为最后一个线程分配3个额外的迭代。

答案 1 :(得分:0)

您对无块静态计划的迭代分布的期望是错误的。当“每个线程最多分配一个块”时,仅为调度(静态,块)指定循环分配,而不为调度(静态)指定循环分配。

迭代0、1和8形成两个块,因为它们不连续,因此无法分配给同一线程。 9次迭代到4个线程的有效分布是3-2-2-2、2-3-2-2、2-2-3-2、2-2-2-3、3-3-2-1,等等,即使3-3-3-0也有效。 OpenMP规范仅表示,块的大小应大致相等,而无需指定确切的分发算法。