【发布时间】:2017-01-04 15:58:20
【问题描述】:
我有一些代码依赖于 CPU 和操作系统对各种 CPU 功能的支持。
特别是我需要检查各种 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
这有两个缺点:
- 它不适用于 Windows
- 我只是不确定它是否正确;它吗?或者它是否搞砸了,例如操作系统禁用了某个功能,但 CPU 在物理上支持它?
所以我的问题是:
- 如何在 Windows 上进行这项工作。
- 这是正确的,或者是获取此信息的正确方法吗?
这是构建脚本的一部分(带有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