第四章 指令级并行
4.2 列举出下面循环中的所有相关,包括输出相关、反相关、真相关和循环相关。
For (i=2; i<=100; i=i+1){
a[i] = b[i] + a[i]; /* s1 */
c[i+1] = a[i] + d[i]; /* s2 */
a[i-1] = 2 * b[i]; /* s3 */
b[i+1] = 2 * b[i]; /* s4 */
}
解:展开循环两次:
a[i] = b[i] + a[i]; /* s1 */
c[i+1] = a[i] + d[i]; /* s2 */
a[i-1] = 2 * b[i]; /* s3 */
b[i+1] = 2 * b[i]; /* s4 */
a[i+1] = b[i+1] + a[i+1]; /* s1’ */
c[i+2] = a[i+1] + d[i+1]; /* s2 ‘*/
a[i] = 2 * b[i+1]; /* s3 ‘*/
b[i+2] = 2 * b[i+1]; /* s4 ‘*/
不用将高级语言改写成 DLX 代码,输出相关、反相关、真相关在基本块中讨论,循环相关在展
开的循环间讨论。
输出相关:无
反相关:无
真相关:S1&S2
由于循环引入的相关:S4&S4’(真相关)、S1’&S4(真相关)、S3’&S4(真相关)、S1&S3’(输
出相关、反相关)、S2&S3’(反相关)
4.3 根据需要展开下面的循环并进行指令调度,直到没有任何延迟。指令的延迟如表 4.2。
LOOP: LD F0, 0(R1)
MULTD F0, F0, F2
LD F4, 0(R2)
ADDD F0, F0, F4
SD 0(R2), F0
SUBI R1, R1, 8
SUBI R2, R2, 8
BNEZ R1, LOOP
解:
根据表 4.2 所给的延迟,程序执行情况如下:
LOOP: LD F0, 0(R1)
Stall (产生 F0 的为取操作,使用 F0 的为浮点计算操作,所以延迟为 1)
MULTD F0, F0, F2
LD F4, 0(R2)
Stall (产生 F4 的为取操作,使用 F4 的为浮点计算操作,所以延迟为 1)
Stall (产生 F0 的为浮点计算操作,使用 F0 的为浮点计算操作,所以延迟共为 3)
ADDD F0, F0, F4