Nehalem 能够执行 4 DP 或 8 SP FLOP/cycle。这是使用 SSE 完成的,它对打包的浮点值、DP 中的 2/寄存器和 SP 中的 4/寄存器进行操作。为了实现 4 DP FLOP/cycle 或 8 SP FLOP/cycle,内核必须在每个周期执行 2 个 SSE 指令。这是通过在每个周期执行一个 MULDP 和一个 ADDDP(或一个 MULSP 和一个 ADDSP)来完成的。这是可能的原因是因为 Nehalem 为 SSE 乘法和 SSE 加法具有单独的执行单元,并且这些单元是流水线的,因此throughput
每个周期是一个乘法和一个加法。乘法器流水线中的乘法器在 SP 中为 4 个周期,在 DP 中为 5 个周期。添加在流水线中持续 3 个周期,与 SP/DP 无关。流水线中的周期数称为latency
. 要计算峰值 FLOP/cycle,您只需要知道吞吐量。因此,乘法器和加法器(2 个执行单元)的吞吐量均为 1 个 SSE 向量指令/周期,DP 中有 2 x 2 = 4 FLOP/周期,SP 中有 2 x 4 = 8 FLOP/周期。为了实际维持这个峰值吞吐量,您需要考虑延迟(因此您在管道中至少有与管道深度一样多的独立操作)并且您需要考虑能够足够快地提供数据。Nehalem 有一个集成的内存控制器,能够从内存中获得非常高的带宽,如果数据预取器正确地预测数据的访问模式(从内存中顺序加载是它可以预测的一个微不足道的模式),它就可以实现这一目标。通常没有'
以下是有关在何处可以找到有关独立执行单元数量及其吞吐量和周期延迟的信息的详细信息。
参见第 105 页8.9本文档的执行单元
http://www.agner.org/optimize/microarchitecture.pdf
它说对于尼哈勒姆
端口 0 上的浮点乘法器对于单精度的延迟为 4,对于双精度和长双精度的延迟为 5。浮点乘法器的吞吐量是每个时钟周期 1 次运算,Core2 上的长双精度除外。浮点加法器连接到端口 1。它的延迟为 3,并且是完全流水线的。
为了获得 8 SP FLOP/cycle,您需要 4 SP ADD/cycle 和 4 SP MUL/cycle。加法器和乘法器位于不同的执行单元上,并从不同的端口分派,每个都可以使用 SSE 压缩(向量)指令(4x32 位 = 128 位)同时在 4 个 SP 压缩操作数上执行。两者都具有每个时钟周期 1 次操作的吞吐量。为了获得该吞吐量,您需要考虑延迟......指令发出后多少个周期才能使用结果......所以您必须发出几个独立的指令来覆盖延迟。单精度乘法器的延迟为 4,加法器为 3。
您可以在英特尔优化指南表 C-15a 中找到 Nehalem 的这些相同吞吐量和延迟数字
http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-optimization-manual.html