我对parallel for
行为以及static
时间表和默认块大小感到困惑或误解。
例如下面的图片我期望得到的是主线程将需要额外的迭代,但我预计它将在索引8而不是2!
具有默认块大小的静态调度算法在(#iterations / #threads)上应用循环,有2种情况
在N = 9 - > 8的情况下,它将除以2 2 2 2和1
在N = 11 - > 12的情况下,它将被分为3 3 3和2
线程是0 1 2 3
当您使用静态调度时,如果线程数不均匀地划分数字迭代,则OpenMP实现必须确保所有迭代都由某个线程计算。
从负载平衡的角度来看,编译器将尝试为每个线程分配大致相同数量的迭代,并避免一个线程接收超过除法的所有剩余迭代。因此,在N = 11和四个线程的示例中,余数将为3,前三个线程0..2将获得一次额外的迭代,而不是为最后一个线程分配3次额外的迭代。
您对无块静态调度的迭代分布的期望是错误的。循环分配仅为调度(静态,块)指定,而不是在“最多一个块分发到每个线程”时的调度(静态)。
迭代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规范都说,块的大小应该大致相等,而不指定精确的分布算法。