计算机体系结构模拟器简述
在芯片尚未流片,硬件还停留在前端设计时,芯片公司里那些软件开发工程师,已经在一个虚拟的环境上运行起了程序和算法。这个神奇的虚拟环境,就是计算机体系结构模拟器。
前几年,苹果公司在着手开发自研 M 系列处理器时,他们的软件工程师们,并不需要等到自家的芯片从工厂生产出来寄到公司,就能够让新的 MacOS 系统在新硬件上运行起来;而 Intel 的工程师们,他们在针对不同硬件上设计缓存算法时,并不需要机房里运行各种型号的处理器。
这就是计算机体系结构模拟器的魅力。它是一个桥梁,连接着软件设计和硬件设计,使得芯片公司可以让软件团队和硬件团队一起开始在新项目上发力,也可以让架构师们在构想的硬件模型上,验证和优化自己的设计和算法。
什么是计算机体系结构模拟器?
简单来说,计算机体系结构模拟器(以下简称模拟器)是一套软件,这套软件用来重建一台计算机硬件。它可以精确或近似的模拟目标硬件的执行行为,让上层程序以为自己真的运行在一个硬件上。
每一项技术的诞生都有其存在的理由,模拟器的存在用来解决在硬件开发中的几个关键痛点。
时间和成本
传统的硬件开发流程是先进行硬件设计,制造原型,原型测试,流片,硬件点亮,软件研发。其中还要考虑硬件测试的各个环节出现回退的问题,所以通常一款硬件从设计到回片,可能要经历一年到一年半的时间。软件研发如果等待硬件回片后进行,那么实际产品推出的时间只能更晚。
另外,硬件流片的成本很高,动辄几百万美元,如果回片后无法点亮,发现存在系统性故障,重新流片带来的经济损失也将很高。
引入模拟器后,无论对于硬件工程师,还是软件工程师,都具有很大的帮助。硬件工程师可以先在模拟器上进行设计和初步验证,并与硬件仿真的结果做对比,最大可能避免后期生产时的回退。
而软件工程师则可以不用等硬件生产回片,而是在硬件前端定型后,就开启相关的开发工作,软件的开发和调试,可以利用模拟器作为运行环境来完成。由于模拟器足够灵活,所以实际上软件开发在模拟器上调试要比在硬件上调试也更为便捷。
超能力
实际的芯片,对于软件来说,基本是一个黑盒子。软件只能看到输入和输出,除此之外唯一能依靠的就是调试接口(研发早期调试功能也不是最紧迫的)。
软件无法洞察到硬件的细节,而模拟器则提供了另一个思路。
模拟器可以任意设断点、单步运行和回退;模拟器可以打印出任意寄存器、内存、信号量、缓存等信息,甚至软件运行过程中的整个快照;如果有需要,模拟器可以任意调整硬件配置(比如缓存大小)。这些功能都并不依赖于调试工具就可以实现。
另外,模拟器对于一些软件导致的随机问题,可能更容易复现,在一些极端测试下,也更容易发现隐藏在角落的问题。这些功能,让模拟器对软件来说,就像是对硬件开启了 “透视”功能,极大方便软件的开发工作。
风险控制
实际上,现在很多云服务,提供的都是虚拟设备,也就是模拟器的一种,它们将软件服务和硬件设备进一步隔离开,避免了软件的问题直接破坏物理设备。同时,虚拟运行也可以更方便的发现运行问题。
模拟器家族
模拟器作为一类软件,在不同的场合下,其应用方式不同,所以做的也并不是同样的事情。根据不同的需求,工程师们开发了不同的模拟器类型,用于解决各种现实问题。
按范围分类:从微观到宏观
第一种叫微体系结构模拟器。微体系结构是介于处理器体系结构和硬件设计之间的一层,它可以将硬件功能进行抽象。微体系结构模拟器则用来在这一个层面上对硬件功能做模拟。
比如说,它可以专注于模拟流水线行为、缓存行为等,这种模拟器可以计算出分支预测的准确率和缓存命中率,并完整地展现出每一次运行的通信细节。
2000 年初,斯坦福大学的研究人员,使用 SimpleScalar 模拟器,改进了分支预测算法,这个算法后来用在了多个商业处理器上。SimpleScalar 是一个微体系结构模拟器。
第二种叫系统模拟器。它则模拟整个计算机系统,除了处理器本身,它还负责去模拟内存、磁盘、I/O 设备等。这类模拟器强大到其自身就可以启动一个操作系统,并与其他模拟器或硬件设备协同工作。
按精度分类:速度和精度的权衡
模拟器设计中一个永远逃不开的话题,就是更重视速度还是精度。基于此,可以将模拟器分为:功能模拟器、周期精确模拟器和事件驱动模拟器。
功能模拟器只保证结果正确,它在一个较高的尺度下完成硬件模拟,通常在项目的早期会被使用。由于模拟精度不高,所以其运行速度相对较快,可以在 10-100 MIPS 之间。
周期精确模拟器则刚好相反,它可以模拟每一个时钟周期的行为,所以它对硬件细节的刻画最细致,可以用于性能评估、缓存优化等。由于它选择了精度,在运行速度上相对更慢,在 0.1-1 MIPS 之间。
事件驱动模拟器则刚好介于两者之间。它基于硬件事件来仿真,比如网络通信、系统互联等。它的运行速度在 1-10 MIPS 之间。
不过,无论哪种模拟器,都不可能达到硬件的运行速度(通常在上千 MIPS 甚至更高)。
指令集模拟器
指令集模拟器是一种功能模拟器。它专注于一个重要的目标:正确模拟指令的行为。它既可以去精细地按照硬件行为去实现指令,也可以按照逻辑算法来实现指令,最终只保证指令确切的输入,可以产生确切的输出。
更细节一些,指令集模拟器的实现分为几种思路:
| 实现技术 | 工作原理 | 速度 | 灵活性 |
|---|---|---|---|
| 解释执行 | 每读取一条指令,解析一条指令 | 慢 | 高 |
| JIT | 它预先将目标代码块翻译成本机代码后执行 | 中 | 中 |
| 虚拟化 | 利用 CPU 硬件虚拟化技术,来模拟目标程序 | 快 | 低 |
值得一提的是,模拟器并不一定需要模拟某个硬件,也可以作为软件的一套运行时环境。比如 JVM 也是模拟器的一种。
虚拟化的灵活性最差,这是因为虚拟化需要目标程序的硬件架构,和运行模拟器的计算机架构(也就是提供虚拟化的硬件)保持一致。
即便是解释执行的方式,在指令集模拟器类型里表现效率较差,但在各种模拟器类型中,由于它模拟的精度低,反而运行效率不一定差。
Spike 模拟器是一种指令集模拟器,他是 RISC-V 官方的参考模拟器,它提供了一套标准化的验证平台,硬件工程师用它来验证自己的实现是否符合标准,软件工程师用它来开发对应的软件。
模拟器的隐藏价值
大多数人认为,在芯片公司,模拟器的价值在于 “在硬件回来之前就开发软件”,但这只是其中一方面。
模拟器的能力很强大,功能很灵活,所以它实际上有很多潜在的价值。
暴露概率性问题
软件上有一些可能概率性复现的问题,比如说多线程的竞争问题。在硬件上运行时,由于硬件运行速度快,反而这种竞争问题难以复现(比如跑 100 次出现一次),这对于软件开发工程师来说,就变得非常棘手,难以复现问题便难以调试问题。
模拟器的运行速度不快,再加上其实现中,物理世界的概率对逻辑的影响更小,所以同样的问题程序,再模拟器上可能更高频的复现,从而帮助软件调试。
硬件错误仿真
芯片设计并不是完美的,每一版芯片都可能带有一些 errata(硬件缺陷)。而模拟器能做的,就是屏蔽或灵活开关这些 errata,从而可以有助于重现硬件 bug,帮助工程师理解和修复这些问题。
另外,模拟器也支持注入异常,比如在特定的内存中插入异常数据,或主动发出硬件信号,这都有助于软硬件开发过程中,测试和调试一些边缘问题。
控制软件质量
芯片对于软件的运行相对是宽容的,比如对于一些未配置的值,未定义的行为,未初始化的内存,硬件会尽量选择静默处理,避免系统失效。而这些潜在的问题被掩盖,对于软件来说,可能不是预期的。
模拟器则完全没有这个顾虑,它可以对各种软件行为做检查,相对于硬件来说,它更像是严厉的替身,将各种软件意外的行为捕获并抛出来。
性能分析
虽然现在的芯片,也会提供一定的性能分析能力,但能做的依然比较有限。
硬件可能能够提供一定程度的采样、总体的缓存统计以及有限的内存访问分析,而这些硬件机制还需要基础软件去配合来发挥其能力。
而模拟器则可以灵活地提供这些功能,它可以捕获每一条指令的运行状态,对仿真组件的影响,每一次访存动作、缓存命中情况等。进而,对于性能分析的工作提供有利的参考。
虽然模拟器不能提供准确的绝对数据,但提供迭代改进的相对数据和横向对比数据,也非常有价值。
前期交付
对于一些公司,它们需要在硬件发售之前,先将软件交付给客户,为了能保证用户使用软件时正常运行调试,就需要一并把模拟器也发布出去。可能有不同的形式,比如交付二进制产物,或者提供云平台接入等。
另外,即便硬件已经能够交付,一些用户也希望自己购买的软件产品中能带有模拟仿真的功能,比如 IDE(软件集成开发环境)中带有模拟运行特性,这也需要模拟器团队去接下重担。
局限性和发展
模拟器不是万能的,它在软硬件设计这个场景下,能够发挥出自己的优势,但确实也存在一些局限性。
最主要的就是速度。如果对硬件做详细的模拟,就不得不面对测试效率越来越低的现实。这种和硬件的差距,可能达到几千上万倍,以至于对于使用者来说无法容忍。毕竟,软件输入数据的规模,也影响着一次运行的总用时,越来越复杂的软件需求和硬件设计,使得模拟器夹在中间,迎来更多的质疑。模拟器开发工作中确实挺让人头大(笑哭)。
其次是准确性的问题。模拟器毕竟只是一套软件,它无法完全复刻硬件的行为,模拟器开发工作中的绝大多数维护时间,都用来去与硬件做参照。过于准确的设计又反过来带来了速度的损失,需要不断寻求平衡。
最后是新兴硬件越来越复杂,比如异构架构,而软件的需求也越来越高。比如在一个 GPGPU 公司做模拟器,来运行行业上各种大模型和算法。这对模拟器带来了新的机遇和挑战。
常见模拟器软件
| 工具 | 类型 | 特点 | 应用场景 |
|---|---|---|---|
| QEMU | 系统模拟器 | 支持丰富的硬件架构,社区活跃 | 虚拟化、嵌入式、操作系统移植 |
| Gem5 | 微架构模拟器/全系统模拟器 | 高自由度、研究导向 | 计算机架构研究、性能分析 |
| spike | RISC-V 指令集模拟器 | 官方模拟器,简单易用 | 生态软件开发、教学 |
| Bochs | x86 系统模拟器 | 移植性强 | 操作系统开发 |
| LLVM simulator | 指令集模拟器 | 基于 LLVM | 编译器测试 |
| SPIM | MIPS 指令集模拟器 | 简单易用 | 教学 |
计算机体系结构模拟器,这个隐藏在芯片设计和软件设计背后的强劲工具,是软硬件快速发展的翅膀。虽然大多数人并不会注意到这个领域和这些工程师,但它们实实在在的在默默支持着一线。
本文同步发布在知乎账号下:计算机体系结构模拟器简述
标题图片使用豆包 AI 生成,提示词:冬天、白雪皑皑的冰川、毛毡画、16:9 画幅。










