GCC编译器提供了一组内置来测试某些处理器功能,例如某些说明集的可用性。但是,根据此线程,我们也可能知道OS可能无法启用某些CPU功能。因此,问题是:__builtin_cpu_supports
Interins是否还检查OS是否已启用了某些处理器功能?
no。
我通过将noxsave
添加到Linux内核启动选项中,禁用Skylake系统上的AVX。当我执行cat /proc/cpuinfo
AVX(和AVX2(时,不再出现,当我使用AVX指令运行代码时,它会崩溃。这告诉我AVX已被操作系统禁用。
但是,当我编译并运行以下代码
时#include <stdio.h>
int main(void) {
__builtin_cpu_init();
printf("%dn", __builtin_cpu_supports ("sse"));
printf("%dn", __builtin_cpu_supports ("avx"));
}
它返回8和512。这意味着__builtin_cpu_supports
不检查OS是否禁用AVX。
是的,它确实如此。海湾合作委员会有一个错误,但它是在GCC 8左右修复的:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85100