如何判断Linux机器是否支持AVX/AVX2指令?

56

我正在使用SUSE Linux Enterprise 10/11操作系统。我将我的测试程序运行到一组安装了Intel处理器的机器上。由于我的工具程序依赖的库需要AVX/AVX2指令集支持,因此一些测试失败了,我收到了“非法异常”错误。

在Linux中,有没有可以用来确定CPU代码/系列名称的命令?

我相信从Intel SandyBridge及其以上版本支持AVX指令集,而从Haswell及其以上版本支持AVX2指令集。

5个回答

75

运行此命令:

grep avx /proc/cpuinfo
grep avx2 /proc/cpuinfo

这将为您提供:

标志: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl eagerfpu pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx avx2 hypervisor lahf_lm arat tsc_adjust xsaveopt


4
在 Skylake 桌面 CPU 上,grep -o 'avx[^ ]*' /proc/cpuinfo 将打印出每个核心的 avx avx2(重复)。(grep -o 只打印匹配的文本,而不是整行)。另一个选项是 tr ' ' '\n' < /proc/cpuinfo | grep avx - Peter Cordes
2
它没有打印任何东西。这是什么意思? - CGFoX
7
没有输出意味着它不支持。 - audun

48

在Linux(或Unix机器)中,有关您的CPU的信息存储在/proc/cpuinfo文件中。您可以手动从那里提取信息,也可以使用grep命令(grep flags /proc/cpuinfo)进行提取。

此外,大多数编译器都会自动定义__AVX2__,因此您也可以检查它。


对我来说,使用g++ 10.3和clang++ 12在支持FWIW的CPU上会失败。除非我添加-mavx2选项,但不幸的是,这会导致循环问题。使用march=native也会出现此问题。将其与旧CPU一起使用并添加-march=native不会出现“未定义”的状态。所以,是的,答案正确,但也需要正确触发才行。 - Dirk Eddelbuettel
@DirkEddelbuettel:是的,编译时CPU特性标志意味着它们被假定为所有将运行此程序的计算机的基线。GCC和Clang的默认设置通常配置为仅为x86-64基线的SSE2和其他内容。使用gcc -march=native使其启用CPU具有的所有功能,从而生成可能无法在其他CPU上正确或完全运行的二进制文件。(英特尔通常是向前兼容的,因此可以安全地运行来自“-march=native”的二进制文件,除了Alder Lake中缺少AVX-512的后退。) - Peter Cordes
其他有用的选项包括-march=x86-64-v3(Haswell功能级别,但仍然是通用调整,不幸的是仍然没有只关心支持AVX2的CPU的怪癖和偏好的通用AVX2调整)。https://en.wikipedia.org/wiki/X86-64#Microarchitecture_levels / https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html。 - Peter Cordes

16

您还可以运行 lscpu 并检查末尾的指令列表。


6

我喜欢使用这个命令:lscpu

然后具体来说:lscpu | grep avx


2

您可以通过查看/proc/cpuinfo来测试SIMD指令集和其他CPU特性的可用性,例如。

$ grep avx2 /proc/cpuinfo
flags       : fpu vme ... sse4_1 sse4_2 ... bmi1 avx2 ... bmi2 ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接