并行离散事件模拟问题PDES(parallel discrete event simulation)与GEM5

1、典型的顺序离散事件模拟器

典型的顺序离散事件模拟器通常拥有以下四种数据结构:

(1)描述系统状态的状态变量

(2)包含所有已调度但尚未生效的挂起事件的事件列表

(3)全局时钟变量,用于表示模拟已进展的程度。

(4)事件,通常表示正在模拟的系统状态的一些变化,包含一个时间戳。

时间戳指示实际系统中何时发生此更改。模拟器的“主循环”重复地从事件列表中删除最小的时间戳事件,并处理该事件。处理事件涉及执行一些模拟器代码以实现适当的状态更改,并将零个或多个新事件调度到模拟的未来中,以模拟受调查系统中的因果关系。现代模拟器通常包含额外的模拟结构(例如,过程);然而,这些抽象通常构建在前面描述的事件列表机制之上。(gem5的结构有所不同但是类似,其中事件列表在Gem5中使用事件队列代替,系统状态变量在继承了SimObject的众多对象之中,全局时钟变量在事件队列和SimObject对象中都有,执行事件时会进行同步,事件构成与之前描述相似,通过重写process()纯虚函数实现修改系统状态与调度未来事件的功能)。

2、因果关系错误

在上文中,我们必须从事件列表中选择最小的时间戳事件(Ei)作为下一个要处理的事件。这是因为,如果要选择包含更大时间戳的其他事件,例如Ex,则Ex可能会修改Ei使用的状态变量。这相当于模拟一个未来可能影响过去的系统!这显然是不可接受的;我们将这种错误称为因果关系错误。

3、并行离散事件模拟

        现在让我们考虑基于上述范例的模拟程序的并行化。并行性的最大机会来自于在不同处理器上处理事件。然而,我们很快就发现困难。考虑这样一种情况,两个事件E1和E2的并发执行,时间戳分别为T1和T2。假设T1<T2。如果E1写入E2读取的状态变量,则必须在E2之前执行E1,以确保不会发生因果关系错误。所以,为了模拟结果正确,事件的执行必须保持一定的排序条件。

        下面介绍一种并行计算离散事件模拟的模型

其中Oi是系统内的对象,Ci是系统内的任务(可以看作一个或者多个事件)。Oi横轴上的竖线代表此时对象的状态被改变了。指向任务的曲线代表任务读取了对象的数据,指向对象的曲线代表任务修改了对象的数据,从图中也可以看出C1在修改O1数据后O1的状态就发生了改变。因为要并行嘛,我们假设存在一个全局调度队列。每当一个进程空闲时,它就会从此队列中删除下一个任务并执行它。任务应该包括以下几种功能:

1、NewTask(T,C) :在虚拟时间T时刻创建任务C,其中T严格大于当前执行任务的时间。

2、Read(T,S) :从时空存储器(系统过程)中读取空间地址S(内存地址)和时间地址T(T时刻)处数据D的版本。

3、Write(T,S,D):将数据D写入空间地址S和时间地址T。如果这是任务第一次写入该对象,则创建新版本;否则,先前存储在该空时地址的值将被覆盖 

        NewTask操作创建描述任务的记录,并将其放入全局调度队列。这相当于在离散事件模拟中调度事件。在这个系统中同一对象的每个状态可以被多个任务读取数据,但是每个状态只能对应一个写操作,且就是写操作创造了对应的这个对象状态。

        我们注意到离散事件模拟问题可以非常自然地映射到上述计算模型上。任务对应于模拟器事件,数据对象对应于状态变量。机器架构的一个值得注意的方面是,每个模拟器事件都提供了该事件模拟时系统状态的全局视图。这正是顺序模拟中出现的情况。事实上,虚拟时间机使用的执行机制是顺序事件列表模拟器使用的机制的直接扩展。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值