Memory Consistency和Memory Order
这节课实际上解决了我一直以来非常困惑的一个问题,Memory order到底是个啥。因为之前使用到atomic之类的cpp库,一直困惑里面涉及的Memory order作用
Memory coherence vs. memory consistency
Memory coherence实际上就是Cache 的coherence,需要满足cpu多线程操作同一内存地址的操作能够被线性化。
Memory consistency这是描述了对于不同内存地址操作的行为。
为什么会有Memory consistency?因为无论是编译器还是CPU都可能会对代码进行reordering。
教授提到了四种Reordering的操作:
如果是sequentially consistent内存系统,那么会保证这四种顺序,即满足上述四种顺序的两个内存操作不会被Reordering。
如果是Relaxed Memory consistency,这四种顺序的Reordering都会被允许。
值得注意的是,这里提到的ordering指的是对不同内存地址操作。
relaxed consistency 的一个好处就是能够掩盖一些操作的延迟
Total Store Ordering(TSO)
total store ordering(TSO)去掉了写后读依赖
- Processor P 可以先执行Read B然后执行Write A,并且所有其他processor都可以观察到这一现象
- 如果有processor看到了Processor P已经write A, 那么其他Processor都可以看到Processor P已经Write A
Processor Consistency (PC)更加激进些
- 如果有Processor看到Processor P已经Write A,但是其他Processor仍然有可能看到Processor P还没有Write A。
注意, x86-64也就是Intel cpu的内存模型是TSO。
C++ memory order
教授在cs149 的ppt里面似乎没有提c++ 中的Memory order语义,但是在其cmu15418课程中简单提了c++ 中的两种语义
- release semantic。在release之前的内存操作不能被reordering到release之后
- acquire semantic。在acquire之后的内存操作不能被Reordering到reordering到acquire之前。