OpenMP并行“for”与“静态”计划

问题描述 投票:-1回答:2

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

例如下面的图片我期望得到的是主线程将需要额外的迭代,但我预计它将在索引8而不是2!

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

  1. 如果#iterations可以被#threads整除,比如N = 8和#threads = 4.每个线程将以循环方式进行相同数量的迭代(直截了当的情况)
  2. 如果#itements不能被#threads整除。它将计算最接近的迭代整数除以#threads,并执行与上述相同的操作

在N = 9 - > 8的情况下,它将除以2 2 2 2和1

在N = 11 - > 12的情况下,它将被分为3 3 3和2

线程是0 1 2 3

enter image description here

parallel-processing static openmp scheduling parallel-for
2个回答
0
投票

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

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


0
投票

您对无块静态调度的迭代分布的期望是错误的。循环分配仅为调度(静态,块)指定,而不是在“最多一个块分发到每个线程”时的调度(静态)。

迭代0,1和8形成两个块,因为它们不是连续的,因此不能分配给同一个线程。 9次迭代到4个线程的有效分布将是3-2-2-2,3-3-2-2,2-2-3-2,2-2-2-3,3-3-2-1,等等,即使是3-3-3-0也是有效的。所有OpenMP规范都说,块的大小应该大致相等,而不指定精确的分布算法。

© www.soinside.com 2019 - 2024. All rights reserved.