多线程处理器的制作方法

文档序号:6566511阅读:167来源:国知局
专利名称:多线程处理器的制作方法
技术领域
本发明涉及一种多线程处理器和一种用于编译并行循环的方法, 该多线程处理器具有用于并行处理多个任务的处理单元。
背景技术
典型地,处理器执行来自线程的指令,并包括针对指令将参照的 数据的寄存器文件、以及用于并行执行的指令的地址程序计数器(即 指令地址寄存器)。为了减少处理器因为等待数据或来自存储器的其他 指令而不执行指令的时间,在处理器上并行执行多个线程。如果一个 线程的执行停止,则切换到下一个线程。这种切换也称为上下文切换。 为了能够有效且快速地切换,必须在处理器中保持多个线程的上下文。 因此,多线程处理器必须包括针对每个线程的寄存器文件和程序计数 器。为了增强多线程处理器的性能,需要附加资源来存储多个上下文。 然而,从晶元上所需面积和较高的设计复杂度方面来看,附加资源增 加了附加成本。US 6,351,808 Bl涉及一种具有复制的寄存器文件结构的多线程 处理器。US 6,092,175公开了一种支持多个上下文或线程的多线程处理 器。为了减少寄存器的数量,寄存器文件中的一些在线程之间共享, 并在需要时将其分配到线程。发明内容因此,本发明的目的是提供一种硬件成本降低的多线程处理器、 以及一种针对多线程处理器的编译并行循环的方法。此目的通过权利要求1所述的多线程处理器以及权利要求4所述 的用于编译并行循环的方法来实现。因此,多线程处理器包括处理单元,用于并行处理多个线程。提 供了具有多个寄存器的寄存器文件装置,其中将至少一个第一寄存器 用于存储循环不变量值,以及将N个第二寄存器或N个另外的寄存器集合中的每一个用于存储循环变量值。此外,提供了 N个程序计数器, 其中的每一个都与多个线程之一相关联,其中N是正在处理的线程的数量。因此,对于多线程处理器而言,因为只复制程序计数器以及寄存 器文件的一部分,所以可以降低硬件复杂度以及硬件成本。根据本发明的方面,N个第二寄存器中的每一个与多个线程之一相关联,并且在多个线程之间共享至少一个第一寄存器。因此,通过在多个线程之间共享第一寄存器,不需要为每个线程提供这种第一寄存器。这将提高寄存器文件中的寄存器的利用率。只将一个第一寄存器分配到所有线程,即在线程之间共享该第一寄存器,而不是为每个线程分配用于存储该线程的循环不变量值的第一寄存器。根据本发明的另一方面,在每个循环中,将寄存器文件装置中的 多个寄存器划分或分配为第一和第二寄存器。由于每个循环的需求可能变化,所以可以针对每个循环,执行对于循环不变量和循环变量值 的寄存器的划分或分配。本发明还涉及一种方法,用于编译指令集内的并行循环。检测具 有寄存器文件的多线程处理器的指令集内循环中的循环不变量和循环 变量值。将寄存器文件的多个寄存器划分或分配为至少一个用于存储 循环不变量值的第一寄存器、以及每一个都用于存储循环变量值的N 个第二寄存器或N个寄存器集合,其中N是正在处理的线程的数量。本发明基于将循环编译成多个线程的思想。因此,不用复制所有 的寄存器文件,而只复制程序计数器。根据现有技术,寄存器文件需 要N个循环不变量寄存器和N个循环变量寄存器,而本发明只需要针 对循环不变量值的寄存器(在线程之间共享)以及针对循环变量值的、 各自与N个线程相关联或专用于该线程的N个寄存器。将寄存器文件中的现有寄存器划划分或分配成针对循环变量寄存器的寄存器以及针
对循环不变量寄存器的寄存器,g卩,将寄存器划分成不相交的子集。 通过将并行循环转化为两个或多个循环,将多线程应用于并行循环。


参考下文中描述的实施例,本发明的这些和其他方面将变得显而 易见,并对其加以说明。图1示出了根据第一实施例的多线程处理器的基本结构。
具体实施方式
图1示出了根据第一实施例的多线程处理器的基本结构。该处理器包括能够并行处理N个线程的处理单元PU。根据图1的实施例, 对三个线程进行处理,即N-3。因此,程序计数器PC实现为包括针 对每个线程的程序计数器单元,即,第一、第二和第三程序计数器单 元PC1、 PC2、 PC3。此外,寄存器文件RF具有多个寄存器。这里,只示出了8个寄存器。从寄存器文件RF的多个寄存器中,针对每个 线程的循环变量值,对多个寄存器集合LV1-LV3进行划分或分配,艮口, 根据线程的数量来复制针对循环变量值的寄存器LV1-LV3,以使针对 循环变量的一个寄存器集合LV1-LV3与线程中的每一个相关联。换言 之,执行对寄存器文件中的寄存器的划分,以便给循环变量值分配N 个(每个线程一个)寄存器。寄存器文件RF还包括针对循环不变量 值的寄存器集合LI (将一个寄存器分配给循环不变量值,并在线程之 间共享该寄存器),这样寄存器文件RF包括针对循环不变量值的寄存 器LI以及针对循环变量值的3 (N)个寄存器集合LV。寄存器中的4 个未使用。应该注意,N的值仅作为示例,而并不限制实施例。例如,寄存器文件RF可以包括32个寄存器。对于一个特定循环, 为循环不变量值分配32个寄存器中的10个,为循环变量值分配3x5 个寄存器(3个集合,每个集合中有5个寄存器),而7个寄存器未使 用。在另一个循环中,为循环不变量值分配4个寄存器,为循环变量 值分配3x8个寄存器,而4个寄存器未使用。换言之,可以针对每个 待执行的循环,为循环不变量值和循环变量值来分配现有的寄存器。
在一些情况下,寄存器文件RF中的所有32个寄存器并未全部使用。 应注意的是,分配用以存储循环不变量值的寄存器在多个线程之间共 享,而分配用以存储循环变量值的那些寄存器至少在循环的持续时间 内是排他性地与多个线程之一相关联的或专用于该线程的。还应注意 的是,寄存器文件可以包括不同数量的寄存器。由于只复制针对循环不变量值的寄存器LV1-LV3的分配,所以可 以基于多个线程来处理的应用程序是有限的。例如,因为对寄存器文 件RF的要求没有那么严格,所以将多线程应用于处理并行循环。根 据本实施例,将并行循环转化为两个循环。并行循环可以通过以下代码实现For(i=0;i<n;i++) Si并将其转化为以下代码for k L/* create a second thread, initial pc=L */ for(i=0;i<n/2;i++)Wait /*wait on termination of second thread */L: for(i=n/2;i<n;i++)Exit/*stop thread*/将并行循环转化为两个循环,即, 一个循环是从0到<11/2,而另 一个循环是从n/2到<11。然后,将这两个循环作为两个线程并行进行 处理。循环中的数据值可以是循环变量(即在循环处理期间改变)或 循环不变量(即在循环期间不改变)。循环不变量值的示例是数组的基 址指针。寄存器U或寄存器集合LI用于分配所有不变量值,并寄存 器LV或寄存器集合LV用于分配所有循环变量值。因此,为了实现上
述代码,因为存在两个线程,所以需要一个寄存器LI和2个寄存器 LVo根据第二实施例,考虑SAXPY循环类型,,即S, A, X, P, Y, 其用于将标量可变量A与矢量X相乘,并将其与矢量Y相加。考虑 以下循环For(i=0;i<1000;i++)a[i]=b[i]+S*c[i];相应的汇编代码可以如下实现loadi#a -> r10load说b -〉 rl 1loa譜c -> r12loadi#s -> rl3loadi#0 -> rl4loadi rll,rl4 -> rl5loadi rl2,rl4 -> rl6mult rl6,rl3 -> rl6add rl6,rl5 -> rl6store rl0,rl4 <- rl6add#l rl4 ->rl4bless rl4,#1000,Ll在上述循环中,因为rl0或rl2包括数组a, b和c的基址,所以 寄存器LI^(r10, rll, rl2和rl3)包括循环不变量值。寄存器rl3用于 存储标量值s。因为所有这些值在循环执行期间是不变的,所以它们 构成了循环不变量值。寄存器rl4或rl6包括循环变量值,因为这些 值在循环执行期间改变。根据第二实施例,可以将上述循环转化为以下代码,其中第一线 程利用针对不变量值的寄存器LVl={rl4-rl6},而第二线程利用针对 变量值的寄存器LV2={r24-r26}:load说a -> rlOload说b ->rll/* load b[i]*//* loadc[i]*//* compute s*c[i]*//* add b[i]*//* store result in a[i]*/loadi#c -> r12 load说s -> r13 loa禱-> rl4for k L2 /* start second thread */LI: 1oadirll,r14->rl5 /*loadb[i]*/ loadi rl2,rl4-> rl6 /*loadc[i]*/ mult rl6,rl3 -> rl6 /* compute s*c[i]*/addrl6,r15->rl6 /* add b[i]*/store rl0,rl4 <- rl6 /* store result in a[i]*/add#l rl4 ->rl4bless rl4,#500,Ll /* loop until 500 */waitL2: loadi #500 ->r24 /* start at i=500 " loadi rll,r24 -> r25 /* load b[i]*/loadi rl2,r24 -> r26 /* load c[i]*/mult r26,rl3 -> r26 /* compute s*c[i]*/add r26,r25 -> r26 /* add b[i]*/store rl0,r24 <- r26 /* store result in a[i]*/add#l r24 -> r24bless r24,#500,Ll /* loop until 1000 */waitexit /* stop second thread*/由于通过多线程处理器来并行执行用于实现第一和第二循环(从 0到499的循环,以及从500到1000的循环)的两个线程,所以如果 一个线程停止,仍然可以处理另一个线程。由此,减少了执行时间, 并且提高了处理器的利用率。通过将并行循环转化为两个或多个循环,可以将多线程应用于并 行循环。确定循环变量和循环不变量值。将并行循环化分成或转化为
多个循环。从寄存器文件中的寄存器中,将对应于线程数量的多个寄 存器分配或划分为是针对循环不变量值的,这样每个线程与一个寄存 器相关联,以便存储其变量值。此外,从寄存器文件中的寄存器中, 分配至少一个寄存器用于存储循环不变量值,并在线程之间共享该寄 存器。应注意的是,上面所提到的实施例示出而并非限制本发明,在不 偏离所附权利要求范围的前提下,本领域的技术人员能够设计许多可 选的实施例。在权利要求中,括号之间的任何附图标记不应理解为限 制本发明。词"包括"不排除权利要求中所列出的元件或步骤之外的其他元件或步骤的存在。元素之前的冠词"a"或"an"不排除多个这 种元件的存在。在列举了多个装置的设备权利要求中,这些装置中的 一些可由同一个硬件项来体现。特定措施位于彼此不同的从属权利要 求中的这一事实并不表示不能有利地使用这些措施的组合。此外,权利要求中的任意附图标记不应视作对权利要求的范围有 所限制。
权利要求
1.一种多线程处理器,包括-处理单元(PU),用于并行处理多个线程;-寄存器文件装置(RF),包括多个寄存器(LI,LV),其中,将至少一个第一寄存器(LI)用于存储循环不变量值,并将N个第二寄存器(LV1-LVN)中的每一个用于存储循环变量值;以及-N个程序计数器(PC1-PCN),每一个都与多个线程之一相关联;其中,N是正在处理的线程的数量。
1. 一种多线程处理器,包括-处理单元(PU),用于并行处理多个线程;-寄存器文件装置(RF),包括多个寄存器(LI, LV),其中,将 至少一个第一寄存器(LI)用于存储循环不变量值,并将N个第二寄 存器(LV1-LVN)中的每一个用于存储循环变量值;以及-N个程序计数器(PCl-PCN),每一个都与多个线程之一相关联; 其中,N是正在处理的线程的数量。
2. 如权利要求1所述的多线程处理器,其中,N个第二寄存器 (LV1-LVN)中的每一个都与多个线程之一相关联,以及在多个线程之间共享所述至少一个第一寄存器(LI)。
3. 如权利要求1或2所述的多线程处理器,其中,在每次循环中, 将寄存器文件装置(RF)中的多个寄存器划分成第一和第二寄存器(LI; LV1-LV3)。
4. 一种用于编译指令集内的并行循环的方法,包括以下步骤-针对具有寄存器文件(RF)的多线程处理器(PU),检测指令 集内循环中的循环不变量和循环变量值;以及-将寄存器文件(RF)的多个寄存器(LI; LV1-LVN)划分成用 于存储循环不变量值的至少一个第一寄存器(LI)、以及每一个均用于 存储循环变量值的N个第二寄存器(LV1-LVN); N是正在处理的线 程的数量。
5. 如权利要求4所述的方法,其中,N个第二寄存器(LV1-LVN) 中的每一个都与多个线程之一相关联,以及在多个线程之间共享所述 至少一个第一寄存器(LI)。
6. 如权利要求4或5所述的方法,包括步骤针对至少一个循环, 将寄存器文件装置(RF)中的多个寄存器划分成第一和第二寄存器(LI; LV1-LV3)。全文摘要
一种多线程处理器,包括处理单元(PU),用于并行处理多个线程。提供了具有多个寄存器的寄存器文件装置(RF),其中将第一寄存器(LI)用于存储循环不变量值,以及将N个第二存储器(LV1-LVN)中的每一个用于存储循环变量值。此外,提供了N个程序计数器(PC1-PCN),其中每一个都与多个线程之一相关联,N是正在处理的线程的数量。
文档编号G06F9/38GK101151590SQ200680002878
公开日2008年3月26日 申请日期2006年1月17日 优先权日2005年1月25日
发明者J·胡格布鲁格 申请人:Nxp股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1