对于parallel for
的时间表和默认块大小,static
行为我感到困惑或误解。
例如下面的图片我除了拥有的是 主线程将需要额外的迭代,但我除外 在索引8而不是2!
具有默认块大小的静态调度算法将应用 在(#iterations / #threads)上轮循2种情况
如果#迭代次数可以被#threads(例如N = 8和#threads = 4)整除,则每个线程将以循环方式(直截了当的情况)进行相等数量的迭代
如果#iterations不能被#threads整除。它将计算除以#threads的最接近的迭代整数,并执行与上述相同的操作
N = 9-> 8的情况将除以2 2 2 2和1
N = 11-> 12的情况将被分为3 3 3和2
线程是0 1 2 3
答案 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规范仅表示,块的大小应大致相等,而无需指定确切的分发算法。