一种矩阵乘法器、数据处理方法、集成电路器件及处理器
技术领域
本申请属于计算机技术领域,具体涉及一种矩阵乘法器、数据处理方法、集成电路器件及处理器。
背景技术
当前计算机领域,伴随着大数据、机器学习等新兴技术的成熟,越来越多的任务中包含了各种各样的矩阵乘法运算。目前,要计算两个矩阵A和B的乘积,可以通过以下方式中的任意一种方式进行计算:
方式一,将矩阵A和矩阵B都预先加载到向量通用寄存器(Vector GeneralPurpose Register,VGPR)中,做乘法时,取矩阵A的行和矩阵B的列进行运算。
方式二,将矩阵A和矩阵B都预先加载到本地数据共享单元(Local Data Share,LDS),在做乘法时,再将A和矩阵B加载到VGPR中,然后做乘法。
方式三,预先加载矩阵A至LDS,预先加载矩阵B到VGPR,在进行A*B时,将矩阵A逐行加载到VGPR,然后做乘法。
发明内容
本申请的目的在于提供一种矩阵乘法器、数据处理方法、集成电路器件及处理器。
本申请的实施例是这样实现的:
第一方面,本申请实施例提供了一种矩阵乘法器,包括:本地数据共享单元、K个向量通用寄存器以及与所述K个向量通用寄存器一一对应连接的K个向量流处理器;本地数据共享单元,用于按照行顺序存储第一矩阵,所述第一矩阵为M*N矩阵;K个向量通用寄存器,用于存储第二矩阵中的各个列,每个向量通用寄存器存储所述第二矩阵的一列,所述第二矩阵为N*K矩阵,K为大于等于2的整数;所述本地数据共享单元通过总线与所述K个向量流处理器中的每个向量流处理器均连接,使得所述第一矩阵中的元素逐个并行地被加载到K个向量流处理器,与所述K个向量通用寄存器中各自存储的列对应的元素进行相乘,所述K个向量流处理器并行地将所述第一矩阵同一行中的元素逐个与所述第二矩阵的对应元素产生的相乘结果依次累加,得到第三矩阵同一行的所有元素,从而完成所述第一矩阵和所述第二矩阵的乘法运算。
本申请实施例中,采用本地数据共享单元通过总线与每个向量流处理器均连接方式,通过这条路径,使得本地数据共享单元中存储的第一矩阵中的元素可以直接并行地被加载到K个向量流处理器中,省去了从本地数据共享单元→向量通用寄存器→向量流处理器加载数据的加载操作,减少了额外的读写操作,也优化了对VGPR空间占有的问题,同时,通过这条路径使得矩阵乘法器可以针对第三矩阵同一行的所有元素进行并行计算,极大的减少从第一矩阵中获取元素的次数,进而可以降低系统开销。
结合第一方面实施例的一种可能的实施方式,所述矩阵乘法器还包括:与每个所述向量流处理器均连接的逻辑变更寄存器,用于存储读取所述第一矩阵中每个元素的地址,并且在所述K个向量流处理器并行地根据所述逻辑变更寄存器当前的地址从所述本地数据共享单元读取所述第一矩阵中对应的元素后自动更新到下一个元素对应的地址。本申请实施例中,该逻辑变更寄存器可以在向量流处理器根据当前的地址从本地数据共享单元读取第一矩阵中对应的元素后自动更新到下一个元素对应的地址,而无需向量流处理器主动去更新地址,若是采用向量流处理器来主动更新地址的方式,这样在每次获取第一矩阵中的一个元素后,都需要先更新一次地址,无疑是非常浪费时间的,进而提高了效率。
结合第一方面实施例的一种可能的实施方式,所述矩阵乘法器还包括与每个所述向量通用寄存器均连接的控制器,所述控制器,用于并行地向所述K个向量流处理器发送乘法指令,以指示所述K个向量流处理器将所述第一矩阵与所述第二矩阵进行乘法运算。通过控制器并行地(同时)向K个向量流处理器发送乘法指令,指示K个向量流处理器将第一矩阵与第二矩阵进行乘法运算,保证了这K个向量流处理器可以同步进行对应的操作。
结合第一方面实施例的一种可能的实施方式,所述控制器还分别与所述本地数据共享单元、每个所述向量通用寄存器连接,所述控制器,还用于按照行顺序将所述第一矩阵中的元素存储到所述本地数据共享单元,以及还用于按照列顺序将所述第二矩阵中的各个列对应地存储到所述K个向量通用寄存器中。本申请实施例中,控制器按照行顺序将第一矩阵中的元素存储到本地数据共享单元,将第二矩阵中的各个列对应地存储到K个向量通用寄存器中,使得第一矩阵和第二矩阵在进行乘法运算时,可以针对第三矩阵同一行的所有元素进行计算,极大的减少从第一矩阵中获取元素的次数,进而可以降低系统开销。
第二方面,本申请实施例还提供了一种数据处理方法,应用于矩阵乘法器,所述矩阵乘法器包括:本地数据共享单元、K个向量通用寄存器以及与所述K个向量通用寄存器一一对应连接的K个向量流处理器,所述本地数据共享单元通过总线与所述K个向量流处理器中的每个向量流处理器连接;所述方法包括:所述K个向量流处理器并行地从所述本地数据共享单元中按照行顺序逐个获取预先存储的第一矩阵中的元素;所述K个向量流处理器并行地从各自对应的向量通用寄存器中获取预先存储的来自第二矩阵中对应的元素;所述K个向量流处理器各自将获取到的来自所述第一矩阵中的元素与来自所述第二矩阵中对应的元素进行相乘;所述K个向量流处理器并行地将来自所述第一矩阵同一行中的元素逐个与所述第二矩阵的对应元素产生的相乘结果依次累加,得到第三矩阵同一行的所有元素。
结合第二方面实施例的一种可能的实施方式,所述矩阵乘法器还包括与每个所述向量流处理器均连接的逻辑变更寄存器,用于存储读取所述第一矩阵中每个元素的地址,并且在每个所述向量流处理器并行地根据所述逻辑变更寄存器当前的地址从所述本地数据共享单元读取所述第一矩阵中对应的元素后自动更新到下一个元素对应的地址;K个向量流处理器并行地从所述本地数据共享单元中按照行顺序逐个获取预先存储的第一矩阵中的元素,包括:K个向量流处理器并行地根据所述逻辑变更寄存器当前的地址从所述本地数据共享单元中按照行顺序逐个获取预先存储的第一矩阵中的元素。
结合第二方面实施例的一种可能的实施方式,所述矩阵乘法器还包括:与所述本地数据共享单元连接的控制器,在所述K个向量流处理器并行地从所述本地数据共享单元中按照行顺序逐个获取预先存储的第一矩阵中的元素之前,所述方法还包括:所述控制器按照行顺序将所述第一矩阵中的元素存储到所述本地数据共享单元。
结合第二方面实施例的一种可能的实施方式,所述矩阵乘法器还包括:通过总线分别与所述K个向量通用寄存器中的每个向量通用寄存器连接的控制器,在所述K个向量流处理器并行地从各自对应的向量通用寄存器中获取预先存储的来自第二矩阵中对应的元素之前,所述方法还包括:所述控制器按照列顺序将所述第二矩阵中的各个列对应地存储到所述K个向量通用寄存器中,每个向量通用寄存器存储所述第二矩阵的一列。
结合第二方面实施例的一种可能的实施方式,所述矩阵乘法器还包括:与每个所述向量流处理器均连接的控制器,所述K个向量流处理器并行地从所述本地数据共享单元中按照行顺序逐个获取预先存储的第一矩阵中的元素之前,所述方法还包括:所述控制器并行地向所述K个向量流处理器发送乘法指令,以指示所述K个向量流处理器将所述第一矩阵与所述第二矩阵进行乘法运算。
结合第二方面实施例的一种可能的实施方式,所述K个向量流处理器并行地将所述第一矩阵同一行中的元素逐个与所述第二矩阵的对应元素产生的相乘结果依次累加之后,所述方法还包括:所述K个向量流处理器并行地将累加结果按照行顺序存储到所述本地数据共享单元中不与所述第一矩阵相重叠的区域。本申请实施例中,K个向量流处理器并行地将累计额结果按照行顺序存储到本地数据共享单元中不与第一矩阵相重叠的区域,以减少对向量流处理器内存的占用。
第三方面,本申请实施例还提供了一种集成电路器件,包括基板和设置在所述基板上的如上述第一方面实施例和/或结合第一方面实施例的任一种可能的实施方式提供的矩阵乘法器。
第四方面,本申请实施例还提供了一种处理器,包括上述第三方面实施例提供的集成电路器件。
本申请的其他特征和优点将在随后的说明书阐述,并且,部分地从说明书中变得显而易见,或者通过实施本申请实施例而了解。本申请的目的和其他优点可通过在所写的说明书以及附图中所特别指出的结构来实现和获得。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。通过附图所示,本申请的上述及其它目的、特征和优势将更加清晰。在全部附图中相同的附图标记指示相同的部分。并未刻意按实际尺寸等比例缩放绘制附图,重点在于示出本申请的主旨。
图1示出了本申请实施例提供的一种矩阵乘法器的结构示意图。
图2示出了本申请实施例提供的又一种矩阵乘法器的结构示意图。
图3示出了本申请实施例提供的一种数据处理方法的流程示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行描述。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。同时,在本申请的描述中诸如“第一”、“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更K限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
再者,本申请中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。
现有方式一,将矩阵A和矩阵B都预先加载到向量通用寄存器(Vector GeneralPurpose Register,VGPR)中,做乘法时,取矩阵A的行和矩阵B的列进行运算。该方案需要将整个矩阵A和矩阵B都预先加载到VGPR中,浪费了大量的VGPR空间,而VGPR空间是有限的,所以该方案必须限制矩阵的大小,同时由于浪费了大量的VGPR空间,也导致系统性能变差。
现有方式二,将矩阵A和矩阵B都预先加载到本地数据共享单元(Local DataShare,LDS),在做乘法时,再将A和矩阵B加载到VGPR中,然后做乘法。该方案虽然可以省一些VGPR空间,但需要使用大量LDS空间,而且增加了两次从LDS到VGPR的额外读写,额外的读写操作导致功耗增大,也降低了性能。
现有方式三,预先加载矩阵A至LDS,预先加载矩阵B到VGPR,在进行A*B时,将矩阵A逐行加载到VGPR,然后做乘法。该方案虽然可以节省一些VGPR空间,也不需要将整个矩阵A加载到VGPR,但是仍存在大量的关于矩阵A的额外读写操作,例如,将矩阵A写入LDS,从LDS读取矩阵A,将矩阵A写入VGPR,从VGPR读取矩阵A。额外的读写操作耗费了大量功耗,因此该方案的问题是能耗太高。
经过研究分析提出一种将矩阵A预加载到LDS,将矩阵B预加载到VGPR,其节省了VGPR资源并且全面使用了所有硬件资源,从而改善现有计算方式存在的所需读写操作多以及占用VGPR空间的问题。本方案通过使用LDS_DIRECT路径,将矩阵A直接广播到向量流处理器(Vector Stream Processor,VSP),省去了从LDS→VGPR→VSP的加载操作,从而没有任何额外的读写操作,具有良好的功耗表现。下面将对本申请实施例涉及的矩阵乘法器及其数据处理方法进行说明。
请参阅图1,为本申请实施例提供的一种矩阵乘法器的结构示意图,下面将结合图1对其结构进行说明。该矩阵乘法器包括:本地数据共享单元(Local Data Share,LDS)、多个向量通用寄存器(Vector General Purpose Register,VGPR)与多个向量通用寄存器一一对应连接的多个向量流处理器(Vector Stream Processor,VSP)。其中,本地数据共享单元LDS可以是随机存取存储器(Random Access Memory,RAM)、寄存器阵列等。
其中,本地数据共享单元,用于按照行顺序存储第一矩阵(如矩阵A),例如,第一矩阵为M*N矩阵时,M、N为大于等于1的整数,在将矩阵A加载到LDS进行存储时,是按照行顺序进行存储的,如A11、A12、……、A1N-1、A1N;A21、A22、……、A2N-1、A2N;……;AM1、AM2、……、AMN-1、AMN。
多个向量通用寄存器VGPR,用于存储第二矩阵(如矩阵B)中的各个列,每个向量通用寄存器存储第二矩阵的一列,也即一个向量通用寄存器存储一列,且不同向量通用寄存器存储的列不同。其中,需要说明的是,第二矩阵的列数小于等于向量通用寄存器的数量,例如,第二矩阵为N*K矩阵时,则向量通用寄存器的数量大于等于K,K为大于等于2的整数。在将矩阵B加载到K个VGPR时,一个VGPR存储一列,且不同VGPR存储的列不同,如,第一个VGPR存储的列为:B11、B21、……、BN-11、BN1;第二个VGPR存储的列为:B12、B22、……、BN-12、BN2;第K-1个VGPR存储的列为:B1K-1、B2K-1、……、BN-1K-1、BNK-1;第K个VGPR存储的列为:B1K、B2K、……、BN-1K、BNK。
多个向量流处理器与多个向量通用寄存器一一对应连接,即一个向量通用寄存器对应一个向量流处理器,以便于向量流处理器从对应的向量通用寄存器中获取数据。
本地数据共享单元通过总线(图中的LDS-Direct)与多个向量流处理器中的每个向量流处理器均连接,使得第一矩阵中的元素可以逐个并行地被加载到多个向量流处理器中。由于本实施例中示例的第二矩阵为N*K矩阵,故只需K个向量通用寄存器即可存储第二矩阵中的各个列,因此,在接下来的描述中,仅以K个向量通用寄存器和K个向量流处理器进行描述(可以理解的是,向量通用寄存器以及向量流处理器的数量可以是大于等于K的)。此时相当于本地数据共享单元通过总线与K个向量流处理器中的每个向量流处理器均连接,使得第一矩阵中的元素逐个并行地被加载到K个向量流处理器,与K个向量通用寄存器中各自存储的列对应的元素进行相乘,K个向量流处理器并行地将第一矩阵同一行中的元素逐个与第二矩阵的对应元素产生的相乘结果依次累加,即每个向量流处理器各自将第一矩阵同一行中的元素逐个与第二矩阵的对应元素产生的相乘结果依次累加,得到第三矩阵同一行的所有元素,从而完成第一矩阵和第二矩阵的乘法运算。
为了便于理解,下面以矩阵乘法A64x64*B64x64=C64x64,即M、N、K均取值为64为例进行说明,当然这里的64x64仅是示例,并不限于此。其中,需要说明的是,两个矩阵相乘需要第一个矩阵的列数(Column)和第二个矩阵的行数(Row)相同,只有在第一个矩阵的列数(Column)和第二个矩阵的行数(Row)相同时才有意义。例如,第一矩阵为M*N矩阵,第二矩阵为N*K矩阵。在进行乘法时,64个VSP并行地从LDS读取矩阵A的各个元素(A11,A12,…,A164,A21,A22,…,A6464)以及并行地从各自对应的VGPR中获取矩阵B中对应的元素,64个VSP各自将获取到的来自第一矩阵中的元素与来自第二矩阵中对应的元素进行相乘;64个VSP各自(64个VSP并行地执行)将矩阵A同一行中的元素逐个与第二矩阵的对应元素产生的相乘结果依次累加,得到矩阵C同一行的所有元素。其计算过程可以用表1表示。
表1
从上述的表1可以看出,在CLK1时刻,A11被并行地加载到64个VSP中,与64个VGPR中各自存储的列对应的元素进行相乘,在CLK2时刻,A12被并行地加载到64个VSP中,与64个VGPR中各自存储的列对应的元素进行相乘,由于A11和A12属于第一矩阵的同一行,因此,各个VSP各自将来自所述第一矩阵同一行中的各个元素对应的相乘结果相加,即有CLK2时刻的A12*B21+C11,后续时刻的计算原理均一样。其中,需要说明的是,对于同一个Stage来说,以VSP1为例,当前时刻中的C11表示的是上一时刻的计算结果即C11,如CLK2时刻中的C11代表的是CIK1的C11,如CLK3时刻中的C11代表的是CIK2的C11,……,如CLK64时刻中的C11代表的是CIK63的C11。可以看出,一个Stage用于计算第三矩阵同一行的所有元素,每个Stage包含64个CLK(这里是因为示例的是A64x64*B64x64=C64x64,所以一个Stage才包含64个CLK),每个CLK读一个矩阵A的元素。例如Stage1用于计算矩阵C的第1行,Stage1用于计算矩阵C的第2行,以此类推,具体地,以计算矩阵C的第一行为例,则有:
VSP1:C11=A11*B11+A12*B21+A13*B31+A14*B41+…+A164*B641;
VSP2:C12=A11*B12+A12*B22+A13*B32+A14*B42+…+A164*B642;
VSP3:C13=A11*B13+A12*B23+A13*B33+A14*B43+…+A164*B643;
……
VSP64:C164=A11*B164+A12*B264+A13*B364+A14*B464+…+A164*B6464;
从中不难看出A中的每一个元素均会被并行地加载到各个VSP中,如上述的A11、A12、A13等,与64个VGPR中各自存储的列对应的元素进行相乘,如上述的A11*B11、A11*B12、A11*B13、…、A11*B164等,然后各个VSP各自将第一矩阵同一行中的元素逐个与第二矩阵的对应元素产生的相乘结果依次累加,得到第三矩阵同一行的所有元素,如上述的VSP1将来自第一矩阵同一行中的元素逐个与第二矩阵的对应元素产生的相乘结果依次累加,得到C11;VSP2将来自第一矩阵同一行中的元素逐个与第二矩阵的对应元素产生的相乘结果依次累加,得到C12;VSP64将来自第一矩阵同一行中的元素逐个与第二矩阵的对应元素产生的相乘结果依次累加,得到C164。
从上述的例子可以看出,本申请实施例在计算第三矩阵C中的元素时,是同时计算第三矩阵同一行的所有元素,和现有技术中是一个元素一个元素单独进行计算的方式不同,例如,现有技术中是计算完C11后、再计算C12…此外,现有技术在计算矩阵C时,需要将矩阵A和矩阵B都加载到VGPR里面,做矩阵乘法时,直接做向量点积。以计算C11为例,即,C11=A11*B11+A12*B21+A13*B31+A14*B41+…+A164*B641。注意,这种从VGPR中取两个操作数进行运算,是针对乘积矩阵C的每一个元素来计算。比如,按照以上计算方式依次计算C11,C12,C13,计算次序可以是逐行,逐列等不限。
可以看出,本申请中的计算方式可以极大的减少从矩阵A中获取元素的次数,如计算矩阵C的第一行中的所有元素时,位于矩阵A中的第一行的每个元素只需获取一次,一共64个元素,只需64次,而现有技术中,每次在计算位于矩阵C的第一行中的一个元素时,就需要获取一次位于矩阵A中的第一行的所有元素,在完成矩阵C中第一行的所有元素(共64个)的计算时,需要重复64次获取位于矩阵A中的第一行的所有元素,这样,就需要获取64*64次。在计算矩阵C中的其他行时,所需的获取次数与计算第一行所有元素所需次数相同,这样在完成第一矩阵和第二矩阵的乘法运算,即A64x64*B64x64=C64x64时,本申请实施例中,矩阵从A中获取元素的次数一共为64*64,而采用现有计算方式所需的次数为64*64*64,极大的减少了从获取元素的次数,也就降低了系统功耗,从而增强了性能。此外,本申请实施例中,由于LDS通过总线与每个VSP均连接,使得各个VSP可以直接从LDS中获取矩阵A中的所有元素,通过这条路径,省去了从LDS→VGPR→VSP加载数据的操作。而现有技术中,需要将LDS中的元素先加载到VGPR中,然后从VGPR中获取元素,进一步地增加了额外的读写操作。其中,需要说明的是,上述的读操作的次数是针对一个VSP来说的。针对现有方案所存在的缺陷,均是发明人在经过实践并仔细研究后得出的结果,因此,上述问题的发现过程以及本文中本申请实施例针对上述问题所提出的解决方案,都应该是发明人在本申请过程中对本申请做出的贡献。
本申请所示的矩阵乘法器可以最小化VGPR和LDS的使用,其中VGPR的使用仅包括矩阵B,即64x64个元素,LDS的使用仅包括矩阵A,即64x64个元素。本申请还可以最小化对VSP的访问:仅仅需要把矩阵A从LDS读到VSP,包括64x64次访问,把矩阵B从VGPR读到VSP包括64x64,同样,VGPR的读操作也被压缩到了最少,仅仅包括矩阵B的访问,共64x64x64次读取。
如何高效进行矩阵乘法对许多计算机应用来说至关重要,因此本申请中,对于进行矩阵乘法的矩阵A和矩阵B,预先将其中的一个矩阵即第一矩阵如矩阵A按照行顺序存储到本地数据共享单元中,将另一个矩阵即第二矩阵如矩阵B存储到K个向量通用寄存器中,其中,每个向量通用寄存器存储第二矩阵的一列,也即一个向量通用寄存器存储一列,且不同向量通用寄存器存储的列不同。以便于在进行矩阵乘法时,第一矩阵中的元素逐个并行地被加载到K个向量流处理器,与K个向量通用寄存器中各自存储的列对应的元素进行相乘,K个向量流处理器并行地将所述第一矩阵同一行中的元素逐个与第二矩阵的对应元素产生的相乘结果依次累加,得到第三矩阵同一行的所有元素,从而完成第一矩阵和第二矩阵的乘法运算。
其中,按照行顺序将第一矩阵中的元素存储到本地数据共享单元中时,每个元素会对应一个唯一地址,以便于在乘法运算时各个VSP根据地址从本地数据共享单元中获取该地址对应的元素。例如,A11→LDS(Address1);A12→LDS(Address2);A13→LDS(Address3);…其中,需要说明的是,每个元素对应的地址是不同的,同一行的各个元素对应的地址可以是连续递增如上述实例的那样,当然也可以是连续递减,如A11→LDS(Address4096);A12→LDS(Address4095)…A6464→LDS(Address1)。此外,也可以是不连续的,如1、3、5、7、……,或者如1、2、4、7、11、16这样间断的,因此不能将上述的实例理解成是对本申请的限制。
由于每个元素对应一个地址,在根据当前地址获取元素后,需要将当前地址更新到下一个元素对应的地址,如根据当前地址Address1获取到A11后,需要将当前地址更新到Address2,若是采用VSP来主动更新地址的方式,这样在每次获取矩阵A中的一个元素后,都需要先更新一次地址,无疑是非常浪费时间的,因此,作为一种实施方式,为了提高获取矩阵A中元素的效率,该矩阵乘法器还包括逻辑变更寄存器,其中图1中的M0表示逻辑变更寄存器。该逻辑变更寄存器与每个向量流处理器均连接,用于存储读取第一矩阵中每个元素的地址,并且在K个向量流处理器并行地根据逻辑变更寄存器当前的地址从本地数据共享单元读取第一矩阵中对应的元素后自动更新到下一个元素对应的地址。逻辑变更寄存器在K个向量流处理器并行地根据逻辑变更寄存器当前的地址如Address1获取到A11后,自动将该地址更新到下一个元素对应的地址如更新到Address2。
为了便于将第一矩阵中的元素存储到本地数据共享单元,以及将第二矩阵中的各个列存储到向量通用寄存器中,该矩阵乘法器还包括:控制器,如图2所示。该控制器分别与本地数据共享单元、每个向量通用寄存器连接。该控制器,用于按照行顺序将第一矩阵中的元素存储到本地数据共享单元,以及控制器按照列顺序将第二矩阵中的各个列对应地存储到K个向量通用寄存器中,其存储的格式如表2所示。
表2
| VGPR1 |
VGPR2 |
…… |
VGPR64 |
| B<sub>11</sub> |
B<sub>12</sub> |
…… |
B<sub>164</sub> |
| B<sub>21</sub> |
B<sub>22</sub> |
…… |
B<sub>264</sub> |
| …… |
…… |
…… |
…… |
| B<sub>641</sub> |
B<sub>642</sub> |
…… |
B<sub>6464</sub> |
此外,该控制器还分别与每个向量通用寄存器均连接,该控制器还用于并行地向K个向量流处理器发送乘法指令,以指示K个向量流处理器将第一矩阵与第二矩阵进行乘法运算。如以上述的A64x64*B64x64=C64x64,为例,即控制器同时向64个VSP发送乘法指令,使得这64个VSP并行地从本地数据共享单元中按照行顺序逐个获取预先存储的第一矩阵中的元素,以及并行地从各自对应的向量通用寄存器中获取第二矩阵中对应的元素,并各自将获取到的来自第一矩阵中的元素与来自第二矩阵中对应的元素进行相乘,最后各自将第一矩阵同一行中的元素逐个与第二矩阵的对应元素产生的相乘结果依次累加,得到第三矩阵同一行的所有元素,进而完成第一矩阵和第二矩阵的乘法运算。
此外,为了减少对VSP内存的占用,在K个向量流处理器并行地将第一矩阵同一行中的元素逐个与第二矩阵的对应元素产生的相乘结果依次累加之后,即在得到第三矩阵同一行的所有元素后,K个向量流处理器并行地将累加结果(相加之后的总结果)按照行顺序存储到LDS中不与第一矩阵相重叠的区域,例如,VSP1在得到C11后,将C11存储到LDS中的Address1,VSP2在得到C12后,将C12存储到LDS中的Address2,……,VSP64在得到C164后,将C164存储到LDS中的Address64中,其中,需要说明的是,上述的Address1-Address64均为不与第一矩阵中未读取的元素所在的区域相重叠的区域。当然K个向量流处理器并行地将累加结果也可以存储到各自对应的VGPR中,且不与第二矩阵相重叠的区域,例如,例如,VSP1在得到C11后,将C11存储到VGPR1中的且不与第二矩阵的第1列相重叠的区域,VSP2在得到C12后,将C12存储到VGPR2中的且不与第二矩阵的第2列相重叠的区域,……,VSP64在得到C164后,将C164存储到VGPR64中的且不与第二矩阵的第64列相重叠的区域。
本方案所述矩阵乘法器可以应用于中央处理器(CPU,central processingunit)、图像处理器(GPU,Graphics Processing Unit)或能够独立完成运算的电路器件上,本领域技术人员应该能够理解,本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换的实现本方案所述矩阵乘法器的方式,都应涵盖在本申请的保护范围之内。
本申请实施例还提供了一种应用于上述矩阵乘法器的数据处理方法,下面将结合图3所示的流程图进行说明。
步骤S101:所述K个向量流处理器并行地从所述本地数据共享单元中按照行顺序逐个获取预先存储的第一矩阵中的元素。
以矩阵乘法A64x64*B64x64=C64x64为例,则64个VSP并行地从LDS中按照行顺序逐个获取预先存储的第一矩阵中的元素(A11,A12,…,A164,A21,A22,…,A6464)。由于第一矩阵中的每个元素存储到LDS的时候,每个元素会对应一个唯一地址,因此,各个VSP可以根据地址从本地数据共享单元中获取该地址对应的元素。由于每个元素对应一个地址,在根据当前地址获取元素后,需要将当前地址更新到下一个元素对应的地址,如根据当前地址Address1获取到A11后,需要将当前地址更新到Address2,若是采用VSP来主动更新地址的方式,这样在每次获取矩阵A中的一个元素后,都需要先更新一次地址,无疑是非常浪费时间的,因此,作为一种实施方式,为了提高获取矩阵A中元素的效率,该矩阵乘法器还包括逻辑变更寄存器。该逻辑变更寄存器与每个向量流处理器均连接,用于存储读取第一矩阵中每个元素的地址,并且在K个向量流处理器并行地根据逻辑变更寄存器当前的地址从本地数据共享单元读取第一矩阵中对应的元素后自动更新到下一个元素对应的地址。相应地,K个向量流处理器并行地从本地数据共享单元中按照行顺序逐个获取预先存储的第一矩阵中的元素,具体为K个向量流处理器并行地根据逻辑变更寄存器当前的地址从本地数据共享单元中按照行顺序逐个获取预先存储的第一矩阵中的元素。
其中,第一矩阵需要事先存储到LDS中,因此,在步骤S101之前,该方法还包括:将所述第一矩阵中的元素存储到所述本地数据共享单元。作为一种实施方式,该矩阵乘法器还包括与所述本地数据共享单元连接的控制器。此时,可以利用控制器按照行顺序将所述第一矩阵中的元素存储到所述本地数据共享单元。
此外,作为一种实施方式,各个向量流处理器可以是在接收到用于将所述第一矩阵与所述第二矩阵进行乘法运算的乘法指令后,例如K个向量流处理器各自在接收到控制器发送的乘法指令后,才进行诸如并行地从各自对应的向量通用寄存器中获取预先存储的来自第二矩阵中对应的元素等后续处理。其中,该控制器每个所述向量流处理器均连接,控制器并行地(同时)向K个向量流处理器发送乘法指令,以指示K个向量流处理器将第一矩阵与第二矩阵进行乘法运算。即在步骤S101之前,该方法还包括:所述控制器并行地向所述K个向量流处理器发送乘法指令,以指示所述K个向量流处理器将所述第一矩阵与所述第二矩阵进行乘法运算。当然也可以是通过其他的方式来触发将第一矩阵与第二矩阵进行乘法运算操作,如通过定时的方式触发。
步骤S102:所述K个向量流处理器并行地从各自对应的向量通用寄存器中获取预先存储的来自第二矩阵中对应的元素。
以矩阵乘法A64x64*B64x64=C64x64为例,若64个VSP并行地从LDS中获取的元素为A11,则64个VSP并行地从各自对应的向量通用寄存器中获取预先存储的来自第二矩阵中对应的元素,即为表2中的第一行元素,进一步地,VSP1从直连的VGPR1中获取B11,VSP2从直连的VGPR2中获取B12,VSP3从直连的VGPR3中获取B13,……,VSP64从直连的VGPR64中获取B164。
其中,第二矩阵需要事先存储到K个VGPR中,因此,在步骤S102之前,该方法还包括:将所述第二矩阵中的各个列对应地存储到所述K个向量通用寄存器中,其中,每个向量通用寄存器存储所述第二矩阵的一列,也即一个所述向量通用寄存器存储一列,且不同向量通用寄存器存储的列不同。作为一种实施方式,该矩阵乘法器还包括通过总线分别与K个向量通用寄存器中的每个向量通用寄存器连接的控制器。此时,可以利用控制器将所述第二矩阵中的各个列对应地存储到所述K个向量通用寄存器中。存储的方式如上述表2所示。
步骤S103:所述K个向量流处理器各自将获取到的来自所述第一矩阵中的元素与来自所述第二矩阵中对应的元素进行相乘。
例如,对于VSP1来说,将来自第一矩阵中的元素A11与来自第二矩阵中对应的元素B11相乘,将来自第一矩阵中的元素A12与来自第二矩阵中对应的元素B21相乘,……,将来自第一矩阵中的元素A164与来自第二矩阵中对应的元素B641相乘。
步骤S104:所述K个向量流处理器并行地将所述第一矩阵同一行中的元素逐个与所述第二矩阵的对应元素产生的相乘结果依次累加,得到第三矩阵同一行的所有元素。
例如,对于VSP1来说,将所述第一矩阵同一行中的元素逐个与第二矩阵的对应元素产生的相乘结果依次累加,即将来自第一矩阵第一行中的元素逐个与第二矩阵的对应元素产生的相乘结果依次累加,得到C11,即VSP1:C11=A11*B11+A12*B21+A13*B31+A14*B41+…+A164*B641;
同理,对于VSP2来说,将来自第一矩阵第1行中的元素逐个与第二矩阵的对应元素产生的相乘结果依次累加,得到C12,即VSP2:C12=A11*B12+A12*B22+A13*B32+A14*B42+…+A164*B642;由于K个VSP是并行处理的,因此,可以得到第三矩阵同一行的所有元素,如得到第三矩阵第一行的所有元素。
此外,为了减少对VSP内存的占用,在K个向量流处理器并行地将第一矩阵同一行中的元素逐个与所述第二矩阵的对应元素产生的相乘结果依次累加之后,即在得到第三矩阵同一行的所有元素后,该方法还包括:K个向量流处理器并行地将相累加结果按照行顺序存储到LDS中不与第一矩阵相重叠的区域。例如,VSP1在得到C11后,将C11存储到LDS中的Address1,VSP2在得到C12后,将C12存储到LDS中的Address2,……,VSP64在得到C164后,将C164存储到LDS中的Address64中,其中,需要说明的是,上述的Address1-Address64均为不与第一矩阵中未读取的元素所在的区域相重叠的区域。当然K个向量流处理器并行地将相累加结果也可以存储到各自对应的VGPR中,且不与第二矩阵相重叠的区域。
本申请实施例所提供的数据处理方法,其实现原理及产生的技术效果和前述矩阵乘法器相同,为简要描述,方法实施例部分未提及之处,可参考前述装置实施例中相应内容。
本申请实施例还提供了一种集成电路器件,该集成电路器件包括基板和设置在该基板上的矩阵乘法器。该基板可以是目前常使用的电路基板,如PCB板等。其中,需要说明的是,由于本地共享单元LDS可以实现数据的共享,使得两个及以上的矩阵乘法器可以共用一个本地共享单元LDS,如需要计算矩阵A*矩阵B以及矩阵A*矩阵C,此时,两个矩阵乘法器共用一个本地共享单元LDS,即将矩阵A中的元素按照行顺序存储到LDS中即可,在进行矩阵计算时,存储于本地共享单元LDS中的元素逐个并行地被加载到第一矩阵乘法器中的K个向量流处理器,以及并行地被加载到第二矩阵乘法器中的K个向量流处理器。相应地,该集成电路器件也可以不包含矩阵乘法器中的LDS这一元件,也即LDS没有集成在该集成电路器件中,而是单独存在。
本申请实施例还提供了一种至少包括上述集成电路器件的处理器,该处理器可以是通用处理器,如中央处理器(CPU,central processing unit)、图像处理器(GPU,Graphics Processing Unit)、微处理器等;还可以是专用集成电路(ApplicationSpecific Integrated Circuit,ASIC)、现成可编程门阵列(Field Programmable GateArray,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应所述以权利要求的保护范围为准。