一种统一染色图形处理器共享寄存器文件的分配与释放方法与流程

文档序号:32342244发布日期:2022-11-26 10:09阅读:48来源:国知局
一种统一染色图形处理器共享寄存器文件的分配与释放方法与流程

1.本发明属于统一染色图形处理器技术领域,涉及一种共享寄存器文件的分配与释放策略,尤其是一种统一染色图形处理器共享寄存器文件的分配与释放方法。


背景技术:

2.统一染色阵列是统一染色图形处理器的运算核心,其在图形处理器版图中所占的面积也极为可观。流多核处理器是统一染色架构gpu执行纹理处理的核心部件,染色内核是统一染色阵列的基本染色单元,寄存器文件的组织是其设计的一项重要内容。
3.为了支持gpu大规模线程级并行的特点,gpu中设置了大量由染色内核构成的流处理器(sp),流处理器可以让gpu以单指令多数据(simd)或单指令多线程(simt)的方式实现线程级并行。
4.寄存器是gpu上的存储器中效率最高的存储部件,其以寄存器文件为单位,为了减少上下文切换的代价,gpu部署了较大规模的寄存器文件资源供流处理器使用,不同计算能力的gpu,每个流多核处理器上寄存器文件的个数不一样,gpu中,因染色内核数量众多,且内核现场数量众多,寄存器文件的数量、现场规模可观,因此寄存器文件的管理与使用对于gpu性能有重要意义。
5.在gpu中,每个流多核处理器中的染色内核独享该sm中的rf,线程束(warp)是gpu调度和运行的基本单元,每个warp都需要被分配属于自己的专用架构寄存器文件,并由warp id索引,并且每个架构寄存器都有在寄存器文件中分配的相应物理寄存器。一旦分配了寄存器,直到warp所属的协作线程阵列完成其执行后,它才会被释放。
6.也就是说,即使有些sp上的线程已经执行结束,但该warp中仍有未执行完的线程,那么该warp映射到的所有sp上的寄存器文件都不能被释放。这样虽然简化了寄存器管理硬件,但是以寄存器利用率不足为代价,会造成染色内核规模受限的缺点。在gpu面积不变的情况下,急需寻找一种共享寄存器文件的方法。


技术实现要素:

7.为了克服传统图形处理器统一染色阵列寄存器利用率不足的缺点,本发明提供了一种全新的统一染色图形处理器共享寄存器文件的分配与释放方法。
8.本发明的技术解决方案是:本发明为一种统一染色图形处理器共享寄存器文件的分配与释放方法,其特殊之处在于:该方法包括以下步骤:
9.1)将物理存储单元划分成8个bank及128个block;
10.2)建立block申请与释放表;
11.3)将物理存储单元的划分和block申请与释放表整合,实现逻辑地址到物理寄存器地址的转换;
12.4)根据物理寄存器地址,以单个或多个block为调度单位进行分配与释放。
13.进一步的,步骤1)的具体步骤如下:
14.1.1)以4kb大小的物理存储单元为调度单位,共享寄存器文件的单个数据宽度为32bit,这个调度单位共有1k个位宽为32bit的寄存器文件;
15.1.2)将物理存储单元划分成了8个bank,每个bank包含了128个位宽为32bit的物理寄存器文件;
16.1.3)以每8个寄存器文件为1个block,且恰好覆盖bank 0—bank 7,将整个存储单元划分为128个block。
17.进一步的,步骤2)的具体步骤如下:
18.2.1)确定调度粒度为32,即每个warp每次可以分配1—32个block;
19.2.2)为每个warp提供一个block申请与释放表,每一个warp的申请与释放表均包含32个块,用于存储分配给该warp的block的编号及其有效信号,由于每个寄存器文件需要支持16个warp共享,因此共有16个这样的分配与释放表;
20.2.3)将16个warp的block申请与释放表组织为一个二维阵列;
21.进一步的,步骤3)的具体步骤如下:
22.3.1)将物理存储单元的划分和block申请与释放表整合,即可得到寄存器文件的虚实地址映射关系;逻辑地址共包含12位,其中高4位为warp id,表示该逻辑地址对应的warp编号,范围是0—15;低3位为bank id,表示逻辑地址对应的bank编号,范围是0—7;中间5位为block id,表示逻辑地址对应的存放在block申请与释放表中的列号(非实际block号),范围是0—31;
23.3.2)将warp id和block id共同映射在block申请与释放表中,二者结合可以得到唯一一个block申请与释放表的块,这个块中存放的数据为physical block number,即实际block号,其位宽为7bit,范围是0—127,将该值作为偏移量送至物理寄存器的划分表;
24.3.3)physical block number与bank id共同映射在物理寄存器的划分表中,二者结合可以得到唯一一个物理寄存器文件编号,这个编号就是物理寄存器地址;
25.进一步的,步骤4)中对寄存器文件中每一个物理寄存器块的使用情况进行统计并标记其状态,生成物理寄存器块的使用状态表,并找到在当前指令中使用结束的寄存器文件,并将其释放回收、重新分配。
26.进一步的,步骤4)中以4个block为调度单位,4个block为调度单位的使用状态表,由5个部分组成,分别是free bit、free list、分配指针ap_cnt、释放指针rp_cnt以及对应到32个位置的索引,free list是一个位宽为5bit,深度为32的寄存器堆,用于存储block组号,即block id,free list每一个寄存器存储的范围都是0—31,在初始状态下,free list每个寄存器中存入的数据与其下标相同,即0—31号寄存器依次初始化为0—31;与free list对应的free bit是一个位宽为32的寄存器,用于表示free list每个寄存器的分配与回收状态,其每一位对应1个free list的寄存器,当这一位为0时表示当前free list空闲,可以被分配调度,当这一位为1时表示当前free list已经被分配,无法继续调度,free bit初始状态下每一位都是0;分配指针和释放指针都是一个位宽为5bit的寄存器,用于存储free list当前分配block的编号与当前释放block组的编号,其存储范围都是0—31,释放指针永远指向当前写入的位置即释放回收的block组在当前free list中的位置,分配指针永远指向下一个要读取的位置,即下一个要被分配出去block的位置,初始状态下,两个指针都指向第0个block;此外,由于两个指针位宽均为5bit,所以当分配指针或释放指针指向
最后一个free list即31时,其内部存放的数据为5’b11111,此时若需要继续分配、释放block,直接在5’b11111基础上加相应的分配、释放数量即可,由于数据溢出的原因,指针下一位会直接从5’b00000开始,不需要额外做判断或做减法;如果不使用分配与释放指针,就需要使用轮询的办法分别查找free bit为1和为0的位置用于block的分配与释放,并且将使用结束的block释放回原来的位置。
27.进一步的,步骤4)的具体步骤如下:
28.4.1)以4个block为调度单位,引入分配与释放指令;
29.4.2)首先需要计算出free list中空闲的块数,将其命名为free space,起始状态为32;空闲的块数的计算与指针的位置有关,将分配指针命名为ap_cnt,释放指针命名为rp_cnt,在未释放满或未分配空的情况下,当分配指针大于释放指针时,free space等于rp_num+32-ap_num,当分配指针小于释放指针时,free space等于rp_num-ap_num;此外还需加入free list的判满与判空功能;
30.4.3)在申请分配过程中,需要使用专用的分配指令,指令中需指明需要分配的物理寄存器的数量以及它们所对应的warp,以块为单位;
31.4.4)在warp释放物理寄存器过程中,需要使用专用的分配指令,指令中需指明需要分配的物理寄存器的数量以及它们所对应的warp,以块为单位。
32.进一步的,步骤4.3)的具体步骤如下:
33.4.3.1)当接收到分配指令时,首先会译码出warp id和block count,warp id表示需要分配寄存器的warp编号,block count表示该warp需要被分配的block的个数;
34.4.3.2)将空闲的块数free space与当前warp要申请block的个数block count作比较,如果free space大于block count,则此次分配可行,否则不能分配;
35.4.3.3)当分配可行时,从分配指针开始,将block count个连续的free list中的数据送往与warp id对应的block申请与释放表中暂存,同时将分配指针加上申请block的个数,即ap_cnt=ap_cnt+block count。
36.进一步的,步骤4.4)的具体步骤如下:
37.4.4.1)分配指令首先译码出warp id和block count,warp id表示需要释放寄存器的warp编号,block count表示该warp需要被释放的block的个数;
38.4.4.2)将与warp id对应的block申请与释放表中从0开始的连续block count个数据,送往free list中连续的free list中从释放指针开始的连续block count个位置,同时将释放指针加上释放block的个数。
39.本发明分析了传统的gpu寄存器调度策略,并立足于国产专用gpu,探索了适合国内技术水平的gpu统一染色阵列共享寄存器文件设计,并提出了统一染色图形处理器共享寄存器文件的分配与释放方法,实现了寄存器逻辑地址到物理寄存器地址的转换,在gpu面积不变的情况下,解决原本由于染色内核独享寄存器文件而导致的染色内核规模受限的问题,具有提高统一染色阵列寄存器利用率的优点。
附图说明
40.图1本发明的物理寄存器的划分示意图;
41.图2本发明的与16个warp相对应的block申请与释放表二维阵列;
42.图3本发明的寄存器文件的虚实地址映射关系;
43.图4本发明以4个block为调度单位的使用状态表;
44.图5本发明的两种方法下block申请与释放表与free list的映射关系;
45.图6本发明的分配/释放指令的编码格式;
46.图7本发明的block申请与释放示例。
具体实施方式
47.本发明以4kb大小的物理存储单元为调度单位,共享寄存器文件的单个数据宽度为32bit,因此这个调度单位共有1k个位宽为32bit的寄存器文件。共设置了8个存储库(bank)用于共享这个物理存储单元,所以每个bank包含了128个位宽为32bit的物理寄存器文件。以warp为单位对寄存器文件进行分配与释放,单个warp可以访问所有的8个bank以进行读、写操作,且每个寄存器文件至少支持16个warp共享。对于已生成的warp,需要对其分配一组寄存器文件用于操作数收集。当一个warp中的线程全部执行完毕时,为其分配的寄存器文件也将使用完毕,会将这些寄存器文件全部释放,以供其他warp继续调度使用。
48.以每8个寄存器文件为1个block,且恰好覆盖bank 0—bank 7,将整个存储单元划分为128个block。将block定义为本设计中寄存器文件动态分配与回收管理的最小调度单位,即warp的调度以block为单位,这样一来,每次不论调度多少个block,均可保证每个bank都被覆盖到。
49.为了支持单指令多线程(simt),我们尝试将调度粒度设置为8、16、24、32、40等进行测试,结果表明,如果调度粒度设置太小,调度策略将会很复杂,而如果调度粒度太大,会导致warp分配时的并行度下降,无法同时为多个warp分配足够的寄存器文件,最终我们将调度粒度确定为32,即每个warp每次可以分配1-32个block。
50.根据已经确定的调度粒度,我们为每个warp都提供了一个block分配与释放表,每一个warp的分配与释放表均包含32个块,用于存储分配给该warp的block的编号及其有效信号,以此类推,由于每个寄存器文件需要支持16个warp共享,因此共有16个这样的分配与释放表,将16个warp的block申请与释放表组织为一个二维阵列。
51.将物理寄存器的划分和block申请与释放表整合,即可得到寄存器文件的虚实地址映射关系。逻辑地址共包含12位,其中高4位为warp id,表示该逻辑地址对应的warp编号,范围是0—15;低3位为bank id,表示逻辑地址对应的bank编号,范围是0—7;中间5位为block id,表示逻辑地址对应的存放在block申请与释放表中的列号(非实际block号),范围是0

31。
52.将warp id和block id共同映射在block申请与释放表中,二者结合可以得到唯一一个block申请与释放表的块,这个块中存放的数据为physical block number,即实际block号,其位宽为7bit,范围是0

127,将该值作为偏移量送至物理寄存器的划分表。physical block number与bank id共同映射在物理寄存器的划分表中,二者结合可以得到唯一一个物理寄存器文件编号,这个编号就是物理地址,由此,我们实现了从逻辑(虚拟)地址到物理寄存器地址的转换。
53.由于每个线程束每次可以分配或释放1-32个物理寄存器块,因此存在以单个或多个物理寄存器块为调度单位进行调度。显然这两种做法各有利弊,对于以单个物理寄存器
块为调度单位进行调度来说,其优点在于不会产生内存碎片,但缺点在于其寄存器文件申请与释放表的面积非常大,很占资源。而对于以多个物理寄存器块为调度单位进行调度,其优点在于寄存器文件申请与释放表的面积相对较小,但缺点在于它会产生内存碎片,且调度单位越大,产生内存碎片的概率就越高。综合考虑优缺点后,我们选择以4个block为调度单位。
54.之后我们引入了分配与释放指令,寄存器文件的申请与分配过程中,首先需要计算出free list中空闲的块数,将其命名为free space,起始状态为32。空闲的块数的计算与指针的位置有关,将分配指针命名为ap_cnt,释放指针命名为rp_cnt,在未释放满或未分配空的情况下,当分配指针大于释放指针时,free space等于rp_num+32-ap_num,当分配指针小于释放指针时,free space等于rp_num-ap_num。此外还需加入free list的判满与判空功能。
55.在申请分配过程中,需要使用专用的分配指令,指令中需指明需要分配的物理寄存器的数量以及它们所对应的warp,以块为单位。当接收到分配指令时,首先会译码出warp id和block count,warp id表示需要分配寄存器的warp编号,block count表示该warp需要被分配的block的个数。将空闲的块数free space与当前warp要申请block的个数block count作比较,如果free space大于block count,则此次分配可行,否则不能分配。当分配可行时,从分配指针开始,将block count个连续的free list中的数据送往与warp id对应的block申请与释放表中暂存,同时将分配指针加上申请block的个数,即ap_cnt=ap_cnt+block count。
56.warp释放物理寄存器的过程与申请类似,分配指令首先译码出warp id和block count,warp id表示需要释放寄存器的warp编号,block count表示该warp需要被释放的block的个数。将与warp id对应的block申请与释放表中从0开始的连续block count个数据,送往free list中连续的free list中从释放指针开始的连续block count个位置,同时将释放指针加上释放block的个数。
57.在对物理寄存器文件进行分配调度的过程中,有可能出现目标寄存器文件正在被占用的情况,会产生一定的冲突,因此在设置了线程束的寄存器文件的申请与释放表之后,还需要对寄存器文件中每一个物理寄存器块的使用情况进行统计并标记其状态,以便知道有哪些物理寄存器块已经被分配、哪些物理寄存器块当前空闲可以被线程束申请使用。并且需要找到在当前指令中使用结束的寄存器文件,并将其释放回收、重新分配。因此需要引入物理寄存器块的使用状态表。
58.下面结合附图和具体实施例对本发明的技术方案做进一步详细描述。
59.本发明具体实施例中,物理存储单元大小为4kb,共享寄存器文件的单个数据宽度为32bit,因此这个调度单位共有1k个位宽为32bit的寄存器文件。共有8个执行单元共享这个调度单位、每个寄存器文件至少支持16个warp共享,且需要以warp为单位对寄存器文件进行申请与释放,即每个warp每次可以同时执行8个线程,因此每生成一个warp,会同时产生16个读操作数地址、8个写操作数地址,以及对应的写操作数。
60.将物理存储单元划分成了8个存储库(bank),由于本设计中物理存储单元大小为4kb,且共享寄存器文件单个数据宽度32bit,所以每个bank包含了128个位宽为32bit的物理寄存器文件,单个warp可以访问所有的8个bank以进行读、写操作。
61.参见图1,为本设计中8个bank的物理寄存器的划分示意图,其中每个小方块均代表一个物理寄存器文件。图中竖列为每个bank被分配的物理寄存器信息,从左到右依次为bank 0

bank 7。将图中横行命名为block,从上到下依次为block 0

block 127。如图可知,每个block包括8个物理寄存器文件,且恰好覆盖bank 0

bank 7,因此,我们将block定义为本设计中寄存器文件动态分配与回收管理的最小调度单位,这样一来,每次不论调度多少个block,均可保证每个bank都被覆盖到。
62.为了实现跨warp的物理寄存器文件共享,需要将warp的架构寄存器文件与它们所占用的物理寄存器空间分开,将原本由染色内核独享的寄存器文件进行动态划分,并借助虚实寄存器地址映射来实现共享。在上一节中我们将物理存储单元划分成了分成8个bank及128个block,并将block定义为本设计中寄存器文件动态分配与回收管理的最小调度单位。为了支持单指令多线程(simt),我们尝试将调度粒度设置为8、16、24、32、40等进行测试,结果表明,如果调度粒度设置太小,调度策略将会很复杂,而如果调度粒度太大,会导致warp分配时的并行度下降,无法同时为多个warp分配足够的寄存器文件,最终我们将调度粒度确定为32,即每个warp每次可以分配1-32个block。
63.根据已经确定的调度粒度,我们为每个warp都提供了一个block分配与释放表,每一个warp的分配与释放表均包含32个块,用于存储分配给该warp的block的编号及其有效信号,以此类推,由于每个寄存器文件需要支持16个warp共享,因此共有16个这样的分配与释放表,将16个warp的block申请与释放表组织为一个二维阵列。
64.参见图2,其中竖列为每个warp中存储的block的编号以及对应的有效信号enable,从左到右依次表示每一个warp存储的第0至第31个block的编号。横行表示warp的编号,从上到下依次为warp 0-warp 15。对于寄存器文件动态分配与回收管理而言,每次最少分配1个block,最多分配32个,但是16个warp总共不能分配超过128个block。
65.将图1的物理寄存器的划分表和图2的block申请与释放表整合起来,即可得到寄存器文件的虚实地址映射关系。
66.参见图3,逻辑地址如图3右上角所示,共包含12位,其中高4位为warp id,表示该逻辑地址对应的warp编号,范围是0

15,如图中横向虚线框所示;低3位为bank id,表示逻辑地址对应的bank编号,范围是0

7,如图中纵向虚线框所示;中间5位为block id,表示逻辑地址对应的存放在block申请与释放表中的列号(非实际block号),范围是0

31,如图中纵向虚线框所示。图中warp id和block id共同映射在block申请与释放表中,二者结合可以得到唯一一个block申请与释放表的块,如图中方块所示,这个块中存放的数据为图中的physical block number,即实际block号,其位宽为7bit,范围是0

127,将个值作为偏移量送至物理寄存器的划分表,如图中横向虚线所示。physical block number与bank id共同映射在物理寄存器的划分表中,二者结合可以得到唯一一个物理寄存器文件编号,如图中方块所示,这个编号就是物理地址,由此,我们实现了从逻辑(虚拟)地址到物理寄存器地址的转换。以逻辑地址12’b0010_00010_001举例,其高4位为4’b0010,表示编号为2的warp,中间5位为5’b00010,表示block申请与释放表中编号为2的列,二者结合得到图中的block申请与释放表的块block_w2_2,假设该块中存放的数据为7’b0000010,则physical block number为7’b0000010,即物理寄存器的划分表的偏移量为2,逻辑地址的低3位为3’b001,表示bank编号为1,与偏移量2相结合,得到物理地址10’d130,即逻辑地址12’b0010_00010_
001对应的物理地址为10’d130。
67.在对物理寄存器文件进行分配调度的过程中,有可能出现目标寄存器文件正在被占用的情况,会产生一定的冲突,因此在设置了warp的block申请与释放表之后,还需要对寄存器文件中每一个block的使用情况进行统计并标记其状态,以便知道有哪些block已经被分配、哪些block当前空闲可以被warp申请使用。并且需要找到在当前指令中使用结束的寄存器文件,并将其释放回收、重新分配。因此需要引入block的使用状态表。
68.由于每个warp每次可以分配或释放1-32个block,因此存在以单个或多个block为调度单位进行调度。比如需要分配11个block,若以单个block为调度单位进行调度,则直接分配11个block,并将其对应的block地址写进相应的block申请与释放表。若以多个block为调度单位进行调度,假设调度单位为4,则需要分配3组共12个block,并将其对应的block地址写进相应的block申请与释放表。显然这两种做法各有利弊,对于以单个block为调度单位进行调度来说,其优点在于不会产生内存碎片,但缺点在于其block申请与释放表的面积非常大,很占资源。而对于以多个block为调度单位进行调度,其优点在于block申请与释放表的面积相对较小,但缺点在于它会产生内存碎片,且调度单位越大,产生内存碎片的概率就越高。经过分析测试,我们最终选择了以4个block为调度单位的方案。
69.参见图4,即为以4个block为调度单位的使用状态表,它由5个部分组成,分别是free bit、free list、分配指针ap_cnt(allocate pointer count)、释放指针rp_cnt(release pointer count)以及对应到32个位置的索引。其中,free list是一个位宽为5bit,深度为32的寄存器堆,用于存储block组号,即block id,free list每一个寄存器存储的范围都是0—31,在初始状态下,free list每个寄存器中存入的数据与其下标相同,即0—31号寄存器依次初始化为0—31。与free list对应的free bit是一个位宽为32的寄存器,用于表示free list每个寄存器的分配与回收状态,其每一位对应1个free list的寄存器,当这一位为0时表示当前free list空闲,可以被分配调度,当这一位为1时表示当前free list已经被分配,无法继续调度,free bit初始状态下每一位都是0。
70.分配指针、释放指针都是一个位宽为5bit的寄存器,用于存储free list当前分配block的编号与当前释放block组的编号,其存储范围都是0—31,释放指针永远指向当前写入的位置即释放回收的block组在当前free list中的位置,分配指针永远指向下一个要读取的位置,即下一个要被分配出去block的位置,初始状态下,两个指针都指向第0个block。此外,由于两个指针位宽均为5bit,所以当分配指针或释放指针指向最后一个free list即31时,其内部存放的数据为5’b11111,此时若需要继续分配、释放block,直接在5’b11111基础上加相应的分配、释放数量即可,由于数据溢出的原因,指针下一位会直接从5’b00000开始,不需要额外做判断或做减法。如果不使用分配与释放指针,就需要使用轮询的办法分别查找free bit为1和为0的位置用于block的分配与释放,并且将使用结束的block释放回原来的位置。如果使用这种办法,为前几个warp的分配block的过程相对简单,但由于不同warp的执行时间不同,因此warp释放block的顺序并不一定是分配时的顺序,有可能后分配的warp先执行完并且释放block,因此,在该方案下,几轮分配与回收之后,free list会非常凌乱,每一个block都需要轮询查找。
71.参见图5,如图5左侧所示为不使用分配释放指针的情况下,几轮分配与释放之后block申请与释放表和free list的映射关系,图5右侧为使用分配释放指针的情况下几轮
分配之后block申请与释放表和free list的映射关系。
72.之后我们引入了分配与释放指令,在寄存器文件的申请与分配过程中,首先需要计算出free list中空闲的块数,将其命名为free space,空闲的块数的计算与读写指针的位置有关,将读指针命名为rp_cnt,写指针命名为wp_cnt,在未写满或未读空的情况下,当读指针大于写指针时,free space等于rp_cnt-wp_cnt,当读指针小于写指针时,free space等于rp_num+32-ap_num。
73.当接收到分配指令时,首先会译码出warp id和block count,warp id表示需要分配寄存器的线程束编号,block count表示该线程束需要被分配的物理寄存器块的个数。将空闲的块数free space与当前线程束要申请物理寄存器块的个数block count作比较,如果free space大于block count,则此次分配可行,否则不能分配。当分配可行时,从读指针开始,将block count个连续的free list中的数据送往与warp id对应的寄存器文件申请与释放表中暂存,同时将读指针加上申请物理寄存器块的个数,即rp_cnt=rp_cnt+block count。
74.在申请分配过程中,需要使用专用的分配指令,指令中需指明需要分配的物理寄存器的数量以及它们所对应的线程束,以块为单位,指令格式:reg allocate:opcode_allocate,allocate_wrap_id,allocate_block_count。其中,reg allocate表示物理寄存器分配指令;opcode_allocate位宽为1bit,表示分配指令的有效性,当opcode_allocate为1时,表示当前分配指令有效,可以开始译码;allocate_wrap_id即warp id,表示需要分配物理寄存器的线程束编号;allocate_block_count即block count,表示当前线程束要申请物理寄存器块的个数,分配指令的编码格式,如图6所示。
75.线程束释放物理寄存器的过程与申请类似,当接收到分配指令时,首先会译码出warp id和block count,warp id表示需要释放寄存器的线程束编号,block count表示该线程束需要被释放的物理寄存器块的个数。进行释放操作时,将与warp id对应的寄存器文件申请与释放表中从0开始的连续block count个数据,送往free list中连续的free list中从写指针开始的连续block count个位置,同时将读写指针加上释放物理寄存器块的个数,即wp_cnt=wp_cnt+block count。
76.释放的过程同样使用专用的回收释放指令,指令中需指明需要释放的物理寄存器数量及其对应的线程束,以块为单位。指令格式:reg release:opcode_release,release_wrap_id,release_block_count。其中,reg release表示物理寄存器释放指令;release_wrap_id即warp id,表明即将要释放的物理寄存器来自哪个线程束;release_block_count即block count,表示需要从前线程束释放的物理寄存器块数,释放指令的编码格式同样如图6所示。
77.为提升寄存器文件利用率,我们在寄存器文件释放时不局限于原先分配时的线程束顺序,而是可以乱序释放。
78.参见图7,因为线程束并不一定按照申请寄存器时的顺序完成相关操作,比如warp 0比warp 1更早的分配了寄存器,但warp 1的线程执行更快,需要比warp 0更早地释放寄存器,此时不需要等待warp 0执行完毕,warp 1可以直接释放。为了让free list中空闲的块数保持连续,不论哪个线程束执行释放操作,都将从写指针的位置开始将物理寄存器块地址信息连续地存入free list中,而不是按照原先分配时的位置释放,将已经执行结束的线
程束申请的寄存器从相对应的寄存器文件申请与释放表中释放,并及时更新free list中的值和指针位置,使其他线程束可以继续申请这些寄存器。
79.图7中第一行为初始状态,没有任何物理寄存器块被分配出去,free bit每一位均为0,wp与rp指向0位置;第二行时,warp 0生成并申请了block 0-block 2,将这三个block分配给warp 0,对应位置的free bit置1,rp指向3位置,wp依然指向0位置;第三行,warp 1生成并申请了block 3-block6,将这三个block分配给warp 1,对应位置的free bit置1,rp指向7位置,同时warp 0执行结束释放block 0-block 2,这三个block被释放到free list的0、1、2三个位置,对应位置free bit置0,wp指向3位置;第四行,此前已有多个warp申请了block,但除warp_0外还没有其他warp释放block,此时warp n生成并申请了block 63-block 65,将这三个block分配给warp_n,对应位置的free bit置1,rp指向66位置,同时warp m执行结束释放block32-block 33,这两个block被释放到free list的3、4两个位置,对应位置的free bit置0,wp指向5位置。在这一过程中,由于warp m中的线程执行结束要早于它之前生成的线程束,free list前面都是空的,所以将warp m释放的两个block按空闲顺序填在free list的第3、4位置,而不是按申请分配时的32、33两个位置释放与回收。
80.对分配指针和释放指针而言,初始状态下,分配指针永远比释放指针前先出发,从某种程度上将,分配指针和释放指针是在互相追逐,但不论分配指针还是释放指针,都最多只能追上对方,不能超越,否则会出现错误。在实际操作中,诸如图4中block状态表的free bit并不会被用到,因为在分配指针之后(不包含分配指针当前位置)、释放指针之前(包含释放指针当前位置)的所有free list块,都是已经被分配的,相当于free bit等于1;在分配指针之前(包含分配指针当前位置)、释放指针之后(不包含释放指针当前位置)的所有free list块,都是空闲的,可以被分配,相当于free bit等于0。
81.但有一种特殊情况,就是分配指针与释放指针指向同一个位置时,究竟是分配指针追上释放指针了(即全部读空,所有free list块都已经被分配),还是释放指针追上分配指针了(即全部写满,所有free list块都处于空闲状态),无法依靠前几节给出的条件直接判断。但这两种情况又会产生不同的影响,当free list全部读空时,系统只能接收释放指令,不能接收分配指令,因为没有空闲free list块可以被分配了,这时需要向外界传送一个full信号(当free space小于block count时,同样会释放这个信号),当free list全部写满时,系统只能接收分配指令,因为所有free list块都是空闲的。因此这两种情况需要明确区分开。
82.根据分析发现,当读释放指针相等时,free list不是空就是满,区别仅仅在于是释放指针追上分配指针还是分配指针追上释放指针,那么如何来区别是谁追上谁呢?我们参考异步fifo判满判空的方法,在表示读释放指针的数据最高位前上再加1位来区分free list是空还是满。以free list深度为32为例,因此读释放指针位宽都是5bit,最高位扩展后的读释放指针位宽都是6bit,我们将扩展后的读释放指针命名为ap_extend和rp_extend,最高位扩展位命名为aap_flag和rp_flag,扩展前的原读释放指针依然命名为ap_cnt和rp_cnt。
83.一开始ap_extend和rp_extend都是6’b000000,free list为空,当分配指针增加并越过最后一个free list的时候,就将ap_extend的最高位ap_flag取反,变成6’b100000,这时是分配指针追上了释放指针,free list全部读空,所有free list块都已经被分配,同
理,当释放指针越过最后一个free list的时候,把rp_extend的最高位rp_flag也取反。可以看到,当ap_extend和rp_extend最高位不同,而剩下的位相同的时候free list全部读空,所有free list块都已经被分配;当最高位相等,并且剩下的位相同时,free list全部写满,所有free list块都是空闲的。
84.当分配指针追上释放指针时,表示free list块都已经被分配,此时需要向外界传送一个full信号表示不能再送新的分配指令进来了,但是当释放指针追上分配指针时,并不需要向外界送empty信号,因为能写回到free list中的数据,都是先前从free list中分配出去的,最多只有32个,当写满时,表示先前所有分配过寄存器的warp都已经将寄存器释放,不会有新的释放指令送进来了,因此也就不需要empty信号了。
85.最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细地说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1