我正在使用SUSE Linux Enterprise 10/11操作系统。我将我的测试程序运行到一组安装了Intel处理器的机器上。由于我的工具程序依赖的库需要AVX/AVX2指令集支持,因此一些测试失败了,我收到了“非法异常”错误。
在Linux中,有没有可以用来确定CPU代码/系列名称的命令?
我相信从Intel SandyBridge及其以上版本支持AVX指令集,而从Haswell及其以上版本支持AVX2指令集。
运行此命令:
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
在Linux(或Unix机器)中,有关您的CPU的信息存储在/proc/cpuinfo
文件中。您可以手动从那里提取信息,也可以使用grep命令(grep flags /proc/cpuinfo
)进行提取。
此外,大多数编译器都会自动定义__AVX2__
,因此您也可以检查它。
-mavx2
选项,但不幸的是,这会导致循环问题。使用march=native
也会出现此问题。将其与旧CPU一起使用并添加-march=native
不会出现“未定义”的状态。所以,是的,答案正确,但也需要正确触发才行。 - Dirk Eddelbuettelgcc -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您还可以运行 lscpu
并检查末尾的指令列表。
我喜欢使用这个命令:lscpu
然后具体来说:lscpu | grep avx
您可以通过查看/proc/cpuinfo
来测试SIMD指令集和其他CPU特性的可用性,例如。
$ grep avx2 /proc/cpuinfo
flags : fpu vme ... sse4_1 sse4_2 ... bmi1 avx2 ... bmi2 ...
grep -o 'avx[^ ]*' /proc/cpuinfo
将打印出每个核心的 avx avx2(重复)。(grep -o
只打印匹配的文本,而不是整行)。另一个选项是tr ' ' '\n' < /proc/cpuinfo | grep avx
。 - Peter Cordes