有趣的是它在游戏和其他软件中的工作原理。
更准确地说,我正在寻求一个解决方案C++。
就像是:
if AMX available -> Use AMX version of the math library
else if AVX-512 available -> Use AVX-512 version of the math library
else if AVX-256 available -> Use AVX-256 version of the math library
etc.
Run Code Online (Sandbox Code Playgroud)
我的基本想法是在不同的 DLL 中编译库并在运行时交换它们,但这对我来说似乎不是最好的解决方案。
我举一个例子来问我的问题.现在我有一个叫做的函数do_something().
它有三个版本:do_something(),do_something_sse3(),和do_something_sse4().当我的程序运行时,它将检测CPU功能(看它是否支持SSE3或SSE4)并相应地调用三个版本之一.
问题是:当我建立我的程序与海湾合作委员会,我必须设置-msse4为do_something_sse4()编译(如头文件<smmintrin.h>被包括在内).
但是,如果我设置-msse4,则允许gcc使用SSE4指令,并且一些内在函数do_something_sse3()也被转换为某些SSE4指令.因此,如果我的程序在仅支持SSE3(但没有SSE4)的CPU上运行,则在调用时会导致"非法指令" do_something_sse3().
也许我有一些不好的做法.你能提一些建议吗?谢谢.
我们用 编译我们的代码g++ -march=ivybridge -mtune=skylake。如果有人在较旧/不兼容的架构上运行,我希望应用程序能够优雅地通知并退出。我该怎么做呢?AMD处理器怎么样?是否存在某种同等的架构/指令?
我有一些代码依赖于CPU和OS支持各种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
Run Code Online (Sandbox Code Playgroud)
这有两个缺点:
所以我的问题是:
这是构建脚本的一部分(使用BinDeps.jl); 所以我需要一个不涉及打开GUI的解决方案.理想情况下,这不会增加第三方依赖.以某种方式从GCC中提取信息会起作用,因为我已经要求GCC编译一些共享库.(选择哪个库,这是检测指令集的代码)
我正在尝试确定一种检测英特尔和AMD处理器上AVX和AVX2可用性的有效方法.在阅读英特尔软件开发人员手册第一卷(使用XSAVE功能集管理状态,第310页)时,我更加惊讶地发现它更接近SSE和XSAVE .
英特尔发布了一些用于在启用Is AVX时检测AVX可用性的代码?代码如下所示,并不太痛苦.问题是,Visual Studio是一个痛点,因为我们需要将代码从C/C++文件中移出到X64的ASM文件中.
其他人似乎采取了SIGILL检测AVX可用性的方法.或者他们无意中使用了这种SIGILL方法.例如,请参阅AVX指令上的SIGILL.
我的问题是,使用该SIGILL方法检测AVX可用性是否安全?这里,"安全"表示当CPU和OS支持AVX时,AVX指令不会生成SIGILL; 它会生成一个SIGILL否则.
下面的代码适用于32位计算机,它来自英特尔博客是否启用了AVX?令我担心的是操纵控制寄存器.读取和写入某些X86和ARM控制寄存器有时需要超级用户/管理员权限.这是我更喜欢的原因SIGILL(并避免控制寄存器).
; int isAvxSupported();
isAvxSupported proc
xor eax, eax
cpuid
cmp eax, 1 ; does CPUID support eax = 1?
jb not_supported
mov eax, 1
cpuid
and ecx, 018000000h ; check 27 bit (OS uses XSAVE/XRSTOR)
cmp ecx, 018000000h ; and 28 (AVX supported …Run Code Online (Sandbox Code Playgroud)