如何使用SW或HW方法在RISC-V中获得FLOPS?

时间:2018-03-30 17:08:29

标签: profiling riscv flops

我是RISC-V的新手。我想知道如何使用SW或HW方法获得FLOPS。我尝试使用CSR来获得FLOPS,但是存在一些问题。

据我所知,如果我重新设计计算每个浮动操作事件的hpmcounter,我可以使用csr读取指令获得FLOPS。我知道基于火箭芯片的SiFive's U54-core manual有类似的设计。在手册中我可以看到SiFive核心具有复杂的功能计数功能。此功能由mhpmevent CSR控制。如果我将mhpmevent的低8位设置为0,并启用[19-25]位,我可以从mhpmcounter获取计数器值。我实际上想像SiFive核心一样设计这个领域。

我试图模仿FLOPS,但我遇到了一些问题。

  1. 我无法访问mhpmcounter,我可以看到非法指令错误,如下面的链接。 illegal instruction error message!!
  2. 我制作了一个简单的测试代码并成功编译,但是当我使用尖峰和循环精确仿真器实现它时,会出现非法指令错误。两者都使用代理内核。

      // simple test code
    
      unsigned long instret1 = 0;
      unsigned long instret2 = 0;
    
      float a,b,c;
      a = 5.0;
      b = 4.0;
      asm volatile ("csrrs %0, mhpmcounter3, x0 " : "=r"(instret1)); 
      c = a + b;
      asm volatile ("csrrs %0, mhpmcounter3, x0 " : "=r"(instret2));
      printf("instruction count : %ul \n", instret2-instret1);
    
    1. 很难从用户模式更改为M模式以访问mhpmevet和mhpmcounter。在RISC-V priv-spec 1.10中,我发现xRET指令可以改变模式。以下文字是关于规范中的xRET。
    2.   

      MRET,SRET或URET指令用于从M模式,S模式或   分别是U模式。执行xRET指令时,假设xPP保持值y,x IE   设为x PIE;权限模式更改为y; x PIE设置为1;并且xPP设置为U(或M if   不支持用户模式。)

      如果有人知道,我希望看到详细的汇编代码。

      1. 我尝试修改rocket-chip/src/main/scala/rocket/CSR.scala以重新设计CSR。这是唯一的方法吗?首先,我想使用尖峰来测试计数器值。我该如何更改代码?
      2. 如果有人有其他想法或已完成,请指向我。谢谢!

0 个答案:

没有答案