我有一些代码依赖于各种CPU功能的CPU和OS支持。
特别是我需要检查各种SIMD指令集支持。
即sse2
,avx
,avx2
,fma4
和neon
。
(neon
是ARM SIMD功能。我对此不太感兴趣;给予较少的ARM最终用户。)
我现在正在做的是:
function cpu_flags()
if is_linux()
cpuinfo = readstring(`cat /proc/cpuinfo`);
cpu_flag_string = match(r"flags\t\t: (.*)", cpuinfo).captures[1]
elseif is_apple()
sysinfo = readstring(`sysctl -a`);
cpu_flag_string = match(r"machdep.cpu.features: (.*)", cpuinfo).captures[1]
else
@assert is_windows()
warn("CPU Feature detection does not work on windows.")
cpu_flag_string = ""
end
split(lowercase(cpu_flag_string))
end
这有两个缺点:
所以我的问题是:
这是构建脚本的一部分(BinDeps.jl);所以我需要一个不涉及打开GUI的解决方案。 理想情况下,它不会添加第三方依赖项。 以某种方式从GCC中提取信息会起作用,因为我已经要求GCC编译一些共享库。 (选择哪个库,这是检测指令集的代码)
答案 0 :(得分:2)
我只是不确定它是否正确;它呢?或者是否搞砸了,例如,如果操作系统已禁用某项功能,但物理上CPU是否支持该功能?
我认为操作系统在禁用矢量指令方面没有任何发言权;我已经看到BIOS能够禁用内容(特别是虚拟化扩展),但在这种情况下,即使在/proc/cpuinfo
中你也找不到它们 - 这就是它的重点:-)。
以某种方式从GCC中提取信息会起作用,因为我已经要求GCC编译一些共享库
如果你总是拥有gcc(Windows上的MinGW),你可以使用__builtin_cpu_supports
:
#include <stdio.h> int main() { if (__builtin_cpu_supports("mmx")) { printf("\nI got MMX !\n"); } else printf("\nWhat ? MMX ? What is that ?\n"); return (0); }
显然这个内置函数也可以在mingw-w64下工作。
AFAIK它使用CPUID指令来提取相关信息(因此它应该很好地反映了代码将在其中运行的环境)。