SMP Memory Access and Barrier学习笔记
Memory Barrier这一块,比较绕脑子。Write barrier好理解,就是把write操作在时间上划一个栅栏。但是read barrier就复杂不少,不能简单理解为把read操作在时间上划一个栅栏。但是Intel的手册上对于read barrier的讲解与write barrier类似——全然不顾read barrier理解起来更复杂。还是Redhat写得文档帮了大忙。
好吧,牢骚发完,下面将我的理解:
关于Memory Barrier的时间序列有三条,这三条序列的第一条和最后一条在同一个CPU中是可以各自保证因果关系的,但是对于不同CPU来说,没有必然的因果关系而且三个序列都是独立的:
*** Sequence of CPU committing write to memory.
*** Sequence of CPU perceiving memory change, usually delayed and out of order as the actual memroy change.
*** Sequence of CPU issuing read.
Write barrier:
保证write barrier前的指令在sequence of CPU committing write to memory中一定出现在write barrier后的指令之前。
Read barrier:
Barrier的保证满足如下的rule。
*** 首先保证在read barrier之前的read肯定比barrier之后的read之后的指令早发出。
*** 在sequence of CPU perceiving memory change中查找read barrier以前的read指令被issue的时间点。
*** 找出最后的时间点PL。
*** 把PL之前perceive到的所有memory change找出。
*** 检查这些memory change实际commit到memory的时间,找到最后的时间点PC。
*** 确保PC之前的所有address1 memory change都被perceive到,才发出read address1指令。
Read depends barrier
Barrier的保证满足如下的rule。
*** 首先保证在read barrier之前的dependent read肯定比barrier之后的read之后的指令早发出——其实这一点无需由barrier保证,因为任何CPU都天然满足这一条。
*** 在sequence of CPU perceiving memory change中查找read barrier以前的dependent *** read指令发生的时间点。
*** 找出最后的时间点PL。
*** 把PL之前perceive到的memory change找出。
*** 检查这些memory change实际commit到memory的时间,找到最后的时间点PC。
*** 确保PC之前的所有address1 memory change都被perceive到,才发出read address1指令
需要说明的一点:除Alpha之外,Linux支持的所有CPU都在hardware-level直接实现了dependent read barrier。
我自己的感想:write barrier只涉及一个sequence of committing的概念,所以比较简单。而read barrier,不光涉及sequence of issuing read,还要涉及sequence of perceivation和sequence of commiting这两个概念,所以理解起来困难一些。而Intel manual上对两种barrier的描述却几乎是对称的,明显confusing。
留待大家指正。