有谁知道为什么系统调用在 64 位 ARM (aarch64) 上执行比 64 位 Intel CPU (x86-64) 需要更长的时间?请参阅下面我的基准测试设置。
- 64 位 ARM CPU:Ampere Altra Q80-30,80 核,3 GHz
- 64 位 Intel CPU:Intel Xeon Gold 5317 CPU,12 核(24 线程),频率设置为最大 3 GHz
操作系统:Ubuntu 20.04 LTS,Linux 内核:5.13.0-41-generic(在 ARM 和 Xeon 上)
基准测试:UnixBench 系统调用(https://github.com/kdlucas/byte-unixbench) (https://github.com/kdlucas/byte-unixbench/blob/master/UnixBench/src/syscall.c)
运行命令:./syscall 10(对于混合系统调用)或./syscall 10 close(仅适用于 close())
我使用 perf 分析了执行情况并得到了以下结果(对于 ./syscall 10 close):
Altra Xeon
Duration [s] 10 10
Throughput [lps] 23,194,919 47,938,768
Cycles 30,000,710,570 29,968,373,641
Instructions 37,767,647,457 40,044,878,500
IPC 1.26 1.34
Calls 231,949,190 479,387,680
Instructions per call 162.83 83.53
因此,在相同频率 (3 GHz) 下,Xeon 执行的系统调用数量是 Altra 的两倍。 Altra 每次调用需要 2 倍的指令数量(163 比 84)。这是否有任何架构(aarch64 与 x86-64)原因?