相关疑难解决方法(0)

应用程序如何确定指令集是否可用并在可用时使用它?

有趣的是它在游戏和其他软件中的工作原理。
更准确地说,我正在寻求一个解决方案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 中编译库并在运行时交换它们,但这对我来说似乎不是最好的解决方案。

c++ windows assembly instruction-set cpuid

18
推荐指数
2
解决办法
2873
查看次数

在GCC中使用不同版本的SSE内在函数的正确方法是什么?

我举一个例子来问我的问题.现在我有一个叫做的函数do_something().

它有三个版本:do_something(),do_something_sse3(),和do_something_sse4().当我的程序运行时,它将检测CPU功能(看它是否支持SSE3或SSE4)并相应地调用三个版本之一.

问题是:当我建立我的程序与海湾合作委员会,我必须设置-msse4do_something_sse4()编译(如头文件<smmintrin.h>被包括在内).

但是,如果我设置-msse4,则允许gcc使用SSE4指令,并且一些内在函数do_something_sse3()也被转换为某些SSE4指令.因此,如果我的程序在仅支持SSE3(但没有SSE4)的CPU上运行,则在调用时会导致"非法指令" do_something_sse3().

也许我有一些不好的做法.你能提一些建议吗?谢谢.

c gcc sse intrinsics

14
推荐指数
1
解决办法
2312
查看次数

如何在运行时验证架构是否匹配 -march=?

我们用 编译我们的代码g++ -march=ivybridge -mtune=skylake。如果有人在较旧/不兼容的架构上运行,我希望应用程序能够优雅地通知并退出。我该怎么做呢?AMD处理器怎么样?是否存在某种同等的架构/指令?

c++ x86 gcc cpu-architecture

8
推荐指数
1
解决办法
313
查看次数

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

我有一些代码依赖于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)

这有两个缺点:

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

所以我的问题是:

  1. 如何在Windows上完成这项工作.
  2. 这是正确的,甚至可以获得这些信息吗?

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

linux windows macos cpu julia

6
推荐指数
1
解决办法
320
查看次数

使用SIGILL与CPU探测进行AVX功能检测

我正在尝试确定一种检测英特尔和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)

c assembly avx

3
推荐指数
1
解决办法
563
查看次数

标签 统计

assembly ×2

c ×2

c++ ×2

gcc ×2

windows ×2

avx ×1

cpu ×1

cpu-architecture ×1

cpuid ×1

instruction-set ×1

intrinsics ×1

julia ×1

linux ×1

macos ×1

sse ×1

x86 ×1