通常每个周期一次一个地提取和解码指令。
我想知道如果我们同时获取和解码2条指令会有什么影响。需要更改架构的变化是什么?
答案 0 :(得分:2)
每个周期一次一个地获取和解码指令的想法通常是不正确的。
让我们一些简单的事情。您可以拥有多个核心,并且每个核心都可以独立运行。这是英特尔等增加每个周期(IPC)指令数量的主要方式。您还可以同时进行多线程处理(在intel中称为超线程),其中您有两个独立的线程在同一个核心上运行。这是在过去十年中增加IPC的另一种常见方式(Sun的Niagara芯片有很多线程。)
好的,现在回答你可能真正想要的。在单个执行线程中,大多数现代处理器可以在每个周期获取和解码多个指令(这通常称为超标量)。几乎所有现代高性能处理器都可以做到这一点。例外是功耗非常低的处理器以及明显牺牲单线程性能以实现吞吐量的处理器(Niagara,它使用大量线程)
现在进行架构更改(有数以万计的选项)。最大的细分是你有一个固定长度指令(ARM)还是一个可变长度指令(x86)。
使用固定长度指令,您可以知道指令边界是什么,因此构建一个可以在每个时钟读取8个指令并解码所有指令的系统相对容易。通常,您的获取宽度大于执行宽度,因为您将获得分支指令,并且可能会对齐提取,而分支可能会将您降落到任何位置。在这些系统中,最大的挑战是真正获得分支预测器(实际上它是下一个指令预测器块)运行良好。
使用可变长度指令,它只是一个痛苦的世界。在x86世界中,他们将这些可变长度的“宏”指令转换为(大多数)固定宽度的“微”指令。然后,您可以将这些微指令存储在特殊缓存中(通常称为跟踪缓存)。如果对于特定地址,您会在跟踪缓存中获得命中,那么您不必解码宏指令,只需处理微指令即可。 (跟踪缓存可以做很多事情,并且可以在固定宽度的机器上使用,因为你可以像重新调整块一样玩技巧,甚至可以将包括所采用分支的顺序指令序列放在一起,因此称为“跟踪”)。即使使用此跟踪缓存方法,如果要获得高性能,仍需要尝试每个周期获取多个宏指令。通常系统可以做一些,他们基本上使用预测器来指示指令边界可能是什么。
大多数非常复杂的东西只能在无序处理器上找到,因为在有序机器中尝试并行执行两个以上的指令通常没有多大意义,因为危险和依赖只是发生经常做一些更实际的事情。