2

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

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

我尝试模仿它进行FLOPS,但遇到了一些问题。

  1. 我无法访问 mhpmcounter,并且可以看到非法指令错误,如以下链接。 非法指令错误信息!!

我做了一个简单的测试代码并成功编译,但是当我使用尖峰和周期精确仿真器实现它时出现非法指令错误。两者都使用代理内核。

  // 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. 要访问 mhpmevet 和 mhpmcounter,很难从用户模式更改为 M 模式。在 RISC-V priv-spec 1.10 中,我发现 xRET 指令可以改变模式。以下文本是关于规范中的 xRET。

MRET、SRET 或 URET 指令分别用于从 M-mode、S-mode 或 U-mode 中的陷阱返回。执行 xRET 指令时,假设 xPP 保存值 y,x IE 设置为 x PIE;权限模式改为y;x PIE 设置为 1;并且 xPP 设置为 U(如果不支持用户模式,则设置为 M)。

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

  1. 我尝试修改rocket-chip/src/main/scala/rocket/CSR.scala以重新设计 CSR。这是唯一的方法吗?首先,我想使用尖峰来测试计数器值。我应该如何更改代码?

如果有人有其他想法或已经实现,请指出我。谢谢!

4

0 回答 0