我了解在对称多处理器 (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 }
所以我的问题是:
- 错误共享主要来自这样一个事实:内存是通过由固定数量的字节组成的块来访问的,并且每个进程都有自己的缓存。这块内存是一起写入和读取的。我的理解接近事实吗?
- GPU中的内存访问模式怎么样?所有的流处理器是共享一组缓存还是有单独的缓存?虚假共享是否也是 GPU 计算中的一个问题?