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