l******y 发帖数: 204 | 1 Computer Architecture的一个问题
话说有这么一个Scalar MIPS code for DAXPY (aX + Y):
L.D F0,a ;load scalar a
DADDIU R4,Rx,#392 ;last address to load
Loop: L.D F2,0(Rx) ;load X(i)
MUL.D F2,F2,F0 ;a × X(i)
L.D F4,0(Ry) ;load Y(i)
ADD.D F4,F4,F2 ;a × X(i) + Y(i)
S.D 0(Ry),F4 ;store into Y(i)
DADDIU Rx,Rx,#8 ;increment index to X
DADDIU Ry,Ry,#8 ;increment index to Y
DSUBU R20,R4,Rx ;compute bound
BNEZ R20,Loop ;check if done
问 How does the order of the code change due to the delayed branch?
老师提示我 Having a delayed branch does not reorder the
code drastically as you have proposed but moves one instruction (since the
delayed branch was one cycle).
So given this new
information, which statement changes its position relative to the BNEZ
statement.
我说把loop里面的第一个Load放到BNEZ后面好让branch delay slot填上,别闲着。这
厮说不对。不知道是不是我没有理解delayed branching,哪位能给再讲解一下。谢了
! | DK 发帖数: 194 | 2 整个loopbody 里面好几个 instruction都depend on 第一个load哪,你怎么能这样放
,除非你理解成把下个iteration的load放进来,那就是错误的理解了
比较靠普的做法你就把 Daddiu Ry Ry , #8 放到delay slot就好了 | l******y 发帖数: 204 | 3 是这样啊,你这么说了,我觉得很有道理!
但是我觉得我对delayed branching理解可能有点问题
我之前是想把第一个load放到前一个loop interation里面先把新的x值放进去,不过看
完你说的...觉得很对
能给讲解一下reorder的基本原则么,谢谢!
【在 DK 的大作中提到】 : 整个loopbody 里面好几个 instruction都depend on 第一个load哪,你怎么能这样放 : ,除非你理解成把下个iteration的load放进来,那就是错误的理解了 : 比较靠普的做法你就把 Daddiu Ry Ry , #8 放到delay slot就好了
| DK 发帖数: 194 | 4 最基本的就是不能violate data dependency,如果后面的instruction用前面的
instruction的结果,那他们之间的顺序就不
能变,delayed branch就是把一个一定会execute的instruction放到branch 后面,不
过这个reorder不能违反前面的基本
原则
你要把下一个iteration的load放到delay branch slot不可以是因为下一个load并不是
一定会发生的, 假设branc 的结果
是不loop back,你这样移就造成跟原本的程序不同了
【在 l******y 的大作中提到】 : 是这样啊,你这么说了,我觉得很有道理! : 但是我觉得我对delayed branching理解可能有点问题 : 我之前是想把第一个load放到前一个loop interation里面先把新的x值放进去,不过看 : 完你说的...觉得很对 : 能给讲解一下reorder的基本原则么,谢谢!
|
|