Checkpoint 的生成和运行
Note
Checkpoint 相关的功能目前依赖于一个独立的 NEMU 分支。主线上的 NEMU 并不支持 Checkpoint 生成。
背景介绍
如果您对 Checkpoint 不了解,推荐 zyy 大佬的视频:Checkpoint + Sampling:10 小时内估算出 RISC-V CPU 的 SPEC 分数
使用 NEMU 生成 Checkpoint
环境准备
- NEMU (cpt-bk 分支)
- workload (非 可执行文件格式,需使用 objcopy 命令进行处理)
关于 NEMU 如何使用,以及如何生成 workload,请参考 NEMU 和香山的相关文档。
其他准备:
- NEMU 拥有一个 submodule
NEMU/resource/simpoint,使用git submodule update --init下载同步,并编译(analysiscode目录下执行make simpoint),得到可执行文件NEMU/resource/simpoint/bin/simpoint - 在
NEMU/resource/gcpt_restore目录下执行make命令编译 - 在
NEMU目录下执行make ISA=riscv64 XIANGSHAN=1生成 NEMU 的可执行文件。
流程介绍
生成 Simpoint Checkpoint 分三步:
- Profiling 采样,执行一轮 workload,收集程序行为信息
- Cluster 聚类,得到权重最高的多个程序片段(节点)
- Checkpointing 生成,再执行一轮 workload,根据聚类的结果生成对应的 Checkpoint
执行命令
RTFSC:NEMU 的参数
Checkpoint 相关参数介绍:
-D:生成 Checkpoint 的工作根目录,会自动创建指定目录,可以任取-C:描述任务的名字(上节三步流程的 Profiling 和 Cluster 等),可以任取-w:workload 的名字,可以任取--simpoint-profile:进行 Profiling,用于 Profiling 环节--interval:采样的区间大小,以指令数为单位,用于 Profiling 环节-S:指定 Cluster 环节的结果,用于 Checkpointing 环节--checkpoint-interval:生成 Checkpoint,同时设置 Checkpoint 的区间,需和 “--interval” 参数保持一致,用于 Checkpointing 环节
命令示例:
# Assuming the dest dir is /home/user/spec_cpt
# Profiling
riscv64-nemu-interpreter workload.bin -D /home/user/spec_cpt -w workloadName -C profiling -b --simpoint-profile --interval 100000000
# Cluster
mkdir -p /home/user/spec_cpt/cluster/workloadName
# Run this command under /home/user/spec_cpt/cluster/workloadName
# --!!-- make sure the simpoint_bbv.gz is for your target workload --!!--
simpoint -loadFVFile ../../simpoint_bbv.gz -saveSimpoints simpoints0 -saveSimpointWeights weights0 -inputVectorsGzipped -maxK 30 -numInitSeeds 2 -iters 1000 -seedkm 123456 -seedproj 654321
# Checkpointing
riscv64-nemu-interpreter workload.bin -D /home/user/spec_cpt -w workloadName -C take_cpt -b -S /home/user/spec_cpt/cluster --checkpoint-interval 100000000
其他注意事项
默认情况下,NEMU 不会进入 Checkpoint 模式,需要执行 NEMU 自定义指令进入 Checkpoint 模式。
RTFSC: nemu_trap
解析:
NEMU 使用 nemu_trap 指令(0x6b)表示程序执行结束 或 进行 Checkpoint 模式切换等行为,并根据 a0 寄存器进行判断。Profiling 时需要关闭时间中断,并打开 Simpoint Profiler;生成 Checkpoint 时,需要关闭时间中断。在执行 workload 之前(或者在 linux 环境下执行 workload 之前),需要执行相应的 nemu_trap 指令进行模式切换。
PS: 如果您对 Checkpoint 生成流程有疑问,欢迎提 issue 进行讨论。