0

我正在尝试了解 ccNUMA 系统,但我对 OpenMP 的调度如何损害性能有点困惑。假设我们有以下代码。如果 c1 小于 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;
4

1 回答 1

2

当使用 malloc 分配 A[] 时,操作系统只承诺您将获得指针指向的内存。没有执行实际的内存分配,即尚未分配物理内存页。当您执行第一次接触数据的第一个并行区域时会发生这种情况(另请参见“首次接触策略”)。当第一次访问发生时,操作系统在执行接触线程的同一个 NUMA 域上创建物理页面。

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

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

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

于 2019-07-01T07:45:08.133 回答