多线程处理器中通用寄存器组的分配方法及装置制造方法

文档序号:6544650阅读:166来源:国知局
多线程处理器中通用寄存器组的分配方法及装置制造方法
【专利摘要】本发明涉及一种多线程处理器中通用寄存器组的分配方法,包括如下步骤:判断该软件线程是初始创建的还是休眠后被唤醒的,如是初始创建的,则查找并得到一个空闲的通用寄存器组,分配给该软件线程,上载到所述软件线程分配到的物理线程的指令处理流水线上;如是休眠后唤醒的,则查找所述软件线程休眠前的配置的通用寄存器组,重新上载到所述软件线程重新分配到的物理线程的指令处理流水线上;形成线程,并运行该线程;如软件线程进入休眠,在线程控制器作用下保持所述软件线程的通用寄存器组。本发明还涉及一种实现上述方法的装置。实施本发明的多线程处理器中通用寄存器组的分配方法及装置,具有以下有益效果:其处理器开销较小、效率较高。
【专利说明】多线程处理器中通用寄存器组的分配方法及装置
【技术领域】
[0001]本发明涉及处理器,更具体地说,涉及一种多线程处理器中通用寄存器组的分配方法及装置。
【背景技术】
[0002]在多线程处理器设计中,每个指令流水线除了有控制逻辑和执行单元以外,还有一组通用寄存器(GPR-set),用于保存运算的中间结果,或保存从存储器读回来的数据。一般来讲,软件线程的通用寄存器组相当于软件线程的工作笔记,保存着软件运行中需要的中间变量和临时数据,如堆栈指针,子程序调用返回地址等等。软件线程休眠前后它的通用寄存器组中的数据必须一致,否则软件线程运行会发生错误。通常,传统的多线程处理器,指令流水线和通用寄存器组的关系是固定的,或者说流水线和寄存器组是绑定一起的。例如,一个具有被标记为T0-T3的4个物理线程(硬件)的处理器,对应4组GPR-set(GS0-GS3),在物理实现上,TO和GSO绑定在一起,Tl和GSl固定在一起,并以此类推。TO运行的软件线程的不能访问GS1、GS2或GS3上的内容;同样,Tl上运行的软件线程也不能访问GSO、GS2或GS3上的内容,其余的物理线程及其不同物理线程之间的通用寄存器的组的关系也是与上述记载相似的。当前,软件多线程设计为充分利用硬件资源,软件线程通常在等待数据或某事件发生时,主动释放硬件资源。例如,运行在Tl上的软件线程(Kl)正在用DMA从外部存储器copy大量的数据,在DMA做数据搬运时候,软件线程Kl没什么事情可做的,这时它可让出指令流水线资源,让其它正在等待的软件线程使用。等到DMA把数据搬运完成,DMA通知线程控制器(THDC),如果THDC发现有可用的硬件资源(比如T3),THDC便唤醒K1,于是Kl会被调度到T3上继续执行。在上面的过程中,Kl在让出指令流水线资源(让出后软件线程Kl进入休眠)前在Tl上运行的,它运行的中间结果存放在GS-1上,Kl在唤醒后在T3上运行,这时它用的GPR-set是GS-3。GS-1和GS-3是完全不同的两组GPR-set。因此,为了保证软件Kl在唤醒后能正确运行,要求Kl在休眠之前把GS-1的内容保存下来,被唤醒后把保存下来的内容恢复到GS-3中。由于多线程软件中这种sleep-wakeup非常频繁,这种保存_恢复(context switch)操作对多线程处理器来说是很大的开销,从而使得该处理器的性能变得较低。

【发明内容】

[0003]本发明要解决的技术问题在于,针对现有技术的上述通用寄存器组内容的保存-恢复操带来的较大的处理器开销、进而使得处理器性能较低的缺陷,提供一种处理器开销较小、性能较高的多线程处理器中通用寄存器组的分配方法及装置。
[0004]本发明解决其技术问题所采用的技术方案是:构造一种多线程处理器中通用寄存器组的分配方法,所述处理器指令处理流水线的通用寄存器组是在软件线程分配到物理线程时分配到其指令处理流水线上的;所述分配方法包括如下步骤:
A)收到为软件线程配置通用寄存器组的请求,判断该软件线程是初始创建的还是休眠后被唤醒的,如是初始创建的,执行步骤B);如是休眠后唤醒的,执行步骤C);
B)查找并得到一个空闲的通用寄存器组,分配给该软件线程,上载到所述软件线程分配到的物理线程的指令处理流水线上,并执行步骤D);
C)查找所述软件线程休眠前的配置的通用寄存器组,重新上载到所述软件线程重新分配到的物理线程的指令处理流水线上,并执行步骤D);
D)形成线程,并运行该线程;
E)判断运行线程中的软件线程是否被要求进入休眠,如是,所述软件线程进入休眠,并将所述通用寄存器组寄存在所述线程控制器的寄存器组池中;否则,继续运行该线程;
F)所述软件线程运行完成时,释放所述通用寄存器组。
[0005]更进一步地,所述步骤A)中,通过比较所述软件线程的ID号和当前分配给软件线程的ID号来判断所述软件线程是否初始创建的软件线程;所述软件线程的ID号是系统在创建软件线程时赋予其的编号。
[0006]更进一步地,所述步骤B)中空闲的通用寄存器组是在等待队列中,且其编号仅有寄存器编号的通用寄存器组;所述步骤B)进一步包括:所述空闲寄存器组在分配到一个软件线程后,其编号包括寄存器编号和所在软件线程的编号。
[0007]更进一步地,所述步骤C)中,通过比较所述寄存器组编号中是否包括所述软件线程编号来判断所述通用寄存器组是否是该软件线程休眠前的通用寄存器组。
[0008]更进一步地,所述步骤D)中,还包括将指令执行流水线和物理线程配置到所述软件线程以形成一个完整的线程运行环境。
[0009]更进一步地,所述步骤E)中进一步包括:记录并传输所述通用寄存器的编号到所述线程控制器,使所述线程控制器保持所述通用寄存器组。
[0010]本发明还涉及一种实现上述方法的装置,所述处理器指令处理流水线的通用寄存器组是在软件线程分配到物理线程时分配到其指令处理流水线上的;所述装置包括:
软件线程判断单元:用于在收到为软件线程配置通用寄存器组的请求,判断该软件线程是初始创建的还是休眠后被唤醒的,如是初始创建的,调用空闲寄存器分配单元;如是休眠后唤醒的,调用寄存器重新上载单元;
空闲寄存器分配单元:用于查找并得到一个空闲的通用寄存器组,分配给该软件线程,上载到所述软件线程分配到的物理线程的指令处理流水线上;
寄存器重新上载单元:用于查找所述软件线程休眠前的配置的通用寄存器组,重新上载到所述软件线程重新分配到的物理线程的指令处理流水线上;
线程形成单元:用于形成线程,并运行该线程;
休眠判断单元:用于判断运行线程中的软件线程是否被要求进入休眠,如是,所述软件线程进入休眠,并将所述通用寄存器组寄存在所述线程控制器的寄存器组池中;否则,继续运行该线程。
[0011]更进一步地,所述软件线程判断单元中,通过比较所述软件线程的ID号和当前分配给软件线程的ID号来判断所述软件线程是否初始创建的软件线程;所述软件线程的ID号是系统在创建软件线程时赋予其的编号。
[0012]更进一步地,所述空闲寄存器分配单元中空闲的通用寄存器组是在等待队列中,且其编号仅有寄存器编号的通用寄存器组;所述空闲寄存器分配单元进一步包括: 寄存器编号修改模块:用于在所述空闲寄存器组在分配到一个软件线程后,修改其编号使其包括寄存器编号和所在软件线程的编号。
[0013]更进一步地,所述寄存器重新上载单元中,通过比较所述寄存器组编号中是否包括所述软件线程编号来判断所述通用寄存器组是否是该软件线程休眠前的通用寄存器组。
[0014]实施本发明的多线程处理器中通用寄存器组的分配方法及装置,具有以下有益效果:由于将原先与指令处理流水线固定在一起的通用寄存器组改变为分配物理线程时,产生配置通用寄存器组的请求,并为运行在该物理线程上的软件线程配置通用寄存器组,虽然通用寄存器组在物理连接上还是与连接在指令处理流水线上。但是,其在逻辑上与软件线程绑定。因此,在软件线程进入休眠状态时,在线程控制器的作用下,仍然可以保持该软件线程的通用寄存器组。至于该物理线程,可以在配置别的通用寄存器组的情况下处理别的软件线程。因此,其没有保存-恢复(context switch)操作,所以其处理器开销较小、效率较高。
【专利附图】

【附图说明】
[0015]图1是本发明多线程处理器中通用寄存器组的分配方法及装置实施例中通用寄存器组分配方法的流程图;
图2是所述实施例中装置的结构示意图。
【具体实施方式】
[0016]下面将结合附图对本发明实施例作进一步说明。
[0017]如图1所示,在本发明多线程处理器中通用寄存器组的分配方法及装置实施例中,该通用寄存器组的分配方法包括如下步骤:
步骤Sll收到配置通用寄存器组的请求:在本实施例中,处理器指令处理流水线的通用寄存器组是在软件线程分配到物理线程时分配到其指令处理流水线上的。也就是说,在现有技术中,通用寄存器组是固定在指令处理流水线上并随指令处理流水线一起分配到或固定在物理线程上的。而在本实施例中,通用寄存器组并不是固定在指令流水线上的。虽然通用寄存器组也是指令处理流水线的一部分,其所起作用也会现有技术中相同,其与指令处理流水线的连接关系可能也与现有技术中相同,但是,通用寄存器组是在为物理线程配置指令处理流水线时配置到该指令处理流水线上。从另一个角度而言,在本实施例中,处理器有多个没有连接通用寄存器组的指令处理流水线,也有多个单独的、未与指令处理流水线连接的通用寄存器组,这些通用寄存器组在上述指令处理流水线(此时,这些指令处理流水线是不完整的,不能工作的)被配置到物理线程时,被配置的通用寄存器组才连接到该指令处理流水线,以形成一个完整的指令处理环境。在本实施例中,这些操作是由线程控制单元实现的。同样地,当需要将通用寄存器组配置到指令处理流水线线上时,系统产生的配置通用寄存器组的请求,也是传输到该线程控制单元的,由该线程控制单元来实现通用寄存器组的配置。
[0018]步骤S12判断软件线程是否由休眠中唤醒,如是,执行步骤S13 ;否则,执行步骤S14;在本步骤中,线程控制单元已经收到通用寄存器组的配置请求,同时,配置信息中还包括了软件线程及其编号,表明该通用寄存器组即将用于那个软件线程。在此,需要判断该软件线程是一个新建立的线程还是已经运行后进入休眠的线程。在本实施例中,通过比较所述软件线程的ID号和当前分配给软件线程的ID号来判断所述软件线程是否初始创建的软件线程,如果该软件线程的ID号等于当前分配给软件线程的ID号,则判断该软件线程时新建的线程,并不是由休眠中唤醒的线程;如果该软件线程的ID号并不是当前分配给软件线程的ID号,而是较小或较大(视系统分配软件线程的ID号的顺序而定),则该软件线程是之前创建的线程。是由休眠状态中唤醒的。软件线程的ID号是系统在创建软件线程时赋予其的编号。
[0019]步骤S13查找软件线程休眠前的通用寄存器组并配置:在本步骤中,由于已经判断该软件线程是由休眠状态中唤醒的软件线程,所以,需找查找到该软件线程之前使用的通用寄存器组,该通用寄存器组在软件线程休眠时被保持,其中的内容并未改变,为此,当该通用寄存器组被配置到该软件线程时(更确切地讲,是被配置到该软件线程运行的物理线程的指令处理流水线时),可以被直接使用,不需要做任何的保存-恢复(contextswitch)操作。在本步骤中,通过比较所述寄存器组(即被线程控制单元保持的通用寄存器组)的编号中是否包括所述软件线程编号来判断所述通用寄存器组是否是该软件线程休眠前的通用寄存器组。如果该通用寄存器组的编号中包括了该软件线程的编号,则判断为其是该软件线程之前使用的通用寄存器组,否则,判断为该通用寄存器组不是之前该软件寄存器组使用的通用寄存器组。关于通用寄存器组的编号,后面有较为详细的描述。
[0020]步骤S14查找空闲的通用寄存器组并配置:在本步骤中,由于判断该软件线程是新建立的线程,因此不需要查找其之前配置的通用寄存器组,而是查找一个空闲的通用寄存器,并将该空闲的通用寄存器组配置到该软件线程(更确切地讲,是被配置到该软件线程运行的物理线程的指令处理流水线)。在本实施例中,对于处理器而言,如果一个通用寄存器组是空闲的,则该通用寄存器组仅仅只有一个用来表示该寄存器组位置或顺序的寄存器组编号;此外,多个空闲的寄存器组在等待软件线程或指令处理流水线使用时,其会形成一个等待队列,等待调用。也就是说,在本实施例中,空闲的通用寄存器组就是在等待队列中,且其编号仅有寄存器编号(该编号是系统开始运行时赋予的)的通用寄存器组。而在本步骤中,还包括一个通用寄存器组的编号改变步骤,也就是一旦一个通用寄存器组被配置到软件线程后,系统将改变其编号,以便于上述步骤中(在实际操作中,该步骤的时间实在本步骤之后的)的通用寄存器组的保持。也就是说,空闲寄存器组在被分配到一个软件线程后,系统会在该通用寄存器组的编号上加上该软件线程的线程编号,这样,该寄存器组的编号就包括寄存器编号和所在软件线程的编号。从另一个方面来讲,当软件线程运行完成,释放该寄存器组时,同样需要将该软件线程的编号由其通用寄存器组的编号中删除,使得该通用寄存器组的编号只剩下寄存器组编号,表示该通用寄存器组是空闲的,从而能够进入等待队列,等待系统的下一次调用或分配。
[0021]步骤S15形成线程并运行:在本实施例中,不管出现上述情况中的哪一种,在执行完上述步骤S14或S13后,都会继续执行本步骤。也就是说,不管该软件线程是之前创建的还是新创建的,在得到其相应的通用寄存器组后,都会将指令执行流水线和物理线程配置到所述软件线程以形成一个完整的线程运行环境;当软件线程上载到流水线上时,其对应的GPR也上载软件线程运行的流水线上,这样,就形成并运行线程。
[0022]步骤S16软件线程是否被要求休眠:在本步骤中,由于上一步骤中已经形成线程并运行,因此本步骤是在线程运行中判断是该线程是否被要求休眠,如果是,则执行步骤S17,对线程进入休眠做出必要的处理;如果不是,则返回步骤S15,继续运行线程(在本步骤中,如果返回步骤S15,由于线程运行的环境是现成的,所以不会再对该环境做出任何变动,而是继续运行线程)。实际上,在本实施例中,从某个角度而言,本步骤也可以视为步骤S15运行线程时的一种延伸步骤。当线程运行时,不断取出指令并执行,通常情况下该线程是不会停止的。但是,在一些情况下,例如,需要等待外部数据,此时该线程休眠会使处理器的使用效率更高,于是,系统发出休眠的触发信号,当接收到该触发信号后,该软件线程停止正常的取指操作,执行本步骤,进行是否进入休眠的判断。
[0023]步骤S17进入休眠:在本步骤中,已经判断软件线程需要进入休眠,于是,采取相应的动作,使得该软件线程进入休眠状态。值得一提的是,虽然其他的动作都与现有技术中的相同,但是,对于通用寄存器组的处理是不同的。在现有技术中,由于通用寄存器组是固定在指令处理流水器上的,而指令处理流水线是配置在物理线程上的,因此,当软件线程进入休眠时,需要释放物理线程去处理别的软件线程,因此需要对物理线程中的指令处理流水线上的通用寄存器组的内容进行保存-恢复(context switch)操作,并在该软件线程由休眠状态中唤醒时,进行同样但数据移动方向相反的动作,以保证软件线程在被唤醒后能够正常运行。在本步骤中,由于通用寄存器组是单独配置的。所以,在软件线程休眠时,并不会将通用寄存器组随物理线程一起释放。而是将该通用寄存器组单独地保持,等待软件线程的唤醒。这样,就不需要先后两次进行通用寄存器组中的数据搬移,大大提高了处理器的运行效率。在本实施例中,对于通用寄存器组保持的方法是记录并传输该通用寄存器的编号到线程控制器,使其寄存在线程控制器的寄存器组池中。也就是说,在本实施例中,在软件线程休眠的阶段,该通用寄存器组被作为线程控制器中寄存器组对待。该通用寄存器组既没有随物理线程一起被配置到其他软件线程,也没有被放入到通用寄存器组的等待队列中,而是保持了其中的内容,在一个特定的位置等待其原先配置的软件线程被唤醒。
[0024]软件线程需要休眠时,休眠前线程控制器把属于休眠线程的通用寄存器组寄存在线程控制器里的寄存器组池里。当软件线程被唤醒时,线程控制器取回唤醒软件线程的通用寄存器组,重新装载到分配给唤醒软件线程的物理线程的指令处理流水线上。
[0025]在本实施例中,当一个软件线程执行完成后,其物理线程及配置的指令处理流水线将被释放,标识为空闲,等待后续的软件线程的使用。与此同时,上述指令处理流水线的通用寄存器组也被释放,但是并不是与该指令处理流水线绑定的,该通用寄存器组被单独释放,按照上面所述的方法,将其编号中软件线程编号删除,仅保留其寄存器编号,表示该通用寄存器组当前处于空闲状态,并将其放入通用寄存器组的等待队列中,等待分配到指令处理流水线。其再次分配的指令处理流水线可能是之前的那个指令处理流水线,也可能是其他的指令处理流水线。
[0026]在本实施例中,还涉及一种实现上述方法的装置。同样地,该装置的处理器指令处理流水线的通用寄存器组是在软件线程分配到物理线程时分配到其指令处理流水线上的。如图2所示,该装置包括软件线程判断单元11、空闲寄存器分配单元12、寄存器重新上载单元13、线程形成单元14以及休眠判断单元15。其中,软件线程判断单元11用于在收到为软件线程配置通用寄存器组的请求,判断该软件线程是初始创建的还是休眠后被唤醒的,如是初始创建的,调用空闲寄存器分配单元;如是休眠后唤醒的,调用寄存器重新上载单元;空闲寄存器分配单元12用于查找并得到一个空闲的通用寄存器组,分配给该软件线程,上载到所述软件线程分配到的物理线程的指令处理流水线上;寄存器重新上载单元13用于查找所述软件线程休眠前的配置的通用寄存器组,重新上载到所述软件线程重新分配到的物理线程的指令处理流水线上;线程形成单元14用于形成线程,并运行该线程;休眠判断单元15用于判断运行线程中的软件线程是否被要求进入休眠,如是,所述软件线程进入休目民,并在线程控制器作用下保持所述软件线程的通用寄存器组;否则,继续运行该线程。
[0027]在本实施例中,软件线程判断单元11通过比较所述软件线程的ID号和当前分配给软件线程的ID号来判断所述软件线程是否初始创建的软件线程;所述软件线程的ID号是系统在创建软件线程时赋予其的编号。空闲的通用寄存器组是在等待队列中,且其编号仅有寄存器编号的通用寄存器组;而空闲寄存器分配单元12进一步包括寄存器编号修改模块121 ;寄存器编号修改模块121用于在所述空闲寄存器组在分配到一个软件线程后,修改其编号使其包括寄存器编号和所在软件线程的编号。
[0028]此外,在本实施例中,寄存器重新上载单元13通过比较所述寄存器组编号中是否包括所述软件线程编号来判断所述通用寄存器组是否是该软件线程休眠前的通用寄存器组。
[0029]以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。
【权利要求】
1.一种多线程处理器中通用寄存器组的分配方法,其特征在于,所述处理器指令处理流水线的通用寄存器组是在软件线程分配到物理线程时分配到所述物理线程的指令处理流水线上的;所述分配方法包括如下步骤: A)收到为软件线程配置通用寄存器组的请求,判断该软件线程是初始创建的还是休眠后被唤醒的,如是初始创建的,执行步骤B);如是休眠后唤醒的,执行步骤C); B)查找并得到一个空闲的通用寄存器组,分配给该软件线程,上载到所述软件线程分配到的物理线程的指令处理流水线上,并执行步骤D); C)查找所述软件线程休眠前的配置的通用寄存器组,重新上载到所述软件线程重新分配到的物理线程的指令处理流水线上,并执行步骤D); D)形成线程,并运行该线程; E)判断运行线程中的软件线程是否被要求进入休眠,如是,所述软件线程进入休眠,并将所述通用寄存器组寄存在所述线程控制器的寄存器组池中;否则,继续运行该线程。
2.根据权 利要求1所述的多线程处理器中通用寄存器组的分配方法,其特征在于,所述步骤A)中,通过比较所述软件线程的ID号和当前分配给软件线程的ID号来判断所述软件线程是否初始创建的软件线程;所述软件线程的ID号是系统在创建软件线程时赋予其的编号。
3.根据权利要求2所述的多线程处理器中通用寄存器组的分配方法,其特征在于,所述步骤B)中空闲的通用寄存器组是在等待队列中,且其编号仅有寄存器编号的通用寄存器组;所述步骤B)进一步包括:所述空闲寄存器组在分配到一个软件线程后,其编号包括寄存器编号和所在软件线程的编号。
4.根据权利要求3所述的多线程处理器中通用寄存器组的分配方法,其特征在于,所述步骤C)中,通过比较所述寄存器组编号中是否包括所述软件线程编号来判断所述通用寄存器组是否是该软件线程休眠前的通用寄存器组。
5.根据权利要求4所述的多线程处理器中通用寄存器组的分配方法,其特征在于,所述步骤D)中,还包括将指令执行流水线和物理线程配置到所述软件线程以形成一个完整的线程运行环境。
6.根据权利要求5所述的多线程处理器中通用寄存器组的分配方法,其特征在于,所述步骤E)中进一步包括:记录并传输所述通用寄存器的编号到所述线程控制器,使所述线程控制器保持所述通用寄存器组。
7.一种实行多线程处理器中通用寄存器组分配方法的装置,其特征在于,所述处理器指令处理流水线的通用寄存器组是在软件线程分配到物理线程时分配到其指令处理流水线上的;所述装置包括: 软件线程判断单元:用于在收到为软件线程配置通用寄存器组的请求,判断该软件线程是初始创建的还是休眠后被唤醒的,如是初始创建的,调用空闲寄存器分配单元;如是休眠后唤醒的,调用寄存器重新上载单元; 空闲寄存器分配单元:用于查找并得到一个空闲的通用寄存器组,分配给该软件线程,上载到所述软件线程分配到的物理线程的指令处理流水线上; 寄存器重新上载单元:用于查找所述软件线程休眠前的配置的通用寄存器组,重新上载到所述软件线程重新分配到的物理线程的指令处理流水线上;线程形成单元:用于形成线程,并运行该线程; 休眠判断单元:用于判断运行线程中的软件线程是否被要求进入休眠,如是,所述软件线程进入休眠,并将所述通用寄存器组寄存在所述线程控制器的寄存器组池中;否则,继续运行该线程。
8.根据权利要求7所述的装置,其特征在于,所述软件线程判断单元中,通过比较所述软件线程的ID号和当前分配给软件线程的ID号来判断所述软件线程是否初始创建的软件线程;所述软件线程的ID号是系统在创建软件线程时赋予其的编号。
9.根据权利要求8所述的装置,其特征在于,所述空闲寄存器分配单元中空闲的通用寄存器组是在等待队列中,且其编号仅有寄存器编号的通用寄存器组;所述空闲寄存器分配单元进一步包括: 寄存器编号修改模块:用于在所述空闲寄存器组在分配到一个软件线程后,修改其编号使其包括寄存器编号和所在软件线程的编号。
10.根据权利要求9所述的装置,其特征在于,所述寄存器重新上载单元中,通过比较所述寄存器组编号中是否包括所述软件线程编号来判断所述通用寄存器组是否是该软件线程休眠前的通用寄存器组。
【文档编号】G06F9/48GK103955356SQ201410166209
【公开日】2014年7月30日 申请日期:2014年4月24日 优先权日:2014年4月24日
【发明者】王世好, 丘正前, 李晶晶, 梅思行 申请人:深圳中微电科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1