发明内容
本发明解决的是矩阵数据的加载速度较慢的技术问题。
为解决上述技术问题,本发明提供一种数据加载方法,包括:接收数据加载指令;检测到所述数据加载指令存在模式标识符时,获取所述数据加载指令指示的目标数据的数据量,并从常量缓冲区视图中获取所述目标数据的地址;根据所述目标数据的地址,读取所述目标数据;将所述目标数据加载至N个目的寄存器中,N为正整数。
可选的,所述从常量缓冲区视图中获取所述目标数据的地址,包括:获取所述目标数据的起始数据在所述常量缓冲区视图中的起始偏移量;根据所述起始偏移量以及所述目标数据的数据量,从所述常量缓冲区视图中获取所述目标数据的起始地址以及结束地址。
可选的,所述获取所述目标数据的起始数据在所述常量缓冲区视图中的起始偏移量,包括:获取所述数据加载指令中的立即数;基于所述立即数,确定所述起始偏移量。
可选的,所述获取所述目标数据的起始数据在所述常量缓冲区视图中的起始偏移量,包括:获取所述数据加载指令中的寄存器;基于所述寄存器,确定所述起始偏移量。
可选的,所述目标数据包括:矩阵数据。
可选的,所述将所述目标数据加载至N个目的寄存器中,包括:根据所述目标数据的数据量,确定所述目的寄存器的个数N;将所述目标数据加载至N个目的寄存器中。
可选的,所述将所述目标数据加载至N个目的寄存器中,包括:将所述目标数据加载至地址连续的N个目的寄存器中。
可选的,所述目标数据的地址包括起始地址;所述将所述目标数据加载至地址连续的N个目的寄存器中,包括:基于所述目标数据的起始地址,读取所述目标数据;每完成一次数据读取操作,对实时偏移量进行更新,所述实时偏移量用于表征待读取数据与所述目标数据的起始地址之间的偏移量;在完成预设长度的数据读取操作后,将所述预设长度的目标数据加载至对应的目的寄存器,对未读取的目标数据的数据量进行更新,并更新进行数据加载的目的寄存器的标识。
可选的,所述数据加载方法还包括:检测到所述数据加载指令不存在模式标识符时,从所述常量缓冲区视图中获取所述目标数据的地址;根据所述目标数据的地址,读取所述目标数据;将所述目标数据加载至目的寄存器中。
本发明还提供了一种图形处理器,包括:访问控制器以及调度执行核心,其中:所述访问控制器,用于接收数据加载指令;所述调度执行核心,用于检测到所述数据加载指令的模式标识符时,获取所述数据加载指令指示的目标数据的数据量,并从常量缓冲区视图中获取所述目标数据的地址;根据所述目标数据的数据量以及所述目标数据的地址,读取所述目标数据;将所述目标数据加载至N个目的寄存器中;N为正整数。
本发明还提供了一种计算机可读存储介质,所述计算机可读存储介质为非易失性存储介质或非瞬态存储介质,其上存储有计算机程序,所述计算机程序被处理器运行时执行上述任一种所述的数据加载方法的步骤。
与现有技术相比,本发明的技术方案具有以下有益效果:
检测到数据加载指令的模式标识符使能时,根据目标数据的数据量以及目标数据的地址,读取目标数据,并将目标数据加载至N个目的寄存器中。由此,通过一条数据加载指令实现多条数据的加载,从而提高数据加载速度。
具体实施方式
传统的矩阵数据加载方式,通过加载/存储(load/store)路径和纹理单元读取加载路径。上述的两种路径主要为3D图形数据服务,一条数据加载指令仅能够加载一条数据,加载速度较慢。
在本发明实施例中,检测到数据加载指令的模式标识符使能时,根据目标数据的数据量以及目标数据的地址,读取目标数据,并将目标数据加载至N个目的寄存器中。由此,通过一条数据加载指令实现多条数据的加载,从而提高数据加载速度。
为使本发明的上述目的、特征和有益效果能够更为明显易懂,下面结合附图对本发明的具体实施例做详细的说明。
本发明实施例提供了一种数据加载方法,参照图1,以下通过具体步骤进行详细说明。
步骤101,接收数据加载指令。
在具体实施中,可以由图形处理器内部的硬件单元接收数据加载指令,硬件单元能够实现指令接收的功能,可以为访问控制器、访问控制单元等。
在本发明实施例中,数据加载指令可以为常量数据加载指令,用于加载并缓存内存中常量缓冲区视图(Constant Buffer View,CBV)的数据。
以数据加载指令为CDL(const data load)指令为例,现有技术中的CDL指令的结构如下:
CDL dest_reg, offset_reg, cbv[idx];
其中,dest_reg为目的寄存器,用于存放取回的常量数据;offset_reg,用于表征常量数据在cbv中的偏移量,该值可以是寄存器也可以是立即数; cbv[idx]中的idx表示当前选中的是哪一个cbv中描述(存放)的数据。上述指令的完整含义为:加载cbv编号为idx的内存区域中偏移量为offest处对应的常量数据到寄存器dest_reg中。
在具体应用中,GPU中的运算单元以单指令多数据流(Single InstructionMultiple Data,SIMD)运行。假设当前是SIMD32模式,则dest_reg对应32个32bit宽的向量寄存器,offset_reg同样对应32个32bit宽的寄存器。
在本发明实施例中,当编译器(compiler)检测到短时间内需要加载大量数据的需求时,可以对现有的数据加载指令进行更改,在更改后的数据加载指令中,增加模式标识符,以及需要加载的数据的数据量。反之,当编译器检测到短时间内不存在加载大量数据的需求时,则可以无需对现有的数据加载指令进行更改。
具体地,在数据加载指令中增加模式标识符,通过模式标识符指示短时间内需要加载大量数据。在数据加载指令中增加需要加载的数据的数据量,指示本条数据加载指令所要加载的数据大小。
在具体应用中可知,加载矩阵数据时,对应短时间内需要加载大量数据的场景。因此,当编译器检测到需要加载矩阵数据时,可以对现有的数据加载指令进行更改,在数据加载指令中增加模式标识符,以及矩阵数据的数据量。通过模式标识符,指示数据加载指令用于加载矩阵数据;通过矩阵数据的数据量,指示该待加载的矩阵数据的大小。
在本发明实施例中,更改后的数据加载指令更改后的数据加载指令可以为如下指令:
CDL.burst.sizeX dest_reg, offset_reg, cbv[idx] ;
上述指令中,“burst”表征模式指示符,“sizeX”表征目标数据的数据量。
步骤102,检测到数据加载指令存在模式标识符时,获取数据加载指令指示的目标数据的数据量,并从常量缓冲区视图中获取目标数据的地址。
在本发明实施例中,在检测到数据加载指令中存在模式标识符时,可以获取数据加载指令指示的目标数据的数据量,并从常量缓冲区视图中获取目标数据的地址。
如上述示例,检测到数据加载指令中包括“burst”标志位时,即可确定处于突发模式(也即短时间内需要加载大量数据),从数据加载指令中获取“sizeX”,X表示存在多少个32×32bit。
在具体实施中,从数据加载指令中,获取目标数据的起始数据在常量缓冲区视图中的起始偏移量;根据起始偏移量以及目标数据的数据量,从常量缓冲区视图中获取目标数据的起始地址以及结束地址。
具体地,矩阵数据在内存中是连续排列的。因此,在确定了矩阵的第一个数据在常量缓冲区视图中的起始偏移量之后,可以根据起始偏移量以及矩阵数据的数据量,从常量缓冲区视图中获取矩阵数据的起始地址以及结束地址。
在具体实施中,起始偏移量可以由数据加载指令中的立即数来表征。具体地,立即数可以为具体的数值,或者为寄存器(如标量寄存器)。
在本发明一实施例中,数据加载指令如下:
CDL.burst.sizeX r0, 0, cbv[1];
其中,“r0”为第一个目的寄存器,“0”为立即数。
在本发明另一实施例中,数据加载指令如下:
CDL.burst.sizeX r0, offset_reg, cbv[1];
其中,“r0”为第一个目的寄存器,“offset_reg”为寄存器的取值,用于表征立即数。
步骤103,根据目标数据的地址,读取目标数据。
在具体实施中,在得到目标数据的地址之后,即可根据目标数据的地址,从内存中读取相应地址中存储的目标数据。
步骤104,将目标数据加载至N个目的寄存器中。
在本发明实施例中,在读取出目标数据之后,可以将目标数据加载至N个目的寄存器中;N为正整数。
在具体实施中,N个目的寄存器可以是地址连续的N个寄存器,也即N个目的寄存器的地址连续。在将目标数据加载至N个目的寄存器时,由于N个目的寄存器的地址连续,故仅需要在数据加载指令中指示N个目的寄存器中的第一个目的寄存器,然后按照地址id加1的方式逐个确定剩下的N-1个目的寄存器。
在具体实施中,目标数据的地址包括目标数据的起始地址和结束地址。如上述实施例中所述,一种确定目标数据的起始地址和结束地址的方式为:根据目标数据的起始数据在常量缓冲区视图中的起始偏移量以及矩阵数据的数据量,从常量缓冲区视图中获取矩阵数据的起始地址以及结束地址。
可以理解的是,也可以在指令中,直接携带目标数据的起始地址和结束地址。
在将目标数据加载至地址连续的N个目的寄存器中时,可以先基于目标数据的起始地址,读取目标数据。在完成一次数据读取操作后,对实时偏移量进行更新。实时偏移量可以为当前待读取数据与起始数据之间的偏移量。
在完成预设长度的数据读取操作后,将预设长度的目标数据加载至对应的目的寄存器,对未读取的目标数据的数据量进行更新,并更新进行数据加载的目的寄存器的标识。
在具体实施中,预设长度与目的寄存器的位数相关。例如,目的寄存器为32位寄存器,则预设长度为32bit;目的寄存器为64位寄存器,则预设长度为64bit。
下面通过示例对本发明上述实施例中提供的数据加载方法进行说明。
编译器检测到存在矩阵数据的加载,对数据加载指令进行更改,得到数据加载指令如下:
CDL.burst.sizeX r0, 0, cbv[1]
访问控制器接收到数据加载指令,将其传输至调度执行核心。size.X表征矩阵数据对应的数据量为X个32×32bit。
若上述数据加载指令如下:CDL.burst.size8 r0, 0, cbv[1],则表征矩阵数据对应的数据量为8个32×32bit。
调度执行核心检测到数据加载指令中存在模式指示符“burst”,且获取到矩阵数据的数据量大小为8个32×32bit。起始偏移量为0。调度执行核心读取第一个32×32bit的数据,读取其中第一个32bit的数据,实时偏移量(相对于起始偏移量的偏移)从0变为1;调度执行核心读取第二个32bit的数据,实时偏移量从1变为2。
依据上述方式,调度执行核心读取32个32bit的数据,实时偏移量从0变为31。调度执行核心将32×32bit数据写入至目的寄存器r0中。
调度执行核心将未读取的目标数据的数据量更新为7个32×32bit。调度执行核心继续读取第二个32×32bit的数据,读取其中的第一个32bit的数据,实时偏移量从31变为32;调度执行核心继续读取剩下的31个32bit的数据,每读取一个32bit的数据,实时偏移量更新一次。在完成第二个32×32bit的数据的读取后,实时偏移量从32变为63;将32×32bit的数据写入至目的寄存器r1。
以此类推,调度执行核心将矩阵数据(8个32×32bit的数据)写入至目的寄存器r0~r7。
可以理解的是,N个目的寄存器的地址也可以是不连续的。
在具体实施中,若检测到数据加载指令中不存在模式标识符,则可以按照现有的数据加载流程实现数据加载,具体流程如下:从常量缓冲区视图中获取目标数据的地址;进而,根据目标数据的地址,读取目标数据;将目标数据加载至目的寄存器。
综上可见,本发明实施例中,检测到数据加载指令的模式标识符使能时,根据目标数据的数据量以及目标数据的地址,读取目标数据,并将目标数据加载至N个目的寄存器中。由此,通过一条数据加载指令实现多条数据的加载,从而提高数据加载速度。
参照图2,给出了本发明实施例中的一种图形处理器20,包括:访问控制器201以及调度执行核心202,其中:
访问控制器201,用于接收数据加载指令;
调度执行核心202,用于检测到所述数据加载指令的模式标识符使能时,获取所述数据加载指令指示的目标数据的数据量,并从常量缓冲区视图中获取所述目标数据的地址;根据所述目标数据的数据量以及所述目标数据的地址,读取所述目标数据;将所述目标数据加载至N个目的寄存器中;N为正整数。
在具体实施中,关于图形处理器20的工作原理及工作流程等更多的内容,参照上述任一实施例提供的数据加载方法中的描述,此处不再赘述。
本发明实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质为非易失性存储介质或非瞬态存储介质,其上存储有计算机程序,所述计算机计算机程序被处理器运行时执行上述任一种所述的数据加载方法的步骤。
本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指示相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:ROM、RAM、磁盘或光盘等。
虽然本发明披露如上,但本发明并非限定于此。任何本领域技术人员,在不脱离本发明的精神和范围内,均可作各种更动与修改,因此本发明的保护范围应当以权利要求所限定的范围为准。