Cuda GPU中的虚假共享:它是否存在/类似于CPU?

时间:2013-12-15 19:05:32

标签: c cuda false-sharing

据我所知,在对称多处理器(SMP)系统中,由于每个内核中的各个缓存可能会出现错误共享,代码如下:http://software.intel.com/en-us/articles/avoiding-and-identifying-false-sharing-among-threads

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计算中的一个问题吗?

1 个答案:

答案 0 :(得分:3)

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

  2. 取决于GPU。至少对于某些NVidia GPU,L1缓存(全局内存)并不一致,因此您还有其他问题。如果禁用L1,则可以解决L2缓存中存在问题的问题。