从这里,我了解到AVX的支持并不意味着BMI1的支持。那么AVX2怎么样:所有支持AVX2的CPU也都支持BMI2吗?另外,AVX2的支持是否就意味着popcnt的支持?
查遍谷歌也找不到明确的答案。我得到的最接近的是 AVX 支持是否意味着 BMI1 支持?.
AMD Zen 2 及更早版本的速度慢得无法使用
pdep
/pext
,因此,如果您正在进行 CPU 检测以设置函数指针,则需要检查这些 CPU 型号而不是 BMI2 的可用性在循环内使用任一指令。如果支持的话其他 BMI2 指令也可以。
几乎所有 AVX2 硬件也具有 FMA,但不完全如此。
BMI1/2 和 FMA3 是
-march=x86-64-v3
功能级别的一部分(本质上是 Haswell,但没有 TSX、AES-NI、rdrand
和其他一些东西。
https://en.wikipedia.org/wiki/X86-64#Microarchitecture_levels)。
很可能所有未来的 CPU 都会同时具备 AVX2+BMI2,或者两者都不具备,至少在商业相关的主流 CPU 中是这样,尽管
pdep
和 pext
确实需要大量晶体管作为执行单元,与其他所需的东西分开对于任何其他指令。 (AVX-512 的按位版本vpcompressb
/vpexpandb
。)或缓慢的微代码。
AVX2 和 BMI2 具有单独的功能位,因此模拟器或虚拟机可以在启用 AVX2 的同时禁用 BMI2,因此 最好检查两者。 (并且在使用 CPUID 检查是否支持 xgetbv
后,操作系统已启用 AVX
:
xgetbv
)。如果您尝试运行 BMI2 指令,模拟器甚至可能会出现故障(与 VM 不同:没有控制寄存器位会导致其通常支持的 BMI2 指令上的 CPU 硬件出现故障,这与 SSE/AVX/AVX-512 不同。)您不需要没有 BMI2 版本函数的单独 AVX2,除非您想在循环内使用
pdep
/
pext
。如果有人设置了一个奇怪的模拟器或虚拟机,因为缺少 BMI2 而阻止您的代码使用其 AVX2 功能,那就是他们的问题,并且不太可能意外发生。迄今为止的CPU
pdep
/
pext
)
pdep
/
pext
的 AMD(与 Intel 相同,1 uop,3c 延迟,1c 吞吐量)。
pdep
/
pext
,但也许没有AMD那么糟糕?InstLatx64没有说明他们测试的输入是什么,这可能只是一个非常特殊的输入)像
0
这样的情况)。基于威盛 Nano C。
pdep
/
pext
)
pdep
/
pext
pdep
和
pext
,其中 uops 的数量取决于数据,例如https://uops.info/ 在 Zen 1 和 2 上以 133 uops 测量 64 位
pext
,每 52 个周期吞吐量 1 个。所有其他 BMI/BMI2 指令在支持它们的 CPU 上速度都很快,对于 Zen 4 之前的 AMD 上的
blsr
之类的东西最多 2 微指令,或者英特尔上的单微指令。
popcnt
popcnt
。
popcnt
确实有自己的功能位,因此CPU可以有
popcnt
但不支持SSE4.2,但实际上相反的情况并没有发生。足够多的软件假设 SSE4.2 意味着 popcnt
如果 CPU 违反了该假设,那将是 CPU 的故障,而不是软件的故障。这实际上并不是一个合理的情况。与 SSE4.2 字符串指令相比,
popcnt
的实现成本较低。
VIA Isaiah C4650 有 AVX2,但没有 FMA3。打破了许多在 AVX2 存在的情况下假定 FMA3 的程序顺便说一句,我与 Hot Chips 的一位 VIA 架构师谈过此事。他很生气他们允许这样的事情发生。 IIRC,他暗示他们应该关闭 AVX2 的 CPUID 或对 FMA 进行微编码。