optimization - SIMD 指令降低 CPU 频率

标签 optimization x86 intel compiler-optimization avx512

我读了这个 article .它谈到了为什么AVX-512指令:

Intel’s latest processors have advanced instructions (AVX-512) that may cause the core, or maybe the rest of the CPU to run slower because of how much power they use.



我想在 Agner's blog还提到了类似的东西(但我找不到确切的帖子)。

我想知道 Skylake 支持的其他指令还有哪些类似的效果,它们会降低功率以在以后最大化吞吐量?所有 v 前缀指令(例如 vmovapdvmulpdvaddpdvsubpdvfmadd213pd )?

我正在尝试编译一个指令列表,以避免在为 Xeon Skylake 编译我的 C++ 应用程序时。

最佳答案

频率影响取决于指令的宽度使用的指令。

共有三个频率级别,即所谓的许可证,从最快到最慢:L0、L1 和 L2。 L0 是您会在包装盒上看到的“标称”速度:当芯片显示“3.5​​ GHz turbo”时,它们指的是单核 L0 turbo。 L1 是较低的速度,有时称为 AVX turbo 或 AVX2 turbo5,最初与 AVX 和 AVX2 指令相关联。 L2 的速度低于 L1,有时称为“AVX-512 涡轮增压”。

每个许可证的确切速度还取决于事件内核的数量。最新的表格,通常可以咨询WikiChip .例如,Xeon Gold 5120 的表是 here :

Xeon Gold 5120 Frequencies

Normal、AVX2 和 AVX512 行分别对应 L0、L1 和 L2 许可证。请注意,随着内核数量的增加,L1 和 L2 许可证的相对减速通常会变得更糟:对于 1 或 2 个事件内核,L1 和 L2 速度分别是 L0 的 97% 和 91%,但对于 13 或 14 个内核,它们是 85%和 62%。这因芯片而异,但总体趋势通常是相同的。

那些预备工作,让我们来看看我认为你在问什么:哪些指令会导致哪些许可证被激活?

这是一个表格,显示了基于指令宽度和轻重分类的隐含许可:

   Width    Light   Heavy  
 --------- ------- ------- 
  Scalar    L0      N/A
  128-bit   L0      L0     
  256-bit   L0      L1*    
  512-bit   L1      L2*

*soft transition (see below)

因此,我们立即看到所有标量(非 SIMD)指令和所有 128 位宽指令 2 在 L0 许可证中始终全速运行。

256 位指令会在 L0 或 L1 中运行,这取决于它们是轻还是重,而 512 位指令将在相同的基础上运行在 L1 或 L2。

那么这个轻重的东西是什么呢?

轻与重

从解释繁重的指令开始是最容易的。

重指令都是需要在FP/FMA上运行的SIMD指令单元。基本上,这是大多数 FP 指令(通常以 pspd 结尾的指令,例如 addpd )以及主要以 vpmul 开头的整数乘法指​​令或 vpmad因为 SIMD 整数乘法实际上在 SIMD 单元上运行,以及 vplzcnt(q|d)它显然也在 FMA 单元上运行。

鉴于此,简单的指令就是一切。尤其是除乘法之外的整数运算、逻辑指令、混洗/混合(包括 FP)和 SIMD 加载和存储是轻量级的。

过渡

Heavy 列中的 L1 和 L2 条目用星号标记,例如 L1* .这是因为这些指令在发生时会导致软转换。另一个 L1 条目(用于 512 位轻型指令)导致硬转换。在这里,我们将讨论这两种转换类型。

硬过渡

只要具有给定许可证的任何指令执行,就会立即发生硬转换4。 CPU 停止,需要一些时间 halt cycles并进入新模式。

软过渡

与硬转换不同,软转换不会在任何指令执行后立即发生。相反,指令最初以降低的吞吐量(低至正常速率的 1/4)执行,而不会改变频率。如果 CPU 决定每单位时间执行“足够”的繁重指令,并且达到特定阈值,则会转换到编号较高的许可证。

也就是说,CPU 明白如果只有少数重指令到达,或者即使许多到达但在考虑其他非重指令时它们并不密集,那么降低频率可能不值得。

指南

鉴于上述情况,我们可以制定一些合理的指导方针。您永远不必害怕 128 位指令,因为它们永远不会导致与许可证相关的 3 降频。

此外,您也不必担心 256 位宽指令,因为它们也不会导致降频。如果您不使用大量矢量化 FP 数学,则不太可能使用繁重的指令,因此这适用于您。实际上,当您使用适当的 -march 时,编译器已经大量插入 256 位指令。选项,特别是对于数据移动和自动矢量化循环。

使用重 AVX/AVX2 指令和轻 AVX-512 指令比较棘手,因为您将在 L1 许可证中运行。如果只有一小部分流程(比如 10%)可以利用,那么减慢应用程序的其余部分可能不值得。与 L1 相关的处罚通常是适中的 - 但请检查您的筹码的详细信息。

使用繁重的 AVX-512 指令甚至更棘手,因为 L2 许可证在大多数芯片上都带有严重的频率损失。另一方面,重要的是要注意只有 FP 和整数乘法指​​令属于重类别,因此实际上,许多整数 512 位宽的使用只会招致 L1 许可证。

1 虽然,正如我们将看到的,这有点用词不当,因为 AVX-512 指令可以将速度设置为此许可证,而某些 AVX/2 指令则不能。

2 128 位宽意味着使用 xmm 寄存器,无论它们是在什么指令集中引入的 - 主流 AVX-512 包含大多数/所有新指令的 128 位变体。

3 请注意与鼬鼠条款许可证相关的 - 您当然可能会遭受其他降频原因,例如热量、功率或电流限制,并且 128 位指令可能会触发此情况,但我认为在台式机或服务器系统(低功耗、小尺寸设备是另一回事)。

4 显然,我们讨论的只是转换到更高级别的许可证,例如,当硬转换 L1 指令执行时,从 L0 到 L1。如果您已经在 L1 或 L2 中,则不会发生任何事情 - 如果您已经处于同一级别并且您不会根据任何特定指令过渡到较低编号的级别,而是在没有任何指令的情况下运行一段时间,则不会发生任何转换编号较高的级别。

5 在这两个 AVX2 turbo 中更常见,我从来没有真正理解过,因为与 AVX2 相比,256 位指令与 AVX 的相关性一样多,而且大多数实际触发 AVX turbo(L1 许可证)的重指令实际上是 FP AVX 中的指令,而不是 AVX2。唯一的异常(exception)是 AVX2 整数乘法。

关于optimization - SIMD 指令降低 CPU 频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56852812/

相关文章:

javascript - 针对给定问题的替代和优化解决方案

mysql对大表的优化

assembly - 如何禁用一条指令的中断?

linux - x86 程序集从文件读取字节到堆栈但 gdb 找不到字节

x86 - 使用 Intel Last Branch Record 的开销是多少?

c# - 我可以避免这种代码复制粘贴吗?

javascript - JavaScript 声明问题

assembly x86 四元数到欧拉角输出顺序错误

ubuntu - 英特尔 vaapi 错误 : can't connect to X server

intel - 天空盒渲染的 VkRenderPass 加载操作存在问题