详细描述
本发明可以以多种方式实现,包括作为过程;装置;系统;物质的组成;体现在计算机可读存储介质上的计算机程序产品;和/或处理器,例如被配置为执行存储在耦合到处理器的存储器上和/或由该存储器提供的指令的处理器。在本说明书中,这些实现或者本发明可以采取的任何其他形式可以被称为技术。通常,在本发明的范围内,可以改变所公开的过程的步骤顺序。除非另有说明,否则被描述为被配置为执行任务的诸如处理器或存储器的组件可以被实现为在给定时间被临时配置为执行任务的通用组件或者被制造为执行任务的特定组件。如本文所使用的,术语“处理器”指的是被配置成处理数据(例如计算机程序指令)的一个或更多个设备、电路和/或处理核心。
下面提供了本发明的一个或更多个实施例的详细描述连同说明本发明原理的附图。结合这些实施例描述了本发明,但是本发明不限于任何实施例。本发明的范围仅由权利要求限定,并且本发明包括许多替代、修改和等同物。为了提供对本发明的全面理解,在以下描述中阐述了许多具体细节。这些细节是出于示例的目的而提供的,并且本发明可以根据权利要求来被实施,而不需要这些具体细节中的一些或全部。为了清楚起见,没有详细描述与本发明相关的技术领域中已知的技术材料,以便不会不必要地模糊本发明。
公开了一种用于执行有效卷积运算的处理器系统。使用所公开的技术,对于一系列矩阵维度(包括减少的矩阵维度),计算卷积运算特别是逐深度卷积的吞吐量和功率效率显著增加。在一些实施例中,处理器系统包括能够对两个输入矩阵执行矩阵运算的矩阵处理器单元。矩阵处理器单元包括多个(a plurality of)计算单元,例如用于处理输入矩阵的输入向量的向量单元。在各种实施例中,计算单元至少包括向量乘法单元和向量加法器单元。向量乘法单元能够使用两个输入向量的相应元素来执行乘法运算。在一些实施例中,向量加法器单元用于对使用向量乘法单元计算的相乘结果的向量进行求和。例如,向量加法器单元可以用于使用来自相应输入向量的向量元素的向量相乘结果来计算两个向量的点积结果。在一些实施例中,向量加法器单元是加法器树(adder tree)。例如,加法器树通过对相乘结果和随后的部分和(partial sums)进行并行求和来计算相乘结果的和。
在各种实施例中,矩阵处理器单元用于通过展开输入矩阵来并行计算多个卷积运算(例如多个逐深度卷积)的至少部分结果,每个卷积运算涉及两个输入矩阵,例如权重输入和数据输入矩阵。例如,通过在两个卷积运算之间分配矩阵处理器单元的向量计算单元,并行执行两个卷积运算。第一组向量计算单元求解第一卷积运算,以及第二组向量计算单元求解第二卷积运算。从存储器中读取一对权重矩阵,一个权重矩阵对应于每个卷积运算,并且展开每个权重矩阵。例如,每个权重矩阵都是线性化的二维矩阵。线性化的权重矩阵作为组合权重向量一起存储在存储器中。一旦从存储器中读取,每个权重矩阵就从组合权重向量中提取出来,并展开成被格式化为其自身的权重输入向量的单个行。在一些实施例中,权重由输入向量单元提取并转换成展开的权重向量。例如,两个3×3矩阵被合并并表示为单个组合权重向量中的18个元素。对应于第一卷积运算的权重矩阵的元素被提取并展开成单个向量,该向量可以包括行之间的填充(padding),例如零元素。类似地,对应于第二卷积运算的权重矩阵的元素被提取并展开成另一单个向量,该向量可以包括行之间的填充,例如零元素。在展开权重输入矩阵的同时,相应的数据输入矩阵也被展开。在各种实施例中,相应的数据输入矩阵被展开和格式化,以将向量输入数据的元素与来自权重输入数据的相应元素对齐。对应于第一卷积运算的输入向量被导向第一组向量计算单元,并且对应于第二卷积运算的输入向量被导向第二组向量计算单元。以具有32个向量计算单元的矩阵处理器单元为例,可以分配16个向量单元来求解每个卷积运算。然后使用矩阵处理器单元处理输入向量,以计算两个相应的结果和,每个卷积运算一个结果和。在一些实施例中,两个不同的卷积运算可以对应于不同的通道,并且被并行求解。例如,每个卷积运算的不同数据矩阵可以是同一个三维数据矩阵的不同通道。
在各种实施例中,展开的权重向量的元素例如在迭代期间被移位,以计算每个权重向量与相应数据输入元素的下一列的至少部分卷积结果。例如,展开的权重输入向量的元素可以移位一个行元素,以将权重向量元素与展开的数据输入向量的相应下一列对齐。在一些实施例中,迭代期间执行的移位数量对应于权重输入向量的行之间的填充量。例如,在七个零填充元素将每个展开的行与权重输入矩阵分隔开的情况下,在执行矩阵计算操作的初始集合之后,可以在进行下一次迭代之前执行七次移位和相应的矩阵计算操作。在各种实施例中,可以将展开的权重输入向量广播到为特定卷积运算分配的每个相应的向量计算单元,以并行计算多行的向量结果。在一些实施例中,可以利用多个矩阵处理器单元,并且不同的矩阵处理器单元可以并行计算相同的输入矩阵的不同迭代的部分和。来自每个矩阵处理器单元的部分和结果可以被组合以计算结果和。尽管关于并行求解两个卷积运算进行了描述,但是根据可用的向量计算单元的数量,可以并行求解多于两个的卷积运算。例如,涉及3×3权重矩阵的三个卷积运算可以被并行求解。通过将27个权重元素作为单个组合权重向量存储在存储器中,可以合并三个权重矩阵。一旦从存储器中读取,三个权重矩阵可以由输入向量单元扩展成三个单独的展开的权重输入向量,并且可用的向量计算单元在三个卷积运算中分配。如果从存储器中读取权重矩阵需要多于一次的读取,可以利用多次读取来读取额外的权重矩阵。例如,限于32元素读取的处理元件可能需要多次读取来加载四个或更多3×3权重矩阵,因为四个权重矩阵可需要36个权重元素。
在一些实施例中,系统包括数据输入向量单元、权重输入向量单元和具有多个计算单元的矩阵处理器单元。例如,矩阵处理器单元包含多个向量计算单元,用于处理由数据输入向量单元和权重输入向量单元准备的输入向量。矩阵处理器单元的多个计算单元包括第一组一个或更多个计算单元和第二组一个或更多个计算单元。每个组可以与不同的卷积运算相关联。数据输入向量单元被配置为同时接收第一数据矩阵的多个不同行和第二数据矩阵的多个不同行的元素。例如,矩阵处理器单元可以并行处理两个卷积运算。数据输入向量单元可以准备对应于两个不同数据矩阵的数据输入向量。数据输入向量单元可以从存储器中读取相应数据矩阵的数据元素。权重输入向量单元被配置成接收组合权重向量,其中组合权重向量包括第一权重矩阵的权重元素和第二权重矩阵的权重元素。例如,两个权重矩阵各自与两个数据矩阵中的一个相关联,并且对应于两个不同的卷积运算。在各种实施例中,两个权重矩阵被组合并存储为组合权重向量。权重输入向量单元从组合权重向量获得第一权重矩阵的权重元素和第二权重矩阵的权重元素。例如,通过从组合权重向量中识别并获得第一权重矩阵的相应权重元素,从组合权重向量中提取第一权重矩阵。类似地,通过从组合权重向量中识别并获得第二权重矩阵的相应权重元素来提取第二权重矩阵。在一些实施例中,权重输入向量单元至少部分地同时向第一组一个或更多个计算单元提供第一权重矩阵的获得的权重元素,并且向第二组一个或更多个计算单元提供第二权重矩阵的获得的权重元素。例如,每个权重矩阵的权重元素被格式化为权重输入掩码(mask),并被广播到矩阵处理器单元的相应计算单元组。第一组向量计算单元接收用于第一卷积运算的格式化的权重矩阵,第二组计算单元接收用于第二卷积运算的格式化的权重矩阵。在一些实施例中,第一组计算单元的每个计算单元被配置为将来自数据输入向量单元的第一数据矩阵的所提供的元素与来自权重输入向量单元的第一权重矩阵的所提供的相应元素相乘,并将相应计算单元的相乘结果相加在一起,以至少部分地确定第一卷积结果矩阵中的相应元素。类似地,第二组计算单元的每个计算单元被配置为将来自数据输入向量单元的第二数据矩阵的所提供的元素与来自权重输入向量单元的第二权重矩阵的所提供的相应元素相乘,并将相应计算单元的相乘结果相加在一起,以至少部分地确定第二卷积结果矩阵中的相应元素。例如,每组计算单元对由数据输入向量单元和权重输入向量单元准备的接收的输入向量执行向量运算。在一些实施例中,每个计算单元包括向量乘法单元和向量加法器单元,用于执行向量运算,例如点积结果。来自第一或第二组计算单元的每个计算单元的结果用于确定相关卷积运算的结果或部分结果。在一些实施例中,向量输出结果可以用于至少部分地确定权重矩阵和相应数据矩阵的至少一部分相乘的结果。例如,向量输出结果的连续累加可用于确定权重输入矩阵之一与相应数据输入矩阵之一相乘的结果。在一些实施例中,向量输出结果可以用于至少部分地确定将数据矩阵与权重矩阵卷积的结果矩阵中的相应元素。例如,向量输出结果的连续累加可以用于确定使用权重输入矩阵和数据输入矩阵的逐深度卷积的结果。
图1是示出使用神经网络解决人工智能问题的系统的实施例的框图。在所示的示例中,系统100包括处理元件101和存储器161。处理元件101包括数据输入向量单元103、权重输入向量单元105、矩阵处理器单元107和输出向量单元151。矩阵处理器单元107包括多个向量计算单元,该多个向量计算单元至少包括向量单元111、121、131和141。在各种实施例中,矩阵处理器单元107从数据输入向量单元103接收一个或更多个数据输入向量(未示出),并从权重输入向量单元105接收至少一个权重输入向量(未示出)。例如,数据输入向量单元103生成数据输入向量,并且权重输入向量单元105生成权重输入向量。生成的数据输入向量和权重输入向量对可以作为参数(argument)传递给矩阵处理器单元107的向量计算单元,例如向量单元111、121、131和141之一。例如,矩阵处理器单元107的向量单元可以使用数据输入向量和权重输入向量对来确定矩阵结果,例如点积结果。在一些实施例中,矩阵处理器单元107包括32个向量单元。每个向量单元可以采用两个32元素向量作为参数,并且每个向量单元可以产生单个元素结果。跨所有向量单元获取,结果是输出向量结果。在各种实施例中,矩阵处理器单元107的输出可以是输出向量,并且在输出向量单元151处被接收。在一些实施例中,通过累加多个向量单元运算的部分向量结果来确定输出向量。在一些实施例中,在输出向量单元151接收的输出向量是32元素向量。在适当的情况下,可以使用其他向量长度。类似地,由系统100处理的元素的大小可以被适当地配置。例如,元素可以是4位、8位、2字节、4字节或其他合适的大小。
在各种实施例中,矩阵处理器单元107被配置成分别经由数据输入向量单元103和权重输入向量单元105接收两个输入矩阵,每个矩阵是二维矩阵。数据输入向量单元103、权重输入向量单元105和输出向量单元151可以使用硬件寄存器(例如触发器电路)来实现,用于向/从矩阵处理器单元107传送多个输入和输出元素。在一些实施例中,从存储器161中检索对应于每个数据输入向量的元素,并经由数据输入向量单元103将其加载到矩阵处理器单元107的对应向量单元中,例如向量单元111、121、131或141。例如,具有32个向量单元的矩阵处理器单元经由数据输入向量单元103加载有32个数据元素向量。相应地,可以经由权重输入向量单元105从存储器161加载权重元素的向量,并将该权重元素的向量广播给矩阵处理器单元107的所有适用向量单元。通过使用单位权重输入向量单元105向矩阵处理器单元107的所有向量单元广播相同的权重输入向量,相同的权重值可以由矩阵处理器单元和每个相应的向量单元应用于不同的数据向量。在一些实施例中,数据输入向量单元103、权重输入向量单元105和/或输出向量单元151可以同时处理多于一个的输入/输出向量。在各种实施例中,图1的粗箭头表示数据移动通过系统100的组件的方向。例如,箭头可以对应于多元素的宽的通信/数据总线和/或数据线。在各种实施例中,在输出向量单元151接收的输出向量结果可以写回到存储器161。
在各种实施例中,矩阵处理器单元107的每个向量单元(例如向量单元111、121、131或141)接收两个向量操作数,并且可以执行一个或更多个向量运算。例如,向量单元可以计算两个输入操作数的点积,并将结果作为输出向量的一个元素输出到输出向量单元151。在一些实施例中,向量单元结果被累加并用作向量单元执行的后续操作的操作数。在一些实施例中,矩阵处理器单元107的每个向量单元(例如向量单元111、121、131或141)包括乘法单元和加法器单元(未示出)。在一些实施例中,矩阵处理器单元107的每个向量单元可以包括向量累加器(未示出),例如,用于存储向量运算之间的部分结果。
在一些实施例中,矩阵处理器单元107被配置为并行接收对应于两个以上的输入矩阵的输入数据。通过并行处理多对矩阵,处理元件101和矩阵处理器单元107的吞吐量和效率显著增加。如果矩阵处理器单元107被用来仅处理单对输入矩阵,例如,对应于单个逐深度卷积运算的一对输入矩阵,那么随着输入矩阵大小的减小,一些向量单元将保持未被使用。例如,对于配置有32个向量单元的矩阵处理器单元,仅需要一半的向量单元(即,16个向量单元)来处理具有18行的数据矩阵。相反,并行处理多个卷积运算,例如多个逐深度卷积运算。在一些实施例中,矩阵处理器单元107的向量单元(例如向量单元111、121、131和141)被分配给不同的卷积运算。不同卷积运算的每个数据输入矩阵作为数据输入向量通过数据输入向量单元103被加载到为特定卷积运算分配的相应向量单元中。特定卷积运算的相应权重输入矩阵作为权重输入向量通过权重输入向量单元105广播给相同的相应向量单元。例如,32个向量单元的矩阵处理器单元的16个向量单元可以被分配给第一卷积运算,并且矩阵处理器单元的剩余16个向量单元可以被分配给第二卷积运算。每组向量单元接收对应于分配的卷积运算的数据输入向量。类似地,基于分配的卷积运算,相应的权重输入向量被广播到每组向量单元。在一些实施例中,不同的权重矩阵(例如,对应于不同的卷积运算)由权重输入向量单元105经由组合权重向量(未示出)加载到处理元件101中。权重输入向量单元105从存储器161读取组合权重向量,并将组合权重向量扩展成多个权重输入向量,这些权重输入向量被广播到矩阵处理器单元107的不同向量单元组。
使用所公开的技术,系统100,特别是矩阵处理器单元107可以被用来有效地执行逐深度卷积运算,以使用神经网络解决人工智能问题。特别地,随着数据矩阵的大小减小,系统100可以有效地并行求解多个逐深度卷积运算。可以经由数据输入向量单元103和/或权重输入向量单元105来展开二维矩阵操作数并将该二维矩阵操作数格式化成输入向量。并且在一些实施例中,可以使用组合权重向量的单次读取从存储器161读取多个权重矩阵。一旦展开,输入向量可用于使用矩阵处理器单元107的向量单元(例如向量单元111、121、131或141)来实现逐深度卷积。在一些实施例中,输入向量单元(例如权重输入向量单元105)包括用于有效移位输入向量内的元素的逻辑。例如,元素可以向右移位一个位置。在各种实施例中,移位逻辑/电路可以被配置成将元素向右(或向左)移位不同数量的位置。在一些实施例中,元素在被移位超过输入向量的开始或末尾时循环(loop around),和/或元素可以用诸如零填充元素的默认值来替换。权重输入向量单元105还可以包括将组合权重向量扩展成多个权重输入向量的逻辑,这些权重输入向量可以导向矩阵处理器单元107的不同向量单元。权重输入向量单元105可以包括通过在行之间插入零元素来格式化每个权重输入向量以有效地创建权重输入掩码的逻辑。在一些实施例中,输入向量单元,例如数据输入向量单元103,包括用于有效地从存储器161中检索数据元素并为矩阵处理器单元107以线性化顺序格式化这些元素的逻辑。例如,数据输入向量单元103可以包括用于使用与转置矩阵(或矩阵切片(slice))相关联的模式来有效地格式化数据元素的矩阵(或矩阵切片)的逻辑。一旦应用了格式化模式,就可以将元素线性化为数据输入向量,并作为操作数传递给矩阵处理器单元107的向量单元。
图2A是示出使用神经网络解决人工智能问题的处理器系统的实施例的框图。在所示的示例中,处理元件200包括矩阵处理器单元201、数据输入向量单元203、权重输入向量单元205和输出向量单元231。矩阵处理器单元201包括多个向量单元,该多个向量单元至少包括向量单元213、215、223和225。矩阵处理器单元201的向量单元被分配给两个不同的向量单元组211和221。向量单元组211包括向量单元213和215,并且向量单元组221包括向量单元223和225。向量单元213和215之间以及向量单元223和225之间的三个点表示每个组中包括的可选的附加向量单元(未示出)。在一些实施例中,向量单元组211和221是由虚线矩形指示的逻辑组。分配给每个向量单元组的数量和特定向量单元可以改变,例如,取决于处理器的工作负载。例如,32个向量单元的矩阵处理器单元可以将16个向量单元分配给一个向量单元组,并将剩余的16个向量单元分配给第二向量单元组。基于不同的工作负载,14个向量单元可以被分配给一个向量单元组,14个向量单元可以被分配给第二个向量单元组,并且剩余的4个向量单元可以未被利用并且未被分配给任何向量单元组。尽管图2A中的向量单元被分配在两个不同的组中,但是向量单元组的数量可以超过二。在各种实施例中,每个向量单元组对应于卷积运算。例如,向量单元组211对应于第一卷积运算,向量单元组221对应于第二卷积运算。
在一些实施例中,矩阵处理器单元201被配置成分别经由数据输入向量单元203和权重输入向量单元205接收两个输入矩阵,每个矩阵是二维矩阵,并将矩阵结果输出到输出向量单元231。矩阵处理器单元201还被配置为接收多对输入矩阵,例如,每对矩阵对应于不同的矩阵或卷积运算,并将每个运算的矩阵结果(或部分结果)输出到输出向量单元231。在所示的示例中,矩阵处理器单元201、数据输入向量单元203和权重输入向量单元205被配置成接收多达两对的输入矩阵。数据输入向量单元203将针对不同卷积运算处理的数据输入向量引导到向量单元组211或221的相应向量单元。权重输入向量单元205处理组合权重向量,以便为每个卷积运算创建权重输入向量。创建的权重输入向量存储在权重输入向量寄存器207和209中。第一权重输入向量存储在权重输入向量寄存器207中,第二权重输入向量存储在权重输入向量寄存器209中。权重输入向量寄存器207的权重输入向量被广播到向量单元组211的向量单元,包括向量单元213和215。类似地,权重输入向量寄存器209的权重输入向量被广播到向量单元组221的向量单元,包括向量单元223和225。相同的向量单元从数据输入向量单元203接收相应的数据输入向量。在各种实施例中,向量单元组211或向量单元组221的结果或部分结果可以独立地输出到输出向量单元231。在一些实施例中,输出向量单元231可以包括多个输出缓冲器或寄存器,以接收多个输出结果。
在所示示例中,图2A的实线箭头表示逻辑连接性。例如,权重输入向量寄存器207到向量单元组211之间以及权重输入向量寄存器209到向量单元组221之间的连接可以使用共享总线和逻辑来实现。类似地,数据输入向量单元203到向量单元组211之间以及数据输入向量单元203到向量单元组221之间的连接可以使用共享总线和逻辑来实现。尽管处理元件200被配置为并行处理两个矩阵对,但是处理元件可以被配置为适当地处理附加的矩阵对。例如,在一些实施例中,处理元件被配置为并行处理三个或更多个矩阵对。权重输入向量单元为每个矩阵对生成相应的权重输入向量,数据输入向量单元生成相应的数据输入向量。基于同时矩阵运算和矩阵对的数量,向量单元被分配到向量单元组中。每个矩阵对的相应输入向量被引导到所分配的向量单元。
在一些实施例中,处理元件200是图1的处理元件101,并且矩阵处理器单元201、数据输入向量单元203、权重输入向量单元205和输出向量单元231分别是图1的矩阵处理器单元107、数据输入向量单元103、权重输入向量单元105和输出向量单元151。在一些实施例中,向量单元213、215、223和225各自是图1的向量单元111、121、131或141中的一个。在一些实施例中,可以并行利用诸如处理元件200的处理元件和诸如矩阵处理器单元201的多个矩阵处理器单元来提高性能。例如,一个处理元件及其矩阵处理器单元可用于处理大矩阵的一个切片,而另一个处理元件及其矩阵处理器单元可用于处理同一矩阵的不同切片。
在一些实施例中,数据输入向量单元203用于将向量操作数加载到矩阵处理器单元201中。例如,对应于二维矩阵的至少一部分的数据可以从存储器中读取,并且在被加载到矩阵处理器单元201之前由数据输入向量单元203处理。在各种实施例中,由数据输入向量单元203生成的数据输入向量操作数可以被导向矩阵处理器单元201的向量单元中的任何一个,例如向量单元213、215、223或225。例如,在一些实施例中,矩阵处理器单元201包括32个向量单元。在32个周期内,32个向量操作数可以经由数据输入向量单元203加载到矩阵处理器单元201中。对于每个周期,数据输入向量单元203生成一个数据输入向量操作数,然后将其加载到32个向量单元之一中。32个周期后,所有32个向量单元都已接收到一个数据输入向量操作数。在一些实施例中,每个周期可以生成和加载多个数据输入向量。例如,可以并行生成四个数据输入向量,以便在8个周期内加载32个向量单元。在一些实施例中,加载的数据输入向量可以来源于对应于不同卷积运算的不同数据矩阵。例如,可以从第一数据输入矩阵中读取第一卷积运算的数据输入向量,并将其导向向量单元组211的向量单元。可以从第二数据输入矩阵中读取第二卷积运算的数据输入向量,并将其导向向量单元组221的向量单元。
类似地,权重输入向量单元205用于为矩阵处理器单元201的每个适用向量单元加载第二向量操作数。例如,与二维权重矩阵的至少一部分对应的权重数据可以从存储器中读取,并在被加载到矩阵处理器单元201之前由权重输入向量单元205处理。在各种实施例中,由权重输入向量单元205生成的权重输入向量操作数可以导向矩阵处理器单元201的任何一个、一组或所有向量单元,例如向量单元213、215、223或225或向量单元组211或221。例如,相同的权重输入向量操作数可以被广播到矩阵处理器单元201的所有向量单元。这允许将相同的权重数据应用于每个数据输入向量操作数。类似地,相同权重输入向量操作数可以广播给向量单元组的所有向量单元。这允许相同的权重数据被应用于对应于分配给该组的矩阵运算的每个数据输入向量操作数。
在一些实施例中,从组合权重向量生成多个权重输入向量。例如,一对二维权重矩阵存储在单个向量中,并且可以在单次存储器读取中从存储器中读取。权重输入向量单元205从组合权重向量中提取每个权重矩阵的权重,并创建两个权重输入向量,每个权重矩阵对应一个权重输入向量。权重输入向量在被广播到它们各自的向量单元组之前可以独立地存储在不同的权重输入向量寄存器207和209中。例如,第一向量单元组211被分配给第一卷积运算,第二向量单元组221被分配给第二卷积运算。每个权重输入向量被广播到适当向量单元组的向量单元。这允许并行求解两个卷积运算,并且当矩阵大小减小时,显著提高了向量单元的利用率。在各种实施例中,可以并行处理对应于三个或更多权重矩阵的三个或更多卷积运算。例如,组合向量单元可以包括三个线性化的权重矩阵。在一些实施例中,可能需要多次读取来加载多个权重矩阵。在一些实施例中,数据输入向量单元203可以用于类似地向多个向量单元广播向量操作数。
在一些实施例中,经由数据输入向量单元203和/或权重输入向量单元205将向量操作数从存储器加载到矩阵处理器单元201中所需的周期数基于矩阵处理器单元的利用率。例如,为了保持矩阵处理器接近完全利用,从存储器中检索向量单元的数据参数,并在与向量单元的计算利用率紧密匹配的时间段(例如,一定数量的周期)内准备该数据参数。通过匹配负载和计算时间,矩阵处理器可以保持接近完全利用。在一些实施例中,例如,通过增加总线速度来减少数据读取时间,从而更好地匹配负载和计算时间。例如,在各种实施例中,矩阵处理器单元201可能花费大约八个时钟周期来完成某一组计算。(一组计算的示例可能包括将八个不同的权重输入向量应用于一组数据输入向量。)每个周期一个向量操作数的读取速率将需要至少32个周期来加载所有向量单元。将读取速率提高4倍,允许在大约8个周期内加载所有32个向量操作数,这与矩阵处理器单元的处理计算时间相匹配。在各种实施例中,通过将数据读取速度(例如,用于加载向量操作数的数据总线速度)与矩阵处理器单元计算性能和工作负载相匹配,矩阵处理器单元的整体效率和吞吐量显著增加。在一些实施例中,使用本文公开的技术,数据读取速度至少部分提高。例如,可以并行生成多个数据输入向量,以倍增到总的有效数据读取速度。在一些实施例中,数据输入向量单元203可以并行处理多个数据输入向量,以减少将相应的数据输入向量加载到矩阵处理器单元201的所有向量单元所需的周期数。类似地,权重输入向量单元205可以并行处理多个权重输入向量,以减少将相应的权重输入向量加载到矩阵处理器单元201的一组向量单元所需的周期数。
在一些实施例中,数据输入向量单元203和/或权重输入向量单元205包括移位硬件(未示出)以移位向量操作数的元素。例如,权重输入向量单元205可以加载有用于第一次迭代的一个或更多个向量操作数。在第二次迭代期间,向量操作数可以被适当地(向右或向左)移位一个或更多个位置。新移位的向量操作数可以用于矩阵计算。一旦矩阵计算完成,可以再次移位向量操作数,并且新移位的向量操作数可以用于下一次迭代。以这种方式,在每次迭代期间应用(通过移位输入向量的内容来确定的)新的向量操作数,并且可以在权重输入向量寄存器(例如权重输入向量寄存器207和209)中被存储或移位到适当的位置。例如,在一些实施例中,移位逻辑用于展开的矩阵操作数(例如展开的权重矩阵),以将展开的矩阵操作数与来自第二矩阵操作数(例如展开的数据矩阵)的适当元素对齐。
在一些实施例中,矩阵处理器单元201包括多个向量单元,每个向量单元包括向量乘法单元和向量加法器单元。每个向量乘法单元被配置为将经由数据输入向量单元203和权重输入向量单元205接收的相应元素相乘。在一些实施例中,结果是相乘结果的向量。例如,对于两个32字节的输入向量,向量乘法单元的结果是32个相乘结果的向量。对于每个向量单元,来自数据输入向量单元203的数据输入向量的第一元素与来自权重输入向量单元205的权重输入向量的第一元素相乘。类似地,数据输入向量的第二元素与权重输入向量的第二元素相乘。在各种实施例中,来自由数据输入向量单元203生成的数据输入向量和由权重输入向量单元205生成的权重输入向量的相应元素被并行相乘。在各种实施例中,相乘结果的向量被传递到向量单元的向量加法器单元。
在一些实施例中,每个向量加法器单元被配置成计算来自输入向量的元素的和。例如,来自由向量乘法单元计算的相乘结果的向量的每个元素的和由向量加法器单元计算。在一些实施例中,向量加法器单元的结果是用作相应向量乘法单元的输入的向量的点积。在各种实施例中,每个向量加法器单元被实现为加法器树。例如,加法器树的顶层可以添加成对的元素以确定一组部分和,例如添加元素0和1以确定第一部分和,以及添加元素2和3以确定第二部分和,等等。每个后续层可以对来自前一层的成对的部分和进行求和,直到最后一层计算出最终结果和。在各种实施例中,每个加法器树并行计算部分和,以得到结果和。并行运算显著提高了对数字向量进行求和的效率。在各种实施例中,多个向量单元可以并行操作以并行计算多个点积,显著提高了矩阵和卷积运算的吞吐量。
在一些实施例中,矩阵处理器单元201包括例如一个或更多个累加器,以累加每个向量单元的结果。在一些实施例中,累加器作为向量单元的一部分或者作为矩阵处理器单元201的一部分被适当地包括。累加器可以用于对向量单元的多次迭代所计算的结果进行求和。例如,向量单元的一次迭代的最终结果和可以被存储在累加器中,并被添加到向量单元的下一次迭代的最终结果和中。在一些实施例中,累加器是向量累加器。例如,可以基于由输出向量单元231接收的输出向量的大小来确定累加器的大小。在各种实施例中,一旦矩阵处理完成,累加器结果可以被推送到输出向量单元231。在一些实施例中,对于每个向量单元组,存在累加器。
图2B是示出使用神经网络解决人工智能问题的矩阵处理器单元的实施例的框图。在所示的示例中,矩阵处理器单元251包括多个向量单元组,该多个向量单元组包括向量单元组253和255。每个向量单元组包括多个向量单元。矩阵处理器单元251的向量单元263、265、283和285被分配给两个不同的向量单元组253和255。向量单元组253包括向量单元263和265。向量单元组255包括向量单元283和285。向量单元263和265之间以及向量单元283和285之间的三个点表示每个组中包括的可选的附加向量单元(未示出)。在一些实施例中,向量单元组253和255是由虚线矩形指示的逻辑组。分配给每个向量单元组的数量和特定向量单元可以改变,例如,这取决于处理器的工作负载。在各种实施例中,矩阵处理器单元可以包括更多或更少的向量单元。例如,矩阵处理器单元可以包括32个向量单元,每个向量单元能够处理两个32元素向量。在一些实施例中,每个向量单元包括向量乘法单元和向量加法器单元。在所示的示例中,向量单元263包括向量乘法单元271和向量加法器单元273。类似地,向量单元265包括向量乘法单元275和向量加法器单元277,向量单元283包括向量乘法单元291和向量加法器单元293,并且向量单元285包括向量乘法单元295和向量加法器单元297。在各种实施例中,矩阵处理器单元251是图2A的矩阵处理器单元201,向量单元组253和255分别是图2A的向量单元组211和221,向量单元263、265、283和285分别是图2A的向量单元213、215、223和225。
在一些实施例中,矩阵处理器单元251的每个向量单元,例如向量单元263、265、283和285,接收两个向量操作数,并且可以执行一个或更多个向量运算。例如,向量单元可以通过将第一输入向量的每个元素与第二输入向量的相应元素相乘来计算多个乘法运算的结果。所得到的相乘结果可以被累加并用于将来的运算,例如对部分结果求和。例如,向量单元结果可以被累加,并用作由向量单元执行的后续运算的操作数。在各种实施例中,每个向量单元组的向量单元接收与相同矩阵运算(例如逐深度卷积运算)相关联的向量操作数。例如,向量单元组253的向量单元,例如向量单元263和265,接收与第一卷积运算相关联的向量操作数,向量单元组255的向量单元,例如向量单元283和285,接收与第二卷积运算相关联的向量操作数。每组的向量单元可以被配置为接收相同的权重输入向量(例如,通过广播),但是可以接收对应于与该组相关联的相同数据矩阵的不同元素的不同数据输入向量。这允许将相同的权重矩阵应用于相同数据矩阵的不同部分,同时还处理多个权重和数据矩阵。
在所示的示例中,矩阵处理器单元251包括多个向量单元,每个向量单元包括向量乘法单元和向量加法器单元。每个向量乘法单元,例如向量乘法单元271、275、291或295,被配置成使经由数据输入向量单元(未示出)和权重输入向量单元(未示出)接收的相应元素相乘。在一些实施例中,结果是相乘结果的向量。例如,对于两个32字节的输入向量,向量乘法单元的结果是32个相乘结果的向量。来自数据输入向量的第一元素与权重输入向量的第一元素相乘。类似地,来自数据输入向量的第二元素与权重输入向量的第二元素相乘。在各种实施例中,来自数据输入向量和权重输入向量的相应元素被并行相乘。在各种实施例中,相乘结果的向量被传递到向量单元的向量加法器单元。例如,向量乘法单元271将其相乘结果传递给向量加法器单元273,向量乘法单元275将其相乘结果传递给向量加法器单元277,向量乘法单元291将其相乘结果传递给向量加法器单元293,并且向量乘法单元295将其相乘结果传递给向量加法器单元297。
在一些实施例中,向量单元的每个向量加法器单元,例如向量加法器单元273、277、293或297,被配置为使用来自输入向量的元素来计算加法运算。例如,向量加法器单元273计算来自由向量乘法单元271计算的相乘结果的向量的选定元素的和。类似地,向量加法器单元277计算来自由向量乘法单元275计算的相乘结果的向量的每个元素的和,向量加法器单元293计算来自由向量乘法单元291计算的相乘结果的向量的每个元素的和,并且向量加法器单元297计算来自由向量乘法单元295计算的相乘结果的向量的每个元素的和。在一些实施例中,向量加法器单元的结果是用作相应向量乘法单元的输入的向量的点积。在各种实施例中,每个向量加法器单元,例如向量加法器单元273、277、293或297,被实现为加法器树。例如,加法器树的顶层可以添加成对的元素以确定一组部分和,例如添加元素0和1以确定第一部分和,以及添加元素2和3以确定第二部分和,等等。每个后续层可以对来自前一层的成对的部分和进行求和,直到最后一层计算出最终结果和。在一些实施例中,任何部分和可以作为加法器单元的结果输出。在各种实施例中,每个加法器树并行计算部分和,以得到结果和。并行运算显著提高了对数字向量进行求和的效率。在各种实施例中,多个向量单元可以并行操作以并行计算多个结果,显著提高了矩阵处理器单元251的吞吐量。
在一些实施例中,矩阵处理器单元251包括例如一个或更多个累加器(未示出),用于累加每个向量单元的结果。在一些实施例中,累加器作为向量单元的一部分或者作为矩阵处理器单元251的一部分被适当地包括。累加器可以用于对向量单元的多次迭代所计算的结果进行求和。例如,来自向量单元的一次迭代的结果可以存储在累加器中,并添加到向量单元的下一次迭代的结果中。在一些实施例中,累加器是向量累加器。例如,可以基于矩阵处理器单元251的输出向量的大小来确定累加器的大小。在各种实施例中,一旦矩阵处理完成,累加器结果就可以被推送到存储器。在一些实施例中,矩阵处理器单元251可以配置有多个向量累加器,以累加与每个向量单元组相关联的输出结果。
图3是示出使用矩阵处理器单元并行执行多个二维卷积运算的过程的实施例的流程图。例如,通过求解一个或更多个二维卷积运算来分析神经网络的一个或更多个层,从而部分地使用神经网络来解决人工智能问题。可以通过向一个或更多个矩阵处理器单元发出一个或更多个二维卷积运算指令来启动适当的二维卷积运算。每个指令可以例如通过指定每个矩阵操作数在存储器、寄存器或另一个适当位置中的位置来指示两对或更多对矩阵操作数。在一些实施例中,该指令对应于使用每个逐深度卷积的数据(或激活)矩阵和权重矩阵的多个逐深度卷积运算。在一些实施例中,使用图1的处理元件101和/或图2A的处理元件200,特别是使用诸如图1的矩阵处理器单元107、图2A的矩阵处理器单元201和/或图2B的矩阵处理器单元251的矩阵处理器来执行卷积运算。
在301,接收描述二维卷积运算的指令。例如,指令由处理器元件接收,例如由包括矩阵处理器单元、输入向量寄存器和/或输出向量寄存器以及其他组件的处理器元件接收。在各种实施例中,除了矩阵处理器单元之外,处理器元件可以包括附加的或更少的组件。接收到的二维卷积运算指令指示处理器元件执行多个二维卷积运算,并且可以为每个卷积运算指定两个矩阵操作数。例如,对于第一卷积运算,第一对矩阵可以是二维数据矩阵和二维权重矩阵,而对于第二卷积运算,第二对矩阵可以是不同的二维数据矩阵和不同的二维权重矩阵。在一些实施例中,多个权重矩阵被引用为单个操作数。例如,两个或更多个矩阵可以作为存储在存储器中的组合权重向量来引用。在一些实施例中,如果不首先将一个或更多个矩阵操作数分成更小的矩阵切片,矩阵操作数可能太大而不能加载到矩阵处理器单元中。在一些实施例中,不同的卷积运算是使用多个指令来指定的,但是被并行求解。
在303,向量单元被分配给每个卷积运算。例如,第一组向量单元被分配给第一卷积运算,第二组向量单元被分配给第二卷积运算。在一些实施例中,为特定卷积运算分配的向量单元的数量由在301接收的一个或更多个指令确定。例如,该指令可以指定要分配给卷积运算的向量单元的数量和/或矩阵参数的一个或更多个维度。矩阵操作数的大小可以进一步规定要分配的向量单元的数量。例如,在一些实施例中,当矩阵的三行被展开成单个输入向量时,具有N行的矩阵所需的向量单元的数量是N+2个向量单元。通过将三行展开成单个输入向量,具有18行的数据矩阵最多可以利用16个向量单元。
在305,准备二维数据输入操作数。例如,准备一个二维数据矩阵作为每个卷积运算的操作数。在一些实施例中,从存储器或另一位置检索对应于每个二维数据输入操作数的数据。检索的数据可以是数据输入操作数的某些行和/或列。例如,数据输入操作数的不同切片可以单独准备和/或可以由不同的处理元件并行准备。在各种实施例中,准备可以包括展开二维数据输入操作数的部分。例如,数据输入矩阵的指定部分可以线性化为向量。在一些实施例中,仅矩阵的一部分或矩阵切片被线性化,例如,仅行的子集。在展开并线性化数据矩阵的所选部分时,可以通过填充元素(例如零元素)来分隔行,以至少部分地将所选矩阵元素与来自权重输入操作数的相应元素对齐。在各种实施例中,每个准备好的数据输入操作数被加载到矩阵处理器单元的向量单元中。根据输入操作数,相应矩阵的附加部分被展开、线性化并加载到矩阵处理器单元中。例如,对应于二维数据输入操作数的不同(且可能重叠)部分的向量被展开、线性化并加载到矩阵处理器单元的不同向量单元中。在一些实施例中,使用诸如图1的数据输入向量单元103和/或图2A的数据输入向量单元203的数据输入向量单元来加载准备好的数据输入操作数。
在307,准备二维权重输入操作数。例如,准备二维权重矩阵作为每个卷积运算的第二操作数。在一些实施例中,从存储器或另一位置检索对应于每个二维权重输入操作数的数据。在一些实施例中,多个权重输入操作数的数据作为组合权重向量被一起检索。检索的权重数据可以是权重输入操作数的某些行和/或列。例如,权重输入操作数的不同切片可以单独准备和/或可以由不同的处理元件并行准备。在各种实施例中,准备可以包括展开二维权重输入操作数的部分。例如,权重输入矩阵的指定部分可以线性化为向量。在一些实施例中,仅矩阵的一部分或矩阵切片被线性化,例如,仅行的子集。在展开并线性化矩阵的所选部分时,可以通过填充元素(例如零元素)来分隔行,以至少部分地将所选矩阵元素与来自数据输入操作数的相应元素对齐。填充元素的数量可以至少部分地基于矩阵处理器单元支持的数据大小和权重输入矩阵的维度而变化。在各种实施例中,准备好的权重输入操作数被加载到矩阵处理器单元的向量单元中。在一些实施例中,准备好的权重输入操作数被广播并加载到矩阵处理器单元的多于一个的向量单元中。例如,相同权重输入操作数可以被广播到矩阵处理器单元的每个向量单元或者分配给相关卷积运算的矩阵处理器单元的向量单元组的每个向量单元。在一些实施例中,使用诸如图1的权重输入向量单元105和/或图2A的权重输入向量单元205的权重输入向量单元来加载准备好的权重输入操作数。在一些实施例中,权重输入向量单元从组合权重向量中提取每个权重矩阵的元素,以准备在301指定的每个卷积运算的每个权重输入操作数。
在309,执行二维卷积运算。使用分别在305和307准备的数据输入操作数和权重输入操作数,由矩阵处理器单元执行二维卷积运算。卷积运算可以包括计算在不同迭代上累加的部分和/或中间结果。在各种实施例中,矩阵处理器单元提供输出结果的向量作为输出向量。在一些实施例中,每个向量单元组与其他向量单元组并行计算相应卷积运算的结果或部分结果。在一些实施例中,输出向量由例如图1的输出向量单元151和/或图2A的输出向量单元231的输出向量单元接收。在一些实施例中,完整的二维卷积运算可以包括移位权重输入操作数的元素,以至少部分地计算权重输入矩阵与数据输入矩阵的不同部分的逐深度卷积。
图4是示出使用矩阵处理器单元执行二维卷积运算的过程的实施例的流程图。例如,二维卷积运算的结果是通过对矩阵参数的二维切片执行多个向量运算来计算的。一个或更多个输入参数(例如数据输入矩阵)可能超过矩阵处理器单元的最大操作数大小。结果,输入操作数可以被分割成与矩阵处理器单元的操作数大小兼容的更小的矩阵。兼容大小的切片可以作为操作数被传递给一个或更多个不同的矩阵处理器单元,并将结果合并。在一些实施例中,在不同的矩阵处理器单元(例如,对应于不同处理器元件的矩阵处理器单元)上操作切片。在某些情况下,二维卷积运算的输入参数足够小,以至于求解卷积运算不能完全利用矩阵处理器单元。结果,矩阵处理器单元可以在不同的卷积运算之间分配处理。例如,矩阵处理器单元的向量单元可以被分配给不同的向量单元组,并且每个组可以处理不同的卷积运算,从而允许并行求解多个卷积运算。
在各种实施例中,可以响应于卷积运算指令(例如在图3的301处接收的卷积运算指令)来执行图4的过程。在一些实施例中,图4的过程在图3的305、307和/或309处利用分配给图3的303处的卷积运算的向量单元来执行。在一些实施例中,使用图1的矩阵处理器单元107和/或图2A的矩阵处理器单元201来执行图4的过程。
在401,识别矩阵操作数的下一个二维切片。例如,识别其大小与矩阵处理器单元的操作数大小兼容的一个或更多个矩阵操作数。可以在存储器中识别切片,并且可以发出读取请求以加载所识别的数据。在一些实施例中,与权重输入矩阵的大小相比,数据输入矩阵的大小通常非常大。数据输入矩阵被分割成更小的尺寸以用于处理。在一些实施例中,基于分配给卷积运算的向量单元的数量,数据输入矩阵被分割成切片。在401,识别下一个切片以进行处理。
在403,展开输入参数并执行向量运算。例如,展开数据输入矩阵的切片和权重输入矩阵。在各种实施例中,展开将二维矩阵(或矩阵切片)线性化为向量操作数,该向量操作数被加载到矩阵处理器单元的至少一个向量单元中。展开可能需要一次以上迭代。例如,在一些实施例中,展开的矩阵操作数经过几次迭代来被展开,使得每次迭代仅展开行的子集。例如,对于较大的权重矩阵,权重矩阵不能被展开成使其整体适应向量单元。使用多次迭代,直到整个矩阵展开。在各种实施例中,权重矩阵可以展开成向量操作数,并广播给矩阵处理器单元的多于一个的向量单元。在一些实施例中,每次迭代还可以包括移位展开的权重矩阵,以将权重矩阵的元素应用于展开的数据矩阵的不同列。在各种实施例中,中间结果可以被累加并用作后续迭代的参数。执行的向量运算可以包括向量乘法和向量加法。例如,矩阵处理器单元的每个向量单元可以对向量数据和权重参数执行点积运算,以计算逐深度卷积结果的至少一部分。
在405,输出向量单元结果。例如,每个向量单元向输出向量的元素输出向量单元结果。在各种实施例中,输出向量可以存储在向量输出单元中,例如存储在图1的输出向量单元151中。在各种实施例中,可以通过累加在多次迭代的多个向量单元结果来确定向量单元结果。在各种实施例中,向量单元结果被输出到输出向量单元,用于将结果写回到存储器。在一些实施例中,向量单元结果是逐深度卷积结果的一部分。
在407,确定额外的二维切片是否需要处理。如果还有额外的二维切片待被处理,则处理循环回到401以处理下一个切片。如果没有额外的二维切片需要处理,则处理结束。
图5是示出使用矩阵处理器单元和向量单元运算来执行二维卷积运算的过程的实施例的流程图。例如,使用图5的过程,输入矩阵被展开、线性化,并作为输入向量被馈送到矩阵处理器单元的向量单元。执行向量单元运算以计算二维卷积运算的至少部分结果。在各种实施例中,数据输入矩阵和权重输入矩阵被转换成输入向量。例如,可以从数据输入矩阵中识别数据切片,并将其转换成一个或更多个数据输入向量。在一些实施例中,在图4的403和/或405处执行图5的过程。在一些实施例中,使用图1的矩阵处理器单元107和/或图2A的矩阵处理器单元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,准备权重输入掩码并将其广播给向量单元。例如,对应于在505识别的权重输入行的元素被准备到权重输入掩码中。权重输入掩码被线性化为用于与特定卷积运算相关联的矩阵处理器单元的向量单元的一维输入向量。例如,将准备好的权重输入掩码广播给分配给唯一卷积运算的向量单元组的每个向量单元。不包括在向量单元组中的其他向量单元可以接收不同的权重输入掩码,或者可以不被使用。在各种实施例中,用填充来对线性化的权重元素进行格式化,以将每个权重输入行的开始与在503准备的相关数据输入行对齐。例如,使用32元素向量和3x3权重矩阵(其中在505识别了所有行)选择权重矩阵的所有九个元素。使用额外的23个填充元素将权重矩阵的九个元素格式化为权重输入掩码。在一些实施例中,30个元素用于所选3x3矩阵的三行。每行包括一行中的三个元素,后面跟着七个填充元素。用附加填充元素来填充未用于所选3x3矩阵的行的数据输入向量的剩余元素(在该示例中为两个元素)。在各种实施例中,零值元素被用作填充元素。值为零的填充元素允许向量单元执行乘法和加法向量运算,而不会影响结果向量和。
在各种实施例中,格式化的权重输入掩码是向矩阵处理器单元的多个向量单元广播的输入向量。例如,权重输入向量用于存储线性化的一维向量格式的准备好的权重输入掩码。权重输入掩码然后被广播到每个适当的向量单元(例如,向量单元组的每个向量单元)作为输入向量操作数。例如,单个权重输入掩码可以被准备且由矩阵处理器单元的所有向量单元或矩阵处理器单元的向量单元组的所有向量单元利用。在一些实施例中,行填充元素被用来允许权重输入掩码被移位,以将权重矩阵的元素与数据输入向量中引用的数据矩阵的不同列重新对齐。在一些实施例中,通过从组合权重向量中提取权重元素来创建权重输入掩码。组合权重向量可以包括来自多个权重矩阵的权重元素。
在509,执行向量单元运算。利用从数据输入向量加载的输入向量和广播的权重输入掩码,矩阵处理器单元的相应向量单元执行向量单元运算。在一些实施例中,向量单元运算包括向量乘法和加法运算。例如,数据输入向量中的每个元素乘以权重输入掩码中的其相应元素。结果是相乘结果的向量。在一些实施例中,向量乘法运算由向量单元的向量乘法单元执行。使用向量相乘结果,通过将相乘结果向量中的每个元素相加来计算向量和结果(vector sum result)。在一些实施例中,使用向量单元的向量加法器单元来确定和。例如,使用加法器树的向量加法器单元可以计算向量元素的和。在一些实施例中,矩阵处理器单元包括累加器,用于将向量加法器结果与先前的向量加法器结果相加。例如,可以使用累加器来累加每次迭代的中间结果或部分结果,以确定运行的累加和。累加和允许一次迭代(或运行(pass))的向量和结果被添加到下一次迭代(或运行)的结果中。在各种实施例中,为权重输入掩码(和/或数据输入向量)准备的零填充元素导致零相乘结果,并且对向量加法结果没有影响。在一些实施例中,矩阵处理器单元的每个向量单元使用其相应的加载的数据输入向量和广播的权重输入掩码来执行点积运算。点积结果可以与来自先前迭代(或运行)的结果进行累加和/或被存储以添加到未来迭代的结果中。
在511,输出向量结果。例如,通过在509执行向量单元运算确定的向量结果从矩阵处理器单元输出。在一些实施例中,向量结果作为输出向量结果输出,例如输出到输出向量单元,例如图1的输出向量单元151。输出向量单元可用于将输出向量结果写入存储器。在一些实施例中,结果被输出并用作后续矩阵运算的参数。
图6A是示出使用矩阵处理器单元和向量单元运算来执行二维卷积运算的过程的实施例的流程图。例如,使用数据输入矩阵和数据权重矩阵,执行矩阵乘法和加法运算,以计算二维卷积运算的至少部分结果。输入矩阵被展开、线性化,并作为输入向量被馈送到矩阵处理器单元的向量单元。在一些实施例中,基于与特定卷积运算相关联的向量单元组来选择向量单元。不适合输入向量大小的权重输入矩阵在不同的迭代中被部分展开。为了进一步增加矩阵计算的吞吐量和效率,通过移位展开的输入权重掩码以将权重掩码的元素与加载的数据输入向量的不同元素(和相应列)重新对齐来执行额外的运行。通过重新使用准备好的数据输入向量以及重新对齐的权重掩码,对与数据传输相关的性能的影响,尤其是从数据输入矩阵向矩阵处理器单元加载元素的影响,被显著降低。例如,对于输入权重掩码的每次迭代,通过仅修改输入权重掩码同时保持加载的数据输入向量不变,在每个数据输入向量上执行多遍运行。在一些实施例中,使用图5的过程来执行图6A的过程。例如,在一些实施例中,可以在图5的509处执行步骤605、607和/或609。在一些实施例中,使用图1的矩阵处理器单元107和/或图2A的矩阵处理器单元201来执行图6A的过程。
在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执行矩阵乘法和加法运算确定的向量结果从矩阵处理器单元输出。在各种实施例中,向量结果作为输出向量结果输出,例如输出到输出向量单元,例如图1的输出向量单元151。输出向量单元可用于将输出向量结果写入存储器。在一些实施例中,结果被输出并用作后续矩阵运算的参数。
图6B是示出准备权重输入操作数以使用矩阵处理器单元和向量单元运算来执行二维卷积运算的过程的实施例的流程图。例如,使用组合权重向量,创建两个或更多权重输入掩码,并将其广播到矩阵处理器单元的适当向量单元。每个向量单元接收与其分配的卷积运算相关联的适当权重输入掩码,用于计算二维卷积运算的至少部分结果。组合权重向量允许使用最少的存储器读取次数从存储器中读取多个权重矩阵。一旦从存储器中读取了组合权重向量,就提取与二维权重矩阵相关联的权重元素,并将其格式化为权重输入掩码,该权重输入掩码被广播到适当的向量单元。在一些实施例中,图6B的过程在图3的307、图4的403、图5的505和/或507、和/或图6A的603处执行。在一些实施例中,图6B的过程由例如图1的权重输入向量单元105和/或图2A的权重输入向量单元205的输入向量单元执行。
在651,检索组合权重向量。例如,使用单次读取,从诸如图1的存储器161的存储器中读取组合权重向量。通过将多个权重矩阵组合成组合权重向量,单次读取就足以检索多个权重矩阵。例如,一个3×3的权重矩阵可以用9个权重元素来表示。每个权重矩阵是用于卷积运算的二维输入权重操作数。使用32元素读取,通过线性化每个权重矩阵并将权重元素一起串联成单个27元素向量,可以在单个组合权重向量中读取多达三个权重矩阵。其余五个元素可以是填充元素或用于描述组合权重向量的附加元数据。在一些实施例中,只有两个权重矩阵被组合成单个组合权重向量。例如,使用3×3权重矩阵,来自每个矩阵的9个权重元素被存储在组合权重向量中。在各种实施例中,可以在多次读取中读取两个或更多个组合权重向量,以适应更大大小或更多数量的权重矩阵。
在653,提取每个二维权重输入操作数的权重元素。使用在651检索的组合权重向量,提取对应于二维权重矩阵的权重元素,为创建一个或更多个权重输入掩码做准备。每组提取的权重元素对应于矩阵运算(例如卷积运算)的二维权重输入操作数。在各种实施例中,为存储在组合权重向量中的每个权重矩阵提取元素。例如,从相同的组合权重向量中提取两个或更多个权重矩阵,以准备对应于不同权重输入操作数的不同权重输入掩码。在一些实施例中,提取元素并使用诸如寄存器的临时存储器位置来存储元素。
在655,使用提取的权重元素准备权重输入掩码。例如,使用提取的元素为每个权重矩阵准备单独的权重输入掩码。在一些实施例中,每个权重输入掩码被准备并存储在诸如寄存器的存储器位置中。所使用的寄存器可以是例如图2A的权重输入向量寄存器207或209的寄存器。在各种实施例中,权重输入掩码是展开的权重矩阵,具有用于在输入向量内均匀地隔开权重矩阵的行的适当数量的零填充元素。如上所述,零填充元素允许输入向量充当权重输入掩码。移位权重元素重新对齐权重输入掩码,以将权重元素与数据矩阵中不同的相应列相关联。在某些情况下,权重掩码会被填充,以考虑不完整的相应数据列。例如,使用32元素向量和3×3权重矩阵,在步骤653,提取权重矩阵的九个元素。在步骤655,使用附加的23个填充元素将提取的元素格式化为权重输入掩码。在一些实施例中,30个元素用于所选3x3权重矩阵的三行。每行包括一行中的三个元素,后面跟着七个填充元素。其余两个元素用附加填充元素填充。在各种实施例中,零值元素被用作填充元素。值为零的填充元素允许向量单元执行乘法和加法向量运算,而不会影响结果向量和。
在657,权重输入掩码被广播到分配的向量单元。例如,向量单元组的每个向量单元接收其相关的权重输入掩码。对应于不同向量单元组的不同向量单元接收与分配给该组的卷积运算相关联的权重输入掩码。在一些实施例中,向量单元组是图2A的向量单元组211和221和/或图2B的向量单元组253和255。权重输入掩码可以存储在相应的权重输入向量寄存器中,例如图2A的权重输入向量寄存器207和209。
图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行(未示出)。数据矩阵703的高度也可以小于向量单元的数量。例如,矩阵处理器单元可以具有32个向量单元,但是数据矩阵(未示出)可以只有18行。在图7B中,数据矩阵703显示为具有34行,以使其与3×3权重矩阵701和具有32个向量单元的矩阵处理器单元兼容,其中每个向量单元用于求解矩阵运算。在数据矩阵的行数少于向量单元的情况下(例如,32个向量单元的矩阵处理器单元为18行),可以并行处理对应于不同矩阵对的多个矩阵运算。在一些实施例中,权重矩阵701和数据矩阵703是用于使用本文描述的技术执行卷积运算的输入矩阵。在一些实施例中,使用图1的矩阵处理器单元107和/或图2A的矩阵处理器单元201和/或图3-图6B的过程,来对权重矩阵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的子矩阵或具有18行的数据矩阵展开的数据输入向量。例如,数据输入向量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对应于来自第16-18行的元素。与数据矩阵的不同3×10切片相关联的数据元素被加载到每个数据输入向量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个向量单元的矩阵处理器单元,仅加载16个数据输入向量,并且可以从不同的行开始准备每个数据输入向量。在所示的示例中,数据输入向量803/804、805/806、807/808、809/810、811/812和813/814被加载到前六个向量单元中,并且数据输入向量815/816被加载到第16个向量单元中。尽管未示出,向量单元7-15加载有相应的数据输入向量。向量单元1-16可以对应于向量单元组。向量单元17-32可以对应于不同的向量单元组,并且可以被配置为接收对应于不同数据矩阵的数据输入向量。在一些实施例中,数据输入向量803/804、805/806、807/808、809/810、811/812、813/814和815/816由数据输入向量单元(例如图1的数据输入向量单元103)生成并加载到矩阵处理器单元(例如图1的矩阵处理器单元107)中。在一些实施例中,在图3的305、图4的401和/或403、图5的501和/或503和/或图6A的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的每个权重输入向量在对相应数据输入向量的不同遍运行处被广播到矩阵处理器单元的适当向量单元中。对于具有多个向量单元的矩阵处理器单元,向量单元组的每个向量单元在每遍运行时被加载相同的权重输入向量。例如,对于第一遍运行,权重输入向量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的矩阵处理器单元107)中。在一些实施例中,在图3的307、图4的401和/或403、图5的505和/或507和/或图6A的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个。在一些实施例中,使用例如图2B的向量乘法单元271、275、291或295的向量乘法单元来执行乘法。在一些实施例中,相乘结果作为向量被馈送到向量加法器单元,以计算相乘结果的和。向量求和可以使用例如图2B的向量加法器单元273、277、293或297的向量加法器单元来执行。在所示的示例中,执行的向量运算的结果是单个结果和。在一些实施例中,结果和是部分或中间结果和,并且可以存储在累加器中。在一些实施例中,结果和是使用权重输入向量1003/1004和数据输入向量1005/1006计算的点积。结果和可以作为向量结果的一个元素被输出,并被写入输出向量单元,例如图1的输出向量单元151。在一些实施例中,使用图1的矩阵处理器单元107和/或图3-图6B的过程来执行单元1011中所示的向量计算结果的等效。在一些实施例中,在图3的309、图4的403、图5的509和/或图6B的605处执行向量计算。
图11A和图11B是示出用于并行执行多个逐深度卷积运算的组合权重向量的示例的图示。图11A和图11B包括指示权重元素在32元素组合权重向量中的位置的索引标签1101和1102。图11A和图11B包括组合权重向量1103/1104。图11A中示出了组合权重向量1103/1104的前半部分,以及图11B中示出了组合权重向量1103/1104的相应后半部分。由于向量的大小较大,为了便于说明,组合权重向量1103/1104被示为向量对,并在图11A和图11B中被分开。组合权重向量1103/1104存储两个权重矩阵,每个权重矩阵对应于不同的卷积运算。第一权重矩阵包括来自元素组1105的九个权重元素。第二权重矩阵在图11A和图11B中被分开,并且包括来自元素组1107和1109的九个权重元素。所表示的权重矩阵都是二维3×3权重矩阵。在一些实施例中,权重矩阵是二维权重矩阵,例如图7A的权重矩阵701。
在所示的示例中,由来自元素组1105的九个权重元素和来自元素组1107和1109的九个权重元素表示的两个权重矩阵是两个不同的权重矩阵,并且每个对应于不同的卷积运算。与每个权重元素相关联的下标使用行和列表示法。对于第一行,W1,1是位于第1列的权重元素,W1,2是位于第2列的权重元素,而W1,3是位于第3列的权重元素。在所示的示例中,来自元素组1105的权重元素表示具有三行三列的线性化的二维矩阵。类似地,来自元素组1107和1109的权重元素表示具有三行三列的不同的线性化二维矩阵。对于每个权重矩阵,可以提取线性化二维矩阵的对应元素,并将其用于创建权重输入掩码。在一些实施例中,组合权重向量1103/1104的位置18-31未被使用。在一些实施例中,额外的位置填充有填充元素或用于描述组合权重向量的附加元数据。在各种实施例中,存储在组合权重向量1103/1104中的每个权重矩阵的具体位置和偏移可以适当变化。在一些实施例中,附加的三个或更多权重矩阵可以存储在组合权重向量中。例如,一个32元素的组合权重向量可以使用27个权重元素存储三个3x3矩阵。
尽管为了清楚理解的目的已经详细描述了前述实施例,但是本发明不限于所提供的细节。有许多实现本发明的替代方式。所公开的实施例是说明性的,而不是限制性的。