检测CPUfunction支持(例如sse2,fma4等)

我有一些代码依赖于CPU和OS支持各种CPUfunction。

特别是我需要检查各种SIMD指令集的支持。 即sse2avxavx2fma4neon 。 ( neon是ARM SIMD的特性,我对这一点不太感兴趣,因为ARM的terminal用户较less)。

我现在正在做的是:

 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 

这有两个缺点:

  1. 它不适用于Windows
  2. 我只是不确定是否正确。 它呢? 或者它搞砸了,例如,如果操作系统禁用了一个function,但在物理上CPU支持它?

所以我的问题是:

  1. 我怎样才能使这个工作在Windows上。
  2. 这是正确的,甚至是一个好方法来获取这些信息?

这是构build脚本的一部分(与BinDeps.jl ); 所以我需要一个不涉及打开GUI的解决scheme。 理想情况下,不添加第三方依赖。 从GCC中提取信息会起作用,因为我已经要求GCC编译一些共享库。 (select哪个库,这个代码来检测指令集是为了什么)

我只是不确定是否正确。 它呢? 或者它搞砸了,例如,如果操作系统禁用了一个功能,但在物理上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指令来提取相关信息(所以它应该很好地反映你的代码运行的环境)。

(从https://stackoverflow.com/a/17759098/214671