英特尔的哈斯威尔 CPU 微架构

内容

页面: 1 2 3 4 5 6

哈斯威尔指令集与前端

Haswell 引入了大量新的 x86 ISA 指令,这些指令分为四个一般类别。第一个是 AVX2,它将整数 SIMD 指令从 SSE 的 128 位宽提升到 256 位宽。原始的 AVX 是一个使用 YMM 寄存器的 256 位扩展,但主要用于浮点指令。AVX2 是其补充,将整数 SIMD 扩展到完整的 YMM 寄存器,并对 128 位操作进行了某些增强。AVX2 还增加了更强大和通用的向量置换和移位支持。也许更重要的是,AVX2 包含 16 条新的聚合指令,这些加载可以使用特殊的向量寻址获取 4 或 8 个不连续的数据元素,适用于整数和浮点 (FP) SIMD。聚合对于更广泛的 SIMD 至关重要,并大大简化了向量化代码。请注意,AVX2 不包括散布指令(即,向量寻址存储),因为与 x86 内存排序模型和加载/存储缓冲区的复杂性有关。

虽然 AVX2 强调整数 SIMD,但 Haswell 对浮点代码有巨大的好处。除了 gather,英特尔的融合乘加 (FMA) 包含 36 个 FP 指令用于执行 256 位计算和 60 个指令用于 128 位向量。正如在 2008 年初宣布的,英特尔的 FMA 最初是为 4 操作数指令架构的。然而,22nm 的 Ivy Bridge 可以通过寄存器重命名技巧在前端执行寄存器移动指令,而无需发出任何 uops。英特尔的架构师确定,使用 FMA3 消除 MOV 提供的性能大约与 FMA4 相同,但使用更密集且更易解码的指令;因此在 2008 年底的突然转变。

第三个扩展是15条标量位操作指令(称为BMI),它们在通用整数寄存器上操作。这些指令分为三个主要领域:位域操作,如插入、移位和提取;位计数,如前导零计数;以及任意精度整数乘法和旋转。后者对于密码学特别有用。顺便提一下,Haswell还增加了一条大端移动指令(MOVBE),可以在传统的x86小端格式和大端格式之间转换。MOVBE是为英特尔的Atom引入的,对于处理存储和网络的嵌入式应用程序非常有用,因为TCP/IP是大端格式。

英特尔的ISA扩展中最后也是最强大的就是TSX,这在之前关于Haswell的事务性内存的文章中有过广泛讨论。简而言之,TSX使程序员能够编写并行代码,专注于使用同步来确保正确性,而硬件则优化执行以提高性能和并发性。硬件锁消除(HLE)透明地提供了细粒度锁定的性能和吞吐量,即使程序员使用粗粒度锁定。最重要的是,提示前缀与旧处理器兼容。

受限事务内存(RTM)是一个全新的程序员接口,为x86开发者提供事务内存。事务内存比传统的基于锁的同步更有用,因为事务可以保护更复杂的数据结构,并且可以跨函数、模块甚至应用程序进行组合。然而,它确实需要使用RTM链接新的库,并可能需要重写软件以获得全部好处。

TSX的两个变体以64B缓存行粒度进行跟踪。由于事务限制、虚假共享或数据竞争导致的过度冲突实际上会损害性能,因此开发人员必须谨慎采用TSX。然而,未来的实现很可能会减少冲突并更加灵活。

在这些新指令中,绝大多数是简单指令,可以解码为单个微操作(uop)。然而,更复杂的指令,如收集(gather)和TSX提交(commit)与中止(abort),则是微编码的。

从根本上讲,x86在多个维度上与RISC架构非常相似。ALU操作基本相同;进行加法、减法和乘法的方式有限。然而,前端却截然不同,这是现代x86 CPU最具挑战性的方面之一。指令缓存与数据缓存保持一致,变长指令使得解码变得相当复杂。x86指令的大小范围从1到15字节,具有长度变化的前缀、不一致的操作数位置和复杂的微编码指令。自P6以来,这些指令已被转化为更易处理的固定长度uops,可以被乱序核心跟踪。与所有架构一样,指令流经常被控制流中断,例如条件分支、跳转、调用和返回,这可能会重定向指令获取并在流水线中引入气泡。

Sandy Bridge 在前端改进和确保 uops 平稳传递到管道其余部分方面取得了巨大的进展。最大的改进是一个 uop 缓存,它本质上充当 L0 指令缓存,但包含固定长度的解码 uops。uop 缓存是虚拟寻址的,并包含在 L1 指令缓存中。在 uop 缓存命中的情况下,有几个好处,包括通过消除耗电的指令解码阶段来减少管道长度,并实现每个周期 32B 指令的有效吞吐量。对于较新的 SIMD 指令,16B 的提取限制是一个问题,因此 uop 缓存与 AVX 等扩展很好地协同工作。

Haswell and Sandy Bridge Front-end

图 1. Haswell 和 Sandy Bridge 前端

Haswell 前端最显著的区别无疑是对上述各种指令集扩展的支持。从高层次来看,指令获取和解码微架构在很大程度上与 Sandy Bridge 相似,如图 1 所示。虽然有一些细微的增强,但概念和许多细节是相同的。

如预期,Haswell 的分支预测有所改善。不幸的是,英特尔不愿意分享这些优化的细节或结果。指令缓存仍然是 8 路关联,32KB,并由两个线程动态共享。指令 TLB 也没有变化,具有 128 个条目用于 4KB 页转换;4KB 转换在两个线程之间静态分区,并且是 4 路关联。2MB 页数组有 8 个条目,完全关联,并为每个线程复制。指令从指令缓存中提取的速度仍然是每个周期 16B。提取的指令被存放到一个 20 条目的指令队列中,该队列为每个线程复制,在 Sandy Bridge 和 Haswell 中都是如此。

Haswell 指令缓存经过优化,以更快地处理未命中。支持更好的时序的推测 ITLB 和缓存访问,以提高预取的好处,并且缓存控制器在并行处理指令缓存未命中方面更加高效。

与之前的几代一样,解码由一个复杂的解码器执行,该解码器发出1-4个融合的uop,以及三个简单的解码器,它们并行发出一个融合的uop。或者,要求超过4个uop的指令由微代码处理,并阻塞常规解码器。宏融合可以将相邻的比较和分支指令合并为一个单一的uop,从而提高每个周期5条指令的潜在吞吐量。解码还包含堆栈引擎,它解决了push/pop和call/return对,而无需将uop进一步发送到流水线。

Haswell 的 uop 缓存与 Sandy Bridge 的大小和组织相同。uop 缓存行最多可以容纳 6 个 uop,缓存组织为 32 组 8 行缓存(即 8 路关联)。一个 32B 的提取 x86 指令窗口可以映射到单一路径中的 3 行。uop 缓存的命中可以提供 4 uop/周期,而这 4 个 uop 可以对应 32B 的指令,而传统的前端每周期不能处理超过 16B。为了提高性能,uop 缓存可以将微编码指令作为指向微代码的指针,但不支持部分命中。与指令缓存一样,解码的 uop 缓存由活动线程共享。

Haswell 解码路径的一个区别是 uop 队列,它接收来自解码器或 uop 缓存的 uops,并且还充当循环缓存。在 Sandy Bridge 中,28 个条目的 uop 队列为每个线程复制。然而,在 Ivy Bridge 中,uop 队列合并为一个单一的 56 个条目的结构,当两个线程处于活动状态时,该结构是静态分区的。区别在于,当单个线程在 Ivy Bridge 或 Haswell 上执行时,整个 56 个条目的 uop 缓冲区可用于循环缓存和排队,更好地利用可用资源。

页面: « 上一页   1 2 3 4 5 6   下一页 »

总结
Haswell架构引入了大量新的x86指令集扩展,主要包括四个家族:AVX2、FMA、BMI和TSX。AVX2扩展了整数SIMD指令,支持256位操作,并引入了16个新的聚合指令,简化了向量化代码。FMA则提供了36个浮点指令,提升了浮点计算性能。BMI包含15个标量位操作指令,适用于加密等应用。TSX则为程序员提供了事务性内存接口,优化并发性能。Haswell的前端架构与Sandy Bridge相似,但在指令集扩展支持、分支预测和指令缓存处理上有所改进。Haswell的uop缓存与Sandy Bridge相同,但在解码路径上进行了优化,提升了指令处理效率。整体来看,Haswell在性能和并发处理能力上有显著提升,适应了现代计算需求。