发明内容
鉴于上述问题,本说明书实施例提供了一种用于多线程处理的方法、装置及系统。利用该方法、装置及系统,能够将多个线程融合为单个融合线程来运行,从而在无需增加硬件成本的情况下实现多线程处理。
根据本说明书实施例的一个方面,提供了一种用于多线程处理的方法,包括:针对待处理的第一数目个线程中的各个线程,使用不同的第一逻辑寄存器集合来进行编译以得到对应的机器指令代码;以及使用处理内核所支持的指令集中的第一指令来对各个线程的机器指令代码进行融合处理,以得到单个融合线程的机器指令代码,其中,所述第一指令包括取有效地址指令和转移指令,所述取有效地址指令和转移指令利用与所述第一逻辑寄存器集合不同的第二逻辑寄存器来编译得到,所述转移指令被设置在所述各个线程所对应的机器指令代码中,用于实现所述各个线程的机器指令代码之间的跳转操作。
可选地,在上述方面的一个示例中,所述第一数目不超过第一预定阈值,所述第一预定阈值是基于所述处理内核可使用的逻辑寄存器的数目来确定的。
可选地,在上述方面的一个示例中,所述转移指令包括通过对所述各个线程的机器指令代码中的全部或部分跳转指令进行修改而获得的第一转移指令。
可选地,在上述方面的一个示例中,所述转移指令还包括基于转移指令增加规则增加的第二转移指令。
可选地,在上述方面的一个示例中,所述转移指令增加规则包括:使得所述转移指令彼此间隔不超过第二预定数目条指令;和/或使用指令编译器调优策略来在合适的机器指令之后增加所述第二转移指令。
可选地,在上述方面的一个示例中,所述第二预定数目是基于所述处理内核在单个指令周期所能执行的指令数目确定的。
可选地,在上述方面的一个示例中,经过融合后的每个线程具有基于转移指令分割出的至少一个指令跳转块。
可选地,在上述方面的一个示例中,针对除所述第一数目个线程中的第一线程之外的每个线程,所述取有效地址指令包括单条第一取有效地址指令,所有第一取有效地址指令都被放置在所述融合线程的机器指令代码的开始处,用于将该线程的第一条指令的地址传送到对应的第二逻辑寄存器,以及针对所述第一数目个线程中的每个线程中的每个指令跳转块,所述取有效地址指令包括两条第二取有效地址指令,其中,一条第二取有效地址指令用于将该指令跳转块的第一条指令的地址传送到对应的第二逻辑寄存器,另一第二取有效地址指令用于将位于该指令跳转块之后的第一条指令的地址传送到对应的第二逻辑寄存器,所述两条第二取有效地址指令被放置在各自线程的对应指令跳转块和上一指令跳转块之间,以及所述转移指令包括条件传送指令和无条件跳转指令。
可选地,在上述方面的一个示例中,所述指令集包括leaxxj指令,针对除所述第一数目个线程中的第一线程之外的每个线程,所述取有效地址指令包括单条第一取有效地址指令,所述第一取有效地址指令用于将该线程的第一条指令的地址传送到对应的第二逻辑寄存器,并且所有第一取有效地址指令都被放置在所述融合线程的机器指令代码的开始处,以及针对所述第一数目个线程中的各个线程中的每个指令跳转块,所述转移指令包括单条leaxxj指令,其中,所述leaxxj指令的指令格式为leaxxj L_loop_i(rm),rn,其中,逻辑寄存器rm表示对应的指令跳转块所属线程的第一取有效地址指令所使用的第二逻辑寄存器,以及逻辑寄存器rn表示需要跳转到的线程的第一取有效地址指令所使用的第二逻辑寄存器,所述leaxxj指令用于指示在条件满足时将L_loop_i所指向的指令地址放入逻辑寄存器rm,在条件不满足时将所述leaxxj指令之后的第一条指令的指令地址放入逻辑寄存器rm,并且跳转到逻辑寄存器rn中存储的地址所对应的指令。
可选地,在上述方面的一个示例中,所述第二逻辑寄存器具有用于指示该第二逻辑寄存器的使用状态的标志位,所述使用状态包括用于表示正常使用的第一状态和用于表示该逻辑寄存器指向另一逻辑寄存器的第二状态,在进行机器指令运行时,如果所述处理内核识别出leaxxj指令中的L_loop_i被赋值为指定数值,则释放第二逻辑寄存器rn所指向的物理寄存器,使得第二逻辑寄存器rn指向目标跳转线程所使用的第二逻辑寄存器,并且将第二逻辑寄存器rn的标志位赋值为指示第二状态。
可选地,在上述方面的一个示例中,在进行机器指令运行时,如果所述处理内核已经取回leaxxj指令,则将与所述leaxxj指令中的逻辑寄存器rn所存放的地址对应的指令块预取到所述处理内核的指令解码队列中。
可选地,在上述方面的一个示例中,所述方法还包括:经由所述处理内核来以指令块为单位获取所述融合线程中的机器指令来运行。
可选地,在上述方面的一个示例中,所述指令块的大小由所述处理内核在单个指令周期读取指令的能力来确定。
可选地,在上述方面的一个示例中,在所获取的指令块中包括转移指令并且该指令块的结束指令不是所述转移指令时,将该指令块调整为以所述转移指令为结束指令。
根据本说明书实施例的另一方面,提供一种用于多线程处理的装置,包括:线程编译单元,针对待处理的第一数目个线程中的各个线程,使用不同的第一逻辑寄存器集合来进行编译以得到对应的机器指令代码;以及线程融合单元,使用处理内核所支持的指令集中的第一指令来对各个线程的机器指令代码进行融合处理,以得到单个融合线程的机器指令代码,其中,所述第一指令包括取有效地址指令和转移指令,所述取有效地址指令和转移指令利用与所述第一逻辑寄存器集合不同的第二逻辑寄存器来编译得到,所述转移指令被设置在所述各个线程所对应的机器指令代码中,用于实现所述各个线程的机器指令代码之间的跳转操作。
可选地,在上述方面的一个示例中,所述装置还包括:转移指令获得单元,通过对所述各个线程的机器指令代码中的全部或部分跳转指令进行修改而获得的第一转移指令。
可选地,在上述方面的一个示例中,所述转移指令获得单元进一步基于转移指令增加规则增加第二转移指令。
可选地,在上述方面的一个示例中,所述转移指令增加规则包括:使得所述转移指令彼此间隔不超过第二预定数目条指令;和/或使用指令编译器调优策略来在合适的机器指令之后增加所述第二转移指令。
可选地,在上述方面的一个示例中,经过融合后的每个线程具有基于转移指令分割出的至少一个指令跳转块。
可选地,在上述方面的一个示例中,针对除所述第一数目个线程中的第一线程之外的每个线程,所述取有效地址指令包括单条第一取有效地址指令,所有第一取有效地址指令都被放置在所述融合线程的机器指令代码的开始处,用于将该线程的第一条指令的地址传送到对应的第二逻辑寄存器,以及针对所述第一数目个线程中的每个线程中的每个指令跳转块,所述取有效地址指令包括两条第二取有效地址指令,其中,一条第二取有效地址指令用于将该指令跳转块的第一条指令的地址传送到对应的第二逻辑寄存器,另一第二取有效地址指令用于将位于该指令跳转块之后的第一条指令的地址传送到对应的第二逻辑寄存器,所述两条第二取有效地址指令被放置在各自线程的对应指令跳转块和上一指令跳转块之间,以及所述转移指令包括条件传送指令和无条件跳转指令。
可选地,在上述方面的一个示例中,所述指令集包括leaxxj指令,针对除所述第一数目个线程中的第一线程之外的每个线程,所述取有效地址指令包括单条第一取有效地址指令,所述第一取有效地址指令用于将该线程的第一条指令的地址传送到对应的第二逻辑寄存器,并且所有第一取有效地址指令都被放置在所述融合线程的机器指令代码的开始处,以及针对所述第一数目个线程中的各个线程中的每个指令跳转块,所述转移指令包括单条leaxxj指令,其中,所述leaxxj指令的指令格式为leaxxj L_loop_i(rm),rn,其中,逻辑寄存器rm表示对应的指令跳转块所属线程的第一取有效地址指令所使用的第二逻辑寄存器,以及逻辑寄存器rn表示需要跳转到的线程的第一取有效地址指令所使用的第二逻辑寄存器,所述leaxxj指令用于指示在条件满足时将L_loop_i指向的指令地址放入逻辑寄存器rm,在条件不满足时将所述leaxxj指令之后的第一条指令的指令地址放入逻辑寄存器rm,并且跳转到逻辑寄存器rn中存储的地址所对应的指令。
根据本说明书实施例的另一方面,提供一种用于多线程处理的系统,包括:编译器,包括如上所述的用于多线程处理的装置,将第一数目个线程编译为单个融合线程的机器指令代码;指令集;以及处理内核,以指令块为单位获取所述融合线程中的机器指令来运行。
可选地,在上述方面的一个示例中,所述指令集包括leaxxj指令,所述leaxxj指令的指令格式为leaxxj L_loop_i(rm),rn,其中,逻辑寄存器rm表示对应的指令跳转块所属线程的第一取有效地址指令所使用的第二逻辑寄存器,以及逻辑寄存器rn表示需要跳转到的线程的第一取有效地址指令所使用的第二逻辑寄存器,所述leaxxj指令用于指示在条件满足时将L_loop_i所指向的指令地址放入逻辑寄存器rm,在条件不满足时将所述leaxxj指令之后的第一条指令的指令地址放入逻辑寄存器rm,并且跳转到逻辑寄存器rn中存储的地址所对应的指令。
可选地,在上述方面的一个示例中,所述第二逻辑寄存器具有用于指示该第二逻辑寄存器的使用状态的标志位,所述使用状态包括用于表示正常使用的第一状态和用于表示该逻辑寄存器指向另一逻辑寄存器的第二状态,在进行机器指令运行时,如果所述处理内核识别出leaxxj指令中的L_loop_i被赋值为指定数值,则所述处理内核释放第二逻辑寄存器rn所指向的物理寄存器,使得第二逻辑寄存器rn指向目标跳转线程所使用的第二逻辑寄存器,并且将第二逻辑寄存器rn的标志位赋值为指示第二状态。
可选地,在上述方面的一个示例中,在进行机器指令运行时,如果所述处理内核已经取回leaxxj指令,则所述处理内核将与所述leaxxj指令中的逻辑寄存器rn所存放的地址对应的指令块预取到所述处理内核的指令解码队列中。
根据本说明书实施例的又一方面,提供一种计算设备,包括:一个或多个处理器,以及与所述一个或多个处理器耦合的存储器,所述存储器存储指令,当所述指令被所述一个或多个处理器执行时,使得所述至少一个处理器执行如上所述的用于多线程处理的方法。
根据本说明书实施例的再一方面,提供一种机器可读存储介质,其存储有可执行指令,所述指令当被执行时使得所述机器执行如上所述的用于多线程处理的方法。
具体实施方式
现在将参考示例实施方式讨论本文描述的主题。应该理解,讨论这些实施方式只是为了使得本领域技术人员能够更好地理解从而实现本文描述的主题,并非是对权利要求书中所阐述的保护范围、适用性或者示例的限制。可以在不脱离本说明书实施例的内容的保护范围的情况下,对所讨论的元素的功能和排列进行改变。各个示例可以根据需要,省略、替代或者添加各种过程或组件。例如,所描述的方法可以按照与所描述的顺序不同的顺序来执行,以及各个步骤可以被添加、省略或者组合。另外,相对一些示例所描述的特征在其它例子中也可以进行组合。
如本文中使用的,术语“包括”及其变型表示开放的术语,含义是“包括但不限于”。术语“基于”表示“至少部分地基于”。术语“一个实施例”和“一实施例”表示“至少一个实施例”。术语“另一个实施例”表示“至少一个其他实施例”。术语“第一”、“第二”等可以指代不同的或相同的对象。下面可以包括其他的定义,无论是明确的还是隐含的。除非上下文中明确地指明,否则一个术语的定义在整个说明书中是一致的。
图1示出了现有技术中的多线程处理过程100的示意图。
如图1所示,多线程处理过程100可以包括线程编译过程110和线程运行过程120。
具体地,在线程编译过程110中,针对待处理的多个线程中的各个线程,使用相同的逻辑寄存器集合来进行编译以得到对应的机器指令代码。这里,逻辑寄存器是指在程序代码中使用的寄存器,并且逻辑寄存器指向物理寄存器。
图2示出了现有技术中的用于对多个线程进行编译处理的示例示意图。在图2中,示出了3个线程Thread1、Thread2和Thread3。如图2所示,Thread1、Thread2和Thread3使用了相同的逻辑寄存器集合{r1,r2,r3,r4,……}来进行编译。其中,线程Thread1使用了逻辑寄存器r1-r3,线程Thread2使用了逻辑寄存器r1和r3,以及线程Thread3使用逻辑寄存器r1,r2和r4。
在本说明书的实施例中,每条机器指令包括操作码和操作数,其中,操作码用于指明指令所要完成操作的性质和功能,比如,add,mul,mov,sub,jmp等。操作数用于指明操作码执行时的操作对象。操作数的形式可以是数据本身.也可以是存放数据的内存单元地址或寄存器名称。操作数又分为源操作数和目的操作数,源操作数指明参加运算的操作数来源,目的操作数地址指明保存运算结果的存储单元地址或寄存器名称。
此外,处理内核(例如,中央处理器CPU)还为多个线程中的每个线程创建独立的线程运行环境。所述线程运行环境包括用于执行指令预测的硬件资源、用于执行指令执行的硬件资源,用于执行指令提交的硬件资源等。另外,还为多个线程中的每个线程创建各自的硬件指令解码队列。
在线程运行过程120中,CPU根据线程数据在每个指令周期以轮询的方式进行指令存取和解码操作,完成之后将指令放到各自的硬件指令解码队列中。同时,CPU执行单元在每个指令周期会轮询地从每个硬件指令解码队列得到解码后的指令,然后放入CPU执行单元开始运行。
图3示出了指令运行过程的示例示意图。
如图3所示,在块310,执行指令获取(Instruction Fetch,IF)操作。指令获取操作是指将待运行的指令从主存中取到指令寄存器中。程序计数器PC中的数值用来指示当前指令在主存中的位置。当一条指令被取出后,PC中的数值将根据指令字长度而自动递增:若为单字长指令,则增加1个字节;若为双字长指令,则增加2个字节,依此类推。
在取出待运行指令后,在块320,执行指令译码(Instruction Decode,ID)操作。在指令译码操作中,指令译码器按照预定的指令格式,对取回的指令进行拆分和解释,识别区分出不同的指令类别以及各种获取操作数的方法。在组合逻辑控制的计算机中,指令译码器对不同的指令操作码产生不同的控制电位,以形成不同的微操作序列。在微程序控制的计算机中,指令译码器用指令操作码来找到执行该指令的微程序的入口,并从此入口开始执行。
在完成指令译码操作后,在块330,进行指令执行(Execution,EX)操作。在指令执行操作中,完成指令所规定的各种操作来实现指令功能。为此,CPU的不同组件部分被连接起来,以执行所需操作。例如,如果要求完成加法运算,则算术逻辑单元ALU将被连接到一组输入和一组输出,输入端提供需要相加的数值,输出端将含有最后的运算结果。
此外,可选地,在块340,根据指令需要,执行操作数存取操作。在操作数存取操作中,根据指令地址码得到操作数在主存中的地址,并从主存中读取该操作数以用于运算。
在完成指令运行后,在块350,执行结果写回(Writeback,WB)操作。在结果回写操作中,将指令执行操作的运行结果数据“写回”到某种存储单元中。例如,结果数据经常被写到CPU的内部寄存器中,以便被后续的指令快速地存取。在有些情况下,结果数据也可以被写入相对较慢、但较廉价且容量较大的主存。许多指令还会改变程序状态字寄存器中标志位的状态,这些标志位用于标识不同的操作结果,可被使用来影响程序动作。
在指令执行完毕并且完成结果数据写回操作后,若无意外事件(例如,结果溢出等)发生,处理内核就从程序计数器PC中取得下一条指令地址,开始新一轮的指令运行过程。
图3中示出的是单个线程中的指令运行过程的示意图。在多线程处理机制中,操作系统使用线程调度机制来在多个线程之间进行线程切换。例如,操作系统为CPU允许并行执行的多个线程中的每个线程分配一个时间片,各个线程在各自的时间片内占用CPU来执行指令运行操作。当前线程的时间片使用完毕后就会处于就绪状态,并且让出CPU给其它线程占用。此外,如果线程的任务在自己的时间片结束前被阻塞或结束,则会马上进行线程切换,而不会造成CPU资源浪费。
此外,还可以使用超线程机制来实现多线程处理。超线程机制是指在一个线程执行整数指令集时,其它线程所执行的任务是由与执行当前线程的任务的执行单元不同的执行单元执行的任务,比如,浮点指令集。在这种情况下,可以同时执行这两个线程。超线程技术允许两个线程同时不冲突地使用CPU中的资源。
在上面的多线程处理方案中,CPU需要为每个线程准备一个独立的硬件运行环境来运行该线程,从而需要更多的硬件成本。多线程处理机制所运行的线程数目越多,需要增加的硬件成本也会越多。在这种多任务处理方案中,并行处理的线程数目受限于用于线程处理的硬件条件。
为了解决上述问题,本说明书实施例提供了一种多线程处理方案。在该多线程处理方案中,通过使用不同的寄存器集合来分别编译多个线程,并且使用处理内核所支持的指令集中的取有效地址指令和转移指令来将多个线程融合为单个融合线程,然后基于所得到的融合线程来运行,由此实现多线程处理。在这种情况下,仅仅需要提供单个线程运行所需的硬件成本,从而能够在无需增加硬件成本的情况下实现多线程处理。
图4示出了根据本说明书的实施例的多线程处理系统400的方框图。如图4所示,多线程处理系统400包括多线程编译装置410、指令集420和处理内核430。
多线程编译装置410被配置为使用不同的第一逻辑寄存器集合来分别编译待处理的第一数目个线程中的各个线程,以得到各个线程的机器指令代码,并且使用处理内核所支持的指令集420中的第一指令来对各个线程的机器指令代码进行融合处理,以得到单个融合线程的机器指令代码。所得到的单个融合线程的机器指令代码被处理内核430获取来进行指令运行。这里,所述第一指令包括取有效地址指令(Lea指令)和转移指令,所述取有效地址指令和转移指令利用与第一逻辑寄存器集合不同的第二逻辑寄存器来编译得到,所述转移指令被设置在各个线程所对应的机器指令代码中,用于实现各个线程的机器指令代码之间的跳转操作。多线程编译单元410的操作和结构将在下面分别参照图5-图7和图9详细描述。
这里要说明的是,第一逻辑寄存器集合和第二逻辑寄存器都属于处理内核430可使用的逻辑寄存器。在本说明书的实施例中,可以通过对处理内核430可使用的逻辑寄存器进行分割处理来得到第一逻辑寄存器集合和第二逻辑寄存器。
处理内核430被配置为以指令块为单位获取融合线程中的机器指令来运行。在本说明书实施例的一个示例中,指令块的大小可以由处理内核在单个指令周期读取指令的能力来确定。此外,在所获取的指令块中包括转移指令并且该指令块的结束指令不是转移指令时,可以将该指令块调整为以转移指令为结束指令。处理内核430的操作将在下面参照图8详细描述。
图5示出了根据本说明书的实施例的用于多线程处理的方法流程图。
如图5所示,在块510,针对待处理的第一数目个线程中的各个线程,使用不同的第一逻辑寄存器集合来进行编译以得到对应的机器指令代码。在本说明书的实施例中,逻辑寄存器集合不同是指逻辑寄存器集合中的包括的所有逻辑寄存器都不同。此外,逻辑寄存器集合是通过对处理内核可使用的逻辑寄存器进行分割而得到的。例如,假设处理内核可使用的逻辑寄存器包括逻辑寄存器r1-r10,则逻辑寄存器集合是通过对逻辑寄存器r1-r10进行分割而得到的。在本说明书实施例的一个示例中,第一数目被设置为不超过第一预定阈值。所述第一预定阈值是基于处理内核可使用的逻辑寄存器的数目来确定的。例如,在一个示例中,可以基于处理内核可使用的逻辑寄存器的数目以及待处理的线程所需逻辑寄存器的数目确定所述第一预定阈值。此外,在本说明书实施例的另一示例中,第一数目可以通过软件来任意设定。在这种情况下,如果所设定的第一数目超过处理内核可使用的逻辑寄存器的数目或者第一数目个线程所需逻辑寄存器的数目超过处理内核可使用的逻辑寄存器的数目,则可以使用压栈的方式来实现线程编译。
图6示出了根据本说明书的实施例的线程融合处理的一个示例示意图;以及图7示出了根据本说明书的实施例的线程融合处理的另一示例示意图。图6和图7中示出的是对图2中示出的线程Thread1、Thread2和Thread3的线程融合处理。在图6中,使用逻辑寄存器r1-r3组成的第一逻辑寄存器集合来对线程Thread1进行编译,使用逻辑寄存器r8-r9组成的第一逻辑寄存器集合来对线程Thread2进行编译,以及使用逻辑寄存器r12-r14组成的第一逻辑寄存器集合来对线程Thread3进行编译。在图7中,使用逻辑寄存器r1-r3组成的第一逻辑寄存器集合来对线程Thread1进行编译,使用逻辑寄存器r8-r9组成的第一逻辑寄存器集合来对线程Thread2进行编译,以及使用逻辑寄存器r11-r13组成的第一逻辑寄存器集合来对线程Thread3进行编译。
在如上得到各个线程的机器指令代码后,在块520,使用处理内核所支持的指令集420中的第一指令来对各个线程的机器指令代码进行融合处理,以得到单个融合线程的机器指令代码。这里,所述第一指令包括取有效地址指令(Lea指令)和转移指令,所述取有效地址指令和转移指令利用与所述第一逻辑寄存器集合不同的第二逻辑寄存器来编译得到,所述转移指令被设置在所述各个线程所对应的机器指令代码中,用于实现所述各个线程的机器指令代码之间的跳转操作。
取有效地址指令也称为LEA指令,是微机8086/8088系列的一条指令。LEA指令的指令格式为:LEA操作数A,操作数B。LEA指令的指令功能:将操作数B的有效地址传送到操作数A所在的单元。这里,操作数A是目的操作数,以及操作数B是源操作数。LEA指令要求源操作数B必须是存储单元,而且目的操作数A必须是寄存器。
例如,在图6所示的方案中,针对线程Thread1,使用逻辑寄存器r4和r5作为第二逻辑寄存器来编译与线程Thread1相关的第一指令,针对线程Thread2,使用逻辑寄存器r6和r7作为第二逻辑寄存器来编译与线程Thread2相关的第一指令,以及针对线程Thread3,使用逻辑寄存器r10和r11作为第二逻辑寄存器来编译与线程Thread3相关的第一指令。在图7中示出的示例中,针对线程Thread1,使用逻辑寄存器r4作为第二逻辑寄存器来编译与线程Thread1相关的第一指令,针对线程Thread2,使用逻辑寄存器r6作为第二逻辑寄存器来编译与线程Thread2相关的第一指令,以及针对线程Thread3,使用逻辑寄存器r10作为第二逻辑寄存器来编译与线程Thread3相关的第一指令。关于如何使用第一指令来进行融合处理,将在下面参照图6和图7的示例来进行说明。
在一个示例中,所述转移指令可以包括通过对各个线程的机器指令代码中的全部或部分跳转指令进行修改而获得的第一转移指令。例如,在图6中,针对线程Thread1,对图2中的线程Thread1中的跳转指令“1.6 ja L_loop_1”进行修改而得到的转移指令“1.10cmovbe r5,r4”和“1.11 jmp r6”,对图2中的线程Thread1中的跳转指令“1.14 jbe L_loop_2”进行修改而得到的转移指令“1.21 cmovbe r5,r4”和“1.22 jmp r6”,但是对图2中的线程Thread1中的跳转指令“1.9 ja L_sub_again”不进行修改。针对线程Thread2,对图2中的线程Thread2中的全部跳转指令“2.7 ja L_loop_3”进行修改而得到的转移指令“2.9cmovbe r7,r6”和“2.10 jmp r10”。针对线程Thread3,通过对图2中的线程Thread3中的全部跳转指令“3.6 jaL_loop_4”进行修改而得到的转移指令“3.8 cmovbe r11,r10”和“3.9jmp r4”。在图6中示出的示例中,转移指令包括条件传送指令cmovbe和无条件跳转指令jmp。这里要说明的是,图6中示出的cmovbe指令仅仅是示例。在本说明书实施例的其它示例中,条件传送指令可以包括cmovle指令,cmovnz指令等。
在图7中,针对线程Thread1,对图2中的线程Thread1中的跳转指令“1.6 ja L_loop_1”进行修改而得到转移指令“1.8 leaaj L_loop_1(r4),r6”,以及对图2中的线程Thread1中的跳转指令“1.14 jbe L_loop_2”进行修改而得到转移指令“1.16 leaaj L_loop_2(r4),r6”。同样,对图2中的线程Thread1中的跳转指令“1.9 ja L_sub_again”不进行修改。针对线程Thread2,对图2中的线程Thread2中的跳转指令“2.7 ja L_loop_3”进行修改而得到转移指令“2.7 leaaj L_loop_3(r6),r10”。针对线程Thread3,对图2中的线程Thread3中的跳转指令“3.6 ja L_loop_4”进行修改而得到转移指令“3.6 leaaj L_loop_4(r10),r4”。这里,leaaj指令是条件转移指令。关于leaaj指令的具体结构和含义将在下面具体描述。
在该示例中,利用各个线程的机器指令代码中的现有跳转指令来修改得到用于线程融合的转移指令,可以减少融合后的线程中的指令数目,由此提高融合线程的效率。
此外,在另一示例中,所述转移指令可以包括基于转移指令增加规则增加的第二转移指令。这里,第二转移指令不是基于各个线程中的原有指令修改得到的,而是增加的新指令。例如,假设线程Thread1、线程Thread2和/或线程Thread3中都不包含跳转指令,或者线程Thread1、线程Thread2和/或线程Thread3中所包含的跳转指令之间的指令间隔太大(例如,超过预定数目,比如,处理内核在单个指令周期所能执行的指令数目),则可以在对应的线程中,基于转移指令增加规则增加第二条件转移指令。
在本说明书实施例中,所述转移指令增加规则可以包括:使得转移指令彼此间隔不超过第二预定数目条指令;和/或使用指令编译器调优策略来在合适的机器指令之后增加第二转移指令。这里,所述第二预定数目可以是基于处理内核在单个指令周期所能执行的指令数目确定的。
在本说明书实施例中,“使得所述转移指令彼此间隔不超过第二预定数目条指令”是指线程中的转移指令(第一转移指令和/或第二转移指令)之间的间隔不超过第二预定数目条指令。
“使用指令编译器调优策略来在合适的机器指令之后增加第二转移指令”是指通过循环测试的策略来确定可以使得编译器效率最佳的转移指令增加方式。
在该示例中,在融合前的线程中缺少跳转指令的情况下,通过按照转移指令增加规则来增加转移指令,可以使得融合后的线程能够在合适的时机进行线程跳转,由此提高融合后的线程的运行效率。
此外,在经过上述融合处理后,经过融合后的每个线程具有基于转移指令分割出的至少一个指令跳转块。例如,在图6中的融合方案中,针对线程Thread1,具有2个指令跳转块,即,从指令“L_loop_1:1.6 add(addr1),r1”到指令“1.11 jmp r6”的第一指令跳转块,以及从指令“L_loop_2:1.17 sub(addr1),r4”到指令“1.22 jmp r6”的第二指令跳转块。针对线程Thread2,具有1个指令跳转块,即,从指令“L_loop_3:2.5 add(addr2),r8”到指令“2.10 jmp r10”的第三指令跳转块。针对线程Thread3,具有1个指令跳转块,即,从指令“L_loop_4:3.4 sub(addr3),r14”到指令“3.9 jmp r4”的第四指令跳转块。
在本说明书实施例的融合处理方案的一个示例中,如图6中所示,针对除第一数目个线程中的第一线程之外的每个线程,取有效地址指令包括单条第一取有效地址指令,并且所有第一取有效地址指令都被放置在融合线程的机器指令代码的开始处,用于将该线程的第一条指令的地址传送到对应的第二逻辑寄存器。例如,图6中示出第一取有效指令“1.1lea r6,L_Thread2(rip)”和“1.2 lea r10,L_Thread3(rip)”,其中,第一取有效指令“1.1lea r6,L_Thread2(rip)”与线程Thread2对应,以及第一取有效指令“1.2 lea r10,L_Thread3(rip)”与线程Thread3对应。
此外,在图6中示出的示例中,针对第一数目个线程中的每个线程中的每个指令跳转块,取有效地址指令包括两条第二取有效地址指令,其中,一条第二取有效地址指令用于将该指令跳转块的第一条指令的地址传送到对应的第二逻辑寄存器,另一第二取有效地址指令用于将位于该指令跳转块之后的第一条指令的地址传送到对应的第二逻辑寄存器,所述两条第二取有效地址指令被放置在各自线程的对应指令跳转块和上一指令跳转块之间,以及所述转移指令包括条件传送指令和无条件跳转指令。
如图6中所示,针对线程Thread1中的第一指令跳转块,存在两条第二取有效地址指令“1.4 lea r5,Leave_loop_1(rip)”和“1.5 lea r4 L_loop_1(rip)”,即,将指令“L_loop_1:1.6 add(addr1),r1”(即,L_loop_1所指向的指令)的地址传送(存放)到逻辑寄存器r4,以及将指令“Leave_loop_1:L_sub_again1.12 sub r1,r3”(即,Leave_loop_1所指向的指令)的地址传送(存放)到逻辑寄存器r5。并且该两条第二取有效地址指令被放置在指令“L_loop_1:1.6 add(addr1),r1”之前。针对线程Thread1中的第二指令跳转块,存在两条第二取有效指令“1.15 lea r5,Leave_loop_2(rip)”和“1.16 lea r4 L_loop_2(rip)”,即,将指令“L_loop_2:1.17 sub(addr1),r4”的地址传送(存放)到逻辑寄存器r4,以及将指令“Leave_loop_2……”的地址传送(存放)到逻辑寄存器r5。并且该两条第二取有效地址指令被放置在指令“Leave_loop_1:L_sub_again”和指令“L_loop_2:1.17 sub(addr1),r4”之间,即,第一指令跳转块和第二指令跳转块之间。通常,该两条第二取有效地址指令被优选放置为紧接对应的指令跳转块的第一条指令。
针对线程Thread2中的第三指令跳转块,存在两条第二取有效地址指令“2.1 lear7,Leave_loop_3(rip)”和“2.2 lea r6 L_loop_3(rip)”,即,将指令“L_loop_3:2.5 add(addr2),r8”的地址传送(存放)到逻辑寄存器r6,以及将指令“Leave_loop_3:2.11 add$9,r9”的地址传送(存放)到逻辑寄存器r7。并且该两条第二取有效地址指令被放置在指令“L_loop_3:2.5 add(addr2),r8”之前,即,放置在线程Thread2的第三指令跳转块之前。
针对线程Thread3中的第四指令跳转块,存在两条第二取有效地址指令“3.1 lear11,Leave_loop_4(rip)”和“3.2 lea r10L_loop_4(rip)”,即,将指令“L_loop_4:3.4 sub(addr3),r14”的地址传送(存放)到逻辑寄存器r10,以及将指令“Leave_loop_4:……”的地址传送(存放)到逻辑寄存器r11。并且该两条第二取有效地址指令被放置在指令“L_loop_4:3.4 sub(addr3),r14”之前,即,放置在线程Thread3的第四指令跳转块之前。
在图6的示例中,针对第一数目个线程中的每个线程中的每个指令跳转块,转移指令包括条件传送指令cmovbe和无条件跳转指令jmp。例如,针对线程Thread1中的第一指令跳转块,转移指令包括条件传送指令“1.10 cmovbe r5,r4”和无条件跳转指令“1.11 jmpr6”。针对线程Thread1中的第二指令跳转块,转移指令包括条件传送指令“1.21 cmovber5,r4”和无条件跳转指令“1.22 jmp r6”。针对线程Thread2中的第三指令跳转块,转移指令包括条件传送指令“2.9 cmovbe r7,r6”和无条件跳转指令“2.10 jmp r10”。针对线程Thread3中的第四指令跳转块,转移指令包括条件传送指令“3.8 cmovbe r11,r10”和无条件跳转指令“3.9 jmp r4”。
按照图6中示出的线程融合方案,可以将多个线程的机器指令代码融合为单个线程的机器指令代码,由此在进行指令执行时,仅仅需要准备与单个线程对应的硬件运行环境,从而能够在无需增加硬件成本的情况下实现多线程处理。
要说明的是,在图6中示出的线程融合方案中,由于在跳转指令之前,处理内核还不知道跳转目的寄存器,从而需要进行寄存器预测处理。
在本说明书实施例的融合处理方案的另一示例中,如图7中所示,指令集420包括leaxxj指令。相应地,针对除第一数目个线程中的第一线程之外的每个线程,所述取有效地址指令包括单条第一取有效地址指令,所述第一取有效地址指令用于将该线程的第一条指令的地址传送到对应的第二逻辑寄存器。例如,图7中示出第一取有效指令“1.1 lea r6,L_Thread2(rip)”和“1.2 lea r10,L_Thread3(rip)”,其中,第一取有效指令“1.1 lea r6,L_Thread2(rip)”与线程Thread2对应,以及第一取有效指令“1.2 lea r10,L_Thread3(rip)”与线程Thread3对应。并且,第一取有效指令“1.1 lea r6,L_Thread2(rip)”和“1.2 lear10,L_Thread3(rip)”被放置在融合线程的开始处。
此外,针对第一数目个线程中的各个线程中的每个指令跳转块,转移指令包括单条leaxxj指令。
这里,leaxxj指令是CPU的指令集中的新增条件转移指令。所述leaxxj指令的指令格式为leaxxj L_loop_i(rm),rn,其中,逻辑寄存器rm表示对应的指令跳转块所属线程的第一取有效地址指令所使用的第二逻辑寄存器,以及逻辑寄存器rn表示需要跳转到的线程的第一取有效地址指令所使用的第二逻辑寄存器,所述leaxxj指令用于指示在条件满足时将L_loop_i所指向的指令地址放入逻辑寄存器rm,在条件不满足时将该leaxxj指令之后的第一条指令的指令地址放入逻辑寄存器rm,并且(无条件)跳转到逻辑寄存器rn中存储的地址所对应的指令。根据条件判断的方式不同,leaxxj指令可以包括leaaj指令,leaaej指令,leabj指令,leabej指令,leagj指令,leagej指令,lealej指令,lealj指令,leanej指令,leaej指令,leaj指令,leancj指令和leacj指令等。
具体地,leaaj指令的格式为leaaj L_Loop_i(rn),rm,用于表示如果无符号大于,则将L_Loop_i所指向的指令地址存入逻辑寄存器rn,否则将当前leaaj指令后面的指令地址存入逻辑寄存器rn,同时跳转到逻辑寄存器rm。
例如:
sub r1,r2
leaaj L_Loop_i(rn),rm
上述leaaj指令表示无符号比较r2和r1,如果r2大于r1,则将L_Loop_i所指向的指令地址存入rn,否则将当前leaaj指令后面的指令地址存入rn,同时跳转到rm。
leaaej指令的格式为leaaej L_Loop_i(rn),rm,用于表示如果无符号大于或者等于,则将L_Loop_i所指向的指令地址存入逻辑寄存器rn,否则将当前leaaej指令后面的指令地址存入逻辑寄存器rn,同时跳转到逻辑寄存器rm。
例如:
sub r1,r2
leaaej L_Loop_i(rn),rm
上述leaaej指令表示无符号比较r2和r1,如果r2大于或者等于r1,则将L_Loop_i所指向的指令地址存入rn,否则将当前leaaej指令后面的指令地址存入rn,同时跳转到rm。
leabj指令的格式为leabj L_Loop_i(rn),rm,用于表示如果无符号小于,则将L_Loop_i所指向的指令地址存入逻辑寄存器rn,否则将当前leabj指令后面的指令地址存入逻辑寄存器rn,同时跳转到逻辑寄存器rm。
例如:
sub r1,r2
leabj L_Loop_i(rn),rm
上述leabj指令用于表示无符号比较r2和r1,如果r2小于r1,则将L_Loop_i所指向的指令地址存入rn,否则将当前leabj指令后面的指令地址存入rn,同时跳转到rm。
leabej指令的格式为leabej L_Loop_i(rn),rm,用于表示如果无符号小于或者等于,则将L_Loop_i所指向的指令地址存入逻辑寄存器rn,否则将当前leabej指令后面的指令地址存入逻辑寄存器rn,同时跳转到逻辑寄存器rm。
例如:
sub r1,r2
leabej L_Loop_i(rn),rm
上述leabej指令用于表示无符号比较r2和r1,如果r2小于或者等于r1,则将L_Loop_i所指向的指令地址存入rn,否则将当前leabej指令后面的指令地址存入rn,同时跳转到rm。
leagj指令的格式为leagj L_Loop_i(rn),rm,用于表示有符号大于,则将L_Loop_i所指向的指令地址存入逻辑寄存器rn,否则将当前leagj指令后面的指令地址存入逻辑寄存器rn,同时跳转到逻辑寄存器rm。
例如:
sub r1,r2
leagj L_Loop_i(rn),rm
上述leagj指令用于表示有符号比较r2和r1,如果r2大于r1,则将L_Loop_i所指向的指令地址存入rn,否则将当前leagj指令后面的指令地址存入rn,同时跳转到rm。
leagej指令的格式为leagej L_Loop_i(rn),rm,用于表示有符号大于或者等于,则将L_Loop_i所指向的指令地址存入逻辑寄存器rn,否则将当前leagej指令后面的指令地址存入逻辑寄存器rn,同时跳转到逻辑寄存器rm。
例如:
sub r1,r2
leagej L_Loop_i(rn),rm
上述leagej指令表示有符号比较r2和r1,如果r2大于或者等于r1,则将L_Loop_i所指向的指令地址存入rn,否则将当前leagej指令后面的指令地址存入rn,同时跳转到rm。
lealej指令的格式为lealej L_Loop_i(rn),rm,用于表示有符号小于或者等于,则将L_Loop_i所指向的指令地址存入逻辑寄存器rn,否则将当前lealej指令后面的指令地址存入逻辑寄存器rn,同时跳转到逻辑寄存器rm。
例如:
sub r1,r2
lealej L_Loop_i(rn),rm
上述lealej指令表示有符号比较r2和r1,如果r2小于或者等于r1,则将L_Loop_i所指向的指令地址存入rn,否则将当前lealej指令后面的指令地址存入rn,同时跳转到rm。
lealj指令的格式为lealj L_Loop_i(rn),rm,用于表示有符号小于,则将L_Loop_i所指向的指令地址存入逻辑寄存器rn,否则将当前lealj指令后面的指令地址存入逻辑寄存器rn,同时跳转到逻辑寄存器rm。
例如:
sub r1,r2
lealj L_Loop_i(rn),rm
上述lealj指令表示有符号比较r2和r1,如果r2小于r1,则将L_Loop_i所指向的指令地址存入rn,否则将当前lealj指令后面的指令地址存入rn,同时跳转到rm。
leanej指令的格式为leanej L_Loop_i(rn),rm,用于表示不等于,则将L_Loop_i所指向的指令地址存入逻辑寄存器rn,否则将当前leanej指令后面的指令地址存入逻辑寄存器rn,同时跳转到逻辑寄存器rm。
例如:
sub r1,r2
leanej L_Loop_i(rn),rm
上述leanej指令表示有符号比较r2和r1,如果r2不等于r1,则将L_Loop_i所指向的指令地址存入rn,否则将当前leanej指令后面的指令地址存入rn,同时跳转到rm。
leaej指令的格式为leaej L_Loop_i(rn),rm,用于表示等于,则将L_Loop_i所指向的指令地址存入逻辑寄存器rn,否则将当前leaej指令后面的指令地址存入逻辑寄存器rn,同时跳转到逻辑寄存器rm。
例如:
sub r1,r2
leaej L_Loop_i(rn),rm
上述leaej指令表示有符号比较r2和r1,如果r2等于r1,则将L_Loop_i所指向的指令地址存入rn,否则将当前leaej指令后面的指令地址存入rn,同时跳转到rm。
leaj指令的格式为leaj L_Loop_i(rn),rm,用于表示无条件将L_Loop_i所指向的指令地址存入逻辑寄存器rn,同时跳转到逻辑寄存器rm。
例如:
sub r1,r2
leaj L_Loop_i(rn),rm
上述leaj指令表示无条件将L_Loop_i所指向的指令地址存入rn,同时跳转到rm。
leancj指令的格式为leancj L_Loop_i(rn),rm,用于表示不进位,则将L_Loop_i所指向的指令地址存入逻辑寄存器rn,否则将当前leancj指令后面的指令地址存入逻辑寄存器rn,同时跳转到逻辑寄存器rm。
例如:
sub r1,r2
leancj L_Loop_i(rn),rm
上述leancj指令表示比较r2和r1,如果不产生进位,则将L_Loop_i所指向的指令地址存入rn,否则将当前leancj指令后面的指令地址存入rn,同时跳转到rm。
leacj指令的格式为leacj L_Loop_i(rn),rm,用于表示进位,则将L_Loop_i所指向的指令地址存入逻辑寄存器rn,否则将当前leacj指令后面的指令地址存入逻辑寄存器rn,同时跳转到逻辑寄存器rm。
例如:
sub r1,r2
leacj L_Loop_i(rn),rm
上述leacj指令表示比较r2和r1,如果不产生进位,则将L_Loop_i所指向的指令地址存入rn,否则将当前leacj指令后面的指令地址存入rn,同时跳转到rm。
相应地,为了保证所增加的leaxxj指令的指令功能能够顺利执行,需要对CPU的架构进行相应修改。例如,使得CPU能够识别leaxxj指令以及完成leaxxj指令的各种操作任务。
此外,针对各个线程中的各个指令块,转移指令包括单条leaxxj指令。例如,针对线程Thread1的第一指令块,转移指令包括指令“1.8 leaaj L_loop_1(r4),r6”。针对线程Thread1的第二指令块,转移指令包括指令“1.16leaaj L_loop_2(r4),r6”。针对线程Thread2的第三指令块,转移指令包括指令“2.7 leaaj L_loop_3(r6),r10”。针对线程Thread3的第四指令块,转移指令包括指令“3.6 leaaj L_loop_4(r10),r4”。
按照图7中示出的线程融合方案,可以将多个线程的机器指令代码融合为单个线程的机器指令代码,由此在进行指令执行时,仅仅需要准备与单个线程对应的硬件运行环境,从而能够在无需增加硬件成本的情况下实现多线程处理。
此外,在图7中示出的示例中,可以利用单条指令来实现转移指令,从而大大减少融合后的线程的指令数目,由此提高融合后的线程的效率。例如,在图7的示例中,对于每个指令跳转块,仅仅需要1条leaaj指令,并且该leaaj指令是通过对原有的跳转指令修改而得到的。而在图6的示例中,对于每个指令跳转块,需要使用4条指令来实现跳转,即,2条lea指令、1条cmovbe指令和1条jmp指令。
要说明的是,在图7中示出的线程融合方案中,由于在跳转指令之前,处理内核知道跳转目的寄存器,从而无需进行寄存器预测处理。
回到图5,在如上完成多线程融合后,在块530,经由处理内核430来以指令块为单位获取所述融合线程中的机器指令来运行。
具体地,当前CPU每次取指令都是以指令块为单位来从指令解码队列中获取(例如,指令块所包含的最大指令条数可以为5或者6条,所获取的指令块的最大指令数目可以由CPU的处理能力来确定,例如,可以由CPU在单个指令周期中能够执行的指令数目来确定)。如果按照规定的指令块大小,CPU本次取到的指令块包含转移指令,例如,cmovbe指令或leaxxj指令,并且该转移指令不是所获取的指令块的结束指令。在这种情况下,由于转移指令的后续指令是否执行仍然不明确,如果取到转移指令之后的指令,则可能会存在转移指令之后的指令没有执行,由此导致本次取值操作失败,需要回滚到本次取指操作的初始状态。针对这种情况,可以将本次取指操作仅仅取指到转移指令(例如,leaxxj指令)为止,即,将本次取值的指令块调整为将转移指令作为结束指令,由此避免出现前述回滚情形。
此外,要说明的是,在进行机器指令运行时,如果处理内核430已经取回leaxxj指令,则将与该leaxxj指令中的逻辑寄存器rn中存放的地址对应的指令块从缓存或内存中预取到处理内核430的指令解码队列中。比如在取到指令leaxxj L_loop_2(r4),r6的时候,就已经知道下次需要跳转到r6所指向的目的地址,因此开始预取r6所指向地址的指令块(Thread-2的指令块)到该CPU内核的指令解码队列中。这样,在跳转过程中就会有指令连续进入指令解码队列,中间的运行持续展开无断开的现象。
图8示出了根据本说明书的实施例的融合线程运行过程的流程图。
如图8所示,在块810,处理内核430以指令块为单位获取融合线程中的机器指令。例如,处理内核430获取图7中示出的融合线程中的线程Thread1中的指令块1。假设指令块的大小为5条指令,则该指令块1由指令“1.1 lea r6,L_Thread2(rip)”、“1.2 lea r10,L_Thread3(rip)”“1.3 mov r1,r3”、“L_loop_1:1.4 add(addr1),r1”和“1.5 mul r1,r2”。
然后,在块820,处理内核430依次运行所取回的指令块中的指令。例如,处理内核430依次运行指令块1中的指令“1.1 lea r6,L_Thread2(rip)”、“1.2 lea r10,L_Thread3(rip)”“1.3 mov r1,r3”、“L_loop_1:1.4 add(addr1),r1”和“1.5 mul r1,r2”。
接着,在块830,判断当前运行的指令是否是转移指令。如果是转移指令,则判断该转移指令是否指示线程退出。
例如,在使用转移指令leaxxj来进行线程融合的情况下,如果leaxxj指令中的L_loop_i设置为指定数值(例如,0xff ff ff ff ff ff ff ff),则表示线程准备结束。此外,逻辑寄存器具有用于指示该逻辑寄存器的使用状态的标志位,所述使用状态包括用于表示正常使用的第一状态和用于表示该逻辑寄存器指向另一逻辑寄存器的第二状态。例如,标志位可以使用“0”来表示第一状态,以及使用“1”来表示第二状态。
在进行机器指令运行时,如果处理内核识别出leaxxj指令中的L_loop_i为指定数值(例如,0xff ff ff ff ff ff ff ff),则在块850,执行线程退出处理。具体地,处理内核释放对应的逻辑寄存器所指向的物理寄存器,使得对应的逻辑寄存器指向下一线程所使用的逻辑寄存器,并且将该对应的逻辑寄存器的标志位赋值为“1”。通常,指令数值被设置为CPU读取后不能识别其含义或者被识别为无效的数值,比如,0xff ff ff ff ff ff ff ff。关于线程退出机制,将在下面参照图9进行说明。
如果处理内核识别出leaxxj指令中的L_loop_i不是指定数值,则返回到块810,取回下一指令块,执行下一循环操作。例如,取回指令块2,该指令块包括指令“1.6 mov r2,addr2”、“1.7 sub$1,r3”和“1.8 leaaj L_loop_1(r4),r6”,执行下一循环操作。
图9示出了根据本说明书的实施例的线程退出处理的线程示例示意图。在图9中,进行线程融合的线程包括线程Thread1、Thread2、Thread3、Thread4和Thread5。
假设在融合线程程序的起始处,已经初始化了逻辑寄存器r1指向线程Thread-1的程序相应地址,逻辑寄存器r2指向线程Thread-2的程序相应地址,逻辑寄存器r3指向线程Thread-3的程序相应地址,逻辑寄存器r4指向线程Thread-4的程序相应地址,以及逻辑寄存器r5指向线程Thread-5的程序相应地址。
此外,在CPU中还设置有中转寄存器,该中转寄存器用来保留上一次正常跳转时的目的逻辑寄存器,例如当Thread-1正常执行指令leaxxj.L_target_1(r1),r2,此时在跳转的同时,需要将逻辑寄存器r2存入中转寄存器,若Thread-2也正常执行指令leaxxj.L_target_1(r2),r3,则在跳转的同时,需要将逻辑寄存器r3存入中转寄存器来替换上次存入的逻辑寄存器r2。这里,中转寄存器的默认值为“0”。
在本说明书实施例中,在线程程序中使用的寄存器r1,r2,r3,r4,r5都是逻辑寄存器,逻辑寄存器指向的是物理寄存器,由此可以通过改变逻辑-物理寄存器之间的映射关系来改变寄存器中存储的内容,同时结合中转寄存器来实现线程结束。
另外,在每个逻辑寄存器中增加一个标志位L,用来指示该逻辑寄存器的使用状态。所述使用状态可以包括用于指示该逻辑寄存器被正常使用的第一状态,以及用于指示该逻辑寄存器指向的内容为另外一个逻辑寄存器的第二状态。在本说明书实施例中,例如,可以使用值“0”来指示第一状态,以及使用值“1”来指示第二状态。
下面来结合图9详细说明根据本说明书的实施例的线程退出机制。
在正常运行一段时间之后,当线程Thread-1正常跳转后,中转寄存器存储着逻辑寄存器r2,然后跳转到线程Thread-2,开始执行线程Thread-2。
如果在运行过程中,线程Thread-2将会结束,则会使用指令leaxxj 0xff ff ffff ff ff ff ff(r2),r3来表示。由于任何一个偏移地址都不可能是0xff ff ff ff ff ffff ff,因此CPU运行这条指令时,如果发现需要将0xff ff ff ff ff ff ff ff放入逻辑寄存器r2中,则由于中转寄存器存储的是逻辑寄存器r2,CPU会将逻辑寄存器r2原来指向的物理寄存器释放(如果有),同时使逻辑寄存器r2指向物理寄存器的空间中放入线程Thread-3所使用的逻辑寄存器(即,逻辑寄存器r3),同时将逻辑寄存器r2的标志位L设定为1。在指令重命名过程中,如果发现逻辑寄存器对应的L标志位是1,则CPU会根据逻辑寄存器r2此时存储的逻辑寄存器(r3)来找到真正的物理寄存器。由于此时逻辑寄存器r2,r3都指向同一物理寄存器,因此当线程Thread-1再次运行leaxxj指令需要跳到逻辑寄存器r2的地址时,会直接跳入线程Thread-3对应的上下文中。
在运行一段时间后,如果线程Thread-3也要执行指令leaxxj 0xff ff ff ff ffff ff ff(r3),r4,此时由于线程Thread-2已经退出,会从线程Thread-1跳到线程Thread-3,因此中转寄存器存入的是逻辑寄存器r2。由此,CPU将逻辑寄存器r2指向物理寄存器的空间存入线程Thread-4所使用的逻辑寄存器r4,并且逻辑寄存器r2的标志位L被设定为1。这样,当线程Thread-1再次执行指令leaxxj.L_target_1(r1),r2时,会直接从线程Thread-1跳入到线程Thread-4,以此类推。
如果线程4退出时,中转寄存器存入的是逻辑寄存器r2,那么使r2指向物理寄存器的空间中放入线程Thread-5所使用的逻辑寄存器(即,逻辑寄存器r5),那么Thread-1会直接跳入Thread-5,但是当Thread-5需要退出的时候,此时中转寄存器存入的是逻辑寄存器r2,会将r2指向物理寄存器的空间中放入线程Thread-1所使用的逻辑寄存器(即,逻辑寄存器r1),因此当Thread-1退出的时候发现逻辑寄存器r2指向的逻辑寄存器为自己(即,r1),那么正常退出,完成整个操作。
图10示出了根据本说明书的实施例的多线程编译装置1000的方框图。如图10所示,多线程编译装置1000包括线程编译单元1010和线程融合单元1020。
线程编译单元1010被配置为针对待处理的第一数目个线程中的各个线程,使用不同的第一逻辑寄存器集合来进行编译以得到对应的机器指令代码。线程编译单元1010的操作可以参考上面参照图5描述的块510的操作。
线程融合单元1020被配置为使用处理内核所支持的指令集中的第一指令来对各个线程的机器指令代码进行融合处理,以得到单个融合线程的机器代码指令。这里,所述第一指令包括取有效地址指令和转移指令,所述取有效地址指令和转移指令利用与所述第一逻辑寄存器集合不同的第二逻辑寄存器来编译得到,所述转移指令被设置在所述各个线程所对应的机器指令代码中,用于实现所述各个线程的机器指令代码之间的跳转操作。线程融合单元1020的操作可以参考上面参照图5描述的块520的操作以及参照图6到图9描述的操作。
此外,多线程编译装置1000还可以包括转移指令获得单元(未示出)。转移指令获得单元通过对所述各个线程的机器指令代码中的全部或部分跳转指令进行修改而获得第一转移指令。此外,在本说明书实施例的另一示例中,所述转移指令获得单元进一步基于转移指令增加规则增加第二转移指令。所述转移指令增加规则包括:使得转移指令彼此间隔不超过第二预定数目条指令;和/或使用指令编译器调优策略来在合适的机器指令之后增加所述第二转移指令。
如上参照图1到图10,对根据本说明书实施例的用于多线程处理的方法、装置和多线程处理系统的实施例进行了描述。上面的多线程编译装置/多线程处理系统可以采用硬件实现,也可以采用软件或者硬件和软件的组合来实现。
图11为根据本说明书的实施例的用于多线程处理的计算设备的结构框图。
如图11所示,计算设备1100可以包括至少一个处理器1110、存储器(例如,非易失性存储器)1120、内存1130、通信接口1140以及内部总线1160,并且至少一个处理器1110、存储器1120、内存1130和通信接口1140经由总线1160连接在一起。该至少一个处理器1110执行在计算机可读存储介质中存储或编码的至少一个计算机可读指令(即,上述以软件形式实现的元素)。
在一个实施例中,在存储器中存储有计算机可执行指令,其当执行时使得至少一个处理器1110:针对待处理的第一数目个线程中的各个线程,使用不同的第一逻辑寄存器集合来进行编译以得到对应的机器指令代码;以及使用处理内核所支持的指令集中的第一指令来对各个线程的机器指令代码进行融合处理,以得到单个融合线程的机器指令代码,其中,第一指令包括取有效地址指令和转移指令,所述取有效地址指令和转移指令利用与第一逻辑寄存器集合不同的第二逻辑寄存器来编译得到,所述转移指令被设置在各个线程所对应的机器指令代码中,用于实现各个线程的机器指令代码之间的跳转操作。
应该理解的是,在存储器中存储的计算机可执行指令当执行时使得至少一个处理器1110进行本说明书的各个实施例中以上结合图1-10描述的各种操作和功能。
根据一个实施例,提供了一种例如非暂时性机器可读介质的程序产品。非暂时性机器可读介质可以具有指令(即,上述以软件形式实现的元素),该指令当被机器执行时,使得机器执行本说明书的各个实施例中以上结合图1-10描述的各种操作和功能。
具体地,可以提供配有可读存储介质的系统或者装置,在该可读存储介质上存储着实现上述实施例中任一实施例的功能的软件程序代码,且使该系统或者装置的计算机或处理器读出并执行存储在该可读存储介质中的指令。
在这种情况下,从可读介质读取的程序代码本身可实现上述实施例中任何一项实施例的功能,因此机器可读代码和存储机器可读代码的可读存储介质构成了本发明的一部分。
可读存储介质的实施例包括软盘、硬盘、磁光盘、光盘(如CD-ROM、CD-R、CD-RW、DVD-ROM、DVD-RAM、DVD-RW、DVD-RW)、磁带、非易失性存储卡和ROM。可选择地,可以由通信网络从服务器计算机上或云上下载程序代码。
本领域技术人员应当理解,上面公开的各个实施例可以在不偏离发明实质的情况下做出各种变形和修改。因此,本发明的保护范围应当由所附的权利要求书来限定。
需要说明的是,上述各流程和各系统结构图中不是所有的步骤和单元都是必须的,可以根据实际的需要忽略某些步骤或单元。各步骤的执行顺序不是固定的,可以根据需要进行确定。上述各实施例中描述的装置结构可以是物理结构,也可以是逻辑结构,即,有些单元可能由同一物理实体实现,或者,有些单元可能分由多个物理实体实现,或者,可以由多个独立设备中的某些部件共同实现。
以上各实施例中,硬件单元或模块可以通过机械方式或电气方式实现。例如,一个硬件单元、模块或处理器可以包括永久性专用的电路或逻辑(如专门的处理器,FPGA或ASIC)来完成相应操作。硬件单元或处理器还可以包括可编程逻辑或电路(如通用处理器或其它可编程处理器),可以由软件进行临时的设置以完成相应操作。具体的实现方式(机械方式、或专用的永久性电路、或者临时设置的电路)可以基于成本和时间上的考虑来确定。
上面结合附图阐述的具体实施方式描述了示例性实施例,但并不表示可以实现的或者落入权利要求书的保护范围的所有实施例。在整个本说明书中使用的术语“示例性”意味着“用作示例、实例或例示”,并不意味着比其它实施例“优选”或“具有优势”。出于提供对所描述技术的理解的目的,具体实施方式包括具体细节。然而,可以在没有这些具体细节的情况下实施这些技术。在一些实例中,为了避免对所描述的实施例的概念造成难以理解,公知的结构和装置以框图形式示出。
本公开内容的上述描述被提供来使得本领域任何普通技术人员能够实现或者使用本公开内容。对于本领域普通技术人员来说,对本公开内容进行的各种修改是显而易见的,并且,也可以在不脱离本公开内容的保护范围的情况下,将本文所定义的一般性原理应用于其它变型。因此,本公开内容并不限于本文所描述的示例和设计,而是与符合本文公开的原理和新颖性特征的最广范围相一致。