【发布时间】:2020-05-19 17:55:27
【问题描述】:
我想检测一个程序来访问硬件性能计数器。
我已经编译了一个基本的 Rocketchip (freechips.rocketchip.system-DefaultConfig) 并使用 riscv-pk 运行一个二进制文件。我正在 Verilator 中运行内核的模拟,并在 UCB Chipyard 项目中使用大部分默认值编译它。
二进制的C如下:
#include <stdio.h>
#define CACHE_MISS 0x100
int loop(int n, int a) {
int b = 0;
for(int i=0; i<n; i++) {
b = a + b;
}
return b;
}
int main() {
int a = 1;
int n = 200;
int count = 0;
printf("Configuring event monitor ...\n");
/*
// initialize counters here
// should start tracking cache misses with 0x100
__asm__ volatile("csrw mhpmevent3, %0"
:
: "r"(CACHE_MISS)
);
*/
printf("Executing loop ...\n");
loop(n, a);
printf("Reading event counter ...\n");
// read counters here
__asm__ volatile("csrr %0, hpmcounter3"
: "=r"(count)
);
printf("Cache misses: %d\n", count);
return 0;
}
这是一个基本代码,只是为了看看我是否可以计算缓存未命中。这段代码给了我一个“非法指令”错误。
z 0000000000000000 ra 00000000000101e0 sp 000000000fee9b00 gp 000000000001e560
tp 0000000000000000 t0 0000000000000000 t1 000000000000000f t2 0000000000000000
s0 000000000fee9b20 s1 0000000000000000 a0 00000000000000c8 a1 0000000000000001
a2 0000000000000000 a3 0000000000000010 a4 00000000000000c8 a5 00000000000000c8
a6 000000000000001f a7 0000000000000000 s2 0000000000000000 s3 0000000000000000
s4 0000000000000000 s5 0000000000000000 s6 0000000000000000 s7 0000000000000000
s8 0000000000000000 s9 0000000000000000 sA 0000000000000000 sB 0000000000000000
t3 0000000000000000 t4 0000000000000000 t5 0000000000000000 t6 0000000000000000
pc 00000000000101e0 va 00000000b03027f3 insn b03027f3 sr 8000000200046020
An illegal instruction was executed!
最初从hpmcounter3 读取的行是从mhpmcounter3 读取的,并导致相同的错误。
与另一位开发人员交谈,一个可能的原因是riscv-pk 在 U 模式下运行二进制文件,因此在调用 m* 汇编指令(在机器、M 模式下运行)之后的非法指令是期待。因此,我更改了二进制文件以注释掉对 mphmevent3 的第一次写入,并且只是从 hpmcounter3 进行了裸读,但仍然得到非法指令错误。这个结果的理论是mcounteren 和scounteren 寄存器没有启用,所以我不能访问计数器。但是,查看riscv-pk 的minit.c 内部,我发现:
// Enable user/supervisor use of perf counters
if (supports_extension('S'))
write_csr(scounteren, -1);
if (supports_extension('U'))
write_csr(mcounteren, -1);
我不确定,但我觉得这会启用计数器。
对我应该如何访问硬件性能计数器有什么想法吗?
【问题讨论】:
标签: riscv