检测CPU功能支持(例如sse2,fma4等)

时间:2016-08-28 14:35:26

标签: linux windows macos cpu julia

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

特别是我需要检查各种SIMD指令集支持。 即sse2avxavx2fma4neon。 (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

这有两个缺点:

  1. 它不适用于Windows
  2. 我不确定它是否正确;它呢?或者是否搞砸了,例如操作系统是否已禁用某项功能,但CPU是否支持该功能?
  3. 所以我的问题是:

    1. 如何在Windows上完成这项工作。
    2. 这是正确的,甚至是获取此信息的好方法吗?
    3. 这是构建脚本的一部分(BinDeps.jl);所以我需要一个不涉及打开GUI的解决方案。 理想情况下,它不会添加第三方依赖项。 以某种方式从GCC中提取信息会起作用,因为我已经要求GCC编译一些共享库。 (选择哪个库,这是检测指令集的代码)

1 个答案:

答案 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指令来提取相关信息(因此它应该很好地反映了代码将在其中运行的环境)。

(来自https://stackoverflow.com/a/17759098/214671