从here中,我了解到对AVX的支持并不意味着对BMI1的支持。AVX2怎么样:所有支持AVX2的CPU是否也支持BMI2?此外,支持AVX2是否意味着支持popcnt?
在Google上搜索了一遍,找不到一个明确的答案。最接近的是Does AVX support imply BMI1 support?。
从here中,我了解到对AVX的支持并不意味着对BMI1的支持。AVX2怎么样:所有支持AVX2的CPU是否也支持BMI2?此外,支持AVX2是否意味着支持popcnt?
在Google上搜索了一遍,找不到一个明确的答案。最接近的是Does AVX support imply BMI1 support?。
1条答案
按热度按时间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中是这样,尽管
pdep
和pext
确实需要大量的晶体管来用于执行单元,与任何其他指令所需的其他任何东西分开。(AVX-512vpcompressb
/vpexpandb
的按位版本。)或慢速微码。AVX 2和BMI 2具有独立的功能位,因此仿真器或VM可以禁用BMI 2,同时保持AVX 2启用,因此最好同时检查这两个功能位。(the OS has enabled AVX:
xgetbv
(在使用CPUID检查是否支持xgetbv
之后)。如果您尝试运行BMI 2指令,仿真器甚至可能会出现故障(与VM不同:与SSE/AVX/AVX-512不同,没有控制寄存器位会使CPU在正常支持的BMI 2指令上出现硬件故障。你不需要一个没有BMI 2版本的函数的单独AVX 2,除非你想在循环中使用
pdep
/pext
。如果有人设置了一个奇怪的模拟器或虚拟机,因为它缺少BMI 2而阻止你的代码使用AVX 2函数,那是他们的问题,不太可能偶然发生。目前CPU数
pdep
/pext
)pdep
/pext
(与英特尔相同,1 uop,3c延迟,1c吞吐量)的AMD。pdep
/pext
,但可能没有AMD那么糟糕?InstLatx 64并没有说明他们测试了什么输入,这可能只是一个非常特殊的情况,如0
)。基于VIA Nano C。pdep
/pext
)AMD Zen 2及更早版本的
pdep
/pext
慢得离谱在Zen 3之前的AMD(如挖掘机、Zen 1和Zen 2)具有灾难性的慢
pdep
和pext
,其中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
的实现成本更低。脚注1:Mysticial评论
VIA Isaiah C4650具有AVX 2,但没有FMA 3。在AVX 2存在的情况下中断了许多假设FMA 3的程序
顺便说一句,我和Hot Chips的VIA建筑师之一谈了这件事。他很生气他们允许这种事发生。IIRC,他暗示他们应该关闭AVX 2的CPUID或对FMA进行微编码。