Optimization 在pipline中处理数据依赖关系
如果您有上面的程序集,一般的5阶段管道看起来像下面这样,但是由于存在数据依赖性,第一条指令在第5阶段之前不会存储结果,因此第二条指令无法开始获取结果。通过插入NOP指令,您将如何等待循环结束Optimization 在pipline中处理数据依赖关系,optimization,pipelining,y86,Optimization,Pipelining,Y86,如果您有上面的程序集,一般的5阶段管道看起来像下面这样,但是由于存在数据依赖性,第一条指令在第5阶段之前不会存储结果,因此第二条指令无法开始获取结果。通过插入NOP指令,您将如何等待循环结束 mov $10, %eax add $2, %eax mov $4, %ebx mov $5, %ecx add $1, %ebx add $1, %ecx add %ecx, %eax add %ebx, %eax 编辑不确定这是否正确,但以下是我的想法: Instruction Cycle 1 2
mov $10, %eax
add $2, %eax
mov $4, %ebx
mov $5, %ecx
add $1, %ebx
add $1, %ecx
add %ecx, %eax
add %ebx, %eax
编辑不确定这是否正确,但以下是我的想法:
Instruction Cycle 1 2 3 4 5 6 7
mov $10, %eax IF ID EX MEM WB
add $2, %eax IF ID EX MEM WB
mov $4, %ebx IF ID EX MEM WB
在这里似乎使用的
x86
体系结构上,处理器本身会检测到此类依赖项并在必要时暂停插入,程序员或编译器无需插入显式NOP
。事实上,现代无序实现将进一步寻找插入的额外工作,而不是停滞。您是否在问,在传统的5级流水线处理器实现中,这种检测的逻辑将如何实现,或者编译器如何针对需要手动流水线跟踪的体系结构(如在延迟槽中)是否会检测到暂停的必要性?我想问的是,为了适应数据延迟,您会在哪里插入NOP指令。我认为您所针对的处理器缺少依赖项跟踪,并且需要编译器帮助进行调度?在指令中,给定序列中唯一的依赖类型是在执行和写回阶段之间,因此,如果在下一条指令中使用结果,则需要两个暂停,如果在前面使用两条指令,则需要一个暂停。无论如何,除非你真的必须插入NOP,否则你不应该插入NOP。在这种情况下,您可以通过重新排序序列来消除气泡。在任何情况下,您都需要小心。没有标准化的5级流水线,只有一个粗糙的经典5级RISC流水线,每台机器的细节可能也确实不同。在继续之前,请务必仔细阅读您的体系结构文档,最重要的是在调试器中运行实验以查看结果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
mov $10, %eax F D E M W
NOP F D E M W
NOP F D E M W
NOP F D E M W
add $2, %eax F D E M W
mov $4, %ebx F D E M W
mov $5, %ecx F D E M W
NOP F D E M W
NOP F D E M W
add $1, %ebx F D E M W
add $1, %ecx F D E M W
NOP F D E M W
NOP F D E M W
NOP F D E M W
add %ecx, %eax F D E M W
add %ebx, %eax F D E M W