本发明涉及计算机体系结构技术领域,尤其涉及一种编译加速方法、路由单元和缓存。
背景技术:
在并行编译器中,串行程序被划分成为多个推测线程进行执行,每个推测线程执行程序的不同部分。推测多线程执行时需保证串行程序的顺序控制流,为多个并发执行的推测线程设定一个严格的逻辑顺序。
线程代码是从串行程序顺序执行的代码中抽取出来,以推测的方式提前执行。程序的串行逻辑顺序即是多个并发线程提交其执行结果的顺序。通常用前驱(predecessor)和后继(successor)来定性描述两个线程之间的提交顺序关系以保持串行程序的语义,基于前驱/后继线程模式的线程级推测模型用来支持线程级的推测并行。
为了便于描述推测多线程执行模型,首先给出两个定义:
定义1,确定线程:又称为非推测线程或者头线程,该线程在整体上依串行逻辑顺序推进整个程序的执行,其执行产生的数据可以直接向安全存储器(如内存或者共享的高级缓存区)提交其执行结果。
定义2,推测线程:指处于推测状态的线程,相对于确定线程,该线程产生的数据只能存储于推测缓冲区而不能直接提交安全存储器,直至其被撤销或者被验证成功而成为非推测线程。
推测处理器的推测模式执行中,有且只能有一个线程是确定线程,其他所有并行执行的线程则都是推测线程。一个推测线程是由程序执行时遇到的一条激发(spawn)指令产生的。spawn指令所在的位置被称为线程激发点(spawningpoint,sp);spawn指令所指向的程序中另一个位置被称为准控制无关点(controlquasiindependentpoint,cqip)。sp和cqip指令对唯一确定一个激发线程对。sp点指示在此可以激发一个新的线程来推测执行cqip点以后的程序内容。
当程序执行到激发指令时,如果现有资源允许激发,则将激发一个新的推测线程。当确定线程执行结束时将验证其直接后继线程。若验证正确,则确定线程向安全存储器提交其执行结果,然后将确定执行的权限传递给其直接后继线程。若验证失败,则撤销所有推测子线程并重新执行其直接后继线程。当推测线程执行遇到推测缓冲区溢出或线程执行完毕时,此线程将进入等待状态,直到被验证正确得到确定执行权限或者验证失败而被重启。
一个推测线程并行执行的示意图如图1所示。串行程序中插入sp-cqip点就被映射为推测线程程序,推测线程程序中忽略sp-cqip就得到串行程序(如图1(a)所示)。cqip点把程序分成多个代码段,当程序执行到sp点时,若现有资源允许激发,则会发起一个新的线程并推测执行cqip点之后的那个代码段。执行过程中使用硬件检测线程的运行情况,如果线程推测执行成功,那么推测线程一直执行直到下一个cqip点(如图1(b)所示)。验证失败或raw(readafterwrite,写后读)内存依赖违规等则会导致推测执行失败。当出现验证失败时,由直接前驱线程串行执行此线程(如图1(c)所示)。当出现raw依赖违规时(如图1(d)所示),则在当前的状态下重新启动该线程。
在推测线程执行过程中,线程状态转换主要由下面几个线程控制操作进行处理:
(1)线程发起。父线程发起子线程时,先向控制逻辑单元请求空闲的处理器核,然后为子线程做初始化工作。要做的初始化工作主要包括拷贝寄存器的值给子线程、将子线程cache(缓存)中所有的数据置为无效、将子线程的程序计数器指向子线程开始位置等等。之后,父线程和子线程开始并行执行。
(2)线程撤销。推测线程在发生数据依赖或者验证失败时被硬件机制强行提前终止。推测线程在执行时可能会因为发生数据依赖、寄存器依赖、线程级联撤销以及控制依赖违规等而被撤销,这些额外开销将会对程序并行执行的性能造成严重影响。
(3)线程验证和提交。确定执行的线程执行到cqip时需要验证其直接后继线程所使用的数据,包括寄存器的预测值和内存引用的预测值。当后继线程使用的数据与确定线程当前寄存器值或者内存引用值不一致时验证失败时,撤销后继线程。验证通过后确定线程将自己推测执行时产生并缓存在私有cache中的数据写入主存,然后将所有的寄存器值传给后继线程。之后,线程将确定执行权传递给后继线程并退出,其后继线程成为新的确定线程继续执行。
(5)线程的重启。推测线程在执行过程中通过硬件机制检测到有数据依赖发生,此时将撤销所有后继线程并自身重新执行。此时,作废推测执行时产生的所有数据,使用cache中存储的寄存器值恢复寄存器,并将程序计数器指向线程体的开始处。通常,线程重启在一定程度上可以提高处理器核的利用率。
然而对于图1(d)所示的情况,当发生raw时,目前的做法是立即撤销并重新执行线程。此种做法会放弃推测线程已经执行的代码,再一次重新执行,降低了并行性。因此,需要提供一种针对如图1(d)所示的情况的编译加速方法。
技术实现要素:
为解决上述问题,本申请实施例提出了一种编译加速方法、路由单元和缓存。
为了达到上述目的,本发明采用的主要技术方案包括:
一种编译加速方法,所述方法被路由单元所执行,所述路由单元用于实现如下一种或多种功能:缓冲自身产生的数据,转发数据,接收数据,验证接收的数据;
所述路由单元与核单元一一对应,所述核单元用于执行线程;
缓存cache中包括多个路由单元,各核单元执行的线程不同;所述线程为推测线程,或者,确定线程;
包括:
s101,当确定满足中断条件时,控制第一核单元进入等待状态;所述第一核单元与第一路由单元对应,所述第一路由单元执行所述编译加速方法;
s102,当接收到第一数据后,确定第二核单元,所述第二核单元执行第二线程,所述第二线程处理所述第一数据;
s103,若第二核单元与第一核单元为同一核单元,则控制所述第一核单元执行第二线程;若第二核单元与第一核单元非同一核单元,则转发所述第一数据。
为了达到上述目的,本发明采用的主要技术方案还包括:
路由单元,所述路由单元与核单元一一对应;
所述路由单元用于实现如下一种或多种功能:缓冲自身产生的数据,转发数据,接收数据,验证接收的数据;
所述核单元用于执行线程;
缓存cache中包括多个路由单元,各核单元执行的线程不同;所述线程为推测线程,或者,确定线程;
所述路由单元,用于执行上述方法任意一项的步骤。
为了达到上述目的,本发明采用的主要技术方案还包括:
一种缓存,所述缓存包括多个路由单元;
所述路由单元数量与核单元数量相同;
所述路由单元与所述核单元一一对应;
所述路由单元用于实现如下一种或多种功能:缓冲自身产生的数据,转发数据,接收数据,验证接收的数据;
所述核单元用于执行线程;
各核单元执行的线程不同;所述线程为推测线程,或者,确定线程;
任一路由单元,用于执行上述方法任意一项的步骤。
本发明的有益效果是:本方法被路由单元所执行,路由单元用于实现如下一种或多种功能:缓冲自身产生的数据,转发数据,接收数据,验证接收的数据;路由单元与核单元一一对应,核单元用于执行线程;cache中包括多个路由单元,各核单元执行的线程不同;线程为推测线程或确定线程;包括:当满足中断条件时,控制第一核单元进入等待状态;第一核单元与第一路由单元对应,第一路由单元执行编译加速方法;当接收到第一数据后,确定第二核单元,第二核单元执行第二线程,第二线程处理第一数据;若第二核单元与第一核单元相同,则控制第一核单元执行第二线程;否则,转发第一数据,实现了raw情况下的编译。
附图说明
下面将参照附图描述本申请的具体实施例,其中:
图1示出了本申请一实施例提供的一种推测线程并行执行的示意图;
图2示出了本申请一实施例提供的一种缓存结构示意图;
图3示出了本申请一实施例提供的一种编译加速方法流程示意图;
图4示出了本申请一实施例提供的一种线程执行示意图。
具体实施方式
本发明提供的编译加速方法在cache(缓存)中执行,该缓存中包括多个路由单元;路由单元数量与核单元数量相同;路由单元与核单元一一对应。
路由单元用于实现如下一种或多种功能:缓冲自身产生的数据,转发数据,接收数据,验证接收的数据。
核单元用于执行线程。
各核单元执行的线程不同;线程为推测线程,或者,确定线程。
任一路由单元,用于执行本发明所提供的编译加速方法。
例如,图2所示的在cache,包括4×4排列的多核单元,每个核单元以二维矩阵方式进行编号。ru00——ru33是多个路由单元,多个路由单元的编号可以与多核编号方式类似,每个路由单元和核单元一一对应。路由单元与传统路由器本身具有处理能力不同,主要完成的功能为缓冲自身产生的数据,转发数据,接收数据,验证接收的数据。
因此,本发明的路由单元的功能通过增加指令,由核单元跟cache协同实现的。也就是说路由部件的功能是核单元借助于增加的指令,由cache实现的。
基于图2所示的cache中的任一路由单元,参见图3,本实施例提供的编译加速方法如下:
s101,当确定满足中断条件时,控制第一核单元进入等待状态。
其中,第一核单元与第一路由单元对应,第一路由单元执行编译加速方法。
其中,中断条件可以有2种,分别为接收到中断传送信号,和,第一线程具有raw内存依赖关系且第一线程被执行过程中遇到引用。
第一种:中断条件为接收到中断传送信号。
中断传送信号由第三路由单元发送,或者,中断传送信号由第一核单元发送。
其中,第三路由单元与第三核单元对应,第三核单元执行第三线程,第三线程与第一线程对应同一raw内存依赖关系,第一线程由第一核单元执行。
第三路由单元发送中断传送信号的方法为:
若第三线程具有raw内存依赖关系,且第三线程被执行过程中遇到定值时,确定路由单元标识。
若路由单元标识存在,则与第四路由单元完成握手后,向第四路由单元发送中断传输信号。第四路由单元与路由单元标识对应。
第四路由单元对应第四核单元,第四核单元执行第四线程。根据raw内存依赖关系,第四线程中引用定值。
第二种:中断条件为第一线程具有raw内存依赖关系且第一线程被执行过程中遇到引用。
第二种情况,适用于第一线程为推测线程的情况。因此,对于第二种情况,在执行s101之后,s102之前,还会确认第一线程为推测线程。
s102,当接收到第一数据后,确定第二核单元。
其中,第二核单元执行第二线程,第二线程处理第一数据。
s102中要接收的第一数据可以为一个或多个。
对于一个的情况,接收到该第一数据之后,直接确定处理该第一数据的线程,再确定该执行该线程的核单元。
对于第一数据为多个,且这些第一数据均为引用的数据,则s102执行过程为:
接收到每个第一数据后,确定每个第一数据对应的第二核单元。
其中,对应的第二核单元执行对应的第二线程,对应的第二线程处理任一第一数据。
s103,若第二核单元与第一核单元为同一核单元,则控制第一核单元执行第二线程。若第二核单元与第一核单元非同一核单元,则转发第一数据。
对于第一数据为一个的情况,若s102中确定的第二核单元与第一核单元为同一核单元,则控制第一核单元执行第二线程。若s102中确定的第二核单元与第一核单元非同一核单元,则转发第一数据。
对于第一数据为多个,且这些第一数据均为引用的数据,则s103执行过程为:
若多个第一数据均接收到,且所有第二核单元与第一核单元均为同一核单元,则控制第一核单元处理所有第一数据。
若多个第一数据均接收到,但存在与第一核单元不同的第二核单元,则向第五路由单元发送中断传送信号,与第五路由单元完成握手后,向第五路由单元发送不同的第二核单元所对应的第一数据。
第五路由单元与不同的第二核单元对应。
另外,s101中的一种中断条件为第一线程具有raw内存依赖关系且第一线程被执行过程中遇到引用第一线程具有raw内存依赖关系。此处的raw内存依赖关系可以为任何raw内存依赖关系,也可以为位于关键数据依赖集中的raw内存依赖关系。
第三路由单元发送中断传送信号的方法中确定路由单元标识步骤的前提条件为第三线程具有raw内存依赖关系,此处的raw内存依赖关系可以为任何raw内存依赖关系,也可以为位于关键数据依赖集中的raw内存依赖关系。
关键数据依赖集的建立方法包括:
s201,获取串行程序,从串行程序中抽取线程,将抽取出的线程命名为第六线程,利用过程间指针分析和数据流分析技术,构造引用-定制链,检测各第六线程中的定值和引用。
s202,根据各第六线程的定值和引用,将对应同一raw内存依赖关系的多个第六线程分为一组。
其中,同组中多个第六线程的定值地址与引用地址相同。
s203,根据每组中第六线程的属性确定对应的raw内存依赖关系是否为关键数据依赖关系。
具体的,第六线程的属性包括位置标识,线程数量,逻辑执行时间。
s203-1,按从先到后的执行顺序将任一组中的各第六线程排序。
s203-2,对于任一组的任一第六线程,
将任一组的任一第六线程在序列中的位置序号确定任一组的任一第六线程的位置标识。
若任一组的任一第六线程为序列中的首线程,则将任一组的任一第六线程的线程数量确定为0,将任一组的任一第六线程的逻辑执行时间确定为0。
若任一组的任一第六线程为序列中的非首线程,则在串行程序中确定任一组的任一第六线程与排序中首线程之间包括的线程,将之间包括的线程总数量确定为任一组的任一第六线程的线程数量。根据之间包括的线程之间的逻辑关系确定执行总时间,并将该执行总时间确定为任一组的任一第六线程的逻辑执行时间。
s203-3,若存在满足预设关系的两个第六线程,则确定任一组对应的raw内存依赖关系为关键数据依赖关系。若不存在满足预设关系的两个第六线程,则确定任一组对应的raw内存依赖关系非关键数据依赖关系。
预设关系可以有多种,
例1,预设关系为:冲突线程中,线程j的位置标识小于线程i的位置标识。
其中,冲突线程为任一组的2个第六线程,其中1个第六线程包括定值,另1个第六线程包括引用,且定值地址与引用地址相同,将包括定值的第六线程记为线程i,将包括引用的第六线程记为线程j,i,j为线程标识。
或者,
例2,预设关系为冲突线程中,线程j的位置标识大于线程i的位置标识,但执行逻辑差值为负值。
其中,逻辑执行数据差值=线程j的逻辑执行时间-线程i的逻辑执行时间。
或者,
例3,预设关系为冲突线程中,线程j的位置标识大于线程i的位置标识,执行逻辑差值非负值,但(1/线程数量差值)*(1/逻辑执行数据差值)=[(线程j的线程数量+线程i的线程数量)/串行程序的总线程数量]^(1/位置差值)。
其中,位置差值=线程j的位置标识-线程i的位置标识。线程数量差值=线程j的线程数量-线程i的线程数量。
s204,对于每个raw内存依赖关系,若其为关键数据依赖关系,则将其加入关键数据依赖集中,关键数据依赖集的初始值为空。
本实施例提供的编译加速方法,针对raw内存依赖关系进行编译,通过终端条件防止raw内存依赖关系引起raw冲突,造成不必要的读取错误或撤销。
需要说明的是,本发明中的“第一”、“第二”、“第三”、“第四”、“第五”、“第六”为序号,无其他实质含义,仅为区分线程,核单元,数据,路由单元等(例如区分同一线程的不同阶段,再例如区分不同的线程等)。对于序号不同的线程,核单元,数据,路由单元(例如,第一线程,第二线程等)之间可以相同也可以不同,本发明不对序号不同的线程,核单元,数据,路由单元之间的关系进行限定。
下面以不同的应用场景,对本实施例提供的编译加速方法进行举例说明。
raw冲突是并发线程之间的主要数据依赖冲突。例如,程序首先对变量a进行定值(如下内存),随后又对变量b进行引用(如读内存)。在程序执行中,若这两条指令分别位于不同的线程(如线程t1和线程t2,线程t1执行对变量a进行定值,线程t2执行对变量b进行引用),而变量a和变量b指向同一地址,则这两条指令之间将存在raw依赖。如果在线程t1和线程t2并发执行中(如图4(a)所示,其中,图4(a)中的sta为线程t1,ldb为线程t2),两条指令的串行顺序依然被保持(如图4(b)所示),则线程t2的结果将会通过验证并提交,依赖不引起raw冲突。若线程t1和线程t2的并发执行打乱了原先的串行逻辑顺序(如图4(c)所示),则将发生raw冲突导致线程t2读取错误而撤销。
本实施例提供的编译加速方法可以减少这种冲突,例如,
s301,构建关键数据依赖集。
本步骤利用过程间指针分析和数据流分析技术,通过构造引用-定制链,检测和分析线程数据的定值和引用。对所有存在的raw依赖,基于他们的依赖距离和逻辑执行时间等信息,建立冲突预测模型。从所有存在的raw依赖中找出最可能发生冲突的依赖,构建线程间关键数据依赖集。
具体为,
s201,获取串行程序,从串行程序中抽取线程,将抽取出的线程命名为第六线程,利用过程间指针分析和数据流分析技术,构造引用-定制链,检测各第六线程中的定值和引用。
例如,线程t1和线程t2均为第六线程。
本实施例及后续实施中的“第六”仅为标号,用于区分不同阶段的线程,并无其他含义。也就是说,串行程序抽取出的线程命名为第六线程,抽出的线程在后续执行时,可能被命名为第五,第四,第三,第二,第一等。第五,第四,第三,第二,第一也均为标号,用于区分不同阶段的线程,并无其他含义。例如,一个线程,在此阶段被命名为第六线程,在其他阶段可能被命名为第五,第四,第三,第二,或者,第一线程。并不意味着同一线程的第六线程与其他阶段的第五,第四,第三,第二,第一线程在线程结构,线程属性,线程类别,线程对应的核单元等有所不同。
同样,路由单元,核单元等的第六,第五,第四,第三,第二,第一等也均为标号,用于区分不同阶段,并无其他含义。
s202,根据各第六线程的定值和引用,将对应同一raw内存依赖关系的多个第六线程分为一组。
其中,同组中多个第六线程的定值地址与引用地址相同。
例如,将线程t1和线程t2分为一组。
s203,根据每组中第六线程的属性确定对应的raw内存依赖关系是否为关键数据依赖关系。
其中,第六线程的属性包括位置标识,线程数量,逻辑执行时间。
本步骤的实现过程为:
s203-1,按从先到后的执行顺序将任一组中的各第六线程排序。
例如,对于线程t1和线程t2所在的组,按从先到后的执行顺序将其排序为线程t1,线程t2。
s203-2,对于任一组的任一第六线程,
将任一组的任一第六线程在序列中的位置序号确定任一组的任一第六线程的位置标识。
若任一组的任一第六线程为序列中的首线程,则将任一组的任一第六线程的线程数量确定为0,将任一组的任一第六线程的逻辑执行时间确定为0。
若任一组的任一第六线程为序列中的非首线程,则在串行程序中确定任一组的任一第六线程与排序中首线程之间包括的线程,将之间包括的线程总数量确定为任一组的任一第六线程的线程数量。根据之间包括的线程之间的逻辑关系确定执行总时间,并将该执行总时间确定为任一组的任一第六线程的逻辑执行时间。
例如,对于线程t1和线程t2,线程t1的位置标识为线程t1的位置序号(即为1),线程t2的位置标识为线程t2的位置序号(即为2)。
线程t1为序列中的首线程,则将线程t1的线程数量确定为0,将线程t1的逻辑执行时间确定为0。
线程t2为非首线程,则在串行程序中确定线程t2与线程t1之间包括的线程(如线程t3,线程t4,线程t5),将之间包括的线程总数量1确定为线程t2与的线程数量。根据之间包括的线程之间的逻辑关系确定执行总时间(此处的逻辑关系为基于各线程之间逻辑所最终得出的总执行时间。例如,线程t3的执行时间为1纳秒,线程t4的执行时间为2纳秒,线程t5的执行时间为1纳秒。线程t3,线程t4,线程t5之间的逻辑关系为:线程t3执行完成后执行线程t4,线程t3与线程t5同一时刻开始执行,线程t3,线程t4和线程t5全部执行完成后,执行线程t2。即线程t3和线程t4之间为串行关系,线程t5与串行的线程t3线程t4之间为并行关系。线程t3,线程t4均执行完成的时间为1纳秒+2纳秒=3纳秒,线程t5执行完成时间为1纳秒,由于线程t5与串行的线程t3线程t4之间为并行关系,因此线程t3,线程t4,线程t5均执行完成时间为3纳秒),将该执行总时间3纳秒确定为线程t2的逻辑执行时间。
s203-3,若存在满足预设关系的两个第六线程,则确定任一组对应的raw内存依赖关系为关键数据依赖关系。若不存在满足预设关系的两个第六线程,则确定任一组对应的raw内存依赖关系非关键数据依赖关系。
如果组中所有的线程之间均不满足预设关系,则确定任一组对应的raw内存依赖关系非关键数据依赖关系。只要该组中有一对线程满足预设关系,则确定任一组对应的raw内存依赖关系为关键数据依赖关系。
预设关系可以有多种,
例1,预设关系为:冲突线程中,线程j的位置标识小于线程i的位置标识。
其中,冲突线程为任一组的2个第六线程,其中1个第六线程包括定值,另1个第六线程包括引用,且定值地址与引用地址相同,将包括定值的第六线程记为线程i,将包括引用的第六线程记为线程j,i,j为线程标识。
例如线程t1和线程t2即为冲突线程,线程t1执行对变量a进行定值,线程t2执行对变量b进行引用,因此线程t1为此处的线程i,线程t2为此处的线程j。
对于线程i和线程j,线程i需要对数据进行定值,如写内存。线程j需要对同一数据进行引用,如读内存。如果先写后读,即先执行线程i后执行线程j则不会发生raw冲突。由于s203-1中的序列是按线程执行的先后顺序排列的,因此,若先执行线程i后执行线程j,那么在该序列中,线程i的位置一定会前于线程j的位置,即线程i的位置标识小于线程j的位置标识。如果线程j的位置标识小于线程i的位置标识,则说明线程i和线程j之间的顺序执行关系被打乱,可能发生raw内存依赖关系。
基于上述原因,通过例1所公开的预设关系,只要两个线程的串行顺序被打乱,即认为满足预设关系。
此种情况可以将所有可能发生raw内存依赖关系。
在具体实现时,有时会出现此种情况:虽然两个线程的线性执行顺序被打乱,但是raw并不一定会发生,因此,不需要对所有的可能的raw构建预计算片段,
或者,
例2,预设关系为冲突线程中,线程j的位置标识大于线程i的位置标识,但执行逻辑差值为负值。
其中,逻辑执行数据差值=线程j的逻辑执行时间-线程i的逻辑执行时间。
对于例1所示的预设关系,此种情况可以将所有可能发生raw内存依赖关系。虽然对可能发生raw内存依赖关系的识别较为全面,但是也会大大增加计算开销,降低并行执行速度。
在具体实现时,有时会出现此种情况:虽然两个线程的线性执行顺序被打乱,但是raw并不一定会发生,因此,不需要对所有的可能的raw构建预计算片段。基于此例2示出了另一种预设关系。
在例2示出的预设关系中,虽然冲突线程中,线程j的位置标识大于线程i的位置标识,但不一定将其定为关键数据依赖关系,仅在执行逻辑差值为负值的情况下,才将其确定为关键数据依赖关系。
因为,虽然线程j的位置标识大于线程i的位置标识,打破了线程i和线程j的顺序执行的条件,例如本来需要先执行线程i再执行线程j,现在是先执行线程j再执行线程i,但是如果线程i的执行时间快于线程j的执行时间,即在线程j执行完毕之前,线程i已经执行完,很可能在线程j未引用时,线程i以定值完毕,此时不会产生raw冲突。线程i的执行时间快于线程j的执行时间意味着线程i的逻辑执行时间小于线程j的逻辑执行时间,线程j的逻辑执行时间-线程i的逻辑执行时间>0,即逻辑执行数据差值=线程j的逻辑执行时间-线程i的逻辑执行时间>0。
如果冲突线程中,线程j的位置标识大于线程i的位置标识,但执行逻辑差值为负值(即<0),则说明很可能出现raw冲突。
因此,例2所示的预设关系,可以在降低计算开销,提升执行速度的同时,有效的筛选出可能出现raw冲突的线程。
或者,
例3,预设关系为冲突线程中,线程j的位置标识大于线程i的位置标识,执行逻辑差值非负值,但(1/线程数量差值)*(1/逻辑执行数据差值)=[(线程j的线程数量+线程i的线程数量)/串行程序的总线程数量]^(1/位置差值)。
其中,位置差值=线程j的位置标识-线程i的位置标识。线程数量差值=线程j的线程数量-线程i的线程数量。
在例2所示的预设关系的基础上,还可以进一步精确评估冲突线程发生raw的可能性,降低计算开销,提升速度。具体如例3所示的预设关系。
线程j的位置标识大于线程i的位置标识,执行逻辑差值非负值,但(1/线程数量差值)*(1/逻辑执行数据差值)=[(线程j的线程数量+线程i的线程数量)/串行程序的总线程数量]^(1/位置差值)。
s204,对于每个raw内存依赖关系,若其为关键数据依赖关系,则将其加入关键数据依赖集中,关键数据依赖集的初始值为空。
至此,根据串行程序中发生raw冲突的可能性,提取出最可能发生冲突的raw依赖,构建线程间关键数据依赖集。
s302,基于关键数据依赖集执行串行程序。
本步骤会基于s301中建立的关键数据依赖集执行串行程序。执行时需要对如下2种情况进行处理,以线程t1和线程t2,线程t1执行对变量a进行定值,线程t2执行对变量b进行引用,变量a和变量b指向同一地址为例,第一种情况为执行线程t1的时候遇到定值如何编译。第二种情况为执行线程t2的时候遇到引用如何编译。
为了更清楚的描述2种情况下的编译流程,本实施例以如下场景为例进行距举例说明:
cashe中的核单元01执行线程t1,核单元01对应路由单元01,核单元02执行线程t2,核单元02对应路由单元02。
1)执行线程t1的时候遇到定值如何编译
此种情况下编译过程如下:
1.1,核单元01执行线程t1,线程t1具有raw内存依赖关系。
此处的raw内存依赖关系可以为任何raw内存依赖关系,也可以为位于关键数据依赖集中的raw内存依赖关系。
1.2,当线程t1执行过程中遇到定值时,路由单元01确定路由单元标识。
例如,路由单元02的标识。
此处的路由单元标识所对应的路由单元即为路由单元02,路由单元02所对应的核单元02执行线程t2,而线程t2与线程t1具有相同的raw内存依赖关系,线程t1执行对变量a进行定值,线程t2执行对变量b进行引用,变量a和变量b指向同一地址。
此处核单元02是在线程被初始分配时就确定的。此处只要根据线程t1进行对应提取即可得核单元02,再根据核单元与路由单元之间的对应关系可得到路由单元标识。
如果1.2中确定的路由单元标识不存在,可能是由于软硬件资源等原因,执行引用变量的推测线程没有被激发,因此,本实施例不对定值变量做任何处理。
如果1.2中确定的路由单元标识存在,则执行1.3及后续步骤。
1.3,路由单元01与路由单元02进行握手。
1.4,路由单元01向路由单元02发送中断传输信号。
1.5,路由单元02当接收到路由单元01发送的中断传输信号时,路由单元02控制核单元02进入等待状态。
执行至此,本例子中的名词与图3所示的编译加速方法中的名词对应关系为:此处的核单元02即图3所示的编译加速方法中的第一核单元,此处的路由单元02即图3所示的编译加速方法中的第一路由单元,线程t2即图3所示的编译加速方法中的第一线程。
中断条件为接收到中断传送信号,中断传送信号由核单元01发送。即当接收到核单元01发送的中断传送信号,路由单元02控制核单元02进入等待状态。
路由单元01即图3所示的编译加速方法中的第三路由单元,核单元01即图3所示的编译加速方法中的第三核单元,线程t1即图3所示的编译加速方法中的第三线程。线程t1与线程t2对应同一raw内存依赖关系。
此例子仅为第三路由单元(即路由单元01)发送中断传送信号,实际过程中,第一核单元(即核单元02)也可以向路由单元发送中断信号。对于核单元02发送中断信号的情况,仅核单元02发送流程与上述方案不同,但为现有方案,此处不再赘述,当核单元02发送中断信号之后路由单元02的处理过程却与路由单元01发送中断传送信号后路由单元02的处理流程(1.3及后续步骤)相同,此处就不单独描述核单元02发送中断信号之后路由单元02的处理过程。
另外,相对于路由单元01,路由单元02是其需要发送中断传输信号的路由单元,因此,路由单元02也是图3所示的编译加速方法中的路由单元。核单元02也是图3所示的编译加速方法中的第四核单元。线程t2也是图3所示的编译加速方法中的第四线程。
1.6,路由单元01向路由单元02发送定值对应的数据。
此处定值对应的数据即为图3所示的编译加速方法中的第一数据。
如果与线程t1和线程t2具有raw内存依赖关系的数据为多个,那么此处路由单元01会将多个定值数据均发送至路由单元02。
1.7,路由单元02收到路由单元01发送的数据后,确定处理该数据的线程,进而确定该线程对应的核单元。
此处,处理该数据的线程即为图3所示的编译加速方法中的第二线程,第二线程对应的核单元即为图3所示的编译加速方法中的第二核单元。
若路由单元01发送的数据有多个,则1.7会分别确定每个数据所对应的核单元。
1.8,如果1.7中确定路由单元01发送的数据所对应的核单元为核单元02,则路由单元02控制核单元02执行线程t2,以便根据路由单元01发送的数据处理线程。
由于此时线程t2中变量b并非通过地址引用的方式获取,而是为路由单元01发送的数据,保证了线程t2中变量b的值与线程t1中变量a的值的一致性,避免了由于线程t1后执行,造成的同一地址数据raw冲突。
对于1.7中确定路由单元01发送的数据所对应的核单元为多个情况,如果所有的核单元均为核单元02,路由单元02才控制核单元02执行线程t2。
否则(1.7中确定路由单元01发送的数据所对应的核单元中只要有一个不是核单元02)不执行1.8,执行1.9及后续步骤。
1.9,如果1.7中确定路由单元01发送的数据所对应的核单元并非核单元02,如是核单元03,则路由单元02确定路由单元标识(如路由单元03的标识),与路由单元03进行握手,向路由单元03发送中断传输信号。路由单元03当接收到路由单元02发送的中断传输信号时,路由单元03控制核单元03进入等待状态。路由单元02向路由单元03发送定值对应的数据,路由单元03收到路由单元02发送的数据后,确定处理该数据的线程,进而确定该线程对应的核单元,路由单元03根据该线程对应的核单元是否为核单元03确定是否执行核单元03所处理的线程,如此循环,直至路由单元01发送的数据被处理。
路由单元03与核单元03对应,核单元03处理线程t3,线程t3执行对变量c进行引用,变量a和变量c指向同一地址。
路由单元03即为图3所示的编译加速方法中的第五路由单元。
2)执行线程t2的时候遇到引用如何编译
此种情况下编译过程如下:
2.1,核单元02执行线程t2,线程t2具有raw内存依赖关系。
此处的raw内存依赖关系可以为任何raw内存依赖关系,也可以为位于关键数据依赖集中的raw内存依赖关系。
此时线程t2即为图3所示的编译加速方法中的第一线程,核单元02即为图3所示的编译加速方法中的第一核单元,路由单元02即为图3所示的编译加速方法中的第一路由单元。
2.2,当线程t2执行过程中遇到引用时,路由单元02确定路由单元标识。
例如,路由单元01的标识。
此处的路由单元标识所对应的路由单元即为路由单元01,路由单元01所对应的核单元01执行线程t1,而线程t1与线程t2具有相同的raw内存依赖关系,线程t1执行对变量a进行定值,线程t2执行对变量b进行引用,变量a和变量b指向同一地址。
此处路由单元01即为图3所示的编译加速方法中的第二路由单元,核单元01即为图3所示的编译加速方法中的第二核单元,线程t1即为图3所示的编译加速方法中的第二线程。
此处核单元01是在线程被初始分配时就确定的。此处只要根据线程t1进行对应提取即可得核单元01,再根据核单元与路由单元之间的对应关系可得到路由单元标识。
如果2.2中确定的路由单元标识不存在,可能是由于软硬件资源等原因,执行引用变量的推测线程没有被激发,因此,本实施例不对定值变量做任何处理。
如果2.2中确定的路由单元标识存在,则执行2.3。
2.3,确定线程t2是否为非推测线程。
线程t2为非推测线程,即确认线程,此时执行已经处于确定状态,从内存中将可以直接读取正确的值,那么该条指令将不对引用变量做任何处理,本实施例也不进行任何处理。
因此如果2.3中确定线程t2为非推测线程,则退出流程。如果2.3中确定线程t2为推测线程,则执行2.4及后续步骤。
2.4,路由单元02与路由单元01进行握手。
2.5,路由单元02控制核单元02进入等待状态。
2.6,路由单元01向路由单元02发送定值对应的数据。
此处定值对应的数据即为图3所示的编译加速方法中的第一数据。
如果与线程t1和线程t2具有raw内存依赖关系的数据为多个,那么此处路由单元01会将多个定值数据均发送至路由单元02。
2.7,路由单元02收到路由单元01发送的数据后,确定处理该数据的线程,进而确定该线程对应的核单元。
此处,处理该数据的线程即为图3所示的编译加速方法中的第二线程,第二线程对应的核单元即为图3所示的编译加速方法中的第二核单元。
若路由单元01发送的数据有多个,则2.7会分别确定每个数据所对应的核单元。
2.8,如果2.7中确定路由单元01发送的数据所对应的核单元为核单元02,则路由单元02控制核单元02执行线程t2,以便根据路由单元01发送的数据处理线程。
由于此时线程t2中变量b并非通过地址引用的方式获取,而是为路由单元01发送的数据,保证了线程t2中变量b的值与线程t1中变量a的值的一致性,避免了由于线程t1后执行,造成的同一地址数据raw冲突。
对于2.7中确定路由单元01发送的数据所对应的核单元为多个情况,如果所有的核单元均为核单元02,路由单元02才控制核单元02执行线程t2。
否则(2.7中确定路由单元01发送的数据所对应的核单元中只要有一个不是核单元02)不执行2.8,执行2.9及后续步骤。
2.9,如果2.7中确定路由单元01发送的数据所对应的核单元并非核单元02,如是核单元03,则路由单元02确定路由单元标识(如路由单元03的标识),与路由单元03进行握手,向路由单元03发送中断传输信号。路由单元03当接收到路由单元02发送的中断传输信号时,路由单元03控制核单元03进入等待状态。路由单元02向路由单元03发送定值对应的数据,路由单元03收到路由单元02发送的数据后,确定处理该数据的线程,进而确定该线程对应的核单元,路由单元03根据该线程对应的核单元是否为核单元03确定是否执行核单元03所处理的线程,如此循环,直至路由单元01发送的数据被处理。
路由单元03与核单元03对应,核单元03处理线程t3,线程t3执行对变量c进行引用,变量a和变量c指向同一地址。
路由单元03即为图3所示的编译加速方法中的第五路由单元。
本实施例提供的编译加速方法被路由单元所执行,路由单元用于实现如下一种或多种功能:缓冲自身产生的数据,转发数据,接收数据,验证接收的数据;路由单元与核单元一一对应,核单元用于执行线程;cache中包括多个路由单元,各核单元执行的线程不同;线程为推测线程或确定线程;包括:当满足中断条件时,控制第一核单元进入等待状态;第一核单元与第一路由单元对应,第一路由单元执行编译加速方法;当接收到第一数据后,确定第二核单元,第二核单元执行第二线程,第二线程处理第一数据;若第二核单元与第一核单元相同,则控制第一核单元执行第二线程;否则,转发第一数据,实现了raw情况下的编译。
本实施例提供了一种路由单元,路由单元与核单元一一对应;
路由单元用于实现如下一种或多种功能:缓冲自身产生的数据,转发数据,接收数据,验证接收的数据;
核单元用于执行线程;
cache中包括多个路由单元,各核单元执行的线程不同;线程为推测线程,或者,确定线程;
路由单元,用于执行如下方法:
s101,当确定满足中断条件时,控制第一核单元进入等待状态;第一核单元与第一路由单元对应,第一路由单元执行编译加速方法;
s102,当接收到第一数据后,确定第二核单元,第二核单元执行第二线程,第二线程处理第一数据;
s103,若第二核单元与第一核单元为同一核单元,则控制第一核单元执行第二线程;若第二核单元与第一核单元非同一核单元,则转发第一数据。
可选地,中断条件为接收到中断传送信号;中断传送信号由第三路由单元发送,或者,中断传送信号由第一核单元发送;第三路由单元与第三核单元对应,第三核单元执行第三线程,第三线程与第一线程对应同一写后读raw内存依赖关系,第一线程由第一核单元执行;
或者,
中断条件为第一线程具有raw内存依赖关系且第一线程被执行过程中遇到引用。
可选地,第三路由单元发送中断传送信号的方法为:
若第三线程具有raw内存依赖关系,且第三线程被执行过程中遇到定值时,确定路由单元标识;
若路由单元标识存在,则与第四路由单元完成握手后,向第四路由单元发送中断传输信号;第四路由单元与路由单元标识对应;
第四路由单元对应第四核单元,第四核单元执行第四线程;根据raw内存依赖关系,第四线程中引用定值。
可选地,当中断条件为第一线程具有raw内存依赖关系且第一线程被执行过程中遇到引用;
s102之前还包括:
确定第一线程为推测线程。
可选地,若引用的数据为第一数据,且第一数据为多个,则s102包括:
接收到任一第一数据后,确定对应的第二核单元,对应的第二核单元执行对应的第二线程,对应的第二线程处理任一第一数据;
s103包括:
若多个第一数据均接收到,且所有第二核单元与第一核单元均为同一核单元,则控制第一核单元处理所有第一数据;
若多个第一数据均接收到,但存在与第一核单元不同的第二核单元,则向第五路由单元发送中断传送信号,与第五路由单元完成握手后,向第五路由单元发送不同的第二核单元所对应的第一数据;
第五路由单元与不同的第二核单元对应。
可选地,raw内存依赖关系位于关键数据依赖集中。
可选地,关键数据依赖集的建立方法包括:
s201,获取串行程序,从串行程序中抽取线程,将抽取出的线程命名为第六线程,利用过程间指针分析和数据流分析技术,构造引用-定制链,检测各第六线程中的定值和引用;
s202,根据各第六线程的定值和引用,将对应同一raw内存依赖关系的多个第六线程分为一组;其中同组中多个第六线程的定值地址与引用地址相同;
s203,根据每组中第六线程的属性确定对应的raw内存依赖关系是否为关键数据依赖关系;
s204,对于每个raw内存依赖关系,若其为关键数据依赖关系,则将其加入关键数据依赖集中,关键数据依赖集的初始值为空。
可选地,第六线程的属性包括位置标识,线程数量,逻辑执行时间;
对于任一组,s203包括:
s203-1,按从先到后的执行顺序将任一组中的各第六线程排序;
s203-2,对于任一组的任一第六线程,
将任一组的任一第六线程在序列中的位置序号确定任一组的任一第六线程的位置标识;
若任一组的任一第六线程为序列中的首线程,则将任一组的任一第六线程的线程数量确定为0,将任一组的任一第六线程的逻辑执行时间确定为0;
若任一组的任一第六线程为序列中的非首线程,则在串行程序中确定任一组的任一第六线程与排序中首线程之间包括的线程,将之间包括的线程总数量确定为任一组的任一第六线程的线程数量;根据之间包括的线程之间的逻辑关系确定执行总时间,并将该执行总时间确定为任一组的任一第六线程的逻辑执行时间;
s203-3,若存在满足预设关系的两个第六线程,则确定任一组对应的raw内存依赖关系为关键数据依赖关系;若不存在满足预设关系的两个第六线程,则确定任一组对应的raw内存依赖关系非关键数据依赖关系;
预设关系为:冲突线程中,线程j的位置标识小于线程i的位置标识;其中,冲突线程为任一组的2个第六线程,其中1个第六线程包括定值,另1个第六线程包括引用,且定值地址与引用地址相同,将包括定值的第六线程记为线程i,将包括引用的第六线程记为线程j,i,j为线程标识;
或者,
冲突线程中,线程j的位置标识大于线程i的位置标识,但执行逻辑差值为负值,其中,逻辑执行数据差值=线程j的逻辑执行时间-线程i的逻辑执行时间;
或者,
冲突线程中,线程j的位置标识大于线程i的位置标识,执行逻辑差值非负值,但(1/线程数量差值)*(1/逻辑执行数据差值)=[(线程j的线程数量+线程i的线程数量)/串行程序的总线程数量]^(1/位置差值);其中,位置差值=线程j的位置标识-线程i的位置标识;线程数量差值=线程j的线程数量-线程i的线程数量。
本实施例提供的路由单元当判断满足中断条件时,控制第一核单元进入等待状态;第一核单元与第一路由单元对应,第一路由单元执行编译加速方法;当接收到第一数据后,确定第二核单元,第二核单元执行第二线程,第二线程处理第一数据;若第二核单元与第一核单元相同,则控制第一核单元执行第二线程;否则,转发第一数据,实现了raw情况下的编译。
本实施例提供一种缓存,缓存包括多个核单元和多个路由单元;
路由单元数量与核单元数量相同;
路由单元与核单元一一对应;
路由单元用于实现如下一种或多种功能:缓冲自身产生的数据,转发数据,接收数据,验证接收的数据;
核单元用于执行线程;
各核单元执行的线程不同;线程为推测线程,或者,确定线程;
任一路由单元,用于执行如下方法:
s101,当确定满足中断条件时,控制第一核单元进入等待状态;第一核单元与第一路由单元对应,第一路由单元执行编译加速方法;
s102,当接收到第一数据后,确定第二核单元,第二核单元执行第二线程,第二线程处理第一数据;
s103,若第二核单元与第一核单元为同一核单元,则控制第一核单元执行第二线程;若第二核单元与第一核单元非同一核单元,则转发第一数据。
可选地,中断条件为接收到中断传送信号;中断传送信号由第三路由单元发送,或者,中断传送信号由第一核单元发送;第三路由单元与第三核单元对应,第三核单元执行第三线程,第三线程与第一线程对应同一写后读raw内存依赖关系,第一线程由第一核单元执行;
或者,
中断条件为第一线程具有raw内存依赖关系且第一线程被执行过程中遇到引用。
可选地,第三路由单元发送中断传送信号的方法为:
若第三线程具有raw内存依赖关系,且第三线程被执行过程中遇到定值时,确定路由单元标识;
若路由单元标识存在,则与第四路由单元完成握手后,向第四路由单元发送中断传输信号;第四路由单元与路由单元标识对应;
第四路由单元对应第四核单元,第四核单元执行第四线程;根据raw内存依赖关系,第四线程中引用定值。
可选地,当中断条件为第一线程具有raw内存依赖关系且第一线程被执行过程中遇到引用;
s102之前还包括:
确定第一线程为推测线程。
可选地,若引用的数据为第一数据,且第一数据为多个,则s102包括:
接收到任一第一数据后,确定对应的第二核单元,对应的第二核单元执行对应的第二线程,对应的第二线程处理任一第一数据;
s103包括:
若多个第一数据均接收到,且所有第二核单元与第一核单元均为同一核单元,则控制第一核单元处理所有第一数据;
若多个第一数据均接收到,但存在与第一核单元不同的第二核单元,则向第五路由单元发送中断传送信号,与第五路由单元完成握手后,向第五路由单元发送不同的第二核单元所对应的第一数据;
第五路由单元与不同的第二核单元对应。
可选地,raw内存依赖关系位于关键数据依赖集中。
可选地,关键数据依赖集的建立方法包括:
s201,获取串行程序,从串行程序中抽取线程,将抽取出的线程命名为第六线程,利用过程间指针分析和数据流分析技术,构造引用-定制链,检测各第六线程中的定值和引用;
s202,根据各第六线程的定值和引用,将对应同一raw内存依赖关系的多个第六线程分为一组;其中同组中多个第六线程的定值地址与引用地址相同;
s203,根据每组中第六线程的属性确定对应的raw内存依赖关系是否为关键数据依赖关系;
s204,对于每个raw内存依赖关系,若其为关键数据依赖关系,则将其加入关键数据依赖集中,关键数据依赖集的初始值为空。
可选地,第六线程的属性包括位置标识,线程数量,逻辑执行时间;
对于任一组,s203包括:
s203-1,按从先到后的执行顺序将任一组中的各第六线程排序;
s203-2,对于任一组的任一第六线程,
将任一组的任一第六线程在序列中的位置序号确定任一组的任一第六线程的位置标识;
若任一组的任一第六线程为序列中的首线程,则将任一组的任一第六线程的线程数量确定为0,将任一组的任一第六线程的逻辑执行时间确定为0;
若任一组的任一第六线程为序列中的非首线程,则在串行程序中确定任一组的任一第六线程与排序中首线程之间包括的线程,将之间包括的线程总数量确定为任一组的任一第六线程的线程数量;根据之间包括的线程之间的逻辑关系确定执行总时间,并将该执行总时间确定为任一组的任一第六线程的逻辑执行时间;
s203-3,若存在满足预设关系的两个第六线程,则确定任一组对应的raw内存依赖关系为关键数据依赖关系;若不存在满足预设关系的两个第六线程,则确定任一组对应的raw内存依赖关系非关键数据依赖关系;
预设关系为:冲突线程中,线程j的位置标识小于线程i的位置标识;其中,冲突线程为任一组的2个第六线程,其中1个第六线程包括定值,另1个第六线程包括引用,且定值地址与引用地址相同,将包括定值的第六线程记为线程i,将包括引用的第六线程记为线程j,i,j为线程标识;
或者,
冲突线程中,线程j的位置标识大于线程i的位置标识,但执行逻辑差值为负值,其中,逻辑执行数据差值=线程j的逻辑执行时间-线程i的逻辑执行时间;
或者,
冲突线程中,线程j的位置标识大于线程i的位置标识,执行逻辑差值非负值,但(1/线程数量差值)*(1/逻辑执行数据差值)=[(线程j的线程数量+线程i的线程数量)/串行程序的总线程数量]^(1/位置差值);其中,位置差值=线程j的位置标识-线程i的位置标识;线程数量差值=线程j的线程数量-线程i的线程数量。
本实施例提供的缓存中的路由单元当判断满足中断条件时,控制第一核单元进入等待状态;第一核单元与第一路由单元对应,第一路由单元执行编译加速方法;当接收到第一数据后,确定第二核单元,第二核单元执行第二线程,第二线程处理第一数据;若第二核单元与第一核单元相同,则控制第一核单元执行第二线程;否则,转发第一数据,实现了raw情况下的编译。
需要明确的是,本发明并不局限于上文所描述并在图中示出的特定配置和处理。为了简明起见,这里省略了对已知方法的详细描述。在上述实施例中,描述和示出了若干具体的步骤作为示例。但是,本发明的方法过程并不限于所描述和示出的具体步骤,本领域的技术人员可以在领会本发明的精神后,作出各种改变、修改和添加,或者改变步骤之间的顺序。
还需要说明的是,本发明中提及的示例性实施例,基于一系列的步骤或者装置描述一些方法或系统。但是,本发明不局限于上述步骤的顺序,也就是说,可以按照实施例中提及的顺序执行步骤,也可以不同于实施例中的顺序,或者若干步骤同时执行。
最后应说明的是:以上所述的各实施例仅用于说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述实施例所记载的技术方案进行修改,或者对其中部分或全部技术特征进行等同替换;而这些修改或替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。