一 什么是伪共享(False Sharing)
当多个线程访问同一缓存行(Cache Line) 中的不同变量时,即使这些变量逻辑上不相关,也会因缓存一致性协议(如MESI)导致频繁的缓存行无效化,从而引发性能下降。
二 关键点:
缓存行大小通常为64字节(x86架构)。
若两个变量位于同一缓存行,线程A修改变量X,线程B修改变量Y(即使X和Y无关),会导致缓存行在核心间反复同步。
三 伪共享的表现
1 症状
多线程程序性能未随线程数增加而提升,甚至可能下降。
2 工具
使用性能分析工具(如Perf、VTune)观察到高缓存失效(Cache Miss) 或 一致性流量(Coherency Traffic)。
四 典型场景
int shared_data[4]; // 假设数组元素在内存中连续,可能位于同一缓存行
#pragma omp parallel for
for (int i = 0; i < 4; i++) {
shared_data[i] = compute(i); // 不同线程修改不同元素
}
即使每个线程操作不同元素,若它们位于同一缓存行,仍会导致伪共享。
五 检测伪共享
1 使用性能分析工具
通过工具(如perf、Intel VTune&#