解决 UnixBench 在 x86-64-v1 CPU 上 Whetstone 报错 (Illegal Instruction) 的问题

最近在一台较老架构的服务器上运行 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

相关推荐
祁白_3 小时前
nmap工具笔记整理
笔记·web安全·测试
甜甜圈圈子1 天前
CANoe驱动最新安装包:项目的核心功能/场景
测试
货拉拉技术1 天前
AI手工测试用例的实践进阶之路
测试
花椒技术2 天前
聊聊AI协同编写【测试用例】这件事
人工智能·ai编程·测试
甜甜圈圈子7 天前
CAN总线常见的错误帧及产生原因
测试
霍小毛7 天前
数字孪生+AI重构风电运营:从“靠天吃饭“到“精准掌控“的能源革命
数据库·手机·框架·编程·测试·delete
Leah-8 天前
Web项目测试流程
笔记·学习·web·测试·复盘
songgeb9 天前
用 AI 降低 iOS 客户端 UI 自动化测试难度
ios·测试
哈温国丽10 天前
Python基础-列表元组集合字典
测试