HCS*_*CSF 12 optimization x86 intel compiler-optimization avx512
我读了这篇文章。它谈到了为什么AVX-512指令:
英特尔最新的处理器具有高级指令(AVX-512),这可能会导致内核或其他CPU的运行速度变慢,这是因为它们使用了多少电量。
我认为在Agner的博客上也提到了类似的内容(但我找不到确切的帖子)。
我想知道Skylake支持的其他哪些指令会产生类似的效果,即它们会降低功耗以在以后最大化吞吐量吗?所有前缀v指令(如vmovapd,vmulpd,vaddpd,vsubpd,vfmadd213pd)?
我正在尝试编译说明列表,以避免在为Xeon Skylake编译C ++应用程序时避免。
Bee*_*ope 11
频率影响取决于指令的宽度和所使用的指令。
从最快到最慢,共有三个频率级别,即所谓的许可证:L0,L1和L2。L0是您在包装盒上看到的“标称”速度:当芯片显示“ 3.5 GHz Turbo”时,它们指的是单核L0 turbo。L1是较低速度,有时称为AVX Turbo或AVX2 turbo 5,最初与AVX和AVX2指令1相关联。L2的速度低于L1,有时也称为“ AVX-512涡轮”。
每个许可证的确切速度还取决于活动内核的数量。对于最新表,通常可以咨询WikiChip。例如,对于至强5120金表是在这里:
普通,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)
Run Code Online (Sandbox Code Playgroud)
因此,我们立即看到所有标量(非SIMD)指令和所有128位宽指令2在L0许可证中始终以全速运行。
256位指令将在L0或L1中运行,具体取决于它们是轻还是重,而512位指令将在相同的基础上在L1或L2中运行。
那么,这又轻又重的东西是什么?
从解释繁重的说明开始是最容易的。
重载指令是需要在FP / FMA单元上运行的所有SIMD指令。基本上这是大多数人的FP指令(那些通常在结束ps或pd,等addpd)以及整数乘法指令,其主要与启动vpmul或vpmad自SIMD整数乘法实际上SIMD单元上运行,以及vplzcnt(q|d)其中显然也运行FMA单元上。
鉴于此,简单的说明就是其他所有内容。特别是,除乘法,逻辑指令,混洗/混和(包括FP)以及SIMD加载和存储以外的整数算术都很轻便。
重列中的L1和L2条目标有星号,例如L1*。这是因为这些指令在发生时会引起软过渡。另一个L1条目(用于512位光指令)导致硬转换。在这里,我们将讨论两种过渡类型。
只要具有给定许可证的任何指令执行4,就会立即发生硬过渡。CPU停止,经过一些暂停周期后进入新模式。
与硬转换不同,软转换不会在执行任何指令后立即发生。相反,指令最初执行时的吞吐量降低了(仅为正常速率的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请注意与weasel条款许可相关的内容 -您肯定会遭受其他降频原因,例如热量,功率或电流限制,并且128位指令可能会触发这种情况,但我认为在台式机或台式机上不太可能服务器系统(低功耗,小型设备是另一回事)。
4显然,我们只在谈论执行硬转换L1指令时从更高级别的许可证(例如,从L0到L1)的过渡。如果您已经在L1或L2中,则什么都不会发生-如果您已经处于同一级别,并且您不会根据任何特定指令转换到编号较低的级别,而是在没有任何指令的情况下运行一定时间,则不会进行转换较高级别的级别。
5在两个AVX2 Turbo中更常见,我从未真正理解过,因为与AVX2相比,与AVX关联的256位指令与AVX的关联程度高,并且实际上触发AVX Turbo(L1许可证)的大多数繁重指令实际上是FP AVX,而不是AVX2中的说明。唯一的例外是AVX2整数乘法。
这不是指令助记符的事项,它的512位向量宽度在所有的事项。
您可以使用256位版本的AVX-512VL指令,例如,vpternlogd ymm0, ymm1, ymm2不会产生AVX-512 Turbo损失。
相关:动态确定流氓AVX-512指令在哪里执行是与以下情况有关的:glibc初始化代码中的一条AVX-512指令或某些脏污的上部ZMM留下了剩余的进程生命周期的最大Turbo。(或者直到一个vzeroupper可能)
虽然轻/大量使用256位FP数学指令可能还会产生其他涡轮冲击,其中一些是由于热量引起的。但是通常在现代CPU上256位是值得的。
无论如何,这就是为什么gcc -march=skylake-avx512默认设置为-mprefer-vector-width=256。对于任何给定的工作负载,都值得尝试-mprefer-vector-width=512,也许还需要128,这取决于可以有效地自动矢量化的工作量。
告诉GCC调整您的CPU(例如-march=native),希望它将做出不错的选择。尽管在台式机Skylake-X上,turbo损失小于Xeon。而且,如果您的代码确实确实受益于512位向量化,那么值得付出代价。
(另外注意SKYLAKE微架构家族的CPU进入512位向量模式的其他主要影响:在端口1中的向量的ALU关机,像这样仅标量指令popcnt或add可使用端口1。所以vpand和vpaddb等吞吐量下降的3至2如果您使用的是带有两个512位FMA单元的SKX,则端口5上的额外一个将上电,因此FMA会与随机播放器竞争。)
| 归档时间: |
|
| 查看次数: |
564 次 |
| 最近记录: |