C++ 用于检测BMI2指令集的编译器宏

C++ 用于检测BMI2指令集的编译器宏,c++,x86,intel,instruction-set,bmi,C++,X86,Intel,Instruction Set,Bmi,我在网上搜索,想找到一个合适的解决方案,但没有多大成功。 所以我希望你们中的一位对此有所了解:是否有任何方法可以检测“”(BMI2)编译时?我想根据它的可用性做一些有条件的事情。使用EAX=7、ECX=0运行CPUID内部函数,然后检查返回的EBX寄存器的第3位(BMI1标志)。EBX位8是BMI2标志。有关如何调用CPUID并从中获取数据的信息,请参阅编译器的文档。使用GCC,您可以检查\uuuu BMI2\uuuu宏。如果目标支持BMI2(例如,-mbmi2,-march=haswell),

我在网上搜索,想找到一个合适的解决方案,但没有多大成功。
所以我希望你们中的一位对此有所了解:是否有任何方法可以检测“”(BMI2)编译时?我想根据它的可用性做一些有条件的事情。

使用EAX=7、ECX=0运行CPUID内部函数,然后检查返回的EBX寄存器的第3位(BMI1标志)。EBX位8是BMI2标志。有关如何调用CPUID并从中获取数据的信息,请参阅编译器的文档。

使用GCC,您可以检查
\uuuu BMI2\uuuu
宏。如果目标支持BMI2(例如,
-mbmi2
-march=haswell
),则将定义此宏。这是instrinsic头(
x86intrin.h
bmi2intrin.h
)在编译时用来检查BMI2的宏


对于运行时检查,可以在现代GCC中使用
\uuuuuuu内置cpu\u init()
\uuuuuuuuuuuu内置cpu\u支持(“bmi2”)
(在GCC 5.1、4.9和更低版本中测试时没有)

不过,这不是编译时检查。谢谢你的帮助,但这是一个运行时检查,不是编译时检查。你不能在编译时进行检查,因为它运行的系统与它构建的系统不同。如果系统是相同的,您可以提前知道这一点,并且可以编写代码,知道它将运行的系统将有指令,或者不会,并通过预处理器定义有条件地启用该指令。这可能意味着编译器运行的CPU,不是编译程序以后运行的CPU吗?是的,这意味着编译器运行的CPU(或者更准确地说是编译的体系结构)。第二个选项毫无意义:编译器如何知道您以后实际使用哪个cpu来运行您的程序?该场景需要动态运行时CPUID检查,在本例中更简单。