4

我了解在对称多处理器 (SMP) 系统中,由于每个内核中的单独缓存,可能会发生错误共享,如下代码: http: //software.intel.com/en-us/articles/avoiding-and-identifying -假线程间共享

01  double sum=0.0, sum_local[NUM_THREADS];
02  #pragma omp parallel num_threads(NUM_THREADS)
03  {
04   int me = omp_get_thread_num();
05   sum_local[me] = 0.0;
06   
07   #pragma omp for
08   for (i = 0; i < N; i++)
09   sum_local[me] += x[i] * y[i];
10   
11   #pragma omp atomic
12   sum += sum_local[me];
13  }

所以我的问题是:

  1. 错误共享主要来自这样一个事实:内存是通过由固定数量的字节组成的块来访问的,并且每个进程都有自己的缓存。这块内存是一起写入和读取的。我的理解接近事实吗?
  2. GPU中的内存访问模式怎么样?所有的流处理器是共享一组缓存还是有单独的缓存?虚假共享是否也是 GPU 计算中的一个问题?
4

1 回答 1

3
  1. 这并不是说缓存线是一起读取或写入的,而是如果任何 CPU 写入任何字节,它都会使整个缓存线无效。

  2. 取决于 GPU。至少对于某些 NVidia GPU,L1 缓存(全局内存)是不连贯的,因此您还有其他问题。在禁用 L1 的情况下,您可能会在 L2 缓存中遇到问题,这是一致的。

于 2013-12-15T19:58:03.757 回答