计算机体系结构模拟的快速离散事件驱动仿真方法外文翻译资料

 2022-01-04 09:01

英语原文共 8 页,剩余内容已隐藏,支付完成后下载完整资料


2018年IEEE第20届高性能计算与通信国际会议; IEEE第16届智能城市国际会议; IEEE第四国际 数据科学与系统会议

计算机体系结构模拟的快速离散事件驱动仿真方法

Christopher E. Gilesdagger;,Christina L. PetersonDagger;,Mark A. HeinrichDagger;

dagger;电气和计算机工程系

Dagger;计算机科学系

美国佛罗里达州中佛罗里达大学

{christopher.e.giles,clp8199} @ knights.ucf.edu,heinrich @ cs.ucf.edu

摘要 - 在本文中,我们介绍了一种快速离散事件驱动的仿真方法,称为KnightSim,旨在用于未来计算机架构仿真的开发。 KnightSim通过以下方式扩展了一个较旧的事件驱动仿真库:(1)对最近在Linux软件堆栈中添加堆栈保护,指针修改和源强化所引入的功能问题进行了修正,(2)将优化结合到事件引擎中, (3)引入一种新颖的并行实现。 KnightSim将事件实现为独立可执行的x86“KnightSim Contexts”。 KnightSim上下文包括一种快速上下文执行和自动建模占用和争用的机制,它很容易在计算机体系结构模拟中使用。我们通过详细的性能分析介绍了KnightSim和Parallel KnightSim的实现方法。我们的性能分析可以直接比较KnightSim,Parallel KnightSim和三种不同主流计算机架构模拟器中的离散事件驱动仿真引擎。我们的结果表明,与其他离散事件驱动的模拟引擎相比,KnightSim平均可实现2.8到11.9的加速。我们的结果还表明,对于2个,4个,8个和16个线程执行,平均KnightSim可以分别在KnightSim上实现1.78,3.30,5.84和9.16的加速。

一,导言

在本文中,我们介绍了一种快速离散事件驱动的仿真方法,称为KnightSim,旨在用于未来计算机架构仿真的开发。 KnightSim扩展了一种久经考验的事件驱动仿真方法,称为“线程包”。线程包先前已用于至少两个公知的计算机架构模拟器[1],[2]。我们对The Threads Package的扩展总结如下:

bull;一种新颖的实现,修复了由于最近在Linux软件堆栈中添加了堆栈保护,指针修改和源强化而导致的几个功能问题。我们的实现采用ANSI C语言编写,支持在32位和64位Linux x86环境中运行。

bull;优化的事件驱动模拟引擎。我们对KnightSim的实施比先前版本的方法实现了可测量的加速。

bull;一种新颖的并行实现,可自动并行化循环级别的事件执行。我们的并行实现称为Parallel KnightSim,能够在单线程版本上实现进一步的加速。

与现代主流计算机建筑模拟器(如GEM5 [3]和Multi2Sim [4])相比,KnightSim包含独特的离散事件驱动模拟方法。 KnightSim将事件实现为独立可执行的x86“KnightSim Contexts”。通过设计,KnightSim Contexts在单独的可执行包中封装了与单个目标模拟系统元素相关的所有功能和接口。这种实施方法从这种方法中获益。首先,已被证明是系统性能关键决定因素的占用和争用[5]由KnightSim Contexts自动建模。其他模拟方法,如Gem5和Multi2Sim的方法,不会这样做,需要额外的事件,状态标志和抽象级别来实现真实的占用和争用模型。其次,执行KnightSim上下文只需要长跳,参见Sec。 III-A。与调度和运行事件的回调函数相比,此机制更快,因为每次执行上下文时都不会创建并拆除KnightSim Context的堆栈。

最后,KnightSim Context执行可以并行执行,因为每个KnightSim Context在多线程环境中可独立执行。这些属性使KnightSim成为用于计算机体系结构模拟开发的有前途的工具。

本文的主要贡献是:

bull;我们使用伪代码详细讨论了KnightSim和Parallel KnightSim的实现。

bull;我们展示了KnightSim,Parallel KnightSim的性能分析结果以及当今广泛使用的三种不同的事件驱动仿真方法。

bull;我们提供了KnightSim和Parallel KnightSim的现成且完全正常的实现,以及用于研究人员下载和使用的使用示例.KnightSim和Parallel KnightSim作为免费软件提供,可以在GitHub上找到。

II。相关工作

关于离散事件模拟的相关工作有着悠久而多样的历史,涵盖了广泛的方法和技术。关于许多这些方法和技术的信息可以在一些全面和相关的调查[6],[7],[8]的过程中找到。一般来说,我们自己的相关工作属于离散事件模拟方法的范畴。旨在用于计算机体系结构模拟的开发。因此,为了简洁和相关,我们将相关工作限制于当前主流计算机体系结构仿真系统中使用的方法。 KnightSim从中继承其基本功能的实现方法称为The Threads Package,至少已用于FlashLite和M2S-CGM计算机体系结构仿真系统[1],[2]。然而,尽管之前已经使用过,但之前很少讨论关于线程包本身的实现细节。我们对KnightSim的实现保留了The Threads Package的接口,使它们在功能上彼此等效。但是,KnightSim采用了完全重新设计和优化的实现,从而导致(1)修复了在现代Linux发行版中使方法无法正常运行的功能问题,(2)显着的性能增强,以及(3)新的并行化实现仍然能够

更高的性能水平。关于当前主流计算机体系结构仿真系统中使用的其他离散事件仿真方法的直接相关工作的例子可以在GEM5 [3],Multi2Sim [4],Ruby [9]及其衍生计算机体系结构仿真系统中找到,例如Gem5- GPU [10]和FusionSim [11]。这些计算机架构仿真系统中的每一个都采用利用类似技术的离散事件仿真工具。在每一个中,离散事件模拟引擎通过在指定周期调度和执行预定事件和回调函数来工作。本质上,当开发人员提供的周期数发生时,离散事件模拟引擎的调度程序将调用传递给它的函数。 Ruby采用了略有不同的技术。在Ruby中,消息被排入连接建模系统元素的缓冲区中。缓冲区对插入的事件施加可变延迟和带宽。通过为给定事件缓冲区中的下一个调度事件调用回调函数来继续模拟执行。

与此处介绍的其他计算机体系结构仿真系统中的建模方法相比,KnightSim通过将事件实现为独立可执行的x86“KnightSim上下文”来利用不同的事件执行方法。如第二节所述。我,KnightSim Contexts封装了与可执行包中的单个模拟系统元素相关的所有功能和接口。 KnightSim上下文被视为计划由advance和await机制执行的模拟对象。在这种方法中,占用和争用由KnightSim Contexts自动建模。在这里讨论的其他方法中,研究人员必须努力仔细模拟建模资源引起的延迟,占用和争用。由于这些模拟功能不是机制的固有部分,因此必须使用事件,标志和适当的执行时序集合手动实现此类建模。之前已经研究过其他并行离散事件仿真技术,例如分布式计算[12],[13],处理器行为预测[14],[15],时序近似[16]和指令驱动时序[17]。 。相比之下,Parallel KnightSim通过将KnightSim上下文分成批次来并行执行执行,以便在每个模拟周期并行执行。

III。 KNIGHTSIM实施方法

KnightSim上下文的构成显示在Alg中。 1.上下文由函数定义,这些函数封装了与模拟元素关联的所有用户所需的功能和接口。在模拟执行期间,上下文等待直到通知它们应该通过一个或多个先前运行的上下文的提前执行,但在它们准备好之前不会执行。当前处于运行状态的上下文可以暂停任意数量的模拟周期或等待未来事件来评估延迟。一旦所有上下文都进入暂停或等待状态,模拟周期时间就会增加。

上下文在暂停或等待状态期间评估的延迟提供了自动建模该上下文占用的机制,因为在此期间上下文不能执行其他工作。争用自动建模,因为上下文必须竞争建模的系统资源。当等待访问特定资源时,各个上下文通过暂停或等待而停止。

当上下文等待建模的硬件资源变得可用时,这些额外的停顿导致当前和后续调用的更长访问延迟。

A.作为KnightSim上下文的事件KnightSim将事件实现为KnightSim上下文,它们在运行时由CPU独立执行。上下文由结构体表示,它定义了上下文本身,以及一个或多个事件计数[18]。伪代码描述

我们在上下文中显示了上下文和事件计数的实现。 2。上下文结构包括跳转缓冲区,计数,函数指针,堆栈指针,堆栈大小和上下文指针。跳转缓冲区是一种原始数据类型,由我们的手工实现的setjmp()和longjmp()汇编函数使用。我们的setjmp()和longjmp()实现纠正了最近在Linux软件堆栈中添加堆栈保护,指针修改和源代码强化所引入的功能问题。使用标准Libc setjmp()和longjmp()函数将使这种方法在现代Linux发行版中不起作用。测定正确的数据类型和上下文的跳转缓冲区大小显示在Alg的顶部。 2.上下文的计数用于将上下文与eventcount的状态同步。上下文的函数指针被分配了用户提供的入口函数的地址。堆栈指针指向用户提供的堆栈大小的已分配内存区域。每个上下文的堆栈都是唯一的,驻留在用户内存空间中,并包含该上下文的执行数据。上下文在共享内存空间中执行,也可以在全局C / C 对象上运行。

上下文指针用于形成单链表,该列表包括准备在给定上下文的跳转缓冲区运行的一批上下文,最后将上下文本身插入到适用的上下文批处理中。入口函数体现了该上下文将模拟的元素的功能,如Alg所示。 1.上下文的跳转缓冲区在创建后未初始化。因此,我们手动分配一个起始指令指针和堆栈指针,为上下文提供所需的起始位置和唯一的堆栈内存。上下文的跳转缓冲区的这种手动配置使每个上下文可独立执行。我们忽略其他CPU寄存器

初始化因为它们将在第一次调用setjmp()时获得。另外,我们将指向上下文的指针推送到上下文的堆栈中以便稍后检索。这允许我们在上下文的初始跳转之后解析有关上下文的信息。

我们的伪代码将指令指针赋值为context_start()函数的头部。在初始执行时,每个上下文将首先跳转到此函数的头部,然后检索指向自身的指针。然后我们调用上下文的start()函数并将指针传递给上下文本身以供将来访问。程序执行现在放在用户提供的输入功能的头部,并具有分配的上下文的分辨率,参见Alg。另外,我们的伪代码显示堆栈指针分配为分配堆栈的顶部,其计算方法如Equ所示。 1.stack top ptr = stack ptr stack size-sizeof(int)(1)指令和堆栈指针到上下文的跳转缓冲区的赋值取决于体系结构。指令指针和堆栈指针分配给32位Linux x86环境中的跳转缓冲区位置5和4 并被分配到64位Linux x86环境中的跳转缓冲区位置7和6。

C. KnightSim上下文调度

显示负责提供KnightSim上下文调度的机制的伪代码在Alg中示出。 4和5。

将KnightSim置于模拟状态只需要获取指向初始上下文批处理中的第一个上下文的指针,并对上下文的起始位置执行longjmp()。随后,每个上下文都处于等待,准备运行或运行状态,直到模拟结束。在KnightSim的单线程版本中,一次只有一个上下文处于运行状态。这些状态之间的转换是使用advance(),await()和pause()函数完成的。正在运行的上下文执行其分配的任务,并使用advance()函数将一个或多个事件计数作为其工作的产品。通过提前eventcount,指定的eventcount的计数递增,并检查eventcount的上下文指针。如果context和eventcount的计数相等,则从eventcount中删除上下文,并将其作为应运行此循环的上下文插入到当前上下文批处理中。

在上下文完成其任务之后,上下文然后通过使用await()函数转换到等待状态。

上下文将为其自身分配一个计数,它将等待当前上下文批处理,将其自身分配给指定的eventcount的上下文指针,并将当前位置存储在其跳转缓冲区中。然后,模拟执行可以跳转到当前上下文批处理中的下一个上下文,或者,如果此批处理完成,则递增全局循环计数并选择下一批。运行上下文还可以使用pause()函数评估延迟。

评估延迟会阻止当前上下文运行,直到达到未来的全局循环计数,然后上下文将自动恢复执行。暂停上下文从当前上下文批处理中删除,并添加到等待未来全局循环计数的全局哈希表中的上下文批处理中。如果对全局哈希表的添加导致新的上下文批记录,则全局哈希表的计数递增。最后,我们将当前位置存储在暂停上下文的跳转缓冲区中。然后,模拟执行可以跳转到当前上下文批处理中的下一个上下文,或者,如果此批处理完成,则增加全局循环计数并选择下一个上下文批处理。

使用context_select()函数选择下一个上下文批处理。我们通过迭代遍历全局哈希表来选择下一个上下文批处理,直到我们获得指向一批上下文的有效指针。全局循环计数随着每个所需的迭代和散列表的引用而递增。每次从哈希表中删除上下文批处理都会导致全局哈希表的计数减少。如前所述,当全局哈希表的计数达到零时,模拟结束

IV。并行的KNIGHTSIM实施方法

我们开发了KnightSim,着眼于最终实现并行化。因此,并行化KnightSim只需要我们在本节中强调的一些变

全文共14839字,剩余内容已隐藏,支付完成后下载完整资料


资料编号:[2340]

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。