0

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

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

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

  1. 如果#iterations 可以被#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

在此处输入图像描述

4

2 回答 2

0

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

迭代 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 规范都说块的大小应该大致相等,而没有指定精确的分布算法。

于 2019-03-04T14:16:05.793 回答
0

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

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

于 2019-02-28T13:24:41.177 回答