gcc 的 __builtin_cpu_supports 是否检查 OS 支持?
does gcc's __builtin_cpu_supports check for OS support?
GCC 编译器提供了一组 builtins to test some processor features, like availability of certain instruction sets. But, according to this 线程,我们也可能知道某些 cpu 功能可能不会被 OS 启用。所以问题是:__builtin_cpu_supports
内在函数是否也检查 OS 是否启用了某些处理器功能?
没有
我通过将 noxsave
添加到 Linux 内核启动选项来禁用我的 Skylake 系统上的 AVX。当我执行 cat /proc/cpuinfo
AVX(和 AVX2)不再出现时,当我使用 AVX 指令 运行 代码时它崩溃了。这告诉我 AVX 已被 OS.
禁用
但是,当我编译运行下面的代码时
#include <stdio.h>
int main(void) {
__builtin_cpu_init();
printf("%d\n", __builtin_cpu_supports ("sse"));
printf("%d\n", __builtin_cpu_supports ("avx"));
}
它 returns 8 和 512。这意味着 __builtin_cpu_supports
不会检查 OS 是否禁用了 AVX。
GCC 编译器提供了一组 builtins to test some processor features, like availability of certain instruction sets. But, according to this 线程,我们也可能知道某些 cpu 功能可能不会被 OS 启用。所以问题是:__builtin_cpu_supports
内在函数是否也检查 OS 是否启用了某些处理器功能?
没有
我通过将 noxsave
添加到 Linux 内核启动选项来禁用我的 Skylake 系统上的 AVX。当我执行 cat /proc/cpuinfo
AVX(和 AVX2)不再出现时,当我使用 AVX 指令 运行 代码时它崩溃了。这告诉我 AVX 已被 OS.
但是,当我编译运行下面的代码时
#include <stdio.h>
int main(void) {
__builtin_cpu_init();
printf("%d\n", __builtin_cpu_supports ("sse"));
printf("%d\n", __builtin_cpu_supports ("avx"));
}
它 returns 8 和 512。这意味着 __builtin_cpu_supports
不会检查 OS 是否禁用了 AVX。