RISC-V新手求教:如何通过软硬件方法获取FLOPS及CSR相关问题
获取RISC-V平台FLOPS的软硬件方法及SiFive U54 HPM计数器实现细节
作为在RISC-V领域摸爬滚打了几年的开发者,我来帮你梳理下获取FLOPS(每秒浮点运算次数)的可行方案,尤其是针对你提到的SiFive U54核心的HPM计数器实现细节,以及解决你用CSR读取时遇到的问题。
一、软件层面的快速估算方法
如果暂时不想碰硬件修改,软件层面可以通过基准测试程序来快速估算FLOPS:
- 写一段密集型浮点运算的测试代码(比如大量加法、乘法、乘加的循环),记录执行时间,用总浮点运算次数除以时间就能得到FLOPS。
- 注意要针对性处理编译器优化:要么用
-O0关闭优化,要么确保运算结果被实际使用(比如打印最终结果),避免编译器把无用的浮点运算直接优化掉。 - 示例代码片段:
#include <stdio.h> #include <time.h> #define NUM_OPS 100000000 int main() { double a = 1.5, b = 2.5, result = 0; clock_t start = clock(); for (int i = 0; i < NUM_OPS; i++) { result += a * b; // 每次循环包含1次乘法+1次加法,共2次浮点运算 } clock_t end = clock(); double time_sec = (double)(end - start) / CLOCKS_PER_SEC; double flops = (NUM_OPS * 2) / time_sec; printf("Estimated FLOPS: %.2e\n", flops); printf("Result: %.2f\n", result); // 强制让编译器保留运算逻辑 return 0; }
这种方法精度有限,会受缓存命中、系统负载、编译器优化策略影响胜在不用改硬件,上手快。
二、硬件层面基于HPM计数器的精准统计(重点针对SiFive U54)
你提到的通过HPM(硬件性能监控)计数器统计浮点运算事件是最精准的方案,SiFive U54核心确实支持通过mhpmevent系列CSR配置统计特定事件,下面是具体实现细节和问题解决思路:
1. 核心原理
RISC-V的HPM架构里,mhpmcounter3到mhpmcounter31是可配置的性能计数器,对应的mhpmevent3到mhpmevent31用来指定要统计的事件类型。我们只需要把浮点运算事件映射到某个HPM计数器,再读取计数器值结合时间就能算出FLOPS。
2. SiFive U54的浮点事件定义
根据U54的核心手册,它支持统计的浮点相关事件包括:
- 浮点加法/减法运算次数
- 浮点乘法运算次数
- 浮点乘加运算次数
- 浮点除法/平方根运算次数
这些事件都有专属编码,一定要严格对照手册里的数值来配置(比如假设浮点乘法事件编码是0x12,实际以官方手册为准)。
3. 配置与读取的实操步骤(代码示例)
要实现统计,你需要按以下步骤操作:
- 清零并禁用计数器:先避免计数混乱,比如用
csrw mhpmcounter3, x0清零,csrw mcounteren, 0x0暂时禁用所有计数器。 - 配置目标事件:把对应浮点事件的编码写入
mhpmevent寄存器,比如csrw mhpmevent3, 0x12(这里的0x12只是示例,要替换成手册里的真实编码)。 - 开启计数器权限:如果需要在用户态读取计数器,要在机器态(M-mode)下设置
mcounteren的对应位,比如csrw mcounteren, 0x8(开启mhpmcounter3的用户态访问权限)。 - 执行浮点任务:运行你的浮点运算程序或目标任务。
- 读取计算FLOPS:用
csrr t0, mhpmcounter3读取计数器值,结合任务执行时间,用“计数器值/时间”得到FLOPS。
4. 你遇到的CSR问题的常见解决方案
- 权限报错:如果用户态读取CSR失败,大概率是
mcounteren没开对应权限,必须回到M-mode配置该寄存器,允许用户态访问目标HPM计数器。 - 计数无变化:如果计数器没动静,十有八九是
mhpmevent的事件编码写错了,一定要核对U54手册里的事件编码表,确保和你要统计的浮点运算类型匹配。 - 计数器溢出:如果浮点运算量极大,64位的HPM计数器也可能溢出,建议定期读取计数器并累加数值,或者在任务拆分时分段统计。
三、自定义HPM计数器的设计思路(如果需要重新设计)
如果现有HPM计数器满足不了你的需求,要自己设计能统计每一次浮点运算的计数器,可以参考这个思路:
- 在浮点运算单元(FPU)的每个运算通路(加法、乘法等)里加事件检测逻辑,每次浮点运算完成就触发一个脉冲信号。
- 把这些脉冲信号通过多路选择器汇总,接到HPM计数器的计数输入端口。
- 在RISC-V的CSR模块里新增对应的
mhpmevent配置寄存器,用来选择要统计的浮点事件类型。 - 确保计数器的读写逻辑符合RISC-V的CSR规范,支持
csrr/csrw等指令访问。
内容的提问来源于stack exchange,提问作者Long
相关产品推荐
相关产品推荐

