CN104615492B - 一种多核并行离散事件仿真的内存管理方法 - Google Patents
一种多核并行离散事件仿真的内存管理方法 Download PDFInfo
- Publication number
- CN104615492B CN104615492B CN201510093402.5A CN201510093402A CN104615492B CN 104615492 B CN104615492 B CN 104615492B CN 201510093402 A CN201510093402 A CN 201510093402A CN 104615492 B CN104615492 B CN 104615492B
- Authority
- CN
- China
- Prior art keywords
- event
- ebi
- ebr
- logical process
- gvt
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Abstract
本发明公开了一种多核并行离散事件仿真的内存管理方法,目的是解决仿真实验过程中多个逻辑进程同时申请内存空间的要求,避免内存申请同步操作。技术方案是首先创建N个逻辑进程和一个GVT计算进程;N个逻辑进程并行地处理事件、向自己的内存池申请内存、发送事件、接收事件、向GVT计算进程发送事件包消息;GVT计算进程计算GVT的值,向所有逻辑进程发送GVT通知消息;N个逻辑进程读取GVT通知消息并获取GVT的值,回收时戳小于全局虚拟时间的事件占用的内存。回收的内存放入处理事件的逻辑进程的内存池,而非内存被分配时所在的内存池。采用本发明可避免单个内存池既分配又回收带来的同步问题和多逻辑进程竞争内存的问题,提高了内存的使用效率。
Description
技术领域
本发明涉及多核并行离散事件仿真系统的内存管理方法,尤其是针对多核并行离散仿真系统的内存管理问题,提供一种基于事件包全局虚拟时间估计的逻辑进程循环内存分配与回收管理方法。
背景技术
并行离散事件仿真(Parallel Discrete Event Simulation,PDES)由一组逻辑进程(Logical Process,LP)构成,每个LP有独立的状态,负责自身的模型解算,并且有自己独立的仿真逻辑时间,称为本地虚拟时间(Local Virtual Time,LVT)。并行离散事件仿真系统的LP是并行运行的。LP之间不共享任何的状态变量,仅通过发送和接收事件的方式进行数据传递。
一般地,多核并行离散事件仿真系统是指在一个或多个CPU上运行的并行离散时间仿真系统,其最主要特征是每个逻辑进程关联到一个CPU物理核,整个仿真系统的程序在一个进程空间内,逻辑进程不需要跨进程通信。多核并行离散事件仿真系统和分布式并行离散事件仿真系统相比,最大优势是逻辑进程间的通信开销小、运行效率高。但由于操作系统的全局统一分配内存需要同步,因此,需要对多核并行离散事件仿真系统使用的内存进行管理。多核并行离散事件仿真系统的内存管理过程包括内存分配、全局虚拟时间(GlobalVirtual Time,GVT)估计、内存回收三个步骤。
首先,多个逻辑进程在创建事件时需要同时向操作系统申请内存空间,逻辑进程申请内存的操作容易成为仿真系统运行性能的瓶颈。需要有合适的内存分配方式来解决多个逻辑进程申请内存的竞争问题。
其次,并行离散事件仿真系统的每个事件都有一个时戳(timestamp),时戳表示事件发生的仿真逻辑时间。为了确保仿真因果关系,每个LP必须按照事件时戳的增序关系顺序处理事件,否则仿真系统将出现因果错误(causality errors)。因此,这样的并行执行机制和因果关系要求,使得并行离散事件仿真必须引入时间同步机制协调LP的运行。当前,同步机制主要有保守时间同步算法和乐观时间同步算法。保守时间同步算法能够严格的防止出现因果错误,但会阻塞LP的运行,使得LP的并行性较差。乐观时间同步算法,也称为时间弯曲(Time Wrap)算法,则不阻塞LP的运行,允许因果错误出现。在乐观时间同步机制下,已处理的事件占用的内存空间不能被逻辑进程立刻回收。逻辑进程将已处理的事件保存起来,当检测到出现因果错误时,通过回滚(rollback)的方式将逻辑进程的状态恢复到之前正常的状态,然后重新按照事件的时序关系继续执行。只有时戳小于全局虚拟时间(GlobalVirtual Time,GVT)的事件才不会被回滚,其占用的内存空间才可以被安全的回收。全局虚拟时间估计算法的效率和精度直接影响仿真系统内存使用的效率。
最后,内存的回收方式也会影响内存的使用效率。例如,全局内存池虽然可以解决内存分配竞争的问题,但是内存回收和内存分配还是需要同步操作。
因此,多核并行离散事件仿真系统的内存管理与内存分配方式、全局虚拟时间估计的精度、内存回收方式相关。仿真系统的内存管理直接影响了仿真系统的运行效率,已经成为仿真领域研究人员关心的一个关键技术问题。很多研究人员在这方面做了很多研究工作,例如全局内存池方法、基于线程的内存池方法等。这些方法可以部分解决内存分配竞争的问题,但是没有和全局虚拟时间的估计相结合,没有完全解决内存是否可回收以及回收方式的问题。
发明内容
本发明要解决的技术问题是:提供一种多核并行离散事件仿真的内存管理方法,满足仿真实验过程中多个逻辑进程同时申请内存空间的要求,避免内存申请同步操作。通过准确估计全局虚拟时间GVT,快速、精确回收事件占用的内存,提高内存的使用效率。
本方法由N个逻辑进程和一个GVT计算进程实现,其中N为自然数且满足N≥2。逻辑进程用LPi表示,下标i为逻辑进程的唯一标识,1≤i≤N。GVT计算进程用GP(GVT Process)表示。每个逻辑进程LPi都有一个独立的内存池MemPooli。MemPooli是一个先入先出(FIFO)的动态队列,队列的大小一般取128、256、512、1024几个典型值,队列的每个元素是一个内存块,在一个内存块上,逻辑进程LPi可以创建用于与其他逻辑进程间进行数据交换的事件。事件定义为五元组BE(s,t,ebi,ts,ed),其中BE.s表示发送该事件的逻辑进程的唯一标识,BE.t表示接收该事件的逻辑进程的唯一标识;BE.ebi是事件的索引,为正整数;BE.ts是事件的仿真时戳,为正实数;BE.ed是事件携带的和具体应用相关的数据,为通用型指针,如void*。逻辑进程LPi有一个事件缓冲队列EventCacheListi、一个待处理事件队列UnProEventListi和一个已处理事件队列ProEventListi。EventCacheListi是一个线程安全的并发队列,用于接收其他逻辑进程发来的事件。对于EventCacheListi,多个事件的插入和读取操作可以并行进行。UnProEventListi用于存放逻辑进程LPi的还没有处理事件,ProEventListi用于存放逻辑进程LPi的已处理但还没有回收内存的事件。
此外,所有的逻辑进程都包含以下变量,以逻辑进程LPi为例:用于记录逻辑进程LPi的事件包索引的变量ebii,ebii为正整数;事件包的大小EventSizei,EventSizei为正整数;逻辑进程LPi自身记录的全局虚拟时间GVTValuei,GVTValuei为正实数;记录LPi的仿真结束时间的变量StopTimei,StopTimei是正实数;逻辑进程LPi的本地虚拟时间LVTi,LVTi为正实数;逻辑进程LPi发送的事件的最小时戳MTSi,MTSi为正实数;逻辑进程LPi给其他逻辑进程发送的事件的计数器SntCi,SntCi为正整数;记录逻辑进程LPi收到的其他进程发来的事件的计数器,称为暂态事件计数器RcvMapi。RcvMapi是一个大小可以动态变化的动态队列,队列的每个元素是一个形如(eventKey、EValue)的二元组,二元组的键eventKey是事件的索引,值EValue是逻辑进程LPi收到的索引为对应键值的事件的数量。
所有的逻辑进程通过构建自己的事件包消息向GVT计算进程GP发送估计GVT所需的数据。事件包消息定义为五元组EBR(id,ebi,LVT,MTS,TMMap),其中EBR.id是发送该事件包消息的逻辑进程的唯一标识,若逻辑进程LPi发送事件包消息,那么EBR.id的取值为i。EBR.ebi是事件包消息产生时对应的逻辑进程的事件包索引,若逻辑进程LPi发送事件包消息,那么EBR.ebi取值为ebii。EBR.LVT记录逻辑进程的本地虚拟时间,EBR.MTS记录逻辑进程发送的事件的最小时戳。EBR.TMMap称为事件包消息的暂态事件计数器,它和逻辑进程LPi的暂态事件计数器RcvMapi有相同的数据结构。逻辑进程LPi发送事件包消息时,LPi将RcvMapi的数据完全赋值给EBR.TMMap。
GVT计算进程GP通过事件包消息缓冲队列EBRCacheList储存所有逻辑进程发来的事件包消息。EBRCacheList是一个线程安全的并发队列。多个逻辑进程可以并发地向一个GVT计算进程的事件包消息缓冲队列插入多个事件包消息。此外,GP通过三个动态队列TMCMap,MTSMap和LVTMap记录所有逻辑进程发来的每个事件包消息的数据。其中,暂态消息队列TMCMap是大小可以动态变化的队列,队列的每个元素是一个形如(ebKey、EBValue)的二元组,二元组的键ebKey是事件包消息的索引,值EBValue是有相同索引的事件的数量。事件最小时戳队列MTSMap是大小可以动态变化的队列队列的每个元素是一个形如(ebKey、MTValue)的二元组,二元组的键ebKey是事件包消息的索引,值MTValue记录事件包消息的发送事件的时戳最小值EBR.MTS;本地虚拟时间队列LVTMap是大小可以动态变化的队列,队列的每个元素是一个形如(ebKey、TValue)的二元组,二元组的键ebKey是事件包消息的索引,值TValue记录事件包消息记录的本地虚拟时间EBR.LVT。此外,GVT计算进程还包含一个GVTValue变量和一个StopTime变量。GVTValue变量用于记录估计出的GVT时间,GVTValue是正实数;变量StopTime记录仿真结束时间,StopTime是正实数。
GP通过计算获得GVT的新的估计值后,通过GVT通知消息给其他逻辑进程发送GVT的值,GVT通知消息表示为GN(NewGVTValue),其中GN.NewGVTValue表示新的GVT估计值,为正实数。
本方法的基本处理过程是:首先创建N个逻辑进程和一个GVT计算进程,N个逻辑进程、GVT计算进程同时进行初始化;然后N个逻辑进程并行地处理事件、向自己的内存池申请内存、发送事件、接收事件、向GVT计算进程发送事件包消息;GVT计算进程收集到N个具有相同索引的事件包消息后计算GVT的值,然后向所有逻辑进程发送GVT通知消息;最后N个逻辑进程并行地读取GVT通知消息并获取GVT的值,再回收时戳小于全局虚拟时间的事件占用的内存。回收的内存放入处理事件的逻辑进程的内存池,而非内存被分配时所在的内存池。例如,逻辑进程LPi向MemPooli申请的内存,创建事件BE(i,j,ebi,ts,ed)并发给逻辑进程LPj(i≠j),事件BE(i,j,ebi,ts,ed)占用的内存将被逻辑进程LPj的内存池MemPoolj回收。反之,逻辑进程LPj给逻辑进程LPi发送的事件BE(j,i,ebi,ts,ed)占用的内存被逻辑进程LPi的内存池MemPooli回收。这就是循环内存分配与回收方法。
具体的技术方案如下:
第一步:创建N个逻辑进程和一个GVT计算进程,GVT计算进程进行初始化,N个逻辑进程并发地进行初始化并分配内存池。1.1,1.2是两个并行的步骤。
1.1:GVT计算进程初始化,具体步骤是:首先给StopTime赋值,如StopTime=5000。StopTime的取值和具体的应用相关,可以取任何的正实数,如5000,单位可以为秒、分钟、小时等时间单位。然后令GVTValue=0,GVTValue的单位和StopTime的单位相同。最后GVT计算进程转到第四步。
1.2:N个逻辑进程并行地初始化,逻辑进程LPi进行初始化的方法是:StopTimei=StopTime,GVTValuei=0,ebii=1,LVTi=0,MTSi=0,SntCi=0,RcvMapi为空,EventSizei的取值为2p形式,p为自然数,EventSizei一般取值为8、16、32、64或128,EventCacheListi为空,ProEventListi为空。逻辑进程LPi将初始事件插入待处理事件队列UnProEventListi,初始事件的个数不小于1。N个逻辑进程执行第二步。
第二步:N个逻辑进程并行地处理事件、发送事件和接收事件。每个逻辑进程通过自己的并发事件缓冲队列实现同时接收多个事件以及读取事件所需的同步操作。逻辑进程LPi处理事件、发送事件和接收事件的方法为:
2.1:设置逻辑进程LPi的变量,MTSi=0,SntCi=0,RcvMapi为空,令已处理事件计数器PEventCounti=0,PEventCounti是逻辑进程LPi的局部变量,为自然数。
2.2:处理事件。判断逻辑进程LPi的UnProEventListi中是否有事件,如果没有,则转到2.4;如果有,则进行处理,具体的步骤如下:
2.2.1:从逻辑进程LPi的待处理事件队列UnProEventListi中取出第一个事件BE(s,i,ebi,ts,ed),PEventCounti加1,即PEventCounti=PEventCounti+1。
2.2.2:如果LPi的本地虚拟时间LVTi小于事件的时戳BE.ts,则令LVTi=BE.ts。
2.2.3:逻辑进程LPi将事件BE(s,i,ebi,ts,ed)插入到已处理事件队列ProEventListi。
2.3发送事件。逻辑进程LPi给其他的一个逻辑进程LPj发送事件BE(s,t,ebi,ts,ed),j为正整数,满足1≤j≤N且j≠i,每个值的选取概率为1/(N-1),具体发送方法如下:
2.3.1:从逻辑进程LPi的内存池MemPooli为事件BE(s,t,ebi,ts,ed)申请第一个内存块。
2.3.2:为事件BE(s,t,ebi,ts,ed)初始化,BE.s=i,BE.t=j,BE.ebi=ebii,BE.ts=LVTi+RT,RT是一个正实数的随机变量,服从参数为θ的指数分布(盛骤等,《概率论与数理统计》,高等教育出版社,2001(2007重印),P55-P56),θ>0,取值与具体的应用相关。BE.ed的取值和具体的应用相关,例如在作战仿真中,BE.ed可以是飞机仿真实体的数量,也可以是飞机仿真实体的状态数据。因此,事件BE(s,t,ebi,ts,ed)被赋值为BE(i,j,ebii,LVTi+RT,ed)。
2.3.3:更新逻辑进程LPi的发送事件最小时戳MTSi,即若MTSi>BE.ts,令MTSi=BE.ts。
2.3.4:更新逻辑进程LPi的发送事件计数器SntCi,即SntCi=SntCi+1。在逻辑进程LPj的事件缓冲队列EventCacheListj插入事件BE(i,j,ebii,LVTi+RT,ed);
2.4:接收事件。判断逻辑进程LPi的EventCacheListi中是否有事件,如果没有,则转到2.5,;如果有,则进行接收:
2.4.1:从EventCacheListi取出第一个事件BE(s,i,ebi,ts,ed),在RcvMapi中增加事件记录RcvMapi[BE.ebi]=RcvMapi[BE.ebi]+1。
2.4.2:将事件插入到待处理事件队列UnProEventListi。
2.5:判断处理的事件计数器PEventCounti是否大于EventSizei,如果PEventCounti<EventSizei,则转到2.2,否则执行第三步。以上的步骤N个逻辑进程分别并行循环,不需要显式同步,逻辑进程间通过逻辑进程的事件缓冲队列实现并发的事件的发送和接收。
第三步:N个逻辑进程并行地向GVT计算进程的事件包消息缓冲队列插入事件包消息,事件包消息缓冲队列是并发队列,能同时插入和读取多个事件包消息。逻辑进程LPi向GVT计算进程的事件包消息缓冲队列插入事件包消息的具体步骤如下:
3.1:LPi创建事件包消息EBR(id,ebi,LVT,MTS,TMMap),将LPi的标识i赋给事件包消息,EBR.id=i。
3.2:将LPi的事件包索引ebii赋给事件包消息,EBR.ebi=ebii。
3.3:将LPi的本地虚拟时间LVTi赋给事件包消息,EBR.LVT=LVTi。
3.4:将LPi的发送事件的最小时戳MTSi赋给事件包消息,EBR.MTS=MTSi。
3.5:给事件包消息的暂态消息计数器赋值,EBR.TMMap=RcvMapi。
3.6:将LPi已发送的消息数量从事件包消息的暂态消息计数器减去,EBR.TMMap[ebii]=EBR.TMMap[ebii]-SntCi。
3.7:重置LPi的已处理事件计数器PEventCounti=0,已发送事件计数器SntCi=0,清空暂态事件计数器RcvMapi;事件包索引ebii增加计数,ebii=ebii+1。
3.8:将事件包消息EBR(id,ebi,LVT,MTS,TMMap)插入到GVT计算进程的事件包消息缓冲队列EBRCacheList,转到第五步。
第四步:GVT计算进程GP计算GVT的最新值,并分别向N个逻辑进程发送GVT通知消息。具体步骤如下:
4.1:GVT计算进程查询包消息缓冲队列EBRCacheList是否有事件包消息,如果没有,则继续查询EBRCacheList,如果有,则进行如下处理:
4.1.1:从事件包消息缓冲队列EBRCacheList取出第一个事件包消息EBR(id,ebi,LVT,MTS,TMMap),然后记录事件包消息的暂态事件的数量,具体步骤如下:
4.1.1.1:令临时计数变量k=0,若k<EBR.TMMap的大小则转到4.1.1.2,否则转到4.1.2;
4.1.1.2:令GVT计算进程的暂态消息队列TMCMap[k]=TMCMap[k]+EBR.TMMap[k],k=k+1,若k<EBR.TMMap则转到4.1.1.2,否则转到4.1.2;
4.1.2:判断MTSMap是否有键值为EBR.ebi的记录,如果没有,则MTSMap[EBR.ebi]=EBR.MTS,如果有且满足MTSMap[EBR.ebi]>EBR.MTS,则MTSMap[EBR.ebi]=EBR.MTS。
4.1.3:判断LVTMap是否有键值为EBR.ebi的记录,如果没有,则LVTMap[EBR.ebi]=EBR.LVT。如果有且满足LVTMap[EBR.ebi]>EBR.LVT,则LVTMap[EBR.ebi]=EBR.LVT。
4.2:判断是否收到N(N是逻辑进程的个数)个索引为同一个EBR.ebi的事件包消息,如果是,转到4.3,否则转到4.1。
4.3:计算GVT的值GVTValue,步骤如下。
4.3.1:计算暂态事件的最小时戳MinTranEventTS,MinTranEventTS是正实数,初始化为正无穷大实数,具体步骤如下:
4.3.1.1:令临时计数变量l=0,若l<EBR.ebi则转到4.3.1.2,否则转到4.3.2。
4.3.1.2:如果TMCMap[l]>0且MinTranEventTS>MTSMap[l],令MinTranEventTS=MTSMap[l],l=l+1,若l<EBR.ebi则转到4.3.1.2,否则转到4.3.2。
4.3.2:计算本地虚拟时间的最小值MinLVT,MinLVT是正实数,初始化为正无穷大实数,具体步骤如下:
4.3.2.1:令临时计数变量m=0,若m<EBR.ebi则转到4.3.2.2,否则转到4.3.3;
4.3.2.2:如果MinLVT>LVTMap[m],则令MinLVT=LVTMap[m],m=m+1,若m<EBR.ebi则转到4.3.2.2,否则转到4.3.3。
4.3.3:计算GVT值并赋给GVTValue变量,GVTValue取值为MinTranEventTS和MinLVT中的较小者,即GVTValue=min(MinTranEventTS,MinLVT),然后向所有逻辑进程分别发送GVT通知消息GN(NewGVTValue),即GN.NewGVTValue=GVTValue。以逻辑进程LPi为例,具体的方法是GVT计算进程将GN(NewGVTValue)插入逻辑进程LPi的EventCacheListi。
4.3.4:判断GVTValue是否小于仿真结束时间StopTime,如果是,则转到第四步,否则转到第七步。
第五步:N个逻辑进程并行地分别从自己的事件缓冲队列中取出GVT通知消息GN(NewGVTValue),并获取GVT的值。具体的方法以逻辑进程LPi为例说明:
5.1:判断逻辑进程LPi的EventCacheListi的第一个事件是不是GVT通知消息,如果是,则转到5.2,否则转到第二步。
5.2:逻辑进程LPi从EventCacheListi取出GVT通知消息GN(NewGVTValue),并将GVT的最新值GN.NewGVTValue赋给逻辑进程LPi的GVTValuei变量,即GVTValuei=GN.NewGVTValue。
第六步:N个逻辑进程并行地回收自己的已处理事件队列中事件占用的内存。LPi回收自己的已处理事件队列中事件占用的内存的方法为:
6.1:对于逻辑进程LPi的已处理事件队列ProEventListi中的每个事件BE(s,i,ebi,ts,ed),判断事件的时戳BE.ts是否小于逻辑进程记录的GVTValuei。如果BE.ts<GVTValuei,则将事件BE(s,i,ebi,ts,ed)从ProEventListi中取出,并将事件占用的内存块插入到逻辑进程内存池MemPooli的队尾。
6.2:判断仿真运行是否结束,如果逻辑进程LPi的GVTValuei小于仿真结束时间StopTimei,则转到第二步,否则转到第七步。
第七步:结束。
采用本发明能达到以下有益效果:
1.本发明针对多核并行离散事件仿真的特点,采用多内存池的方法避免逻辑进程同时申请内存的同步竞争,通过一个内存池分配内存,另一个内存池回收内存的循环内存分配回收方法,避免单个内存池既分配又回收带来的同步问题。
2.本发明不仅避免了多逻辑进程竞争内存的问题,而且通过基于事件包的全局虚拟时间获取方法,精确的估计出全局虚拟时间,最大可能的回收被事件占用的内存,提高了内存的使用效率。
附图说明
图1是本发明总体流程图。
图2是本发明的逻辑进程处理流程图(以逻辑进程LPi为例进行说明)。
图3是本发明的GVT计算进程处理流程图。
具体实施方式
图1是本发明总体流程图。本发明的总体流程是:
第一步:创建N个逻辑进程和一个GVT计算进程。所有逻辑进程以及GVT计算进程都是并行运行。
1.1:GVT计算进程初始化。
1.2:N个逻辑进程并行分配内存池,完成初始化。
(如图2所示,逻辑进程LPi进行的工作如第二步、第三步、第五步、第六步所示。)
第二步:所有逻辑进程并行地处理事件、发送事件、接收并处理事件。
2.1:令LVTi=0,GVTValuei=0,MTSi=0,SntCi=0,RcvMapi为空,令已处理事件计数器PEventCounti=0。
2.2:处理事件。判断UnProEventListi是否有事件,如果没有,则转到2.4;如果有,则进行处理,具体的步骤如下。
2.2.1:从逻辑进程LPi的待处理事件队列UnProEventListi中取出第一个事件
BE(s,i,ebi,ts,ed),PEventCounti加1,即PEventCounti=PEventCounti+1。
2.2.2:更新的本来虚拟时间,如果LVTi小于事件的时戳BE.ts,则LVTi=BE.ts。
2.2.3:将事件插入已处理事件队列ProEventListi。
2.3:发送事件。逻辑进程LPi给其他的一个逻辑进程LPj发送事件BE(s,t,ebi,ts,ed),j为正整数,满足1≤j≤N且j≠i,每个值的选取概率为1/(N-1),具体方法如下:
2.3.1:从逻辑进程LPi的内存池MemPooli为事件BE(s,t,ebi,ts,ed)申请第一个内存块。
2.3.2:为事件BE(s,t,ebi,ts,ed)初始化,令BE.s=i,BE.t=j,BE.ebi=ebii,BE.ts=LVTi+RT。
2.3.3:更新发送事件最小时戳MTSi,即若MTSi>BE.ts,令MTSi=BE.ts。
2.3.4:更新逻辑进程LPi的发送事件计数器SntCi,即SntCi=SntCi+1,并将事件插入逻辑进程LPj的事件缓冲队列EventCacheListj。
2.4:接收事件。判断逻辑进程LPi的EventCacheListi中是否有事件,如果没有,则转到2.5,如果有,则进行如下处理:
2.4.1:从EventCacheListi取出第一个事件,在RcvMapi中增加事件记录RcvMapi[BE.ebi]=RcvMapi[BE.ebi]+1。
2.4.2:将事件插入待处理事件队列UnProEventListi。
2.5:判断处理的事件计数器PEventCounti是否大于EventSizei,如果是,则转到2.2,否则执行第三步。
第三步:所有逻辑进程并行地向GVT计算进程发送事件包消息。N个逻辑进程将事件包消息插入GVT计算进程的EBRCacheList。
3.1:将逻辑进程的标识i赋给事件包消息,EBR.id=i。
3.2:将逻辑进程的事件包索引ebii赋给事件包消息的索引EBR.ebi,即EBR.ebi=ebii。
3.3:将逻辑进程的本地虚拟时间LVTi赋给事件包消息,即EBR.LVT=LVTi。
3.4:将逻辑进程的发送事件最小时戳MTSi赋给事件包消息,即EBR.MTS=MTSi。
3.5:将逻辑进程的暂态事件数据项RcvMapi赋给事件包消息,即EBR.TMMap=RcvMapi。
3.6:将逻辑进程发送的消息数量从事件包消息的暂态消息数据项减去,EBR.TMMap[ebii]=EBR.TMMap[ebii]-SntCi。
3.7:重置逻辑进程的已处理事件计数器PEventCounti=0,已发送事件计数器SntCi=0,清空暂态事件计数器RcvMapi;事件包索引ebii增加计算,ebii=ebii+1。
3.8:将事件包消息EBR(id,ebi,LVT,MTS,TMMap)插入到GVT计算进程的事件包消息缓冲队列EBRCacheList,转到第五步。
第四步如图3所示:GVT计算进程GP计算GVT的最新值,并分别向N个逻辑进程发送GVT通知消息。具体步骤如下:
4.1:GVT计算进程查询包消息缓冲队列EBRCacheList是否有事件包消息,如果没有,则继续查询EBRCacheList,如果有,则进行如下处理:
4.1.1:从事件包消息缓冲队列EBRCacheList取出第一个事件包消息EBR(id,ebi,LVT,MTS,TMMap),然后记录事件包消息的暂态事件的数量。
4.1.2:判断MTSMap是否有键值为EBR.ebi的记录,如果没有,则MTSMap[EBR.ebi]=EBR.MTS,如果有且满足MTSMap[EBR.ebi]>EBR.MTS,则MTSMap[EBR.ebi]=EBR.MTS。
4.1.3:判断LVTMap是否有键值为EBR.ebi的记录,如果没有,则LVTMap[EBR.ebi]=EBR.LVT。如果有且满足LVTMap[EBR.ebi]>EBR.LVT,则LVTMap[EBR.ebi]=EBR.LVT。
4.2:判断是否收到N个索引值为同一个EBR.ebi的事件包消息,如果是,则转到4.3.1,否则转到4.1。
4.3.1:计算暂态事件的最小时戳MinTranEventTS,MinTranEventTS初始化为正无
穷大实数。
4.3.2:计算所有逻辑进程的本地虚拟时间的最小值MinLVT,MinLVT初始化为正无穷大实数。
4.3.3:计算新的GVT值,并向所有逻辑进程发送GVT通知消息GN(NewGVTValue),其中GVTValue=min(MinTranEventTS,MinLVT),GN.NewGVTValue=GVTValue。
4.3.4:判断GVTValue是否小于仿真结束时间StopTime,如果是,则转到4.1,否则转到第七步。
第五步:所有逻辑进程从自己的事件缓冲队列读取GVT计算进程的GVT通知消息,获取最新GVT值。
5.1:判断EventCacheListi的第一个事件是不是GVT通知消息,如果是,则转到5.2,否则转到2.1。
5.2:从EventCacheListi的取出GVT通知消息,并将GVT的最新值GN.NewGVTValue赋给逻辑进程LPi的GVTValuei变量,即GVTValuei=GN.NewGVTValue。
第六步:所有逻辑进程并行地回收事件占用的内存。
6.1:对于已处理事件队列ProEventListi中的每个事件BE(s,i,ebi,ts,ed),如果BE.ts<GVTValuei,则将事件从ProEventListi取出,并将事件占用的内存块回收,插入逻辑进程的内存池MemPooli的队尾。
6.2:如果逻辑进程LPi的GVTValuei小于仿真结束时间StopTimei,则转到2.1,否则转到第七步。
第七步:结束。
Claims (7)
1.一种多核并行离散事件仿真的内存管理方法,其特征在于包括以下步骤:
第一步:创建N个逻辑进程和一个全局虚拟时间计算进程即GVT计算进程,GVT计算进程进行初始化,同时N个逻辑进程并发地进行初始化并分配内存池,其中N为自然数且满足N≥2:
GVT计算进程初始化的方法是:首先给仿真结束时间变量StopTime赋值,StopTime为正实数,单位为秒或分钟或小时;然后令全局虚拟时间变量GVTValue=0,GVTValue的单位和StopTime的单位相同;事件包消息缓冲队列EBRCacheList置为空,EBRCacheList是一个线程安全的并发队列,它的元素是事件包消息;GVT计算进程转到第四步;
N个逻辑进程并行地进行初始化,第i个逻辑进程用LPi表示,i为逻辑进程LPi的唯一标识,1≤i≤N;逻辑进程LPi进行初始化的方法是:LPi的仿真结束时间变量StopTimei=StopTime,LPi的全局虚拟时间变量GVTValuei=0,LPi的事件包索引变量ebii=1,LPi的本地虚拟时间变量LVTi=0,LPi的发送事件最小时戳变量MTSi=0,LPi的已发送事件计数器SntCi=0,LPi的事件包大小变量EventSizei的取值为2p形式,p为自然数;LPi的暂态事件计数器RcvMapi为空,RcvMapi是一个大小可以动态变化的动态队列,队列的每个元素是一个形如(eventKey、EValue)的二元组,二元组的键eventKey是事件的索引,值EValue是逻辑进程LPi收到的索引为对应键值的事件的数量,事件BE(s,i,ebi,ts,ed)是一个五元组,其中BE.s表示发送该事件的逻辑进程的唯一标识,BE.i表示接收该事件的逻辑进程的唯一标识;BE.ebi是事件的索引,为正整数;BE.ts是事件的仿真时戳,为正实数;BE.ed是事件携带的和具体的应用相关的数据,为通用型指针;LPi的事件缓冲队列EventCacheListi置为空,队列的元素为事件;EventCacheListi是一个线程安全的并发队列,用于接收其他逻辑进程发来的事件;LPi的已处理事件队列ProEventListi为空,队列的元素为事件;逻辑进程LPi将初始事件插入待处理事件队列UnProEventListi,队列的元素为事件,初始事件的个数不小于1;N个逻辑进程执行第二步;
第二步:N个逻辑进程并行地处理事件、发送事件和接收事件,方法为:
2.1:设置逻辑进程LPi的变量,MTSi=0,SntCi=0,RcvMapi为空,令已处理事件计数器PEventCounti=0,PEventCounti是逻辑进程LPi的局部变量,为自然数;
2.2:判断逻辑进程LPi的UnProEventListi中是否有事件,如果没有,则转到2.4;如果有,则进行处理,步骤如下:
2.2.1:从逻辑进程LPi的UnProEventListi中取出第一个事件BE(s,i,ebi,ts,ed),PEventCounti加1,即PEventCounti=PEventCounti+1;
2.2.2:如果LPi的本地虚拟时间LVTi小于事件的时戳BE.ts,令LVTi=BE.ts;
2.2.3:逻辑进程LPi将事件BE(s,i,ebi,ts,ed)插入到已处理事件队列ProEventListi;
2.3逻辑进程LPi给其他的一个逻辑进程LPj发送事件BE(s,t,ebi,ts,ed),其中j为正整数,满足1≤j≤N且j≠i,每个值的选取概率为1/(N-1),发送的事件插入逻辑进程LPj的事件缓冲队列EventCacheListj中;
2.4:判断逻辑进程LPi的EventCacheListi中是否有事件,如果没有,则转到2.5;如果有,则进行如下处理:
2.4.1:从EventCacheListi取出第一个事件BE(s,i,ebi,ts,ed),在RcvMapi中增加事件记录RcvMapi[BE.ebi]=RcvMapi[BE.ebi]+1;
2.4.2:将事件插入到待处理事件队列UnProEventListi;
2.5:判断处理的事件计数器PEventCounti是否大于EventSizei,如果PEventCounti<EventSizei,则转到2.2,否则执行第三步;
第三步:N个逻辑进程并行地向GVT计算进程的事件包消息缓冲队列EBRCacheList插入事件包消息,事件包消息定义为五元组EBR(id,ebi,LVT,MTS,TMMap),其中EBR.id是发送该事件包消息的逻辑进程的唯一标识,若逻辑进程LPi发送事件包消息,则EBR.id的取值为i;EBR.ebi是事件包消息的索引,若逻辑进程LPi发送事件包消息,则EBR.ebi取值为ebii,EBR.LVT记录逻辑进程的本地虚拟时间,EBR.MTS记录逻辑进程发送的事件的最小时戳,EBR.TMMap称为事件包消息的暂态事件计数器,它和逻辑进程LPi的暂态事件计数器RcvMapi有相同的数据结构,逻辑进程LPi发送事件包消息时,LPi将RcvMapi的数据完全赋值给EBR.TMMap;转到第五步;
第四步:GVT计算进程GP计算GVT的最新值,并分别向N个逻辑进程发送GVT通知消息,具体步骤如下:
4.1:GVT计算进程查询包消息缓冲队列EBRCacheList是否有事件包消息,如果没有,则继续查询EBRCacheList;如果有,则进行如下处理:
4.1.1:从事件包消息缓冲队列EBRCacheList取出第一个事件包消息EBR(id,ebi,LVT,MTS,TMMap),然后记录事件包消息的暂态事件的数量,具体步骤如下:
4.1.1.1:令临时计数变量k=0,若k<EBR.TMMap的大小则转到4.1.1.2,否则转到4.1.2;
4.1.1.2:令GVT计算进程的暂态消息队列TMCMap[k]=TMCMap[k]+EBR.TMMap[k],k=k+1,若k<EBR.TMMap的大小则转到4.1.1.2,否则转到4.1.2;暂态消息队列TMCMap是大小可以动态变化的队列,队列的每个元素是一个形如(ebKey、EBValue)的二元组,二元组的键ebKey是事件包消息的索引,值EBValue是有相同索引的事件的数量;
4.1.2:判断GVT计算进程的事件最小时戳队列MTSMap是否有键值为EBR.ebi的记录,如果没有,则MTSMap[EBR.ebi]=EBR.MTS,如果有且满足MTSMap[EBR.ebi]>EBR.MTS,则MTSMap[EBR.ebi]=EBR.MTS;事件最小时戳队列MTSMap是大小可以动态变化的队列,队列的每个元素是一个形如(ebKey、MTValue)的二元组,值MTValue记录事件包消息的发送事件的时戳最小值EBR.MTS;
4.1.3:判断GVT计算进程的本地虚拟时间队列LVTMap是否有键值为EBR.ebi的记录,如果没有,则LVTMap[EBR.ebi]=EBR.LVT,如果有且满足LVTMap[EBR.ebi]>EBR.LVT,则LVTMap[EBR.ebi]=EBR.LVT;本地虚拟时间队列LVTMap是大小可以动态变化的队列,队列的每个元素是一个形如(ebKey、TValue)的二元组,值TValue记录事件包消息记录的本地虚拟时间EBR.LVT;
4.2:判断是否收到N个索引为同一个EBR.ebi的事件包消息,如果是,转到4.3,否则转到4.1;
4.3:计算GVT的值并赋给全局虚拟时间变量GVTValue,判断GVTValue是否小于仿真结束时间StopTime,如果是,则转到第四步,否则转到第七步;
第五步:N个逻辑进程并行地分别从自己的事件缓冲队列中取出GVT通知消息GN(NewGVTValue),GVT通知消息GN(NewGVTValue)含一个变量GN.NewGVTValue,GN.NewGVTValue表示新的GVT估计值,为正实数;逻辑进程LPi取出GVT通知消息并获取GVT的值的方法是:
5.1:判断逻辑进程LPi的EventCacheListi的第一个事件是不是GVT通知消息,如果是,转到5.2,否则转到第二步;
5.2:逻辑进程LPi从EventCacheListi取出GVT通知消息GN(NewGVTValue),并将GVT的最新值GN.NewGVTValue赋给逻辑进程LPi的GVTValuei变量,即GVTValuei=GN.NewGVTValue;
第六步:N个逻辑进程并行地回收自己的已处理事件队列中事件占用的内存,LPi回收自己的已处理事件队列中事件占用的内存的方法为:
6.1:对于逻辑进程LPi的已处理事件队列ProEventListi中的每个事件BE(s,i,ebi,ts,ed),判断事件的时戳BE.ts是否小于逻辑进程记录的GVTValuei;如果BE.ts<GVTValuei,则将事件BE(s,i,ebi,ts,ed)从ProEventListi中取出,并将事件占用的内存块插入到逻辑进程内存池MemPooli的队尾;
6.2:判断仿真运行是否结束,如果逻辑进程LPi的GVTValuei小于仿真结束时间StopTimei,则转到第二步,否则转到第七步;
第七步:结束。
2.如权利要求1所述的一种多核并行离散事件仿真的内存管理方法,其特征在于所述2.3步中逻辑进程LPi给LPj发送事件BE(s,t,ebi,ts,ed)的方法是:
2.3.1:从逻辑进程LPi的内存池MemPooli为事件BE(s,t,ebi,ts,ed)申请第一个内存块;
2.3.2:为事件BE(s,t,ebi,ts,ed)初始化,BE.s=i,BE.t=j,BE.ebi=ebii,BE.ts=LVTi+RT,RT是一个正实数的随机变量,服从参数为θ的指数分布,θ>0;BE.ed的取值和具体的应用相关,事件BE(s,t,ebi,ts,ed)赋值为BE(i,j,ebii,LVTi+RT,ed);
2.3.3:若MTSi>BE.ts,令MTSi=BE.ts;
2.3.4:更新逻辑进程LPi的发送事件计数器SntCi,即SntCi=SntCi+1,在逻辑进程LPj的事件缓冲队列EventCacheListj插入事件BE(i,j,ebii,LVTi+RT,ed)。
3.如权利要求1所述的一种多核并行离散事件仿真的内存管理方法,其特征在于所述第三步中N个逻辑进程向GVT计算进程的事件包消息缓冲队列EBRCacheList插入事件包消息的方法相同,逻辑进程LPi向GVT计算进程的事件包消息缓冲队列插入事件包消息的步骤如下:
3.1:LPi创建事件包消息EBR(id,ebi,LVT,MTS,TMMap),将LPi的标识i赋给事件包消息,EBR.id=i;
3.2:将LPi的事件包索引ebii赋给事件包消息,EBR.ebi=ebii;
3.3:将LPi的本地虚拟时间LVTi赋给事件包消息,EBR.LVT=LVTi;
3.4:将LPi的发送事件的最小时戳MTSi赋给事件包消息,EBR.MTS=MTSi;
3.5:给事件包消息的暂态消息数据项赋值,EBR.TMMap=RcvMapi;
3.6:将LPi发送的消息数量从事件包消息的暂态消息数据项减去,EBR.TMMap[ebii]=EBR.TMMap[ebii]-SntCi;
3.7:重置LPi的已处理事件计数器PEventCounti=0,已发送事件计数器SntCi=0,清空暂态事件计数器RcvMapi;事件包索引ebii增加计数,ebii=ebii+1;
3.8:将事件包消息EBR(id,ebi,LVT,MTS,TMMap)插入到GVT计算进程的事件包消息缓冲队列EBRCacheList。
4.如权利要求1所述的一种多核并行离散事件仿真的内存管理方法,其特征在于所述4.3步计算GVT的值并赋给全局虚拟时间变量GVTValue的方法是:
4.3.1:计算暂态事件的最小时戳MinTranEventTS,MinTranEventTS是正实数,初始化为正无穷大实数,具体步骤如下:
4.3.1.1:令临时计数变量l=0,若l<EBR.ebi则转到4.3.1.2,否则转到4.3.2;
4.3.1.2:如果TMCMap[l]>0且MinTranEventTS>MTSMap[l],令MinTranEventTS=MTSMap[l],l=l+1,若l<EBR.ebi则转到4.3.1.2,否则转到4.3.2;
4.3.2:计算本地虚拟时间的最小值MinLVT,MinLVT是正实数,初始化为正无穷大实数,具体步骤如下:
4.3.2.1:令临时计数变量m=0,若m<EBR.ebi,则转到4.3.2.2,否则转到4.3.3;
4.3.2.2:如果MinLVT>LVTMap[m],则令MinLVT=LVTMap[m],m=m+1,若m<EBR.ebi则转到4.3.2.2,否则转到4.3.3;
4.3.3:计算GVT值并赋给全局虚拟时间变量GVTValue,GVTValue=min(MinTranEventTS,MinLVT),min(MinTranEventTS,MinLVT)表示取MinTranEventTS和MinLVT中的较小者;然后向所有逻辑进程分别发送GVT通知消息GN(NewGVTValue),其中GN.NewGVTValue=GVTValue。
5.如权利要求1所述的一种多核并行离散事件仿真的内存管理方法,其特征在于所述StopTime=5000,单位为秒或分钟或小时。
6.如权利要求1所述的一种多核并行离散事件仿真的内存管理方法,其特征在于所述逻辑进程的个数N满足N≥2。
7.如权利要求1所述的一种多核并行离散事件仿真的内存管理方法,其特征在于所述LPi的事件包大小变量EventSizei的取值为8、16、32、64或128。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510093402.5A CN104615492B (zh) | 2015-03-01 | 2015-03-01 | 一种多核并行离散事件仿真的内存管理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510093402.5A CN104615492B (zh) | 2015-03-01 | 2015-03-01 | 一种多核并行离散事件仿真的内存管理方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104615492A CN104615492A (zh) | 2015-05-13 |
CN104615492B true CN104615492B (zh) | 2017-12-19 |
Family
ID=53149948
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510093402.5A Active CN104615492B (zh) | 2015-03-01 | 2015-03-01 | 一种多核并行离散事件仿真的内存管理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104615492B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104866374B (zh) * | 2015-05-22 | 2018-07-06 | 北京华如科技股份有限公司 | 基于多任务的离散事件并行仿真及时间同步方法 |
US20160381120A1 (en) * | 2015-06-24 | 2016-12-29 | Intel Corporation | System for event dissemination |
CN105183536B (zh) * | 2015-09-14 | 2018-11-13 | 中国人民解放军国防科学技术大学 | 基于gpu的乐观时间管理方法 |
CN107515785A (zh) * | 2016-06-16 | 2017-12-26 | 大唐移动通信设备有限公司 | 一种内存管理方法及装置 |
CN113051081B (zh) * | 2021-06-01 | 2021-10-29 | 广东省新一代通信与网络创新研究院 | 基于内存池的事件状态管理方法、系统及存储介质 |
CN115037631B (zh) * | 2022-05-13 | 2023-08-22 | 北京中科晶上科技股份有限公司 | 基于集群的网络仿真方法、装置和网络仿真系统 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2003096235A2 (en) * | 2002-05-13 | 2003-11-20 | Rensselaer Polytechnic Institute | Discrete event simulation system and method |
CN101436959A (zh) * | 2008-12-18 | 2009-05-20 | 中国人民解放军国防科学技术大学 | 基于后台管控架构的并行仿真任务分发与调度方法 |
CN101980166A (zh) * | 2010-10-09 | 2011-02-23 | 北京航空航天大学 | 一种用于机群系统并行模拟的时间序列控制方法 |
CN103268251A (zh) * | 2013-05-02 | 2013-08-28 | 中国人民解放军国防科学技术大学 | 一种基于时戳截流的并行离散事件仿真时间同步方法 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101788919B (zh) * | 2010-01-29 | 2013-08-14 | 中国科学技术大学苏州研究院 | 片上多核处理器时钟精确并行仿真系统及仿真方法 |
CN102591759B (zh) * | 2011-12-29 | 2014-08-13 | 中国科学技术大学苏州研究院 | 片上众核处理器时钟精确并行仿真系统 |
-
2015
- 2015-03-01 CN CN201510093402.5A patent/CN104615492B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2003096235A2 (en) * | 2002-05-13 | 2003-11-20 | Rensselaer Polytechnic Institute | Discrete event simulation system and method |
CN101436959A (zh) * | 2008-12-18 | 2009-05-20 | 中国人民解放军国防科学技术大学 | 基于后台管控架构的并行仿真任务分发与调度方法 |
CN101980166A (zh) * | 2010-10-09 | 2011-02-23 | 北京航空航天大学 | 一种用于机群系统并行模拟的时间序列控制方法 |
CN103268251A (zh) * | 2013-05-02 | 2013-08-28 | 中国人民解放军国防科学技术大学 | 一种基于时戳截流的并行离散事件仿真时间同步方法 |
Non-Patent Citations (1)
Title |
---|
《基于多核平台的乐观并行离散事件仿真》;苏年乐,吴雪阳,李群,王维平,朱一凡;《系统仿真学报》;20100430;第859-863页 * |
Also Published As
Publication number | Publication date |
---|---|
CN104615492A (zh) | 2015-05-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104615492B (zh) | 一种多核并行离散事件仿真的内存管理方法 | |
CN104731574B (zh) | 用于识别多级工作流处理中的资源瓶颈的方法和系统 | |
CN104734989B (zh) | 基于令牌桶的数据传输流量调度方法及其系统 | |
CN108132838A (zh) | 一种图数据处理的方法、装置及系统 | |
CN105975433B (zh) | 一种报文处理方法及装置 | |
CN106547882A (zh) | 一种智能电网中营销大数据的实时处理方法及系统 | |
CN102739785B (zh) | 基于网络带宽估计的云计算任务调度方法 | |
CN104572106A (zh) | 一种基于小内存处理大规模数据的并行程序开发方法 | |
CN111209091B (zh) | 混合云环境下含隐私数据的Spark任务的调度方法 | |
CN108304918A (zh) | 一种数据并行的深度学习的参数交换方法和系统 | |
CN105094981B (zh) | 一种数据处理的方法及装置 | |
CN110471944A (zh) | 指标统计方法、系统、设备及存储介质 | |
CN101132270B (zh) | 多节点协调的时间一致性管理方法 | |
CN110209467A (zh) | 一种基于机器学习的弹性资源扩展方法和系统 | |
CN102945198A (zh) | 一种表征高性能计算应用特征的方法 | |
CN102314798B (zh) | 电子地图多边形面要素的形状点的自动简化的方法及装置 | |
CN107679133B (zh) | 一种实用于海量实时pmu数据的挖掘方法 | |
CN104866375B (zh) | 一种迁移虚拟机的方法及装置 | |
CN101980166B (zh) | 一种用于机群系统并行模拟的时间序列控制方法 | |
CN105183536B (zh) | 基于gpu的乐观时间管理方法 | |
CN102629352B (zh) | 面向实时感知环境的复合事件模式匹配方法及系统 | |
CN107391044A (zh) | 一种云硬盘的创建方法及创建装置 | |
CN104424123B (zh) | 一种无锁数据缓冲区及其使用方法 | |
CN104598600B (zh) | 一种基于分布式内存的并行数字地形分析优化方法 | |
WO2012093469A1 (ja) | 性能評価装置及び性能評価方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |