今天我在并行编程课上和我的教授就“伪共享”问题有了不同的理解。我的教授的说法让我感到困惑,所以我立即指出了这一点。她认为,“伪共享”会导致程序结果出错。
我说,“伪共享”发生在将不同内存地址分配给同一高速缓存行时,向其中一个写入数据将导致另一个被移出缓存。如果处理器在这两个伪共享地址之间交替写入,那么它们都不能保留在缓存中,因此所有操作都会导致访问DRAM。
这是我目前的看法。实际上,我也不确定我所说的是否正确...如果我有误解,请指出。
因此有一些问题,假设缓存为64字节对齐,4路组相联。
- 两个地址之间的距离超过64字节,是否可能发生“伪共享”?
- 单线程程序是否可能遇到“伪共享”问题?
- 最好的代码示例来复现“伪共享”是什么?
- 一般来说,程序员应该注意什么以避免“伪共享”?
2. 单线程程序不可能遇到“伪共享”问题。
3. 最好的代码示例是创建一个数组,将其分成多个小块,并在各个线程之间交替写入每个小块。这样可以模拟多个线程同时访问同一缓存行的情况。
4. 程序员应该将相关数据放在单独的缓存行中,以避免“伪共享”。此外,可以通过增加填充来确保数据不共享相同的缓存行。