1. CPU 缓存行与程序性能中按行优先遍历二维数组更快,缓存行(64B)失效与伪共享(false sharing)如何影响多线程性能?
解释 CPU 缓存行与程序性能的关系:为什么按行优先遍历二维数组更快,缓存行(64B)失效与伪共享(false sharing)如何影响多线程性能?
- 缓存行的空间局部性为何行优先更快
- 缓存行失效与伪共享的机制
- 伪共享对多线程吞吐的影响
按行优先遍历二维数组更快,是因为数组按行连续存放,行优先访问时相邻元素在连续内存中,命中同一缓存行(通常 64B),充分利用空间局部性,减少缓存未命中;列优先则每次访问跨越整行,频繁触发缓存行替换,发生大量 CPU 缓存 miss。缓存行失效指多个核共享的缓存行被某一核改写后,其它核的副本失效,需重新获取,造成额外开销。伪共享(false sharing)指两个线程各自访问"不在同一缓存行内的不同变量"但实际上它们却落在同一缓存行上,虽无数据依赖,但任一变量被写都会使整个缓存行失效,导致另一线程反复重新加载,产生缓存抖动,严重降低多线程吞吐。缓解伪共享用缓存行填充(padding)把变量对齐到独立缓存行,或使用按线程隔离的变量。
缓存行是 64B 的原子单元,性能优化的关键是"空间局部性"与"缓存行对齐"。行优先 vs 列优先体现前者;伪共享体现后者在多线程下的隐性开销。面试常考"把两个频繁写的高并发热变量错开缓存行"。