【问题标题】:Dectecting CPU feature support (Eg sse2, fma4 etc)检测 CPU 功能支持(例如 sse2、fma4 等)
【发布时间】:2017-01-04 15:58:20
【问题描述】:

我有一些代码依赖于 CPU 和操作系统对各种 CPU 功能的支持。

特别是我需要检查各种 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 在物理上支持它?

所以我的问题是:

  1. 如何在 Windows 上进行这项工作。
  2. 这是正确的,或者是获取此信息的正确方法吗?

这是构建脚本的一部分(带有BinDeps.jl);所以我需要一个不涉及打开 GUI 的解决方案。 理想情况下,它不会添加第 3 方依赖项。 从 GCC 中提取信息会起作用,因为我已经要求 GCC 编译一些共享库。 (选择哪些库,就是这段代码用来检测指令集的目的)

【问题讨论】:

  • Julia 包含一个ccall-able CPUID. 然后你可以使用suitable flags and bit masks 例如在这个C-code
  • 如果您需要更多火力,请尝试Hwloc.jl,它提供了扩展信息(对 HPC 环境特别有用)。
  • @Isaiah 我仍在尝试以一种便携的方式完全找到一种方法。我真的不想写我在评论中提到的代码。如果有 Hwloc.jl 的方法,我很想看到它,发布答案怎么样?
  • 实际上,Hwloc 似乎还不支持 CPU 功能,我的错。 LLVM 提供了getHostCPUFeatures,但不幸的是它在 LLVM 3.8 之前不能可靠地工作,而 Julia 0.5 至少最初会与 LLVM 3.7 一起发布。
  • 如果绑定了正确的 windows .dll,则有:msdn.microsoft.com/en-us/library/windows/desktop/…,但它似乎与 FMA3 或 AVX2 或我感兴趣的其他几个匹配项没有

标签: linux windows macos cpu julia


【解决方案1】:

我只是不确定它是否正确;它吗?还是搞砸了,例如操作系统禁用了某个功能,但 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

【讨论】:

  • 遗憾的是,这只会告诉我:cmov mmx popcnt sse sse2 sse3 ssse3 sse4.1 sse4.2 avx avx2。 gcc.gnu.org/onlinedocs/gcc-4.8.4/gcc/… 这意味着它不会告诉我有关 ARM 上的 fma4neon 的信息(尽管我的问题中没有提到霓虹灯。我现在会解决这个问题)
  • 那是因为该文档是关于 gcc 4.8 的,而当时 FMA 可能甚至不存在,我想最近的版本已经更新了这个内置。 OTOH,可能最未来的证明方式应该是构建一个扩展,它只吐出 CPUID 指令提供的数据,并在你的 Julia 代码中自己检查它。不确定 ARM 和 Neon,但是,我必须查一下。
  • 啊,我现在看到你上面的评论,那么是的,你绝对应该使用它。将其添加为答案并接受!
  • 实现起来真的很烦人。如果我这样做,我可能会将它作为一个 julia 包发布。回复:文档。它的 GCC6 文档大致相同。还是没有FMA4。 gcc.gnu.org/onlinedocs/gcc-6.2.0/gcc/…
猜你喜欢
  • 1970-01-01
  • 2011-05-11
  • 2012-04-02
  • 2011-12-02
  • 2020-03-19
  • 2010-12-26
  • 2018-09-30
  • 1970-01-01
相关资源
最近更新 更多