如何仅针对 gem5 中来宾源代码的给定兴趣区域分析统计信息?
How to analyze stats only for a given interest area of guest source code in gem5?
我已经开始使用 gem5 从缓存未命中或 dram 访问的角度弄清楚发生了什么。
我发现存在 m5_checkpoint, m5_reset_...
那么,要打印出感兴趣区域的“统计信息”,我如何在下面的示例中使用这些 API??
int main(void) {
init() // I don't care what happens here
run() // This function is what I want to analyze
return 0;
}
密切相关的问题:How to count the number of CPU clock cycles between the start and end of a benchmark in gem5?
通过阅读 m5
工具的源代码,您可以看到它只是使用魔法(通常未分配)指令,或对魔法(通常未映射)内存地址进行内存访问。
因此,例如对于指令,您可以只插入那些带有 .inst
和内联汇编的指令,通常按顺序:
resetsats
在感兴趣区域之前
dumpstats
之后
最干净的方法是实际包含 m5
CLI 工具使用的 gem5 源代码中的 m5ops.h
header,但我发现有时自己手动编码更容易。
例如,对于 aarch64,它们看起来像:
/* resetstats */
__asm__ __volatile__ ("mov x0, #0; mov x1, #0; .inst 0XFF000110 | (0x40 << 16);" : : : "x0", "x1")
/* dumpstats */
__asm__ __volatile__ ("mov x0, #0; mov x1, #0; .inst 0xFF000110 | (0x41 << 16);" : : : "x0", "x1")
这里是:
我已经开始使用 gem5 从缓存未命中或 dram 访问的角度弄清楚发生了什么。
我发现存在 m5_checkpoint, m5_reset_...
那么,要打印出感兴趣区域的“统计信息”,我如何在下面的示例中使用这些 API??
int main(void) {
init() // I don't care what happens here
run() // This function is what I want to analyze
return 0;
}
密切相关的问题:How to count the number of CPU clock cycles between the start and end of a benchmark in gem5?
通过阅读 m5
工具的源代码,您可以看到它只是使用魔法(通常未分配)指令,或对魔法(通常未映射)内存地址进行内存访问。
因此,例如对于指令,您可以只插入那些带有 .inst
和内联汇编的指令,通常按顺序:
resetsats
在感兴趣区域之前dumpstats
之后
最干净的方法是实际包含 m5
CLI 工具使用的 gem5 源代码中的 m5ops.h
header,但我发现有时自己手动编码更容易。
例如,对于 aarch64,它们看起来像:
/* resetstats */
__asm__ __volatile__ ("mov x0, #0; mov x1, #0; .inst 0XFF000110 | (0x40 << 16);" : : : "x0", "x1")
/* dumpstats */
__asm__ __volatile__ ("mov x0, #0; mov x1, #0; .inst 0xFF000110 | (0x41 << 16);" : : : "x0", "x1")
这里是: