一种快速的全系统模拟器确定性回放方法

文档序号:6630674阅读:239来源:国知局
一种快速的全系统模拟器确定性回放方法
【专利摘要】本发明公开了一种快速的全系统模拟器确定性回放方法,其实施步骤如下:将并行程序的内存分为固定大小的块,将每块作为一个数据对象,在并行程序执行时记录数据对象的访存顺序;根据记录的数据对象的访存顺序重放并行程序,每当并行程序的一个线程执行写操作修改数据对象时,如果该数据对象仍有其它线程的读操作尚未完成,则先保留数据对象副本再执行数据对象的写操作,其它线程在执行读操作时则读取被保留的数据对象副本。本发明具有等待时间开销小、执行效率高、回放速度快、线程扩展性能强的优点。
【专利说明】一种快速的全系统模拟器确定性回放方法

【技术领域】
[0001]本发明涉及并行程序的调试及可靠性【技术领域】,尤其涉及一种快速的全系统模拟器确定性回放方法。

【背景技术】
[0002]由于数据竞争等因素的存在,并行程序的执行具有不确定性,即在给定输入下运行程序,并不一定会得到唯一的结果。记录-回放方法是一种能够使并行程序确定性执行的方法。记录-回放方法首先对并行程序的执行进行记录,主要记录程序中的访存顺序。然后对并行程序进行回放,在回放阶段,按照日志记录中的访存顺序执行并行程序指令。记录-回放方法能够保持回放阶段的执行和记录阶段的执行完全一致,具有复现程序执行的效果,对并行程序调试和可靠性具有重要意义。但是,现有技术的全系统模拟器确定性回放方法针对写操作时,必须等到所有对相同版本的数据的读操作完成之后才能进行,引起了很多等待时间,导致回放速率较低,实验显示从8线程扩展到16线程时程序回放的性能出现了下降。


【发明内容】

[0003]本发明要解决的技术问题是提供一种等待时间开销小、执行效率高、回放速度快、线程扩展性能强的快速的全系统模拟器确定性回放方法。
[0004]为解决上述技术问题,本发明采用的技术方案为:
一种快速的全系统模拟器确定性回放方法,其实施步骤如下:
1)将并行程序的内存分为固定大小的块,将每块作为一个数据对象,在并行程序执行时记录数据对象的访存顺序;
2)根据记录的所述数据对象的访存顺序重放并行程序,每当并行程序的一个线程执行写操作修改数据对象时,如果该数据对象仍有其它线程的读操作尚未完成,则先保留数据对象副本再执行数据对象的写操作,其它线程在执行读操作时则读取被保留的数据对象副本。
[0005]优选地,所述步骤I)的详细执行步骤如下:
1.1)初始化并行程序,为并行程序的每个线程创建一个用于记录线程的访存顺序的日志文件,为每个线程设置一个访存指令执行数并初始化为O ;
1.2)将并行程序的内存分为固定大小的块,每一个块作为一个数据对象,为每个数据对象设置一个版本号并初始化为O ;
1.3)并行程序选择一条待执行的访存指令并分配给指定线程执行,所述指定线程首先判断访存指令的指令类型,如果访存指令是读指令,则转到步骤1.4);如果访存指令是写指令则转到步骤1.5);
1.4)通过所述指定线程获取访存指令的目标数据对象以及目标数据对象的版本号,在所述指定线程的日志文件增加一条日志记录,所述日志记录包括针对目标数据对象的读操作以及目标数据对象的版本号,执行访存指令对目标数据对象的读操作;将访存指令执行数量加1,转到步骤1.6);
1.5)通过所述指定线程获取访存指令的目标数据对象以及目标数据对象的版本号,在所述指定线程的日志文件增加一条日志记录,所述日志记录包括针对目标数据对象的写操作以及目标数据对象的版本号,执行访存指令对目标数据对象的写操作,将目标数据对象的版本号加I ;将访存指令执行数加1,转到步骤1.6);
1.6)判断并行程序是否还有未执行的指令,如果有则转到步骤1.3),否则判定记录并行程序针对所述数据对象的访存顺序完毕,得到与并行程序的线程数量相同的日志文件,跳转执行步骤2)。
[0006]优选地,所述步骤2)的详细执行步骤如下:
2.1)初始化并行程序,为并行程序的每个线程创建一个用于记录线程的访存信息的日志文件,为每个线程设置一个访存指令执行数并初始化为O ;
2.2)将并行程序的内存分为固定大小的块,每一个块作为一个数据对象,为每个数据对象设置一个版本号并初始化为O ;对每个数据对象创建一个用于存放保留执行写操作前的数据对象副本的数据对象队列并初始化为空;
2.3)并行程序根据所述访存指令执行数读取分配给指定线程执行的访存指令,所述指定线程首先判断访存指令的指令类型,如果访存指令是读指令,则转到步骤2.4);如果访存指令是写指令则转到步骤2.5);
2.4)通过所述指定线程获取访存指令的目标数据对象以及目标数据对象当前的版本号,根据当前的版本号、所述指定线程的日志文件记录的版本号判断访存指令的目标版本数据,如果访存指令的目标版本数据为目标数据对象,则直接执行访存指令对目标数据对象的读操作;如果访存指令的目标版本数据为数据对象队列中的数据对象副本,则执行访存指令对数据对象队列中的数据对象副本的读操作,在数据对象队列中删除多余的数据对象副本;将访存指令执行数加1,转到步骤2.6);
2.5)通过所述指定线程获取访存指令的目标数据对象以及目标数据对象当前的版本号,根据当前的版本号、所述指定线程的日志文件记录的版本号判断访存指令的目标数据对象是否仍有其它线程的读操作正在等待,如果目标数据对象仍有其它线程的读操作正在等待,则执行所述数据对象的写操作,保留执行写操作前的数据对象副本并添加至数据对象队列中;将访存指令执行数加1,转到步骤2.6);
2.6)判断并行程序是否还有未执行的指令,如果有则转到步骤2.3),否则判定根据记录结果重放并行程序的执行完毕,结束回放并退出。
[0007]优选地,所述步骤2.4)的详细执行步骤如下:
2.4.1)通过所述指定线程获取访存指令的目标数据对象以及目标数据对象当前的版本号;根据所述访存指令执行数读取所述指定线程的日志文件中对应所述访存指令以及目标数据对象的记录的版本号,将当前的版本号、记录的版本号进行比较,如果当前的版本号小于记录的版本号则转到步骤2.4.2),否则转到步骤2.4.3);
2.4.2)强制所述指定线程等待直到目标数据对象当前的版本号大于或者等于记录的版本号;
2.4.3)判断当前的版本号大于记录的版本号是否成立,如果成立则判定访存指令的目标版本数据为数据对象队列中的数据对象副本,转到步骤2.4.4);否则,判定访存指令的目标版本数据为目标数据对象,直接执行访存指令对目标数据对象的读操作,转到步骤2.4.6);
2.4.4)查找数据对象队列中的数据对象副本,找到其中版本号为所述记录的版本号的数据对象副本,执行访存指令对数据对象队列中的数据对象副本的读操作;
2.4.5)判断是否还有其他线程需要对版本号为所述记录的版本号的数据对象副本进行读操作,如果没有则从数据对象队列中删除版本号为所述记录的版本号的数据对象副本;
2.4.6)访存指令的读操作完成,将访存指令执行数加1,转到步骤2.6)。
[0008]优选地,所述步骤2.5)的详细执行步骤如下:
2.5.1)通过所述指定线程获取访存指令的目标数据对象以及目标数据对象当前的版本号;根据所述访存指令执行数读取所述指定线程的日志文件中对应所述访存指令以及目标数据对象的记录的版本号,将当前的版本号、记录的版本号进行比较,如果当前的版本号小于记录的版本号则转到步骤2.5.2),否则转到步骤2.5.3);
2.5.2)强制所述指定线程等待直到目标数据对象当前的版本号等于记录的版本号;
2.5.3)检查是否还有其他线程对目标数据对象的记录的版本号有读操作没有完成,如果有这样的读操作没有完成则执行步骤2.5.4),否则执行步骤2.5.5);
2.5.4)创建该目标数据对象的副本,并插入到所述数据对象队列中;
2.5.5)执行对目标数据对象的写操作,并将目标数据对象当前的版本号增加I ;
2.5.6)访存指令的写操作完成,将访存指令执行数加1,转到步骤2.6)。
[0009]与现有技术相比,本发明的优点在于:
I)本发明在回放执行并行程序时,每当并行程序的一个线程执行写操作修改数据对象时,如果该数据对象仍有其它线程的读操作尚未完成,则先保留数据对象副本再执行数据对象的写操作,其它线程则根据被保留的数据对象副本执行读操作,使得写操作不需要等待读操作完成即可立即执行,消除了传统的回放执行方法中写指令需要等待其他线程读取目标数据对象的开销,减少了大量的执行等待时间,从而有效的提高回放速度,当对线程进行扩展时不影响回放执行效率,线程扩展性能强。
[0010]2)本发明进一步采用版本策略来管理数据对象,将并行程序的内存空间划分为固定大小的块,将每块作为一个数据对象,在记录、回放过程中分别为数据对象分配版本号,每次对数据对象执行写操作对应一个数据对象版本,能够加快执行记录、回放过程;同时采用多版本策略,每当写操作需要修改目标数据对象时,就为该数据对象创建一个旧版本的数据对象副本后执行写操作得到新版本的数据对象,使得每个数据对象不只对应一个版本,从而在回放过程中写指令的执行不需要等待当前版本的其他读操作的执行。

【专利附图】

【附图说明】
[0011]图1是本实施例快速的全系统模拟器确定性回放方法的实现流程示意图。
[0012]图2是本实施例中步骤2)回放并行程序的实现流程示意图。
[0013]图3是本实施例中步骤2.4)读操作回放的具体实现流程示意图。
[0014]图4是本实施例中步骤2.5)写操作回放的具体实现流程示意图。
[0015]图5是本发明具体实施例中各线程的日志文件具体结构示意图。
[0016]图6是本发明具体实施例中访存指令回放流程示意图。

【具体实施方式】
[0017]以下结合说明书附图和具体优选的实施例对本发明作进一步描述,但并不因此而限制本发明的保护范围。
[0018]如图1所示,本实施例快速的全系统模拟器确定性回放方法的实现流程,步骤为:
1)记录访存顺序:将并行程序的内存分为固定大小的块,将每块作为一个数据对象,在并行程序执行时记录数据对象的访存顺序;
2)回放并行程序:根据记录的数据对象的访存顺序重放并行程序,每当并行程序的一个线程执行写操作修改数据对象时,如果该数据对象仍有其它线程的读操作尚未完成,则先保留数据对象副本再执行数据对象的写操作,其它线程在执行读操作时则读取被保留的数据对象副本。
[0019]本实施例中,步骤I)的详细执行步骤如下:
1.1)初始化:初始化并行程序,为并行程序的每个线程创建一个用于记录线程T的访存顺序的日志文件,为每个线程设置一个访存指令执行数Ii并初始化为O ;
1.2)划分数据对象:将并行程序的内存分为固定大小的块,每一个块作为一个数据对象,为每个数据对象设置一个版本号并初始化为O ;
1.3)读取指令:并行程序选择一条待执行的访存指令并分配给指定线程执行,指定线程首先判断访存指令的指令类型,如果访存指令是读指令,则转到步骤1.4);如果访存指令是写指令则转到步骤1.5);
1.4)读指令记录:通过指定线程获取访存指令的目标数据对象以及目标数据对象的版本号,在指定线程的日志文件增加一条日志记录,日志记录包括针对目标数据对象的读操作以及目标数据对象的版本号,执行访存指令对目标数据对象的读操作;将访存指令执行数Ii加1,转到步骤1.6);
1.5)写指令记录:通过指定线程获取访存指令的目标数据对象以及目标数据对象的版本号,在指定线程的日志文件增加一条日志记录,日志记录包括针对目标数据对象的写操作以及目标数据对象的版本号,执行访存指令对目标数据对象的写操作,将目标数据对象的版本号加I ;将访存指令执行数Ii加1,转到步骤1.6);
1.6)结束判断:判断并行程序是否还有未执行的指令,如果有则转到步骤1.3),否则判定记录并行程序针对数据对象的访存顺序完毕,得到与并行程序的线程数量相同的日志文件,跳转执行步骤2)。
[0020]本实施例中记录访存顺序时,首先对并行程序进行初始化,为并行程序的各个线程Ti创建一个日志文件Fi并创建一个访存指令执行数Ii字段来记录访存指令的执行,其中i=0,2,……,N-1,N为线程数,再进行数据对象的划分,将并行程序的内存分为固定大小的块,每块称之为一个数据对象,并为每个数据对象创建一个版本号字段@ver记录数据对象的版本号ver并初始化为O ;然后记录访存顺序,在执行每条访存指令时添加访存指令对应的日志记录至各个线程Ti对应的日志文件Fi中。日志记录的具体方法为:读取并行程序中线程Ti的一条访存指令并执行该指令,假设访问的数据对象为object,版本号为@ver,若为读指令,在线程Ti的日志文件Fi中增加一条日志记录“read @ver”,表示当前读指令执行前object的版本号为Over ;若为写指令,在线程的日志文件Fi中增加一条日志记录“write @ver”,表示当前写指令执行前object的版本号为?ver。日志记录完成后执行对object的写操作,并将object的版本号增加I,即@ver=@ver+l,对并行程序的所有记录结束后形成N个与线程对应的日志文件F (FcTFimX采用版本策略来管理数据对象,每次对数据对象执行写操作对应一个数据对象版本,能够加快执行记录、回放过程。
[0021]如图2所示,步骤2)的详细执行步骤如下:
2.1)初始化:初始化并行程序,为并行程序的每个线程创建一个用于记录线程的访存信息的日志文件,为每个线程设置一个访存指令执行数Ii并初始化为O ;
2.2)划分数据对象:将并行程序的内存分为固定大小的块,每一个块作为一个数据对象,为每个数据对象设置一个版本号并初始化为O ;对每个数据对象创建一个用于存放保留执行写操作前的数据对象副本的数据对象队列并初始化为空;
2.3)读取指令:并行程序根据访存指令执行数读取分配给指定线程执行的访存指令,指定线程首先判断访存指令的指令类型,如果访存指令是读指令,则转到步骤2.4);如果访存指令是写指令则转到步骤2.5);
2.4)读操作回放:通过指定线程获取访存指令的目标数据对象以及目标数据对象当前的版本号,根据当前的版本号、指定线程的日志文件记录的版本号判断访存指令的目标版本数据,如果访存指令的目标版本数据为目标数据对象,则直接执行访存指令对目标数据对象的读操作;如果访存指令的目标版本数据为数据对象队列中的数据对象副本,则执行访存指令对数据对象队列中的数据对象副本的读操作,在数据对象队列中删除多余的数据对象副本;将访存指令执行数Ii加1,转到步骤2.6);
2.5)写操作回放:通过指定线程获取访存指令的目标数据对象以及目标数据对象当前的版本号,根据当前的版本号、指定线程的日志文件记录的版本号判断访存指令的目标数据对象是否仍有其它线程的读操作正在等待,如果目标数据对象仍有其它线程的读操作正在等待,则执行数据对象的写操作,保留执行写操作前的数据对象副本并添加至数据对象队列中;将访存指令执行数Ii加1,转到步骤2.6);
2.6)结束判断判断并行程序是否还有未执行的指令,如果有则转到步骤2.3),否则判定根据记录结果重放并行程序的执行完毕,结束回放并退出。
[0022]本实施例中,回放并行程序时首先对并行程序进行初始化,打开步骤I)获得的日志文件F并创建一个访存指令回放执行数Ii字段来记录回放指令的执行,再按照与步骤I)相同的方式划分数据对象,将并行程序的内存分为固定大小的块,每块为一个数据对象,每个数据对象用两个字段进行描述:一个是用于存放当前版本号的版本号字段@ver’另一个是用于用于存放保留执行写操作前的数据对象副本的数据对象队列字段objectlist,将版本号@ver初始化为O、数据对象队列objectlist初始化为空,然后按照日志文件F的记录结果回放执行并行程序。
[0023]如图3所示,本实施例中步骤2.4)的详细执行步骤如下:
2.4.1)通过指定线程获取访存指令的目标数据对象object以及目标数据对象object当前的版本号@ver ;根据访存指令执行数读取指定线程的日志文件中对应访存指令以及目标数据对象object的记录的版本号ver,将当前的版本号@ver、记录的版本号ver进行比较,如果当前的版本号Over小于记录的版本号ver则转到步骤2.4.2),否则转到步骤2.4.3);
2.4.2)强制指定线程等待直到目标数据对象object当前的版本号ISver大于或者等于记录的版本号ver ;
2.4.3)判断当前的版本号?ver大于记录的版本号ver是否成立,如果成立则判定访存指令的目标版本数据为数据对象队列objectlist中的数据对象副本,转到步骤2.4.4);否贝IJ,判定访存指令的目标版本数据为目标数据对象object,直接执行访存指令对目标数据对象object的读操作,转到步骤2.4.6);
2.4.4)查找数据对象队列中的数据对象副本,找到其中版本号为记录的版本号ver的数据对象副本obj,执行访存指令对数据对象队列objectlist中的数据对象副本obj的读操作;
2.4.5)判断是否还有其他线程需要对版本号为记录的版本号ver的数据对象副本obj进行读操作,如果没有则从数据对象队列objectlist中删除版本号为记录的版本号ver的数据对象副本obj ;
2.4.6)访存指令的读操作完成,将访存指令执行数I加1,转到步骤2.6)。
[0024]本实施例中,执行读操作回放时,需要访问的数据对象为object且当前版本号为@ver时,读取日志文件中记录结果,获得记录的版本号为ver,比较@ver与ver的大小,如果@ver〈ver,则强制线程等待直至Over ^ ver ;当@ver ^ ver时,判断@ver是否等于ver,如果是执行完读操作后结束本次读操作;如果不是则查找数据对象队列objectlist中的数据对象obj,判断到数据对象obj的版本号等于ver时执行对数据对象obj的读操作,检查其他线程是否还会读数据对象object的ver版本,如果不会则将数据对象obj从数据对象队列objectlist中删除,结束本次读操作。
[0025]如图4所示,本实施例中步骤2.5)的详细执行步骤如下:
2.5.1)通过指定线程获取访存指令的目标数据对象object以及目标数据对象object当前的版本号@ver ;根据访存指令执行数读取指定线程的日志文件中对应访存指令以及目标数据对象object的记录的版本号ver,将当前的版本号@ver、记录的版本号ver进行比较,如果当前的版本号Over小于记录的版本号ver则转到步骤2.5.2),否则转到步骤2.5.3);
2.5.2)强制指定线程等待直到目标数据对象当前的版本号ISver等于记录的版本号
ver ;
2.5.3)检查是否还有其他线程对目标数据对象object的记录的版本号ver有读操作没有完成,如果有这样的读操作没有完成则执行步骤2.5.4),否则执行步骤2.5.5);
2.5.4)创建该目标数据对象object的副本obj,并插入到数据对象队列objectlist
中;
2.5.5)执行对目标数据对象object的写操作,并将目标数据对象object当前的版本号@ver增加I ;
2.5.6)访存指令的写操作完成,将访存指令执行数I加1,转到步骤2.6)。
[0026]本实施例中,执行写操作回放时,需要访问的数据对象为object且当前版本号为@ver时,读取日志文件中记录结果,获得记录的版本号为ver,比较@ver与ver的大小,如果@ver〈ver,则强制线程等待直至@ver=ver ;当@ver=ver时,检查是否还有其他线程对object的ver版本的读操作没有完成,如果是,则创建object的ver版本的副本obj,将obj插入到数据对象队列objectlis中,再执行对object的写操作,Over增加I,即@ver=@ver+1,结束本次写操作;如果否则直接执行对object的写操作,@ver=@ver+l,结束本次写操作。
[0027]本实施例在检查到还有其他线程对目标数据对象的记录的版本号有读操作没有完成时,创建该目标数据对象旧版本的副本,再执行对目标数据对象的写操作得到新版本数据对象,消除了原来回放流程中的写指令需要等待其他线程读取目标数据对象的开销,将其转变为上述步骤2.5.4)中创建目标数据对象副本的开销,利用空间换时间的优化策略来减少系统时间开销,减少了大量的执行等待时间,从而有效的提高回放速度。
[0028]以下将结合回放执行线程ΤΓΤ4的8条访存指令的具体实施例对本发明进行进一步说明。
[0029]假设并行程序包含Tf T4 4个线程,每个线程按上述步骤I)的方法获得对应的日志文件,每个日志文件中包含两条访存指令,4个线程一共执行8条指令,各线程的日志文件的具体形式如图5所示。本实施例日志文件中所有的读写指令均为访问同一个数据对象object,其中Read @1表示读指令且需要读object的I号版本,而Write @0表示写指令且需要写该object的O号版本。
[0030]本实施例回放Tf T4 4个线程的8条指令的具体实现流程如图6所示,各条指令按照如图所示的时间顺序执行,各条指令对应指令执行时的数据对象以及数据对象队列内保留的副本数据,其中当前版本号初始化为O,访问的数据对象为object,object创建的数据对象队列为objectlist,实线箭头表示指令之间的依赖关系,箭头指向的指令需要等待箭头另一端指令执行完成之后才可以开始,在具体实现时可通过同步语句实现为,各条指令具体执行流程为:
①线程Tl执行指令Read@1,表示需要读object的I号版本,而此时object的当前版本号为0,当前版本号小于记录的版本号,因此需要等待;
②线程T4执行指令Write@0,表示需要写object的O号版本,此时object的当前版本号为0,当前版本号等于记录的版本号,因此线程T4直接写object,并将其当前版本号变为I ;此时解除了线程Tl对于I号版本的数据依赖关系,线程Tl执行对object的读操作并结束,线程Tl执行第一条指令Read il时的开始和结束边界表示如图6所示;
③线程T4执行指令Write@1,表示需要写object的I号版本,此时object的当前版本号正好为I,当前版本号等于记录的版本号同时检查到仍然有线程T2和T3对object I号版本的读操作没有完成(T2和T3的第一条指令),因此线程T4首先创建object I号版本的副本obj,并将其插入到数据对象队列objectlist中,然后修改object的数据,并将其当前版本号增加I,从而完成写操作;
④线程T2执行指令Readil,表示需要读object的I号版本,此时object的当前版本号号为2,当前版本号大于记录的版本号,因此线程T2在object的数据对象队列objectlist中查询版本号为I的数据对象obj,并读取查找到的数据对象obj的数据以完成读操作;
⑤线程T3执行指令Read@1,表示需要读object的I号版本,此时object的当前版本号为2,当前版本号大于记录的版本号,因此线程T3在object的数据对象队列objectlist中查询版本号为I的数据对象obj,并读取查找到的数据对象obj的数据,然后线程T3检查到已经没有任何其他线程需要读取object的I号版本,因此将查找到的I号版本数据obj从数据对象队列objectlist中删除;
⑥线程T3执行指令Readi2,当前版本号等于记录的版本号,此时object的当前版本号2,线程T3直接读取数据并返回;
⑦线程T2执行指令Write@2,此时object的当前版本号为2,当前版本号大于记录的版本号同时检查到线程Tl对版本号2的读操作还未完成,因此线程T2首先创建object 2号版本的副本obj’,并将其加入到数据对象队列objectlist中,然后写object并将其版本号增加I ;
⑧线程Tl执行指令Read@2,此时object的当前版本号为3,线程T2在数据对象队列objectlist中查找版本号为2的数据对象obj’,并对数据对象obj’执行读操作,然后线程Tl发现已经不存在任何其他线程需要访问object对象的2号版本,因此从数据对象队列objectlist中将2号版本的数据对象的副本obj’删除。
[0031]如上所述,第③条指令中线程T4执行指令Write @1,但是仍然有线程T2和T3对object I号版本的读操作没有完成,此时创建一份object I号版本的副本后直接执行对object I号版本的写操作,而无需按传统的回放执行方法等待线程T2和T3的第一条指令执行完成,由创建的副本执行线程T2和T3对object I号版本的读操作,消除了第③条写指令执行时对第④条和第⑤条读指令的依赖、以及消除了第⑦条写指令执行时对第⑧条读指令的依赖,减少了等待时间的开销,从而提高回放效率。
[0032]上述只是本发明的较佳实施例,并非对本发明作任何形式上的限制。虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明。任何熟悉本领域的技术人员,在不脱离本发明技术方案范围的情况下,都可利用上述揭示的技术内容对本发明技术方案做出许多可能的变动和修饰,或修改为等同变化的等效实施例。因此,凡是未脱离本发明技术方案的内容,依据本发明技术实质对以上实施例所做的任何简单修改、等同变化及修饰,均应落在本发明技术方案保护的范围内。
【权利要求】
1.一种快速的全系统模拟器确定性回放方法,其特征在于实施步骤如下: .1)将并行程序的内存分为固定大小的块,将每块作为一个数据对象,在并行程序执行时记录数据对象的访存顺序; .2)根据记录的所述数据对象的访存顺序重放并行程序,每当并行程序的一个线程执行写操作修改数据对象时,如果该数据对象仍有其它线程的读操作尚未完成,则先保留数据对象副本再执行数据对象的写操作,其它线程在执行读操作时则读取被保留的数据对象副本。
2.根据权利要求1所述的快速的全系统模拟器确定性回放方法,其特征在于:所述步骤1)的详细执行步骤如下: .1.1)初始化并行程序,为并行程序的每个线程创建一个用于记录线程的访存顺序的日志文件,为每个线程设置一个访存指令执行数并初始化为0 ; . 1.2)将并行程序的内存分为固定大小的块,每一个块作为一个数据对象,为每个数据对象设置一个版本号并初始化为0 ;. 1.3)并行程序选择一条待执行的访存指令并分配给指定线程执行,所述指定线程首先判断访存指令的指令类型,如果访存指令是读指令,则转到步骤1.4);如果访存指令是写指令则转到步骤1.5); . 1.4)通过所述指定线程获取访存指令的目标数据对象以及目标数据对象的版本号,在所述指定线程的日志文件增加一条日志记录,所述日志记录包括针对目标数据对象的读操作以及目标数据对象的版本号,执行访存指令对目标数据对象的读操作;将访存指令执行数加1,转到步骤1.6); . 1.5)通过所述指定线程获取访存指令的目标数据对象以及目标数据对象的版本号,在所述指定线程的日志文件增加一条日志记录,所述日志记录包括针对目标数据对象的写操作以及目标数据对象的版本号,执行访存指令对目标数据对象的写操作,将目标数据对象的版本号加1 ;将访存指令执行数加1,转到步骤1.6);. 1.6)判断并行程序是否还有未执行的指令,如果有则转到步骤1.3),否则判定记录并行程序针对所述数据对象的访存顺序完毕,得到与并行程序的线程数量相同的日志文件,跳转执行步骤2)。
3.根据权利要求1或2所述的快速的全系统模拟器确定性回放方法,其特征在于:所述步骤2)的详细执行步骤如下: . 2.1)初始化并行程序,为并行程序的每个线程创建一个用于记录线程的访存信息的日志文件,为每个线程设置一个访存指令执行数并初始化为0 ; . 2.2)将并行程序的内存分为固定大小的块,每一个块作为一个数据对象,为每个数据对象设置一个版本号并初始化为0 ;对每个数据对象创建一个用于存放保留执行写操作前的数据对象副本的数据对象队列并初始化为空; .2.3)并行程序根据所述访存指令执行数读取分配给指定线程执行的访存指令,所述指定线程首先判断访存指令的指令类型,如果访存指令是读指令,则转到步骤2.4);如果访存指令是写指令则转到步骤2.5); . 2.4)通过所述指定线程获取访存指令的目标数据对象以及目标数据对象当前的版本号,根据当前的版本号、所述指定线程的日志文件记录的版本号判断访存指令的目标版本数据,如果访存指令的目标版本数据为目标数据对象,则直接执行访存指令对目标数据对象的读操作;如果访存指令的目标版本数据为数据对象队列中的数据对象副本,则执行访存指令对数据对象队列中的数据对象副本的读操作,在数据对象队列中删除多余的数据对象副本;将访存指令执行数加1,转到步骤2.6); .2.5)通过所述指定线程获取访存指令的目标数据对象以及目标数据对象当前的版本号,根据当前的版本号、所述指定线程的日志文件记录的版本号判断访存指令的目标数据对象是否仍有其它线程的读操作正在等待,如果目标数据对象仍有其它线程的读操作正在等待,则执行所述数据对象的写操作,保留执行写操作前的数据对象副本并添加至数据对象队列中;将访存指令执行数加1,转到步骤2.6); .2.6)判断并行程序是否还有未执行的指令,如果有则转到步骤2.3),否则判定根据记录结果重放并行程序的执行完毕,结束回放并退出。
4.根据权利要求3所述的快速的全系统模拟器确定性回放方法,其特征在于:所述步骤2.4)的详细执行步骤如下: . 2.4.1)通过所述指定线程获取访存指令的目标数据对象以及目标数据对象当前的版本号;根据所述访存指令执行数读取所述指定线程的日志文件中对应所述访存指令以及目标数据对象的记录的版本号,将当前的版本号、记录的版本号进行比较,如果当前的版本号小于记录的版本号则转到步骤2.4.2),否则转到步骤2.4.3); . 2.4.2)强制所述指定线程等待直到目标数据对象当前的版本号大于或者等于记录的版本号; . 2.4.3)判断当前的版本号大于记录的版本号是否成立,如果成立则判定访存指令的目标版本数据为数据对象队列中的数据对象副本,转到步骤2.4.4);否则,判定访存指令的目标版本数据为目标数据对象,直接执行访存指令对目标数据对象的读操作,转到步骤.2.4.6); . 2.4.4)查找数据对象队列中的数据对象副本,找到其中版本号为所述记录的版本号的数据对象副本,执行访存指令对数据对象队列中的数据对象副本的读操作; .2.4.5)判断是否还有其他线程需要对版本号为所述记录的版本号的数据对象副本进行读操作,如果没有则从数据对象队列中删除版本号为所述记录的版本号的数据对象副本; . 2.4.6)访存指令的读操作完成,将访存指令执行数加1,转到步骤2.6)。
5.根据权利要求3所述的快速的全系统模拟器确定性回放方法,其特征在于:所述步骤2.5)的详细执行步骤如下: . 2.5.1)通过所述指定线程获取访存指令的目标数据对象以及目标数据对象当前的版本号;根据所述访存指令执行数读取所述指定线程的日志文件中对应所述访存指令以及目标数据对象的记录的版本号,将当前的版本号、记录的版本号进行比较,如果当前的版本号小于记录的版本号则转到步骤2.5.2),否则转到步骤2.5.3); . 2.5.2)强制所述指定线程等待直到目标数据对象当前的版本号等于记录的版本号; . 2.5.3)检查是否还有其他线程对目标数据对象的记录的版本号有读操作没有完成,如果有这样的读操作没有完成则执行步骤2.5.4),否则执行步骤2.5.5); . 2.5.4)创建该目标数据对象的副本,并插入到所述数据对象队列中;.2.5.5)执行对目标数据对象的写操作,并将目标数据对象当前的版本号增加I ;.2.5.6)访存指令的写操作完成,将访存指令执行数加1,转到步骤2.6)。
【文档编号】G06F9/46GK104268013SQ201410551840
【公开日】2015年1月7日 申请日期:2014年10月17日 优先权日:2014年10月17日
【发明者】周旭, 卢凯, 迟万庆, 李 根, 唐宏伟, 刘勇鹏, 冯华, 王小平, 蒋杰, 王睿伯, 樊葆华, 张英, 高颖慧, 王双喜, 陈沉 申请人:中国人民解放军国防科学技术大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1