我有一些依赖AVX的代码
在相同的代码库中,我也使用TZCNT
后者是BMI1的一部分。我知道我可以使用CPUID测试这个指令,但我很懒,所以我实际上没有实现它。
要测试支持,我只需执行AVX指令。如果我得到#UD
未定义的指令异常,我知道CPU不支持AVX
但是tzcnt
向后兼容(种类)与bsf
(或bsr
- 我总是忘记哪个是哪个),因此不会触发异常。
如果我有AVX
支持,这是否意味着BMI1
支持?
为了记录,我现在正在测试的CPU上没有AVX2。
答案 0 :(得分:3)
不,AVX支持并不意味着支持BMI1。
有关详细信息,请参阅下表:
Intel AMD Year
---------------------------------------------------
AVX Sandy Bridge Bulldozer 2011
---------------------------------------------------
BMI1 Haswell Piledriver/Jaguar 2013
---------------------------------------------------
ABM Barcelona 2007
Haswell 2013
---------------------------------------------------
AVX2 Haswell 2013
Carrizo 2015
Ryzen 2017
---------------------------------------------------
BMI2 Haswell 2013
Excavator 2015
Ryzen 2017
大多数处理器都支持这两种处理器,但AVX比BMI1早了两年
除此之外,tzcnt
和bsf
在标志方面具有不同的语义
如果您想强制#UD
例外,则可以使用andn
。
如果您想使用CPUID:
BMI1 -> CPUID.(EAX=07H, ECX=0H):EBX.BMI1[bit 3]
(ANDN, BEXTR, BLSI, BLSMSK, BLSR, TZCNT)
BMI2 -> CPUID.(EAX=07H, ECX=0H):EBX.BMI2[bit 8]
(BZHI, MULX, PDEP, PEXT, RORX, SARX, SHLX, SHRX)
LZCNT -> CPUID.(EAX=80000001H) ECX.LZCNT[bit 5]
POPCNT -> CPUID.(EAX=01H) :ECX.POPCNT [Bit 23]
请注意,即使CPUID指示(英特尔)处理器不支持popcnt
,它通常也会支持。