OpenMP 的循环调度如何影响 ccNUMA 的性能?

How can OpenMP's round robin scheduling hurt ccNUMA's performance?

我正在尝试了解 ccNUMA 系统,但我对 OpenMP 的调度如何损害 performance.Let 感到有点困惑,如果 c1 是,我们会发生以下 code.What小于 c0 或更大?我理解不同的块大小会导致远程访问的一般想法,但我在某处读到,对于小块大小,缓存行会发生一些事情,我真的很困惑。

#pragma omp parallel for schedule(static,c0)
  for(int i=0;i<N;i++)
      A[i]=0;
#pragma omp parallel for schedule(static,c1)
  for(int i=0;i<N;i++)
      B[i]=A[i]*i;

当使用 malloc 分配 A[] 时,OS 只承诺您将获得指针指向的内存。还没有进行实际的内存分配,也就是说,还没有分配物理内存页。当您执行第一次接触数据的第一个并行区域时会发生这种情况(另请参见 "first-touch policy")。当第一次访问发生时,OS 在执行接触线程的同一 NUMA 域上创建物理页面。

因此,根据您选择的方式 c0,您可以在整个系统中获得特定的内存页分布。通过一些数学运算,您实际上可以确定 c0 的哪个值将导致内存页面的分布。

在第二个循环中,您使用的 c1 可能不同于 c0。对于 c1 的某些值(尤其是 c1 等于 c0),您应该在系统上看到几乎没有 NUMA 流量,而对于其他值,您会看到很多。同样,用数学方法确定这些值很简单。

您可能面临的另一件事是虚假分享。如果选择 c0c1 使得块处理的数据小于缓存行的大小,您将看到缓存行在多个线程之间共享,因此在系统的不同缓存。