📅  最后修改于: 2023-12-03 15:28:40.879000             🧑  作者: Mango
设计一个具有流水线结构的处理器,包含以下阶段:取指令(IF)、指令译码(ID)、执行(EX)、访存(MEM)和写回(WB)。流水线各阶段的指令处理时间分别为$t_{IF}$、$t_{ID}$、$t_{EX}$、$t_{MEM}$和$t_{WB}$。每个阶段处理完后,指令会在下一个时钟周期传递到下一阶段。
此外,可以有两个或更多指令同时进入不同的阶段,这称为流水线并行(pipeline parallelism)。具体来说,如果在某个时刻$t$,第$i$条指令正在阶段$j$处理,第$j+1$条指令正在阶段$j$处理,而第$i+1$条指令正在阶段$j-1$处理,那么这三条指令就是并行的。
设计一种算法,确定每个阶段所需的理想时间$t_{IF}^*$、$t_{ID}^*$、$t_{EX}^*$、$t_{MEM}^*$和$t_{WB}^*$,以使得开始执行任意一条指令时,至少需要$t_{IF}^*+t_{ID}^*+t_{EX}^*+t_{MEM}^*+t_{WB}^*$个时钟周期后,所有指令都能够完成执行。并且,这个时间应该越小越好。
包含一个整数$n$,表示指令总数。
接下来$n$行,每行包含一个字符串,表示一条指令。字符串的格式为:$op$ $r_1$ $r_2$ $r_3$,其中$op$是操作码,$r_1$、$r_2$和$r_3$是寄存器的编号,例如add r1 r2 r3表示将寄存器$r2$和$r3$相加,并将结果存入$r1$中。
包含一行,依次输出$t_{IF}^*$、$t_{ID}^*$、$t_{EX}^*$、$t_{MEM}^*$和$t_{WB}^*$,用一个空格分隔,四舍五入保留1位小数。
3
add r1 r2 r3
sub r4 r1 r5
add r6 r7 r8
1.0 1.0 1.0 1.0 1.0
考虑让每个阶段的处理时间都为1,则需要$t_{IF}^*+t_{ID}^*+t_{EX}^*+t_{MEM}^*+t_{WB}^*=5$个时钟周期。假设第一条指令是add r1 r2 r3,它从$t=0$开始执行,那么:
如果$t_{IF}^*<1$,则第一条指令的ID阶段会与第二条指令的IF阶段冲突,即出现了数据相关(data hazard)。因此,要求$t_{IF}^*\geq1$。同理,$t_{ID}^*$、$t_{EX}^*$、$t_{MEM}^*$和$t_{WB}^*$都应该不小于1。但是,如果$t_{IF}^*=t_{ID}^*=t_{EX}^*=t_{MEM}^*=t_{WB}^*=1$,则同样会出现数据相关,因此需要将它们调整到合适的值。