用于二元操作的数据访问控制系统及其方法转让专利

申请号 : CN202210023259.2

文献号 : CN114091085B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 郭冉柳俊丞郑泽康

申请人 : 北京一流科技有限公司

摘要 :

本公开涉及一种用于二元操作的数据访问控制系统及其方法。所述系统包括:数据接口组件,获取用于二元操作的第一输入数据和第二输入数据的维度数量、维度尺寸以及所处内存地址指针;维度推导组件,确定所获取的将被用于二元操作的第一输入数据和第二输入数据的形状是否相同,并对于彼此不同的第一输入数据和第二输入数据,通过数据维度充填和形状扩展,推导出输出数据的维度和维度尺寸;以及维度简化组件,通过从无需充填或已经完成充填的第一输入数据和第二输入数据删除维度尺寸为1的相同维度或合并彼此相同的相邻维度,获得维度简化的第一输入数据和第二输入数据。

权利要求 :

1.一种用于二元操作的数据访问控制系统,包括:数据接口组件,获取用于二元操作的第一输入数据和第二输入数据的维度数量、维度尺寸以及所处内存地址指针;

维度推导组件,确定所获取的将被用于二元操作的第一输入数据和第二输入数据的形状是否相同,并对于彼此不同的第一输入数据和第二输入数据,通过数据维度充填和维度尺寸扩展,推导出输出数据的维度和维度尺寸;以及维度简化组件,通过从无需充填或已经完成充填的第一输入数据和第二输入数据删除维度尺寸为1的相同维度或合并彼此相同的相邻维度,获得维度简化的第一输入数据和第二输入数据。

2.根据权利要求1所述的用于二元操作的数据访问控制系统,还包括:向量化组件,在确定第一输入数据和第二输入数据的末维的维度尺寸都大于1并且第一输入数据和第二输入数据所处内存空间的地址指针和末维的维度尺寸为2或4的整数倍的情形下,将第一输入数据和第二输入数据的末维的维度尺寸以2或4个元素为一组进行分割成多组,以便第一输入数据和第二输入数据能够在末维的维度上以2或4个元素为一组进行向量化存取。

3.根据权利要求1所述的用于二元操作的数据访问控制系统,还包括:向量化组件,在确定第一输入数据末维的维度尺寸大于1而第二输入数据的末维的维度尺寸等于1并且第一输入数据所处内存空间的地址指针和末维的维度尺寸为2或4的整数倍,将第一输入数据的末维的维度以2或4个元素为一组进行分割成多组,以便第一输入数据能够在末维的维度上以2或4个元素为一组进行向量化存取。

4.根据权利要求1所述的用于二元操作的数据访问控制系统,还包括:向量化组件,在作为二维数据的第一输入数据和第二输入数据所处内存空间的地址指针为2或4的整数倍的情况下,将第一输入数据和第二输入数据的第二维以2或4个元素为一组进行分割成多组,并在最后不足2或4的元素分割成为所属行的最后一组, 并依次判断每个元素的第一维标记数是否超过第二维的尺寸,并在超过时使得该元素的第一维标记数递增1,以便第一输入数据和第二输入数据能够在第二维度上按组进行向量化存取。

5.根据权利要求1所述的用于二元操作的数据访问控制系统,还包括:分片组件,在确定第一输入数据和第二输入数据的沿着其中所选择维度的数据量之和大于为其分配的缓存空间的情况下,将第一输入数据和第二输入数据基于所选择维度平均分割成多个分片数据,以便沿着所选择维度的分片数据量之和小于所分配的缓存空间。

6.一种用于二元操作的数据访问控制方法,包括:获取用于二元操作的第一输入数据和第二输入数据的维度数量、维度尺寸以及所处内存地址指针;

确定所获取的将被用于二元操作的第一输入数据和第二输入数据的形状是否相同;

对于彼此不同的第一输入数据和第二输入数据,通过数据维度充填和维度尺寸扩展,推导出输出数据的维度和维度尺寸;以及通过从无需充填或已经完成充填的第一输入数据和第二输入数据删除维度尺寸为1的相同维度或合并彼此相同的相邻维度,获得维度简化的第一输入数据和第二输入数据。

7.根据权利要求6所述的用于二元操作的数据访问控制方法,还包括:确定第一输入数据和第二输入数据的末维的维度尺寸是否都大于1;

第一输入数据和第二输入数据所处内存空间的地址指针和末维的维度尺寸是否为2或

4的整数倍;

在确定第一输入数据和第二输入数据的末维的维度尺寸都大于1并且第一输入数据和第二输入数据所处内存空间的地址指针和末维的维度尺寸为2或4的整数倍的情形下,将第一输入数据和第二输入数据的末维的维度尺寸以2或4个元素为一组进行分割成多组,以便第一输入数据和第二输入数据能够在末维维度上以2或4个元素为一组进行向量化存取。

8.根据权利要求6 所述的用于二元操作的数据访问控制方法,还包括:确定第一输入数据末维的维度尺寸大于1而第二输入数据的末维的维度尺寸等于1;

确定第一输入数据所处内存空间的地址指针和末维的维度尺寸是否都为2或4的整数倍;

在确定第一输入数据末维的维度尺寸都大于1和第二输入数据的末维的维度尺寸等于

1并且第一输入数据所处内存空间的地址指针和末维的维度尺寸为2或4的整数倍,将第一输入数据的末维的维度以2或4个元素为一组进行分割成多组,以便第一输入数据能够在末维的维度上以2或4个元素为一组进行向量化存取。

9.根据权利要求6所述的用于二元操作的数据访问控制方法,还包括:确定作为二维数据的第一输入数据和第二输入数据所处内存空间的地址指针是否为2或4的整数倍;以及

在作为二维数据的第一输入数据和第二输入数据所处内存空间的地址指针为2或4的整数倍的情况下,将第一输入数据和第二输入数据的第二维以2或4个元素为一组进行分割成多组,并在最后不足2或4的元素分割成为所属行的最后一组,并依次判断每个元素的第一维标记数是否超过第二维的尺寸,并在超过时使得该元素的第一维标记数递增1,以便第一输入数据和第二输入数据能够在第二维度上按组进行向量化存取。

10.根据权利要求6所述的用于二元操作的数据访问控制方法,还包括:在确定第一输入数据和第二输入数据的沿着其中所选择维度的数据量之和大于为其分配的缓存空间的情况下,将第一输入数据和第二输入数据基于所选择维度平均分割成多个分片数据,以便沿着所选择维度的分片数据量之和小于所分配的缓存空间。

说明书 :

用于二元操作的数据访问控制系统及其方法

技术领域

[0001] 本公开涉及一种数据处理技术。更具体地说,本公开涉及一种用于二元操作的数据访问控制系统及其方法。

背景技术

[0002] 在深度学习普及的现在,二元操作在深度学习的网络中十分常见,包括二元的计算操作(加/减/乘/除)、二元逻辑操作(与/或/非/异或)等等。二元操作的两个输入数据可
能是相同形状数据,也可能是不同形状的数据。二元操作作为一种简单操作,在深度学习中
一种密集型简单运算,因此,在二元操作中,就会频繁进行数据的加载和保存,因此数据加
载和保存往往是深度学习网络中的性能瓶颈,因此如何减少数据加载和保存的频度,对提
高深度学习网络的性能具有现实的意义。
[0003] 因此,人们需要一种能够减少数据加载和保存频度的二元操作方法和技术,从而提高数据处理系统的性能。

发明内容

[0004] 本发明的一个目的是解决至少上述问题,具体而言,本公开提供一种用于二元操作的数据访问控制系统,包括:数据接口组件,获取用于二元操作的第一输入数据和第二输
入数据的维度数量、维度尺寸以及所处内存地址指针;维度推导组件,确定所获取的将被用
于二元操作的第一输入数据和第二输入数据的形状是否相同,并对于彼此不同的第一输入
数据和第二输入数据,通过数据维度充填和形状扩展,推导出输出数据的维度和维度尺寸;
以及维度简化组件,通过从无需充填或已经完成充填的第一输入数据和第二输入数据删除
维度尺寸为1的相同维度或合并彼此相同的相邻维度,获得维度简化的第一输入数据和第
二输入数据。
[0005] 根据本公开的用于二元操作的数据访问控制系统,还包括:向量化组件,在确定第一输入数据和第二输入数据的末维的维度尺寸都大于1并且第一输入数据和第二输入数据
所处内存空间的地址指针和末维的维度尺寸为2或4的整数倍的情形下,将第一输入数据和
第二输入数据的末维的维度尺寸以2或4个元素为一组进行分割成多组,以便第一输入数据
和第二输入数据能够在末维维度上以2或4个元素为一组同时进行向量化存取。
[0006] 根据本公开的用于二元操作的数据访问控制系统,还包括:向量化组件,在确定第一输入数据末维的维度尺寸大于1而第二输入数据的末维的维度尺寸等于1并且第一输入
数据所处内存空间的地址指针和末维的维度尺寸为2或4的整数倍,将第一输入数据的末维
的维度以2或4个元素为一组进行分割成多组,以便第一输入数据能够在末维维度上以2或4
个元素为一组进行向量化存取。
[0007] 根据本公开的用于二元操作的数据访问控制系统,还包括:向量化组件,在作为二维数据的第一输入数据和第二输入数据所处内存空间的地址指针为2或4的整数倍的情况
下,将第一输入数据和第二输入数据的第二维以2或4个元素为一组进行分割成多组,并在
确定最后一组的元素的相对初始位置的偏移量超过第二维的尺寸时,使得该元素的第一维
标记数递增1,以便第一输入数据和第二输入数据能够在第二维度上按组进行向量化存取。
[0008] 根据本公开的用于二元操作的数据访问控制系统,还包括:分片组件,在确定第一输入数据和第二输入数据的沿着其中所选择维度的数据量之和大于为其分配的缓存空间
的情况下,将第一输入数据和第二输入数据基于所选择维度平均分割成多个分片数据,以
便沿着所选择维度的分片数据量之和小于所分配的缓存空间。
[0009] 根据本公开的另一个方面,提供了一种用于二元操作的数据访问控制方法,包括:获取用于二元操作的第一输入数据和第二输入数据的维度数量、维度尺寸以及所处内存地
址指针;确定所获取的将被用于二元操作的第一输入数据和第二输入数据的形状是否相
同;对于彼此不同的第一输入数据和第二输入数据,通过数据维度充填和形状扩展,推导出
输出数据的维度和维度尺寸;以及通过从无需充填或已经完成充填的第一输入数据和第二
输入数据删除维度尺寸为1的相同维度或合并彼此相同的相邻维度,获得维度简化的第一
输入数据和第二输入数据。
[0010] 根据本公开的用于二元操作的数据访问控制方法,还包括:确定第一输入数据和第二输入数据的末维的维度尺寸是否都大于1;第一输入数据和第二输入数据所处内存空
间的地址指针和末维的维度尺寸是否为2或4的整数倍;在确定第一输入数据和第二输入数
据的末维的维度尺寸都大于1并且第一输入数据和第二输入数据所处内存空间的地址指针
和末维的维度尺寸为2或4的整数倍的情形下,将第一输入数据和第二输入数据的末维的维
度尺寸以2或4个元素为一组进行分割成多组,以便第一输入数据和第二输入数据能够在末
维维度上以2或4个元素为一组进行向量化存取。
[0011] 根据本公开的用于二元操作的数据访问控制方法,还包括:确定第一输入数据末维的维度尺寸大于1而第二输入数据的末维的维度尺寸等于1;确定第一输入数据所处内存
空间的地址指针和末维的维度尺寸是否都为2或4的整数倍;在确定第一输入数据末维的维
度尺寸大于1而第二输入数据的末维的维度尺寸等于1并且第一输入数据所处内存空间的
地址指针和末维的维度尺寸为2或4的整数倍,将第一输入数据的末维的维度以2或4个元素
为一组进行分割成多组,以便第一输入数据能够在末维维度上以2或4个元素为一组进行向
量化存取。
[0012] 根据本公开的用于二元操作的数据访问控制方法,还包括:确定作为二维数据的第一输入数据和第二输入数据所处内存空间的地址指针是否为2或4的整数倍;以及在作为
二维数据的第一输入数据和第二输入数据所处内存空间的地址指针为2或4的整数倍的情
况下,将第一输入数据和第二输入数据的第二维以2或4个元素为一组进行分割成多组,并
在最后不足2或4的元素分割成为所属行的最后一组,并依次判断每个元素的第一维标记数
是否超过第二维的尺寸,并在超过时使得该元素的第一维标记数递增1,以便第一输入数据
和第二输入数据能够在第二维度上按组进行向量化存取。
[0013] 根据本公开的用于二元操作的数据访问控制方法,还包括:在确定第一输入数据和第二输入数据的沿着其中所选择维度的数据量之和大于为其分配的缓存空间的情况下,
将第一输入数据和第二输入数据基于所选择维度平均分割成多个分片数据,以便沿着所选
择维度的分片数据量之和小于所分配的缓存空间。
[0014] 通过根据本公开的一种用于二元操作的数据访问控制系统及方法,对数据输入数据进行存取控制,一方面通过维度简化,减少数据量以及数据运算量,另一方面通过对数据
进行向量化和分块,实现向量化存取,充分利用内存带宽,将多个数据打包成更大的数据类
型进行存取,计算时再一个个元素计算,因此在二元操作时提升整体性能。
[0015] 本发明的其它优点、目标和特征将部分通过下面的说明体现,部分还将通过对本发明的研究和实践而为本领域的技术人员所理解。

附图说明

[0016] 图1所示的是根据本公开的用于二元操作的数据访问控制系统的原理示意图。
[0017] 图2所示的是根据本公开的用于二元操作的数据访问控制系统100进行向量化存取的第一实例示意图。
[0018] 图3所示的是根据本公开的用于二元操作的数据访问控制系统100进行向量化存取的第二实例示意图。
[0019] 图4所示的是根据本公开的用于二元操作的数据访问控制系统100进行向量化存取的第三实例示意图。
[0020] 图5所示的是根据本公开的用于二元操作的数据访问控制系统100进行数据分片存取的实例示意图。

具体实施方式

[0021] 下面结合实施例和附图对本发明做进一步的详细说明,以令本领域技术人员参照说明书文字能够据以实施。
[0022] 这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例
中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附
权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。
[0023] 在本公开使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本开。在本公开和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形
式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含
一个或多个相关联的列出项目的任何或所有可能组合。
[0024] 应当理解,尽管在本公开可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离
本公开范围的情况下,在下文中,两个二元操作的输入数据之一可以被称为第一输入数据
也可以被称为第二输入数据。取决于语境,如在此所使用的词语“如果”可以被解释成为
“在……时”或“当……时”或“响应于确定”。
[0025] 为了使本领域技术人员更好地理解本公开,下面结合附图和具体实施方式对本公开作进一步详细说明。
[0026] 图1所示的是根据本公开的用于二元操作的数据访问控制系统100的原理示意图。如图1所示,数据访问控制系统100包括:数据接口组件110、维度推导组件120以及维度简化
组件130。所述数据接口组件110获取用于二元操作的第一输入数据Src0和第二输入数据
Src1的维度数量、维度尺寸以及所处内存地址指针。
[0027] 作为二元操作的第一输入数据Src0和第二输入数据Src1,存在三种情况,第一输入数据Src0和第二输入数据Src1为张量、第一输入数据Src0为标量而第二输入数据Src1为
张量或者第一输入数据Src0为张量而第二输入数据Src1为标量。因此,根据本公开的数据
接口组件110包含三种数据接口组件分别为数据接口组件110‑1、数据接口组件110‑2以及
数据接口组件110‑3,其分别可以通过不同Launch来实现。
[0028] 在Src0和Src1均为张量(Tensor)的情况下,通过下面的launch来实现:
[0029] void Launch(StreamContext* stream ctx,size t num src0 dims  ,const int64 t* src0 dims  ,const void* src0  ,size t num srcl dims  ,const int64 t* 
srcl dims ,const void* srcl ,void* dst)
[0030] 在该数据接口组件中,获取第一输入数据Src0的维度数num_src0_dims、各个维度的形状参数src0_dims以及其指针src0,第二输入数据Src1的维度数num_src1_dims、各个
维度的形状参数src1_dims以及其指针src1,还获得输出数据Dst的指针。第一输入数据
Src0和第二输入数据Src1可以是相同形状的,也可以是不同形状的。
[0031] 在第一输入数据Src0为标量(Scalar)而第二输入数据Src1为张量的情况下,通过下面的launch来实现:
[0032] void Launc h(StreamContext* stream_ctx,Scalar src0,size_t num_srcl_dims,const_int64_t* srcl_dims ,const void* srcl,void*dst)
[0033] 在该数据接口组件中,获取第二输入数据Src1的维度数num_src1_dims、各个维度的形状参数src1_dims以及其指针src1,第一输入数据src0,还获得输出数据Dst的指针。
[0034] 在第一输入数据Src0为张量而第二输入数据Src1为标量(Scalar)的情况下,通过下面的launch来实现:
[0035] void Launch(StreamContext* stream_ctx,size_t num src0 dims,const int64 t* src0_dims ,const void* src0 ,Scalar srcl ,void* dst)
[0036] 在该数据接口组件110中,获取第一输入数据Src0的维度数num_src0_dims、各个维度的形状参数src0_dims以及其指针src0,第二输入数据src0,还获得输出数据Dst的指
针。
[0037] 维度推导组件120确定所获取的将被用于二元操作的第一输入数据Src0和第二输入数据Src1的形状是否相同,并对于彼此不同的第一输入数据和第二输入数据,通过数据
维度充填和形状扩展,使得第一输入数据Src0和第二输入数据Src1具有相同的维度和维度
尺寸。具体而言,维度推导组件120进行输出数据的维度推导。
[0038] 具体而言,在第一输入数据Src0和第二输入数据Src1的维度相同但是某个维度的维度尺寸不同的情况下(例如同一维度的元素数量不同),如果某一维度的维度尺寸为1,则
可以在该数据的该维度上进行扩展(Broadcast),对于维度尺寸不为1的维度,不能进行该
扩展。这些扩展在实际进行计算时通过反复调用同一元素的方式进行。举例而言,例如:若
第一输入数据Src0的输入形状为 (10,3,5),第二输入数据Src1的输入形状为 (1,3,1),则
会在第二输入数据Src1的第0维和第3维上扩展后进行二元操作,得到输出数据Dst的形状
为(10,3,5)。或者,例如,第一输入数据Src0的输入形状src0_dims(10,2),第二输入数据
Src1的输入形状为src1_dims(10,1) 维度推导组件120通过推导得到dst(10,2)。概括而
言,就是dst_dim 为max(src0_dim,src1_dim),并且对为1的那个维度的维度尺寸(dim)进
行扩展。或者举例而言,若第一输入数据Src0的输入形状为 (10,3,5),第二输入数据Src1
的输入形状为 (2,3,2),因为任何一维上Src0和Src1不相同,但都不为1,因此无法扩展。
[0039] 在第一输入数据Src0的维度num_src0_dims和第二输入数据Src1的维度num_src1_dims不相等时,则维度推导组件120首先对较小维度的dims向左充填,使得充填后第
一输入数据Src0的维度num_src0_dims和第二输入数据Src1的维度num_src1_dims相同。在
两者充填到相同dims后,按按照相同情形下的推导方式进行Dst维度推导。举例而言,如果
第一输入数据Src0的输入形状为src0_dims(10,2,3),第二输入数据Src1的输入形状为 
src1_dims(2,3),则维度推导组件120先会对第二输入数据Src1的输入形状 src1_dims(2,
3)向左充填1到第二输入数据Src1经过充填后的输入形状 src1_dims (1,2,3),再由第一
输入数据Src0的输入形状src0_dims(10,2,3)以及第二输入数据Src1经过充填后的输入形
状 src1_dims (1,2,3)推导得到dst: (10,2,3)。或者,例如,如果第一输入数据Src0的输
入形状为src0_dims(2,3),第二输入数据Src1的输入形状为 src1_dims(10,2,2,1),则维
度推导组件120先会对维度较小的第一输入数据Src0的输入形状src0_dims(2,3)向左充填
1到第一输入数据Src0经过充填后的输入形状的src0_dims Src0(1,1,2,3),再由第一一输
入数据Src0的经过充填后的输入形状 src0_dims(1,1,2,3)以及第二输入数据Src1的输入
形状 src1_dims(10,2,2,1)推导得到dst(10,2,2,3)。
[0040] 随后,如图1所示,维度简化组件130通过从无需充填或已经充填的第一输入数据Src0和第二输入数据Src1删除维度尺寸为1的相同维度或合并彼此相同的相邻维度,获得
维度简化的第一输入数据Src0和第二输入数据Src1。通俗而言,维度简化组件130就是遍历
两个输入数据中的所有维度,然后去掉两个输入数据中对应维度且维度尺寸为1的维度。举
例来说,如果第一输入数据Src0的输入形状为src0_dims(10,1,5),第二输入数据Src1的输
入形状为 src1_dims(10,1,1),则两者对应的第二维的维度尺寸都为1,则可以同时删除第
二维,从而使得经过删除处理后的第一输入数据Src0的输入形状为src0_dims(10,5),第二
输入数据Src1的输入形状为 src1_dims s(10,1)。这样就是的输入数据得到维度简化,使
得随后的二元操作变得简单,从而减少了二元操作中存取数据的频度,提高了二元操作的
效率,也就提升了整体性能。在另一种情况下维度简化组件130遍历两个输入数据中的所有
维度,基于遍历所维度信息,可以对两个输入数据中的对应相邻且形状尺寸形同的两个维
度进行合并成一个维度。举例而言,如果第一输入数据Src0的输入形状为src0_dims(10,2,
3,5,1),第二输入数据Src1的输入形状为 src1_dims(2,3,1,1)。在进行推导过程中进行充
填之后,第二输入数据Src1的经过充填后的输入形状为 src1_dims(1,2,3,1,1)。此时,第
一输入数据Src0的输入形状src0_dims(10,2,3,5,1)和第二输入数据Src1的经过充填后的
输入形状src1_dims(1,2,3,1,1)在各自第2维度和第3维度是具有对应相等的维度尺寸,因
此可以将两者各自的第2和3维度合并为一个维度,其尺寸为两个相邻维度的尺寸乘积,例
如为6,这样这两个维度的总元素数量没有发生变化。经过合并之后,第一输入数据Src0的
合并后的输入形状为src0_dims(10,6,5,1),第二输入数据Src1的合并后的输入形状为 
src1_dims(1,6,1,1)。需要指出的是,在合并的同时,可以同时进行维度删除,例如第一输
入数据Src0的合并后的输入形状src0_dims(10,6,5,1)与第二输入数据Src1的合并后的输
入形状src1_dims(1,6,1,1)在第四维度的尺寸都为1,因此可以删除各自的第4维度,因此
通过合并和删除后的维度数量为3维,即第一输入数据Src0的维度合并和删除后的输入形
状为src0_dims(10,6,5),第二输入数据Src1的维度合并和删除后的输入形状为 src1_
dims(1,6,1)。在此基础上,维度推导组件120再基于第一输入数据Src0的维度合并和删除
后的输入形状src0_dims(10,6,5)和第二输入数据Src1的维度合并和删除后的输入形状
src1_dims(1,6,1)基础上推导出输出数据的维度和形状为dst_dims:(10,6,5)。
[0041] 这样,通过维度填充以及维度简化,使得输入数据在被用于进行二元操作时数据的存取频度降低,极大地缩减二元操作的计算量,从而显著提高二元操作的速度,提升了包
含二元操作的数据处理的速度和性能。
[0042] 可选择地,如图1所述,本公开的用于二元操作的数据访问控制系统100还包括向量化组件140。由于多维数据在进行存储过程中,都展开成一维进行存储,因此在进行存取
时能够依据末维进行数据连续存取。为此,本公开可以按照末维进行数据向量化存取,充分
利用内存带宽减少数据的存储的频度,使得一次存取的数据量更大。为此,本公开的向量化
组件140在第一输入数据Src0和第二输入数据Src1的末维的维度尺寸相等且都大于1,并且
第一输入数据Src0和第二输入数据Src1所处内存空间的地址指针和末维的维度尺寸为2或
4的整数倍的情形下,将第一输入数据和第二输入数据的末维的维度尺寸以2或4个元素为
一组进行分割成多组,以便第一输入数据和第二输入数据能够在末维维度上以2或4个元素
为一组同时进行向量化存取。
[0043] 图2所示的是根据本公开的用于二元操作的数据访问控制系统100进行向量化存取的第一实例示意图。如图2所示,作为一个例子,显示了第一输入数据Src0和第二输入数
据Src1的最后一维,包含有8个元素。在实际数据中,维度可以为多维,为方便描述起见,仅
仅显示一维。为了一次存取更大的数据量,首先需要数据存储的地址指针数量为一次存取
数据量的整数倍。因此,向量化组件140首先基于第一输入数据的地址空间的指针src0以及
第二输入数据的地址空间的指针src1是否是2或4的整数倍,如果是,则确定第一输入数据
Src0和第二输入数据Src1的最后一维的维度尺寸是否为2或4的整数倍。如果是2或4的整数
倍,则优先选择4作为向量化的尺寸(pack_size),即将第一输入数据Src0和第二输入数据
Src1的最后一维的维度尺寸从8修改为2。如果不是4是的倍数是2的倍数,则将将第一输入
数据Src0和第二输入数据Src1的最后一维的维度尺寸从8修改为4。通过这种方式对输入数
据的存取控制,使得随后的二元操作的逻辑节点在进行二元操作时在逐一读取和存取元素
时,一次可以针对最后一维读取2个或4个元素构成的向量化数据,从而极大地减少了二元
操作在进行数据存取是的频度。需要指出的是,尽管这里对数据进行了向量化,但是在实际
计算时,还是针对每个向量化数据中的每个元素进行逐一二元操作。在进行向量化处理后,
维度推导组件120还是需要进行重新推导,获得修改后的输出数据的维度形状。图2中显示
的向量化尺寸为2。意味着每次逻辑节点在实际进行二元操作时从第一输入数据的存储空
间和第二输入数据的存储空间读取的是包含2个元素的向量化数据,产生的也是包含2个元
素的向量化数据。
[0044] 图3所示的是根据本公开的用于二元操作的数据访问控制系统100进行向量化存取的第二实例示意图。向量化组件140在确定第一输入数据Src0末维的维度尺寸大于1而第
二输入数据Src1的末维的维度尺寸等于1并且第一输入数据所处内存空间的地址指针和末
维的维度尺寸为2或4的整数倍,将第一输入数据的末维的维度以2或4个元素为一组进行分
割成多组,以便第一输入数据能够在末维维度上以2或4个元素为一组进行向量化存取。如
图3所示,,作为一个例子,显示了第一输入数据Src0和第二输入数据Src1为二维数据,最为
第一输入数据Src0的末维的每一行包含有8个元素。在实际数据中,维度可以为多维。第二
输入数据Src1的末维(每一行)的维度尺寸等于1,即每行一个元素。为了一次存取第一输入
数据Src0的更大的数据量,首先需要第一输入数据Src0存储的地址指针数量为一次存取数
据量的整数倍。因此,向量化组件140首先基于第一输入数据的地址空间的指针src0是否是
2或4的整数倍,如果是,则确定第一输入数据Src0的最后一维的维度尺寸是否为2或4的整
数倍。如果是2或4的整数倍,则优先选择4作为向量化的尺寸(pack_size),即将第一输入数
据Src0的最后一维的维度尺寸从8修改为2。如果不是4的倍数而是2的倍数,则将第一输入
数据Src0的最后一维的维度尺寸从8修改为4。通过这种方式对第一输入数据的存取,使得
随后的二元操作的逻辑节点在进行二元操作时在逐一读取和存储元素时,一次可以针对最
后一维读取2个或4个元素构成的向量化数据,从而极大地减少了二元操作在进行数据存取
是的频度。需要指出的是,尽管这里对数据进行了向量化,但是在实际计算时,还是针对每
个向量化数据中的每个元素进行逐一二元操作。在进行向量化处理后,维度推导组件120还
是需要进行重新推导,获得修改后的输出数据的维度形状。图3中显示的向量化尺寸为2,意
味着每次逻辑节点在实际进行二元操作时从第一输入数据的存储空间和第二输入数据的
存储空间读取的是包含2个元素的向量化数据,产生的也是包含2个元素的向量化数据。由
于第二输入数据的末维的尺寸为1,因此无需对其进行向量化存取控制。
[0045] 图4所示的是根据本公开的用于二元操作的数据访问控制系统100进行向量化存取的第三实例示意图。在确定第一输入数据和/或第二输入数据为二维输入数据的情况下,
向量化组件140在作为二维数据的第一输入数据和第二输入数据所处内存空间的地址指针
为2或4的整数倍的情况下,直接将第一输入数据和/或第二输入数据的第二维以2或4个元
素为一组进行分割成多组,并在确定最后一组的元素的相对初始位置的偏移量超过第二维
的尺寸时,使得该元素的第一维标记数递增1,以便第一输入数据和第二输入数据能够在第
二维度上按组进行向量化存取。如图4所示,在输入数据为二维数据的情况下无需要求输入
数据的最后一维能被向量化尺寸(pack_size)整除,只需要考虑数据的指针是否对齐,其内
存指针数是否为向量化尺寸的整数倍。以图4所示的二维数据,以float数据类型为例,假设
形状为(4,19),第二维,即行的尺寸为19,不能被2或4整除。若要求最后一维不能被pack_
size整除,则只能得到pack_size为1,只能一次读取一个元素,不能有效利用内存带宽。若
不要求最后一维能被向量化尺寸整除,则可以使向量化尺寸为4,每次读4个元素,可以更好
利用内存带宽。对于最后一维不能被整除的情况,被向量化(pack)的几个元素存在不属于
同一行的情形。因此,在以向量化尺寸一次存储多个元素是,可能会取出的数据不属于同一
行。这时候,在进行存取时,需要判断每个元素属于这个维度中的哪一行,以确定其具体位
置。因此,需要在按照向量化尺寸读出一组元素来后,需要对每个向量化尺寸的元素组的第
1个元素求得行id(row_id)和列id(col_id),然后推算其它元素的行id和行id。由此,在计
算得到每个向量化尺寸的一组元素中的第一个元素的行id( first_row_id) 和列id
(first_col_id)后,每个元素需要判断(first_col_id + i > cols),是否超出了该行的大
小,如果超出了cols大小就加一行row_id = first_row_id + 1, col_id = first_col_id 
+ i ‑ cols ‑ 1。
[0046] 具体到如图4所示的,以向量化数据5为例,第1个元素相对于起始位置的偏移量(offset)为17,则其列id为17 % cols = 17以及行id为17 / cols = 0,得到它的first_
row_id=0, first_col_id = 17。 第2个元素判断first_col_id+1< cols,因此row_id为0, 
col_id为18。第4个元素判断first_col_id
[0047] + 3 = 20 > cols,因此row_id = first_row_id + 1 = 1, col_id = first_col_id + 3 ‑ cols ‑ 1 = 0,得到第四个元素的row_id 和col_id。因此在进行二元操作
时,第4个元素对对应的是另一个输入数据的对应位置元素。由此,在进行二维数据的存取
是,通过在获取每个向量化尺寸元素组的同时推导组内每个元素的位置,可以无需考虑第
二维的维度尺寸是否为2或4的倍数,就可以直接按照4个一组的方式进行数据存取,只需要
基于偏移量获取每个元素的行列位置即可。这就使得二元操作的输入数据能够以最大的向
量化尺寸进行存取。
[0048] 返回参见图1。如图1所示,根据本公开的用于二元操作的数据访问控制系统100还包括分片组件150,其在确定第一输入数据Src0和第二输入数据Src1的沿着其中所选择维
度的数据量之和大于为其分配的缓存空间的情况下,将第一输入数据Src0和第二输入数据
Src1基于所选择维度平均分割成多个分片数据,以便沿着所选择维度的分片数据量之和小
于所分配的缓存空间。图5所示的是根据本公开的用于二元操作的数据访问控制系统100进
行数据分片存取的实例示意图。通俗而言,就是将输入数据沿着其较大的维度进行分割,使
得输入数据分割成多个小的分片数据,以便适应缓存空间大小,从而减少重复获取同一数
据的情况。具体而言,如图5所示,在如上所述对输数据进行向量化处理并修改dims之后, 
src0_dims为(m,n), src1_dims为(1,n),得到dst_dims为(m,n),对于每个位置dst[i][j] 
的计算,需要读src0 [i][ j]和srcl [0] [j]  ,src1虽然只有n个数,但是需要读m * n 
次。如果n的值不大时,在第一行处理完后,后面的计算需要的src1的值通常能在本地缓存
中找到,不需要再次访问内存空间进行读取,虽然src1 的n个元素需要读m * n 次,但是总
开销是n,没有多余的数据读取。但是在n特别大时,例如在读取第一输入数据的第一行的n
个元素和第二输入数据n个元素就已经几乎占满为本次二元操作分配的缓存空间时,如果
在对第一输入数据的第二行的n个元素与第二输入数据n个元素进行二元操作时,如果在读
取了第一输入数据的第二行的n个元素过程中,缓存空间就已经被充满的情况下,缓存的第
二输入数据n个元素可能就完全或部分被驱逐出所述缓存空间,即后读入的数据缓存会将
前面读入的数据驱逐出缓存。所以会出现在第一行处理完后,第二行使用时需要读src1的
值,但是在缓存中找不到,需要重新读取的情况。如果需要重新读取第二输入数据,就会导
致重复开销。为此,本公开为了消除对第二输入数据的重复读取开销,沿着最后一维对第一
输入数据Src0和第二输入数据Src1进行分片分割处理,这样就可以在进行第一输入数据
Src0和第二输入数据Src1进行逐分片的存取,使得第一输入数据Src0成为Src0‑0,Src0‑
1…;第二输入数据Src1成为Src1‑0、Src1‑1…,如图5所述,将巨大维度的n分为多个比较小
的块,每次处理一块,因为每次数据的比较小,不会出现一行中后读入的数据将先读入的数
据驱逐出缓存的情况,因此在第一次读完后,后续每次读src1的值都能在缓存中找到,没有
多余的数据读取。分片尺寸大小可以根据实际需要或根据缓存空间的大小进行适应性配
置。
[0049] 需要指出的是,尽管在上面的描述中按照一定的顺序描述了维度推导组件120以及维度简化组件130以及向量化组件140的运行过程,但是在实际使用中,彼此之间并没有
时间上的先后顺序,可以在无需充充填维度的情况下,先进行维度简化后进行维度推导。在
需要进行向量化处理的情况下,在进行向量化处理之后进行维度推导。可选择地,在进行维
度简化之后,可以重新进行维度推导。
[0050] 在本公开的数据访问控制系统100的访问控制下,对于输出数据的每个元素,由它的偏移(offset)得到在ndims上对应的dst_nd_index。再根据dst_nd_index得到src0和
src1的nd_index 。如果第一第一输入数据Src0的形状为(2,5)第二输入数据Src1形状为
(2,1)。推导出的dst的形状为(2,5),其第7个元素,偏移量为7,由此可以得到该元素的dst_
nd_index为(1,1),遍历2个dim,由dst_nd_index得到src0和src1的nd_index,如果某个维
度上src_dim大小是1,则设src_index[i]=0。对于第1个维度, src0_dims的大小是1 ,将
src0_nd_i ndex[0]设为0,对于第2个维度, src1_dims 的大小1,将src1_nd_index[1]设
为0,最终得到src0_nd_indx为(0,1), src1_nd_index为(1.0),再由src_nd_index得到在
内存中的偏移offset,取出值参与后续计算。在计算过程中涉及频繁的offset到nd_index 
的相互转换,借助NdIndexOffsetHelper实现。对于index大小在in t32表示范围内的情况,
我们采用int32作为indexType,因为使用int32数据类型作index在做坐标换算时相对
int64类型速度更快。
[0051] 本公开从向量化数据存取可以更好的利用内存带宽,提升整体性能角度出发,对数据的访问进行控制,通过维度简化降低二元操作中数据运算量,以及通过数据向量化在
内存带宽的范围内尽可能提高单次数据存取的数据量,从而进一步降低数据存取的频次,
由此提高数据访问存取效率。此外,在Kernel执行时如果数据量小于int32表示范围则采用
int32数据类型作为index类型,从而减少坐标换算的开销。
[0052] 以上结合具体实施例描述了本公开的基本原理,但是,需要指出的是,对本领域的普通技术人员而言,能够理解本公开的方法和装置的全部或者任何步骤或者部件,可以在
任何计算装置(包括处理器、存储介质等)或者计算装置的网络中,以硬件、固件、软件或者
它们的组合加以实现,这是本领域普通技术人员在阅读了本公开的说明的情况下运用他们
的基本编程技能就能实现的。
[0053] 因此,本公开的目的还可以通过在任何计算装置上运行一个程序或者一组程序来实现。所述计算装置可以是公知的通用装置。因此,本公开的目的也可以仅仅通过提供包含
实现所述方法或者装置的程序代码的程序产品来实现。也就是说,这样的程序产品也构成
本公开,并且存储有这样的程序产品的存储介质也构成本公开。显然,所述存储介质可以是
任何公知的存储介质或者将来所开发出来的任何存储介质。
[0054] 还需要指出的是,在本公开的装置和方法中,显然,各部件或各步骤是可以分解和/或重新组合的。这些分解和/或重新组合应视为本公开的等效方案。并且,执行上述系列
处理的步骤可以自然地按照说明的顺序按时间顺序执行,但是并不需要一定按照时间顺序
执行。某些步骤可以并行或彼此独立地执行。
[0055] 上述具体实施方式,并不构成对本公开保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何
在本公开的精神和原则之内所作的修改、等同替换和改进等,均应包含在本公开保护范围
之内。