每个核心上是否“存在”AVX/AVX2?
那么,这个 AVX 的东西 - 它就像每个核心的小型机器?或者它就像整个 CPU 的一个引擎单元?
比如,我可以以某种方式在每个核心上使用它吗?我正在玩它,我觉得我可能会“过度使用”它并造成某种瓶颈。
你能解释一下吗?我都弄错了吗?
回答
现代 CPU 上的 SIMD 指令,如 AVXvmulps ymm1, ymm2, ymm3或 SSE2 pmaddwd xmm0, xmm1,纯粹在运行该指令的物理核心内执行。 每个物理内核都有自己的执行资源,包括 SIMD/FP 执行单元。 (在 CPU 架构中,标量 FP 通常与 SIMD 分组。在现代 x86 中,您实际上在向量寄存器的低元素上使用标量版本的 SSE2 或 AVX 指令来进行标量 FP 数学。)
这就是最大 FLOP/s 随内核数量而变化的原因:对于 Sandy-bridge 和 haswell SSE2/AVX/AVX2,每个周期的 FLOPS
(甚至每个内核都不止一个“AVX 单元”,例如 Haswell 和 Zen2 内核都有两个 256 位宽的 FMA 单元,并且可以在更多端口上运行按位布尔向量指令,以获得更高的每时钟吞吐量指示。)
CPU 处理 SIMD 指令(几乎)与整数指令(如add eax, ecx. 这(以及其他原因)就是为什么 x86 CPU 可以有效地在整数和 FP 寄存器之间获取数据,延迟非常低,对于像cvttss2si eax, xmm0(float->int with truncation) 或vpmovmskb eax, ymm0(bitmap of the high bit of the每个字节)。 https://uops.info/和https://agner.org/optimize/有关于性能数据的更多细节。
请参阅https://www.realworldtech.com/haswell-cpu/4/,了解英特尔 Haswell 中每个执行端口上的执行单元图。请注意,标量整数乘法器 ( imul) 与 位于同一端口上vaddps,因此这些指令不能在给定内核的同一时钟周期内开始执行。(Skylake 在其 2 个 FMA 单元中的任何一个上运行 vaddps)。
有关 CPU 工作原理的更多背景信息,请参阅现代微处理器 90 分钟指南!.
AMD 推土机系列,成对的内核共享一个 SIMD/FP 单元(和缓存)
在推土机/打桩机/蒸汽压路机/挖掘机中,每对(弱)整数核心共享一个 SIMD/FP 单元、L1i 缓存和 L2 缓存。这基本上是SMT(例如 Intel 的超线程)的替代方案,它在所有内核都忙的情况下具有更高的总吞吐量,但无法像单个更宽的内核一样快地运行单个线程。
因此,考虑到它们之间的紧密耦合,这并不是正常意义上的两个独立内核。但它也不是可以运行两个硬件线程的单个内核。这就像连体双胞胎共享身体的一部分。 https://www.realworldtech.com/bullldozer/2/对其进行了更详细的描述。
Bulldozer 系列代表了 CPU 架构中的许多实验,其中许多被证明是不成功的。(就像具有小型 4k 写入组合缓冲区的直写 L1d 缓存一样)。AMD Zen 使用了更传统的设计,很像 Intel 的设计:完全独立的宽核与 SMT,以允许高单线程性能和以良好的总吞吐量运行大量线程。和更传统的缓存层次结构,带有普通的回写 L1d 缓存。Zen 保留了 AMD 将 SIMD/FP 与管道的标量整数部分分开,这与英特尔更统一的调度程序和执行端口不同。Zen1 甚至保留了 AMD 惯用的将 256 位指令拆分为 2 个 uop 的技术,直到 Zen 2 扩展了执行单元。(英特尔已经在 Pentium III 和 Pentium-M 等早期 CPU 上为 SSE 进行了这种拆分,但还没有
Bulldozer 上的 SIMD / FP 指令具有更高的延迟(即使对于像这样的东西pxor xmm0,xmm1也至少为 2 个周期),但这可能是由于 Bulldozer 的“速度恶魔”方法可以提高时钟频率。在整数和 FP 寄存器之间获取数据的延迟特别糟糕,比如 10 个周期。(但通常您不会一直来回弹跳数据,并且在寻址模式中使用整数 regs 进行 FP 加载是可以的。这不是推土机系列 CPU 相对较慢的主要或唯一原因。)
因此,它不是像rdrand eax它必须由所有内核共享的随机性源提取数据,并很慢比正常的指令(如200次循环的Ivy Bridge的,更像是一个高速缓存未命中负载),因为它已去非核心. 并且因为它的使用频率不足以证明构建更多硬件以使其更快(例如缓冲每个内核中的随机性)是合理的。(常春藤桥上 RDRAND 指令的延迟和吞吐量是多少?有大卫约翰斯顿的回答,他在英特尔工作)。