我希望在运行时检查是否支持SSE4或AVX,这样我的程序可以利用处理器特定指令而不必为每个处理器创建一个二进制文件。
如果我能够在运行时确定它,我可以使用接口并在不同的指令集之间切换。
GCC有一种方法,它通过调用__builtin_cpu_init
,然后调用__builtin_cpu_is
和__builtin_cpu_supports
来检查功能。
在x86架构中,使用C++前端时,GCC支持“函数多版本”,这允许您编写多个函数版本,指定应该使用的目标,并让GCC负责确保其被调用。
https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Function-Multiversioning.htmlextern int __isa_available
包含了有关MSVC构建的CPU支持信息。
__builtin_cpu_supports()
可能是GCC 4.8+中最容易的选项:https://gcc.gnu.org/onlinedocs/gcc-4.9.2/gcc/X86-Built-in-Functions.html#X86-Built-in-Functions。MSVC肯定有类似的功能。它们可能只是使用CPUID:http://en.wikipedia.org/wiki/CPUID。 - Ulfalizer