即使在非 VLIW ISA 上,第一条指令也不一定“按顺序执行”,执行只需要按顺序执行。有序超标量实现可以与另一条指令并行执行多条指令。为了有效地做到这一点,必须增加(加宽)解码指令的硬件,必须增加硬件以确保并行执行的指令的数据独立性,必须增加执行资源,并且通常会增加寄存器文件端口的数量。所有这些都增加了晶体管。
一种乱序实现,只要没有数据依赖关系,就允许后面的指令在前面的指令之前执行,一旦数据可用,它就会使用额外的硬件来处理指令的调度,并添加重命名寄存器和用于映射的硬件,分配和释放它们(更多晶体管)以避免读后写和写后写危险。乱序执行允许处理器避免停顿。
乱序处理器中加载和存储的重新排序需要确保在程序顺序中较早的存储将结果转发到相同地址的稍后加载。这意味着地址比较逻辑以及存储地址(和大小)的存储(以及数据的存储),直到存储被提交到内存(缓存)。(对于具有较弱内存一致性模型的 ISA,还需要检查负载是否根据来自其他处理器的存储(更多晶体管)正确排序。)
流水线增加了一些额外的控制和缓冲开销,并防止指令处理的不同部分重用逻辑,但允许处理指令的不同部分在不同指令的时间上重叠。
流水线和超标量执行增加了控制风险(即条件分支和跳转)的影响。流水线(以及无序执行)甚至可以延迟无条件跳转目标的可用性,因此添加硬件来预测目标(以及条件分支的方向)允许继续获取指令而无需等待执行部分处理器以提供必要的数据。更准确的预测器往往需要更多的晶体管。
对于乱序处理器,可能希望在计算所有先前存储的地址之前允许从内存加载执行,因此需要一些硬件来处理这种推测,可能包括预测器。
缓存可以减少延迟并增加内存访问的带宽,但添加晶体管来存储数据和存储标签(并将标签与请求的地址进行比较)。还需要额外的硬件来实施更换政策。硬件预取将增加更多晶体管。
在硬件而不是软件中实现功能可以提高性能(同时需要更多的晶体管)。例如,TLB 管理、复杂运算(如乘法或浮点运算)、特殊运算(如计数前导零)。(添加指令也会增加指令解码的复杂性,通常也会增加执行的复杂性——例如,控制将使用执行硬件的哪些部分。)
SIMD/向量操作增加了每条指令执行的工作量,但需要更多的数据存储(更宽的寄存器)并且通常使用更多的执行资源。
(推测性多线程还可以让多个处理器更快地执行单个线程程序。显然,将处理器添加到芯片会增加晶体管数量。)
拥有更多可用晶体管还可以让计算机架构师为 ISA 提供更多对软件可见的寄存器,从而潜在地降低内存访问的频率,这种频率往往比寄存器访问慢并且涉及某种程度的间接(例如,向堆栈添加偏移量)指针),这会增加延迟。
集成——它增加了芯片上晶体管的数量,而不是系统中的晶体管数量——减少了通信延迟并增加了带宽,显然可以提高性能。(功耗也会降低,这可能会转化为性能提高。)
即使在指令执行级别,添加晶体管也可以提高性能。例如,进位选择加法器将高位并行添加两次,同时对低位进位的不同假设,当低位进位可用时选择正确的高位之和,显然需要更多的晶体管而不是简单的纹波进位加法器,但减少了产生全和的延迟。类似地,具有单行进位保存加法器的乘法器使用的晶体管比达达(或华莱士)树乘法器更少(但速度更慢),并且不能流水线化(因此必须复制以允许另一个乘法开始执行,而之前的乘法正在进行中)。
以上内容可能会让人筋疲力尽,但并不详尽!