X86 不同的ISA二进制分析结果相互矛盾

X86 不同的ISA二进制分析结果相互矛盾,x86,qemu,perf,riscv,instruction-set,X86,Qemu,Perf,Riscv,Instruction Set,我正在对以CPP为目标的RISC体系结构编写的代码进行评测。我已经生成了两个二进制文件,一个用于x86,另一个用于RISC-V。我已经使用perf和gprof进行了评测。根据RISC和CISC架构的理论,但我从perf结果中得到的结果是矛盾的。谁能告诉我这里怎么了 性能测试结果: “/unit_tests”CISC的性能计数器统计信息: 180,899022 task-clock (msec) # 0,885 CPUs utilized

我正在对以CPP为目标的RISC体系结构编写的代码进行评测。我已经生成了两个二进制文件,一个用于x86,另一个用于RISC-V。我已经使用perf和gprof进行了评测。根据RISC和CISC架构的理论,但我从perf结果中得到的结果是矛盾的。谁能告诉我这里怎么了

性能测试结果:

“/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
“/单元测试”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中每个周期的insn也更多。我想知道为什么会这样。有人能告诉我我是否遗漏了什么或者解释结果有误吗?

您正在分析qemu解释/模拟RISC-V,而不是qemu中的RISC-V“来宾”代码。QEMU无法做到这一点;这不是一个精确的周期模拟器

这比最初为x86-64编译的本机代码更慢,需要更多指令

使用binfmt_misc在RISC-V二进制文件上透明地运行
qemu-riscv64
,使得
/unit_测试
完全等同于
qemu-riscv64./unit_测试

您的测试结果证明了这一点:
perf stat qemu-riscv64./unit_测试
给出的结果与您的问题大致相同


有些相关:有一些关于CPU管道如何工作的详细信息。RISC并不总是比现代x86 CPU更好。他们花费了足够的晶体管来快速运行x86-64代码

实际上,对于RISC CPU的相同工作,您会期望有更多的总指令,只是没有那么多指令。比如1.1倍或1.25倍


性能取决于微体系结构,而不仅仅是指令集。IPC和总时间或周期完全取决于微体系结构在寻找指令级并行性方面的积极程度。现代Intel设计在这方面是最好的,即使是在相当密集的CISC x86代码中,内存源指令也很常见。

您是否有透明
qemu
设置,以便在x86系统上运行RISC-V二进制文件?(考虑到这一点,很可能)。如果是这样,那么您是在分析
qemu
解释/模拟RISC-V,而不是RISC-V“来宾”代码本身。或者你在一个RISC-V系统上运行Linux,而这个系统恰好与你的x86有着相似的时钟速度?同样,IDK你认为“理论”所预测的。当比较同样具有攻击性的超标量无序RISC和CISC时,由更高的IPC平衡的更多指令并不是不合理的()。当然,不是更多的指令,比如在本例中增加6倍。这是因为qemu动态翻译和口译的开销。实际的RISC-V指令计数(qemu内的来宾代码或在真实的RISC-V上运行的来宾代码)在最坏情况下可能是1.5倍,可能没有那么糟糕。@PeterCordes感谢您提供的信息。我的Linux机器有Intel core i3 CPU,时钟速度为3.40GHz。但我的目标板FPGA Artix-7的内部时钟速度超过450MHz。我在我的Linux机器上运行这两个可执行文件,因为我没有访问硬件(FPGA),正如前面提到的,我正在使用qemu模拟二进制文件。我怎样才能得出以下理论得出的性能结果呢?例如:由于简化了指令集,RISC处理器的性能通常是CISC处理器的两到四倍。正如我们从上面看到的,CISC花费了0204509183秒,而RISC花费了0693978844秒。这就是我想知道的。如果我错了,请纠正我。首先,就像我说的,你不是在比较CPU,而是在比较本机代码和同一CPU上的模拟器。但同时,现代x86-64 CPU是CISC速度缓慢规则的例外。他们花费足够的晶体管解码内部的UOPS(和缓存解码的UOP)以使单线程性能比任何当前的商业RISC设计更好,当你考虑他们可以命中的时钟频率。(或许IBM POWER可以与之相比,IDK;它是一种类似的高端、宽而深的无序设计。)看看多核吞吐量。从上面的讨论中,我了解到:
RISC性能统计中执行时间的增加并不是因为在客户机上运行RISCV仿真,而仿真的概念将比在实际硬件上运行慢得多是错误的
执行时间与主机或仿真时间无关。它与ISA相关的循环计数有关
希望我的结论是正确的。如果我错了,请纠正我。@Yulia:不,额外的执行时间几乎都是模拟时间,取决于QEMU的编写方式。它不会告诉你你的RISC-V代码在任何真正的RISC-V上运行的速度,不管它是一个简单的有序管道还是一个超标量无序的RISC-V。