gem5 SE模式恢复检查点触发事件调度断言失败如何解决?
问题根因
- 内存系统结构不匹配:创建检查点时使用无缓存的直连内存架构,恢复时新增了L1/L2缓存、步长预取器组件,两类场景的内存访问延迟逻辑完全不同。gem5 21.1版本在恢复检查点初始化新增缓存组件时,部分事件的触发时间是基于无缓存场景的旧基准计算,没有和恢复点的当前tick对齐,出现事件触发时间早于当前时间的情况,触发
when >= getCurTick()断言失败。 - CPU模型切换的时序漏洞:创建检查点用的AtomicSimpleCPU为原子访问模型,本身不模拟真实时序延迟,而恢复时用的O3是时序CPU,21.1版本的检查点恢复逻辑没有处理两种CPU模型切换时的事件时序校验重算逻辑,也会导致非法时序事件被调度。
解决方案
- 方案1:创建检查点时就复用恢复阶段的缓存配置,在创建检查点的命令行中添加和恢复命令完全一致的
--caches、--l2cache、缓存容量/关联度/行大小、预取器参数,仅保留创建阶段的--cpu-type AtomicSimpleCPU配置即可,保证内存系统结构完全匹配,即可正常恢复。 - 方案2:若不希望修改创建检查点的逻辑,可将gem5版本升级到22.1及以上,该版本已修复跨内存架构恢复检查点的时序对齐问题,直接使用原有的创建、恢复命令即可正常运行。
- 方案3:若无法升级版本,可在恢复命令行中添加
--cpu-switch-delay=1000000参数,给CPU切换和缓存组件初始化预留足够的时间间隙,避免调度的事件时间早于当前恢复点tick。
内容的提问来源于stack exchange,提问作者Gelin Fu
相关产品推荐
相关产品推荐

