gcc的__builtin_cpu_supports检查OS支持吗?

And*_* R. 7 c gcc simd instruction-set intrinsics

GCC编译器提供了一组内置函数来测试某些处理器功能,例如某些指令集的可用性.但是,根据这个线程,我们也可能知道操作系统可能无法启用某些cpu功能.所以问题是:__builtin_cpu_supports内在函数还检查操作系统是否启用了某些处理器功能?

Z b*_*son 5

不。

我通过添加noxsaveLinux 内核启动选项禁用了 Skylake 系统上的 AVX 。当我执行cat /proc/cpuinfoAVX(和 AVX2)时不再出现,并且当我使用 AVX 指令运行代码时它会崩溃。这告诉我 AVX 已被操作系统禁用。

但是,当我编译并运行以下代码时

#include <stdio.h>

int main(void) {
  __builtin_cpu_init();
  printf("%d\n", __builtin_cpu_supports ("sse"));
  printf("%d\n", __builtin_cpu_supports ("avx"));
}
Run Code Online (Sandbox Code Playgroud)

它返回 8 和 512。这意味着__builtin_cpu_supports不检查操作系统是否禁用了 AVX。

  • 这可能应该被认为是 gcc 错误;通常你真的想知道 AVX 是否真的可用,而不仅仅是 CPU 是否支持它。如果你真的想区分 CPU 支持但不可用,*那就是*手动使用 CPUID 时应该需要。我假设大多数使用 `__builtin_cpu_supports ("avx")` 的现有代码假设使用 `-mavx` 编译的代码可以运行,如果它是真的。 (2认同)