今天我和我的教授在并行编程课上有了不同的理解,关于什么是"虚假分享"。我的教授所说的没什么意义,所以我立即指出了。她想"虚假分享"会导致程序结果出错。
我说,"虚假分享"当将不同的内存地址分配给同一个缓存行时,将数据写入其中一个将导致另一个被踢出缓存。如果处理器在两个错误共享地址之间进行写入转向和转向,则它们都不能保留在高速缓存上,因此所有操作都将导致DRAM的访问。
到目前为止我的意见。事实上,我对我所说的内容并不十分肯定......如果我有误会,请指出。
所以有一些问题。假设缓存为64字节对齐,4路组关联。
答案 0 :(得分:3)
我会就你的问题分享我的观点。
两个以字节大小而不是块大小分隔的地址不会驻留在完全相同的高速缓存行上。因此,如果核心在其高速缓存中具有第一个地址,而另一个核心请求第二个地址,则由于该请求,第一个地址不会从高速缓存中移除。因此,错误的共享错过不会发生。
我无法想象当没有并发时会发生错误共享,因为除了竞争缓存行的单个线程之外别无他人。
使用OpenMP从here获取,重现错误共享的简单示例如下:
double sum=0.0, sum_local[NUM_THREADS];
#pragma omp parallel num_threads(NUM_THREADS)
{
int me = omp_get_thread_num();
sum_local[me] = 0.0;
#pragma omp for
for (i = 0; i < N; i++)
sum_local[me] += x[i] * y[i];
#pragma omp atomic
sum += sum_local[me];
}
我可以想到的一些一般注释,以避免错误共享:
一个。尽可能使用私人数据。
湾有时您可以使用padding来对齐数据,以确保其他变量不会驻留在共享数据所在的同一缓存中。
欢迎任何更正或补充。