程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了每个核心上是否“存在”AVX/AVX2? AMD 推土机系列,成对的内核共享一个 SIMD/FP 单元(和缓存)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决每个核心上是否“存在”AVX/AVX2? AMD 推土机系列,成对的内核共享一个 SIMD/FP 单元(和缓存)?

开发过程中遇到每个核心上是否“存在”AVX/AVX2? AMD 推土机系列,成对的内核共享一个 SIMD/FP 单元(和缓存)的问题如何解决?下面主要结合日常开发的经验,给出你关于每个核心上是否“存在”AVX/AVX2? AMD 推土机系列,成对的内核共享一个 SIMD/FP 单元(和缓存)的解决方法建议,希望对你解决每个核心上是否“存在”AVX/AVX2? AMD 推土机系列,成对的内核共享一个 SIMD/FP 单元(和缓存)有所启发或帮助;

那么,这个 AVX 的东西 - 它就像每个核心的小型机器?或者它就像一个引擎单元用于整个 cpu?

比如,我可以以某种方式在每个核心上使用它吗?我正在玩它,我觉得我可能会“过度使用”它并造成某种瓶颈。

你能解释一下吗?我是不是都弄错了?

解决方法

现代 CPU 上的 SIMD 指令,如 AVX vmulps ymm1,ymm2,ymm3 或 SSE2 pmaddwd xmm0,xmm1,纯粹在运行该指令的物理内核中执行。 每个物理内核都有自己的执行资源,包括 SIMD/FP 执行单元。(在 CPU 架构中,标量 FP 通常与 SIMD 归为一组。在现代 x86 中,您实际上使用的是 SSE2 或 AVX 指令的标量版本在向量寄存器的低元素上进行标量 FP 数学运算。)

这就是最大 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(浮点数->int 截断)或 {{ 1}}(每个字节的高位的位图)。 https://uops.info/ 和 https://agner.org/optimize/ 有关于性能数据的更多详细信息。

有关 Intel Haswell 中每个执行端口上的执行单元图,请参阅 https://www.realworldtech.com/haswell-cpu/4/。请注意,标量整数乘法器 (vpmovmskb eax,ymm0) 与 imul 位于同一端口上,因此这些指令无法在给定内核的同一时钟周期内开始执行。 (Skylake 在其 2 个 FMA 单元中的任何一个上运行 vaddps)。

有关 CPU 工作原理的更多背景信息,请参阅 Modern Microprocessors A 90-minute Guide!。


AMD 推土机系列,成对的内核共享一个 SIMD/FP 单元(和缓存)

在推土机/打桩机/蒸汽压路机/挖掘机中,每个(弱)整数内核共享一个 SIMD/FP 单元、L1i 缓存和 L2 缓存。这基本上是 SMT(例如 Intel 的超线程)的替代方案,后者在所有内核都忙的情况下具有更高的总吞吐量,但无法像单个更宽的内核一样快地运行单个线程。>

因此,虑到它们之间的紧密耦合,这并不是正常意义上的两个独立内核。但它也不是可以运行两个硬件线程的单个内核。这就像连体双胞胎共享身体的一部分。 https://www.realworldtech.com/bulldozer/2/ 对其进行了更详细的描述。

Bulldozer-family 代表了 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 进行了这种拆分,但自 Core 2 以来就没有这样做了:它们支持的任何 SIMD 扩展的全宽执行单元。)

Bulldozer 上的 SIMD / FP 指令具有更高的延迟(即使对于 vaddps 之类的东西也至少为 2 个周期),但这可能是由于 Bulldozer 的“速度恶魔”方法可以提高时钟频率。在整数和 FP 寄存器之间获取数据的延迟特别糟糕,比如 10 个周期。 (但通常情况下,您不会一直来回弹跳数据,并且在寻址模式中使用整数 regs 进行 FP 加载是可以的。这不是推土机系列 CPU 相对较慢的主要或唯一原因。)


所以它不是pxor xmm0,xmm1 那样必须从所有内核共享的随机源中提取数据,并且与普通指令相比非常慢(例如 Ivy Bridge 上的 200 个周期,更多就像缓存未命中加载一样),因为它必须离核。并且因为它的使用频率不足以证明构建更多硬件以使其更快(例如缓冲每个内核中的随机性)是合理的。 (what is the latency and throughput of the RDRAND instruction on Ivy Bridge? 的回答来自曾在英特尔工作过的 David Johnston)。

,

它可以通过几种不同的方式实现。在大多数现代 CPU 上,它们的每个内核都有 256 位 AVX 实现。

关于它是如何完成的,有很多繁琐的细节。有些人可能会两次执行 128 位进程。其他人在一个周期内完成,但会降低核心频率。在所有情况下,它都会增加核心功率使用和热量输出,因为它做了更多的工作。在超线程对上运行两个 AVX 处理线程可能会以一半的速度运行,因为它们不能共享 AVX 单元。等

如果您正在编写诸如速度和延迟很重要的游戏之类的东西,那么最好的办法就是对其进行衡量。要么在实验室中在许多不同类型的硬件上对其进行基准测试,要么在游戏开始时进行快速基准测试,然后在配置中设置默认值。

也可能存在内存瓶颈。不久前,我设法编写了一些 AVX 代码(只是为了我自己的乐趣),这些代码达到了笔记本电脑的 CPU 内存带宽限制。不过它在 Xeon 上运行没有问题。

,

高级矢量扩展 (AVX) 是指令。每个 CPU 都有不同的硬件来实现它们。据我所知,每个内核都有自己的硬件来处理与这些指令(以及其他指令)相关的所有内容,因此它们之间没有交互。

此外,内存将非常隔离,因为每个内核都将在自己的 L1 和 L2 缓存上工作。第一次交互将发生在 L3 缓存上,这意味着在并行化(多线程软件)之后,您应该会获得性能提升,除非您从一个处理器访问内存的方式开始与另一个处理器的访问发生冲突。

但我的感觉是你在需要之前担心很多。

大佬总结

以上是大佬教程为你收集整理的每个核心上是否“存在”AVX/AVX2? AMD 推土机系列,成对的内核共享一个 SIMD/FP 单元(和缓存)全部内容,希望文章能够帮你解决每个核心上是否“存在”AVX/AVX2? AMD 推土机系列,成对的内核共享一个 SIMD/FP 单元(和缓存)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: