pang68599 发表于 2015-02-06 15:09

Memory Ordering


                     处理器0                                        处理器1



                   mov , 1                                 mov , 1

                   mov r1,                                   mov r3,

                   mov r2,                                   mov r4,



注:初始时,x = 0,y = 0;r2 = 0且r4 = 0是被允许的



为什么r2=0和r4=0是被允许的。
mov r2, 在执行前不是应该先直行mov r1, 么,mov r1, 直行前不是先直行mov , 1 ,此时的已经为1

那么再执行处理器1的流程,则r4=1,r2=0

难道mov r2, 可以先于mov , 1    执行么?

MeRcy_PM 发表于 2015-02-06 16:07

菜鸟没太看明白题目。。。
CPU0和CPU1的指令是最后已经确定生成了的指令吗?
mov r2,
mov , 1
这两条指令看起来如果_x和_y不存在别名关系,两者之间应该不存在任何依赖,指令调度顺序应该是可以乱序的吧。
此外还有这种架构下的内存->寄存器的move是否有latency导致?
比如:
Time0:
指令mov , 1发射,但是实际内存完成写操作要到Time2.
Time1:
指令mov r2, 发射,可能已经开始将_x的数据读取出内存了,这时读取出来的是0.
或者是一个多核同步的问题?

pang68599 发表于 2015-02-07 16:58

MeRcy_PM 发表于 2015-02-06 16:07 static/image/common/back.gif
菜鸟没太看明白题目。。。
CPU0和CPU1的指令是最后已经确定生成了的指令吗?
mov r2,

这些指令应该是保存在每个CPU的指令Cache中的,下次取指令的时候就会去对应的指令Cache中获取
因为在Memory Ordering 中有如下的规则:
1.读指令(从内存中读)不与其它读指令作重新排序
2.写指令(往内存中写)不与之前的读指令作重新排序
3.对存储器的写不与其它写指令作重新排序,但是有例外(入CFLUSH等指令)

这些就是针对单个核心的CPU的规则:

所以

                   1)mov , 1                                 4)mov , 1

                   2)mov r1,                                   5)mov r3,

                   3)mov r2,                                   6)mov r4,



那么根据以上的执行规则那么按照时间轴的顺序应该是有如下情况:

1->2->3->4->5->6

1->4->5->6->2->3

1->4->2->3->5->6

4->1->2->5->6->3
等等

因为123,456他们的执行顺序不能变,见上面的规则

所以
不管是1还是4先执行那么r2和r4都不能同时等于0,那么关于这个可以同时等于的结论是如果实现的?




页: [1]
查看完整版本: Memory Ordering