体系结构模拟器在处理器设计过程中的作用
2019-12-18张乾龙杨思博赵博彦张立新
张乾龙 侯 锐 杨思博 赵博彦 张立新
1(中国科学院计算技术研究所 北京 100190)2(中国科学院大学 北京 100049)3(中国科学院信息工程研究所 北京 100093)4(北京大学软件与微电子学院 北京 100871)(zhangqianlong@ict.ac.cn)
模拟器是体系结构量化分析的重要手段,对架构设计、芯片开发有重要的指导作用.基于模拟器辅助进行集成电路设计可以追溯到1980年代[1],自此模拟器便一直是处理器设计过程中不可或缺的工具.在芯片开发过程中,体系结构模拟器可以缩短处理器的设计时间,降低开发成本,其具体作用如图1所示:
由图1可知:
1)在芯片开发早期,基于模拟器可以进行微结构探索和粗粒度微结构定义,此时模拟器的开发抽象层次较高.
2 )随着处理器设计的不断推进和模拟器的不断完善,基于模拟器可以持续对芯片微结构进行评估、修改和取舍.
3)当模拟器趋于成熟,可以对微结构、多核互联系统、一致性协议等进行详细性能分析,基于分析结果对微结构进行微调.
4 )在对处理器逻辑设计进行验证的阶段,模拟器可以作为参考模型辅助进行验证,可以快速定位逻辑设计错误.
5)在未流片之前基于模拟器就可以开展系统软件开发和适配工作,这样可以在芯片流片结束后以最快速度启动系统软件.
6)流片结束后,基于模拟器可以辅助进行芯片硅后验证环境的搭建以及测试用例编写工作.为了保证模拟器可以顺利辅助进行处理器设计,在整个芯片开发过程中,需要持续对模拟器进行校准,通过持续对比模拟器和寄存器传输层(register-transfer level,RTL)之间的差别,可以互相校准并发现模拟器或者RTL的设计错误.
1 开源模拟器与处理器设计的关系
处理器设计的很多创新思想来源于体系结构学术研究,而学术研究使用的模拟器大多是开源模拟器,因此开源模拟器对于处理器设计有重大的意义.开源模拟器主要用于对处理器进行抽象建模并验证创新思想,因此开源模拟器对于学术研究有2种很大的价值:1)不同的开源模拟器具有不同特点,因此研究人员可以根据所研究的内容选择合适的开源模拟器平台进行实验,这给学术研究提供了很高的灵活性,有助于快速实现原型系统;2)开源模拟器的社区一般比较活跃,在原型系统实现过程中,如果遇到问题可以很快找到解决方案,从而快速构建实验用的原型系统.
但是从辅助进行处理器设计的角度看,开源模拟器有一定的局限性.如果处理器厂商基于开源的模拟器辅助进行处理器设计,需要首先解决2个问题:
1)各处理器厂商的微结构一般与开源模拟器的微结构差别很大,因此修改模拟器的代价较大.例如gem5模拟器中乱序执行流水线的设计主要参考的是Alpha 21264[2],基于此进行微结构修改的工程量比较大.此外,由于模拟器开发是一项较大的软件工程,而软件工程的框架一旦确定,修改起来也会比较棘手.
2)开源模拟器一般不会与具体某款处理器进行校准工作,因此一般无法直接基于某款开源模拟器进行处理器验证.文献[3]指出:gem5等开源模拟器有很多未知错误,例如流水线中不合理的写回机制、生成微指令过程错误等.另外由于gem5对于访存子系统模拟精度不够,大小为512×512的矩阵运算在gem5模拟器上运算误差可以达到23.38%,并随着访存通信量越大误差越大[4].此外文献[5]通过对比真实的ARM平台,指出gem5全系统模拟误差也非常可观.因此基于该模拟器二次开发用于辅助处理器设计的模拟器需要首先修复上述开源模拟器误差和错误.
但是,基于开源模拟器二次开发用于辅助进行处理器设计的模拟器也有好处.开源模拟器中提供的工具可以直接使用,降低工具及模拟器相关库开发成本,例如SimpleScalar工具集提供了功耗模拟器WATTCH[6],用于选择模拟样本的SimPoint[7]等.
2 模拟器辅助处理器设计的方法学
模拟器是体系结构量化分析的重要手段,从辅助进行处理器设计的角度看,计算机体系结构模拟器可以分为3类,如图2所示.
Fig.2 Classification of simulators used in CPU design图2 辅助处理器设计的模拟器分类
由图2可知:1)微结构探索和性能优化,为了精准模拟处理器微结构并提高模拟器运行速度,同时为了方便开发和维护,一般会继续细分为单核性能模拟器和多核互联性能模拟器;2)辅助进行系统软件开发;3)辅助进行处理器验证.现代处理器设计厂商普遍自研适配于自家处理器架构的模拟器.本节根据处理器厂商公开发表的通过模拟器辅助进行处理器设计的经验进行分析并总结规律.
2.1 龙 芯
龙芯中科技术有限公司在使用模拟器辅助处理器设计的文献中提到[8-10],龙芯2号处理器研发过程中,最早开发的模拟器ICT-Godson由于对硬件模拟过于详细,导致其速度和灵活性不足[10].因此,龙芯基于Simple-Scalar开源模拟器[11]框架设计实现了Sim-Godson处理器核模拟器[8].相比于ICT-Godson模拟器,Sim-Godson具有运行速度快、灵活性高、支持大程序评估等优点[10].Sim-Godson可以支持功能模拟和时序模拟,由二进制可执行程序作为输入,主要用于处理器核的微结构性能探索.Sim-Godson虽然借用了SimpleScalar的基础模块,但龙芯中科技术有限公司对其进行了大量修改定制工作,使其达到高精准模拟龙芯2号处理器核微结构的目的.基于SimpleScalar中自带的指令集仿真器和I/O仿真器进行执行加速,其速度可以达到0.5MIPS(million instructions per second).经过详细校准,Sim-Godson模拟器与ICT-Godson的误差平均不到5%[8].类似地,基于Simple-Scalar进行二次开发的模拟器还有Sim-alpha[12].
基于Sim-Godson模拟器可以对单核微结构进行性能评估和分析,但是由于SimpleScalar的结构本身不支持对多核互联系统进行模拟,因此龙芯中科技术有限公司基于SimOS[13]全系统开源模拟器开发了SimOS-Goodson模拟器[9].借用SimOS模拟器的全系统组件,龙芯中科技术有限公司把处理器核模拟器嵌入其中,并解决了因为功能模拟和时序模拟并行执行导致的存储一致性问题,同时添加了全系统相关功能和调试功能.定制修改后的SimOS-Goodson配置灵活、执行迅速、模拟准确,同时支持用户态和全系统模拟,模拟速度可达0.3MIPS,模拟误差在15%以内.类似地,DEC和IBM也曾基于SimOS开发全系统模拟器SimOS-Alpha[14]和SimOS-PPC[15].
2.2 IBM
IBM于2012年某研讨会中做了题为“IBM使用模拟器的经验”的报告[16],对于IBM如何在处理器设计过程中使用模拟器进行了介绍.
在处理器早期设计研究期间,IBM使用Mambo[17]模拟器的时钟精确模式进行微结构探索和粗粒度微结构定义.Mambo模拟器对微结构主要模块和结构进行了模拟,该阶段Mambo由踪迹(trace)驱动,主要运行和研究用户态应用,对处理器的产品竞争力进行横向比较研究[16].
在微结构设计实现期间,IBM使用基于公司内部专用“T”语言编写的时钟精准模拟器M1进行详细模拟处理器微结构[16],如图3所示.M1是以Mambo模拟器或者硬件上抓取的踪迹作为输入,并且可以收集非常详细的微结构数据进行性能评估.为了加速M1模拟器的执行速度,需要对所抓取的踪迹进行取样,同时为了方便调试,M1支持微结构性能数据可视化功能.
Fig.3 IBM CPU simulator framework图3 IBM模拟器框架
在处理器验证阶段,IBM使用Mambo[17]作为处理器验证参考模型辅助进行验证,此阶段Mambo可以为处理器功能正确性提供参考结果.Mambo模拟了所有处理器的功能特征,把某些性能相关的微结构维护操作(例如cache维护类指令)翻译成空(nop)操作,对于计算类指令产生准确的结果,并精准追踪处理器寄存器的状态变化,同时支持指令撤销操作,为处理器验证提供参考.IBM基于Mambo模拟器曾发现PowerPC CPU的一个控制寄存器存在竞争条件,使得该设计错误在流片之前就被发现并修改[17].在该阶段,IBM还使用自研的由多个FPGA(field programmable gate array)组成的VHDL(very - high - speed integrated circuit hardware description language)仿真加速器Twinstar[18]进行处理器综合验证.Twinstar是时钟精准的仿真加速器,其推进方式是事件驱动模式,可以对整个处理器芯片进行仿真,以二进制程序作为输入,还支持详细的指令踪迹和处理器状态的实时追踪.该平台运行速度可以达到4 MHz并可以运行未经修改的系统软件.类似Twinstar的验证平台还有帕拉丁[19]等.
在系统软件开发方面,IBM基于Mambo(加速模式)[17],Simics[20],BGLsim[21]等多种平台,在流片之前就开始进行固件、操作系统、虚拟机管理器等软件的早期开发.IBM基于Mambo模拟器曾开发了K42操作系统,在芯片可用之后1周内就启动了操作系统[17].IBM基于BGLsim-multi[21]平台和基于OMNeT++[22]开发的MARS(message passing interface application replay simulation)模拟平台还可以对机群网络相关的功能进行模拟,模拟器由可执行程序或者踪迹驱动,其中MARS平台还可以对MPI(message passing interface)类应用进行调优.
2.3 AMD
AMD于2007年ISPASS讨论会上做了题目为“AMD性能建模和分析:游历指南”的主旨发言,介绍了AMD如何使用模拟器辅助进行处理器设计和验证[23].此外,在2018年AMD做过题为“现代服务器CPU性能分析”的报告[24],其中也提到了模拟器在AMD服务器处理器设计中的辅助作用.
在处理器研发早期,AMD通过模拟器对体系结构进行粗粒度定义[23],还使用功能模拟器SimNow[25]辅助进行处理器设计,例如产生程序执行踪迹、为CPU性能模拟器提供对比结果等.
在微结构设计实现期间,AMD开发了CPU核模拟器和多核互联模拟器(由于AMD没有公开其命名,本文分别称之为AMD-Core,AMD-NB模拟器)用于对处理器性能进行评估.AMD-Core模拟器框架如图4所示.
首先从真实硬件或者SimNow模拟器上直接抓取程序执行踪迹,然后对踪迹进行分析获取初步微结构信息,例如cache缺失率等.同时把踪迹作为输入文件灌入时钟精准的AMD-Core模拟器进行详细分析,此时从真实硬件上获取的程序执行结果可以作为AMD-Core模拟器的参考,分析后可以产生详细微结构数据.
AMD-NB模拟器可以模拟多核互联系统,如图5所示,由从真实硬件抓取的事务(transaction)踪迹驱动,因此可称其为事务精准模拟器.为加快执行速度,对互联模拟器中CPU进行抽象处理.基于该模拟器可以对于多核设计进行取舍,例如可以用于决定互联系统、内存系统的设计.此外,AMD还开发了以指令执行踪迹作为输入的TagSim cache模拟器,可以对cache微结构(如替换算法、相连度等)进行分析.为提高准确性,上述模拟器都需要同RTL进行校准.
Fig.4 AMD CPU core simulator framework图4 AMD处理器核模拟器框架
Fig.5 AMD multi-core interconnect simulator framework图5 AMD多核互联模拟器框架
AMD的互联系统模拟器中还包含高级系统队列模型,该模型可以对资源利用率、cache一致性协议等进行建模,并可以基于预定义的参数定量产生流量和cache缺失等信息,例如预先设定L3 cache缺失率10%,该模型可以基于该参数产生10%的L3缺失率,为L3下游子系统产生输入请求.其输入是从TagSim cache模拟器中获取的可执行负载的参数、cache参数等.该模型经过与真实硬件系统进行校准后,可以用于预测包括吞吐率和带宽利用率在内的AMD服务器性能路线图(roadmap).
在处理器验证期间,AMD使用SimNow功能模拟器为AMD-Core和AMD-NB提供执行参考结果,此时的SimNow角色和IBM的Mambo相同.此阶段性能模拟器和RTL进行互相校准,可以通过模拟器发现并修改RTL的逻辑错误,反之也可以通过RTL对AMD性能模拟器进行校准.AMD-Core和AMD-NB模拟器的开发目标是跟RTL一样时钟精准,并且保证执行正确性以方便进行不同层次的性能分析.AMD模拟器相较于RTL,在未校准之前每1 000条指令的绝对误差是22%,经过校准后可以达到2%~3%.
在系统软件开发方面,AMD基于SimNow平台可以在流片前就开始BIOS、硬件驱动代码、操作系统、软件编译器的开发.
2.4 Qualcomm
美国高通(Qualcomm)公司基于ARMv8架构研发的多核服务器芯片Centriq 2400已经发布[26-27],文献[26]对互联系统硬件架构进行了描述.此外文献[28-31]作者均来自美国高通公司,该文献中实验评估部分对高通使用的多核互联模拟器框架进行了描述[28],从文献[26,28-31]可以得到高通公司所使用的互联系统模拟器架构如图6所示.高通的互联系统模拟器前半部是运行在开源QEMU[32]虚拟机上的操作系统及真实应用程序,在运行时动态产生指令执行踪迹.模拟器后半部运行真正的互联系统模拟器,模拟多级cache、内存控制器、互联总线等模块.为了加速互联模拟器的仿真速度,该后端模拟器的推进方式不是时钟精准而是时钟近似的.模拟器在运行时,前端QEMU运行速度比后端模拟器运行稍快,动态产生程序执行踪迹暂存到缓冲区中,后端模拟器读取该缓冲区数据进行模拟.缓冲区中会暂存一部分访存请求,在不违背访存之间依赖关系情况下,可以乱序发射以此对CPU乱序执行进行模拟.该模拟器是已跟RTL进行校准的企业级模拟器,支持ARMv7/v8指令集,并由高通CPU研究部门和开发部门共用[31].
Fig.6 Qualcomm multi-core interconnect simulator framework图6 高通多核互联模拟器框架
上述模拟方法中,QEMU作为生产者动态产生指令踪迹,互联模拟器作为消费者消耗指令踪迹进行互联系统模拟,这种方法的优点在于可以不需要对踪迹文件进行存储,从而节省大量存储空间,并且还可以一定程度上模拟CPU乱序执行.但其缺点也比较明显,因为该模拟器由踪迹驱动,会导致其无法精确模拟处理器中如分支预测、推测执行等细节.
2.5 处理器厂商使用模拟器经验小结
第2节分别介绍了各处理器厂商如何使用模拟器辅助进行处理器开发,具体地,模拟器信息如表1所示,对于未公开的数据用“-”标示.
上述不同的模拟器有不同的作用并且运行速度不同,文献[23]对模拟器的运行速度及其作用进行了总结,如图7所示.
1)1~10 Hz.RTL仿真运行速度.对性能模拟器和RTL进行互相校准时需要运行RTL仿真,通过校准可以找到RTL中的逻辑错误和性能模拟器的模拟错误.
2)1~10 kHz.时钟精准的单核性能模拟器的运行速度.Intel[33]和AMD[23]的时钟精确模拟器运行速度都是这个级别,基于性能模拟器可以进行处理器微结构分析和探索.
3)10~100 KIPS.踪迹分析模拟器和处理器抽象模型的运行速度.此时基于模拟器可以初步对踪迹进行分析,获取微结构信息,还可以对处理器进行抽象,基于抽象模型对未来性能进行估算.
4)100~500 KIPS.这是大多经过优化加速(例如通过翻译执行)后时钟精确模拟器的执行速度,例如SimpleScalar的sim-outorder模式和PTLSim速度分别是740KIPS和270KIPS[34].
5)1~100 MIPS.指令集功能模拟器的运行速度.基于功能模拟器可以对指令集进行模拟和研究,作为对比模型进行处理器验证等工作.
文献[16]中曾提到,模拟器的开发是一个大型软件工程,开发周期长,需要持续与RTL进行校准,本节结合表1及文献[8-10,16,23-24]总结了处理器厂商使用模拟器辅助进行处理器开发的经验有4方面:
Table1 Simulator Summary表1 模拟器总结
Note:“-” means unpublished information.
Fig.7 Simulator speed and role图7 模拟器速度及作用
1)处理器厂商一般有多个功能不同的模拟器用于辅助进行处理器开发.其中性能模拟器一般要同时支持踪迹和执行驱动2种模式,以方便在这2种模式之间切换,以此加快模拟速度.性能模拟器一般要求时钟精准,且与RTL校准后误差尽量小[23],其运行速度一般要比RTL仿真速度快1 000倍以上才有实际使用价值[23].性能模拟器还要支持多种调试手段,例如GDB、快速前进(fast forward)、检查点等,还要支持数据可视化功能,方便与RTL进行校准.为了加快模拟器仿真速度,要善于使用类似于SimPoint[7]的取样方法对负载进行处理.对于多核互联模拟器考虑到仿真速度,可以使用时钟近似模式和抽象的处理器核,但要可以精确反映性能变化趋势.
2)一般都有硬件支持从硬件直接抓取真实程序执行踪迹或者事务踪迹[23-24],例如AMD可以直接关闭L2抓取bus上的信息,IBM也可以获取真实处理器上的执行踪迹.此外模拟器要可以和多种常用软件工具协同工作,以方便使用,例如踪迹获取工具、代码自动注释工具、文档产生工具等.
3)模拟器开发投入很大,要持续与RTL进行校准[23].模拟器的开发首先是一项软件工程,因此好的软件架构模拟器成功的首要条件,相比而言计算机体系结构的知识也非常重要但是次要的[16].AMD模拟器的微结构代码约有10万行,其他结构包含共享库约有40万行代码[16],因此模块化的设计、良好的代码接口、使用源代码管理工具等必不可少.在资源不足的情况下,基于开源模拟器开发模拟器也是不错的选择.
4)模拟器校准时,需要通过微程序进行充分验证[8],此时可以跟验证团队紧密合作,共享验证微程序.性能模拟器编写语言一般选择兼顾开发和执行效率的C++,其次是C语言.为了加速模拟器仿真速度,模拟部件尽量并行执行,且要尽可能支持可移植性.
3 性能模拟器校准
用于进行微结构探索的性能模拟器的准确度会直接影响微结构设计和改进的决策,因此需要对其进行校准.校准方法可以分为2种:1)在进行处理器设计时,与RTL进行校准;2)开源模拟器为了提高研究可信度,在目标硬件微结构数据未知的情况下,与已有的硬件平台进行校准,本节对上述校准方法进行总结.
3.1 与RTL进行校准
龙芯中科技术有限公司对Sim-Godson模拟器和ICT-Godson模拟器进行校准,后者与RTL几乎一样准确,其校准方法学与模拟器直接同RTL校准类似,具有一定参考价值,本节以此为例阐述模拟器与RTL的校准方法[8].
如图8所示,在处理器开发的逻辑设计阶段开始模拟器设计和校准工作,在其他阶段如果需要修改逻辑设计,则同时对模拟器进行修正.龙芯中科技术有限公司使用2种类型的负载[8]对模拟器进行校准,即微程序[35]和完整应用程序(主要是SPEC CPU2000).
Fig.8 Simulator calibration process图8 模拟器校准流程
在校准初期,针对特定处理器模块编写特定微程序进行各模块校准[8].例如通过if-else循环测试分支预测器,以时钟周期为单位对比模拟器和RTL运行结果,发现不同后定位原因并修正模拟器.重复上述步骤直到微程序验证结果的误差可控后,继续使用完整负载进行校准,此时如果结果显示误差原因指向某个模块,则增加对该模块进行校准的微程序并重复上述校准步骤.若一时无法定位误差原因,则重复使用微程序对误差进行分析.
龙芯中科技术有限公司在模拟器校准过程中还提出:1)分析程序运行结果并寻找误差原因是模拟器校准最重要的工作;2)很多由SPEC CPU2000发现的模拟器误差,都可以由一些简单微程序发现,而分析SPEC CPU2000的误差要比分析微基准程序困难得多;3)仅仅比较程序运行时间或IPC(instr-uctions per cycle)等宏观参数得出的结论有可能不正确,要综合考虑分支预测正确率等相关部件.例如在Sim-Godson校准过程中,浮点部件还没有校准之前,SPEC CPU2000中多个程序IPC误差已经小于10%,只有通过查看浮点部件延迟和发射策略等参数,才会发现浮点部件误差较大.
3.2 与真实硬件进行校准
在真实硬件微结构数据未知的情况下进行模拟器校准,需要首先通过程序测试获取处理器微结构详细信息.文献[36]认为模拟异构系统的模拟器如果不准确,会直接导致异构系统性能和功耗的严重误判,因此对模拟器MARSSx86[37]与Intel Core i7-920 CPU进行了校准,其校准分为2步:1)通过简单的微程序(general matrix multiplication,GEMM)[38]校准处理器核流水线;2)基于校准后的流水线继续进行访存系统校准.
本文以校准计算类指令的执行周期为例介绍其校准方法.模拟器与真实处理器校准过程中,不同类型指令执行延迟是最重要的校准参数,但是由于Intel未公布该微结构参数,因此文献[36]通过设计微程序对指令执行延迟进行测算.具体地:
1)查询Intel编程手册获取i7-920处理器每个时钟周期可以执行4个双精度浮点运算(double precision FLOPs/cycle,FPC),每个双精度浮点运算的寄存器宽度是64 b.指令mulpd和addpd使用的寄存器是128 b宽,上述每条指令每个周期需要2个双精度运算.
2)设计微程序,使得每个mulpd和addpd的指令组合恰好在i7-920处理器上一个周期执行完成.
3)如图9所示,定义寄存器复用距离(register reuse distance,RRD),即相同指令的目的寄存器号相同情况下2条指令之间的延迟周期数,例如图9中的指令addpd复用距离是3周期.
Fig.9 Microbenchmark for testing instruction latencies图9 测试指令延迟的微程序
4)如果addpd指令和mulpd指令的执行延迟分别小于3和6周期,则该微程序的执行峰值速度应该能达到4FPC,反之指令addpd和mulpd必须要等待指令之间寄存器相关导致的依赖解决后才能继续执行,因此会导致浮点计算部件无法达到峰值性能.经过测试,图9中的微程序可以达到3.94 FPC,可以断定addpd和指令mulpd的指令执行周期不大于3和6周期.
5)通过反复调整addpd和mulpd的复用距离,可以得到指令addpd和mulpd执行周期分别为3和5.通过上述程序获取的数据调整模拟器中指令执行延迟.
类似地,对其他流水线微结构信息例如发射宽度、缓存系统架构等,都需要通过微程序测试获取相关数据后进行校准[36],基于此再进行访存子系统的校准,本文不再详述.
4 模拟器优化方法
随着处理器核性能越来越高,核数越来越多,模拟器的规模也越来越大,模拟速度及模拟器可扩展性越来越成为模拟器发展的制约因素,因此模拟器需要进行优化.本文把模拟器的优化分为纵向优化(scale up)和横向优化(scale out).纵向优化是指通过技术手段,对串行执行或者小规模模拟器进行加速;横向优化是指对于模拟多核或者多处理器的模拟器,在付出较小代价的同时,获取模拟器多核扩展性的大幅提升.本节对新兴的优化方法进行着重介绍,对常规的优化方法进行简单总结.
4.1 模拟器纵向优化
4.1.1 基于FPGA加速的模拟器
FPGA加速模拟技术[34](FPGA-accelerated simulation technologies,FAST)可以通过FPGA对时钟精准模拟器进行加速.基于该技术实现的模拟器可以分为2部分,模拟器前端运行一个功能模拟器,可以运行完整的全系统.模拟器后端通过FPGA硬件实现处理器微结构,因此可以对分支预测、流水线、缓存等详细微结构进行时钟精准模拟.模拟器运行时,前端功能模拟部分把指令执行结果等信息通过缓冲区输入给运行在FPGA上的模拟器后端,后端基于缓冲区中的信息校正微结构推测执行(例如分支预测等)过程中的执行结果.FPGA加速模拟技术同时具有软件的灵活性,并兼顾了运行速度,其运行速度一般要比基于软件的时钟精准模拟器快1个数量级[34].类似模拟器还有RAMP[39],STIMUL[40]等.
4.1.2 二进制翻译
模拟器二进制翻译技术是把模拟器所模拟的目标架构的指令,翻译成模拟器所运行的宿主机架构的指令然后进行执行.具体地,当模拟器执行目标指令时,模拟器把目标指令替换为宿主机上事先定义好的函数或者指令集,使得所模拟的目标架构指令执行速度接近于宿主机执行速度.
二进制翻译虽然加速了模拟器执行速度,但其缺点是目标架构的指令被宿主机指令替换,因此执行踪迹无法获取,同时导致模拟器与宿主机架构绑定,可移植性变差.基于二进制翻译进行加速的模拟器有SimOS[13],QEMU[32]等.
4.1.3 直接执行(基于KVM虚拟化和取样技术)
Fig.10 Comparison of different simulation sampling strategies图10 关于多种模拟取样策略之间的对比
直接执行是指模拟器的目标架构和模拟器的宿主架构相同的情况下,模拟器在运行时直接在宿主机上执行目标架构指令的加速方法,直接执行可以认为是二进制翻译中的特例.文献[41]把直接执行和取样方法结合起来对模拟器进行加速,基于KVM虚拟化在多个程序取样之间进行快速推进,其模拟速度可以达到宿主机速度的63%,约2.0GIPS(giga instructions per second).通过IPC参数对模拟器误差进行评估,平均误差约2.2%.基于KVM的模拟器加速方法是基于SMARTS[42]取样方法基础上发展而来,如图10(a)所示.SMARTS取样方法为了平衡模拟精度和模拟器仿真速度,把运行时程序分为3个模式:1)功能预热模式.为了对需要长时间训练的微结构状态进行保存,模拟了缓存和分支预测器,除此之外该模式把每条指令当作静态流水线原子指令进行模拟,并且没有时序信息.2)详细预热模式.使用乱序执行处理器对整个系统进行详细模拟,并对CPU内部的某些微结构(例如读写缓存、重排序缓存等)进行预热.3)详细模拟模式.详细模拟处理器所有微架构,并对需要的微结构数据进行测量.上述方法需要功能预热阶段执行大量程序指令,导致花费大量时间,为了对取样进行加速,文献[41]提出了FSA(full speed ahead)取样方法.如图10(b)所示,基于SMARTS取样基础上添加了一个新的模式:虚拟化快速推进模式.上述新增模式可以使用基于KVM的虚拟化技术把约95%指令直接运行在宿主机上,可以大大加快原来功能预热模式的执行速度,但为了保证对缓存和分支预测器的预热,保留了SMARTS中功能预热的方式.
FSA模式虽然加快了功能预热模式下指令执行速度,但是还有大约75%~95%的时间用于详细预热和详细模拟阶段.为了对上述阶段进行并行化加速,文献[41]继续提出了pFSA(parallel full speed ahead),如图10(c)所示,为了使得每一个取样点独立并行执行,需要复制取样点之前模拟器状态.在完成一个取样点详细模拟之前就使得模拟器运行到下一个取样点继续并行执行.具体地,模拟器完全以虚拟化快速推进模式运行在处理器核1上,其运行速度可以接近宿主机.当需要对模拟器进行取样分析时,复制模拟器状态到处理器核2上,开始以SMARTS方式进行取样处理,以此类推.如果复制模拟器状态的开销足够低,则模拟器可以接近宿主机的速度运行在宿主机器上.
上述方法被集成到了gem5[2]模拟器中,类似的模拟器还有基于Xen半虚拟化环境的PTLsim[43],因此运行PTLsim模拟器的操作系统要进行定制化修改,导致其可移植性相对不如KVM好(KVM目前是Linux标准组件),并缺乏对一些重要的底层硬件组件(例如中断时钟、IO设备等)的模拟.文献[41]的方法虽然可以使得模拟器运行速度接近宿主机,但其缺点是:1)目标指令集要和宿主机相同;2)需要KVM支持;3)对于特权指令仍需进行模拟.
4.2 模拟器横向优化
4.2.1 区间模拟
区间模拟技术[44]是一种新型多核模拟器加速方法,通过提高模拟器的抽象层级并且对处理器核使用数学分析模型进行抽象,而省略了通过流水线对指令执行时间进行详细追踪的步骤,因此可以一定程度上通过数学模型替换处理器核的时钟精准模拟方式,大幅提高模拟速度并降低模拟器开发难度.其核心思想如图11所示,指令流水线的正常执行流会被分支预测错误和TLB(translation lookaside buffer)、cache缺失等事件打断并分成不同的区间长度,上述缺失事件及频率由模拟器决定,而区间的长度由数学分析模型计算.因此综合使用模拟各个部件的模拟器并结合数学分析模型,就可以对在多核处理器上同时执行的多线程程序性能进行评估,Sniper[45]和COTSon[46]就是以这种模式实现的模拟器.文献[44]对Sniper模拟器使用SPEC CPU2000和多线程PARSEC进行测试,与M5[47]全系统时钟精确模拟器进行精度和仿真速度的对比,运行SPEC CPU2006单线程的误差是5.9%,运行PARSEC多线程测试的误差是4.6%,但其速度要比时钟精确方式快一个数量级.文献[44]的区间模拟器分析模型的代码量只有1 000行C代码,而M5[47]中乱序执行代码量接近2.8万行.开发区间模拟器目的不是替代时钟精确模拟器,而是在牺牲小部分精确性的同时,大幅提高模拟器开发和仿真速度,因此可以用于快速探索多核处理器架构的设计和对粗粒度微架构和系统级架构进行快速取舍,而时钟精确模拟可以用于对某些微架构进行详细探索.
Fig.11 Analysis performance on an interval basis determined by disruptive miss events图11 基于缺失导致的区间进行性能分析
4.2.2 SST模拟框架
SST(structural simulation toolkit)[48-49]是为了对大规模高性能计算系统进行模拟而诞生,可以模拟多达512个处理器节点,其目标是成为设计和评估未来高性能计算系统的标准框架.基于SST模拟器可以把多个现有的模拟器按需集成起来,组成一个模块化并行模拟系统.SST已经内建多种处理器、内存系统、网络系统等模型,并提供简易用户接口,方便快速扩展新的模型.为了提高灵活度,SST提供一系列组件可以在精度和模拟时间之间权衡.SST的软件架构由模拟器核心部分和可动态插拔的组件组成,基于MPI和离散事件模拟技术构建,如图12所示,其中模拟器核心部分提供模拟服务,包括模拟器配置和启动、功耗面积评估、检查点的支持、模拟器数据收集等.SST模拟核心还提供通用接口用于连接供应商提供的组件或者开源的模拟器组件.目前基于SST开发的模拟器有MacSim[50],ExaSAT[51]等,自从发布以来SST被引用了208次.
Fig.12 SST structure图12 SST框架
4.2.3 并行模拟加速
为了对大规模系统进行模拟,需要可以并行运行的模拟环境,这催生了并行离散事件仿真(parallel discrete event simulation,PDES)技术[52-53].PDES可以把离散事件分解到多处理器上并行执行,可以大幅提高模拟速度,因此被广泛应用到工程、计算机科学、经济、军事[54]等领域.
并行模拟器虽然能加快基于离散事件仿真的模拟器运行速度,但是需要维护各个处理单元之间的同步关系,随着处理单元的规模越来越大,其同步开销占整个模拟器运行时间比例也越来越大,因此其可扩展性在规模巨大时成为急需解决的问题.IBM使用的BGLSim[21]模拟器就是基于PDES技术构建的.
5 相关模拟器介绍
随着各种体系结构和处理器设计方法学的发展,体系结构模拟器也相应地出现了一些新的形态,本节对近期出现的新型模拟器进行总结介绍.
5.1 异构模拟器
新型的专用加速器、GPU已成为计算机体系结构研究和处理器设计的重点.相应地,研究人员开发了多款开源的模拟器对新型计算机体系结构进行模拟.为方便研究人员选择合适的模拟器平台和工具进行实验,本文总结专用加速器和GPU模拟器及相关工具如表2所示,其中被引用次数高且持续维护的模拟器相对更适合进行异构原型系统的构建和异构体系结构的研究.
Table 2 Comparison of Heterogeneous Simulators表2 异构模拟器对比
Note:√ means support operating system;× means don’t support operating system.
5.2 硬件构建语言Chisel
加州大学伯克利分校设计的开放指令集RISC-V已成为处理器设计和研究领域的热门,为了实现处理器的敏捷开发,伯克利分校还开发了高度参数化的硬件构建语言Chisel[55].使用Chisel语言设计处理器,可以直接使用面向对象的设计方法学描述处理器功能,这与传统意义上开发周期精确模拟器的方式很像,但特别之处在于:通过编写一次硬件代码可以生成包含C++时钟精准模拟器、FPGA Verilog和ASIC Verilog这3个目标[55].具体地在生成模拟器方面,基于最新Chisel3编写的硬件代码可以产生Firrtl中间描述语言(inter-mediate representation,IR),从Firrtl可以直接翻译或者转换成Verilog,进而通过Verilator工具可以生成时钟精准的C++模拟器和测试框架.但是,通过这种方式生成的模拟器代码可读性和可修改性都比较差.
Chisel语言使逻辑设计和模拟器开发得到了统一,使得处理器设计效率提高一个数量级[56],因此可以大幅加速硬件设计,这是新的硬件敏捷开发方法学,同时也是未来处理器设计和模拟器发展的一个重要方向.
5.3 自研(In-house)模拟器
一些体系结构文献在进行实验评估时,使用的是自研模拟器,表3对体系结构会议ISCA(Inter-national Symposium on Computer Architecture),MICRO(International Symposium on Microarchi-tecture),ASPLOS(International Conference on Architectural Support for Programming Languages and Operating Systems),HPCA(International Symposium on High Performance Computer Archi-tecture)中近几年出现的In-house模拟器进行了总结介绍,以方便科研人员在开发自研模拟器时进行参考.从表3可以看出,有多个自研模拟器是基于trace(一般可基于Intel Pin工具获取)作为模拟器的输入,此类模拟器适合于对访存系统进行建模和分析,其优点是运行速度快、构建模拟器相对容易.但是由于Pin工具运行于用户态,因此其缺点是只能对用户态应用程序进行性能分析,无法对操作系统参与的行为(例如调度、内存管理等)进行分析.
Table 3 Introduction of Some In-house Simulators of Architecture Conference表3 部分体系结构会议中使用的In-house模拟器介绍
Note:“-” means unpublished information
5.4 专用模拟器
本文主要围绕处理器性能模拟器进行介绍,但是处理器的设计是一个不断取舍的过程,其他诸如功耗、面积等方面也是处理器设计过程中必须考虑的因素,这方面也有对应的专用模拟器模拟和分析.本文所述专用模拟器是从体系结构层面,针对处理器某个部件或者某些方面进行编写的模拟器,例如cache模拟器、功耗模拟器、面积模拟器等.这类模拟器一般用于在处理器设计之初对其功耗和面积进行初步评估和取舍或者用于对科研论文中提出的创新思想所带来的开销进行评估.本节对主流会议中所使用的开源专用模拟器进行总结介绍.
2.3节所述的TagSim[23]和文献[71]中所用的模拟器就是专用的cache模拟器,此类模拟器一般只对数据cache进行模拟,主要关注访存指令,因此普遍基于二进制插桩工具(Intel Pin工具和DynamoRIO[72]等)编写.
CACTI[73],Wattch[74],SimplePower[75],Power-Timer[76]可以对处理器能耗进行评估,文献[76]从微结构级对功耗模拟器进行了详细总结,本文不再赘述.Orion[77]模拟器可以针对片上网络(network on chip,NoC)的功耗、面积进行评估.CACTI模拟器除了可以评估处理其功耗外,还可以以时序为限制的情况下对处理器面积进行详细评估,基于此还衍生出了用于评估3D封装DRAM的模拟器CACTI-3DD[78]、用于评估片外IO的模拟器CACTI-IO[79]和面向SRAM的支持降低漏电功耗技术的模拟器CACTI-P[80]等.McPAT[81]集成了CACTI-P[80]模拟器,是首款集成了对功耗、面积和时序进行模拟的多核和众核模拟器,目前已经被集成到gem5[2],Sniper[45]等多款性能模拟器中.McPAT[81]和CACTI[73]普遍被用于主流会议中进行处理器功耗、面积的评估.
6 总结及展望
体系结构模拟器对于处理器设计非常重要,微结构的开发、处理器的迭代和性能提升离不开模拟器的辅助.基于模拟器进行处理器设计,未来还有很多挑战.本文从处理器设计的角度出发,首先介绍了开源模拟器在处理器设计中的地位;其次,对处理器厂商使用模拟器辅助进行处理器设计的经验进行了介绍和总结,并对性能模拟器的校准方法进行了介绍;最后对模拟器优化方法和新型模拟器进行了介绍.
随着计算机体系结构的发展,异构处理器、众核处理器、虚拟化技术成为高性能计算未来发展的重要方向.首先,随着处理器核数越来越多,未来多核互联模拟器会变得越来越复杂.此外,随着虚拟化的发展,系统整体性能评估需要在模拟器上运行虚拟化环境、完整的操作系统及负载.在处理器功耗越来越重要的情况下,通过模拟器对功耗进行评估也势在必行,目前这方面还有很大提升空间.上述挑战都是未来体系结构模拟器研发要面临的问题.