如何解决不同的ISA二进制配置文件结果矛盾
我正在对以CPP编写的针对RISC架构的代码进行性能分析。我有两个二进制文件,一个是针对x86生成的,另一个是针对RISC-V生成的。我已经使用perf和gprof完成了分析。根据RISC和CISC体系结构的理论,但是我从性能结果中得到的是矛盾的。有人可以告诉我这是怎么回事。
性能结果
'./ unit_tests'CISC的性能计数器统计信息:
180,899022 task-clock (msec) # 0,885 CPUs utilized
7 context-switches # 0,039 K/sec
2 cpu-migrations # 0,011 K/sec
1.350 page-faults # 0,007 M/sec
588.853.057 cycles # 3,255 GHz
863.377.707 instructions # 1,47 insn per cycle
157.440.034 branches # 870,320 M/sec
992.067 branch-misses # 0,63% of all branches
0,204509183 seconds time elapsed
“ ./ unit_tests” RISC的性能计数器统计信息:
693,264322 task-clock (msec) # 0,999 CPUs utilized
28 context-switches # 0,040 K/sec
1 cpu-migrations # 0,001 K/sec
2.400 page-faults # 0,003 M/sec
2.320.185.432 cycles # 3,347 GHz
5.467.630.410 instructions # 2,36 insn per cycle
960.171.812 branches # 1385,001 M/sec
7.038.808 branch-misses # 0,73% of all branches
0,693978844 seconds time elapsed
从上述结果可以看出,RISC中经过的时间比CISC多,而RISC中每个周期的插入时间也更多。我想知道为什么会这样。有人可以告诉我是否遗漏了一些东西或错误地解释了结果吗?解决方法
您正在配置qemu解释/模拟RISC-V,而不是QEMU中的RISC-V“来宾”代码。 QEMU无法做到;它不是任何周期精确的模拟器。
与为您的x86-64编译的本机代码相比,这样做速度较慢并且需要更多指令。
使用binfmt_misc在RISC-V二进制文件上透明地运行qemu-riscv64
可使./unit_tests
完全等效于qemu-riscv64 ./unit_tests
您的测试结果证明了这一点:perf stat qemu-riscv64 ./unit_tests
给您的结果与您的问题大致相同。
有些相关:Modern Microprocessors A 90-Minute Guide!提供了一些有关CPU管道如何工作的详细信息。 RISC并不总是比现代x86 CPU更好。他们花了足够多的晶体管来快速运行x86-64代码。
您实际上希望使用RISC CPU进行同一工作会得到更多的指令,而不是那么多的指令。像是1.1倍或1.25倍?
性能取决于微体系结构,而不是(仅)指令集。 IPC和总时间或周期完全取决于微体系结构在寻找指令级并行性方面的积极程度。即使在相当密集的CISC x86代码中,内存源指令也很常见,现代Intel设计才是最好的选择。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。