检测CPU中的危险


-1

我有一个关于处理器使用流水线的问题

具有指令流水线处理的处理器能否在没有危险检测的情


为什么不投票????
3DSpaceGen

Answers:


0

流水线处理器可以通过永远不会有危险(可能有编译器调度的帮助)或通过处理软件中的危险违规检测来避免所有用于危险检测的硬件。

对于简单的标量管道,结构性危险相对容易避免,只需要确保阶段之间不共享硬件。这意味着单周期指令或完全流水线执行。

除了可能的乘法和除法之外,MIPS R2000没有任何结构性危险(因为人们希望在开始另一次乘法或除法之前读取结果,因此不清楚是否可以认为这些操作缺乏流水线作为结构性危险由硬件检测)。如果考虑选择转发路径不检测寄存器文件中结果延迟可用性的数据危险,则MIPS R2000仅具有与存储器访问,乘法和除法相关的数据危险检测。对于R2000,需要软件将nop放在负载延迟槽中,但硬件确实检测并处理了缓存未命中数据危险。

如果乘法已经实现了两个周期的延迟,那么要求编译器插入一个nop可能是合理的(当从HI或LO的移动否则会立即跟随乘法或除法指令时,或者,如果这些指令使用了目的地的通用寄存器,当GPR用作源时)来管理这种数据危险。对于微控制器,没有缓存是可能的。这将只留下内存映射的I / O作为数据危险源。微控制器中的一些片上外设可能能够支持非常短的固定延迟,可以通过延迟时隙来处理(如果编译器/程序员可以区分这两种情况,延迟时隙的数量可能与实际存储器访问的数量不同) 。

(从高速缓存未命中检测数据危险是相当自然的,因为处理器必须检测到高速缓存未命中。处理危险更复杂。)

处理器也可以将所有操作的等待时间视为两个周期(如R2000中的高速缓存命中负载)。然后,编译器将负责将指令(可能是nops)插入到指令的延迟槽中。如果处理器是一个真正的桶式处理器,循环通过桶上的板条之类的线程,则可以为采取与“桶形板条”一样多的周期的操作提供单周期表观延迟; 非活动线程有效地将nops插入到延迟槽中。

使用简单的管道,编译器可以存在并避免一些结构性危险。例如,处理器可能有两个寄存器组,每个寄存器组中只有一个读端口; 编译器必须完全避免两个源指令的存储体冲突,可能是通过插入寄存器复制指令,使两个存储区中的值可用。

类似地,软件可以处理数据危险,其中最坏情况延迟太大而不能简单地通过轮询准备就绪的自旋循环使用延迟槽。(如果可以保证结果不具有特定值,则可以由硬件提供准备状态或者通过结果的值检测准备状态,可以将不可能的结果值预先插入到长等待时间操作目的地寄存器中。使硬件提供准备状态但没有能力使用这种状态来检测危险似​​乎很愚蠢,但这样做是可能的。)

粗粒度多线程是处理更长延迟的另一种方法。当最坏情况下的延迟隐藏起来是不切实际的时候,软件可以告诉处理器切换线程。如果软件保证这种较长延迟操作的重复率足够低,则两个线程可以隐藏否则会引入数据危险的延迟。(即使软件必须保证足够低的重复率,每当这些操作被解码时,如果硬件切换线程,我会认为是危险检测。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.