检查运行时是否支持 SSE

Checking if SSE is supported at runtime

我想检查运行时是否支持 SSE4 或 AVX,以便我的程序可以利用处理器特定指令,而无需为每个处理器创建二进制文件。

如果我可以在运行时确定它,我可以使用一个接口并在不同的指令集之间切换。

在 MSVC 上,extern int __isa_available 有关于 CPU 对 MSVC 构建的支持的信息。

它被 MSVC 2013 中的矢量化器用来选择要 运行 的程序集。

GCC 有一种方法可以通过调用 __builtin_cpu_init 然后调用 __builtin_cpu_is__builtin_cpu_supports 来检查特性。 https://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/X86-Built-in-Functions.html

在 x86 上,当使用 C++ 前端时,GCC 支持 "function multiversioning",这允许您编写函数的多个版本,指定它应该使用的目标,并让 GCC 负责确保它被称为。 https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Function-Multiversioning.html