不同的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设计才是最好的选择。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...