备忘录:Camulator与Simpleperf(硬件实测)的对比实验
2026/6/10 10:52:06 网站建设 项目流程

这两周初步做了一些验证 Camulator 准确性的实验。由于实验中有较为繁琐的命令以及容易遗忘的细节,为此写了一篇备忘录,为以后的实验作为参考。

Camulator 的技术路线如下图:

简单来说,路径一先使用 DynamoRIO 在手机上获取测试程序的 trace ,经过一个转换程序将源 trace (包含机器码)转换成可供 Camulator 处理的 trace(包含 PC,访存地址以及读写标志位)。将 trace 输入到 Camulator 之后,可以获得各层级 cache 的数据,这里我们主要用到 cache miss 相关的数据。路径二将测试程序 push 到手机中,直接使用 Simpleperf 获取各层级 cache 的数据,以此数据作为真实硬件的 baseline。将两条路径获得的数据做对比,如果误差在可接受范围内,那么即可验证 Camulator 具有足够的准确性。

由于当前版本的 Camulator 存在一定的问题,例如输入较大的 trace 会进入死循环。本次实验采用轻量级的 bench——mibench。mibench 的指令数相对 SPEC 较少,大部分 bench 在一亿条左右。

以下将详细说明整个实验的流程以及细节。

1. 将测试程序通过 adb push 到安装好 DynamoRIO 的手机中。

adb push mibench /data/local/tmp/

2.在 adb shell 下使用 DynamoRIO 获取程序的 trace。

./dynamorio-aarch64-android/bin64/drrun -c ./dynamorio-aarch64-android/api/bin/libinstrace_simple.so -- ./mibench/susan ./mibench/input_large.pgm ./mibench/output_large.smoothing.pgm -s

注:

(1) DynamoRIO 使用:[DynamoRIO 可执行程序] -c [插件] -- [测试程序] [命令行参数]

(2) DynamoRIO 在运行完成后会显示获取了多少条 trace,为确保不会出现 Simpleperf 和 DynamoRIO 处理相同程序但指令数相差巨大的问题(该问题可能与 openmp 线程库相关,Simpleperf 会在运行程序时插入大量的 do_wait,目前暂无解决方法),可使用 Simpleperf 获取程序运行的指令数。

simpleperf stat -e instructions:u ./lyh/mibench/susan ./lyh/mibench/input_large.pgm ./lyh/mibench/output_large.smoothing.pgm -s

3. 退出 adb shell ,并将获取到的 trace pull 到 PC 中

adb pull /data/local/tmp/dynamorio-aarch64-android/api/bin/instrace.susan.30206.0000.log

4. 使用 trace_transform 工具将源 trace 转换成可供 Camulator 处理的 trace。

./trace_transform [input_trace] [output_trace]

5. 设置 Camulator 配置文件,以下是 Cortex A-78 的配置。

{ "record_cmd_trace": "off", "print_cmd_trace": "off", "cpu_tick": 4, "mem_tick": 1, "early_exit": false, "expected_limit_insts": 0, "warmup_insts": 0, "standard": "LPDDR4", "channels": 1, "ranks": 1, "speed": "LPDDR4_1600", "org": "LPDDR4_8Gb_x16", "translation": "None", "llc": { "size": 2048, "assoc": 16, "block_size": 64, "mshr_num": 20, "target_list": 18, "latency": 42, "prefetch": "Spatial", "prefetch_on_miss": false, "replacement": "LRU" }, "clusters": [ { "cluster_cache_id": 0, "cores": [ { "inst_cache": { "size": 64, "assoc": 4, "block_size": 64, "mshr_num": 4, "target_list": 20, "latency": 2, "prefetch": "Sequential", "prefetch_on_miss": false, "replacement": "LRU" }, "data_cache": { "size": 64, "assoc": 4, "block_size": 64, "mshr_num": 4, "target_list": 20, "latency": 4, "prefetch": "Sequential", "prefetch_on_miss": false, "replacement": "LRU" } } ], "shared_cache": { "size": 256, "assoc": 8, "block_size": 64, "mshr_num": 20, "target_list": 18, "latency": 14, "prefetch": "Sequential", "prefetch_on_miss": false, "replacement": "LRU" } } ] }

6. 运行 Camulator 处理的 trace。

./camulator ./config_CortexA-78.json --stats ./report/susan_report.txt trace/t_susan

注:

(1) Camulator 使用:./camulator [config] --stats [input] [trace]

(2) 输入 trace 文件数要与配置文件中的核数保持一致

7. 使用 Simpleperf 获取测试程序各层级 cache 缺失。

taskset 10 simpleperf stat -e raw-l1i-cache:u,raw-l1i-cache-lmiss:u,raw-l1d-cache-rd:u,raw-l1d-cache-lmiss-rd:u ./patricia ./small.udp taskset 10 simpleperf stat -e raw-l2d-cache-rd:u,raw-l2d-cache-lmiss-rd:u,raw-l3d-cache-rd:u,raw-l3d-cache-lmiss-rd:u ./patricia ./small.udp

注:

(1) Simpleperf 使用:taskset [锁核] simpleperf stat -e [事件] [测试程序] [命令行参数]

(2) 关于锁核:taskset 0000 0000,每个数字分别代表一个核,从左到右是cpu7至cpu0,如果那一位是1,就代表用这个核运行。实验中锁在了 CPU 4 上。

(3) event 事件后面要加 ‘:u’ 使 Simpleperf 只记录用户态的的数据,':k' 记录内核态。因为 DynamoRIO 只能获取用户态的 trace ,所有这里要使用 :u 。

得到的结果如图:

第一次实验数据记录:

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询