首先,正如Keelan 的评论和Turbo J 的回答所指出的,测量结果是 113,093 Dhrystone MIPS,而不是原生MIPS。
i7 3630QM 的 Ivy Bridge 微架构每个周期只能提交 4 个融合微操作,但它可以开始每个周期执行 6 个微操作。(一条代码中融合的微操作数大致等于指令的数量;一些复杂的指令被解码成多个不融合的微操作,而一些指令对可以融合成一个微操作,例如立即比较然后是条件跳转。)
您关于如何在单个周期内执行多条指令的两个推测非常有效,并且已在实际处理器中使用。您的第一个猜测是使用更快的内部时钟,用于原始 Pentium 4 的“火球”ALU。这些 ALU 的时钟频率是内核其余部分的两倍,这已经相对较高了。
(这是通过使用交错 ALU 实现的,其中加法的下半部分在一个周期中完成,允许相关操作在下一个周期中使用结果的下半部分。对于加法、异或或左移等操作它只需要操作数的下半部分来产生完整的下半部分结果,这种交错(也称为宽度流水线)允许单周期结果延迟和单周期吞吐量。)
HyperSPARC 使用了一种相关的技术,即级联 ALU。HyperSPARC 将两个 ALU 的结果输入第三个 ALU。这允许在单个周期中执行两个独立的和第三个相关的操作。
您对“每个核心有多个并发管道”的推测是另一种已使用的技术。这种类型的设计称为超标量,是迄今为止增加在单个周期中执行的操作数量的最常用方法。
还有一些其他的指令执行可能值得注意。一些操作可以在普通执行单元之外更有效地执行。移动消除技术利用乱序处理器中的寄存器重命名来在寄存器重命名期间执行移动操作;移动只是将物理寄存器编号从重命名表(称为寄存器别名表)中的一个位置复制到另一个位置。这不仅有效地增加了执行宽度,而且还消除了依赖性。该技术早期用于基于堆栈的 x87,但现在广泛用于英特尔的高性能 x86 处理器。(在 x86 中使用破坏性的双操作数指令使得移动消除比在典型的 RISC 中更有帮助。)
一种类似于移动消除的技术是在重命名期间处理寄存器归零指令。通过提供提供零值的寄存器名称,寄存器清除指令(如 xor 或减法,两个操作数是相同的寄存器)可以简单地将该名称插入重命名表 (RAT)。
一些 x86 处理器使用的另一种技术降低了推送和弹出操作的成本。通常,使用堆栈指针的指令必须等待一个完整的周期以等待先前的推送或弹出来更新堆栈指针的值。通过认识到 push 和 pop 仅向堆栈指针添加或减去一个小值,可以并行计算多个加法/减法的结果。加法的主要延迟是进位传播,但是对于较小的值,基值的更高有效位(在本例中为堆栈指针)将最多只有一个进位。这允许将类似于进位选择加法器的优化应用于小值的多次加法。此外,由于堆栈指针通常仅由常量更新,
也可以将指令合并成一个更复杂的操作。虽然将指令拆分为多个更简单的操作的反向过程是一项古老的技术,但合并指令(英特尔将其称为宏操作融合)可以允许实现支持比指令集中公开的操作更复杂的操作。
在理论方面,已经提出了其他技术。RAT 可以支持除零以外的小常数,并且可以及早处理一些使用或可靠产生如此小的值的简单操作。(“Physical Register Inlining”,Mikko H. Lipasti 等人,2004 年,建议使用 RAT 作为减少寄存器数量的一种手段,但这个想法可以扩展到支持加载小的立即数和对小数的简单操作。)
对于跟踪缓存(在特定的控制流假设下存储指令序列),可能有机会合并由分支分隔的操作并删除在跟踪中产生未使用结果的操作。跟踪缓存中的优化缓存还可以鼓励执行优化,例如指令合并,如果每次提取指令流时都必须完成这些优化,则可能不值得。
值预测可用于通过消除依赖关系来增加可以并行执行的操作数量。基于步幅的值预测器类似于前面提到的专用堆栈引擎的弹出/推送优化。它可以大部分并行计算多个加法,消除序列化。值预测的一般思想是,有了预测值,相关操作就可以毫无延迟地进行。(分支方向和目标预测实际上只是一种非常有限的值预测形式,允许获取依赖于分支的“值”(是否采用)和下一条指令地址的后续指令,另一个值。)