频率影响取决于指令的宽度和使用的指令。
共有三个频率级别,即所谓的许可证,从最快到最慢:L0、L1 和 L2。 L0 是您在包装盒上看到的“标称”速度:当芯片显示“3.5 GHz turbo”时,它们指的是单核 L0 turbo。 L1 是一种较低的速度,有时称为 AVX turbo 或 AVX2 turbo5,最初与 AVX 和 AVX2 指令相关1 . L2 的速度低于 L1,有时称为“AVX-512 turbo”。
每个许可证的确切速度还取决于活动内核的数量。对于最新的表格,您通常可以咨询WikiChip。例如,Xeon Gold 5120 的表是here:
Normal、AVX2 和 AVX512 行分别对应于 L0、L1 和 L2 许可证。请注意,随着内核数量的增加,L1 和 L2 许可证的相对减速通常会变得更糟:对于 1 或 2 个活动内核,L1 和 L2 速度是 L0 的 97% 和 91%,但对于 13 或 14 个内核,它们是 85%和 62%。这因芯片而异,但总体趋势通常是相同的。
先不做这些准备工作,让我们来看看我认为您要问的问题:哪些指令会导致激活哪些许可证?
这是一个表格,显示了基于宽度和分类为light或heavy的指令的隐含许可:
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 中运行,具体取决于它们是 light 还是 heavy,而 512 位指令将在 L1 或 L2 中运行相同的基础。
那么这个轻而重的东西是什么?
轻与重
从解释繁重的指令开始是最简单的。
Heavy指令都是需要在FP/FMA单元上运行的SIMD指令。基本上这是大部分的 FP 指令(通常以 ps 或 pd 结尾,如 addpd)以及主要以 vpmul 或 vpmad 开头的 integer 乘法指令因为 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 和整数乘法指令属于 heavy 类别,因此实际上很多整数 512 位宽的使用只会产生 L1 许可证.
1 虽然,正如我们将看到的,这有点用词不当,因为 AVX-512 指令可以设置此许可证的速度,而某些 AVX/2 指令则不能。
2 128 位宽意味着使用 xmm 寄存器,无论它们是在什么指令集中引入的 - 主流 AVX-512 包含适用于大多数/所有的 128 位变体新指令。
3 注意 weasel 条款 与许可证相关 - 您当然可能会遭受其他降频原因,例如热、功率或电流限制,并且可能是 128-位指令可能会触发这种情况,但我认为这在台式机或服务器系统上不太可能(低功耗、小型设备是另一回事)。
4 显然,我们只讨论到更高级别许可证的转换,例如,当硬转换 L1 指令执行时,从 L0 到 L1。如果您已经在 L1 或 L2 什么都不会发生 - 如果您已经在同一级别,并且您不会根据任何特定指令转换到较低编号的级别,而是在没有任何指令的情况下运行一段时间,则不会发生任何转换编号较高的级别。
5 在这两个 AVX2 turbo 中比较常见,我从来没有真正理解过,因为 256 位指令与 AVX 的相关性与 AVX2 一样多,并且大多数实际触发 AVX turbo(L1 许可证)的 重 指令实际上是 AVX 中的 FP 指令,而不是 AVX2。唯一的例外是 AVX2 整数乘法。