三级缓存–L1、L2、L3
缓存与主内存间通信一般经过3级缓存
cpu在读取数据时,先在L1中寻找,然后L2寻找,再到L3寻找,最后是内存,再然后是外存储器
MESI协议–缓存一致性协议,规定每条缓存有个状态位,共4个:
修改态(Modified)-此cache行已被修改过(脏行)内容已不同于主存,为cache专有
专有态(Exclusive)-此cache行内容同主存,但不出现于其它cache中
共享态(Shared)-此cache行内容同于主存,但也出现于其它cache中
无效态(Invalid)-此cache行内容无效
多处理器时,单个cpu对缓存中数据的改动要通知给其它cpu,cpu处理要控制自己的读写
还要监听其它cpu发出的通知才能保证最终一致。
指令重排:当cpu写缓存时发现缓存区块正被其它cpu占用,为提高cpu处理性能,可能将后面的读缓存命令优先执行。
指令重排遵循as-if-serial语义
即–不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能
被改变。编译器,runtime和处理器都必须遵守as-ifiserial语义–编译器和处理器不会对存在
数据依赖关系的操作进行重排序
指令重排的2个问题
1.cpu高速缓存下的问题
缓存中的数据与主内存的数据并不是实时同步的,个cpu间缓存的数据也不是实时同步,在同
一时间点,各cpu所看到同一内存地址的数据的值可能不一致。
2.cpu指令重排优化下的问题
多核多线程中,指令逻辑无法分辨因果关联,可能出现乱序,导致程序运行结果错误
内存屏障
解决上述2个问题,处理器提供了2个内存屏障指令(Memory Barrier)
写内存屏障(Store Memory Barrier):在指令后插入Store Barrier,能让写入缓存的
最新数据更新写入主内存,让其他线程可见。
强制写入主内存,这种显示调用,cpu就不会因为性能考虑而去对指令重排
读内存屏障(Load Memory Barrier):在指令前插入Load Barrier,可以让高速缓存中的数据
失效,强制从主内存中加载数据
强制读取主内存内容,让CPU缓存与主内存保持一致,避免了缓存导致的一致性问题
CPU缓存和内存屏障
最新推荐文章于 2022-10-23 23:19:36 发布