Architecture 同时获取和解码两条指令的实现

Architecture 同时获取和解码两条指令的实现,architecture,parallel-processing,pipeline,computer-architecture,instructions,Architecture,Parallel Processing,Pipeline,Computer Architecture,Instructions,通常每个周期一次获取一条指令并对其进行解码 我想知道如果我们同时获取和解码2条指令,会有什么影响。架构中需要更改的内容是什么?每个周期一次获取和解码一条指令的想法通常是不正确的 让我们把一些简单的事情弄清楚。您可以有多个核心,这些核心各自独立运行。这是英特尔等公司增加每周期指令数(IPC)的主要方式。您还可以同时进行多线程处理(英特尔语中的超线程),其中两个独立线程运行在同一个内核上。这是过去十年中增加IPC的另一种常见方式(Sun的尼亚加拉芯片有很多线程) 好的,现在来看看你可能真正想要的答案

通常每个周期一次获取一条指令并对其进行解码


我想知道如果我们同时获取和解码2条指令,会有什么影响。架构中需要更改的内容是什么?

每个周期一次获取和解码一条指令的想法通常是不正确的

让我们把一些简单的事情弄清楚。您可以有多个核心,这些核心各自独立运行。这是英特尔等公司增加每周期指令数(IPC)的主要方式。您还可以同时进行多线程处理(英特尔语中的超线程),其中两个独立线程运行在同一个内核上。这是过去十年中增加IPC的另一种常见方式(Sun的尼亚加拉芯片有很多线程)

好的,现在来看看你可能真正想要的答案。在单个执行线程中,大多数现代处理器可以在每个周期提取和解码多条指令(通常称为超标量)。几乎所有现代高性能处理器都是这样做的。例外情况是功耗非常低的处理器,以及那些为了吞吐量而显式牺牲单线程性能的处理器(Niagara,它使用大量线程)

现在是架构更改(有无数的选项)。最大的细分是您使用的是固定长度指令(ARM)还是可变长度指令(x86)

对于固定长度的指令,您知道指令边界是什么,因此构建一个系统相对容易,该系统可以获取(比如)每个时钟8条指令,并对所有指令进行解码。通常,您的获取宽度大于执行宽度,因为您将有分支指令,并且获取可能是对齐的,而分支可以将您放到任何地方。在这些系统中,最大的挑战是如何使分支预测器(实际上是下一个指令块预测器)正常工作

有了可变长度的指令,这简直是一个痛苦的世界。在x86世界中,如今,他们将那些可变长度的“宏”指令转换为(大部分)固定宽度的“微”指令。然后,您可以将这些微指令存储在一个特殊的缓存(通常称为跟踪缓存)中。如果对于特定地址,您在跟踪缓存中得到了命中,那么您不必解码宏指令,只需处理微指令即可。(跟踪缓存可以做更多的事情,也可以在固定宽度的机器上使用,因为你可以玩一些小把戏,比如重新对齐块,甚至把包含执行的分支的指令序列放在一起,因此被称为“跟踪”)。即使使用这种跟踪缓存方法,如果希望获得高性能,您仍然需要尝试在每个周期获取多条宏指令。通常系统可以做一些事情,它们基本上使用预测器来指示指令边界可能是什么

大多数真正复杂的东西只能在无序处理器上找到,因为在有序机器中尝试并行执行两条以上的指令通常没有多大意义,因为危险和依赖经常发生,使任何事情变得更实际