|
发表于 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去打这些补丁,就是不知道值不值得.
求大神分析下. |
|