CS149MemoryConsistency
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之前。

Lock implement
这块内容主要讲了一些Lock的实现方法,首先是test and set lock
test-and-set lock
实现Lock需要原子操作,例如slides中提到的情况,如果没有原子操作可能多个processor同时获得锁
hw提供test-and-set原子指令
但是test-and-se lockt有个问题
- 它是spin lock,当然在某些情况下需要spin lock,但是除非非常在意延迟,不然不会想用spin Lock的
- 因为test-and-set是一个写操作(虽然不一定写成),会导致Cache bus 繁忙
可以看到因为BusRdx,不断drop其他processor中的Cache,导致Cache traffic特别糟糕
test-and-test-and-set lock
其他processor现在不需要busRdx,只需要BusRd,相当于大家一块读Lock,Cache的命中会好很多。
ticket lock
ticket lock在release Lock时候,只会drop一个processor对应的的Cache line(因为该processor一直读对应位置)

浙公网安备 33010602011771号