我是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,但我遇到了一些问题。
我制作了一个简单的测试代码并成功编译,但是当我使用尖峰和循环精确仿真器实现它时,会出现非法指令错误。两者都使用代理内核。
// 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);
MRET,SRET或URET指令用于从M模式,S模式或 分别是U模式。执行xRET指令时,假设xPP保持值y,x IE 设为x PIE;权限模式更改为y; x PIE设置为1;并且xPP设置为U(或M if 不支持用户模式。)
如果有人知道,我希望看到详细的汇编代码。
rocket-chip/src/main/scala/rocket/CSR.scala
以重新设计CSR。这是唯一的方法吗?首先,我想使用尖峰来测试计数器值。我该如何更改代码? 如果有人有其他想法或已完成,请指向我。谢谢!