使用窄加法数据通道实现大位宽加操作数取数加操作的方法转让专利

申请号 : CN202210404054.9

文献号 : CN114816531B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 袁红岗王磊杨经纬葛建明姚飞仇小钢

申请人 : 海飞科(南京)信息技术有限公司

摘要 :

本发明公开了一种使用窄加法数据通道实现大位宽加操作数取数加操作的方法,基于SIMT架构,每个线程使用独立的存储地址和寄存器操作数,硬件对于相同目标地址实现并行取数加操作;具体包括:S1、将加操作数分解为m个能够在窄加法数据通道中传输的部分加数,m个部分加数将加操作数拆分为m个区域;S2、变量指向的存储地址与m个区域进行取数加操作;S3、m个区域的值聚合,获得大位宽加操作数取数加操作的值。本发明提出的解决方案,具有占用较小的片上面积,使用少量的硬件资源,功耗低,同时保证了数据的完整性的优点。

权利要求 :

1.一种使用窄加法数据通道实现大位宽加操作数取数加操作的方法,其特征在于基于SIMT架构,每个线程使用独立的存储地址和寄存器操作数,硬件对于相同目标地址实现并行取数加操作;

使用窄加法数据通道实现大位宽加操作数取数加操作的方法包括以下步骤:S1、将加操作数分解为m个能够在窄加法数据通道中传输的部分加数,m个部分加数将加操作数拆分为m个区域,m个区域等分;

S2、变量指向的存储地址与m个区域进行取数加操作:m个区域从右至左排序,变量指向的存储地址与第i个区域进行取数加操作时,包括以下步骤:S2‑1、将第i个区域右移(i‑1)n位;n=加操作数总位宽/m;

S2‑2、变量指向的存储地址与i个区域相加;

S3、m个区域的值聚合,获得大位宽加操作数取数加操作的值;m个区域的值聚合包括以下步骤:S3‑1、将第i个区域的值左移(i‑1)n位;

S3‑2、各区域的值相加。

说明书 :

使用窄加法数据通道实现大位宽加操作数取数加操作的方法

技术领域

[0001] 本发明涉及数据存储领域,具体是一种使用窄加法数据通道实现大位宽加操作数取数加操作的方法。

背景技术

[0002] SIMT并行处理
[0003] SMIT是指单指令多线程程序执行方式,在这种方式下,多个线程在不同的数据上执行相同的指令,并允许线程之间有适当的分歧控制。出于性能考虑,SIMT应当尽量减少线程之间的分歧。
[0004] 原子加法指令
[0005] 原子加法(atomic add)指令广泛用于计算机并发程序中,是并行计算的一条重要指令。当需要对一个存储地址中的数据执行加法操作时,首先需要从该存储地址中将数据读取出来,加上相应的数值,并将结果写回原来的存储地址。原子加法要求上述的取数、相加、写回操作必须是完整的不可分割的。在并行计算中,由于多个线程可能会同时访问一个相同的存储地址,因此需要原子操作保证数据的完整性。
[0006] 在SIMT计算模式下,原子加法的操作语义是串行的,即当多个线程在执行完成原子加法操作之后,其结果应当和这些线程按顺序依次执行加法操作的结果相一致。
[0007] 原子加法指令可以在使用共享变量的程序中实现无等待、无锁定、无阻塞的并行执行。例如,当多个线程需要向某个队列添加数据时,可以使用一个共享变量表示队列的起始地址,每个线程对这个共享变量使用原子加法指令来获取各自的队列起始地址。由于原子加法在执行时无需等待,因此线程在执行时具有高度的并行性,同时保证了数据的完整性。
[0008] 并行原子加法
[0009] 原子加法指令有两种实现方式,当采用串行实现方式时,各个线程按顺序依次取数、相加并写回。这种实现方式保证了原子加法的语义正确,但性能较差,不适合大并发数据的情形。原子加法也可以采用并行实现方式,但传统的并行实现需要大量的硬件资源,占用较大的片上面积,且功耗较高。

发明内容

[0010] 本发明针对背景技术中存在的问题,提出一种新型的并行原子加法实现方法。
[0011] 技术方案:
[0012] 一种使用窄加法数据通道实现大位宽加操作数取数加操作的方法,基于SIMT架构,每个线程使用独立的存储地址和寄存器操作数,硬件对于相同目标地址实现并行取数加操作;
[0013] 使用窄加法数据通道实现大位宽加操作数取数加操作的方法包括以下步骤:
[0014] S1、将加操作数分解为m个能够在窄加法数据通道中传输的部分加数,m个部分加数将加操作数拆分为m个区域;
[0015] S2、变量指向的存储地址与m个区域进行取数加操作;
[0016] S3、m个区域的值聚合,获得大位宽加操作数取数加操作的值。
[0017] 优选的,S1中,m个区域等分。
[0018] 优选的,S2中,m个区域从右至左排序,变量指向的存储地址与第i个区域进行取数加操作时,包括以下步骤:
[0019] S2‑1、将第i个区域右移(i‑1)n位;n=加操作数总位宽/m;
[0020] S2‑2、变量指向的存储地址与i个区域相加。
[0021] 优选的,S3中,m个区域的值聚合包括以下步骤:
[0022] S3‑1、将第i个区域的值左移(i‑1)n位;
[0023] S3‑2、各区域的值相加。
[0024] 本发明的有益效果
[0025] 本发明针对大位宽加操作数取数加问题,提出了一种使用窄加法数据通道实现的方案,与传统取数加指令的实现方式不同,本发明提出了一种使用窄加法数据通道实现的方案,只需要占用较小的片上面积,使用少量的硬件资源即可实现窄数据通道的取数加指令,功耗低;同时利用软件方式实现值聚合,以达到和传统取数加指令完全一致的效果,保证了数据的完整性。

具体实施方式

[0026] 下面结合实施例对本发明作进一步说明,但本发明的保护范围不限于此:
[0027] AIGPU支持SIMT的并行取数加指令,其中每个线程可以使用独立的存储地址和寄存器操作数。硬件对于相同目标地址实现并行取数加操作。
[0028] 使用窄加法数据通道实现大位宽加操作数取数加操作的方法包括以下步骤:
[0029] S1、将加操作数分解(优选的:等分)为m个能够在窄加法数据通道中传输的部分加数,m个部分加数将加操作数拆分为m个区域;这里将加操作数分解成较小的部分加数,硬件也因此是需要支持很小的数据通道,可以减少硬件资源。一种实现是将加操作数限制为4比特,只需使用寄存器的操作数的最低4位(lsb[3:0])。高位都忽略了。每个线程只能加0‑7之间的一个数。加法的数据通道只是4位宽,存储数据是32比特。
[0030] S2、变量指向的存储地址与m个区域进行取数加操作;m个区域从右至左排序,变量指向的存储地址与第i个区域进行取数加操作时,包括以下步骤:
[0031] S2‑1、将第i个区域右移(i‑1)n位;n=加操作数总位宽/m;
[0032] S2‑2、变量指向的存储地址与i个区域相加。
[0033] S3、m个区域的值聚合,获得大位宽加操作数取数加操作的值。m个区域的值聚合包括以下步骤:
[0034] S3‑1、将第i个区域的值左移(i‑1)n位;
[0035] S3‑2、各区域的值相加。
[0036] 下面的例子中,要实现的32位取数加把R0的值加到Rx指向的存储地址中的值,结果返回到R1寄存器中。
[0037] 如果所有的线程中R0值都小于16,则只需使用指令fetch_ad_add R1,Rx,R0[0038] 否则,假定R0是完整的32比特,执行如下指令:
[0039] οFetch_and_add R2,Rx,R0;//atomic fetch and add R0[3:0]使用R0的低4位[0040] οShift_right R0,R0,4;//将R0右移4位,使用原有R0[7:4]
[0041] οAdd Rx,N;//使用新地址
[0042] οFetch_and_add R3,Rx,R0;//使用原有R0[7:4]
[0043] οShift_right R0,R0,4;//将R0右移4位,使用原有R0[11:8]
[0044] οAdd Rx,N;//使用新地址
[0045] οFetch_and_add R4,Rx,R0;//使用原有R0[11:8]
[0046] οShift_right R0,R0,4;//将R0右移4位,使用原有R0[15:12]
[0047] οAdd Rx,N;//使用新地址
[0048] οFetch_and_add R5,Rx,R0;//使用原有R0[15:12]
[0049] οShift_right R0,R0,4;//将R0右移4位,使用原有R0[19:16]
[0050] οAdd Rx,N;//使用新地址
[0051] οFetch_and_add R6,Rx,R0;//使用原有R0[19:16]
[0052] οShift_right R0,R0,4;//将R0右移4位,使用原有R0[23:20]
[0053] οAdd Rx,N;//使用新地址
[0054] οFetch_and_add R7,Rx,R0;//使用原有R0[23:20]
[0055] οShift_right R0,R0,4;//将R0右移4位,使用原有R0[使用原有R0[27:24]][0056] οAdd Rx,N;//使用新地址
[0057] οFetch_and_add R8,Rx,R0;//使用原有R0[27:24]
[0058] οShift_right R0,R0,4;//将R0右移4位,使用原有R0[31:28]
[0059] οAdd Rx,N;//使用新地址
[0060] οFetch_and_add R9,Rx,R0;//使用原有R0[31:28]
[0061] οShift_left R3,R3,4//左移4位
[0062] οShift_left R4,R4,8//左移再4位
[0063] οShift_left R5,R5,12//左移再4位
[0064] οShift_left R6,R6,16//左移再4位
[0065] οShift_left R6,R7,20//左移再4位
[0066] οShift_left R6,R8,24//左移再4位
[0067] οShift_left R6,R9,28//左移再4位
[0068] οAdd R2,R3,…R9=>R1//聚合所有值
[0069] 上面的一系列指令将32位的和返回到R1寄存器中。目标地址分成8个区域,每个区域按顺序左移4位。对于多数应用而言,没有必要将这8个区的值聚合成一个。如果需要32位值,可以重复执行上述中的{右移、新地址生成、取数加}序列8次,然后执行左移7次,最终将8个区域的值聚合成一个。最终结果返回到原来的R0寄存器中。
[0070] 在许多应用中,存储区域很小且包装紧凑。例如,一个应用中每个线程需要生成不定大小的结果数据并添加到一个单一的队列后面。所有的线程使用一个存储目标地址,取数加指令会为每个线程返回添加数据的起始地址。因为线程的数据量不同,产生的起始地址也不同。
[0071] 取数加指令的结果必须是确定性的,即对于那些使用相同存储地址的线程,逻辑上与这些线程按顺序执行取数加操作的结果一致,在SIMIT中这一执行顺序与线程编号的顺序一致。例如,线程0、8、9、12的线程目标地址都是&x,其结果应该与按照执行顺序0、8、9、12按序执行取数加得到的一致。这里只关心执行结果,而不限制实际的并行实现顺序。这个例子的执行结果如下:
[0072] ·Y0=x
[0073] ·Y8=x+r0
[0074] ·Y9=x+r0+r8
[0075] ·Y12=x+r0+r8+r9
[0076] ·New x=x+r0+r8+r9+r12
[0077] 本文中所描述的具体实施例仅仅是对本发明精神做举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。