You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:19:59