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