将卷积映射到矩阵处理器单元
发明背景
使用神经网络可以解决一整类复杂的人工智能问题。由于这些问题通常是计算和数据密集型的,硬件解决方案通常有利于提高神经网络的性能。人工智能问题的解决方案通常可以使用基于硬件的解决方案而更快地得到解决,这些解决方案优化了卷积运算的性能,并且特别是逐深度卷积运算(depthwise convolution operation)的性能。传统的逐深度卷积优化方法需要专门的硬件和复杂的存储器组织方案。创建一个兼容求解不同矩阵运算的硬件平台,同时还显著提高求解卷积运算的性能和效率,是一项技术挑战。因此,存在对硬件和数据路径解决方案(data path solution)的需求,该硬件和数据路径解决方案提高了有效计算解决复杂人工智能问题所需的卷积运算的能力,而不会引入显著的复杂性和限制。
附图简述
在以下详细描述和附图中公开了本发明的各种实施例。
图1是示出使用神经网络解决人工智能问题的系统的实施例的框图。
图2是示出使用神经网络解决人工智能问题的处理器系统的实施例的框图。
图3是示出使用矩阵处理器单元执行二维卷积运算的过程的实施例的流程图。
图4是示出使用矩阵处理器单元执行二维卷积运算的过程的实施例的流程图。
图5是示出使用矩阵处理器单元和向量单元运算来执行二维卷积运算的过程的实施例的流程图。
图6是示出使用矩阵处理器单元和向量单元运算来执行二维卷积运算的过程的实施例的流程图。
图7A和图7B是示出用于执行逐深度卷积的示例矩阵操作数(matrix operand)的图示。
图8A和图8B是示出用于执行逐深度卷积的展开的数据矩阵(unrolled datamatrix)的示例的图示。
图9A和图9B是示出用于执行逐深度卷积的展开的权重矩阵的示例的图示。
图10A和图10B是示出用于执行逐深度卷积的向量计算的示例的图示。
图11A和图11B是示出用于执行逐深度卷积的示例矩阵操作数的图示。
图12A和图12B是示出用于执行逐深度卷积的部分展开的数据矩阵的示例的图示。
图13A和图13B是示出用于执行逐深度卷积的部分展开的权重矩阵的示例的图示。
图14A和图14B是示出用于执行逐深度卷积的部分展开的权重矩阵的示例的图示。
图15A和图15B是示出用于执行逐深度卷积的部分展开的权重矩阵的示例的图示。
图16A和图16B是示出用于执行逐深度卷积的部分展开的权重矩阵的示例的图示。
详细描述
本发明可以以多种方式实现,包括作为过程;装置;系统;物质的组成;体现在计算机可读存储介质上的计算机程序产品;和/或处理器,例如被配置为执行存储在耦合到处理器的存储器上和/或由该存储器提供的指令的处理器。在本说明书中,这些实现或者本发明可以采取的任何其他形式可以被称为技术。通常,在本发明的范围内,可以改变所公开的过程的步骤顺序。除非另有说明,否则被描述为被配置为执行任务的诸如处理器或存储器的组件可以被实现为在给定时间被临时配置为执行任务的通用组件或者被制造为执行任务的特定组件。如本文所使用的,术语“处理器”指的是被配置成处理数据(例如计算机程序指令)的一个或更多个设备、电路和/或处理核心。
下面提供了本发明的一个或更多个实施例的详细描述连同说明本发明原理的附图。结合这些实施例描述了本发明,但是本发明不限于任何实施例。本发明的范围仅由权利要求限定,并且本发明包括许多替代、修改和等同物。为了提供对本发明的全面理解,在以下描述中阐述了许多具体细节。这些细节是出于示例的目的而提供的,并且本发明可以根据权利要求来被实施,而不需要这些具体细节中的一些或全部。为了清楚起见,没有详细描述与本发明相关的技术领域中已知的技术材料,以便不会不必要地模糊本发明。
公开了一种用于执行有效卷积运算的处理器系统。使用所公开的技术,显著增加了用于计算卷积运算,特别是逐深度卷积的吞吐量和功率效率。在一些实施例中,处理器系统包括能够对两个输入矩阵执行矩阵运算的矩阵处理器单元。矩阵处理器单元包括多个计算单元,例如用于处理输入矩阵的输入向量的向量单元。在各种实施例中,计算单元至少包括向量乘法单元和向量加法器单元。向量乘法单元能够使用两个输入向量的相应元素来执行乘法运算。在一些实施例中,向量加法器单元用于对使用向量乘法单元计算的相乘结果的向量进行求和。例如,向量加法器单元可以用于使用来自相应输入向量的向量元素的向量相乘结果来计算两个向量的点积结果。在一些实施例中,向量加法器单元是加法器树(adder tree)。例如,加法器树通过对相乘结果和随后的部分和(partial sums)进行并行求和来计算相乘结果的和。
在各种实施例中,矩阵处理器单元用于通过展开输入矩阵来计算卷积运算(例如两个输入矩阵(例如权重输入矩阵和数据输入矩阵)的逐深度卷积)的结果。例如,从二维矩阵开始展开权重矩阵,并将多行展开为格式化为向量的单行。3x3矩阵可以被展开成单个向量,并且可以在行之间包括填充(例如零元素)。在一些实施例中,权重矩阵可以被部分展开,并且需要多次展开的迭代来完全展开整个矩阵。例如,可以使用两次或更多次迭代来展开5x5、7x7和/或9x9矩阵,其中每次迭代涉及展开两行或更多行。例如,在一些实施例中,在四次迭代中展开7x7矩阵。第一次迭代展开7x7矩阵的第1行和第2行,第二次迭代展开7x7矩阵的第3行和第4行,第三次迭代展开7x7矩阵的第5行和第6行,以及第四次迭代展开7x7矩阵的第7行。在各种实施例中,根据输入矩阵的大小、为每次交互展开的行数以及矩阵处理器单元向量大小能力,可以使用不同的迭代次数。在展开权重输入矩阵的同时,数据输入矩阵也被展开。在各种实施例中,在相同的迭代次数上展开数据输入矩阵的相应行,并且每个展开被格式化以将向量输入数据的元素与来自权重输入数据的相应元素对齐。使用矩阵处理器单元处理输入向量,以计算结果和。在一些实施例中,结果和是部分(或中间)和,并且与从每次迭代中计算出的部分(或中间)和相加。
在各种实施例中,展开的权重向量的元素例如在迭代期间被移位,以计算权重向量与相应数据输入元素的下一列的至少部分卷积结果。例如,展开的权重输入向量的元素可以移位一个行元素,以将权重向量元素与展开的数据输入向量的相应下一列对齐。在一些实施例中,迭代期间执行的移位数量对应于权重输入向量的行之间的填充量。例如,在七个零填充元素将每个展开的行与权重输入矩阵分隔开的情况下,在执行矩阵计算操作的初始集合之后,可以在进行下一次迭代之前执行七次移位和相应的矩阵计算操作。在各种实施例中,展开的权重输入向量可以被广播到每个向量计算单元,以并行计算多行的向量结果。在一些实施例中,可以利用多个矩阵处理器单元,并且不同的矩阵处理器单元可以并行计算同一输入矩阵的不同迭代的部分和。来自每个矩阵处理器单元的部分和结果可以被组合以计算结果和。
在一些实施例中,处理器系统包括矩阵处理器单元、第一类型寄存器、一组第二类型寄存器和多个计算单元。处理器系统可以用于执行高效的卷积运算(例如逐深度卷积运算)而不需要复杂的存储器组织方案。在一些实施例中,第一类型寄存器被配置为同时存储第一矩阵的多个不同行的值。例如,第一矩阵可以是用于执行一个或更多个逐深度卷积的权重矩阵。在各种实施例中,第一类型寄存器的至少一部分在逻辑上被分成元素的组,并且每个组对应于第一矩阵的不同行。例如,3x3权重矩阵可以被分成三个行组,每个行组对应于3x3权重矩阵的不同行。可以将第一类型寄存器分成多达三个组,其中每个组对应于3x3权重矩阵的不同行组。作为另一个示例,可以将7x7权重矩阵分成七个行组,并且可以将第一类型寄存器分成多达七个组,其中每个组对应于7x7权重矩阵的不同行组。在一些实施例中,第一类型寄存器可以被分成比第一矩阵的行数更少的组。例如,在一些实施例中,第一类型寄存器可以被分成少至两个组,每个组最多对应于第一矩阵的一对行,例如7x7权重矩阵的一行或两行。在一些实施例中,第二类型寄存器中的每一个被配置为同时存储来自第二矩阵的多个不同行的值。例如,第二矩阵可以是用作一个或更多个卷积运算的参数(argument)的数据输入矩阵。数据输入矩阵的数据可以对应于图像数据、视频数据、用户数据、中间神经网络数据结果等。在各种实施例中,使用第一矩阵和第二矩阵执行逐深度卷积。例如,第一矩阵可以是权重输入矩阵,并且第二矩阵可以是数据输入矩阵。在一些实施例中,多个计算单元中的每一个对应于第二类型寄存器中的一个。例如,每个计算单元可以对应于存储在第二类型寄存器之一中的数据输入元素的向量。在各种实施例中,每个计算单元是向量计算单元。例如,矩阵处理器单元包括用于计算矩阵运算的多个向量计算单元。在一些实施例中,每个计算单元被配置为将存储在第一类型寄存器中的每个值与存储在相应的第二类型寄存器中的相应值相乘,并将相应计算单元的相乘结果相加在一起。例如,对于每个计算单元,存储在第一类型寄存器中的元素与第二类型寄存器之一的相应元素相乘,以创建相乘结果的向量。相乘结果被相加在一起以确定输出结果。在一些实施例中,输出结果是点积,并且计算单元的结果是输出结果的向量。在一些实施例中,向量输出结果可以用于至少部分地确定第一矩阵和第二矩阵的至少一部分相乘的结果。例如,向量输出结果的连续累加可以用于确定权重输入矩阵与数据输入矩阵相乘的结果。在一些实施例中,向量输出结果可以用于至少部分地确定将第二矩阵与第一矩阵卷积的结果矩阵中的相应元素。例如,向量输出结果的连续累加可以用于确定使用权重输入矩阵和数据输入矩阵的逐深度卷积的结果。
图1是示出使用神经网络解决人工智能问题的系统的实施例的框图。在所示的示例中,系统100包括矩阵处理器单元101、数据输入向量103、权重输入向量105、存储器107和输出向量151。矩阵处理器单元101包括多个向量单元,该多个向量单元至少包括向量单元111、121、131和141。在各种实施例中,矩阵处理器单元101包括的向量单元的数量匹配权重输入向量105中的元素的数量。例如,数据输入向量103、权重输入向量105和输出向量151的大小可以被设置为各自存储32个元素,并且矩阵处理器单元101可以包括32个向量单元。在适当的情况下,可以使用其他向量长度。类似地,由系统100处理的元素的大小可以被适当地配置。例如,元素可以是4位、8位、2字节、4字节或其他合适的大小。在各种实施例中,矩阵处理器单元101被配置成分别经由数据输入向量103和权重输入向量105接收两个输入矩阵,每个矩阵是二维矩阵。数据输入向量103、权重输入向量105和输出向量151可以被实现为硬件寄存器(例如触发器电路),用于向/从矩阵处理器单元101传送多个输入和输出元素。在一些实施例中,从存储器107中检索每个数据向量,并经由数据输入向量103将其加载到矩阵处理器单元101的相应向量单元(例如向量单元111、121、131或141)中。例如,具有32个向量单元的矩阵处理器单元经由数据输入向量103加载有32个数据元素向量。相应地,可以经由权重输入向量105从存储器107加载权重元素的向量,并将该权重元素的向量广播给矩阵处理器单元101的所有适用向量单元。通过向矩阵处理器单元101的所有向量单元广播权重输入向量105,同一权重值可以由矩阵处理器单元和每个相应的向量单元应用于不同的数据向量。在一些实施例中,数据输入向量103、权重输入向量105和/或输出向量151可以被实现为多于一个的输入/输出向量。在各种实施例中,图1的粗箭头表示数据移动通过系统100的组件的方向。例如,箭头可以对应于多元素的宽的通信/数据总线和/或数据线。在各种实施例中,存储在输出向量151中的输出向量结果可以写回到存储器107。
在各种实施例中,矩阵处理器单元101的每个向量单元(例如向量单元111、121、131或141)接收两个向量操作数,并且可以执行一个或更多个向量运算。例如,向量单元可以计算两个输入操作数的点积,并将结果作为输出向量151的一个元素进行输出。在一些实施例中,向量单元结果被累加并用作向量单元执行的后续操作的操作数。在一些实施例中,矩阵处理器单元101的每个向量单元(例如向量单元111、121、131或141)包括乘法单元和加法器单元(未示出)。在一些实施例中,矩阵处理器单元101的每个向量单元可以包括向量累加器(未示出),例如,用于存储向量运算之间的部分结果。
使用所公开的技术,系统100,特别是矩阵处理器单元101可以被用来有效地执行逐深度卷积运算,以使用神经网络解决人工智能问题。可以经由数据输入向量103和/或权重输入向量105来展开二维矩阵操作数并将该二维矩阵操作数格式化成输入向量。输入向量可以用于使用向量单元(例如矩阵处理器单元101的向量单元111、121、131或141)来实现逐深度卷积。在一些实施例中,诸如权重输入向量105的输入向量包括用于有效地移位输入向量内的元素的逻辑。例如,元素可以向右移位一个位置。在各种实施例中,移位逻辑/电路可以被配置成将元素向右(或向左)移位不同数量的位置。在一些实施例中,元素在被移位超过输入向量的开始或末尾时循环(loop around),和/或元素可以用诸如零填充元素的默认值来替换。
图2是示出使用神经网络解决人工智能问题的处理器系统的实施例的框图。在所示的示例中,处理器系统包括矩阵处理器单元201、数据输入向量203、权重输入向量205和输出向量251。矩阵处理器单元201包括多个向量单元,该多个向量单元至少包括向量单元211和221。每个向量单元至少包括向量乘法单元和向量加法器单元。例如,向量单元211包括向量乘法单元213和向量加法器单元215。并且向量单元221包括向量乘法单元223和向量加法器单元225。在各种实施例中,矩阵处理器单元201包括的向量单元的数量匹配权重输入向量205中的元素的数量。在各种实施例中,矩阵处理器单元201被配置成分别经由数据输入向量203和权重输入向量205接收两个输入矩阵,每个矩阵是二维矩阵,并将矩阵结果输出到输出向量251。在一些实施例中,矩阵处理器单元201、数据输入向量203、权重输入向量205和输出向量251分别是图1的矩阵处理器单元101、数据输入向量103、权重输入向量105和输出向量151。在一些实施例中,向量单元211和221各自是图1的一个或更多个向量单元111、121、131或141。在一些实施例中,可以并行利用多个矩阵处理器单元(例如矩阵处理器单元201)以提高性能。例如,一个矩阵处理器单元可以用于处理大矩阵的一个切片(slice),而另一个矩阵处理器单元可以用于处理同一矩阵的单独切片。
在一些实施例中,数据输入向量203用于将向量操作数加载到矩阵处理器单元201中。例如,对应于二维矩阵的至少一部分的数据可以在被加载到矩阵处理器单元201之前从存储器中读取并存储在数据输入向量203中。在各种实施例中,可以将存储在数据输入向量203中的向量操作数导向矩阵处理器单元201的向量单元中的任何一个,例如向量乘法单元213或223。例如,在一些实施例中,矩阵处理器单元201包括32个向量单元。在32个周期内,32个向量操作数可以经由数据输入向量203加载到矩阵处理器单元201中。对于每个周期,一个向量操作数被加载到数据输入向量203中,然后被加载到32个向量单元之一中。32个周期之后,所有32个向量单元都已接收到数据向量操作数。类似地,权重输入向量205用于将第二向量操作数加载到矩阵处理器单元201中。例如,对应于二维权重矩阵的至少一部分的权重数据可以在被加载到矩阵处理器单元201之前从存储器中读取并存储在权重输入向量205中。在各种实施例中,可以将存储在权重输入向量205中的向量操作数导向矩阵处理器单元201的向量单元(例如向量乘法单元213或223)中的任何一个或全部。例如,同一向量操作数可以被广播到矩阵处理器单元201的所有向量单元。这允许将同一权重数据应用于每个数据向量操作数。在一些实施例中,数据输入向量203可以用于类似地向所有向量单元广播向量操作数。
在一些实施例中,经由数据输入向量203和/或权重输入向量205将向量操作数从存储器加载到矩阵处理器单元201中所需的周期数基于矩阵处理器单元的利用率。例如,为了保持矩阵处理器接近完全利用,从存储器中检索向量单元的数据参数,并在与向量单元的计算利用率紧密匹配的时间段(例如,一定数量的周期)内准备该数据参数。通过匹配负载和计算时间,矩阵处理器可以保持接近完全利用。在一些实施例中,例如,通过增加总线速度来减少数据读取时间,从而更好地匹配负载和计算时间。例如,在各种实施例中,矩阵处理器单元201可能花费大约八个时钟周期来完成某一组计算。(一组计算的示例可能包括将八个不同的权重输入向量应用于一组数据输入向量。)每个周期一个向量操作数的读取速率将需要至少32个周期来加载所有向量单元。将读取速率提高4倍,可以允许在大约8个周期内加载所有32个向量操作数,这与矩阵处理器单元的处理计算时间相匹配。在各种实施例中,通过将数据读取速度(例如,用于加载向量操作数的数据总线速度)与矩阵处理器单元计算性能和工作负载(workload)相匹配,矩阵处理器单元的整体效率和吞吐量显著增加。
在一些实施例中,数据输入向量203和/或权重输入向量205包括移位硬件(未示出)以移位向量操作数的元素。例如,权重输入向量205可以加载有用于第一次迭代的向量操作数。在第二次迭代期间,向量操作数被适当地(向右或向左)移位一个或更多个位置。新移位的向量操作数可以用于矩阵计算。一旦矩阵计算完成,可以再次移位向量操作数,并且新移位的向量操作数可以用于下一次迭代。以这种方式,在每次迭代期间应用(通过移位输入向量的内容来确定的)新的向量操作数。例如,在一些实施例中,移位逻辑用于展开的矩阵操作数(例如展开的权重矩阵),以将展开的矩阵操作数与来自第二矩阵操作数(例如展开的数据矩阵)的适当元素对齐。
在一些实施例中,矩阵处理器单元201包括多个向量单元,每个向量单元包括向量乘法单元和向量加法器单元。每个向量乘法单元(例如向量乘法单元213或223)被配置成对来自数据输入向量203和权重输入向量205的相应元素进行乘法运算。在一些实施例中,结果是相乘结果的向量。例如,对于两个32字节的输入向量,向量乘法单元的结果是32个相乘结果的向量。来自数据输入向量203的第一元素与权重输入向量205的第一元素相乘。类似地,来自数据输入向量203的第二元素与权重输入向量205的第二元素相乘。在各种实施例中,来自数据输入向量203和权重输入向量205的相应元素被并行相乘。在各种实施例中,相乘结果的向量被传递到向量单元的向量加法器单元。例如,向量乘法单元213将其相乘结果传递给向量加法器单元215,并且向量乘法单元223将其相乘结果传递给向量加法器单元225。
在一些实施例中,每个向量加法器单元(例如向量加法器单元215或225)被配置为计算来自输入向量的元素的和。例如,向量加法器单元215计算来自由向量乘法单元213计算的相乘结果的向量的每个元素的和。类似地,向量加法器单元225计算来自由向量乘法单元223计算的相乘结果的向量的每个元素的和。在一些实施例中,向量加法器单元的结果是用作相应向量乘法单元的输入的向量的点积。在各种实施例中,每个向量加法器单元(例如向量加法器单元215或225)被实现为加法器树。例如,加法器树的顶层可以添加成对的元素以确定一组部分和,例如添加元素0和1以确定第一部分和,以及添加元素2和3以确定第二部分和,等等。每个后续层可以对来自前一层的部分和进行求和,直到最后一层计算出最终结果和。在各种实施例中,每个加法器树并行计算部分和,以得到结果和。并行运算显著提高了对数字向量进行求和的效率。在各种实施例中,多个向量单元可以并行操作以并行计算多个点积,显著提高了矩阵和卷积运算的吞吐量。
在一些实施例中,矩阵处理器单元201包括例如一个或更多个累加器,以累加每个向量单元的结果。在一些实施例中,累加器作为向量单元的一部分或者作为矩阵处理器单元201的一部分被适当地包括。累加器可以用于对向量单元的多次迭代所计算的结果进行求和。例如,向量单元的一次迭代的最终结果和可以被存储在累加器中,并被添加到向量单元的下一次迭代的最终结果和中。在一些实施例中,累加器是向量累加器。例如,可以基于输出向量251的大小来确定累加器的大小。在各种实施例中,一旦矩阵处理完成,累加器结果可以被推送到输出向量251。
图3是示出使用矩阵处理器单元执行二维卷积运算的过程的实施例的流程图。例如,通过求解一个或更多个二维卷积运算来分析神经网络的一个或更多个层,从而部分地使用神经网络来解决人工智能问题。可以通过向一个或更多个矩阵处理器单元发出一个或更多个二维卷积运算指令来启动适当的二维卷积运算。每个指令可以指示两个操作数矩阵,例如,通过指定每个矩阵操作数在存储器、寄存器或另一个适当位置中的位置。在一些实施例中,指令对应于使用数据(或激活)矩阵和权重矩阵的逐深度卷积。在一些实施例中,使用图1的矩阵处理器单元101和/或图2的矩阵处理器单元201来执行卷积运算。
在301,接收二维卷积运算指令。例如,指令由处理器元件接收,该处理器元件例如是包括矩阵处理器单元、输入向量寄存器、输出向量寄存器、本地存储器、控制逻辑单元、转置逻辑单元和/或数据连接器单元(data joiner unit),以及其他组件的处理器元件。在各种实施例中,除了矩阵处理器单元之外,处理器元件可以包括附加的或更少的组件。接收到的二维卷积运算指令指示处理器元件执行二维卷积运算,并指定两个矩阵操作数。例如,第一操作数可以是二维数据矩阵,并且第二操作数可以是权重矩阵。在一些实施例中,如果不首先将一个或更多个矩阵操作数分成更小的矩阵切片,矩阵操作数可能太大而不能加载到矩阵处理器单元中。
在303,准备二维数据输入操作数。例如,准备二维数据矩阵作为卷积运算的操作数。在一些实施例中,从存储器或另一位置检索对应于二维数据输入操作数的数据。检索的数据可以是数据输入操作数的某些行和/或列。例如,数据输入操作数的不同切片可以单独准备和/或可以由不同的处理元件并行准备。在各种实施例中,准备可以包括展开二维数据输入操作数的部分。例如,数据输入矩阵的指定部分可以线性化为向量。在一些实施例中,仅矩阵的一部分或矩阵切片被线性化,例如,仅行的子集。在展开并线性化矩阵的所选部分时,可以通过填充元素(例如零元素)来分隔行,以至少部分地将所选矩阵元素与来自权重输入操作数的相应元素对齐。在各种实施例中,准备好的数据输入操作数被加载到矩阵处理器单元的向量单元中。根据输入操作数,矩阵的附加部分被展开、线性化并加载到矩阵处理器单元中。例如,对应于二维数据输入操作数的不同(且可能重叠)部分的向量被展开、线性化并加载到矩阵处理器单元的每个向量单元中。在一些实施例中,经由数据输入向量(例如图1的数据输入向量103和/或图2的数据输入向量203)加载准备好的数据输入操作数。
在305,准备二维权重输入操作数。例如,准备二维权重矩阵作为卷积运算的第二操作数。在一些实施例中,从存储器或另一位置检索对应于二维权重输入操作数的数据。检索的权重数据可以是权重输入操作数的某些行和/或列。例如,权重输入操作数的不同切片可以单独准备和/或可以由不同的处理元件并行准备。在各种实施例中,准备可以包括展开二维权重输入操作数的部分。例如,权重输入矩阵的指定部分可以线性化为向量。在一些实施例中,仅矩阵的一部分或矩阵切片被线性化,例如,仅行的子集。在展开并线性化矩阵的所选部分时,可以通过填充元素(例如零元素)来分隔行,以至少部分地将所选矩阵元素与来自数据输入操作数的相应元素对齐。填充元素的数量可以至少部分地基于矩阵处理器单元支持的数据大小和权重输入矩阵的维度而变化。在各种实施例中,准备好的权重输入操作数被加载到矩阵处理器单元的向量单元中。在一些实施例中,准备好的权重输入操作数被广播并加载到矩阵处理器单元的多于一个的向量单元中。例如,同一权重输入操作数可以被广播到矩阵处理器单元的每个向量单元。在一些实施例中,经由权重输入向量(例如图1的权重输入向量105和/或图2的权重输入向量205)加载准备好的权重输入操作数。
在307,执行二维卷积运算。使用分别在303和305准备的数据输入操作数和权重输入操作数,由矩阵处理器单元执行二维卷积运算。卷积运算可以包括计算在不同迭代中累加的部分和/或中间结果。在各种实施例中,矩阵处理器单元提供输出结果的向量作为输出向量。在一些实施例中,输出向量存储在输出向量位置,例如图1的输出向量151和/或图2的输出向量251。在一些实施例中,完整的二维卷积运算可以包括移位权重输入操作数的元素,以至少部分地计算权重输入矩阵与数据输入矩阵的不同部分的逐深度卷积。
图4是示出使用矩阵处理器单元执行二维卷积运算的过程的实施例的流程图。例如,二维卷积运算的结果是通过对矩阵参数的二维切片执行多个向量运算来计算的。一个或更多个输入参数(例如数据输入矩阵)可能超过矩阵处理器单元的最大操作数大小。结果,输入操作数可以被分割成与矩阵处理器单元的操作数大小兼容的更小的矩阵。兼容大小的切片可以作为操作数被传递给一个或更多个不同的矩阵处理器单元,并将结果合并。在一些实施例中,在不同的矩阵处理器单元(例如,对应于不同处理器元件的矩阵处理器单元)上操作切片。在各种实施例中,可以响应于卷积运算指令(例如在图3的301处接收的卷积运算指令)来执行图4的过程。在一些实施例中,在图3的303、305和/或307处执行图4的过程。在一些实施例中,使用图1的矩阵处理器单元101和/或图2的矩阵处理器单元201来执行图4的过程。
在401,识别矩阵操作数的下一个二维切片。例如,识别其大小与矩阵处理器单元的操作数大小兼容的一个或更多个矩阵操作数。可以在存储器中识别切片,并且可以发出读取请求以加载所识别的数据。在一些实施例中,与权重输入矩阵的大小相比,数据输入矩阵的大小通常非常大。数据输入矩阵被分割成更小的尺寸以用于处理。在401,识别下一个切片以进行处理。
在403,展开输入参数并执行向量运算。例如,展开数据输入矩阵的切片和权重输入矩阵。在各种实施例中,展开将二维矩阵(或矩阵切片)线性化为向量操作数,该向量操作数被加载到矩阵处理器单元的至少一个向量单元中。展开可能需要一次以上迭代。例如,在一些实施例中,展开的矩阵操作数在几次迭代中被展开,使得每次迭代仅展开行的子集。例如,对于较大的权重矩阵,权重矩阵不能被展开进而使其整体适应向量单元。使用多次迭代,直到整个矩阵展开。在各种实施例中,权重矩阵可以展开成向量操作数,并广播给矩阵处理器单元的多于一个的向量单元。在一些实施例中,每次迭代还可以包括移位展开的权重矩阵,以将权重矩阵的元素应用于展开的数据矩阵的不同列。在各种实施例中,中间结果可以被累加并用作后续迭代的参数。执行的向量运算可以包括向量乘法和向量加法。例如,矩阵处理器单元的每个向量单元可以对向量数据和权重参数执行点积运算,以计算逐深度卷积结果的至少一部分。
在405,输出向量单元结果。例如,每个向量单元将向量单元结果输出到输出向量(例如图1的输出向量151)的元素。在各种实施例中,可以通过在多次迭代中累加多个向量单元结果来确定向量单元结果。在各种实施例中,向量单元结果被输出到输出向量,用于将结果写回到存储器。在一些实施例中,向量单元结果是逐深度卷积结果的一部分。
在407,确定额外的二维切片是否需要处理。如果还有额外的二维切片待被处理,则处理循环回到401以处理下一个切片。如果没有额外的二维切片需要处理,则处理结束。
图5是示出使用矩阵处理器单元和向量单元运算来执行二维卷积运算的过程的实施例的流程图。例如,使用图5的过程,输入矩阵被展开、线性化,并作为输入向量被馈送到矩阵处理器单元的向量单元。执行向量单元运算以计算二维卷积运算的至少部分结果。在各种实施例中,数据输入矩阵和权重输入矩阵被转换成输入向量。例如,可以从数据输入矩阵中识别数据切片,并将其转换成一个或更多个数据输入向量。在一些实施例中,在图4的403和/或405处执行图5的过程。在一些实施例中,使用图1的矩阵处理器单元101和/或图2的矩阵处理器单元201来执行图5的过程。
在501,识别数据输入向量。例如,从数据输入矩阵的切片中识别一个或更多个数据输入向量。在一些实施例中,为矩阵处理器单元的每个向量单元识别并准备数据输入向量。数据输入向量可以包括重叠元素,并且对应于用于执行矩阵运算(例如二维卷积运算)的选定元素。
在503,准备数据输入向量并将其加载到向量单元。例如,识别对应于数据矩阵子集的元素。在一些实施例中,数据矩阵可以是较大数据矩阵的二维矩阵切片。在各种实施例中,所识别的元素是数据矩阵的子集,并且基于相应的权重矩阵,特别是权重矩阵的维度和将要展开的行数来选择。例如,在一些实施例中,整个权重矩阵可以被展开并线性化以适应向量单元运算数。然而,随着权重矩阵的维数相对于向量单元所支持的操作数的大小而增加,权重矩阵可能太大而不能展开成单个输入向量,取而代之的是权重矩阵和相应的数据矩阵在多次迭代中被展开。
在各种实施例中,权重矩阵或者在一次迭代中完全展开,或者可以在多次迭代中部分展开。矩阵是完全展开还是部分展开可以取决于矩阵参数的维数,特别是权重矩阵,相对于矩阵处理器单元支持的输入向量的大小。例如,在具有3x3权重矩阵并支持32元素输入向量的场景中,权重矩阵的所有九个元素(对应于三行)可以展开成单个32元素权重输入向量。作为准备相应数据输入向量的一部分,从对应于数据矩阵的三行的列中选择元素。从三行中选择的元素被展开成一维向量。所使用的列数可以基于数据输入向量的大小。在具有32元素数据输入向量的示例场景中,识别三行,并且为每行选择10个元素(对应于10列)。总共从三行十列中选择30个元素。数据输入向量中的用于两个元素的剩余两个位置不足以适应所识别的三行中的整个列,而是被填充,例如,用两个零值元素填充。以这种方式,数据矩阵的3x10部分可以被展开并线性化成数据输入向量,并用两个零值元素填充。一旦准备好,数据输入向量被加载到矩阵处理器单元的适当向量单元中。在各种实施例中,矩阵处理器单元的每个向量单元加载有准备好的数据输入向量。例如,可以通过选择从不同行开始的元素来加载矩阵处理器单元的每个向量单元。
在一些实施例中,通过将数据输入向量的大小除以被展开的行数来确定准备数据输入向量所选择的初始列数。例如,在展开两行、三行或四行的情况下,32元素数据输入向量可以分别加载十六列、十列或八列的元素。数据输入向量中任何未使用的元素都可以用零值元素来填充。一旦确定了列的数量,每次迭代可以使用相同数量的列。例如,可以通过四次迭代将7x7矩阵加载到32元素数据输入向量中。对于前三次迭代,每次迭代展开两行(即,第1-2行、第3-4行和第5-6行),并且第四次迭代展开最后一行(即第7行)。每次迭代可以从相应的选定行的不同的列中选择16个元素。最后一次迭代有额外的填充,因为只有一行被展开。在各种实施例中,零值元素被用作填充元素。值为零的填充元素允许向量单元执行乘法和加法向量运算,而不会影响结果向量和或点积结果。
在各种实施例中,一旦使用适当的格式被适当地准备好,数据输入向量被加载到矩阵处理器单元的相应向量单元中。在一些实施例中,数据输入向量被准备并加载到矩阵处理器单元的每个向量单元中。例如,为每个向量单元准备的数据输入向量可以对应于数据输入矩阵的子矩阵,其中每个子矩阵从数据输入矩阵的不同行开始。例如,在权重矩阵是完全展开的3x3矩阵的情况下,第一向量单元可以对应于具有来自第1-3行的元素的子矩阵,第二向量单元可以对应于具有来自第2-4行的元素的子矩阵,第三向量单元可以对应于具有来自第3-5行的元素的子矩阵,等等。在一个实施例中,利用32个向量单元,第32个向量单元可以对应于具有来自第32-34行的元素的子矩阵。
在505,识别权重输入行。例如,来自权重输入矩阵的一行或更多行被识别用于执行向量单元运算。在一些实施例中,权重输入矩阵被完全展开,并且权重输入矩阵的每行被识别用于展开。在各种实施例中,权重输入矩阵对于完全展开来说可能太大,并且仅被部分展开。在507,只有被选择用于展开的行被识别用于进一步处理。例如,3x3权重矩阵(有9个元素)可以完全展开成一个32元素权重输入向量,这样就可以利用权重矩阵的每一行。作为另一个示例,7x7权重矩阵(有49个元素)不能完全展开成32元素权重输入向量。对于当前迭代,仅识别展开的行。在各种实施例中,后续的迭代被用来识别剩余的行。
在507,准备权重输入掩码(mask)并将其广播给向量单元。例如,对应于在505识别的权重输入行的元素被准备到权重输入掩码中。权重输入掩码被线性化为用于矩阵处理器单元的向量单元的一维输入向量。在各种实施例中,用填充来对线性化的权重元素进行格式化,以将每个权重输入行的开始与在503准备的相关数据输入行对齐。例如,使用32元素向量和3x3权重矩阵(其中在505识别了所有行)选择权重矩阵的所有九个元素。使用额外的23个填充元素将权重矩阵的九个元素格式化为权重输入掩码。在一些实施例中,30个元素用于所选3x3矩阵的三行。每行包括一行中的三个元素,后面跟着七个填充元素。用附加填充元素来填充未用于所选3x3矩阵的行的数据输入向量的剩余元素(在该示例中为两个元素)。在各种实施例中,零值元素被用作填充元素。值为零的填充元素允许向量单元执行乘法和加法向量运算,而不会影响结果向量和。
在各种实施例中,格式化的权重输入掩码是向矩阵处理器单元的每个向量单元广播的输入向量。例如,权重输入向量用于以线性化的一维向量格式存储准备好的权重输入掩码。权重输入掩码然后作为输入向量操作数被广播给每个适当的向量单元。例如,单个权重输入掩码可以被准备并由矩阵处理器单元的所有向量单元使用。在一些实施例中,行填充元素被用来允许权重输入掩码被移位,以将权重矩阵的元素与数据输入向量中引用的数据矩阵的不同列重新对齐。
在509,执行向量单元运算。利用从数据输入向量加载的输入向量和广播的权重输入掩码,矩阵处理器单元的相应向量单元执行向量单元运算。在一些实施例中,向量单元运算包括向量乘法和加法运算。例如,数据输入向量中的每个元素乘以权重输入掩码中的其相应元素。结果是相乘结果的向量。在一些实施例中,向量乘法运算由向量单元的向量乘法单元执行。使用向量相乘结果,通过将相乘结果向量中的每个元素相加来计算向量和结果(vector sum result)。在一些实施例中,使用向量单元的向量加法器单元来确定和。例如,使用加法器树的向量加法器单元可以计算向量元素的和。在一些实施例中,矩阵处理器单元包括累加器,用于将向量加法器结果与先前的向量加法器结果相加。例如,可以使用累加器来累加每次迭代的中间结果或部分结果,以确定运行的累加和。累加和允许一次迭代(或运行(pass))的向量和结果被添加到下一次迭代(或运行)的结果中。在各种实施例中,为权重输入掩码(和/或数据输入向量)准备的零填充元素导致零相乘结果,并且对向量加法结果没有影响。在一些实施例中,矩阵处理器单元的每个向量单元使用其相应的加载的数据输入向量和广播的权重输入掩码来执行点积运算。点积结果可以与来自先前迭代(或运行)的结果累加和/或被存储以添加到未来迭代的结果中。
在511,输出向量结果。例如,通过在509执行向量单元运算确定的向量结果从矩阵处理器单元输出。在一些实施例中,向量结果被输出到用于将输出写入存储器的输出向量结果。在一些实施例中,结果被输出并用作后续矩阵运算的参数。
图6是示出使用矩阵处理器单元和向量单元运算来执行二维卷积运算的过程的实施例的流程图。例如,使用数据输入矩阵和数据权重矩阵,执行矩阵乘法和加法运算,以计算二维卷积运算的至少部分结果。输入矩阵被展开、线性化,并作为输入向量被馈送到矩阵处理器单元的向量单元。不适合输入向量大小的权重输入矩阵在不同的迭代中被部分展开。为了进一步增加矩阵计算的吞吐量和效率,通过移位展开的输入权重掩码以将权重掩码的元素与加载的数据输入向量的不同元素(和相应列)重新对齐来执行额外的运行。通过重新使用准备好的数据输入向量以及重新对齐的权重掩码,对与数据传输相关的性能的影响,尤其是从数据输入矩阵向矩阵处理器单元加载元素的影响,被显著降低。例如,对于输入权重掩码的每次迭代,通过仅修改输入权重掩码同时保持加载的数据输入向量不变,在每个数据输入向量上执行多遍运行。在一些实施例中,使用图5的过程来执行图6的过程。例如,在一些实施例中,可以在图5的509处执行步骤605、607和/或609。在一些实施例中,使用图1的矩阵处理器单元101和/或图2的矩阵处理器单元201来执行图6的过程。
在601,准备数据输入向量并将其加载到矩阵处理器单元中。在一些实施例中,如参考图5的步骤501和503所述,准备并加载数据输入向量。例如,数据输入向量被加载为与权重输入向量的相应行兼容。在一些实施例中,数据输入向量包括填充元素(例如零值元素)以防止加载元素的部分列。作为示例,使用3x3权重输入矩阵和32元素数据输入向量,完全展开的权重输入矩阵引用三行。相应地,三行数据元素被加载到数据输入向量中。三行的列(three-row columns)的数量取决于数据输入向量中可用的元素数量。在该示例中,为总共30个元素加载了10个三行的列。数据输入向量的其余两个元素未使用,可以用零值元素清零。可以从数据矩阵的下一个相应行开始加载下一个数据输入向量。以这种方式,来自数据矩阵的不同(但可能重叠)切片的数据输入向量被加载到矩阵处理器单元的每个向量单元中。作为另一个示例,使用7x7权重输入矩阵和32元素数据输入向量,部分展开的权重输入矩阵在前三次迭代的每一次中引用两行,并在第四次迭代中引用单个最后一行。相应地,对于使用两个权重行的迭代,两行数据元素被加载到数据输入向量中,并且对于使用最后(和第七)权重行的最终迭代,一行数据元素被加载到数据输入向量中。两行的列的数量取决于数据输入向量中可用的元素数量。在该示例中,前三次迭代总共加载了32个元素的16个两行的列,不需要填充元素。对于第四次迭代,来自单个行的十六个元素被加载,并且数据输入向量的十六个剩余元素未被使用,并且可以用零值元素清零。类似于3x3权重矩阵示例,在每次迭代中,可以从数据矩阵的下一个相应行开始加载下一个数据输入向量。在7x7权重输入矩阵示例中,来自数据矩阵不同(但可能重叠)切片的数据输入向量被加载到矩阵处理器单元的每个向量单元中,一次加载两行(用于前三次迭代)或一行(用于最后一次和第四次迭代)。
在603,准备权重输入掩码并将其广播给矩阵处理器单元的一个或更多个向量单元。在一些实施例中,如参照图5的步骤505和507所述,准备并广播权重输入掩码。例如,对于完全展开的权重矩阵,权重矩阵的每一行都被展开并线性化为输入向量。为了提高矩阵运算的效率,零填充元素被用于在输入向量内均匀地隔开权重矩阵的行。如上所述,零填充元素允许权重输入向量充当权重输入掩码。移位权重元素重新对齐权重输入掩码,以将权重元素与数据矩阵中不同的相应列相关联。在某些情况下,权重掩码会被填充,以考虑不完整的相应数据列。一旦被加载到权重输入向量中,权重输入掩码就被广播到矩阵处理器单元的一个或更多个适用的向量单元。
在一些实施例中,权重矩阵仅被部分展开。经过多次迭代,权重矩阵的所有行都被展开。对于特定迭代,所选行被展开并用零值元素填充,以创建与所选行相关联的部分权重掩码。后续迭代(或并行执行的迭代)用于展开剩余的权重行。例如,7x7权重矩阵(包含49个元素)不能完全展开为32元素权重输入向量。对于当前迭代,仅识别展开的行。如果最多展开两行,则需要四次迭代来完全展开7x7权重矩阵。在一些实施例中,选择不同数量的行用于部分展开。例如,基于权重矩阵维度和向量单元的向量参数大小,可以适当地选择两行、三行或更多行来用于展开。
在605,执行矩阵乘法和加法运算。在一些实施例中,参照图5的步骤509描述矩阵操作。利用从数据输入向量加载的输入向量和广播的权重输入掩码,矩阵处理器单元的相应向量单元执行向量单元运算,包括向量乘法和加法运算。每个向量单元可以使用数据输入向量和权重输入掩码来执行向量矩阵乘法。未经掩码的元素导致权重矩阵元素与数据矩阵元素相乘,而经掩码的元素导致零值结果。在各种实施例中,使用向量加法器将相乘结果相加,以计算结果和。例如,32元素向量单元接收两个32元素输入向量(数据输入向量和权重输入掩码),并执行向量乘法以计算32个相乘结果。执行向量加法运算,将所有32个相乘结果相加,以计算单个结果和。在一些实施例中,结果和是中间结果,并且被添加到先前计算的结果和。例如,累加器可以用于存储结果和,并且在连续迭代中,中间结果被添加到当前计算的结果和中,以在多次迭代中保持运行和。
在一些实施例中,每个向量单元并行执行其向量运算。例如,具有32个向量单元的矩阵处理器单元可以计算对应于32个结果和的32个结果。在各种实施例中,矩阵处理器单元的每个向量单元使用其相应的加载的数据输入向量和广播的权重输入掩码来执行点积运算。点积结果可以与来自先前迭代(或运行)的结果累加和/或被存储以添加到未来迭代的结果中。
在607,确定数据输入矩阵的附加列是否待被处理。如果数据输入矩阵的附加列待被处理,则处理进行到609。如果没有数据输入矩阵的附加列待被处理,则处理进行到611。
在609,对应于权重输入向量的权重被移位。例如,向量输入掩码的元素被移位以将权重元素与来自数据输入向量的不同数据元素重新对齐。例如,在601加载的现有数据输入向量与新的权重输入向量一起在附加运行中使用。通过移位权重元素,例如,通过将每个权重元素向右移位一个元素,来准备新的权重输入向量。该移位将权重元素与对应于下一列的数据元素重新对齐。例如,对应于3x3权重矩阵的权重输入掩码可以与对应于数据矩阵的3x10切片的数据输入向量一起被加载到向量单元中。移位权重元素有效地滑动权重输入掩码,以将权重矩阵与3x10切片的不同三列相关联。利用3x3的权重矩阵,在到达数据切片的末尾之前,可以执行八遍运行(对应于七次移位)。作为另一个示例,使用具有两个展开的权重行的7x7权重矩阵,每个数据输入向量引用16列。在到达数据切片的末尾之前,可以执行十遍运行(对应于九次移位)。通过在权重输入向量中用填充元素隔开权重元素,填充元素的数量决定了可以用对加载的数据输入向量执行的最大移位(和运行)次数。
在各种实施例中,一旦权重输入向量被移位,新准备的权重输入向量被广播到每个适用的向量单元。处理进行到605,其中使用重新对准的权重输入掩码和先前加载的数据输入向量来执行矩阵运算。
在611,确定权重输入矩阵的附加行是否待被处理。如果权重输入矩阵的附加行待被处理,则处理进行到613。例如,部分展开的矩阵可能具有需要被展开并处理的附加行。相比之下,完全展开的权重矩阵不会有额外的权重行进行处理。如果权重输入矩阵没有额外的行待被处理,则处理进行到615。
在613,使数据输入和权重行前进。例如,对于部分展开的权重(和相应的数据)矩阵,使所识别的行前进以选择下一组行进行展开。权重矩阵和数据矩阵一起前进,以便将正确的权重和数据元素关联在一起。以7x7权重矩阵为例,每次迭代最多展开两行,第一次迭代选择第1行和第2行。在611,额外的权重输入行仍待被处理,因此在步骤613,所选行前进以选择第3行和第4行。后续迭代选择第5行和第6行。最后一次迭代选择第7行。处理然后进行到601。
在615,输出结果。在一些实施例中,如参照图5的步骤511所述,输出结果。例如,通过在605执行矩阵乘法和加法运算确定的向量结果从矩阵处理器单元输出。在一些实施例中,向量结果被输出到用于将输出写入存储器的输出向量结果。在一些实施例中,结果被输出并用作后续矩阵运算的参数。
图7A和图7B是示出用于执行逐深度卷积的示例矩阵操作数的图示。在图7A中,权重矩阵701表示权重元素的示例3x3矩阵。权重矩阵的其他维度(例如1x1、5x5、7x7、9x9等)也可能是合适的。在所示的示例中,与每个权重元素相关联的下标使用行和列标记。对于权重矩阵701的第一行,W1,1是位于第1列的权重元素,W1,2是位于第2列的权重元素,而W1,3是位于第3列的权重元素。在图7B中,数据矩阵703表示数据元素的示例数据矩阵。数据矩阵703的维度大于权重矩阵701。在图7B的示例中,仅示出了数据矩阵703的第1-4行和第32-34行。数据矩阵703的宽度可以延伸超过11列。类似地,数据矩阵703的高度可以延伸超过34行(未示出)。在图7B中,数据矩阵703被示出为具有34行,以使其与3x3权重矩阵701和具有32个向量单元的矩阵处理器单元兼容。在一些实施例中,权重矩阵701和数据矩阵703是用于使用本文描述的技术执行卷积运算的输入矩阵。在一些实施例中,使用图1的矩阵处理器单元101和/或图2的矩阵处理器单元201和/或图3-图6的过程,来对权重矩阵701和数据矩阵703执行卷积运算,例如逐深度卷积。例如,在图3的301处接收的卷积运算指令可以指定诸如权重矩阵701的权重矩阵和诸如数据矩阵703的数据矩阵。
图8A和图8B是示出用于执行逐深度卷积的展开的数据矩阵的示例的图示。图8A和图8B包括指示数据元素在32元素数据输入向量中的位置的索引标签801和802。图8A和图8B包括七个示例数据输入向量803/804、805/806、807/808、809/810、811/812、813/814和815/816。图8A中示出了每个数据输入向量的前半部分,并且图8B中示出了每个输入向量的相应后半部分。由于向量的大小较大,为了便于说明,数据输入向量被示为向量对,并在图8A和图8B中分开。例如,七个32元素数据输入向量包括16元素向量对803/804、805/806、807/808、809/810、811/812、813/814和815/816。
在一些实施例中,图8A和图8B所示的数据输入向量是从图7B的数据矩阵703展开的数据输入向量。例如,数据输入向量803/804对应于来自图7B的数据矩阵703的前三行的元素,展开成一维向量,并且包括来自数据矩阵703的第1-3行和第1-10列的数据元素。类似地,参考来自图7B的数据矩阵703的第1-10列的元素,数据输入向量805/806对应于来自第2-4行的元素,数据输入向量807/808对应于来自第3-5行的元素,数据输入向量809/810对应于来自第4-6行的元素,数据输入向量811/812对应于来自第5-7行的元素,数据输入向量813/814对应于来自第6-8行的元素,以及数据输入向量815/816对应于来自第32-34行的元素。与图7B的数据矩阵703的不同3x10切片相关联的数据元素被加载到每个数据输入向量803/804、805/806、807/808、809/810、811/812、813/814和815/816中。每个数据输入向量803/804、805/806、807/808、809/810、811/812、813/814和815/816的位置30和31处的元素(第31个和第32个元素)是零值元素。在各种实施例中,位置30和31处的元素是填充元素。
在一些实施例中,图8A和图8B的每个数据输入向量被加载到矩阵处理器单元的独立向量单元中。对于具有32个向量单元的矩阵处理器单元,加载32个数据输入向量,并且可以从不同的行开始准备每个数据输入向量。在所示的示例中,数据输入向量803/804、805/806、807/808、809/810、811/812和813/814被加载到前六个向量单元中,并且数据输入向量815/816被加载到第32个向量单元中。尽管未示出,向量单元7-31加载有相应的数据输入向量。在一些实施例中,数据输入向量803/804、805/806、807/808、809/810、811/812、813/814和815/816经由诸如图1的数据输入向量103的数据输入向量被加载到诸如图1的矩阵处理器单元101的矩阵处理器单元中。在一些实施例中,在图3的303、图4的401和/或403、图5的501和/或503和/或图6的601处执行创建数据输入向量803/804、805/806、807/808、809/810、811/812、813/814和815/816的展开过程。在一些实施例中,图8A和图8B的数据输入向量表示为展开过程的一次迭代准备的数据输入向量的部分集合,并且被格式化为与完全展开的3x3权重矩阵(诸如图7A的权重矩阵701)对齐。
图9A和图9B是示出用于执行逐深度卷积的展开的权重矩阵的示例的图示。图9A和图9B包括指示权重元素在32元素权重输入向量中的位置的索引标签901和902。图9A和图9B包括八个示例权重输入向量903/904、905/906、907/908、909/910、911/912、913/914、915/916和917/918。图9A中示出了每个权重输入向量的前半部分,并且图9B中示出了每个输入向量的对应的后半部分。由于向量的大尺寸,为了便于说明,权重输入向量被示为向量对,并在图9A和图9B中分开。例如,八个32元素权重输入向量包括16元素向量对903/904、905/906、907/908、909/910、911/912、913/914、915/916和917/918。权重输入向量代表八个不同的权重输入向量,这些向量在八遍运行中被广播到矩阵处理器单元的向量单元。图8A和图8B中示出了相应的数据输入向量的示例,并且在权重输入向量改变时的整个八遍运行中可以保持不变。
在一些实施例中,图9A和图9B中所示的权重输入向量是从图7A的权重矩阵701展开的权重输入向量。例如,权重输入向量903/904、905/906、907/908、909/910、911/912、913/914、915/916和917/918中的每一个对应于图7A的权重矩阵701中展开成一维向量并在一维向量上隔开的元素。在不同位置处准备权重元素和行,以将权重输入向量与相应数据输入向量的不同列对齐。零值填充元素被包括在行之间以及在位置30和31处的向量的末尾。例如,权重输入向量903/904在元素位置0-2处包括图7A的权重矩阵701的第1行,在元素位置10-12处包括图7A的权重矩阵701的第2行,以及在元素位置20-22处包括图7A的权重矩阵701的第3行。可以通过将权重输入向量903/904的元素向右移位一个位置来准备权重输入向量905/906。类似地,分别通过移位权重输入向量905/906、907/908、909/910、911/912、913/914和915/916的元素来创建权重输入向量907/908、909/910、911/912、913/914、915/916和917/918。在一些实施例中,当权重输入向量向右移位时,零值填充元素被引入到权重输入向量的前面。
在一些实施例中,图9A和图9B的每个权重输入向量在对相应数据输入向量的不同遍运行处被广播到矩阵处理器单元的向量单元中。对于具有32个向量单元的矩阵处理器单元,32个权重输入向量在每遍运行时加载相同的权重输入向量。例如,对于第一遍运行,权重输入向量903/904被广播到每个向量单元,对于第二遍运行,权重输入向量905/906被广播到每个向量单元,对于第三遍运行,权重输入向量907/908被广播到每个向量单元,以此类推,直到对于第八遍运行,权重输入向量917/918被广播到每个向量单元。
在一些实施例中,权重输入向量903/904、905/906、907/908、909/910、911/912、913/914、915/916和917/918经由权重输入向量(例如图1的权重输入向量105)被加载到矩阵处理器单元(例如图1的矩阵处理器单元101)中。在一些实施例中,在图3的305、图4的401和/或403、图5的505和/或507和/或图6的603、607和/或609处执行创建权重输入向量903/904、905/906、907/908、909/910、911/912、913/914、915/916和917/918的展开过程。在一些实施例中,图9A和图9B的不同权重输入向量表示为包括八遍运行的展开过程的一次迭代准备的不同权重输入掩码。每个权重输入掩码是完全展开的3x3权重矩阵(例如图7A的权重矩阵701),并且被格式化为与例如图7B的数据矩阵703的数据矩阵的不同3x3切片对齐。
图10A和图10B是示出用于执行逐深度卷积的向量计算的示例的图示。图10A和图10B包括索引标签1001和1002,它们分别指示权重和数据元素在32元素权重输入向量1003/1004和数据输入向量1005/1006中的位置。在一些实施例中,权重输入向量1003/1004是图9A和图9B的权重输入向量903/904,并且数据输入向量1005/1006是图8A和图8B的数据输入向量803/804。在一些实施例中,权重输入向量1003/1004和数据输入向量1005/1006是加载到向量单元中用于执行向量运算的两个输入向量的示例。在各种实施例中,矩阵处理器单元的每个向量单元加载有相应的一对输入向量。
在一些实施例中,单元(cell)1011示出了由矩阵处理器单元的向量单元对权重输入向量1003/1004和数据输入向量1005/1006的输入向量执行的等效向量计算。单元1011中所示的向量计算结果是通过将权重输入向量1003/1004的每个元素与数据输入向量1005/1006的相应元素相乘而确定的结果。来自权重输入向量1003/1004的32个元素与数据输入向量1005/1006的32个元素相乘,以确定32个相乘结果。在所示的示例中,单元1011仅包括9个乘法项,而不是32个。九个乘法项对应于来自权重输入向量1003/1004的九个权重元素以及来自数据输入向量1005/1006的它们的相应数据元素。权重输入向量1003/1004的零值元素起到权重掩码的作用,使得乘法项的数量从可能的32个减少到9个。在一些实施例中,使用诸如图2的向量乘法单元213或223的向量乘法单元来执行乘法。在一些实施例中,相乘结果作为向量被馈送到向量加法器单元,以计算相乘结果的和。可以使用向量加法器单元(例如图2的向量加法器单元215或225)来执行向量求和。在所示的示例中,执行的向量运算的结果是单个结果和。在一些实施例中,结果和是部分或中间结果和,并且可以存储在累加器中。在一些实施例中,结果和是使用权重输入向量1003/1004和数据输入向量1005/1006计算的点积。结果和可以作为向量结果的一个元素被输出,并被写入输出向量,例如图1的输出向量151。在一些实施例中,使用图1的矩阵处理器单元101和/或图3-图6的过程来执行单元1011中所示的向量计算结果的等效。在一些实施例中,在图3的307、图4的403、图5的509和/或图6的605处执行向量计算。
图11A和图11B是示出用于执行逐深度卷积的示例矩阵操作数的图示。在图11A中,权重矩阵1101表示权重元素的示例7x7矩阵。如参照图7A和图7B所述,在所示的示例中,与每个权重元素相关联的下标使用行和列标记。在图11B中,数据矩阵1103表示数据元素的示例数据矩阵。数据矩阵1103的维度大于权重矩阵1101。在图11B的示例中,仅示出了数据矩阵1103的第1-7行和第32-38行。数据矩阵1103的宽度可以延伸超过16列。类似地,数据矩阵1103的高度可以延伸超过38行(未示出)。在图11B中,数据矩阵1103被示出为具有38行,以使其与7x7权重矩阵1101和具有32个向量单元的矩阵处理器单元兼容。在一些实施例中,权重矩阵1101和数据矩阵1103是用于使用本文描述的技术执行卷积运算的输入矩阵。在一些实施例中,使用图1的矩阵处理器单元101和/或图2的矩阵处理器单元201和/或图3-图6的过程,对权重矩阵1101和数据矩阵1103执行卷积运算,例如逐深度卷积。例如,在图3的301处接收的卷积运算指令可以指定诸如权重矩阵1101的权重矩阵和诸如数据矩阵1103的数据矩阵。
图12A和图12B是示出用于执行逐深度卷积的部分展开的数据矩阵的示例的图示。图12A和图12B包括指示数据元素在32元素数据输入向量中的位置的索引标签1201和1202。图12A和图12B包括四个示例数据输入向量1203/1204、1205/1206、1207/1208和1209/1210。图12A中示出了每个数据输入向量的前半部分,并且图12B中示出了每个输入向量的对应的后半部分。由于向量的大尺寸,为了便于说明,数据输入向量被示为向量对,并在图12A和图12B中分开。例如,四个32元素数据输入向量包括16元素向量对1203/1204、1205/1206、1207/1208和1209/1210。
在一些实施例中,图12A和图12B中所示的数据输入向量是从图11B的数据矩阵1103部分展开的数据输入向量。图12A和图12B的数据输入向量被部分展开,因为没有一个数据输入向量包含图11B的数据矩阵1103的整个7x7矩阵切片,以对应于7x7权重矩阵。例如,数据输入向量1203/1204对应于仅来自展开成一维向量的图11B的数据矩阵1103的前两行的元素。数据输入向量1203/1204包括来自数据矩阵1103的第1-2行和第1-16列的数据元素。类似地,参考来自图11B的数据矩阵1103的第1-16列的元素,数据输入向量1205/1206对应于来自第3行和第4行的元素,数据输入向量1207/1208对应于来自第5行和第6行的元素,并且数据输入向量1209/1210对应于来自第7行的元素。与图11B的数据矩阵1103的不同2x16切片相关联的数据元素被加载到数据输入向量1203/1204、1205/1206、1207/1208和1209/1210中的每一个中。对于数据输入向量1209/1210,位置16-31处的元素(最后16个元素)是零值元素。在各种实施例中,零值元素是填充元素。
在一些实施例中,在不同的迭代期间,图12A和图12B的每个数据输入向量被加载到矩阵处理器单元的向量单元中。由于每个数据输入向量中最多呈现两行7x7数据切片,因此使用7x7权重矩阵计算7x7矩阵运算需要所有四个数据输入向量1203/1204、1205/1206、1207/1208和1209/1210。总共可以执行四次迭代,每个数据输入向量一次。例如,数据输入向量1203/1204被加载到用于迭代一的向量单元,数据输入向量1205/1206被加载到用于迭代二的向量单元,数据输入向量1207/1208被加载到用于迭代三的向量单元,并且数据输入向量1209/1210被加载到用于第四次迭代的向量单元。在所示的示例中,每次迭代仅示出单个数据输入向量。对于具有32个向量单元的矩阵处理器单元,在每次迭代期间,加载32个不同的数据输入向量(其中仅示出一个),并且可以通过从不同的行开始来准备每个数据输入向量。在一些实施例中,数据输入向量1203/1204、1205/1206、1207/1208和1209/1210经由诸如图1的数据输入向量103的数据输入向量被加载到诸如图1的矩阵处理器单元101的矩阵处理器单元中。在一些实施例中,在图3的303、图4的401和/或403、图5的501和/或503和/或图6的601、611和/或613处执行创建数据输入向量1203/1204、1205/1206、1207/1208和1209/1210的展开过程。在一些实施例中,图12A和图12B的数据输入向量表示为进行四次迭代的部分展开过程准备的数据输入向量的部分集合,并且被格式化为与部分展开的7x7权重矩阵(例如图11A的权重矩阵1101)对齐。
图13A和图13B是示出用于执行逐深度卷积的部分展开的权重矩阵的示例的图示。图13A和图13B包括指示权重元素在32元素权重输入向量中的位置的索引标签1301和1302。图13A和图13B包括十个示例权重输入向量1303/1304、1305/1306、1307/1308、1309/1310、1311/1312、1313/1314、1315/1316、1317/1318、1319/1320和1321/1322。图13A中示出了每个权重输入向量的前半部分,并且图13B中示出了每个输入向量的相应后半部分。由于向量的大尺寸,为了便于说明,权重输入向量被示为向量对,并在图13A和图13B中分开。例如,十个32元素权重输入向量包括16元素向量对1303/1304、1305/1306、1307/1308、1309/1310、1311/1312、1313/1314、1315/1316、1317/1318、1319/1320和1321/1322。权重输入向量表示十个不同的权重输入向量,它们在十遍运行中被广播到矩阵处理器单元的向量单元。图13A和图13B的权重输入向量与权重矩阵的前两行相关联。在一些实施例中,图12A和图12B的数据输入向量1203/1204是与相应数据矩阵的相应前两行相关联的相应数据输入向量的示例。向量单元加载有数据输入向量,例如图12A和图12B的数据输入向量1203/1204,并且在权重输入向量改变时的整个十遍运行中可以保持不变。
在一些实施例中,图13A和图13B中所示的权重输入向量是从图11A的权重矩阵1101部分展开的权重输入向量。例如,权重输入向量1303/1304、1305/1306、1307/1308、1309/1310、1311/1312、1313/1314、1315/1316、1317/1318、1319/1320和1321/1322中的每一个对应于来自图11A的权重矩阵1101的展开成一维向量并在一维向量上隔开的前两行的元素。在不同位置处准备权重元素和行,以将权重输入向量与相应数据输入向量的不同列对齐。零值填充元素包含在行之间和向量的末尾。例如,权重输入向量1303/1304在元素位置0-6处包括图11A的权重矩阵1101的第1行,在元素位置16-22处包括图11A的权重矩阵1101的第2行。可以通过将权重输入向量1303/1304的元素向右移位一个位置来准备权重输入向量1305/1306。类似地,通过移位权重输入向量1305/1306、1307/1308、1309/1310、1311/1312、1313/1314、1315/1316、1317/1318和1319/1320的元素来创建权重输入向量1307/1308、1309/1310、1311/1312、1313/1314、1315/1316、1317/1318、1319/1320和1321/1322。在一些实施例中,当权重输入向量向右移位时,零值填充元素被引入到权重输入向量的前面。
在一些实施例中,图13A和图13B的每个权重输入向量在相应数据输入向量的不同运行处被广播给矩阵处理器单元的向量单元中。对于具有32个向量单元的矩阵处理器单元,32个权重输入向量在每遍运行时加载有相同的权重输入向量。例如,权重输入向量1303/1304在第一遍运行时被广播给每个向量单元,权重输入向量1305/1306在第二遍运行时被广播给每个向量单元,权重输入向量1307/1308在第三遍运行时被广播给每个向量单元,以此类推,直到权重输入向量1321/1322在第十遍运行时被广播给每个向量单元。
在一些实施例中,权重输入向量1303/1304、1305/1306、1307/1308、1309/1310、1311/1312、1313/1314、1315/1316、1317/1318、1319/1320和1321/1322经由诸如图1的权重输入向量105的权重输入向量被加载到诸如图1的矩阵处理器单元101的矩阵处理器单元中。在一些实施例中,在图3的305、图4的401和/或403、图5的505和/或507和/或图6的603、607、609、611和/或613处执行创建权重输入向量1303/1304、1305/1306、1307/1308、1309/1310、1311/1312、1313/1314、1315/1316、1317/1318、1319/1320和1321/1322的部分展开过程。在一些实施例中,图13A和图13B的不同权重输入向量表示为多次迭代部分展开过程的一次迭代准备的不同权重输入掩码,该多次迭代部分展开过程包括每次迭代十遍运行。每个权重输入掩码是7x7权重矩阵(例如图11A的权重矩阵1101)的部分展开的2x7掩码。权重输入掩码被格式化为与诸如图11B的数据矩阵1103的数据矩阵的不同2x7切片对齐。参照图14A、图14B、图15A、图15B、图16A和图16B描述了与连续迭代相关联的权重掩码。
图14A和图14B是示出用于执行逐深度卷积的部分展开的权重矩阵的示例的图示。图14A和图14B包括指示权重元素在32元素权重输入向量中的位置的索引标签1401和1402。图14A和图14B包括十个示例权重输入向量1403/1404、1405/1406、1407/1408、1409/1410、1411/1412、1413/1414、1415/1416、1417/1418、1419/1420和1421/1422。权重输入向量表示十个不同的权重输入向量,它们在十遍运行中被广播给矩阵处理器单元的向量单元。图14A和图14B的权重输入向量与权重矩阵的第二对行(第3行和第4行)相关联。在一些实施例中,图12A和图12B的数据输入向量1205/1206是与相应数据矩阵的相应第二对行相关联的相应数据输入向量的示例。向量单元加载有数据输入向量,例如图12A和图12B的数据输入向量1205/1206,并且在权重输入向量改变时的整个十遍运行中可以保持不变。
在一些实施例中,图14A和图14B中所示的权重输入向量是从图11A的权重矩阵1101部分展开的权重输入向量。例如,权重输入向量1403/1404、1405/1406、1407/1408、1409/1410、1411/1412、1413/1414、1415/1416、1417/1418、1419/1420和1421/1422中的每一个对应于来自图11A的权重矩阵1101的第二对行的元素,该第二对行展开成一维向量并在一维向量上间隔开。在不同位置处准备权重元素和行,以将权重输入向量与相应数据输入向量的不同列对齐。零值填充元素包含在行之间和向量的末尾。例如,权重输入向量1403/1404在元素位置0-6处包括图11A的权重矩阵1101的第3行,并且在元素位置16-22处包括图11A的权重矩阵1101的第4行。可以通过将权重输入向量1403/1404的元素向右移位一个位置来准备权重输入向量1405/1406。类似地,通过分别移位权重输入向量1405/1406、1407/1408、1409/1410、1411/1412、1413/1414、1415/1416、1417/1418和1419/1420的元素来创建权重输入向量1407/1408、1409/1410、1411/1412、1413/1414、1415/1416、1417/1418、1419/1420和1421/1422。在一些实施例中,当权重输入向量向右移位时,零值填充元素被引入到权重输入向量的前面。
在一些实施例中,图14A和图14B的每个权重输入向量在相应数据输入向量的不同遍运行处被广播到矩阵处理器单元的向量单元中。对于具有32个向量单元的矩阵处理器单元,32个权重输入向量在每遍运行时加载有相同的权重输入向量。例如,权重输入向量1403/1404在第一遍运行时被广播给每个向量单元,权重输入向量1405/1406在第二遍运行时被广播给每个向量单元,权重输入向量1407/1408在第三遍运行时被广播给每个向量单元,以此类推,直到权重输入向量1421/1422在第十遍运行时被广播给每个向量单元。
图15A和图15B是示出用于执行逐深度卷积的部分展开的权重矩阵的示例的图示。图15A和图15B包括指示权重元素在32元素权重输入向量中的位置的索引标签1501和1502。图15A和图15B包括十个示例权重输入向量1503/1504、1505/1506、1507/1508、1509/1510、1511/1512、1513/1514、1515/1516、1517/1518、1519/1520和1521/1522。权重输入向量表示十个不同的权重输入向量,它们在十遍运行中被广播给矩阵处理器单元的向量单元。图15A和图15B的权重输入向量与权重矩阵的第三对行(第5行和第6行)相关联。在一些实施例中,图12A和图12B的数据输入向量1207/1208是与相应数据矩阵的相应第三对行相关联的相应数据输入向量的示例。向量单元加载有数据输入向量(例如图12A和图12B的数据输入向量1207/1208),并且在权重输入向量改变时的整个十遍运行中可以保持不变。
在一些实施例中,图15A和图15B所示的权重输入向量是从图11A的权重矩阵1101部分展开的权重输入向量。例如,权重输入向量1503/1504、1505/1506、1507/1508、1509/1510、1511/1512、1513/1514、1515/1516、1517/1518、1519/1520和1521/1522中的每一个对应于来自图11A的权重矩阵1101的第三对行的元素,该第三对行展开成一维向量并在一维向量上间隔开。在不同位置处准备权重元素和行,以将权重输入向量与相应数据输入向量的不同列对齐。零值填充元素包含在行之间和向量的末尾。例如,权重输入向量1503/1504在元素位置0-6处包括图11A的权重矩阵1101的第5行,并且在元素位置16-22处包括图11A的权重矩阵1101的第6行。可以通过将权重输入向量1503/1504的元素向右移位一个位置来准备权重输入向量1505/1506。类似地,通过分别移位权重输入向量1505/1506、1507/1508、1509/1510、1511/1512、1513/1514、1515/1516、1517/1518和1519/1520的元素来创建权重输入向量1507/1508、1509/1510、1511/1512、1513/1514、1515/1516、1517/1518、1519/1520和1521/1522。在一些实施例中,当权重输入向量向右移位时,零值填充元素被引入到权重输入向量的前面。
在一些实施例中,图15A和图15B的每个权重输入向量在相应数据输入向量的不同遍运行处被广播到矩阵处理器单元的向量单元中。对于具有32个向量单元的矩阵处理器单元,32权重输入向量在每遍运行时加载有相同的权重输入向量。例如,权重输入向量1503/1504在第一遍运行时被广播给每个向量单元,权重输入向量1505/1506在第二遍运行时被广播给每个向量单元,权重输入向量1507/1508在第三遍运行时被广播给每个向量单元,以此类推,直到权重输入向量1521/1522在第十遍运行时被广播给每个向量单元。
图16A和图16B是示出用于执行逐深度卷积的部分展开的权重矩阵的示例的图示。图16A和图16B包括指示权重元素在32元素权重输入向量中的位置的索引标签1601和1602。图16A和图16B包括十个示例权重输入向量1603/1604、1605/1606、1607/1608、1609/1610、1611/1612、1613/1614、1615/1616、1617/1618、1619/1620和1621/1622。权重输入向量表示十个不同的权重输入向量,它们在十遍运行中被广播给矩阵处理器单元的向量单元。图16A和图16B的权重输入向量与权重矩阵的最后一行(第7行)相关联。在一些实施例中,图12A和图12B的数据输入向量1209/1210是与相应数据矩阵的相应最后一行相关联的相应数据输入向量的示例。向量单元加载有数据输入向量,例如图12A和图12B的数据输入向量1209/1210,并且在权重输入向量改变时的整个十遍运行中可以保持不变。
在一些实施例中,图16A和图16B中所示的权重输入向量是从图11A的权重矩阵1101部分展开的权重输入向量。例如,权重输入向量1603/1604、1605/1606、1607/1608、1609/1610、1611/1612、1613/1614、1615/1616、1617/1618、1619/1620和1621/1622中的每一个对应于来自图11A的权重矩阵1101的最后一行的元素,该最后一行展开成一维向量并在一维向量上隔开。在不同位置处准备权重元素和行,以将权重输入向量与相应数据输入向量的不同列对齐。零值填充元素包含在行之间和向量的末尾。例如,权重输入向量1603/1604在元素位置0-6处包括图11A的权重矩阵1101的第7行。可以通过将权重输入向量1603/1604的元素向右移位一个位置来准备权重输入向量1605/1606。类似地,通过分别移位权重输入向量1605/1606、1607/1608、1609/1610、1611/1612、1613/1614、1615/1616、1617/1618和1619/1620的元素来创建权重输入向量1607/1608、1609/1610、1611/1612、1613/1614、1615/1616、1617/1618、1619/1620和1621/1622。在一些实施例中,当权重输入向量向右移位时,零值填充元素被引入到权重输入向量的前面。
在一些实施例中,图16A和图16B的每个权重输入向量在相应数据输入向量的不同遍运行处被广播到矩阵处理器单元的向量单元中。对于具有32个向量单元的矩阵处理器单元,32个权重输入向量在每遍运行时加载有相同的权重输入向量。例如,权重输入向量1603/1604在第一遍运行时被广播给每个向量单元,权重输入向量1605/1606在第二遍运行时被广播给每个向量单元,权重输入向量1607/1608在第三遍运行时被广播给每个向量单元,以此类推,直到权重输入向量1621/1622在第十遍运行时被广播给每个向量单元。
在一些实施例中,图14A、14B、15A、15B、16A和16B的不同权重输入向量表示为多次迭代部分展开过程的不同迭代准备的不同权重输入掩码,该过程包括每次迭代十遍运行。在一些实施例中,在部分展开过程的第二次迭代期间,图14A和图14B的权重输入向量被加载到矩阵处理器单元中;在部分展开过程的第三次迭代期间,图15A和图15B的权重输入向量被加载到矩阵处理器单元中;在部分展开过程的第四次迭代期间,图16A和图16B的权重输入向量被加载到矩阵处理器单元中。图14A、图14B、图15A、图15B、图16A和图16B的权重输入掩码中的每一个是诸如图11A的权重矩阵1101的7x7权重矩阵的部分展开的2x7掩码。权重输入掩码被格式化为与诸如图11B的数据矩阵1103的数据矩阵的不同2x7切片对齐。如参考图13A和图13B所述,图14A、图14B、图15A、图15B、图16A和图16B的权重输入向量经由权重输入向量(例如图1的权重输入向量105)被加载到矩阵处理器单元(例如图1的矩阵处理器单元101)中。在一些实施例中,在图3的305处、图4的401和/或403处、图5的505和/或507处、和/或图6的603、607、609、611和/或613处执行创建图14A、图14B、图15A、图15B、图16A和图16B的权重输入向量的部分展开过程。
尽管为了清楚理解的目的已经详细描述了前述实施例,但是本发明不限于所提供的细节。有许多实现本发明的替代方式。所公开的实施例是说明性的,而不是限制性的。