百科问答小站 logo
百科问答小站 font logo



CPU是怎么解决Cache的冲突的? 第1页

  

user avatar   bei-ji-85 网友的相关建议: 
      

理论上说,CPU核间cache同步用的是MESI协议,这个协议网上有很多介绍,不重复说了。

到实际应用中,如果不加任何保护的去访问共享数据,CPU自身不会保证数据的一致性。

从硬件的角度上看,CPU核间cache同步需要20-50个cycle才能完成一个cache line的同步,并且这种同步不一定及时。

如果用户希望保证数据一致性(如操作系统的锁、原子操作),在硬件层面上,是通过锁总线的方式实现的(或者锁cache line),在x86体系里,就是LOCK前缀指令,以及所有隐含LOCK的指令(如XCHG等)。

下图是sandybridge架构下的指令开销:

对于XCHG指令,如果两个操作数都是寄存器,则性能很好。如果其中一个操作数是内存,那么XCHG会锁总线,此时的开销就非常巨大。同样的XADD和LOCK XADD的性能差异也很大,前者不锁总线,不保证数据一致性,后者锁总线,保证数据一致性。

当某个核把总线上锁时,其它核心,如果恰好需要访问对应的cache line那么会被挡在外面,直到锁被释放为止,所以上锁不仅会影响当前核心,也可能影响其它核心,所以对性能要求敏感,那么在代码中应该避免频繁使用锁。

LOCK前缀具体是锁住总线还是只是锁一个cache line,我个人理解是后者,因为如果锁住整个总线,性能会非常低,远远不止20多个cycle这么少。从公开的资料上看,486之前,LOCK是锁总线的,486以后,大概就是锁cache line+MESI协议了。

另外,Intel CPU内部核间有一个高速环形总线,能以CPU的主频速率工作(总之就是非常高,但具体实现细节不清楚),应该就是通过这个环形总线发送换乘锁的请求的。


补充一个一下:操作系统提供的原子操作(比如CAS),大部分(因为我没看全)都用到的LOCK前缀。

以Linux为例,这里是可以看到有lock的:git.kernel.org/pub/scm/

         volatile u32 *__ptr = (volatile u32 *)(ptr);     asm volatile(lock "cmpxchgl %2,%1"            : "=a" (__ret), "+m" (*__ptr)           : "r" (__new), "0" (__old)            : "memory");       break;            




  

相关话题

  为什么手机核心数目提升的比计算机快? 
  三星宣布 3nm 芯片成功流片,这意味着什么?将对行业带来哪些影响与变化? 
  据说大型芯片有几十亿个晶体管,一个都容不得出错,但为何芯片可靠性还这么高? 
  为什么网上有人说笔记本标压i7发热会比i5小,这是什么意思? 
  如何评价基于7nm Zen 2 架构的 AMD RYZEN 3000系列处理器? 
  CPU未来会朝什么方向发展? 
  Intel 12 代酷睿封杀 AVX-512 指令集,不再允许关闭小核,背后都有哪些原因? 
  如何看待阿里巴巴旗下 「平头哥」发布首枚芯片 :玄铁 910? 
  为什么多数手机芯片能对 MP4 格式文件直接解码,但 RMVB 不行? 
  2017 年 AMD 要翻身了吗? 

前一个讨论
COM格式和EXE格式有什么区别?
下一个讨论
如何打开微信里的dat文件?





© 2025-04-17 - tinynew.org. All Rights Reserved.
© 2025-04-17 - tinynew.org. 保留所有权利