计算机系统模拟技术:从单处理器到多处理器
1. 二进制插桩技术对比
1.1 PIN 和 ATOM 的工作原理
PIN 和 ATOM 都是用于二进制插桩的工具。ATOM 采用传统方法,而 PIN 采用即时(JIT)编译方法。PIN 以基准二进制文件和插桩例程作为输入,其运行时环境会拦截程序每个基本块中执行的第一条指令,然后自动为二进制文件中的每个基本块动态生成新代码,并将带有插桩的新代码写入内存中的代码缓存。处理器直接从代码缓存中获取指令,而不会意识到实际的基准二进制文件。
1.2 直接执行的开销
直接通过二进制插桩执行存在一些开销。当 ATOM 对二进制文件进行插桩时,插桩代码本身需要额外的架构寄存器来执行,因此 ATOM 必须保存插桩代码使用的所有寄存器,并在退出插桩代码后恢复它们,这导致直接执行期间存在大量的寄存器分配开销。而 PIN 可以在插桩前分析代码,确定哪些寄存器是活跃的,哪些是空闲的,JIT 编译器首先选择空闲寄存器来执行插桩代码,而不会溢出程序使用的寄存器,这种动态插桩提供了更多的运行时可见性,从而实现更好的代码优化。然而,PIN 会对同一代码序列多次支付 JIT 编译代价,而 ATOM 每次重新编译只支付一次编译代价,且没有额外的运行时编译成本。
2. 模拟器集成方法
2.1 功能优先模拟器集成
功能优先模拟是一种将周期精确模拟器和全系统模拟器集成的方法,以获得具有详细微架构和时序模拟的全系统模拟器。在这种集成中,全系统功能模拟器执行基准测试并生成指令序列,同时维护目标机器架构状态的副本。执行每条指令后,它会更新其架构状态,然后将指令送入模拟器的时序部分进行微架构模拟并跟踪时序。时序模拟器也会维护自己的架构状态副本,用于周期精确模拟。
例如,SimWattch 就是一个成功的功能优先模拟器集成示例,它将行业标准的 Simics 与跟踪性能和功耗的学术版 SimpleScalar Wattch 集成在一起。
2.2 时序优先模拟器集成
时序优先模拟是功能优先模拟器集成的替代方法。在这种方法中,时序模拟器在功能模拟器之前运行,它通过仔细模拟目标微架构配置在周期级别执行指令。时序模拟器不必忠实地执行所有指令,对于一些很少执行但具有复杂微架构交互的指令,可以忽略其模拟以简化开发和验证。
时序模拟器必须针对功能模拟器验证每条指令的功能执行。即将提交的指令会与功能模拟器进行验证,验证内容包括比较时序模拟器和功能模拟器的架构状态。如果匹配,时序模拟器会退休该指令;如果不匹配,则将功能模拟器的架构状态复制到时序模拟器中,并刷新流水线,在异常指令之后立即重新开始指令获取。
GEMS 和 FeS2 是时序优先全系统模拟器的例子。GEMS 模拟 SPARC ISA,FeS2 模拟 x86 ISA,它们都使用 Simics 作为功能模拟器。GEMS 的时序模拟器模块可以模拟内存层次结构或详细的乱序处理器,通过组合不同的模块,可以模拟详细的内存和处理器模型。
3. 多处理器模拟器
3.1 多处理器模拟的挑战
随着芯片多处理器的出现,模拟目标 CMP 系统成为新的挑战。与单处理器模拟不同,多处理器模拟中不同目标核心之间会相互交互,这些交互可能发生在片上互连网络或目标线程之间的值交换中,准确模拟这些交互使得多处理器模拟比单处理器模拟更具挑战性。
3.2 顺序多处理器模拟器
在顺序模拟中,所有目标核心在单个模拟器线程中进行模拟,模拟器通常以轮询方式循环进行模拟。它先模拟目标核心 0 的一个周期,然后是目标核心 1 的一个周期,依此类推。在每个周期内,模拟器依次模拟每个核心的活动,推进其流水线一个周期并模拟私有缓存。完成所有核心的一个周期模拟后,模拟器会模拟该周期内发生的任何全局事件,如缓存缺失或核心间通信事件,然后进入下一个模拟周期。
一些知名的顺序多处理器模拟器工具包括 RSIM、M5、MINT、GEMS、SESC 和 Zesto 等。RSIM 是第一个广泛可用的模拟具有乱序执行核心的多处理器的模拟器,但无法执行复杂的工作负载。M5 是面向网络的全系统模拟器,具有详细的乱序 SMT 处理器模型。SESC 可以模拟不同的处理器架构。GEMS 可以将模拟的功能和时序方面解耦,通过 Ruby 模拟内存层次结构,通过 Opal 模拟详细的乱序处理器。
此外,Rice 并行处理测试台(RPPT)是早期的多处理器模拟器之一,它通过在主机硬件上直接执行基准代码并选择性地模拟处理器间通信事件来实现模拟加速。它使用编译器分析或用户提供的注释来识别基准代码中不同线程交互的点,将本地执行的代码划分为基本块,并根据目标处理器配置估计每个基本块的执行周期数。
3.3 并行多处理器模拟器
为了解决单线程模拟的可扩展性问题,并行多处理器模拟器得到了广泛研究。在并行模拟中,每个目标核心在单独的模拟器线程中进行模拟,多个模拟器线程映射到主机核心。这种方法在性能和编程方面都具有可扩展性。
并行 CMP 模拟的速度依赖于四个层面的有效实现:应用(基准)层、目标硬件层、主机硬件层和模拟层。在应用层,模拟加速受算法加速的限制;在目标硬件层,如果目标 CMP 架构存在设计瓶颈或内存架构效率低下,并行模拟将无法发挥作用;在主机硬件层,主机 CMP 必须具备有效执行并行模拟的资源。
在模拟层,主要的问题是模拟核心的主机线程之间的交互和过度同步。为了解决这个问题,人们探索了多种并行离散事件模拟(PDES)技术,包括保守方法和乐观方法。
保守方法的关键思想是通过仔细控制模拟进度来避免任何时序违规,但可能导致模拟效率低下。其中,最严格的保守方法是按目标中事件发生的精确顺序模拟事件,这种方法几乎没有并行性。更宽松的保守方法包括前瞻和屏障同步。前瞻是指模拟事件未来的最大时间量,使得模拟线程可以安全地执行该事件而不会发生时序违规。屏障同步是将模拟划分为由多个时间单位组成的时间间隔,这些间隔由同步屏障分隔,在一个时间间隔内,所有模拟线程可以独立推进,直到到达屏障。
乐观方法则通过加速模拟来提高效率,但可能导致因果违规。当检测到时序违规时,模拟必须回滚以恢复因果关系。乐观方法会定期对模拟状态进行检查点,并检测时序违规,当检测到违规时,将模拟回滚到最近的检查点,并从该检查点以安全模式重新运行模拟。
在多处理器模拟中,保守方法应用更为广泛,其中基于屏障同步的量子模拟和松弛模拟是两种值得注意的方法。
3.3.1 量子模拟
量子模拟是一种常见的并行模拟方法,它将模拟划分为由多个模拟周期组成的时间间隔,这些间隔由同步屏障分隔,这个时间间隔称为量子。在一个量子内,所有模拟线程可以独立推进,直到到达屏障。在进入下一个间隔之前,当前间隔内触发的所有全局事件必须对所有模拟核心可见,以便在后续间隔中模拟其影响。
与周期精确模拟(CC)相比,量子模拟减少了同步屏障的数量,从而提高了模拟效率。然而,模拟速度仍然受每个量子内最慢线程的限制。量子模拟的准确性取决于量子的大小,当量子大小不超过目标核心生成的事件传播到可能影响另一个核心模拟的点所需的最小延迟(即关键延迟)时,量子模拟被认为与 CC 模拟一样准确。
例如,Wisconsin Wind Tunnel II 是一个使用屏障同步的知名并行模拟器,它是一个直接执行的离散事件模拟器,可以在共享内存多处理器或工作站网络上执行。
3.3.2 松弛模拟
松弛模拟是另一种并行模拟范式,在这种模拟中,模拟核心不像 CC 模拟那样在每个模拟周期后同步,也不像量子模拟那样在固定数量的周期后同步,而是被赋予一个松弛值。松弛值定义为模拟中任意两个目标核心之间的周期计数差。小的松弛值(如几个周期)可以大大减少模拟线程之间的同步量,从而提高模拟效率,且模拟误差可以忽略不计。
在有界松弛模拟方案中,线程之间的最大松弛值是有界的,但模拟线程不会在屏障处定期同步。最大松弛限制迫使所有模拟线程保持在一个周期窗口内,只要最快和最慢目标核心之间的差异在松弛范围内,每个目标核心就可以继续执行。当最快目标核心比最慢目标核心领先 S 个周期时,最快目标核心模拟器会等待最慢线程前进。
以下是一个 mermaid 流程图,展示了并行多处理器模拟的基本流程:
graph LR
A[开始模拟] --> B[初始化目标核心和线程]
B --> C{选择模拟方法}
C -- 顺序模拟 --> D[单线程轮询模拟核心]
D --> E[模拟核心活动]
E --> F[模拟全局事件]
F --> G{是否完成模拟}
G -- 否 --> D
G -- 是 --> H[结束模拟]
C -- 并行模拟 --> I[多线程独立模拟核心]
I --> J{选择同步方法}
J -- 量子模拟 --> K[按量子同步线程]
K --> L[模拟核心活动]
L --> M[处理全局事件]
M --> N{是否完成模拟}
N -- 否 --> K
N -- 是 --> H
J -- 松弛模拟 --> O[按松弛值同步线程]
O --> P[模拟核心活动]
P --> Q[处理全局事件]
Q --> R{是否完成模拟}
R -- 否 --> O
R -- 是 --> H
以下是一个表格,总结了不同模拟器集成方法和多处理器模拟方法的特点:
| 方法 | 特点 | 优点 | 缺点 |
| — | — | — | — |
| 功能优先模拟器集成 | 功能模拟器先执行,然后将指令传递给时序模拟器 | 可以获得详细的微架构和时序模拟 | 开发工作量大 |
| 时序优先模拟器集成 | 时序模拟器先运行,与功能模拟器验证指令 | 可以简化开发和验证 | 可能需要处理异常情况 |
| 顺序多处理器模拟 | 单线程轮询模拟核心 | 可以准确模拟核心间交互 | 性能扩展性差 |
| 并行多处理器模拟 - 量子模拟 | 多线程按量子同步 | 提高模拟效率 | 受最慢线程限制 |
| 并行多处理器模拟 - 松弛模拟 | 多线程按松弛值同步 | 减少同步,提高效率 | 实现复杂 |
4. 模拟技术对比总结
4.1 二进制插桩工具对比
| 工具 | 编译方法 | 寄存器处理 | 编译代价 | 代码优化 |
|---|---|---|---|---|
| ATOM | 传统方法 | 需保存和恢复插桩代码使用的寄存器,有较大寄存器分配开销 | 每次重新编译支付一次编译代价,无额外运行时编译成本 | 相对较差 |
| PIN | 即时(JIT)编译方法 | 可分析代码,选择空闲寄存器执行插桩代码,减少寄存器溢出 | 同一代码序列多次支付 JIT 编译代价 | 动态插桩提供更多运行时可见性,代码优化更好 |
4.2 模拟器集成方法对比
| 集成方法 | 运行顺序 | 执行指令情况 | 验证方式 | 示例 |
|---|---|---|---|---|
| 功能优先模拟器集成 | 功能模拟器先执行,再将指令传递给时序模拟器 | 功能模拟器执行基准测试生成指令序列 | 无 | SimWattch(集成 Simics 和 Wattch) |
| 时序优先模拟器集成 | 时序模拟器先运行,与功能模拟器验证指令 | 时序模拟器不必忠实地执行所有指令,可忽略部分复杂指令 | 比较时序模拟器和功能模拟器的架构状态 | GEMS、FeS2(使用 Simics 作为功能模拟器) |
4.3 多处理器模拟方法对比
| 模拟方法 | 线程执行方式 | 同步特点 | 效率 | 准确性 | 缺点 |
|---|---|---|---|---|---|
| 顺序多处理器模拟 | 单线程轮询模拟核心 | 按顺序依次模拟各核心周期 | 低,随着核心数增加性能扩展性差 | 可准确模拟核心间交互 | 性能差 |
| 并行多处理器模拟 - 量子模拟 | 多线程独立模拟核心 | 按量子(多个模拟周期组成的时间间隔)同步线程 | 较高,减少了同步屏障数量 | 当量子大小不超过关键延迟时与 CC 模拟一样准确 | 受每个量子内最慢线程限制 |
| 并行多处理器模拟 - 松弛模拟 | 多线程独立模拟核心 | 按松弛值(模拟中任意两个目标核心之间的周期计数差)同步线程 | 高,大大减少模拟线程之间的同步量 | 模拟误差可忽略不计 | 实现复杂 |
5. 模拟技术的应用场景分析
5.1 二进制插桩工具应用场景
- ATOM :适用于对编译代价敏感,且对代码优化要求不高的场景。例如,在一些简单的性能分析场景中,只需要对二进制文件进行基本的插桩,且希望编译成本较低,ATOM 是一个不错的选择。
- PIN :适合需要对代码进行精细优化,且对运行时可见性有较高要求的场景。比如在复杂的程序调试和性能优化中,PIN 可以通过动态插桩分析代码,选择合适的寄存器执行插桩代码,从而实现更好的代码优化。
5.2 模拟器集成方法应用场景
- 功能优先模拟器集成 :当需要获得详细的微架构和时序模拟,且对系统整体功能模拟有较高要求时,功能优先模拟器集成是合适的选择。例如,在设计一个新的全系统架构时,需要对系统的各个方面进行详细模拟,功能优先模拟器集成可以提供更全面的信息。
- 时序优先模拟器集成 :对于一些开发和验证工作量较大的项目,时序优先模拟器集成可以简化开发和验证过程。特别是在处理一些很少执行但具有复杂微架构交互的指令时,忽略这些指令的模拟可以提高开发效率。
5.3 多处理器模拟方法应用场景
- 顺序多处理器模拟 :在目标核心数量较少,且对核心间交互模拟准确性要求极高的情况下,顺序多处理器模拟可以满足需求。例如,在一些早期的多处理器系统设计验证阶段,使用顺序多处理器模拟可以确保核心间交互的准确模拟。
- 并行多处理器模拟 - 量子模拟 :当目标核心数量较多,且希望在一定程度上提高模拟效率时,量子模拟是一个较好的选择。例如,在大规模多处理器系统的性能评估中,量子模拟可以通过减少同步屏障数量来提高模拟速度。
- 并行多处理器模拟 - 松弛模拟 :对于对模拟效率要求极高,且可以接受一定实现复杂度的场景,松弛模拟可以发挥其优势。比如在一些实时性要求较高的多处理器系统模拟中,松弛模拟可以通过减少同步量来提高模拟效率。
6. 模拟技术的未来发展趋势
6.1 性能提升
随着计算机硬件性能的不断提升,模拟技术也将朝着更高性能的方向发展。未来的模拟工具将能够更快速地完成大规模多处理器系统的模拟,减少模拟时间。例如,通过优化并行模拟算法,进一步提高并行多处理器模拟的效率,减少同步开销。
6.2 准确性提高
模拟技术的准确性将不断提高,能够更精确地模拟计算机系统的各种行为。未来的模拟器将能够考虑更多的因素,如硬件故障、电源管理等,从而提供更真实的模拟结果。例如,在多处理器模拟中,能够更准确地模拟核心间的交互和通信,减少模拟误差。
6.3 集成化发展
不同的模拟技术将更加紧密地集成在一起,形成一个更加完整的模拟平台。例如,二进制插桩工具、模拟器集成方法和多处理器模拟方法将相互配合,为用户提供一站式的模拟解决方案。用户可以根据自己的需求选择不同的模拟技术进行组合,实现更高效、更准确的模拟。
6.4 智能化应用
模拟技术将与人工智能技术相结合,实现智能化的模拟。例如,通过机器学习算法对模拟数据进行分析,自动调整模拟参数,提高模拟效率和准确性。同时,人工智能技术还可以帮助用户更好地理解模拟结果,提供更有价值的决策支持。
以下是一个 mermaid 流程图,展示了模拟技术选择的基本流程:
graph LR
A[确定模拟需求] --> B{是否需要二进制插桩}
B -- 是 --> C{对编译代价和代码优化要求}
C -- 编译代价敏感,代码优化要求低 --> D[选择 ATOM]
C -- 对代码优化要求高 --> E[选择 PIN]
B -- 否 --> F{是否需要模拟器集成}
F -- 是 --> G{对微架构和时序模拟要求}
G -- 要求详细微架构和时序模拟 --> H[选择功能优先模拟器集成]
G -- 希望简化开发和验证 --> I[选择时序优先模拟器集成]
F -- 否 --> J{是否为多处理器模拟}
J -- 是 --> K{核心数量和对效率要求}
K -- 核心数量少,对交互准确性要求高 --> L[选择顺序多处理器模拟]
K -- 核心数量多,希望提高效率 --> M{对实现复杂度接受程度}
M -- 可接受一定复杂度 --> N[选择松弛模拟]
M -- 希望减少同步开销 --> O[选择量子模拟]
J -- 否 --> P[选择其他单处理器模拟方法]
综上所述,计算机系统模拟技术在不断发展和完善,不同的模拟技术适用于不同的场景。了解这些模拟技术的特点和应用场景,有助于我们在实际应用中选择合适的模拟方法,提高模拟效率和准确性,为计算机系统的设计和优化提供有力支持。
多处理器模拟技术解析
超级会员免费看
1558

被折叠的 条评论
为什么被折叠?



