最近在一台较老架构的服务器上运行 UnixBench 6.0.0 做性能测试时,遇到了一个典型问题:
Dhrystone 正常运行,但 Whetstone 直接报错退出。
经过排查,最终确认是 CPU 指令集与编译参数不匹配 导致的。
一、问题现象
运行 UnixBench 时,日志显示:
sql
Double-Precision Whetstone -- 1 copy
# ERROR: command returned status 33792
进一步计算:
ini
33792 / 256 = 132
在 Linux 中:
ini
Exit Code 132 = SIGILL
Illegal Instruction
这意味着:
程序执行了 CPU 不支持的指令。
二、确认 CPU 指令集
通过 /proc/cpuinfo 查看 CPU flags:
bash
cat /proc/cpuinfo | grep flags
结果:
markdown
flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36
clflush mmx fxsr sse sse2 ht syscall nx lm rep_good nopl cpuid
extd_apicid tsc_known_freq pni cx16 x2apic hypervisor lahf_lm
cmp_legacy 3dnowprefetch vmmcall
可以看到 CPU 只支持:
| 指令集 | 支持情况 |
|---|---|
| SSE4 | ❌ |
| AVX | ❌ |
| AVX2 | ❌ |
这说明 CPU 实际属于:
x86-64-v1
三、问题根本原因
查看 UnixBench 的 Makefile 发现:
ini
OPTON += -march=native -mtune=native
-march=native 会根据 编译机器 CPU 自动启用高级指令集。
如果编译机器支持:
- SSE4
- AVX
- AVX2
编译出的程序就会包含这些指令。
但当前服务器只支持:
SSE2 / SSE3
因此在运行 whetstone-double 时就会出现:
Illegal Instruction
四、解决方案
需要修改 Makefile 的编译优化参数。
打开 Makefile:
vi Makefile
找到:
ini
OPTON += -march=native -mtune=native
修改为:
ini
OPTON += -march=x86-64 -mtune=generic
这样只会使用:
- SSE2
- 通用 x86_64 指令
兼容 x86-64-v1 CPU。
五、重新编译 UnixBench
清理旧编译文件:
go
make clean
重新编译:
go
make
如果编译成功,会看到类似输出:
ini
cc -o pgms/arithoh -Wall -pedantic -O3 -ffast-math -march=x86-64 -mtune=generic...
六、运行 Benchmark
执行:
./Run
即可正常运行全部 benchmark