OpenMP 并行 "for" 与 "static" 时间表

OpenMP parallel "for" with "static" schedule

我对 parallel for 具有 static 计划和默认块大小的行为感到困惑或误解。

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

具有默认块大小的静态调度算法应用 (#iterations / #threads) 循环法有 2 个案例

  1. 如果#iterations 可被#threads 整除,例如 N=8 和#threads = 4。每个线程将以循环方式进行等量的迭代(直接案例)

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

case of N=9 --> 8 it will divide 2 2 2 2 and 1

case of N=11 --> 12 it will be divided 3 3 3 and 2

线程数为 0 1 2 3

当您使用静态调度时,OpenMP 实现将必须确保所有迭代都由某个线程计算,如果线程数不能平均分配迭代数的话。

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

您对无块静态计划的迭代分布的预期是错误的。仅指定调度(静态,块)的循环分配,不指定调度(静态)时 "at most one chunk is distributed to each thread".

迭代0、1、8由于不连续,所以形成了两个chunk,不能分配到同一个线程。 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 规范都说块的大小应该大致相等,而没有指定精确的分布算法。