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