论文部分内容阅读
全系统模拟器可以用于指定模拟某个硬件平台,因此其被广泛用于软件开发、错误判定、内存访问情况的查看和分析等用途。多核技术的发展为全系统模拟器技术带来了众多机遇同时也带来了很多挑战。一方面,多核平台拥有丰富的物理计算资源可供全系统模拟使用并提高自身模拟的性能。另一方面,随着多核平台上处理器数目快速增长,要求全系统模拟器可以高效的模拟大量核的多核平台并可以模拟运行处理大数据量的并行程序。与此同时,全系统模拟器必须有能力真实的模拟并行程序在多核平台上的并行运行的行为从而才有可能暴露并行程序自身存在的问题,如并行错误中的数据竞争问题。然而,由于当今主流的全系统模拟器都在利用一个物理处理器,以轮训的方式模拟多核计算平台,因此,他不但不能够利用多核平台上丰富的物理计算资源与此同时还将在性能上非常差的可伸缩性。与此同时,在可靠性方面,由于虚拟核之间经常以较粗粒度进行调度,因此非常容易隐藏并行程序本身由于运行由于数据竞争而产生的随机错误,进而严重约束了对模拟软件运行时行为的分析。然而我们知道开发一个全系统模拟器,由于要考虑到系统相关的所有层面,因此需要大量地人力并花费大量地时间。而全系统模拟器较普通的用户态程序模拟器更为复杂,其原因在于要考虑全系统的所有层面,如系统指令集、地址翻译、运行的特权级、中断以及外设的模拟。而不同体系结构指令集的不同也给构建一个可移植的全系统模拟器带来了更大的困难。本文提出了一个全新构建并行全系统模拟器的方法。我们发现对于现有的多核平台,核于核之间关系以及核与外设之间相互独立,他们之间通过有着标准规范的总线接口进行通讯。例如,每个处理器都拥有自己的控制单元、寄存器以及缓存,处理器之间通过核间中断进行通讯。这样的组织结构允许我们基于现有的并行模拟器构建一个有效地并行模拟框架,而不是简单的将其并行化,从而降低构建并行模拟器的复杂性。我们通过集成多个主流的串行模拟器来构建一个并行模拟器,每一个串行模拟器都用来模拟一个虚拟处理器并以一个线程的形式运行。我们还提供了一个简单有效的协议层负责线程的调度、通讯和同步模拟。我们认为这种简单的构建方法可以使得并行模拟器具有很好的可伸缩性、可靠性、可移植性以及动态负载均衡的能力。通过引进轻量级事务技术、非阻塞队列技术以及针对多核模拟的调度算法,基于已有的主流串行模拟器,我们构建了高可伸缩性和可移植性的并行模拟器。我们基于QEMU实现了一个并行模拟器原型COREMU,该原型系统中QEMU的代码修改行数仅仅在2500行左右。该原型系统支持对x64和ARM两不同的体系结构的并行模拟。对于x64,最多可以并行模拟255个虚拟核。对于ARM,最多可以对4个虚拟核进行模拟。与此同时,为了帮助程序员更加有效的对程序进行开发和分析,COREMU还集成了观察点和内存访问序列收集的机制。对于性能评测,我们使用SPECINT-2000基准评测程序进行评测,其结果显示对于单核模拟COREMU仅仅有1%不到的性能开销。而对于多和模拟,COREMU较QEMU具有更好的可伸缩性。我们使用了多个基准评测程序对其模拟多核时性能的多个方面进行评测,结果显示,当COREMU模拟的虚拟核数目不大于物理核数目时,其具有非常好的可伸缩性。当其模拟的虚拟核数目大于物理核数目时,其性能的下降仍然在可接受的范围内。与此同时,对于所有测试程序,COREMU都可以模拟到255个虚拟处理器而当QEMU模拟超过16个处理器时,测试程序模拟运行时间便会超时。当COREMU在4*4的多核计算平台上模拟16个虚拟处理器时,和QEMU相比,它达到了20-67倍的提速。