RISC-V中利用rdtime估计cycle数

less than 1 minute read

Published:

在RISC-V Linux中, rdtime或者rdcycle可以用来获取和时间相关的统计量, 但是时钟源一般不同.

  • rdtime采用的是较低精度的时钟源, 但是这个时钟是以恒定频率工作的,所以可以用来稳定计时。
  • rdcycle相对地,CPU的cycle所对应的时钟可能是动态变化的,但它也是用来精确衡量算力消耗的单位。

假定CPU以恒定频率工作,那么rdtimerdcycle就是呈固定的线性关系,因此可以由rdtime的结果来推算cycle数。

测试代码

// main.c
#include <stdio.h>

extern unsigned long test();

int main() { printf("cycle: %lu\n", test()); }
# test.S
.global test

test:
    li      t0, 10000
    rdtime  t1
1:
    ld      a0, 0(sp)
    ld      a1, 8(sp)
    ld      a2, 16(sp)
    ld      a3, 24(sp)
    ld      a4, 32(sp)
    ld      a5, 40(sp)
    ld      a6, 48(sp)
    ld      a7, 56(sp)
    ld      s0, 64(sp)
    ld      s1, 72(sp)
    ld      s2, 80(sp)
    ld      s3, 88(sp)
    ld      s4, 96(sp)
    ld      s5, 104(sp)
    ld      s6, 112(sp)
    ld      s7, 120(sp)
    addi    t0, t0, -1
    bnez    t0, 1b
    rdtime  t0
    sub     a0, t0, t1
    ret

编译

riscv64-unknown-linux-gnu-gcc -march=rv64imafdc -mabi=lp64d -static -o main main.c test.S

测试

./main
cycle: 2706

经过rdtime统计得到的结果是2706个计数值,那么rdtime的参考频率是多少?
可以通过timebase-frequency的值来确定。

结果分析

> xxd /proc/device-tree/cpus/timebase-frequency
00000000: 019b fcc0                                ....

timebase-frequency是以大端形式存放的,实际的值应该是 27000000

timebase

如果CPU是固定以1.6GHz工作的,那么就可以计算出实际的cycle数:

>>> 2706/27000000*1600000000
160355.55555555556

从测试的结果可以看出,代码中大约执行160000次ld指令,推算得出大约耗时160355 cycle,结果也是比较合理的。