在OpenMP中,当线程数没有在并行for循环中均匀地划分为迭代数时,静态调度如何工作?

问题描述 投票:0回答:1

我了解静态调度如何工作的总体思路,但是让我感到困惑的一种情况是,在带有静态调度的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等。

multithreading openmp scheduling
1个回答
0
投票
OpenMP 5.0 specification的第2.9.2节指出:

[当kindstatic时,将迭代分为大小为chunk_size的块,并将这些块以

循环方式按线程号的顺序分配给团队中的线程 。每个块包含chunk_size个迭代,但包含顺序上一个迭代的块除外,后者可能具有较少的迭代。如果未指定chunk_size,则将迭代空间划分为大小近似相等的块,并且每个线程最多分配一个块。在这种情况下,未指定块的大小。

因此,这种情况下的结果是4-2-2-2。
© www.soinside.com 2019 - 2024. All rights reserved.