|  | 
 
 发表于 2012-12-6 16:27:44
|
显示全部楼层 
| 本帖最后由 yp19890718 于 2012-12-6 17:04 编辑 
 再次发现流水线停顿 因素:
 LDR R1,[R2];
 STR R1,[R3];
 在LDR 回写阶段,STR正处于执行阶段,  STR需要更新后的R1作为数据发送到地址为R3的空间里.然后LDR尚未完成回写,如果将LDR回写阶段的数据提前传给STR来执行,如果通过STR停一拍的话,那么这种改进版流水线就没什么优势了,如果提前使用回写结果,那么同样说明在处理  LDR R1,[R2] , MOV R2,R1 时,MOV指令的执行阶段也可以提前使用LDR的回写结果, 这样就完全没有优势了.
 加上这个问题,目前发现5种因为数据冲突导致流水停顿.分别是
 1
 LDR R1,[R2];
 MOV R1,[R3];
 //LDR 回写阶段 与MOV 执行阶段发生冲突,R1数据未更新,需要让MOV停顿1拍
 2
 MOV R1, R2
 MOV R3, R4 LSR #R1
 //发生在指令1 的MOV 的执行阶段和指令2 MOV的译码阶段, 指令2译码 ,如果进行寄存器移位则必须等待R1更新,需要停顿1拍
 
 3
 LDR   R1,[R2]
 LDR   R2,[R1]
 //这个比较明显,发生在第一个LDR的回写阶段和第二LDR的执行阶段,R1未更新.必须停顿1拍(提前使用数据的话就必须减少访存时间确保在WB前出数据,这样就只会加大工艺难度)
 4
 B   LABEL
 //在没有CACHE的情况,这个停顿是必须,至少两拍.
 
 5
 LDR R1,[R2]
 STR R1,[R4]
 
 大神,这么多的数据冲突,虽然都能通过流水线停顿在解决,还是效率肯定是增不了多少,LDR/STR指令多起来的话那得崩溃了.而且还多花了BOM去打这些补丁,就是不知道值不值得.
 
 求大神分析下.
 | 
 |