我了解静态调度如何工作的总体思路,但是让我感到困惑的一种情况是,在带有静态调度的OpenMP并行for循环中,给定的块大小和给定的线程数,编译器将如何分配如果线程数没有平均地划分为多个迭代次数,那么这些线程之间是否存在迭代?
例如:
#pragma omp parallel for num_threads(4) schedule(static, 2)
for (int i = 0; i < 10; i++) {
[这里,有一个具有4个线程的并行for循环,10个迭代和一个块大小为2的静态调度。编译器是否将分布迭代,以便每个相应线程的迭代次数看起来像3-3- 2-2?也可以是任何一种分布,例如2-2-3-3、2-3-2-3、3-2-2-3等。
[当因此,这种情况下的结果是4-2-2-2。kind
为static
时,将迭代分为大小为chunk_size
的块,并将这些块以循环方式按线程号的顺序分配给团队中的线程 。每个块包含
chunk_size
个迭代,但包含顺序上一个迭代的块除外,后者可能具有较少的迭代。如果未指定chunk_size
,则将迭代空间划分为大小近似相等的块,并且每个线程最多分配一个块。在这种情况下,未指定块的大小。