- 论坛徽章:
- 4
|
"看到"是指引用其结果没?
CPU1中这条指令之前的所有指令--这个之前是指CPU1上已经运行的指令(这个没多大问题,如果每CPU读写总是按一定序), 还是指即使存在乱序的情况下, 在乱序之前的指令序都能被"看到".
smalloc 发表于 2011-09-10 15:28 ![]()
这里是说的顺序模型。不过这个是最重要的。
因为乱序模型是根据顺序模型来设计的,mb()的作用,就是搞了个顺序一致的点,mb()前后的指令表现为顺序一致。
什么叫“看到”,虽然很多个文档中定义了到底什么叫“看到”,不过以arm architecture reference manual中定义的最为标准。
什么时候可以认为load指令被看到? 对同一地址执行store时,不影响load的返回结果,即为load被看到
什么时候可以认为store指令被看到? 对同一地址执行load时,将返回store的值,即为store被看到
虽然原理看起来很简单,不过reorder buffer,load / store unit,store buffer,cache............的设计,均是以此为出发点。
一个例子,执行mb()时需要将CPU1的各个读写请求通过MESI发给别的CPU,然后等待这些读写请求完成,即这些请求的应答reply后,才叫mb()执行完成。
但是为什么对于读请求,需要这个读操作确实在其他CPU的cache中完成,才能发回reply; 但是对于写请求,仅仅是将invalidate request挂在其他CPU的incoming queue上,不等invalidate在其他CPU的cache中完成,就可以发回来reply???
对于上边这种情况,有一个基本的设计原则:对于本CPU而言,
1) 从其他CPU发过来的invalidate request,
2) 从其他CPU发过来的的read reply,invalidate reply
这两类数据包之间,一定不能乱序;但是本类数据包内部,可以乱序。 这样的话:
处理其他CPU发来的read replay之前,则必然已经处理了其他CPU发来的invalidate request。即看到其他CPU的一个store操作时,则必然可看到这个store之前的所有store。
处理其他CPU发来的invalidate replay之前,则必然已经处理了其他CPU发来的invalidate request。即看到其他CPU的一个load操作时,则必然可看到这个load之前的所有store。 |
|