Page 45 - 《软件学报》2025年第9期
P. 45
3956 软件学报 2025 年第 36 卷第 9 期
非包含非排他性 (non-inclusive) 缓存. 在缓存一致性协议上, 支持基于广播的和基于目录的 MSI 和 MESI 缓存一
致性协议. 此外, 还支持抵御侧信道攻击对缓存进行分区的 skewed cache 以及 Mirage Cache [17] . 用户在使用时可以
任意地对不同的缓存特性进行组合, 这是目前其他的处理器模拟器中的缓存模型或单独的缓存模拟器做不到的.
(2) 模块化、易扩展. 该缓存模型采用标准的面向对象设计, 将缓存的各个功能组件进行了抽象、包装和模块
化. 用户在使用时可以在原有代码的基础上轻松地设计和扩展出其他的缓存结构. 以支持实现排他性缓存为例, 该
缓存模型在缓存一致性的部分上只需修改几个函数即可.
(3) 可集成性强. 新修改的缓存模型实际是作为 Spike 的一个子模块与 Spike 进行集成. 因此它还可以作为单
独的缓存模拟器只针对缓存的行为进行仿真. 实际上它还可以与任何的体系结构模拟器进行集成和仿真.
(4) 高性能、仿真准确性高. 该缓存模型对比执行驱动型模拟器 ZSim [19] 的缓存模型在对缓存行为模拟上具有
明显的性能优势. 此外, 在相同的缓存配置与仿真程序下, 与 gem5 仿真得到的末级缓存每千条指令的缓存缺失数
的 KL 散度 (Kullback-Leibler divergence, KL Divergence) 相比, 其他模拟器最小.
本文第 1 节是相关工作介绍, 简要介绍目前国内外现有的处理器模拟器及其支持的缓存特性以及只支持缓存
行为仿真的缓存模拟器, 并比较这些模拟器支持的缓存特性与本文设计的缓存模型的相同点和不同点. 第 2 节介
绍缓存模型的架构实现, 分别对通信端口和协议、缓存的结构、元数据、数据、缓存一致性协议以及如何单独使
用等部分进行阐述. 第 3 节介绍新的缓存模型 FlexiCAS 接入 Spike 时具体做了哪些改动. 第 4 节解释 Spike-
FlexiCAS 如何验证一致性协议的正确性, 评估 Spike-FlexiCAS 在不同配置下的性能以及使用 SPEC CPU2006 测
试集和 PARSEC 测试集 [20] 评估各处理器模拟器的运行速度. 最后是本文的总结与展望.
本文设计的缓存模型 FlexiCAS 以及与 Spike 集成后的 Spike-FlexiCAS 的代码可以通过以下链接获得:
(1) https://github.com/comparch-security/FlexiCAS; (2) https://github.com/comparch-security/spike-flexicas.
1 相关工作
自 20 世纪 90 年代以来, 学术界中出现了一些模拟器可以被用于缓存的研究 [21] . 从功能上区分, 缓存模拟器
可以被分为行为级模拟器 (behavior simulator) 和时序级模拟器 (timing simulator) 两类. 行为级模拟器不包含时钟,
只在逻辑上模拟缓存的行为, 主要被用于统计缓存的数据指标 (如命中率、缺失率等) 以及验证缓存架构的正确
性. 时序级模拟器则通常包含详细的微架构模型, 它会模拟每个微架构的操作并记录每个操作花费的时间, 这也导
致时序级模拟器的仿真速度一般慢于行为级模拟器. 缓存模拟器在模拟的模式上可以分为 3 种: 执行驱动 (execution-
driven) 型、仿真驱动 (emulation-driven) 型和仿存序列驱动 (trace-driven) 型. 执行驱动型的模拟器将需要模拟的
程序直接放在本地平台上运行, 这要求程序的指令集架构 (instruction set architectue, ISA) 需要和本地的 ISA 兼容.
仿真驱动型的模拟器则会创建一个虚拟环境来运行程序, 这拖慢了程序的运行速度但可以让 ISA 不兼容的程序在
本地平台运行. 仿存序列驱动型的模拟器将运行过的程序的仿存序列当作输入, 这种模式不存在 ISA 兼容的问题,
使用者获得仿存序列后可以针对不同的缓存配置进行多次仿真而无需再次运行程序, 但生成的仿存序列一般比较
大, 给仿真带来了额外的时间开销.
[2]
gem5 是一个仿真驱动型时序级体系结构模拟器, 它支持对多种 ISA (如 x86、ARM、RISC-V 等) 的程序进
行模拟. gem5 由 M5 和 GEMS 合并而来, 因此它的内存系统中包含了两个缓存模型: Classic 模型以及 Ruby 模型.
Classic 模型只支持基于广播的简化版 MOESI 一致性协议. Ruby 模型则是一个可配置并且高度模块化的缓存模
型, 它使用领域规范语言 SLICC (specification language for implementing cache coherence) 来实现缓存一致性. 使用
SLICC 时需要定义缓存模型的各组件 (如目录、缓存等) 的状态并声明各状态转移时使用的函数. SLICC 使得开
发新的缓存一致性协议成为可能, gem5 中有很多由 SLICC 声明的一致性协议. 但 SLICC 的开发周期较长并且需
要经过大量的测试, 目前还没有其他的模拟器采用 SLICC 来搭建缓存模型. gem5 由于是完整的体系结构模拟器,
代码体系比较庞大, 因此修改缓存结构的工作量也比较大.
Pin [22] 是由 Intel 公司开发的动态二进制插桩框架, 它可以在二进制程序运行的过程中插入各种函数并对程序

