一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

乘法电路、卷积运算方法、介质、片上系统和电子设备与流程

2021-11-05 20:33:00 来源:中国专利 TAG:


1.本技术涉及神经网络领域,特别涉及一种乘法电路、卷积运算方法、介质、片上系统和电子设备。


背景技术:

2.近年来,随着人工智能(artificial intelligence,ai)技术的快速发展,支持ai的无人驾驶汽车、无人机、智能终端等的应用越来越广泛。ai通过神经网络技术,对各种传感器输入的数据进行实时处理,实现对外界环境的感知。通常为了提升ai应用终端的处理性能,会采用专用的硬件平台来实现特定的运算,例如将原本移植有卷积神经网络模型的ai应用终端中涉及的卷积运算通过专用的硬件平台来实现。
3.然而现有的一些专用的硬件平台通常只能实现特定类型的卷积运算,或者这些专用的硬件平台在实现特定类型的卷积运算时对应的计算效率高,而当这些专用的硬件平台在实现非特定类型的卷积运算时对应的计算效率低,例如,这些专用的硬件平台在执行标准卷积运算时的计算效率高,而执行扩张卷积运算时的计算效率低。因此,现有的一些专用的硬件平台的应用范围较窄,不利于产品的推广应用。


技术实现要素:

4.本技术实施例提供了一种乘法电路、卷积运算方法、介质、片上系统和电子设备。
5.本技术的技术方案通过在乘法电路中部署开关电路和输入数据缓存,使得在不同的运算模式下,在每个运算周期,开关电路从输入数据缓存中存储的输入数据中选择部分数据作为目标数据,送给乘法电路中的目标运算单元进行卷积运算。其中,开关电路从输入数据缓存中选择的目标数据是按照预设间隔从输入数据中选取的。如此,使得本技术提供的乘法电路能够在执行扩张卷积运算时,无需将卷积核中填充多个零,并且参与卷积运算的输入数据均为能够对卷积运算结果有影响的数据,避免了乘法电路计算资源的浪费。此外,本技术提供的乘法电路在不同的应用场景下,实现不同的卷积运算时,无需调整输入/输出数据的格式。可以满足产品开发/设计人员对于同一个乘法电路能够在不改变输入/输出数据格式的情况下,能够适配不同的应用场景的需求。
6.第一方面,本技术实施例提供了一种用于卷积运算的乘法电路,包括:pe阵列、用于存储输入数据的第一缓存、用于存储多个第一卷积核的第二缓存,以及连接于pe阵列和第一缓存之间的开关电路;其中,在乘法电路执行扩张卷积运算时:开关电路用于根据第二卷积核中的扩张数据的排布,对输入数据中的第一待卷积数据进行选择输出,以将第一待卷积数据中的有效数据输出至pe阵列,其中有效数据为第一待卷积数据中不与第二卷积核中的扩张数据进行运算的数据,第二卷积核是在第一卷积核中加入扩张数据生成的;pe阵列用于从第二缓存获取多个第一卷积核,并采用第一卷积核对有效数据进行卷积运算。
7.其中,第一缓存还可以称作为输入数据缓存。第二缓存还可以称作为参数缓存。
8.在上述第一方面的一种可能的实现中,pe阵列包括多行pe,开关电路包括分别与
pe阵列中每一行pe一一对应的多个子开关;
9.其中,在乘法电路执行扩张卷积运算时:
10.开关电路中的各个子开关分别用于根据第二卷积核中的扩张数据的排布,对输入数据中各个第一待卷积数据进行选择输出,以将第一待卷积数据中的有效数据输出至pe阵列中相应的一行pe,其中,输入数据中与不同子开关对应的第一待卷积数据不同;
11.pe阵列中的每一行pe用于从第二缓存获取多个第一卷积核,并采用第一卷积核对有效数据进行卷积运算。
12.例如,假设第一卷积核大小为3*3*3,扩张卷积运算的扩张参数d=1,也即需要将第一卷积核的各个通道参数中,每两个相邻数据之间要填充一个零(也即扩张数据为零)。则得到扩张后的大小为5*5*3的第二卷积核。第二卷积核中的扩张数据则为两行两列的零,这两行两列的零中每一行或每一列具有5个零。
13.在上述第一方面的一种可能的实现中,第一缓存包括多个存储单元,用于存储输入数据,其中,每两个存储单元中存储的数据不同,并且将多个存储单元存储的数据进行汇总构成输入数据;
14.在乘法电路执行扩张卷积运算时:
15.开关电路中的各个子开关分别用于根据第二卷积核中的扩张数据的排布,从第一缓存的多个存储单元中选取出有效数据,以将有效数据输出至pe阵列中相应的一行pe,其中,开关电路的每个子开关在每个运算周期,从多个存储单元的每一个存储单元中选取出的有效数据不同;
16.pe阵列中的每一行pe用于从第二缓存获取多个第一卷积核,并采用第一卷积核对有效数据进行卷积运算。
17.由于每两个存储单元中存储的数据不同,并且将多个存储单元存储的数据进行汇总构成输入数据;因此,避免了第一缓存中输入数据的读写冲突。
18.在上述第一方面的一种可能的实现中,第一待卷积数据为根据预设步长,采用和第二卷积核相同大小的滑动窗口在输入数据上滑动,得到的多个和第二卷积核相同大小的数据块。
19.在上述第一方面的一种可能的实现中,在乘法电路执行标准卷积运算时:
20.开关电路用于将第二待卷积数据作为有效数据输出至pe阵列;
21.pe阵列用于从第二缓存获取多个第一卷积核,并采用第一卷积核对有效数据进行卷积运算。
22.在上述第一方面的一种可能的实现中,pe阵列包括多行pe,开关电路包括分别与pe阵列中每一行pe一一对应的多个子开关;
23.其中,在乘法电路执行标准卷积运算时:
24.开关电路中的各个子开关分别用于将输入数据中各个第二待卷积数据作为有效数据输出至pe阵列中相应的一行pe,其中,输入数据中与不同子开关对应的第二待卷积数据不同;
25.pe阵列中的每一行pe用于从第二缓存获取多个第一卷积核,并采用第一卷积核对有效数据进行卷积运算。
26.在上述第一方面的一种可能的实现中,第一缓存包括多个存储单元,用于存储输
入数据,其中,每两个存储单元中存储的数据不同,并且将多个存储单元存储的数据进行汇总构成输入数据;
27.在乘法电路执行标准卷积运算时:
28.开关电路中的各个子开关分别用于从第一缓存的多个存储单元中选取出第二待卷积数据,以将作为有效数据的第二待卷积数据输出至pe阵列中相应的一行pe,其中,开关电路的每个子开关在每个运算周期,从多个存储单元的每一个存储单元中选取出的有效数据不同;
29.pe阵列中的每一行pe用于从第二缓存获取多个第一卷积核,并采用第一卷积核对有效数据进行卷积运算。
30.在上述第一方面的一种可能的实现中,第二待卷积数据为根据预设步长,采用和第一卷积核相同大小的滑动窗口在输入数据上滑动,得到的多个和第一卷积核相同大小的数据块。
31.在上述第一方面的一种可能的实现中,上述乘法电路还包括第三缓存,用于缓存pe阵列的卷积运算结果。
32.在上述第一方面的一种可能的实现中,上述乘法电路还包括存储控制电路,用于将外部存储空间中存储的输入数据读取到第一缓存中,和/或将外部存储空间中存储的多个卷积核读取到第二缓存中。
33.在上述第一方面的一种可能的实现中,上述乘法电路还包括连接于存储控制电路和第一缓存之间的输入数据排列模块,用于将输入数据中的至少部分数据写入第一缓存的各个存储单元。
34.在上述第一方面的一种可能的实现中,上述扩张数据为按照预设间隔在第一卷积核中加入的多行和/或多列的多个零。
35.第二方面,本技术实施例提供了一种片上系统,包括如上述第一方面以及第一方面的各种可能实现中的任一项乘法电路。
36.第三方面,本技术实施例提供了一种电子设备,包括如上述第二方面的片上系统。
37.第四方面,本技术实施例提供了一种卷积运算方法,包括:
38.获取第一待卷积数据;
39.根据第二卷积核中的扩张数据的排布,从第一待卷积数据中选择出有效数据;
40.采用多个第一卷积核对有效数据进行卷积运算;
41.其中第二卷积核是在第一卷积核中加入扩张数据生成的,有效数据为第一待卷积数据中不与第二卷积核中的扩张数据进行运算的数据。
42.在上述第四方面的一种可能的实现中,第一待卷积数据为根据预设步长,采用和第二卷积核相同大小的滑动窗口在输入数据上滑动,得到的多个和第二卷积核相同大小的数据块。
43.在上述第四方面的一种可能的实现中,上述方法还包括:
44.获取第二待卷积数据;
45.将第二待卷积数据确定为有效数据;
46.采用多个第一卷积核对有效数据进行卷积运算。
47.在上述第四方面的一种可能的实现中,第二待卷积数据为根据预设步长,采用和
第一卷积核相同大小的滑动窗口在输入数据上滑动,得到的多个和第一卷积核相同大小的数据块。
48.在上述第四方面的一种可能的实现中,扩张数据为按照预设间隔在第一卷积核中加入的多行和/或多列的多个零。
49.第五方面,本技术实施例提供了一种计算机可读存储介质,计算机可读存储介质上存储有指令,该指令在电子设备上执行时使电子设备执行上述第四方面以及第四方面的各种可能实现中的任意一种卷积运算方法。
50.第六方面,本技术实施例提供了一种电子设备,包括:
51.存储器,用于存储由电子设备的一个或多个处理器执行的指令,以及
52.处理器,当指令被一个或多个处理器执行时,处理器用于执行上述第四方面以及第四方面的各种可能实现中的任意一种卷积运算方法。
附图说明
53.图1(a)一种技术方案中标准卷积运算的运算过程示意图;
54.图1(b)示出了将图1(a)所示的卷积核k1进行填充得到填充后的卷积核k1'的示意图;
55.图1(c)示出了一种技术方案中扩张卷积运算的运算过程示意图;
56.图2根据本技术的一些实施例,示出了本技术提供的一种乘法电路的硬件结构框图;
57.图3根据本技术的一些实施例,示出了本技术提供的一种具有16*16pe阵列结构的乘法电路的硬件结构框图;
58.图4(a)根据本技术的一些实施例,示出了本技术提供的图3所示的乘法电路执行标准卷积运算的示意图;
59.图4(b)根据本技术的一些实施例,示出了图4(a)所示的数据块a01和卷积核k1的其中一子数据块;
60.图5(a)示出了一种将卷积核k1进行填充后与输入数据进行扩张卷积运算的示意图;
61.图5(b)示出了图5(a)所示的输入数据中数据块b01和卷积核k1'进行卷积运算的示意图;
62.图5(c)示出了图5(b)所示的输入数据中数据块b01在本技术技术方案中,实际参与扩张卷积运算的数据块c01,和卷积核k1进行卷积运算的示意图;
63.图5(d)示出了图5(a)所示的输入数据中数据块b02和卷积核k1'进行卷积运算的示意图;
64.图5(e)示出了图5(d)所示的输入数据中数据块b02在本技术技术方案中,实际参与扩张卷积运算的数据块c02,和卷积核k1进行卷积运算的示意图;
65.图5(f)示出了本技术技术方案中,实际参与扩张卷积运算的数据块c09,和卷积核k1进行卷积运算的示意图;
66.图5(g)示出了本技术技术方案中,实际参与扩张卷积运算的数据块c10,和卷积核k1进行卷积运算的示意图;图6根据本技术的一些实施例,示出了本技术提供的一种片上系
统的硬件结构框图;
67.图7根据本技术的一些实施例,示出了一种卷积运算方法的流程流程图;
68.图8根据本技术的一些实施例,示出了本技术提供的一种电子设备的结构框图。
具体实施方式
69.本技术的说明性实施例包括但不限于一种专门用于实现神经网络模型中的乘法运算的乘法电路、片上系统和电子设备。
70.为使本技术的目的、技术方案和优点更加清楚,下面将结合附图对本技术的实施例作进一步地详细介绍。
71.本技术实施例涉及神经网络技术领域,为了更好地理解本技术实施例的方案,下面先对本技术实施例可能涉及的神经网络的相关术语和概念进行介绍。
72.(1)标准卷积(standard convolution)运算
73.当通过一个卷积核对具有多个数据通道的输入数据进行标准卷积运算时,该卷积核需要对该具有多个数据通道的输入数据中的所有数据进行卷积。
74.图1(a)示例性地示出了一种标准卷积运算的示意图,例如,假设卷积神经网络10的输入数据为一图像的rgb(red:红、green:绿、blue:蓝)颜色空间的红、绿、蓝3个颜色通道的数据,假设该图像在水平方向的像素个数分别为14、垂直方向的像素个数为8,则该输入数据的大小可以用14*8*3来表示。当需要对该14*8*3的输入数据进行标准卷积运算时,需要采用通道数同样为3的卷积核对该输入数据中的所有数据进行卷积运算(即乘加运算),得到相应的卷积结果(也称特征图)。
75.例如,如图1(a)所示,采用1个大小为3*3*3的卷积核k1对上述大小为14*8*3的输入数据进行卷积。其中,输入数据以及卷积核k1的3个数据通道分别记为通道c1、通道c2、通道c3。则卷积核k1对该输入数据中通道c1至通道c3的所有数据进行卷积运算,得到大小为12*6的特征图p1。具体地,卷积核k1对输入数据中各个数据块进行卷积运算,分别得到特征图p1中的各个数据。例如,卷积核k1对如图1(a)所示的同样大小为3*3*3的数据块a1进行卷积运算,得到特征图p1中的数据q1。其中,输入数据中的各个数据块是采用和卷积核k1的大小相同的3*3*3的滑动窗口在输入数据上滑动得到的。例如以输入数据通道c1左上角的第一个数据为滑动起点,以预设的步长,采用3*3*3的滑动窗口依次在输入数据上滑动,得到各个3*3*3的数据块。
76.(2)扩张卷积(dilated convolution)运算
77.在一些场景中,为了增加神经网模型的感受野(reception field),需要对涉及的卷积核进行填充。例如,在抠图的应用场景下,需要在一次卷积运算里获得一张图像里更多的特征,这就需要增加神经网模型的感受野(reception field),也即需要填充卷积核,使得卷积核的尺寸变大,从而采用填充后的卷积核对输入数据进行卷积时,一次卷积运算覆盖的输入数据的范围变大。
78.当通过一个卷积核对具有多个数据通道的输入数据进行扩张卷积运算时,需要将该卷积核每个通道中的每两个数据之间填充零,得到填充后的卷积核,然后采用填充后的卷积核对输入数据中的所有数据进行卷积。需要说明的是,相较于填充前的卷积核,填充后的卷积核的通道数不变,只增加了每个通道中的数据量。图1(b)示例性地示出了一种将3*
3*3的卷积核k1扩张为5*5*3的卷积核k1'的过程示意图。具体地,将卷积核k1的通道c1至通道c3的数据分别进行填充,由于各个通道填充的过程类似,因此,仅对通道c1的填充过程进行介绍。如图1(b)所示,将卷积核k1通道c1的数据x1至x9中的每两个数据之间填充一个零,从而得到如图1(b)所示卷积核k1'的通道c1中的一共25个数据,其中包括x1至x9以及16个零。
79.图1(c)示例性地示出了一种扩张卷积运算的示意图,假设采用如图1(b)所示的5*5*3的卷积核k1'对14*8*3的输入数据进行扩张卷积运算,则卷积核k1'对该输入数据中通道c1至通道c3的所有数据进行卷积运算,得到大小为10*4的特征图p1'。具体地,卷积核k1'对输入数据中各个数据块进行卷积运算,分别得到特征图p1'中的各个数据。例如,卷积核k1'对如图1(c)所示的同样大小为5*5*3的数据块a1'进行卷积运算,得到特征图p1'中的数据q1'。其中,输入数据中的各个数据块是采用和卷积核k1'的大小相同的5*5*3的滑动窗口在输入数据上滑动得到的。例如以输入数据通道c1左上角的第一个数据为滑动起点,以预设的步长,采用5*5*3的滑动窗口依次在输入数据上滑动,得到各个5*5*3的数据块。
80.从以上关于标准卷积运算以及扩张卷积运算的介绍中,不难看出,对于同一个卷积核和同一输入数据来说,相比较于标准卷积运算,扩张卷积运算将卷积核的各个通道的数据中填充了多个零,而填充的多个零并不影响卷积运算结果,但是填充的多个零占用了硬件平台的运算资源。如果使用同一硬件平台分别实现同一卷积核对同一输入数据的标准卷积运算,以及扩张卷积运算,在执行扩张卷积运算之前,需要对参与运算的卷积核数据进行零值的填充,即需要改变参与卷积运算的卷积核数据的格式。这与产品开发/设计人员对于同一个硬件平台能够在不改变输入数据格式的情况下,能够适配不同的应用场景的需求相违背。此外,由于填充后的卷积核在对输入数据进行卷积运算时,虽然卷积核填充的零对卷积运算的结果没有影响,但是填充的零依然参与了卷积运算过程,占用了运算资源,造成了运算资源的浪费。
81.因此,为了解决上述技术问题,本技术提供了一种乘法电路,通过在乘法电路中部署开关电路和输入数据缓存,使得在不同的运算模式下,在每个运算周期,开关电路从输入数据缓存中存储的输入数据中选择部分数据作为目标数据,送给乘法电路中的目标运算单元进行卷积运算。其中,开关电路从输入数据缓存中选择的目标数据是按照预设间隔从输入数据中选取的。例如,开关电路从如图1(c)所示的数据块a1'中,每间隔一个数据,选取出由子数据块y1至y9组成的目标数据块送入pe阵列和卷积核k1进行卷积运算。如此,使得本技术提供的乘法电路能够在执行扩张卷积运算时,无需将卷积核中填充多个零,并且参与卷积运算的输入数据均为能够对卷积运算结果有影响的数据,避免了乘法电路计算资源的浪费。此外,本技术提供的乘法电路在不同的应用场景下,实现不同的卷积运算时,无需调整输入/输出数据的格式。可以满足产品开发/设计人员对于同一个乘法电路能够在不改变输入/输出数据格式的情况下,能够适配不同的应用场景的需求。
82.例如,在抠图的应用场景下,需要在一次卷积运算里获得一张图像里更多的特征,这就需要增加神经网模型的感受野(reception field),也即需要填充卷积核,使得卷积核的尺寸变大,从而采用填充后的卷积核对输入数据进行卷积时,一次卷积运算覆盖的输入数据的范围变大。并且,为了快速得到抠图结果,可以使用本技术提供的乘法电路对原始图像数据执行扩张卷积运算。又如,在人脸识别门禁等常规的应用场景下,可以采用本技术提
供的乘法电路执行标准卷积运算,以得到相应的人脸识别结果。
83.此外,本技术提供的乘法电路在执行扩张卷积运算时,无需执行对扩张后的卷积核中零值和输入数据中与零值对应的数据的卷积运算,释放了常规扩张卷积运算中,前述零值所占用的运算资源,有利于节省乘法电路的功耗。
84.下面首先将对本技术提供的如图2所示的乘法电路200的硬件结构进行详细介绍。
85.图2示例性地示出了本技术提供的一种乘法电路200的硬件结构框图。如图2所示,乘法电路200包括dma控制单元201、输入数据缓存270、参数缓存202、开关电路240、pe阵列250、输出缓存204以及输入数据排列模块260。其中,dma控制单元201连接参数缓存202以及输入数据排列模块260;参数缓存202连接pe阵列250;输入数据排列模块260与pe阵列250之间依次连接有输入数据缓存270和开关电路240,并且输出缓存204连接pe阵列250。
86.其中,dma控制单元201用于从外部存储空间中将需要被卷积的输入数据读取到输入数据排列模块260中,以供pe阵列250进行卷积运算。例如,本技术提供的乘法电路200应用到抠图场景,dma控制单元201用于将需要被抠图的原始图像的数据读取到输入数据缓存270中,以供pe阵列250进行扩张卷积运算,从而得到抠图结果。
87.参数缓存202用于存储参与卷积运算的卷积核数据。例如,在一些实施例中,参数缓存202用于存储通道数与需要被卷积的输入数据相同的卷积核的数据。
88.输入数据排列模块260用于将从dma控制单元201获取的输入数据写入输入数据缓存270的各个存储单元。
89.输入数据缓存270用于存储输入数据排列模块260写入的输入数据。在一些实施例中,输入数据缓存270包括多个存储单元(也即输入数据缓存270的多个存储区域),各个存储单元分别用于存储输入数据的其中一部分数据,并且每个存储单元中存储的数据各不相同,各个存储单元存储的数据组合起来构成输入数据中的完整数据。例如,在一些实施例中,输入数据缓存270包括16个存储单元,输入数据排列模块260将输入数据排列成了16个数据集合,则这16个存储单元分别用于存储前述16个数据集合的其中一个数据集合的数据。
90.开关电路240用于在不同的应用场景下,在每一个运算阶段,从输入数据缓存270的各个存储单元中选取目标数据,发送给pe阵列250中的目标处理单元(processing element,pe),以使目标pe将从开关电路接收的目标数据和参数缓存202中存储的卷积核数据进行标准卷积运算或扩张卷积运算。在一些实施例中,开关电路240包括多个子开关,各个子开关与输入数据缓存270中的各个存储单元一一对应,并且各个子开关与pe阵列250中的每一行pe一一对应。其中,在不同的应用场景下,开关电路240从输入数据缓存270的各个存储单元中选取目标数据的具体规则,将在下文中进行详细介绍。
91.pe阵列250是由多个pe形成的阵列,每个pe用于对卷积核数据和输入数据进行乘加运算。
92.例如,在一些实施例中,乘法电路200被应用于抠图的应用场景下,需要在一次卷积运算里获得一张图像里更多的特征,这就需要增加神经网模型的感受野,也即需要填充卷积核,使得卷积核的尺寸变大,在这种情况下,pe阵列250用于对输入数据执行扩张卷积运算,以得到抠图结果。又如,在一些实施例中,乘法电路200被应用于人脸识别门禁等常规的应用场景下,在这种情况下,pe阵列250用于对输入数据执行标准卷积运算,以得到人脸
识别结果。
93.输出缓存204用于存储pe阵列250执行卷积运算输出的结果。例如,输出缓存204用于存储pe阵列250的每一列输出的一个特征图。
94.可以理解的是,以上涉及的抠图场景以及人脸识别门禁场景仅仅是为了说明本技术的技术方案的两个示例性的应用场景。本技术实施例提供的乘法电路200适用的场景包括但不限于涉及图像识别、语音识别、自然语言处理、强化学习等的各种应用场景中。
95.此外,可以理解的是,如图2所示的本技术提供的乘法电路200的示例性结构并不构成对乘法电路200的具体限定。在本技术另一些实施例中,乘法电路200可以包括比图示更多或更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。图示的部件可以以硬件,软件或软件和硬件的组合实现。
96.图3示例性地示出了本技术提供的一种具有16*16pe阵列(即具有16行16列共256个pe的阵列)结构的乘法电路200的硬件结构示意图。为了简化说明,图3只示意出了pe阵列250中的部分pe,其他未示意出的pe在图3中均以“省略号”指代。
97.可以理解的是,图3所示的具有16*16pe阵列结构的乘法电路200仅仅是为了说明本技术技术方案的一个示例,适用于本技术技术方案的乘法电路200可以包括比图3所示的乘法电路200中更多或更少的pe,在具体实现中,可以根据需要设置pe阵列中pe的数量,本技术对此不作限定。
98.如图3所示,该乘法电路200包括dma控制单元201、输入数据缓存270、输入数据处理模块260、参数缓存202、开关电路240、pe阵列250以及输出缓存204。pe阵列250包括16行16列共256个pe,其中,前8行的16列pe和后8行的16列pe分别记为第一组pe251以及第二组pe252。开关电路240包括与pe阵列250中的16行pe一一对应的16个子开关,记为sw0至sw15,输入数据缓存270包括16个存储单元,记为b0至b15。由于dma控制单元201、输入数据缓存270、参数缓存202、pe阵列250以及输出缓存204已在上述关于图3的描述中介绍过,在此不再赘述。
99.下面仅对图3所示的开关电路240进行详细介绍。
100.在图3所示的实施例中,开关电路240连接于输入数据缓存270与pe阵列250之间,用于在不同的应用场景下,将从输入数据缓存270中读取的目标数据送入pe阵列250中相应的pe中进行卷积运算。
101.在乘法电路200执行标准卷积运算时,各个子开关分别将输入数据中各个连续的数据块作为目标数据块,送入相应的pe。其中,输入数据中各个连续的数据块的大小和参与标准卷积运算的卷积核相同。其中,连续的数据块是指数据块中的各个子数据块是相邻的。其中,子数据块为大小为1*1*n的数据块,n为子数据块的通道数。
102.在乘法电路200执行扩张卷积运算时,各个子开关分别从输入数据各个连续的数据块中,按照预设间隔,选取出目标数据块送入相应的pe。其中,输入数据中各个连续的数据块的大小和填充零值后得到的卷积核相同。其中,预设间隔与对卷积核进行零值填充时涉及的扩展参数d相同。
103.例如,当乘法电路200在执行如图1(a)所示的3*3*3的卷积核k1和14*8*3的输入数据的标准卷积运算时,开关电路240中的子开关sw0将数据块a1送入pe阵列250的pe000,pe000将数据块a1和卷积核k1进行卷积运算。子开关sw1将数据块a2送入pe阵列250的
pe100,pe100将数据块a2和卷积核k1进行卷积运算。不难理解,数据块a1和a2中的各个子数据块在输入数据中的位置是相邻的。
104.又如,当乘法电路200在执行上述3*3*3的卷积核k1和14*8*3的输入数据的扩张卷积运算时,开关电路240中的子开关sw1从如图1(c)所示的数据块a1'中,每间隔一个数据,选取出由子数据块y1至y9组成的目标数据块送入pe阵列250的pe000,pe000将由子数据块y1至y9组成的目标数据块和卷积核k1进行卷积运算。子开关sw1从如图1(c)所示的数据块a2'中,每间隔一个数据,选取出由子数据块t1至t9组成的目标数据块送入pe阵列250的pe100,pe100将由子数据块t1至t9组成的目标数据块和卷积核k1进行卷积运算。不难理解,上述由子数据块y1至y9组成的目标数据块,以及由子数据块t1至t9组成的目标数据块中各个子数据块在输入数据中的位置是间隔一个数据,即各个子数据块不相邻。
105.下面对本技术提供的如图3所示的乘法电路200执行标准卷积以及扩张卷积的原理进行详细介绍。
106.(1)标准卷积运算
107.假设,如图3所示的具有16*16阵列结构的乘法电路200采用16个大小为3*3*3的卷积核(分别记为k1至k16),对大小为14*8*3的输入数据进行卷积标准卷积运算。则,乘法电路200中pe阵列250的各个pe分别采用3*3*3的卷积核对输入数据中大小同样为3*3*3的数据块进行卷积。输入数据中大小同样为3*3*3的数据块为:采用预设步长,以3*3*3的滑动窗口在输入数据上滑动,得到的滑动窗口中对应的数据块。可以理解的是,由于输入数据具有3个数据通道,则输入数据上的每一个滑动窗口(也即数据块)也具有3个数据通道。
108.例如,如图4(a)所示,对于大小为14*8*3的输入数据,以通道c1左上方的第一个数据为起点,步长为1,按照3*3*3的滑动窗口在输入数据上滑动。例如,首先从左往右滑动,得到数据块a01至a012;然后从数据块a01再向下滑动一个数据后继续从左往右滑动,得到数据块a11至a112;再从数据块a11向下滑动一个数据后继续从左往右滑动,得到数据块a21至a212,依次类推,再依次得到数据块a31至a312,数据块a41至a412,数据块a51至a512。
109.则,对于pe阵列250中的各列pe(共16列),分别采用卷积核k1至k16中的其中一个,对输入数据进行卷积运算。在一些实施例中,为了在每个运算周期,提高pe阵列中各个pe的利用率,提升卷积运算效率,将pe阵列250划分为前8行的16列pe,即第一组pe251;以及后8行的16列pe,即第二组pe252。其中,一个运算周期为pe阵列250的一个pe完成一次对3*3*3的卷积核和3*3*3的数据块的卷积运算所占用的时长。由于各列pe卷积运算的过程类似,区别仅在不同的两列pe参与卷积运算的卷积核不同。因此,下面仅对乘法电路200第一列pe(即pe000、pe100至pe1500)执行标准卷积运算的过程进行详细介绍。其他各列pe执行标准卷积运算的过程不再详述。
110.第一个运算周期
111.对于图3所示的第一组pe251中第一列pe涉及的8个pe,pe000是对图4(a)所示的卷积核k1以及输入数据中的数据块a01进行卷积运算,得到大小为12*6的特征图p1中的第一个数据q01,卷积运算的过程为:
112.d0.0*x1 d0.1*x2 d0.2*x3 d1.0*x4 d1.1*x5 d1.2*x6 d2.0*x7 d2.1*x8 d2.2*x9=q01。
113.pe100是对图4(a)所示的卷积核k1以及输入数据中的数据块a02进行卷积运算,得
到12*6的特征图p1中的第二个数据q02,卷积运算的过程为:
114.d0.1*x1 d0.2*x2 d0.3*x3 d1.1*x4 d1.2*x5 d1.3*x6 d2.1*x7 d2.2*x8 d2.3*x9=q02。
115.依次类推,pe700是对图4(a)所示的卷积核k1以及输入数据中的数据块a08(未示出)进行卷积运算,得到12*6的特征图p1中的第八个数据q08,卷积运算的过程为:
116.d0.7*x1 d0.8*x2 d0.9*x3 d1.7*x4 d1.8*x5 d1.9*x6 d2.7*x7 d2.8*x8 d2.9*x9=q08。
117.继续参考图3,在第一个运算周期,对于图3所示的第二组pe252中第一列pe涉及的8个pe,pe800是对图4(a)所示的卷积核k1以及输入数据中的数据块a11进行卷积运算,得到大小为12*6的特征图p1中的第二行的第一个数据q11,卷积运算的过程为:
118.d1.0*x1 d1.1*x2 d1.2*x3 d2.0*x4 d2.1*x5 d2.2*x6 d3.0*x7 d3.1*x8 d3.2*x9=q11。
119.pe900是对图4(a)所示的卷积核k1以及输入数据中的数据块a12进行卷积运算,得到12*6的特征图p1中的第二行的第二个数据q12,卷积运算的过程为:
120.d1.1*x1 d1.2*x2 d1.3*x3 d2.1*x4 d2.2*x5 d2.3*x6 d3.1*x7 d3.2*x8 d3.3*x9=q12。
121.依次类推,pe1500是对图4(a)所示的卷积核k1以及输入数据中的数据块a18(未示出)进行卷积运算,得到12*6的特征图p1中的第二行的第八个数据q18,卷积运算的过程为:
122.d1.7*x1 d1.8*x2 d1.9*x3 d2.7*x4 d2.8*x5 d2.9*x6 d3.7*x7 d3.8*x8 d3.9*x9=q18。
123.第二个运算周期
124.在第二个运算周期,第一列pe的第一组pe251中只有4个pe参与卷积运算过程。例如,pe000是对图4(a)所示的卷积核k1以及输入数据中的数据块a09(未示出)进行卷积运算,得到12*6的特征图p1中的第一行的第九个数据q09,卷积运算的过程为:
125.d0.8*x1 d0.9*x2 d0.10*x3 d1.8*x4 d1.9*x5 d1.10*x6 d2.8*x7 d2.9*x8 d2.10*x9=q09。
126.pe100是对图4(a)所示的卷积核k1以及输入数据中的数据块a10(未示出)进行卷积运算,得到12*6的特征图p1中的第一行的第十个数据q10,卷积运算的过程为:
127.d0.9*x1 d0.10*x2 d0.11*x3 d1.9*x4 d1.10*x5 d1.11*x6 d2.9*x7 d2.10*x8 d2.11*x9=q010。
128.pe200是对图4(a)所示的卷积核k1以及输入数据中的数据块a011(未示出)进行卷积运算,得到12*6的特征图p1中的第一行的第十一个数据q11,卷积运算的过程为:
129.d0.10*x1 d0.11*x2 d0.12*x3 d1.10*x4 d1.11*x5 d1.12*x6 d2.10*x7 d2.11*x8 d2.12*x9=q011。
130.pe300是对图4(a)所示的卷积核k1以及输入数据中的数据块a012(未示出)进行卷积运算,得到12*6的特征图p1中的第一行的第十二个数据q12,卷积运算的过程为:
131.d0.11*x1 d0.12*x2 d0.13*x3 d1.11*x4 d1.12*x5 d1.13*x6 d2.11*x7 d2.12*x8 d2.13*x9=q012。
132.在第二个运算周期,第一列pe的第二组pe252中也只有4个pe参与卷积运算过程。
例如,pe800是对图4(a)所示的卷积核k1以及输入数据中的数据块a19(未示出)进行卷积运算,得到12*6的特征图p1中的第二行的第九个数据q19;pe900是对图4(a)所示的卷积核k1以及输入数据中的数据块a110(未示出)进行卷积运算,得到12*6的特征图p1中的第二行的第十个数据q110;pe1000是对图4(a)所示的卷积核k1以及输入数据中的数据块a111(未示出)进行卷积运算,得到12*6的特征图p1中的第二行的第十一个数据q111;pe1100是对图4(a)所示的卷积核k1以及输入数据中的数据块a112(未示出)进行卷积运算,得到12*6的特征图p1中的第二行的第十二个数据q112。
133.经过上述第一个运算周期以及第二运算周期的卷积运算,得到了如图4(a)所示的12*6的特征图p1的前两行数据(第一行的q01至q012,以及第二行的q11至q112)。不难理解的是,乘法电路200再经过第三个运算周期以及第四个运算周期,得到如图4(a)所示的12*6的特征图p1第三行的q21至q212,以及第四行的q31至q312。依次类推,乘法电路200再经过第五个运算周期以及第六个运算周期,得到如图4(a)所示的12*6的特征图p1第五行的q41至q412,以及第六行的q51至q512。至此,乘法电路200完成了3*3*3的卷积核k1和14*8*3的输入数据的标准卷积运算。
134.可以理解的是,对于乘法电路200其他各列pe,运算过程与第一列的pe000至pe1500的运算过程类似,唯一区别仅在于:每列pe参与卷积运算的卷积核不同。例如,第一列pe中参与卷积运算的卷积核为卷积核k1,第二列pe中参与卷积运算的卷积核为卷积核k2,第三列pe中参与卷积运算的卷积核为卷积核k3,依次类推,第16列pe中参与卷积运算的卷积核为卷积核k16。
135.此外,需要说明的是,以上在关于乘法电路200执行标准卷积运算的过程中涉及的各个数据块中的di.j(i为行号,j为列号,i的取值范围为0至7,j的取值范围为0至13),以及卷积核k1中的xn(n取值范围为1至9),并不单指一个具体的数值。由于卷积核k1以及输入数据均具有3个数据通道,因此,上述各个数据块中的di.j以及卷积核k1中的xn均指代一个大小为1*1*3的子数据块。例如,如图4(b)所示,输入数据数据块a01中的第一个子数据块为d0.0,子数据块为d0.0包括通道c1的数据i0,通道c2的数据i1,通道c3的数据i2。卷积核k1中的第一个子数据块为x1,子数据块为x1包括通道c1的数据r0,通道c2的数据r1,通道c3的数据r2。
136.此外,在一些实施例中,由于乘法电路200中的各个pe在执行标准卷积运算时,当乘法电路200输入数据缓存270以及参数缓存202中的数据端口的数据宽度大于前述子数据块的通道数的情况下,例如,乘法电路200的输入数据缓存270以及参数缓存202的数据端口为4b(即输入数据缓存270以及参数缓存202中存储的数据是经过量化了的8比特的整型数),而输入数据和卷积核的通道数为3,则一个时钟周期内,一个pe只能获取一个数据块中的一个子数据块的数据,以及一个卷积核中的一个子数据块中的数据。因此,在一个时钟周期内,一个pe执行的是例如图4(b)所示的子数据块d0.0和子数据块x1的卷积运算,运算过程为:i0*r0 i1*r1 i2*r2。不难理解的是,需要9个时钟周期才能完成对大小为3*3*3的数据块a01和大小为3*3*3的卷积核k1的卷积运算。
137.此外,从前述关于运算周期的定义可知:一个运算周期为pe阵列250的一个pe完成一次对3*3*3的卷积核和3*3*3的数据块的卷积运算所占用的时长。因此,不难理解的是,一个运算周期包括9个时钟周期。
138.以上只是对每个运算周期,乘法电路200执行标准卷积运算的过程进行了大致介绍。在此基础上,下面将进一步结合乘法电路200的开关电路240中各个子开关从输入数据缓存270的各个存储单元中选取目标数据的选取规则,来对乘法电路200在每个运算周期内的每个时钟周期,执行标准卷积的运算过程进行详细介绍。
139.在一些实施例中,假设乘法电路200的输入数据处理模块260将dma控制单元201从外部存储空间中获取的如图4(a)所示的14*8*3d的输入数据,按照下表1的数据排列方式写入输入数据缓存270的16个存储单元b0至b15中:
[0140][0141][0142]
表1
[0143]
假设输入数据缓存270中各个存储单元的地址范围为addr0至addr6,参考表1,在一些实施例中,存储单元b0从addr0至addr7分别存储的数据为d0.0、d0.8、d2.2、d2.10、d4.4、d4.12、d6.6;存储单元b1从addr0至addr7分别存储的数据为d0.1、d0.9、d2.3、d2.11、d4.5、d4.13、d6.7;存储单元b2从addr0至addr7分别存储的数据为d0.2、d0.10、d2.4、d2.12、d4.6、d6.0、d6.8。其他存储单元不再详举,具体可参考表1。
[0144]
由于乘法电路200各列pe执行标准卷积运算的过程类似,区别仅在不同的两列pe参与卷积运算的卷积核不同。因此,下面仍仅对乘法电路200第一列pe(即pe000、pe100至pe1500)在一个运算周期的各个时钟周期内的标准卷积运算过程进行详细介绍。
[0145]
在第一个运算周期的第一个时钟周期
[0146]
参考图3和表1,开关电路240中的子开关sw0将输入数据缓存270的存储单元b0的addr0中选取d0.0作为目标子数据块,送入pe000中,和参数缓存202中获取的子数据块x1进行卷积运算。
[0147]
子开关sw1将输入数据缓存270的存储单元b1的addr0中选取d0.1作为目标子数据块,送入pe100中,和参数缓存202中获取的子数据块x1进行卷积运算。
[0148]
子开关sw2将输入数据缓存270的存储单元b2的addr0中选取d0.2作为目标子数据块,送入pe200中,和参数缓存202中获取的子数据块x1进行卷积运算。
[0149]
依次类推,子开关sw7将输入数据缓存270的存储单元b7的addr0中选取d0.7作为目标子数据块,送入pe700中,和参数缓存202中获取的子数据块x1进行卷积运算。
[0150]
子开关sw8将输入数据缓存270的存储单元b8的addr0中选取d1.0作为目标子数据块,送入pe800中,和参数缓存202中获取的子数据块x1进行卷积运算。
[0151]
子开关sw9将输入数据缓存270的存储单元b9的addr0中选取d1.1作为目标子数据块,送入pe900中,和参数缓存202中获取的子数据块x1进行卷积运算。
[0152]
依次类推,子开关sw15将输入数据缓存270的存储单元b15的addr0中选取d1.7作为目标子数据块,送入pe700中,和参数缓存202中获取的子数据块x1进行卷积运算。
[0153]
在第一个运算周期的第二个时钟周期
[0154]
继续参考图3和表1,开关电路240中的子开关sw0将输入数据缓存270的存储单元b1的addr0中选取d0.1作为目标子数据块,送入pe000中,和参数缓存202中获取的子数据块x2进行卷积运算。
[0155]
子开关sw1将输入数据缓存270的存储单元b2的addr0中选取d0.2作为目标子数据块,送入pe100中,和参数缓存202中获取的子数据块x2进行卷积运算。
[0156]
子开关sw2将输入数据缓存270的存储单元b3的addr0中选取d0.3作为目标子数据块,送入pe200中,和参数缓存202中获取的子数据块x2进行卷积运算。
[0157]
依次类推,子开关sw6将输入数据缓存270的存储单元b7的addr0中选取d0.7作为目标子数据块,送入pe700中,和参数缓存202中获取的子数据块x2进行卷积运算。
[0158]
而子开关sw7将输入数据缓存270的存储单元b0的addr1中选取d0.8作为目标子数据块,送入pe700中,和参数缓存202中获取的子数据块x2进行卷积运算。
[0159]
子开关sw8将输入数据缓存270的存储单元b9的addr0中选取d1.1作为目标子数据块,送入pe800中,和参数缓存202中获取的子数据块x2进行卷积运算。
[0160]
子开关sw9将输入数据缓存270的存储单元b9的addr0中选取d1.2作为目标子数据块,送入pe900中,和参数缓存202中获取的子数据块x2进行卷积运算。
[0161]
依次类推,子开关sw14将输入数据缓存270的存储单元b15的addr0中选取d1.7作为目标子数据块,送入pe1300中,和参数缓存202中获取的子数据块x2进行卷积运算。
[0162]
而子开关sw15将输入数据缓存270的存储单元b8的addr0中选取d1.8作为目标子数据块,送入pe1500中,和参数缓存202中获取的子数据块x2进行卷积运算。
[0163]
在第一个运算周期的第三个时钟周期,子开关sw0从存储单元b2的addr0中选取d0.2作为目标子数据块送入pe000;子开关sw1从存储单元b3的addr0中选取d0.3作为目标子数据块送入pe100;子开关sw2从存储单元b4的addr0中选取d0.4作为目标子数据块送入pe200;子开关sw3从存储单元b5的addr0中选取d0.5作为目标子数据块送入pe300;子开关sw4从存储单元b6的addr0中选取d0.6作为目标子数据块送入pe300;子开关sw5从存储单元b7的addr0中选取d0.7作为目标子数据块送入pe500;子开关sw6从存储单元b0的addr1中选取d0.8作为目标子数据块送入pe600;子开关sw7从存储单元b1的addr1中选取d0.9作为目标子数据块送入pe700;子开关sw8从存储单元b10的addr0中选取d1.2作为目标子数据块送入pe800;子开关sw9从存储单元b11的addr0中选取d1.3作为目标子数据块送入pe900;子开
关sw10从存储单元b12的addr0中选取d1.4作为目标子数据块送入pe1000;子开关sw11从存储单元b13的addr0中选取d1.5作为目标子数据块送入pe1100;子开关sw12从存储单元b14的addr0中选取d1.6作为目标子数据块送入pe1300;子开关sw13从存储单元b15的addr0中选取d1.7作为目标子数据块送入pe1300;子开关sw14从存储单元b8的addr1中选取d1.8作为目标子数据块送入pe1300;子开关sw15从存储单元b9的addr1中选取d1.9作为目标子数据块送入pe1500。
[0164]
第一个运算周期内,各个子开关从各个存储单元中选择出的目标子数据块与第一列pe(pe000至pe1500)中各个pe的对应关系如下表2所示。第一个运算周期内的其他时钟周期,以及第二运算周期至第六运算周期内的各个时钟周期,各个子开关从各个存储单元中选取的目标子数据块不再赘述。
[0165]
子开关clk1clk2clk3clk4clk5clk6clk7clk8clk9pesw0d0.0d0.1d0.2d1.0d1.1d1.2d2.0d2.1d2.2pe000sw1d0.1d0.2d0.3d1.1d1.2d1.3d2.1d2.2d2.3pe100sw2d0.2d0.3d0.4d1.2d1.3d1.4d2.2d2.3d2.4pe200sw3d0.3d0.4d0.5d1.3d1.4d1.5d2.3d2.4d2.5pe300sw4d0.4d0.5d0.6d1.4d1.5d1.6d2.4d2.5d2.6pe300sw5d0.5d0.6d0.7d1.5d1.6d1.7d2.5d2.6d2.7pe500sw6d0.6d0.7d0.8d1.6d1.7d1.8d2.6d2.7d2.8pe600sw7d0.7d0.8d0.9d1.7d1.8d1.9d2.7d2.8d2.9pe700sw8d1.0d1.1d1.2d2.0d2.1d2.2d3.0d3.1d3.2pe800sw9d1.1d1.2d1.3d2.1d2.2d2.3d3.1d3.2d3.3pe900sw10d1.2d1.3d1.4d2.2d2.3d2.4d3.2d3.3d3.4pe1000sw11d1.3d1.4d1.5d2.3d2.4d2.5d3.3d3.4d3.5pe1100sw12d1.4d1.5d1.6d2.4d2.5d2.6d3.4d3.5d3.6pe1200sw13d1.5d1.6d1.7d2.5d2.6d2.7d3.5d3.6d3.7pe1300sw14d1.6d1.7d1.8d2.6d2.7d2.8d3.6d3.7d3.8pe1300sw15d1.7d1.8d1.9d2.7d2.8d2.9d3.7d3.8d3.9pe1500
[0166]
表2
[0167]
参考表2可知,当乘法电路200在执行标准卷积运算时,在同一运算周期的相邻两个时钟周期内,各个子开关从输入数据中选取出的目标子数据块在输入数据中所处的位置是连续的。
[0168]
(2)扩张卷积运算
[0169]
假设,如图3所示的具有16*16阵列结构的乘法电路200依然采用16个大小为3*3*3的卷积核(分别记为k1至k16),对大小为14*8*3的输入数据进行卷积扩张卷积运算。并且,假设扩张卷积运算的扩张参数d=1,也即卷积核的各个通道参数中,每两个相邻数据之间要填充一个零。则乘法电路200要采用16个大小为3*3*3的卷积核对大小为14*8*3的输入数据进行扩张卷积运算时,要得到和如图5(a)所示的,采用16个填充零值之后的大小为5*5*3的卷积核(分别记为k1'至k16')对大小为14*8*3的输入数据进行扩张卷积运算相同的运算结果。
[0170]
为了节省运算资源,乘法电路200的开关电路240需要从输入数据缓存270中存储的输入数据中选择部分数据送入pe阵列250,和参数缓存202中存储的各个大小为3*3*3卷积核进行扩张卷积运算。其中,开关电路240的选取规则将在下文中进行详细介绍。
[0171]
在执行扩张卷积运算过程中,乘法电路200中pe阵列250的各个pe分别采用3*3*3的卷积核对输入数据中大小同样为3*3*3的数据块进行卷积。需要说明的是,输入数据中大小为3*3*3的数据块是从输入数据中相应的一个大小为5*5*3的数据块中选取的。
[0172]
如图5(a)所示,对于大小为14*8*3的输入数据,以通道c1左上方的第一个数据为起点,步长为1,按照5*5*3的滑动窗口在输入数据上滑动。例如,首先从左往右滑动,得到数据块b01至b010;然后从数据块b01再向下滑动一个数据后继续从左往右滑动,得到数据块b11至b110;再从数据块b11向下滑动一个数据后继续从左往右滑动,得到数据块b21至b210,依次类推,再依次得到数据块b31至b310。
[0173]
然而,乘法电路200在实际执行扩张卷积运算时,是从上述得到的各个数据块(即数据块b01至b310)中选取部分数据作为有效数据,然后将选取的有效数据和未填充的3*3*3的卷积核k1进行卷积运算。
[0174]
例如,如图5(b)所示,乘法电路200将数据块b01中和填充后的5*5*3的卷积核k1'中填充的零相应位置的数据舍弃,得到如图5(c)所示的最终参与扩张卷积运算的数据块c01。将数据块c01与未填充的3*3*3的卷积核k1进行卷积运算,得到大小为10*4的特征图p1'中的数据ro1。类似地,如图5(d)所示,乘法电路200将数据块b02中和填充后的5*5*3的卷积核k1'中填充的零相应位置的数据舍弃,得到如图5(e)所示的最终参与扩张卷积运算的数据块c02。将数据块c02与未填充的3*3*3的卷积核k1进行卷积运算,得到大小为10*4的特征图p1'中的数据r02。类似地,分别从数据块b03(未图示)至b310(未图示)中选取相应的有效数据,最终得到参与扩张卷积运算的数据块c03(未图示)至c310(未图示)。
[0175]
则,对于pe阵列250中的各列pe(共16列),分别采用卷积核k1至k16中的其中一个,对输入数据进行扩张卷积运算。在一些实施例中,同样为了在每个运算周期,提高pe阵列中各个pe的利用率,提升卷积运算效率,将pe阵列250划分为前8行的16列pe,即第一组pe251;以及后8行的16列pe,即第二组pe252。其中,一个运算周期为pe阵列250的一个pe完成一次对3*3*3的卷积核和3*3*3的数据块的卷积运算所占用的时长。由于各列pe卷积运算的过程类似,区别仅在不同的两列pe参与卷积运算的卷积核不同。因此,下面仅对乘法电路200第一列pe(即pe000、pe100至pe1500)执行扩张卷积运算的过程进行详细介绍。其他各列pe执行扩张卷积运算的过程不再详述。
[0176]
第一个运算周期
[0177]
对于图3所示的第一组pe251中第一列pe涉及的8个pe,pe000是对图5(c)所示的卷积核k1以及输入数据中的数据块c01进行卷积运算,得到大小为10*4的特征图p1'中的第一个数据r01,卷积运算的过程为:
[0178]
d0.0*x1 d0.2*x2 d0.4*x3 d2.0*x4 d2.2*x5 d2.4*x6 d4.0*x7 d4.2*x8 d4.4*x9=r01。
[0179]
pe100是对图5(e)所示的卷积核k1以及输入数据中的数据块c02进行卷积运算,得到10*4的特征图p1'中的第二个数据r02,卷积运算的过程为:
[0180]
d0.1*x1 d0.3*x2 d0.5*x3 d2.1*x4 d2.3*x5 d2.5*x6 d4.1*x7 d4.3*x8 d4.5*
x9=r02。
[0181]
依次类推,pe700是对卷积核k1以及输入数据中的数据块c08(未示出)进行卷积运算,得到10*4的特征图p1'中的第八个数据r08。
[0182]
继续参考图3,在第一个运算周期,对于图3所示的第二组pe252中第一列pe涉及的8个pe,pe800是对卷积核k1以及输入数据中的数据块c11(未示出)进行卷积运算,得到大小为10*4的特征图p1'中的第二行的第一个数据r11。
[0183]
pe900是对卷积核k1以及输入数据中的数据块c12(未示出)进行卷积运算,得到大小为10*4的特征图p1'中的第二行的第二个数据r12。
[0184]
依次类推,pe1500是对卷积核k1以及输入数据中的数据块c18(未示出)进行卷积运算,得到大小为10*4的特征图p1'中的第二行的第八个数据r18。
[0185]
第二个运算周期
[0186]
在第二个运算周期,第一列pe的第一组pe251中只有2个pe参与卷积运算过程。例如,pe000是对如图5(f)所示的卷积核k1以及输入数据中的数据块c09进行卷积运算,得到大小为10*4的特征图p1'中第一行的第九个数据r09,卷积运算的过程为:
[0187]
d0.8*x1 d0.10*x2 d0.12*x3 d2.8*x4 d2.10*x5 d2.12*x6 d4.8*x7 d4.10*x8 d4.12*x9=r09。
[0188]
pe100是对如图5(g)所示的卷积核k1以及输入数据中的数据块c10进行卷积运算,得到10*4的特征图p1'中的第一行的第十个数据r10,卷积运算的过程为:
[0189]
d0.9*x1 d0.11*x2 d0.13*x3 d2.9*x4 d2.11*x5 d2.13*x6 d4.9*x7 d4.11*x8 d4.13*x9=r10。
[0190]
在第二个运算周期,第一列pe的第二组pe252中也只有2个pe参与卷积运算过程。例如,pe800是对卷积核k1以及输入数据中的数据块c19(未示出)进行卷积运算,得到大小为10*4的特征图p1'中第二行的第九个数据r19;pe900是对卷积核k1以及输入数据中的数据块c110(未示出)进行卷积运算,得到大小为10*4的特征图p1'中第二行的第十个数据r110。
[0191]
经过上述第一个运算周期以及第二运算周期的卷积运算,得到了如图5(a)所示的10*4的特征图p1'的前两行数据(第一行的r01至r010,以及第二行的r11至r110)。不难理解的是,乘法电路200再经过第三个运算周期以及第四个运算周期,即可得到如图5(a)所示的特征图p1'第三行的r21至r210,以及第四行的r31至r310。至此,乘法电路200完成了3*3*3的卷积核k1和14*8*3的输入数据的扩张卷积运算。
[0192]
可以理解的是,对于乘法电路200其他各列pe,运算过程与第一列的pe000至pe1500的运算过程类似,唯一区别仅在于:每列pe参与卷积运算的卷积核不同。例如,第一列pe中参与卷积运算的卷积核为卷积核k1,第二列pe中参与卷积运算的卷积核为卷积核k2,第三列pe中参与卷积运算的卷积核为卷积核k3,依次类推,第16列pe中参与卷积运算的卷积核为卷积核k16。
[0193]
通过上述对乘法电路200执行扩张卷积运算过程的介绍中不难看出,乘法电路200在执行扩张卷积运算时,无需将参与运算的卷积核填充零值,在每一个运算周期,通过从输入数据中选取部分数据作为有效数据,和未填充的卷积核进行卷积运算,得到和采用填充零值后的卷积核对输入数据进行卷积运算相同的运算结果。并且,本技术提供的乘法电路
200在执行扩张卷积运算时,无需计算输入数据中与填充后的卷积核中零值相应的数据和填充后的卷积核中的零值的乘加运算,可以节省运算资源,降低功耗。
[0194]
此外,在一些实施例中,同样假设乘法电路200的输入数据缓存270以及参数缓存202的数据端口为4b(即输入数据缓存270以及参数缓存202中存储的数据是经过量化了的8比特的整型数),而输入数据和卷积核的通道数为3,则一个时钟周期内,一个pe只能获取一个数据块中的一个子数据块的数据,以及一个卷积核中的一个子数据块中的数据。因此,在一个时钟周期内,一个pe执行的是例如图4(b)所示的子数据块d0.0和子数据块x1的卷积运算,运算过程为:i0*r0 i1*r1 i2*r2。需要9个时钟周期才能完成对大小为3*3*3的数据块a01和大小为3*3*3的卷积核k1的卷积运算。
[0195]
此外,从前述关于运算周期的定义可知:一个运算周期为pe阵列250的一个pe完成一次对3*3*3的卷积核和3*3*3的数据块的卷积运算所占用的时长。因此,不难理解的是,一个运算周期包括9个时钟周期。
[0196]
以上只是对每个运算周期,乘法电路200执行扩张卷积运算的过程进行了大致介绍。在此基础上,下面将进一步结合乘法电路200的开关电路240中各个子开关从输入数据缓存270的各个存储单元中选取目标数据的选取规则,来对乘法电路200在每个运算周期内的每个时钟周期,执行扩张卷积的运算过程进行详细介绍。
[0197]
在一些实施例中,依然假设乘法电路200的输入数据处理模块260将dma控制单元201从外部存储空间中获取的如图4(a)所示的14*8*3的输入数据,按照上表1所展示的数据排列方式写入输入数据缓存270的16个存储单元b0至b15中。
[0198]
由于乘法电路200各列pe执行扩张卷积运算的过程类似,区别仅在不同的两列pe参与卷积运算的卷积核不同。因此,下面仍仅对乘法电路200第一列pe(即pe000、pe100至pe1500)在一个运算周期的各个时钟周期内的扩张卷积运算过程进行详细介绍。
[0199]
在第一个运算周期的第一个时钟周期
[0200]
参考图3和表1,开关电路240中的子开关sw0将输入数据缓存270的存储单元b0的addr0中选取d0.0作为目标子数据块,送入pe000中,和参数缓存202中获取的子数据块x1进行卷积运算。
[0201]
子开关sw1将输入数据缓存270的存储单元b1的addr0中选取d0.1作为目标子数据块,送入pe100中,和参数缓存202中获取的子数据块x1进行卷积运算。
[0202]
子开关sw2将输入数据缓存270的存储单元b2的addr0中选取d0.2作为目标子数据块,送入pe200中,和参数缓存202中获取的子数据块x1进行卷积运算。
[0203]
依次类推,子开关sw7将输入数据缓存270的存储单元b7的addr0中选取d0.7作为目标子数据块,送入pe700中,和参数缓存202中获取的子数据块x1进行卷积运算。
[0204]
子开关sw8将输入数据缓存270的存储单元b8的addr0中选取d1.0作为目标子数据块,送入pe800中,和参数缓存202中获取的子数据块x1进行卷积运算。
[0205]
子开关sw9将输入数据缓存270的存储单元b9的addr0中选取d1.1作为目标子数据块,送入pe900中,和参数缓存202中获取的子数据块x1进行卷积运算。
[0206]
依次类推,子开关sw15将输入数据缓存270的存储单元b15的addr0中选取d1.7作为目标子数据块,送入pe700中,和参数缓存202中获取的子数据块x1进行卷积运算。
[0207]
在第一个运算周期的第二个时钟周期
[0208]
继续参考图3和表1,开关电路240中的子开关sw0将输入数据缓存270的存储单元b2的addr0中选取d0.2作为目标子数据块,送入pe000中,和参数缓存202中获取的子数据块x2进行卷积运算。
[0209]
子开关sw1将输入数据缓存270的存储单元b3的addr0中选取d0.3作为目标子数据块,送入pe100中,和参数缓存202中获取的子数据块x2进行卷积运算。
[0210]
子开关sw2将输入数据缓存270的存储单元b4的addr0中选取d0.4作为目标子数据块,送入pe200中,和参数缓存202中获取的子数据块x2进行卷积运算。
[0211]
依次类推,子开关sw5将输入数据缓存270的存储单元b7的addr0中选取d0.7作为目标子数据块,送入pe500中,和参数缓存202中获取的子数据块x2进行卷积运算。
[0212]
而子开关sw6将输入数据缓存270的存储单元b0的addr1中选取d0.8作为目标子数据块,送入pe600中,和参数缓存202中获取的子数据块x2进行卷积运算。
[0213]
子开关sw7将输入数据缓存270的存储单元b1的addr1中选取d0.9作为目标子数据块,送入pe700中,和参数缓存202中获取的子数据块x2进行卷积运算。
[0214]
子开关sw8将输入数据缓存270的存储单元b10的addr0中选取d1.2作为目标子数据块,送入pe800中,和参数缓存202中获取的子数据块x2进行卷积运算。
[0215]
子开关sw9将输入数据缓存270的存储单元b11的addr0中选取d1.3作为目标子数据块,送入pe900中,和参数缓存202中获取的子数据块x2进行卷积运算。
[0216]
依次类推,子开关sw13将输入数据缓存270的存储单元b15的addr0中选取d1.7作为目标子数据块,送入pe1300中,和参数缓存202中获取的子数据块x2进行卷积运算。
[0217]
子开关sw14将输入数据缓存270的存储单元b8的addr1中选取d1.8作为目标子数据块,送入pe1300中,和参数缓存202中获取的子数据块x2进行卷积运算。
[0218]
而子开关sw15将输入数据缓存270的存储单元b9的addr1中选取d1.9作为目标子数据块,送入pe1500中,和参数缓存202中获取的子数据块x2进行卷积运算。
[0219]
第一个运算周期内,各个子开关从各个存储单元中选择出的目标子数据块与第一列pe(pe000至pe1500)中各个pe的对应关系如下表3所示。第一个运算周期内的其他时钟周期,以及第二运算周期至第六运算周期内的各个时钟周期,各个子开关从各个存储单元中选取的目标子数据块不再赘述。
[0220]
子开关clk1clk2clk3clk4clk5clk6clk7clk8clk9pesw0d0.0d0.2d0.4d2.0d2.2d2.4d4.0d4.2d4.4pe000sw1d0.1d0.3d0.5d2.1d2.3d2.5d4.1d4.3d4.5pe100sw2d0.2d0.4d0.6d2.2d2.4d2.6d4.2d4.4d4.6pe200sw3d0.3d0.5d0.7d2.3d2.5d2.7d4.3d4.5d4.7pe300sw4d0.4d0.6d0.8d2.4d2.6d2.8d4.4d4.6d4.8pe300sw5d0.5d0.7d0.9d2.5d2.7d2.9d4.5d4.7d4.9pe500sw6d0.6d0.8d0.10d2.6d2.8d2.10d4.6d4.8d4.10pe600sw7d0.7d0.9d0.11d2.7d2.9d2.11d4.7d4.9d4.11pe700sw8d1.0d1.2d1.4d3.0d3.2d3.4d4.0d4.2d4.4pe800sw9d1.1d1.3d1.5d3.1d3.3d3.5d5.1d5.3d5.5pe900sw10d1.2d1.4d1.6d3.2d3.4d3.6d5.2d5.4d5.6pe1000
sw11d1.3d1.5d1.7d3.3d3.5d3.7d5.3d5.5d5.7pe1100sw12d1.4d1.6d1.8d3.4d3.6d3.8d5.4d5.6d5.8pe1200sw13d1.5d1.7d1.9d3.5d3.7d3.9d5.5d5.7d5.9pe1300sw14d1.6d1.8d1.10d3.6d3.8d3.10d5.6d5.8d5.10pe1300sw15d1.7d1.9d1.11d3.7d3.9d3.11d5.7d5.9d5.11pe1500
[0221]
表3
[0222]
参考表2可知,当乘法电路200在执行扩张卷积运算时,在同一运算周期的相邻两个时钟周期内,各个子开关从输入数据中选取出的目标子数据块在输入数据中所处的位置是不连续的。
[0223]
此外,可以理解的是,以上关于通道数为3的卷积核对通道数同样为3的输入数据进行标准卷积和扩张卷积的运算过程的介绍,仅仅是为了说明标准卷积和扩张卷积的大致运算过程的一个简单的示例。本技术的技术方案在实际应用中,对标准卷积和扩张卷积运算中涉及的输入数据以及卷积核数据的通道数不做限定。例如,在一些实施例中,本技术提供的乘法电路在执行标准卷积运算以及扩张卷积运算过程中,参与运算的输入数据以及卷积核数据的通道数可以为32的整数倍。
[0224]
在介绍完本技术提供的乘法电路200的硬件结构以及乘法电路200执行扩张卷积运算和标准卷积运算的过程之后,以下将对本技术提供的一种包括乘法电路200的片上系统进行介绍。
[0225]
例如,如图6所示,片上系统(system on chip,soc)300包括乘法电路200、主控中央处理器(central processing unit,cpu)310、双倍速率(double data rate,ddr)内存320以及先进可扩展接口(advanced extensible interface,axi)总线330。乘法电路200、主控cpu310以及ddr内存320通过axi总线330进行通信。其中,乘法电路200的结构以及工作原理已在前文介绍过,具体请参阅以上关于图1至图5部分的文字描述,在此不再赘述。
[0226]
ddr内存320可以用于加载以及存储数据和/或指令。例如,在一些实施例中,ddr内存320可以用于加载或者存储乘法电路200执行标准卷积运算或者扩张卷积运算时所涉及的卷积核数据、输入数据以及乘法电路200输出的卷积结果数据等。
[0227]
主控cpu310可以包括一个或多个单核或多核处理器。在一些实施例中,主控cpu310可以包括通用处理器和专用处理器(例如,图形处理器,应用处理器,基带处理器等)的任意组合。在一些实施例中,主控cpu310可以用于在不同的应用场景下,控制乘法电路200在扩张卷积运算模式和标准卷积运算模式之间切换,使乘法电路200执行扩张卷积运算或者标准卷积运算。例如,在一些实施例中,在ddr内存320中存储有片上系统300的运算程序,将抠图场景对应的扩张卷积运算程序以及人脸识别门禁场景对应的标准卷积运算程序用不同的标签进行映射。主控cpu310从ddr内存320中取指令,然后根据不同的指令控制乘法电路200执行不同的运算模式。
[0228]
至此,对本技术提供的乘法电路200以及设置有乘法电路200的片上系统300结构以及工作原理进行了介绍。
[0229]
需要说明的是,本技术技术方案除了通过例如图2所示的乘法电路200能够实现之外,还可以通过其他方式,如通过软件实现。
[0230]
例如,在一些实施例中,本技术的技术方案通过如图7所示的流程图来实现。具体
地,如图7所示,本技术提供的一种卷积运算方法包括以下步骤:
[0231]
步骤701:判断需要执行的卷积运算模式,在需要执行扩张卷积运算时,进入步骤702,在需要执行标准卷积运算时,进入步骤704。
[0232]
步骤702:获取第一待卷积数据。其中,第一待卷积数据为根据预设步长,采用和第二卷积核相同大小的滑动窗口在输入数据上滑动,得到的多个和第二卷积核相同大小的数据块。
[0233]
例如,假设第一卷积核大小为3*3*3,扩张卷积运算的扩张参数d=1,也即需要将第一卷积核的各个通道参数中,每两个相邻数据之间要填充一个零(也即扩张数据为零)。则得到扩张后的大小为5*5*3的第二卷积核。
[0234]
如图5(a)所示,对于大小为14*8*3的输入数据,以通道c1左上方的第一个数据为起点,步长为1,按照5*5*3的滑动窗口在输入数据上滑动。得到大小同样为5*5*3的多个待卷积数据。例如,首先从左往右滑动,得到数据块b01至b010;然后从数据块b01再向下滑动一个数据后继续从左往右滑动,得到数据块b11至b110;再从数据块b11向下滑动一个数据后继续从左往右滑动,得到数据块b21至b210,依次类推,再依次得到数据块b31至b310。
[0235]
步骤703:根据第二卷积核中的扩张数据的排布,从第一待卷积数据中选择出有效数据。其中第二卷积核是在第一卷积核中加入扩张数据生成的,有效数据为第一待卷积数据中不与第二卷积核中的扩张数据进行运算的数据。其中,扩张数据为按照预设间隔在第一卷积核中加入的多行和/或多列的多个零
[0236]
例如,扩张卷积运算的扩张参数d=1,则预设间隔为1,即在第一卷积核中每两个相邻数据之间填充一个零,也即扩张数据为按照预设间隔为1在第一卷积核中加入的多行多列的多个零。例如,假设第一卷积核大小为3*3*3,扩张卷积运算的扩张参数d=1,则得到扩张后的大小为5*5*3的第二卷积核。其中,扩张数据为填充的两行两列的多个零,其中一行或一列均包含5个零。
[0237]
步骤704:获取第二待卷积数据。其中,第二待卷积数据为根据预设步长,采用和第一卷积核相同大小的滑动窗口在输入数据上滑动,得到的多个和第一卷积核相同大小的数据块。
[0238]
例如,假设第一卷积核大小为3*3*3,输入数据大小为14*8*3。则如图4(a)所示,对于大小为14*8*3的输入数据,以通道c1左上方的第一个数据为起点,预设步长为1,按照3*3*3的滑动窗口在输入数据上滑动。得到大小同样为3*3*3的多个待卷积数据。例如,首先从左往右滑动,得到数据块a01至a012;然后从数据块a01再向下滑动一个数据后继续从左往右滑动,得到数据块a11至a112;再从数据块a11向下滑动一个数据后继续从左往右滑动,得到数据块a21至a212,依次类推,再依次得到数据块a31至a312,数据块a41至a412,数据块a51至a512。
[0239]
步骤705:将第二待卷积数据确定为有效数据。
[0240]
步骤706:采用多个第一卷积核对有效数据进行卷积运算。具体运算方法请参见以上关于乘法电路200执行扩张卷积运算以及标准卷积运算的相关描述,在此不再赘述。
[0241]
图8根据本技术的一些实施例,提供了一种电子设备100的结构框图。如图8所示,电子设备100包括存储器110、输入输出设备120、处理器140、通信模块130以及片上系统300。
[0242]
乘法电路200用于在不同场景下执行不同的卷积运算,例如在抠图场景中,执行扩张卷积运算;在人脸识别门禁场景中,执行标准卷积运算。具体可以参考上述关于图1至图5部分的文字描述,在此不再赘述。
[0243]
处理器140可以包括一个或多个处理单元,例如,可以包括中央处理器(central processing unit,cpu)、图像处理器(graphics processing unit,gpu)、数字信号处理器(digital signal processor,dsp)、微处理器(micro

programmed control unit,mcu)、人工智能(artificial intelligence,ai)处理器或可编程逻辑器件(field programmable gate array,fpga)等的处理模块或处理电路。在一些实施例中,假设电子设备100为计算机,则处理器140用于根据乘法电路200输出的计算结果,得到目标抠图对象。又例如,在一些实施例中,假设电子设备100为人脸识别门禁,则处理器140用于根据乘法电路200输出的人脸识别结果,确定是否打开门禁。在一些实施例中,处理器140可以执行如图7所示的卷积运算方法。
[0244]
存储器110,可用于存储数据、软件程序以及模块,可以是易失性存储器(volatile memory),例如随机存取存储器(random

access memory,ram);或者非易失性存储器(non

volatile memory),例如只读存储器(read

only memory,rom),快闪存储器(flash memory),硬盘(hard disk drive,hdd)或固态硬盘(solid

state drive,ssd);或者上述种类的存储器的组合,或者也可以是可移动存储介质,例如安全数字(secure digital,sd)存储卡。例如,存储器110用于存储乘法电路200的运算程序、乘法电路200输出的卷积运算结果、采集的图像以及乘法电路200执行卷积运算所涉及的卷积核数据等。在一些实施例中,存储器110可以存储相应的软件程序,当这些软件程序被运行时,实现如图7所示的卷积运算方法。
[0245]
输入输出设备120,可以包括显示屏、触摸屏和喇叭等。
[0246]
通信模块130,例如wifi模块、通用串行总线(universal serial bus,usb)、4g和5g模块等。用于供电子设备100通过通信模块130和其他电子设备通信。
[0247]
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机指令时,全部或部分地产生按照本技术实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(digital subscriber line,dsl))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(例如,软盘、硬盘、磁带)、光介质(例如,高密度数字视频光盘(digital video disc,dvd))、或者半导体介质(例如,固态硬盘(solid state disk,ssd))等。
[0248]
本技术公开的机制的各实施例可以被实现在硬件、软件、固件或这些实现方法的组合中。本技术的实施例可实现为在可编程系统上执行的计算机程序或程序代码,该可编
程系统包括至少一个处理器、存储系统(包括易失性和非易失性存储器和/或存储元件)、至少一个输入设备以及至少一个输出设备。
[0249]
可将程序代码应用于输入指令,以执行本技术描述的各功能并生成输出信息。可以按已知方式将输出信息应用于一个或多个输出设备。为了本技术的目的,处理系统包括具有诸如例如数字信号处理器(digital signal processor,dsp)、微控制器、专用集成电路(application specific integrated circuit,asic)或微处理器之类的处理器的任何系统。
[0250]
程序代码可以用高级程序化语言或面向对象的编程语言来实现,以便与处理系统通信。在需要时,也可用汇编语言或机器语言来实现程序代码。事实上,本技术中描述的机制不限于任何特定编程语言的范围。在任一情形下,该语言可以是编译语言或解释语言。
[0251]
在一些情况下,所公开的实施例可以以硬件、固件、软件或其任何组合来实现。所公开的实施例还可以被实现为由一个或多个暂时或非暂时性机器可读(例如,计算机可读)存储介质承载或存储在其上的指令,其可以由一个或多个处理器读取和执行。例如,指令可以通过网络或通过其他计算机可读介质分发。因此,机器可读介质可以包括用于以机器(例如,计算机)可读的形式存储或传输信息的任何机制,包括但不限于,软盘、光盘、光碟、只读存储器(cd

roms)、磁光盘、只读存储器(read only memory,rom)、随机存取存储器(random access memory,ram)、可擦除可编程只读存储器(erasable programmable read only memory,eprom)、电可擦除可编程只读存储器(electrically erasable programmable read

only memory,eeprom)、磁卡或光卡、闪存、或用于利用因特网以电、光、声或其他形式的传播信号来传输信息(例如,载波、红外信号数字信号等)的有形的机器可读存储器。因此,机器可读介质包括适合于以机器(例如计算机)可读的形式存储或传输电子指令或信息的任何类型的机器可读介质。
[0252]
在附图中,可以以特定布置和/或顺序示出一些结构或方法特征。然而,应该理解,可能不需要这样的特定布置和/或排序。而是,在一些实施例中,这些特征可以以不同于说明性附图中所示的方式和/或顺序来布置。另外,在特定图中包括结构或方法特征并不意味着暗示在所有实施例中都需要这样的特征,并且在一些实施例中,可以不包括这些特征或者可以与其他特征组合。
[0253]
需要说明的是,本技术各设备实施例中提到的各单元/模块都是逻辑单元/模块,在物理上,一个逻辑单元/模块可以是一个物理单元/模块,也可以是一个物理单元/模块的一部分,还可以以多个物理单元/模块的组合实现,这些逻辑单元/模块本身的物理实现方式并不是最重要的,这些逻辑单元/模块所实现的功能的组合才是解决本技术所提出的技术问题的关键。此外,为了突出本技术的创新部分,本技术上述各设备实施例并没有将与解决本技术所提出的技术问题关系不太密切的单元/模块引入,这并不表明上述设备实施例并不存在其它的单元/模块。
[0254]
需要说明的是,在本专利的示例和说明书中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方
法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
[0255]
虽然通过参照本技术的某些优选实施例,已经对本技术进行了图示和描述,但本领域的普通技术人员应该明白,可以在形式上和细节上对其作各种改变,而不偏离本技术的精神和范围。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献