现代 CPU 上的 SIMD 指令(如 AVX vmulps ymm1, ymm2, ymm3 或 SSE2 pmaddwd xmm0, xmm1)纯粹在运行该指令的物理内核中执行。 每个物理内核都有自己的执行资源,包括 SIMD/FP 执行单元。(在 CPU 架构中,标量 FP 通常与 SIMD 组合在一起。在现代 x86 中,您实际上使用的是 SSE2 或 AVX 指令的标量版本在向量寄存器的低元素上做标量 FP 数学。)
这就是为什么 max FLOP/s 会随着内核数量的增加而变化:FLOPS per cycle for sandy-bridge and haswell SSE2/AVX/AVX2
(即使每个内核也不仅仅是一个“AVX 单元”,例如 Haswell 和 Zen2 内核都具有两个 256 位宽的 FMA 单元,并且可以在更多端口上运行按位布尔向量指令以实现更高的每时钟这些指令的吞吐量。)
CPU 处理 SIMD 指令(几乎)与处理整数指令(例如 add eax, ecx)完全一样。这(以及其他原因)是 x86 CPU 可以在整数和 FP 寄存器之间以相当低的延迟有效获取数据的原因,对于像 cvttss2si eax, xmm0(float->int with truncation)或 vpmovmskb eax, ymm0(每个字节的高位的位图)。 https://uops.info/ 和 https://agner.org/optimize/ 有更多关于性能数据的详细信息。
有关英特尔 Haswell 中每个执行端口上的执行单元的图表,请参阅 https://www.realworldtech.com/haswell-cpu/4/。请注意,标量整数乘法器 (imul) 与 vaddps 在同一端口上,因此这些指令不能在给定内核上的相同时钟周期内开始执行。 (Skylake 在其 2 个 FMA 单元中的任何一个上运行 vaddps)。
有关 CPU 工作原理的更多背景信息,请参阅Modern Microprocessors
A 90-Minute Guide!。
AMD Bulldozer 系列,内核对共享一个 SIMD/FP 单元(和缓存)
在 Bulldozer/Piledriver/Steamroller/Excavator 中,每 对(弱)整数内核共享一个 SIMD/FP 单元、L1i 缓存和 L2 缓存。这基本上是SMT 的替代方案(例如英特尔的超线程),它在所有内核繁忙的情况下具有更高的总吞吐量,但无法像单个更宽的内核那样快速运行单个线程。
因此,考虑到它们的紧密耦合程度,这并不是通常意义上的两个独立内核。但它也不是一个可以运行两个硬件线程的内核。这就像连体双胞胎共享身体的一部分。 https://www.realworldtech.com/bulldozer/2/ 更详细地描述了它。
Bulldozer 系列代表了 CPU 架构中的许多实验,其中许多实验被证明是不成功的。 (就像具有小型 4k 写入组合缓冲区的直写 L1d 缓存)。 AMD Zen 使用了一种更传统的设计,很像英特尔的:完全分离的宽核和 SMT,以实现高单线程性能和运行大量线程并具有良好的聚合吞吐量。以及具有普通回写式 L1d 缓存的更传统的缓存层次结构。 Zen 保持 AMD 的 SIMD/FP 与管道的标量整数部分的分离,这与英特尔更统一的调度程序和执行端口不同。 Zen1 甚至保留了 AMD 将 256 位指令拆分为 2 个微指令的惯用技术,直到 Zen 2 扩大了执行单元。 (英特尔已经在 Pentium III 和 Pentium-M 等早期 CPU 上对 SSE 进行了这种拆分,但自 Core 2 以来就没有这样做过:它们支持的任何 SIMD 扩展的全宽执行单元。)
Bulldozer 上的 SIMD / FP 指令具有更高的延迟(即使对于 pxor xmm0,xmm1 之类的东西,最少也需要 2 个周期),但这可能是由于 Bulldozer 的“速度恶魔”方法导致的时钟更高。在整数和 FP 寄存器之间获取数据的延迟尤其糟糕,比如 10 个周期。 (但通常您不会一直来回弹跳数据,并且在寻址模式中使用整数 reg 来进行 FP 加载很好。这不是 Bulldozer 系列 CPU 相对较慢的主要原因或唯一原因。)
所以它不像rdrand eax 必须从所有内核共享的随机源中提取数据,并且与普通指令相比非常慢(如 Ivy Bridge 上的 200 个周期,更像是缓存未命中负载),因为它必须脱离核心。而且因为它的使用频率不足以证明构建更多硬件以使其更快(例如缓冲每个内核中的随机性)是合理的。 (What is the latency and throughput of the RDRAND instruction on Ivy Bridge? 得到了来自英特尔的 David Johnston 的回答)。