3

我有一些依赖于 AVX 的代码。
在同一个代码库中,我也使用TZCNT.
后者是 BMI1 的一部分。我知道我可以使用 CPUID 测试这条指令,但我很懒所以我实际上并没有实现它。

为了测试支持,我只需执行 AVX 指令。如果我得到一个#UD未定义的指令异常,我知道 CPU 不支持 AVX。
但是与(或-我总是忘记哪个是哪个)tzcnt向后兼容(某种),因此不会触发异常。 bsfbsr

如果我有AVX支持,这是否意味着BMI1支持?
作为记录,我现在正在测试的 CPU 上没有 AVX2。

4

1 回答 1

4

不,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 早了两年。
除此之外,关于标志的tzcntandbsf具有不同的语义。
如果要强制#UD异常,可以使用andn.

资料来源:维基百科:BMIAVX

如果要使用 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它,它也经常支持。

于 2017-06-29T14:15:39.447 回答