发明内容
本发明所要解决的技术问题是如何提高不同排布方式之间的图像拷贝的效率。
有鉴于此,本发明提供一种数据拷贝方法,所述方法包括:根据第一排布方式和第二排布方式,确定公共块的尺寸,所述第一排布方式为源图像在第一存储装置中的排布方式,所述第二排布方式为目标图像在第二存储装置中的排布方式,所述第一排布方式和第二排布方式不同,公共块内的多个像素数据在所述第一存储装置中的排布和在所述第二存储装置中的排布是相同的;以所述公共块为单位,将所述源图像拷贝至所述第二存储装置中,得到所述目标图像。
可选的,所述第一排布方式的数据结构表示和所述第二排布方式的数据结构表示的最低有效位LSB相同。
可选的,根据第一排布方式和第二排布方式,确定公共块的尺寸包括:根据所述第一排布方式的数据结构表示和所述第二排布方式的数据结构表示,确定所述公共块的尺寸。
可选的,根据所述第一排布方式的数据结构表示和所述第二排布方式的数据结构表示,确定所述公共块的尺寸包括:自所述第一排布方式的数据结构表示的LSB和所述第二排布方式的数据结构表示的LSB开始,逐位地比较比特位是否相同,若相同则比较更高一位的比特位是否相同,直至被比较的比特位不同,以得到相同的比特位;根据所述相同的比特位以及所述相同的比特位所对应的维度,确定所述公共块的尺寸。
可选的,以所述公共块为单位,将所述源图像拷贝至所述第二存储装置中,得到所述目标图像包括:根据所述公共块的尺寸,确定当前次拷贝操作的起始像素数据;确定源地址,所述源地址为所述当前次拷贝操作的起始像素数据在所述第一存储装置中的存储地址;确定目标地址,所述目标地址为所述当前次拷贝操作的起始像素数据在所述第二存储装置中的存储地址;根据所述源地址、所述目标地址和拷贝数据长度,将当前次所拷贝的公共块从所述第一存储装置拷贝至所述第二存储装置中,其中,所述拷贝数据长度根据所述公共块的尺寸和像素数据所占字节数确定。
可选的,所述第一排布方式和所述第二排布方式中的至少一个为瓦片排布。
可选的,所述第一存储装置和所述第二存储装置均能够被图形处理器GPU访问。
可选的,所述源图像为以下任意一种图像:二维图像、三维图像、二维数组图像;和/或,所述目标图像为以下任意一种图像: 二维图像、三维图像、二维数组图像。
本申请还提供一种数据拷贝装置,所述装置包括:公共块确定模块,用于根据第一排布方式和第二排布方式,确定公共块的尺寸,所述第一排布方式为源图像在第一存储装置中的排布方式,所述第二排布方式为目标图像在第二存储装置中的排布方式,所述第一排布方式和第二排布方式不同,公共块内的多个像素数据在所述第一存储装置中的排布和在所述第二存储装置中的排布是相同的;拷贝模块,用于以所述公共块为单位,将所述源图像拷贝至所述第二存储装置中,得到所述目标图像。
可选的,所述第一排布方式的数据结构表示和所述第二排布方式的数据结构表示的最低有效位LSB相同。
可选的,所述公共块确定模块包括:确定单元,所述确定单元用于根据所述第一排布方式的数据结构表示和所述第二排布方式的数据结构表示,确定所述公共块的尺寸。
可选的,所述公共块确定模块包括:比较单元,所述比较单元用于自所述第一排布方式的数据结构表示的LSB和所述第二排布方式的数据结构表示的LSB开始,逐位地比较比特位是否相同,若相同则比较更高一位的比特位是否相同,直至被比较的比特位不同,以得到相同的比特位;确定单元,所述确定单元用于根据所述相同的比特位以及所述相同的比特位所对应的维度,确定所述公共块的尺寸。
可选的,拷贝模块包括:更新单元,用于根据所述公共块的尺寸,确定当前次拷贝操作的起始像素数据;源地址确定单元,用于确定源地址,所述源地址为所述当前次拷贝操作的起始像素数据在所述第一存储装置中的存储地址;目标地址确定单元,用于确定目标地址,所述目标地址为所述当前次拷贝操作的起始像素数据在所述第二存储装置中的存储地址;拷贝单元,用于根据所述源地址、所述目标地址和拷贝数据长度,将当前次所拷贝的公共块从所述第一存储装置拷贝至所述第二存储装置中,其中,所述拷贝数据长度根据所述公共块的尺寸和像素数据所占字节数确定。
可选的,所述第一排布方式和所述第二排布方式中的至少一个为瓦片排布。
可选的,所述第一存储装置和所述第二存储装置均能够被图形处理器GPU访问。
可选的,所述源图像为以下任意一种图像:二维图像、三维图像、二维数组图像;和/或,所述目标图像为以下任意一种图像: 二维图像、三维图像、二维数组图像。
本发明还提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器运行时,执行上述的数据拷贝方法的步骤。
本发明还提供一种电子设备,包括存储器和处理器,所述存储器上存储有可在所述处理器上运行的计算机程序,所述处理器运行所述计算机程序时执行上述的数据拷贝方法的步骤。
与现有技术相比,本发明的技术方案具有以下有益效果:
本发明的方案中,根据第一排布方式和第二排布方式,确定公共块的尺寸,所述第一排布方式为源图像在第一存储装置中的排布方式,所述第二排布方式为目标图像在第二存储装置中的排布方式,所述第一排布方式和第二排布方式不同。然后以所述公共块为单位,将所述源图像拷贝至所述第二存储装置中,得到所述目标图像。
也即,本发明的方案中,以公共块为粒度进行拷贝,由于公共块内的多个像素数据在第一存储装置中的排布和在所述第二存储装置中的排布是相同的,因此,在拷贝过程中无需针对公共块内的像素数据逐个计算源地址和目标地址,GPU也无需理解公共块内部像素数据的排布方式。因此,以公共块为粒度进行拷贝,在保证准确拷贝的前提下能够节省了拷贝次数,因此有效提高拷贝效率。此外,由于无需针对各个像素数据计算地址,也有利于降低算力资源的开销。本发明实施例提供的方案中,GPU的硬件资源只需支持在从源地址拷贝一定长度的像素数据至目标地址的功能,硬件无需理解图像的排布方式。因此,本发明实施例的方案能够应用于各种GPU上,以使得该GPU能够实现各种排布方式之间的图像拷贝任务。
进一步,本发明的方案中,根据所述第一排布方式的数据结构表示和所述第二排布方式的数据结构表示,确定所述公共块的尺寸。也即,本发明的方案中利用数据结构表示对像素数据的排布方式的表征作用,能够快速、准确地确定公共块的尺寸。
进一步,本发明的方案中,自所述第一排布方式的数据结构表示的LSB和所述第二排布方式的数据结构表示的LSB开始,逐位地比较比特位是否相同,若相同则比较更高一位的比特位是否相同,直至被比较的比特位不同,以得到相同的比特位;根据所述相同的比特位以及所述相同的比特位所对应的维度,确定所述公共块的尺寸。采用这样的方案,能够得到最大的公共块的尺寸,使得拷贝效率最大化。
具体实施方式
如背景技术所述,目前的GPU所支持的图像排布的种类十分有限,对于GPU不支持的图像排布,GPU需要耗费较多的资源开销计算各种偏移,拷贝效率较低,资源的开销也较大。具体而言,在图像拷贝场景中,若GPU无法同时支持源图像的排布方式和目标图像的排布方式,则需要借助算法计算每个像素数据按照源图像的排布方式在源存储装置中的存储地址和按照目标图像的排布方式在目标存储装置中的存储地址,然后根据得到的地址逐个像素地进行拷贝。因此,这种拷贝方法的效率较低,也需要消耗较多的算力资源。
有鉴于此,本发明实施例提供一种数据拷贝方法,在本发明实施例的方案中, 根据第一排布方式和第二排布方式,确定公共块的尺寸,所述第一排布方式为源图像在第一存储装置中的排布方式,所述第二排布方式为目标图像在第二存储装置中的排布方式,所述第一排布方式和第二排布方式不同。然后以所述公共块为单位,将所述源图像拷贝至所述第二存储装置中,得到所述目标图像。
也即,本发明实施例的方案中,以公共块为粒度进行拷贝,由于公共块内的多个像素数据在第一存储装置中的排布和在所述第二存储装置中的排布是相同的,因此,在拷贝过程中无需针对公共块内的像素数据逐个计算源地址和目标地址,GPU也无需理解公共块内部像素数据的排布方式。因此,以公共块为粒度进行拷贝,在保证准确拷贝的前提下能够节省了拷贝次数,因此有效提高拷贝效率。
为使本发明的上述目的、特征和有益效果能够更为明显易懂,下面结合附图对本发明的具体实施例做详细的说明。
参照图1,图1是本发明实施例中一种数据拷贝方法的场景示意图。下面结合图1对本发明实施例的应用场景进行非限制性的说明。
在本发明实施例提供的方法可以用于将第一存储装置中的源图像拷贝至第二存储装置中,得到目标图像。其中,第一存储装置和第二存储装置可以是不同的存储装置。在其他实施例中,第一存储装置可以称之为源存储装置,第二存储装置可以称之为目标存储装置。
需要说明的是,本发明实施例中的存储装置(如第一存储装置和第二存储装置)是指GPU能够访问的存储器。例如,存储装置可以是显存,也可以是系统内存,还可以是未来GPU能够访问的存储器。
还需要说明的是,在拷贝之前,第二存储装置中并不存在目标图像,在拷贝完成之后得到目标图像。
在本发明的一实施例中,第一存储装置和第二存储装置可以是同一个电子设备中的存储装置。在这种情况下,本发明实施例提供的方法可以应用于第一存储装置和第二存储装置所属的电子设备。具体的,所述方法可以由电子设备中的GPU执行。
在其他实施例中,第一存储装置和第二存储装置也可以是同一个存储装置上不同的存储模块,其中,每个存储模块包括多个存储单元。在不同的存储模块中,图像的排布方式不同。例如,第一存储装置和第二存储装置可以为同一个显存中的不同存储模块。
本发明实施例的方案中,源图像存储于第一存储装置中,通过执行本发明实施例提供的方案可以将源图像的像素数据拷贝至第二存储装置中,得到目标图像。需要说明的是,源图像和目标图像的像素数据(也即,图像的内容)是相同的,但源图像在第一存储装置中的排布方式和目标图像在第二存储装置中的排布方式是不同的。
其中,排布方式是指像素数据在存储装置中的存储规则。换言之,排布方式决定了图像中各个像素数据是如何存储在存储装置中的,图像中相邻的像素数据在存储装置中的存储单元可能是连续的,也可能是不连续的,取决于图像在存储装置中的排布方式。具体的,存储装置可以包括多个存储单元,排布方式可以用于确定像素数据所存储的存储单元。
在具体实施中,图像在存储装置中的排布方式可以包括以下两类:
类1:线性排布。
具体的,线性排布可以是指存储装置中连续的存储单元摆放图像的同一行像素数据,并接着摆放下一行的像素数据。换言之,图像的同一行相邻像素数据在存储装置中的存储单元是连续的。在具体实施中,以二维图像为例,在GPU的显存中,图像的每一行像素数据对应的存储区域的长度为GPU缓存行(cacheline)的整数倍,所以上一行的最后一个像素数据所在的存储单元和下一行的第一个像素数据所在的存储单元不一定相邻。也即,上一行的最后一个像素数据所在的存储单元和下一行的第一个像素数据所在的存储单元之间可能存在间距(Pitch)。
例如,假定GPU硬件缓存行的大小是64字节(byte),二维图像的宽度是250,且一个像素占1字节,图像的每一行实际需要的间距就需要对齐到256 byte,也即,上一行最后的像素数据空出6字节之后才是下一行的第一个像素数据。
在线性排布场景下,图像中索引为(xoffset,yoffset)的像素数据在存储装置中的偏移地址mem_offset= yoffset ×Pitch+ xoffset。
需要说明的是,本发明实施例中xoffset表示像素数据在图像的宽度上的索引,yoffset表示像素数据在图像的高度上的索引,通过(xoffset,yoffset)能够在二维图像中唯一确定一个像素数据。
此外,mem_offset表示像素数据在存储装置中的偏移地址。具体的,像素数据在存储装置中的偏移地址是指像素数据在存储装置中的存储地址相对于图像在存储装置中的起始地址(或者也可以是称之为初始地址)的偏移。本发明实施例中图像在存储装置中的起始地址可以是指图像中各个维度的索引均为0的像素数据在存储装置的存储地址。
类2:瓦片排布。
瓦片排布可以是指图像被划分为多个瓦片,图像按照瓦片(tile)为单位进行排布,瓦片可以采用线性排布的方式存储于存储装置中,瓦片内部的像素按照特定的z序列排布(z-order curve)于存储装置中。
参照图2和图3,图2是本发明实施例中一种图像的示意图,图3是本发明实施例中一种瓦片的示意图。
具体而言,以二维图像的尺寸为(24,16)为例,也即,二维图像在行方向上有24个像素,在列方向上有16个像素,假定瓦片的大小为1KB,1个像素占16个字节,则1个瓦片在行方向上有8个像素,在列方向上有8个像素。由此,如图2所示,图像在行方向上有3个瓦片,在列方向上有2个瓦片,且这6个瓦片在存储装置中以线性排布的方式存储。
为了便于访问,瓦片内部的像素数据在存储装置中按照特定的z序列的方式排布。如图3所示,图3中的x为像素在瓦片内在宽度上的索引,y为像素在瓦片内在高度上的索引。也即,通过(x,y)能够在瓦片内唯一确定一个像素数据。x和y采用二进制表示,并将x和y按照一定规则进行交织所得到的数据结构表示即可用于描述瓦片内部的像素数据在存储装置中的排布方式。
在实际应用中,瓦片排布可以包括自定义瓦片排布和标准瓦片排布。其中,自定义瓦片排布可以是指GPU厂商根据实际需求自定义的瓦片内部的排布方式。例如,以二维图像为例,GPU厂商可以通过定义x和y的交织方式来定义瓦片内部的排布方式。
以8×8的瓦片为例,将x可以表示为X2X1X0,y表示为Y2Y1Y0。交织后的一种数据结构表示可以为:Y2X2Y1X1Y0X0,或者,交织后的另一种数据结构表示可以为:Y2Y1X2X1Y0X0等。
此外,标准瓦片排布可以是指瓦片内部的像素数据在存储装置中按照行业内约定的排布方式进行排布。也即,标准瓦片排布中各个维度的索引的二进制编码的交织方式是由行业标准定义的。
参照表1,表1示出了瓦片为64KB时多种BPP对应的标准瓦片排布的数据结构表示。其中,BPP(Bits Per Pixel)是指每个像素占用的比特数。
具体的,表1示出的是二维图像的标准瓦片排布的数据结构表示。
对于瓦片排布而言,瓦片排布的数据结构表示可以取决于图像的维度、瓦片的尺寸和交织方式。其中,瓦片的尺寸是指瓦片内部各个维度上像素数据的数量,交织方式是指像素数据在不同维度上在瓦片内的二进制索引的交织方式。瓦片排布的数据结构表示可以是通过对像素数据在不同维度上在瓦片内的二进制索引进行交织得到的,不同瓦片排布方式满足以下至少一项:瓦片的尺寸不同、交织方式不同。因此,不同瓦片排布的数据结构表示是不同的。
在具体实施中,瓦片排布的数据结构表示默认是按照从左到右的顺序为最高有效位(most significant bit,MSB)至最低有效位(least significant bit,LSB)的顺序,也即,左边第1位为MSB,右边第1位为LSB。
以二维图像为例,像素数据在瓦片内部的索引可以表示为(x,y),x和y采用二进制表示,并将x和y进行交织,可以得到数据结构表示。
假设瓦片的尺寸为,也即,瓦片内一行包括/>个像素数据,一列包括/>像素数据,M和N均为正整数,则瓦片排布的数据结构表示是通过M个X和N个Y进行交织得到的。
以表1中8BPP对应的数据结构表示为例,64KB的瓦片的尺寸为,像素数据在宽度方向的索引的二进制表示为: X7X6X5X4X3X2X1X0,类似的,像素数据在高度方向的索引的二进制表示为: Y7Y6Y5Y4Y3Y2Y1Y0,对X7X6X5X4X3X2X1X0和Y7Y6Y5Y4Y3Y2Y1Y0进行交织,得到标准瓦片排布的数据结构表示为:X7Y7X6Y6X5Y5X4Y4Y3Y2Y1Y0X3X2X1X0。如上文所述,由于数据结构表示默认是按照从左到右为MSB至LSB的顺序,因此,该数据结构表示可以简写为XYXYXYXYYYYYXXXX。
由上,在瓦片排布的场景中,瓦片内部的像素数据在存储装置中排布方式可以通过数据结构表示来表征,数据结构表示不同,则瓦片排布方式也不同。
进一步地,对于瓦片排布的图像,可以采用下述步骤一至步骤三计算图像中索引为ioffset的像素数据在存储装置中的偏移地址,其中,索引ioffset取决于图像的维度。例如,若图像为二维图像,则ioffset=(xoffset,yoffset);若图像为三维图像,则ioffset=(xoffset,yoffset,zoffset),其中,zoffset表示像素数据在图像中在深度上的索引;若图像为二维数组图像,则ioffset=(xoffset,yoffset,toffset),其中,toffset表示像素数据在图像中在数组上索引。
步骤一:计算索引为ioffset的像素数据所在的瓦片在存储装置中起始地址相对于图像在存储装置中起始地址的偏移,记为tile_offset。
具体而言,瓦片在存储装置中的起始地址相对于图像在存储装置中的起始地址的偏移可以是指在瓦片内的起始像素数据的存储地址相对于在图像内的起始像素数据的存储地址的偏移。存储地址可以是指存储单元的地址。本发明实施例的方案中,以存储单元存储1个字节的数据为例进行描述。其中,起始像素数据是指各维度索引为0的像素数据。
更具体的,tile_offset可以是根据瓦片在图像中的索引计算得到的。
步骤二:计算索引为ioffset的像素数据相对于所在瓦片中起始像素数据在存储装置中存储地址的偏移,记为pixel_offset_in_tile。
具体的,pixel_offset_in_tile=Q×(1个像素的字节数),其中Q可以表示索引为ioffset的像素数据是瓦片中起始像素数据的存储单元之后存储的第Q个像素数据。也即,索引为ioffset的像素数据的存储单元和瓦片中起始像素数据的存储单元之间的存储单元存储了(Q-1)个像素数据。其中,Q可以基于根据瓦片排布的数据结构表示得到的。具体的,将索引为ioffset的像素数据在瓦片内的二进制索引按照数据结构表示,即可得到Q。
步骤三:计算tile_offset和pixel_offset_in_tile之和,即可得到索引为ioffset的像素数据在存储装置中的存储地址相对于图像在存储装置中起始地址的偏移。
由此,根据步骤三得到的偏移和图像在存储装置中起始地址,能够确定索引为ioffset在存储装置中的存储地址。
延续上文中的例子,假设瓦片的大小为1KB,瓦片的尺寸为(8,8),图像的尺寸为(24,16),瓦片内部的排布方式的数据结构表示为Y2X2Y1X1Y0X0,计算(xoffset,yoffset)=(3,9)的像素数据在存储装置中的存储地址。
步骤一:计算tile_offset。
由于瓦片的尺寸为(8,8),(xoffset,yoffset)= (3,9),因此,该像素所在的瓦片在图像中的索引为(0,1)。由此,tile_offset =(0+1×3) ×1KB = 3×1024=3072。
步骤二:计算pixel_offset_in_tile。
由于(xoffset,yoffset)= (3,9)的像素数据在瓦片中的索引是(3,1),Y2X2Y1X1Y0X0=000111,Q=7,假设像素字节数是16,则pixel_offset_in_tile=7×16=112。
由此,(xoffset,yoffset)= (3,9)相对于图像的起始地址的偏移为3072+112 =3184字节。由此,可以确定该像素点在存储装置中的存储位置。
上文对图像在存储装置中的排布方式进行了非限制性的描述。
如上文所述,在执行跨存储装置的数据拷贝任务时,若GPU无法同时支持两种排布方式,则可以采用上述计算方法逐个像素地进行拷贝。
具体而言,对于索引为(xoffset,yoffset)的像素数据,根据源图像在第一存储装置中的排布方式确定该在第一存储装置中的存储地址,然后根据目标图像在第二存储装置中的排布方式确定该像素数据在第二存储装置中的存储地址。然后进一步从第一存储装置中读出该像素数据,并写入第二存储装置中。为提高这种逐像素拷贝的拷贝效率,本发明实施例中以公共块为粒度进行拷贝,以提高图像拷贝效率。
参照图4,图4是本发明实施例中一种数据拷贝方法的流程示意图。所述方法可以应用于电子设备,所述电子设备可以配置有GPU、第一存储装置和第二存储装置。所述电子设备可以是现有的各种具有数据接收和数据处理能力的设备,例如,可以是手机、计算机、物联网设备和服务器等,但并不限于此。
图4示出的数据拷贝方法可以包括以下步骤:
步骤S41:根据第一排布方式和第二排布方式,确定公共块的尺寸,所述第一排布方式为源图像在第一存储装置中的排布方式,所述第二排布方式为目标图像在第二存储装置中的排布方式,所述第一排布方式和第二排布方式不同,当图像分别按照所述第一排布方式和所述第二排布方式排布时,所述公共块内的像素数据在存储装置中的排布相同;
步骤S42:以所述公共块为单位,将所述源图像拷贝至所述第二存储装置中,得到所述目标图像。
本发明实施例中,公共块是图像中的区域,图像中的像素数据分别按照第一排布方式和第二排布方式排布时,公共块内的像素数据在存储装置中的排布是相同的。也即,公共块是图像的一部分。
具体的,公共块内的多个像素数据在第一存储装置中的存储单元是连续的,公共块内的多个像素数据在第二存储装置中的存储单元也是连续的,且多个像素数据在第一存储装置中的排布和在第二存储装置中的排布也是相同的。在步骤S41中,可以根据第一排布方式的数据结构表示和第二排布方式的数据结构表示来确定公共块的尺寸。
本发明实施例的方案中,若排布方式为瓦片排布,则排布方式的数据结构表示可以是上述的瓦片排布的数据结构表示。如上文所述,瓦片排布的数据结构表示取决于图像的维度、瓦片的尺寸和交织方式。
若第一排布方式和第二排布方式均为瓦片排布,则源图像和目标图像的维度是相同的,第一排布方式和第二排布方式中瓦片的尺寸和交织方式中的至少一项是不同的。
上文主要以二维图像为例示出了瓦片排布的数据结构表示。具体而言,二维图像的瓦片排布的数据结构表示可以通过像素数据在瓦片内在宽度上的二进制索引和像素数据在瓦片内在高度上的二进制索引。
若图像为三维图像,则数据结构表示还包括像素数据在瓦片内在深度上的二进制索引(记为Z)。三维图像的瓦片排布的数据结构表示可以通过像素数据在瓦片内在宽度上的二进制索引、像素数据在瓦片内在高度上的二进制索引和在深度上的二进制索引进行交织得到的。
若图像为二维数组图像,则数据结构表示还可以包括像素数据在瓦片内在数组上的二进制索引(记为A),二维数组的瓦片排布的数据结构表示可以通过像素数据在瓦片内在宽度上的二进制索引、像素数据在瓦片内在高度上的二进制索引和在瓦片内在数组上的二进制索引进行交织得到的。
本发明实施例的方案中,对于采用线性排布的图像,也可以采用数据结构表示来表征排布方式。在线性排布中,图像中宽度上的像素数据缓存行的大小(或长度)进行对齐,其中,缓存行的大小L可以表示为c×, 其中c为不能被2整除的正整数,K为正整数。基于线性排布的方式,在每/>个字节内,都是按照XK-1 XK-2 ……X0的编码来排布的。由此,线性排布的数据结构表示可以表示为XK-1 XK-2 ……X0,其中,K的值取决于缓存行的大小(c×/>)。
例如,假定线性排布要求按照64字节对齐,那么8BPP 图像的宽度上有179个像素,图像在线性排布时会被对齐到192字节。这里64字节可以表示为1×,则可以认为在每64字节内都是按照X5X4X3X2X1X0来编码的。也即,线性排布的数据结构表示为X5X4X3X2X1X0。
又例如,假定线性排布要求按照60字节对齐,那么8BPP 宽度上有170像素的图像会被对齐到180字节。这里60字节可以表示15×,其中,15不能被2整除,则可以认为在每4字节内都是按照X1X0来编码的。也即,线性排布的数据结构表示为X1X0。
在实际应用中,第一排布方式和第二排布方式可以是根据实际应用需求确定。
进一步地,可以通过将第一排布方式的数据结构表示和第二排布方式的数据结构表示进行比对,确定第一排布方式的数据结构表示和第二排布方式的数据结构表示自LSB开始相同的比特位。
具体的,自第一排布方式的数据结构表示的LSB和第二排布方式的数据结构表示的LSB开始,逐位地比较各个比特位是否相同,若相同则可以进一步前一位(也即,更高一位)的比特位是否相同,直至被比较的比特位不同。采用这样的方案,能够得到最大的公共块的尺寸,使得拷贝效率最大化。
在一个可能的例子中,第一排布方式的数据结构表示和第二排布方式的数据结构表示仅LSB相同。
在另一个可能的例子中,第一排布方式的数据结构表示和第二排布方式的数据结构表示自LSB开始连续多个比特位相同。
在又一个可能的例子中,第一排布方式的数据结构表示的LSB和第二排布方式的数据结构表示的LSB不同。在这种情况下,公共块仅包括单个像素数据,由此,可以采用上文中所描述的逐像素的拷贝方案。
进一步地,根据相同的比特位以及相同的比特位所对应的维度,可以确定公共块的尺寸。
下面以具体的例子对公共块的尺寸的确定进行具体描述。
例1:源图像为二维图像,第一排布方式的数据结构表示为:X6Y6X5Y5X4Y4X3Y3X2Y2Y1Y0X1X0,第二排布方式的数据结构表示为:X6Y6X5Y5X4Y4X3Y3Y2X2Y1Y0X1X0。
对比第一排布方式和第二排布方式的数据结构表示,自从LSB开始连续的多个相同的比特位为Y1Y0X1X0。由于X为二维图像的宽度,Y为二维图像的高度,因此,公共块的宽度blockwidth=2^ (1+1)=4,公共块的高度block height =2^ (1+1)=4,也即,公共块的尺寸为4×4,在步骤S42中可以以4×4的公共块为单位进行拷贝。其中,“^”表示乘方。
例2:源图像为二维图像,第一排布方式的数据结构表示为:X6Y6X5Y5X4Y4X3Y3X2Y2Y1Y0X1X0,第二排布方式为:X3X2X1X0。也即,第二排布方式为线性排布。
对比第一排布方式和第二排布方式的数据结构表示,自从LSB开始连续的多个相同的比特位为X1X0,由于X对应的维度为宽度维度,因此,公共块的宽度blockwidth=2^ (1+1)=4,公共块的高度block height =2^ 0=1。由此,可以得到公共块的尺寸为4×1,在步骤42中可以以4×1的公共块为单位进行拷贝。
例3,源图像为三维图像,第一排布方式的数据结构表示为:X6Y6X5Y5X4Y4X3Y3X2Y2D1D0Y1Y0X1X0,第二排布方式的数据结构表示为:X6Y6X5Y5X4Y4X3Y3X2Y2D1Y1X1D0Y0X0。对比第一排布方式和第二排布方式的数据结构表示,自从LSB开始相同的比特位为X0,因此,公共块的宽度blockwidth=2^ 1=2,公共块的高度block height =1,公共块的深度block depth=1。因此,公共块的尺寸为2×1×1。
例4,源图像为三维图像,第一排布方式的数据结构表示为:X6Y6X5Y5X4Y4X3Y3X2Y2Z1Z0Y1Y0X1X0,第二排布方式的数据结构表示为:X6Y6X5Y5X4Y4X3Y3X2Z1Y2Z0Y1Y0X1X0,自从LSB开始相同的比特位为Z0Y1Y0X1X0,因此,公共块的宽度blockwidth=2^ (1+1)=4,公共块的高度block height =2^(1+1)=4,公共块的深度block depth=2^1=2。因此,公共块的尺寸为4×4×2。
在步骤S42中,以公共块为单位进行拷贝。
具体而言,假设公共块包括R个像素数据,则在一次拷贝操作中可以一次性的拷贝R个像素数据。其中,R为大于1的正整数。所需的拷贝次数为逐像素拷贝的拷贝次数的1/R。
若源图像为二维图像,公共块的尺寸为(blockwidth,blockheight),则在1次拷贝操作中,拷贝的像素数据的数量为blockwidth×blockheight。例如,公共块的尺寸为4×4,则一次可以拷贝16个像素数据,相应的,拷贝次数仅为逐像素拷贝所需的拷贝次数的1/16。
如源图像为三维图像,假设公共块的尺寸为(blockwidth,blockheight,depth),则在1次拷贝操作中,拷贝的像素数据的数量为blockwidth×blockheight×depth。例如,公共块的尺寸为4×4×2,则一次可以拷贝16个像素数据,相应的,拷贝次数仅为逐像素拷贝所需的拷贝次数的1/16。因此,以公共块的粒度进行拷贝,能够明显降低拷贝次数。
下面以1次公共块的拷贝过程为例对步骤S42进行具体描述。
首先,可以根据公共块的尺寸,确定当前次拷贝操作的起始像素数据。
具体而言,当前次拷贝操作的起始像素数据可以是当前次所需拷贝的公共块中的起始像素数据。也即,该像素数据在公共块内的各个维度的索引均为0。
更具体的,可以根据上一次拷贝操作的起始像素数据在图像中的索引和公共块的尺寸,确定当前次拷贝操作的起始像素数据在图像中的索引。此处的图像可以是源图像,也可以是指目标图像,同一像素数据在源图像和目标图像中的索引是相同的。
以源图像为二维图像为例,当前次拷贝操作的起始像素数据在图像中的索引为(xoffset’,yoffset’),xoffset’= xoffset+ blockwidth,yoffset’= yoffset+blockheight。其中,(xoffset,yoffset)为上一次拷贝操作的起始像素数据在图像中的索引。
以源图像为三维图像为例,当前次拷贝操作的起始像素数据在图像中的为(xoffset’,yoffset’,zoffset’),xoffset’= xoffset+ blockwidth,yoffset’= yoffset+blockheight, zoffset’= zoffset+ blockdepth。其中,(xoffset,yoffset,zoffset)为上一次拷贝操作的起始像素数据在图像中的索引。
进一步地,可以计算当前次拷贝操作的起始像素数据在第一存储装置中的存储地址,记为源地址。进一步地,在源地址的基础上,结合拷贝数据长度,即可确定当前次所拷贝的公共块在第一存储装置中的存储区域,记为源存储区域。其中,所述拷贝数据长度根据所述公共块的尺寸和像素数据所占字节数确定。
具体的,可以先计算当前次拷贝操作的起始像素数据在第一存储装置中相对于源图像在第一存储装置中起始地址的偏移,然后根据所述偏移和源图像在第一存储装置中的起始地址,可以得到当前次拷贝操作的源地址。
关于当前次拷贝操作的起始像素数据在第一存储装置中的存储地址可以是根据第一排布方式计算得到,具体计算过程可以参照上文关于步骤一至步骤三的相关描述,在此不再赘述。
类似的,可以计算当前次拷贝操作的起始像素数据在第二存储装置中的存储地址,记为目标地址。进一步地,在目标地址的基础上,结合公共块尺寸和像素数据所占字节数,即可确定当前次所拷贝的公共块在第二存储装置中的存储区域,记为目标存储区域。
具体的,可以先计算当前次拷贝操作的起始像素数据在第二存储装置中相对于目标图像在第二存储装置中起始地址的偏移。然后根据所述偏移和目标图像在第二存储装置中的起始地址,可以得到当前次拷贝操作的目标地址。
关于当前次拷贝操作的起始像素数据在第二存储装置中的存储地址可以是根据第二排布方式计算得到,具体计算过程可以参照上文关于步骤一至步骤三的相关描述,在此不再赘述。
进一步地,可以将源存储区域的像素数据拷贝至目标存储区域。其中,源存储区域和目标存储区域中像素数据的排布是相同的。
由上,本发明实施例的方案中,以公共块为粒度进行拷贝,由于公共块内的多个像素数据在所述第一存储装置中的排布和在所述第二存储装置中的排布是相同的,因此,在拷贝过程中无需针对公共块内的像素数据逐个计算源地址和目标地址,GPU也无需理解公共块内部像素数据的排布方式。因此,以公共块为粒度进行拷贝,在保证准确拷贝的前提下能够有效提高拷贝效率,由此节省了拷贝次数也有利于降低算力资源的开销。采用本发明实施例提供的方案中,GPU的硬件资源只需支持在从源地址拷贝一定长度的像素数据至目标地址的功能,硬件无需理解图像的排布方式。因此,本发明实施例的方案能够应用于各种GPU上,以使得该GPU能够实现各种跨存储装置的数据拷贝任务。
可以理解的是,在具体实施中,上述方法可以采用软件程序的方式实现,该软件程序运行于芯片或芯片模组内部集成的处理器中;或者,该方法可以采用硬件或者软硬结合的方式来实现,例如用专用的芯片或芯片模组来实现,或者,用专用的芯片或芯片模组结合软件程序来实现。
参照图5,图5是本发明实施例中的一种数据拷贝装置的结构示意图,图3示出的装置可以包括:
公共块确定模块51,用于根据第一排布方式和第二排布方式,确定公共块的尺寸,所述第一排布方式为源图像在第一存储装置中的排布方式,所述第二排布方式为目标图像在第二存储装置中的排布方式,所述第一排布方式和第二排布方式不同,公共块内的多个像素数据在所述第一存储装置中的排布和在所述第二存储装置中的排布是相同的;
拷贝模块52,用于以所述公共块为单位,将所述源图像拷贝至所述第二存储装置中,得到所述目标图像。
关于本发明实施例中的数据拷贝装置的工作原理、工作方法和有益效果等更多内容,可以参照上文关于数据拷贝方法的相关描述,在此不再赘述。
本发明实施例还提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器运行时,执行上述的计算机可读方法的步骤。所述存储介质可以包括ROM、RAM、磁盘或光盘等。所述存储介质还可以包括非挥发性存储器(non-volatile)或者非瞬态(non-transitory)存储器等。
本发明实施例还提供一种电子设备,包括存储器和处理器,所述存储器上存储有可在所述处理器上运行的计算机程序,所述处理器运行所述计算机程序时执行上述的计算机可读方法的步骤。所述终端包括但不限于手机、计算机、平板电脑等终端设备。所述电子设备可以配置有GPU。
应理解,本发明实施例中,所述处理器可以为中央处理单元(central processingunit,简称 CPU),该处理器还可以是其他通用处理器、数字信号处理器(digital signalprocessor,简称 DSP)、专用集成电路(application specific integrated circuit,简称ASIC)、现成可编程门阵列(field programmable gate array,简称 FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
还应理解,本发明实施例中的存储器可以是易失性存储器或非易失性存储器,或可包括易失性和非易失性存储器两者。其中,非易失性存储器可以是只读存储器(read-only memory,简称 ROM)、可编程只读存储器(programmable ROM,简称 PROM)、可擦除可编程只读存储器(erasable PROM,简称 EPROM)、电可擦除可编程只读存储器(electricallyEPROM,简称 EEPROM)或闪存。易失性存储器可以是随机存取存储器(random accessmemory,简称 RAM),其用作外部高速缓存。通过示例性但不是限制性说明,许多形式的随机存取存储器(random access memory,简称 RAM)可用,例如静态随机存取存储器(staticRAM,简称 SRAM)、动态随机存取存储器(DRAM)、同步动态随机存取存储器(synchronousDRAM,简称 SDRAM)、双倍数据速率同步动态随机存取存储器(double data rate SDRAM,简称 DDR SDRAM)、增强型同步动态随机存取存储器(enhanced SDRAM,简称ESDRAM)、同步连接动态随机存取存储器(synchlink DRAM,简称 SLDRAM)和直接内存总线随机存取存储器(direct rambus RAM,简称 DR RAM)
上述实施例,可以全部或部分地通过软件、硬件、固件或其他任意组合来实现。当使用软件实现时,上述实施例可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令或计算机程序。在计算机上加载或执行所述计算机指令或计算机程序时,全部或部分地产生按照本发明实施例所述的流程或功能。所述计算机可以为通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机程序可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机程序可以从一个网站站点、计算机、服务器或数据中心通过有线或无线方式向另一个网站站点、计算机、服务器或数据中心进行传输。
在本发明所提供的几个实施例中,应该理解到,所揭露的方法、装置和系统,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的;例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式;例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理包括,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。例如,对于应用于或集成于芯片的各个装置、产品,其包含的各个模块/单元可以都采用电路等硬件的方式实现,或者,至少部分模块/单元可以采用软件程序的方式实现,该软件程序运行于芯片内部集成的处理器,剩余的(如果有)部分模块/单元可以采用电路等硬件方式实现;对于应用于或集成于芯片模组的各个装置、产品,其包含的各个模块/单元可以都采用电路等硬件的方式实现,不同的模块/单元可以位于芯片模组的同一组件(例如芯片、电路模块等)或者不同组件中,或者,至少部分模块/单元可以采用软件程序的方式实现,该软件程序运行于芯片模组内部集成的处理器,剩余的(如果有)部分模块/单元可以采用电路等硬件方式实现;对于应用于或集成于终端的各个装置、产品,其包含的各个模块/单元可以都采用电路等硬件的方式实现,不同的模块/单元可以位于终端内同一组件(例如,芯片、电路模块等)或者不同组件中,或者,至少部分模块/单元可以采用软件程序的方式实现,该软件程序运行于终端内部集成的处理器,剩余的(如果有)部分模块/单元可以采用电路等硬件方式实现。
应理解,本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A 和/或 B,可以表示:单独存在 A,同时存在A 和 B,单独存在 B 这三种情况。另外,本文中字符“/”,表示前后关联对象是一种“或”的关系。
本发明实施例中出现的“多个”是指两个或两个以上。本发明实施例中出现的第一、第二等描述,仅作示意与区分描述对象之用,没有次序之分,也不表示本发明实施例中对设备个数的特别限定,不能构成对本发明实施例的任何限制。虽然本发明披露如上,但本发明并非限定于此。任何本领域技术人员,在不脱离本发明的精神和范围内,均可作各种更动与修改,因此本发明的保护范围应当以权利要求所限定的范围为准。
虽然本发明披露如上,但本发明并非限定于此。任何本领域技术人员,在不脱离本发明的精神和范围内,均可作各种更动与修改,因此本发明的保护范围应当以权利要求所限定的范围为准。