assembly 所有支持AVX2的CPU是否也支持BMI2或popcnt?

tjjdgumg  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(91)

here中,我了解到对AVX的支持并不意味着对BMI1的支持。AVX2怎么样:所有支持AVX2的CPU是否也支持BMI2?此外,支持AVX2是否意味着支持popcnt?
在Google上搜索了一遍,找不到一个明确的答案。最接近的是Does AVX support imply BMI1 support?

xcitsw88

xcitsw881#

所有AVX 2的真实的硬件都有BMI 2。

**AMD Zen 2和更早版本的pdep/pext**慢得令人难以置信,因此如果您正在进行CPU检测以设置函数指针,对于在循环中使用任一指令的函数,您将需要检查这些CPU型号,而不是BMI 2的可用性。如果支持其他BMI 2指令也可以。

几乎所有的AVX 2硬件都有FMA,但不完全。
BMI 1/2和FMA 3是-march=x86-64-v3特性级别的一部分(本质上是Haswell,但没有TSX,AES-NI,rdrand和其他一些东西。https://en.wikipedia.org/wiki/X86-64#Microarchitecture_levels).
很有可能所有未来的CPU都将同时具备AVX 2 + BMI 2,或者两者都不具备,至少在商业相关的主流CPU中是这样,尽管pdeppext确实需要大量的晶体管来用于执行单元,与任何其他指令所需的其他任何东西分开。(AVX-512 vpcompressb/vpexpandb的按位版本。)或慢速微码。
AVX 2和BMI 2具有独立的功能位,因此仿真器或VM可以禁用BMI 2,同时保持AVX 2启用,因此最好同时检查这两个功能位。(the OS has enabled AVXxgetbv(在使用CPUID检查是否支持xgetbv之后)。如果您尝试运行BMI 2指令,仿真器甚至可能会出现故障(与VM不同:与SSE/AVX/AVX-512不同,没有控制寄存器位会使CPU在正常支持的BMI 2指令上出现硬件故障。
你不需要一个没有BMI 2版本的函数的单独AVX 2,除非你想在循环中使用pdep/pext。如果有人设置了一个奇怪的模拟器或虚拟机,因为它缺少BMI 2而阻止你的代码使用AVX 2函数,那是他们的问题,不太可能偶然发生。

目前CPU数
  • 英特尔Haswell:AVX 2和BMI 2。(也是Intel的第一个BMI 1 CPU)。
  • 英特尔Gracemont(桤木Lake E-core):AVX 2和BMI 2。第一款采用AVX 1或BMI 1的低功耗silvermont系列。
  • AMD挖掘机:AMD的第一个AVX 2 CPU也是他们的第一个BMI 2 CPU。(使用微编码pdep/pext
  • AMD Zen 3:第一款具备可用pdep/pext(与英特尔相同,1 uop,3c延迟,1c吞吐量)的AMD。
  • VIA Nano C QuadCore C4650 (Isiah) 2015年:AVX2 + BMI2。(特别是 * 没有 * FMA 31)。我认为这是VIA's的第一个AVX 2 CPU。
  • 赵新KaiXian ZX-C+ C4580:AVX 2 + BMI 2(慢pdep/pext,但可能没有AMD那么糟糕?InstLatx 64并没有说明他们测试了什么输入,这可能只是一个非常特殊的情况,如0)。基于VIA Nano C。
  • Centaur CNS:AVX 512、AVX 2、BMI 2(快速pdep/pext

AMD Zen 2及更早版本的pdep/pext慢得离谱

在Zen 3之前的AMD(如挖掘机、Zen 1和Zen 2)具有灾难性的慢pdeppext,其中uop的数量取决于数据,例如https://uops.info/在Zen 1&2上测量了64位pext的133 uops,每52周期吞吐量一次。
所有其他BMI/BMI 2指令在支持它们的CPU上都很快,Zen 4之前的AMD上的blsr最多2个uop,或者Intel上的single-uop。

AVX 1隐含popcnt

AVX 1意味着SSE4.2,而SSE4.2至少事实上意味着popcnt
popcnt确实有自己的特性位,所以CPU可以拥有popcnt * 而不支持 * SSE4.2,但实际上,情况并没有相反的情况发生。足够的软件假设SSE4.2意味着popcnt,如果CPU违反了这个假设,那将是CPU的错误,而不是软件。这并不是一个合理的情况;与SSE4.2字符串指令相比,popcnt的实现成本更低。

  • https://en.wikipedia.org/wiki/X86_Bit_manipulation_instruction_set#Supporting_CPUs列出了挖掘机。他们不包括任何威盛或兆芯CPU。

脚注1:Mysticial评论
VIA Isaiah C4650具有AVX 2,但没有FMA 3。在AVX 2存在的情况下中断了许多假设FMA 3的程序
顺便说一句,我和Hot Chips的VIA建筑师之一谈了这件事。他很生气他们允许这种事发生。IIRC,他暗示他们应该关闭AVX 2的CPUID或对FMA进行微编码。

相关问题