CN108133263A - 神经网络单元 - Google Patents
神经网络单元 Download PDFInfo
- Publication number
- CN108133263A CN108133263A CN201711025871.9A CN201711025871A CN108133263A CN 108133263 A CN108133263 A CN 108133263A CN 201711025871 A CN201711025871 A CN 201711025871A CN 108133263 A CN108133263 A CN 108133263A
- Authority
- CN
- China
- Prior art keywords
- input
- data
- word
- npu
- register
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
- G06N3/084—Backpropagation, e.g. using gradient descent
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
- G06N3/045—Combinations of networks
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/06—Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/06—Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons
- G06N3/063—Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons using electronic means
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Health & Medical Sciences (AREA)
- Life Sciences & Earth Sciences (AREA)
- Biomedical Technology (AREA)
- Biophysics (AREA)
- General Health & Medical Sciences (AREA)
- General Physics & Mathematics (AREA)
- Evolutionary Computation (AREA)
- Computational Linguistics (AREA)
- Molecular Biology (AREA)
- Computing Systems (AREA)
- General Engineering & Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Mathematical Physics (AREA)
- Software Systems (AREA)
- Artificial Intelligence (AREA)
- Neurology (AREA)
- Advance Control (AREA)
- Executing Machine-Instructions (AREA)
Abstract
N个处理单元(PU),每一个具有算术单元(AU),所述算术单元在第一输入、第二输入和第三输入上执行运算以生成存储在累加器中的结果,累加器具有提供给第一输入的输出。权重输入由AU的第二输入接收。多路复用寄存器具有第一数据输入、第二数据输入、第三数据输入和第四数据输入和由第三AU输入接收的输出。第一存储器将N个权重字提供给N个权重输入。第二存储器将N个数据字提供给多路复用寄存器的第一数据输入。多路复用寄存器的输出还分别由离开一个、2^J个和2^K个PU的多路复用寄存器的第二数据输入、第三数据输入和第四数据输入接收。N个多路复用寄存器共同地作为N字旋转器操作,当控制输入分别指定第二数据输入、第三数据输入或第四数据输入时,所述N字旋转器旋转一个字、2^J个字或2^K个字。
Description
相关申请的交叉引用
本申请涉及以下美国非临时申请,通过引用将其每一个的全部内容结合在此。
上述非临时申请中的每一个要求基于以下美国临时申请的优先权,通过引用将其每一个的全部内容结合在此。
本申请还涉及以下同时提交的美国非临时申请,通过引用将其每一个的全部内容结合在此。
技术领域
本申请涉及一种神经网络单元,更具体地,涉及一种具有神经存储器和共同执行从神经存储器接收的数据的行的多字距离旋转的神经处理单元的阵列的神经网络单元。
背景技术
最近,已经重新出现对人工神经网络(ANN)的兴趣,这种研究通常被称为深度学习、计算机学习和类似术语。通用处理器计算能力的提高引起了几十年前衰退的兴趣的复苏。ANN的最近应用包括语音和图像识别以及其他的。对于与ANN相关联的计算的改进的性能和效率的需求呈现出增长。
发明内容
根据本发明的一个方面,提供了一种装置,包括:N个处理单元(PU)的阵列、第一存储器和第二存储器。每一个PU具有:累加器,所述累加器具有输出;算术单元,所述算术单元具有第一输入、第二输入和第三输入并且在其上执行运算以生成存储在所述累加器中的结果,所述第一输入接收所述累加器的输出;权重输入,所述权重输入由所述第二输入接收到所述算术单元;及多路复用寄存器,所述多路复用寄存器具有第一数据输入、第二数据输入、第三数据输入和第四数据输入、由第三输入接收到所述算术单元的输出、及控制所述第一数据输入、第二数据输入、第三数据输入和第四数据输入的选择的控制输入。第一存储器保存N个权重字的行,并将一行的N个权重字提供给所述PU阵列的N个PU的对应权重输入。第二存储器保存N个数据字的行,并将一行的N个数据字提供给所述PU阵列的N个PU的多路复用寄存器的对应第一数据输入。多路复用寄存器的输出还由以下接收:离开一个PU的PU的多路复用寄存器的第二数据输入;离开2^J个PU的PU的多路复用寄存器的第三数据输入,其中J为大于1的整数;及离开2^K个PU的PU的多路复用寄存器的第四数据输入,其中K是大于J的整数。当所述控制输入指定所述第二数据输入时,所述N个PU的所述多路复用寄存器共同地作为旋转一个字的N字旋转器操作。当所述控制输入指定所述第三数据输入时,所述N个PU的所述多路复用寄存器共同地作为旋转2^J个字的N字旋转器操作。当所述控制输入指定所述第四数据输入时,所述N个PU的所述多路复用寄存器共同地作为旋转2^K个字的N字旋转器操作。
根据本发明的另一个方面,提供了一种用于操作装置的方法,所述装置包括N个处理单元(PU)的阵列,每一个处理单元(PU)具有:累加器,所述累加器具有输出;算术单元,所述算术单元具有第一输入、第二输入和第三输入并且在其上执行运算以生成存储在所述累加器中的结果,其中所述第一输入接收所述累加器的输出;所述PU的阵列还具有权重输入,所述权重输入由所述第二输入接收到所述算术单元;及多路复用寄存器,所述多路复用寄存器具有第一数据输入、第二数据输入、第三数据输入和第四数据输入、由第三输入接收到所述算术单元的输出、及控制所述第一数据输入、第二数据输入、第三数据输入和第四数据输入的选择的控制输入。所述装置还包括:第一存储器,所述第一存储器保存N个权重字的行,并将一行的N个权重字提供给所述PU阵列的N个PU的对应权重输入;及第二存储器,所述第二存储器保存N个数据字的行,并将一行的N个数据字提供给所述PU阵列的N个PU的多路复用寄存器的对应第一数据输入。所述多路复用寄存器的输出还由以下接收:离开一个PU的PU的多路复用寄存器的第二数据输入,离开2^J个PU的PU的多路复用寄存器的第三数据输入,其中J为大于1的整数,及离开2^K个PU的PU的多路复用寄存器的第四数据输入,其中K是大于J的整数。所述方法包括:当所述控制输入指定所述第二数据输入时,所述N个PU的所述多路复用寄存器共同地作为旋转一个字的N字旋转器操作;当所述控制输入指定所述第三数据输入时,所述N个PU的所述多路复用寄存器共同地作为旋转2^J个字的N字旋转器操作;及当所述控制输入指定所述第四数据输入时,所述N个PU的所述多路复用寄存器共同地作为旋转2^K个字的N字旋转器操作。
根据本发明的再一方面,提供了一种计算机程序产品,其编码在至少一个非暂时性计算机可用介质中并与计算设备一起使用,所述计算机程序产品包括体现在所述介质中的用于指定装置的计算机可用程序代码。所述计算机可用程序代码包括:第一程序代码、第二程序代码和第三程序代码。第一程序代码用于指定N个处理单元(PU)的阵列,每一个PU具有:累加器,所述累加器具有输出;算术单元,所述算术单元具有第一输入、第二输入和第三输入并且在其上执行运算以生成存储在所述累加器中的结果,所述第一输入接收所述累加器的输出;权重输入,所述权重输入由所述第二输入接收到所述算术单元;及多路复用寄存器,所述多路复用寄存器具有第一数据输入、第二数据输入、第三数据输入和第四数据输入、由第三输入接收到所述算术单元的输出、及控制所述第一数据输入、第二数据输入、第三数据输入和第四数据输入的选择的控制输入。第二程序代码用于指定第一存储器,所述第一存储器保存N个权重字的行,并将一行的N个权重字提供给所述PU阵列的N个PU的对应权重输入。第三程序代码用于指定第二存储器,所述第二存储器保存N个数据字的行,并将一行的N个数据字提供给所述PU阵列的N个PU的多路复用寄存器的对应第一数据输入。所述多路复用寄存器的输出还由以下接收:离开一个PU的PU的多路复用寄存器的第二数据输入;离开2^J个PU的PU的多路复用寄存器的第三数据输入,其中J为大于1的整数;及离开2^K个PU的PU的多路复用寄存器的第四数据输入,其中K是大于J的整数。当所述控制输入指定所述第二数据输入时,所述N个PU的所述多路复用寄存器共同地作为旋转一个字的N字旋转器操作。当所述控制输入指定所述第三数据输入时,所述N个PU的所述多路复用寄存器共同地作为旋转2^J个字的N字旋转器操作。当所述控制输入指定所述第四数据输入时,所述N个PU的所述多路复用寄存器共同地作为旋转2^K个字的N字旋转器操作。
附图说明
图1是示出包括神经网络单元(NNU)的处理器的框图。
图2是示出图1的NPU的框图。
图3是示出图1的NNU的N个NPU的N个多路复用寄存器的布置的实施例的框图,以说明它们作为N字旋转器或循环移位器用于从图1的数据RAM接收的一行数据字的操作。
图4是示出用于储存在图1的NNU的程序存储器中并由其执行的程序的表。
图5是示出NNU执行图4的程序的时序图。
图6A是示出用于执行图4的程序的图1的NNU的框图。
图6B是示出图1的处理器执行架构程序的操作(例如由图4的程序执行的操作)的流程图,该架构程序使用NNU来执行典型地与人工神经网络的隐藏层的神经元相关联的乘法累加激活函数计算。
图7是示出根据可替换实施例的图1的NPU的框图。
图8是示出根据可替换实施例的图1的NPU的框图。
图9是示出用于储存在图1的NNU的程序存储器中并由其执行的程序的表。
图10是示出NNU执行图9的程序的时序图。
图11是示出了显示图1的NNU的实施例的框图。在图11的实施例中,神经元被分成两部分,即激活函数单元部分和ALU部分(其还包括移位寄存器部分),每个激活函数单元部分由多个ALU部分共享。
图12是示出图11的NNU执行图4的程序的时序图。
图13是示出图11的NNU执行图4的程序的时序图。
图14是示出移动到神经网络(MTNN)架构指令及其相对于图1的NNU的各部分的操作的框图。
图15是示出从神经网络移动(MFNN)架构指令的及其相对于图1的NNU的各部分的操作的框图。
图16是示出图1的数据RAM的实施例的框图。
图17是示出图1的权重RAM和缓冲器的实施例的框图。
图18是示出图1的动态可配置NPU的框图。
图19是示出根据图18的实施例的图1的NNU的N个NPU的2N个多路复用寄存器的布置的实施例的框图,以说明它们作为旋转器用于从图1的数据RAM接收的一行数据字的操作。
图20是示出用于储存在具有根据图18的实施例的NPU的图1的NNU的程序存储器中并由其执行的程序的表。
图21是示出由包括以窄配置操作的图18的NPU的NNU执行图20的程序的时序图。
图22是示出包括用以执行图20的程序的图18的NPU的图1的NNU框图。
图23是示出根据可替换实施例的图1的动态可配置NPU的框图。
图24是示出由图1的NNU执行卷积运算所使用的数据结构的示例的框图。
图25是示出图1的处理器执行使用NNU来执行卷积核与图24的数据阵列的卷积的架构程序的操作的流程图。
图26A是执行数据矩阵与图24的卷积核的卷积并将其回写到权重RAM的NNU程序的程序列表。
图26B是示出根据一个实施例的图1的NNU的控制寄存器的某些字段的框图。
图27是示出用输入数据填充的图1的权重RAM的示例的框图,由图1的NNU在该输入数据上执行池化操作。
图28是执行图27的输入数据矩阵的池化操作并将其回写到权重RAM的NNU程序的程序列表。
图29A是示出图1的控制寄存器的实施例的框图。
图29B是示出根据可替换实施例的图1的控制寄存器的实施例的框图。
图29C是示出根据一个实施例的作为两个部分存储的图29A的倒数的实施例的框图。
图30是更详细地图示图2的AFU的实施例的框图。
图31是图30的AFU的操作的示例。
图32是图30的AFU的操作的第二示例。
图33是图30的AFU的操作的第三示例。
图34是示出图1的处理器和图1的NNU的更详细部分的框图。
图35是示出包括可变速率NNU的处理器的框图。
图36A是示出具有在正常模式下(即,以主时钟速率)操作的NNU的处理器的操作的示例的时序图。
图36B是示出具有在松弛模式下(即,以小于主时钟速率的速率)操作的NNU的处理器的操作的示例的时序图。
图37是示出图35的处理器的操作的流程图。
图38是更详细地示出NNU的序列的框图。
图39是示出NNU的控制和状态寄存器的某些字段的框图。
图40是示出Elman RNN的示例的框图。
图41是示出当NNU执行与图40的Elman RNN相关联的计算时,NNU的数据RAM和权重RAM内的数据布局的示例的框图。
图42是示出用于储存在NNU的程序存储器中并由NNU执行以实现Elman RNN并使用根据图41的布置的数据和权重的程序的表。
图43是示出Jordan RNN的示例的框图。
图44是示出当NNU执行与图43的Jordan RNN相关联的计算时,NNU的数据RAM和权重RAM内的数据布局的示例的框图。
图45是示出用于储存在NNU的程序存储器中并由NNU执行以实现Jordan RNN并且使用根据图44的布置的数据和权重的程序的表。
图46是示出LSTM单元的实施例的框图。
图47是示出当NNU执行与图46的LSTM单元层相关联的计算时NNU的数据RAM和权重RAM内的数据布局的示例的框图。
图48是示出用于储存在NNU的程序存储器中并由NNU执行以实现与LSTM单元层相关联的计算并且使用根据图47的布置的数据和权重的程序的表。
图49是示出在NPU组内具有输出缓冲器屏蔽和反馈能力的NNU实施例的框图。
图50是示出当图49的NNU执行与图46的LSTM单元层相关联的计算时NNU的数据RAM、权重RAM和输出缓冲器内的数据布局的示例的框图。
图51是示出用于储存在图49的NNU的程序存储器中并由其执行以实现与LSTM单元层相关联的计算并且使用根据图50的布置的数据和权重的程序的表。
图52是示出在NPU组内具有输出缓冲器屏蔽和反馈能力并且采用共享AFU的NNU实施例的框图。
图53是示出根据可替换实施例的当图49的NNU执行与图46的LSTM单元层相关联的计算时NNU的数据RAM、权重RAM和输出缓冲器内的数据布局的示例的框图。
图54是示出用于储存在图49的NNU的程序存储器中并由其执行以实现与LSTM单元层相关联的计算并且使用根据图53的布置的数据和权重的程序的表。
图55是示出根据可替换实施例的NPU的部分的框图。
图56是示出当NNU执行与图43的Jordan RNN相关联的计算,但是采用图55的实施例提供的益处时NNU的数据RAM和权重RAM内的数据布局的示例的框图。
图57是示出用于储存在NNU的程序存储器中并由NNU执行以实现Jordan RNN并且使用根据图56的布置的数据和权重的程序的表。
图58是示出例如通常由卷积神经网络执行的3维(3D)卷积计算任务的框图。
图59是示出将数据RAM行分为输入块,将权重RAM行分为滤波器块,将NPU阵列分为NPU块以及将数据RAM行分为输出块的框图。
图60是示出由在NNU上执行以执行3D卷积任务(诸如图58所示)的非架构程序执行的计算的伪代码。
图61A和61B统称为图61,是示出根据一个实施例的在数据RAM内的输入块组的布局和权重RAM内的滤波器块组的布局的框图,用于将12×12×20输入与50个5×5滤波器进行卷积以生成50个8x8输出。
图62是示出图61的输入块组I[c];滤波器f和通道c的5×5垂直片段;图61的滤波器块组F[f,c];和图59的输出块的框图
图63是示出由在具有N=1024个NPU的NNU上执行的非架构程序执行的计算的伪代码,用以结合图61的数据RAM和权重RAM布局将12×12×20输入与50个5×5×20滤波器进行卷积以产生50个8×8输出。
图64A和64B统称为图64,是示出根据可替换实施例的不包括间隙输入/滤波器块组的数据RAM内的输入块组的布局和权重RAM内的滤波器块组的布局的框图,用于将12×12×20输入与50个5×5滤波器进行卷积以生成50个8×8输出。
图65是示出由在具有N=2048个NPU的NNU上执行的非架构程序执行的计算的伪代码,用以结合图64的数据RAM和权重RAM布局将12×12×20输入与50个5×5×20滤波器进行卷积以产生50个8×8输出。
图66A和66B统称为图66,是示出根据可替换实施例的权重RAM内的滤波器块组的布局的框图,用于将12×12×20输入与50个5×5滤波器进行卷积以生成50个8×8输出。
图67是示出由在具有N=1024个NPU的NNU上执行的非架构程序执行的计算的伪代码,用以结合图61的数据RAM布局和图66的权重RAM布局将12×12×20输入与50个5×5×20滤波器进行卷积以产生50个8×8输出。
图68A和68B统称为图68,是示出根据可替换实施例的不包括间隙输入/滤波器块组的权重RAM内的滤波器块组的布局的框图,用于将12×12×20输入与50个5×5滤波器进行卷积以生成50个8×8输出。
图69是示出由在具有N=2048个NPU的NNU上执行的非架构程序执行的计算的伪代码,用以结合图64的数据RAM布局和图68的权重RAM布局将12×12×20输入与50个5×5×20滤波器进行卷积以产生50个8×8输出。
图70是示出根据支持多字距离旋转操作的可替换实施例的NPU的一部分的框图。
图71是示出包括具有诸如图70的多路复用寄存器的NPU的NNU的多字距离旋转特征的四个指令。
具体实施方式
具有架构神经网络单元的处理器
现在参考图1,示出了例示包括神经网络单元(NNU)121的处理器100的框图。处理器100包括指令提取单元101、指令高速缓存102、指令转换器104、重命名单元106、保留站108、媒体寄存器118、通用寄存器(GPR)116、除NNU 121之外的执行单元112和存储器子系统114。
处理器100是用作集成电路上的中央处理单元(CPU)的电子设备。处理器100接收数字数据作为输入,根据从存储器获取的指令处理数据,并且生成由指令规定的操作的结果作为输出。处理器100可以用于台式、移动或平板计算机中,并且用于诸如计算、文本编辑、多媒体显示和互联网浏览之类的用途。处理器100还可以设置在嵌入式系统中以控制各种各样的设备,包括家用电器、移动电话、智能电话、汽车和工业控制设备。CPU是通过对数据执行包括算术运算、逻辑电路运算和输入/输出运算的运算来执行计算机程序(也称为“计算机应用”或“应用”)的指令的电子电路(即“硬件”)。集成电路(IC)是在小片半导体材料(通常是硅)上制造的一组电子电路。IC也称为芯片、微芯片或管芯。
指令提取单元101控制从系统存储器(未示出)将架构指令103提取到指令高速缓存102中。指令提取单元101向指令高速缓存102提供提取地址,其指定处理器100将架构指令字节的高速缓存行提取到指令高速缓存102中的存储器地址。提取地址基于处理器100的指令指针(未示出)或程序计数器的当前值。通常,程序计数器按指令的大小顺序递增,除非在指令流中遇到控制指令,例如分支、调用或返回指令,或发生异常状况,例如中断、陷阱、异常或故障,在此情况下,程序计数器用非顺序地址(例如分支目标地址、返回地址或异常向量)更新。一般来说,响应于执行单元112/121对指令的执行,更新程序计数器。还可以响应于检测到异常状况来更新程序计数器,所述异常状况诸如指令转换器104遇到未由处理器100的指令集架构定义的指令103。
指令高速缓存102高速缓存从耦合到处理器100的系统存储器提取的架构指令103。架构指令103包括移动到神经网络(MTNN)指令和从神经网络移动(MFNN)指令,这将在下面更详细地描述。在一个实施例中,架构指令103是x86指令集架构(ISA)的指令,添加了MTNN和MFNN指令。在本公开内容的语境中,x86ISA处理器是在指令集架构级生成与处理器执行相同机器语言指令时所生成的相同结果的处理器。然而,其他实施例考虑其他指令集架构,诸如高级RISC机器Sun或指令高速缓存102将架构指令103提供给指令转换器104,指令转换器104将架构指令103转换成微指令105。
微指令105被提供给重命名单元106,并且最终由执行单元112/121执行。微指令105实施架构指令。优选地,指令转换器104包括将频繁执行的和/或相对不太复杂的架构指令103转换为微指令105的第一部分。指令转换器104还包括包括微代码单元(未示出)的第二部分。微代码单元包括保存实施架构指令集的复杂和/或不频繁使用的指令的微代码指令的微代码存储器。微代码单元还包括向微代码存储器提供非架构微程序计数器(微PC)的微定序器。优选地,微代码指令由微转换器(未示出)转换成微指令105。选择器根据微代码单元当前是否具有控制而从第一部分或第二部分中选择微指令105,用于提供给重命名单元106。
重命名单元106将架构指令103中指定的架构寄存器重命名为处理器100的物理寄存器。优选地,处理器100包括重排序缓冲器(未示出)。重命名单元106以程序顺序为每个微指令105在重排序缓冲器中分配条目。这使得处理器100能够以程序顺序退回微指令105及其相应的结构指令103。在一个实施例中,媒体寄存器118是256位宽,GPR 116是64位宽。在一个实施例中,媒体寄存器118是x86媒体寄存器,例如高级向量扩展(AVX)寄存器。
在一个实施例中,重排序缓冲器中的每个条目包括用于微指令105的结果的存储;另外,处理器100包括架构寄存器文件,其包括用于每个架构寄存器(例如,媒体寄存器118和GPR 116以及其他架构寄存器)的物理寄存器。(例如,优选地,存在用于媒体寄存器118和GPR 116的单独的寄存器文件,因为它们大小不同。)对于指定架构寄存器的微指令105的每个源操作数,重命名单元以写入架构寄存器的最新的旧微指令105的重排序缓冲器索引填充微指令105中的源操作数字段。当执行单元112/121完成微指令105的执行时,它将结果写入微指令105的重排序缓冲器条目。当微指令105退回时,退回单元(未示出)将来自微指令的重排序缓冲器条目的结果写入与由退回微指令105指定的架构目的地寄存器相关联的物理寄存器文件的寄存器。
在另一实施例中,处理器100包括物理寄存器文件,物理寄存器文件包括比架构寄存器的数量更多的物理寄存器,但是不包括架构寄存器文件,并且重排序缓冲器条目不包括结果储存。(例如,优选地,存在用于媒体寄存器118和GPR 116的单独的物理寄存器文件,因为它们大小不同。)处理器100还包括具有用于每个架构寄存器的相关指针的指针表。对于指定架构寄存器的微指令105的操作数,重命名单元用指向物理寄存器文件中的空闲寄存器的指针填充微指令105中的目的地操作数字段。如果物理寄存器文件中没有寄存器空闲,则重命名单元106停止流水线。对于指定架构寄存器的微指令105的每个源操作数,重命名单元用指向分配给写入架构寄存器的最新的旧微指令105的物理寄存器文件中的寄存器的指针填充微指令105中的源操作数字段。当执行单元112/121完成微指令105的执行时,它将结果写入微指令105的目的地操作数字段指向的物理寄存器文件的寄存器。当微指令105退回时,退回单元将微指令105的目的地操作数字段值复制到与由退回微指令105指定的架构目的地寄存器相关联的指针表中的指针。
保留站108保存微指令105,直到它们准备好被发出到执行单元112/121用于执行。当所有其源操作数可用并且执行单元112/121可用于执行微指令105时,微指令105准备好被发出。执行单元112/121从上述第一实施例中的重排序缓冲器或架构寄存器文件或从上述第二实施例中的物理寄存器文件接收寄存器源操作数。另外,执行单元112/121可以经由结果转发总线(未示出)直接从执行单元112/121接收寄存器源操作数。另外,执行单元112/121可以从保留站108接收由微指令105指定的立即操作数。如下文更详细论述的,MTNN和MFNN架构指令103包括立即操作数,其指定要由NNU 121执行的在MTNN和MFNN架构指令103被转换成的一个或多个微指令105之一中提供的函数。
执行单元112包括从存储器子系统114加载数据并将数据存储到存储器子系统114的一个或多个加载/存储单元(未示出)。优选地,存储器子系统114包括存储器管理单元(未示出),其可以包括例如转换后备缓冲器和表行(tablewalk)单元、一级数据高速缓存(和指令高速缓存102)、二级统一高速缓存和总线接口单元,总线接口单元将处理器100接口连接到系统存储器。在一个实施例中,图1的处理器100表示处理内核,其是共享最后级高速缓存存储器的多核处理器中的多个处理内核中的一个。执行单元112还可以包括整数单元、媒体单元、浮点单元和分支单元。
NNU 121包括权重随机存取存储器(RAM)124、数据RAM 122、N个神经处理单元(NPU)126、程序存储器129、定序器128以及控制和状态寄存器127。NPU 126概念上用作神经网络中的神经元。权重RAM 124、数据RAM 122和程序存储器129分别是借助MTNN和MFNN架构指令103可写并且可读的。权重RAM 124被布置为W行N个权重字,数据RAM 122被布置为D行N个数据字。每个数据字和每个权重字是多个位,优选为8位、9位、12位或16位。每个数据字用作网络中的前一层的神经元的输出值(有时也称为激活),每个权重字用作与进入到网络的当前层的神经元中的连接相关联的权重。虽然在NNU 121的许多使用中,保存在权重RAM124中的字或操作数实际上是与进入神经元中的连接相关联的权重,但是应当理解,在NNU121的其他使用中,保存在权重RAM 124中的字不是权重,但也被称为“权重字”,因为它们被存储在权重RAM 124中。例如,在NNU 121的一些使用中,例如图24至26A的卷积示例或图27至28的池化示例中,权重RAM 124可以保存非权重,诸如数据矩阵的元素,例如图像像素数据。类似地,尽管在NNU 121的许多使用中,保存在数据RAM 122中的字或操作数实际上是神经元的输出值或激活,但应当理解,在NNU 121的其它使用中,保存在数据RAM 122中的数据不是这样的,但也被称为“数据字”,因为它们被存储在数据RAM 122中。例如,在NNU 121的一些使用中,例如图24至26A的卷积示例,数据RAM 122可以保存非神经元输出,诸如卷积核的元素。
在一个实施例中,NPU 126和定序器128包括组合逻辑、顺序逻辑、状态机或其组合。架构指令(例如,MFNN指令1500)将状态寄存器127的内容加载到GPR 116之一中以确定NNU 121的状态,例如,NNU 121已经完成了命令或完成了NNU 121运行的来自程序存储器129的程序,或者NNU 121可以自由地接收新命令或开始新的NNU程序。
有利地,NPU 126的数量可以根据需要增加,权重RAM 124和数据RAM 122的大小可以相应地在宽度和深度两者上扩展。优选地,权重RAM 124较大,因为在典型的神经网络层中存在与每个神经元相关联的许多连接,因而存在多个权重。本文说明了关于数据字和权重字的大小以及权重RAM 124和数据RAM122的大小以及NPU 126的数量的各种实施例。在一个实施例中,具有64KB(8192位×64行)数据RAM 122、2MB(8192位×2048行)权重RAM 124和512个NPU 126的NNU 121以台湾半导体制造有限公司(TSMC)16nm工艺来实施,并且占据大约3.3mm2的面积。
定序器128从程序存储器129提取指令并执行它们,其中包括生成用于提供给数据RAM 122、权重RAM 124和NPU 126的地址和控制信号。定序器128生成存储器地址123和读取命令,用于提供给数据RAM 122,以选择D行N个数据字中的一行以提供给N个NPU 126。定序器128还生成存储器地址125和读取命令,用于提供给权重RAM 124,以选择W行N个权重字中的一行以提供给N个NPU 126。由定序器128生成的提供给NPU 126的地址123和125的序列确定神经元之间的“连接”。定序器128还生成存储器地址123和写入命令,用于提供给数据RAM122,以选择D行N个数据字中的一行以从N个NPU126写入。定序器128还生成存储器地址125和写命令,用于提供给权重RAM 124以选择W行N个权重字中的一行以从N个NPU 126写入。定序器128还生成到程序存储器129的存储器地址131,以选择提供给定序器128的NNU指令,如下所述。存储器地址131对应于定序器128通常通过程序存储器129的顺序位置递增的程序计数器(未示出),除非定序器128遇到控制指令,例如循环指令(例如参见图26A),在这种情况下,定序器128将程序计数器更新为控制指令的目标地址。定序器128还生成到NPU 126的控制信号,以指示它们执行各种操作或功能,诸如初始化、算术/逻辑运算、旋转和移位操作、激活功能和回写操作,其示例在下面被更详细地描述(参见例如图34的微操作3418)。
N个NPU 126生成N个结果字133,其可被回写到权重RAM 124或数据RAM 122的行。优选地,权重RAM 124和数据RAM 122直接耦合到N个NPU126。更具体地,权重RAM 124和数据RAM 122专用于NPU 126,并且不被处理器100的其他执行单元112共享,NPU 126能够每个时钟周期以持续不变的方式(优选地以流水线方式)使用完来自权重RAM 124和数据RAM 122之一或二者的行。在一个实施例中,数据RAM 122和权重RAM 124中的每一个能够在每个时钟周期向NPU 126提供8192位。8192位可以作为512个16位字或1024个8位字来使用,如下面更详细地描述的。
有利地,可由NNU 121处理的数据集的大小不限于权重RAM 124和数据RAM 122的大小,而是仅由系统存储器的大小限制,因为数据和权重可以使用MTNN和MFNN指令(例如,通过媒体寄存器118)在系统存储器与权重RAM124和数据RAM 122之间移动。在一个实施例中,数据RAM 122是双端口的,以使得数据字能够被写入数据RAM 122,同时数据字被同时从数据RAM 122读取或写入数据RAM 122。此外,存储器子系统114的大存储器层级,包括高速缓存存储器,为系统存储器和NNU 121之间的传输提供了非常高的数据带宽。此外,优选地,存储器子系统114包括跟踪存储器访问模式(诸如神经数据和权重从系统存储器的加载)的硬件数据预取器,并且执行到高速缓存层级中的数据预取以便于到权重RAM 124和数据RAM122的高带宽和低等待时间传输。
尽管描述了其中提供给每个NPU 126的操作数之一从权重存储器提供并且被表示为通常在神经网络中使用的权重的实施例,但是应当理解,操作数可以是与其速度可以通过所描述的装置改进的计算相关联的其他类型的数据。
现在参考图2,示出了例示图1的NPU 126的框图。NPU 126操作以执行许多功能或操作。特别地,有利地,NPU 126被配置为作为人工神经网络中的神经元或节点操作,以执行典型的乘法-累积功能或操作。即,一般来说,NPU 126(神经元)被配置为:(1)从连接到它的每个神经元接收输入值,通常但不一定来自人工神经网络的前一层;(2)将每个输入值乘以与连接相关联的对应权重值,以生成乘积;(3)将所有乘积相加以生成总和;及(4)对总和执行激活函数以生成神经元的输出。然而,不是像常规方式那样执行与所有连接输入相关联的所有乘法然后将所有乘积相加在一起,而是有利地每个神经元被配置为在给定时钟周期中执行与连接输入之一相关联的权重乘法运算,然后将该乘积与直到该点的在前时钟周期中处理的连接输入相关联的乘积的累加值相加(累加)。假设存在到神经元的M个连接,在已经累加所有M个乘积(其花费大约M个时钟周期)之后,神经元对累加值执行激活函数以生成输出或结果。这与需要将与所有连接输入相关联的乘积的全部或甚至子集相加的加法器相比,具有在神经元中需要更少的乘法器和更小、更简单和更快的加法器电路(例如,2-输入加法器)的优点。这又具有有利于NNU 121中的非常大数量(N)的神经元(NPU 126)的优点,使得在大约M个时钟周期之后,NNU 121已经生成用于全部大数量(N)的神经元的输出。最后,由这样的神经元构成的NNU121具有有效地作为用于大量不同连接输入的人工神经网络层执行的优点。即,随着M对于不同层增加或减少,生成神经元输出所需的时钟周期的数量相应地增加或减少,充分利用资源(例如,乘法器和累加器);而在更常规的设计中,一些乘法器和一部分加法器可能不用于较小的M值。因此,本文所述的实施例具有到NNU 121的神经元的连接输入的数量灵活且高效的益处,并提供极高的性能。
NPU 126包括寄存器205、2-输入多路复用寄存器(mux-reg)208、算术逻辑单元(ALU)204、累加器202和激活函数单元(AFU)212。寄存器205从权重RAM 124接收权重字206,并在随后的时钟周期提供其输出203。多路复用寄存器208选择其输入端207或211中的一个以存储在其寄存器中,然后在随后的时钟周期上提供在其输出端209上。一个输入端207从数据RAM 122接收数据字。另一输入端211接收相邻NPU 126的输出209。图2所示的NPU 126被表示为来自图1的N个NPU 126中的NPU J。即,NPU J是N个NPU 126的代表性实例。优选地,NPU J的多路复用寄存器208输入端211接收NPU 126实例J-1的多路复用寄存器208输出端209,NPU J的多路复用寄存器208输出端209被提供给NPU 126实例J+1的多路复用寄存器208输入端211。以此方式,N个NPU 126的多路复用寄存器208共同地作为N字旋转器或循环移位器操作,如下文关于图3更详细地描述。控制输入213控制多路复用寄存器208选择两个输入中的哪一个存储在其寄存器中并且随后提供在输出端209上。
ALU 204具有三个输入端。一个输入端从寄存器205接收权重字203。另一个输入端接收多路复用寄存器208的输出端209。再另一个输入端接收累加器202的输出端217。ALU204对其输入执行算术和/或逻辑运算以生成在其输出端上提供的结果。优选地,由ALU 204执行的算术和/或逻辑运算由存储在程序存储器129中的指令指定。例如,图4的乘法-累加指令指定乘法-累加运算,即,结果215是累加器202的值217加上权重字203和多路复用寄存器208输出端209的数据字的乘积的总和。可以指定的其他运算包括但不限于:结果215是多路复用寄存器输出209的通过值;结果215是权重字203的通过值;结果215为零;结果215是权重字203的通过值;结果215是累加器202的值217和权重字203的和;结果215是累加器202的值217和多路复用寄存器输出209的和;结果215是累加器202的值217和权重字203的最大值;结果215是累加器202的值217和多路复用寄存器输出209的最大值。
ALU 204将其输出215提供给累加器202以在其中储存。ALU 204包括乘法器242,乘法器242将权重字203和多路复用寄存器208输出端209的数据字相乘以生成乘积246。在一个实施例中,乘法器242将两个16位操作数相乘以生成32位结果。ALU 204还包括加法器244,其将乘积246与累加器202输出217相加以生成总和,它是在累加器202中累加用以存储在累加器202中的结果215。在一个实施例中,加法器244将乘法器242的32位结果加上累加器202的41位值217以生成41位结果。以此方式,在多个时钟周期的过程中使用多路复用寄存器208的旋转器方案,NPU 126完成了神经网络所需的神经元的乘积的总和。ALU 204还可以包括其他电路元件以执行诸如上述的其它算术/逻辑运算。在一个实施例中,第二加法器从多路复用寄存器208输出端209的数据字中减去权重字203以生成差,加法器244然后将这个差加到累加器202的输出217以生成和215,和215是在累加器202中累加的结果。以此方式,在多个时钟周期的过程中,NPU 126可以完成差的总和。优选地,尽管权重字203和数据字209具有相同的大小(以位为单位),但是它们可以具有不同的二进制小数点位置,如下面更详细描述的。优选地,乘法器242和加法器244是整数乘法器和加法器,如下面更详细地描述的,以有利地实现比浮点对等方案更简单、更小、更快和更低功耗的ALU 204。然而,应当理解,在其他实施例中,ALU 204执行浮点运算。
虽然图2仅示出ALU 204中的乘法器242和加法器244,但是优选地,ALU204包括用于执行上述其他操作的其他元件。例如,优选地,ALU 204包括用于将累加器202与数据/权重字比较的比较器(未示出)和选择由比较器指示的用于储存在累加器202中的两个值中的较大(最大)值的多路复用器(未示出)。对于另一示例,优选地,ALU 204包括用数据/权重字旁通乘法器242的选择逻辑(未示出),以使加法器244能够将数据/权重字加到累加器202的值217,以生成用于存储在累加器202中的和。这些附加操作在下面例如关于图18至图29A更详细地描述,并且例如可以用于执行卷积和池化操作。
AFU 212接收累加器202的输出217。AFU 212对累加器202输出217执行激活函数,以生成图1的结果133。一般来说,人工神经网络的中间层的神经元中的激活函数可以用于优化地以非线性方式对积累的乘积总和进行归一化。为了“归一化”累加总和,当前神经元的激活函数产生在连接到当前神经元的神经元期望作为输入接收的值的范围内的结果值。(归一化结果有时被称为“激活”,如本文所述,是接收节点以与输出节点和接收节点之间的连接相关联的权重相乘的当前节点的输出,用以生成同与到接收节点的其它输入连接相关联的其它乘积累加的乘积)。例如,接收/连接的神经元可以预期接收0和1之间的值作为输入,在这种情况下,输出神经元可能需要将在0到1范围之外的累加总和非线性挤压和/或调整(例如,向上移动以将负值转换为正值)为在预期范围内的值。因此,AFU 212对累加器202的值217执行运算以使结果133处于已知范围内。所有N个NPU 126的结果133可以被同时回写到数据RAM 122或权重RAM 124。优选地,AFU 212被配置为执行多个激活函数,并且例如来自控制器寄存器127的输入选择激活函数之一以在累加器202的输出217上执行。激活函数可以包括但不限于阶梯函数、校正函数、S形函数、双曲正切(tanh)函数和softplus函数(也称为平滑校正)。softplus函数是分析函数f(x)=ln(1+ex),即一和ex的和的自然对数,其中,“e”是欧拉数,x是到函数的输入217。优选地,激活函数还可以包括使累加器202的值217或其一部分通过的通过函数,如下面更详细描述的。在一个实施例中,AFU 212的电路在单个时钟周期中执行激活函数。在一个实施例中,AFU 212包括表,该表接收累加值并输出接近真实激活函数对于一些激活函数(例如S形、双曲正切、softplus)将提供的值的值。
优选地,累加器202的宽度(以位为单位)大于AFU 212输出133的宽度。例如,在一个实施例中,累加器为41位宽,以避免高达512个32位乘积(如下面例如关于图30更详细地描述的)的累加中精度的损失,结果133是16位宽。在一个实施例中,下面关于图8更详细地描述其示例,在连续的时钟周期期间,“原始”累加器202输出217的值的不同部分通过AFU212并回写到数据RAM 122或权重RAM 124。这使得原始累加器202值能够借助MFNN指令加载回媒体寄存器118,使得在处理器100的其它执行单元112上执行的指令可执行AFU 212不能够执行的复杂激活函数,例如众所周知的softmax激活函数,也称为归一化指数函数。在一个实施例中,处理器100指令集架构包括执行通常被称为ex或exp(x)的指数函数的指令,其可以用于加速处理器100的其他执行单元112对softmax激活函数的执行。
在一个实施例中,NPU 126是流水线型的。例如,NPU 126可以包括ALU 204的寄存器,诸如在乘法器和加法器和/或ALU 204的其他电路之间的寄存器,以及保存AFU 212的输出的寄存器。以下说明NPU 126的其他实施例。
现在参考图3,示出了例示图1的NNU 121的N个NPU 126的N个多路复用寄存器208的布置的实施例的框图,用以说明它们作为N字旋转器或循环移位器对于从图1的数据RAM122接收的一行数据字207的操作。在图3的实施例中,N是512,从而NNU 121具有512个多路复用寄存器208,表示为0到511,对应于512个NPU 126,如图所示。每个多路复用寄存器208接收数据RAM122的D行中的一行的其对应的数据字207。即,多路复用寄存器0接收数据RAM122行的数据字0,多路复用寄存器1接收数据RAM 122行的数据字1,多路复用寄存器2接收数据RAM 122行的数据字2,依此类推,直至多路复用寄存器511接收数据RAM 122行的数据字511。另外,多路复用寄存器1在其另一输入端211上接收多路复用寄存器0的输出209,多路复用寄存器2在其另一输入端211上接收多路复用寄存器1的输出209,多路复用寄存器3在其另一输入端211上接收多路复用寄存器2的输出209,依此类推,直至多路复用寄存器511,它在其另一输入端211上接收多路复用寄存器510的输出209,多路复用寄存器0在其另一输入端211上接收多路复用寄存器511的输出209。多路复用寄存器208中的每一个都接收控制输入213,其控制是选择数据字207还是旋转输入211。如下面更详细描述的,在一种操作模式中,在第一时钟周期,控制输入213控制多路复用寄存器208中的每一个以选择数据字207用于存储在寄存器中并且随后提供给ALU 204;在随后的时钟周期(例如,如上所述的M-1个时钟周期)期间,控制输入213控制多路复用寄存器208中的每一个选择旋转的输入211用于存储在寄存器中,并且随后提供给ALU 204。
尽管图3(以及下面的图7和19)说明了一个实施例,其中,NPU 126被配置为将多路复用寄存器208/705的值向右旋转,即从NPU J到NPU J+1,但考虑实施例(诸如关于图24至26的实施例),其中,NPU 126被配置为将多路复用寄存器208/705的值向左旋转,即从NPU J到NPU J-1。此外,考虑实施例,其中,NPU 126被配置为将多路复用寄存器208/705的值选择性地向左或向右旋转,例如,如NNU指令所指定的。
现在参考图4,示出了例示用于存储在图1的NNU 121的程序存储器129中并由该NNU 121执行的程序的表。示例性程序执行与如上所述的人工神经网络的层相关联的计算。在图4的表中,示出了四行和三列。每行对应于在第一列中表示的程序存储器129的地址。第二列指定指令,第三列指示与指令相关联的时钟周期的数量。优选地,时钟周期的数量指示流水线实施例中每指令时钟类型值的时钟的有效数量,而不是指令的等待时间。如图所示,由于NNU 121的流水线性质,每个指令具有关联的一个时钟周期,但需要511个时钟的地址2处的指令除外,因为它有效地重复自身511次,如下面更详细地说明的。
对于程序的每个指令,所有NPU 126并行执行指令。即,所有N个NPU 126在相同的时钟周期中执行第一行中的指令,所有N个NPU 126在相同的时钟周期中执行第二行中的指令,依此类推,。然而,下面说明了其他实施例,其中,以部分并行和部分顺序的方式执行一些指令,例如在NPU 126共享激活函数单元的实施例(例如关于图11的实施例)中,在地址3和4的激活函数和输出指令。图4的示例假设512个神经元(NPU 126)的一层,每个具有来自512个神经元的先前层的512个连接输入,用于总共256K个连接。每个神经元从每个连接输入接收16位数据值,并将16位数据值乘以适当的16位权重值。
在地址0(尽管可以指定其他地址),第一行指定初始化NPU指令。初始化指令将累加器202的值清零。在一个实施例中,初始化指令还可以指定向累加器202加载由指令指定其地址的数据RAM 122或权重RAM 124的行的相应字。初始化指令还将配置值加载到控制寄存器127中,如下面关于图29A和29B更详细地描述的。例如,可以加载数据字207和权重字209的宽度,其可以由ALU 204用来确定由电路执行的运算的大小,并且可以影响存储在累加器202中的结果215。在一个实施例中,NPU 126包括在存储在累加器202中之前使ALU 204输出215饱和的电路,初始化指令将配置值加载到电路中以影响饱和。在一个实施例中,通过在ALU函数指令(例如,在地址1处的乘法-累加指令)或输出指令(例如地址4处的写AFU输出指令)中如此指定,累加器202也可被清为零值。
在地址1,第二行指定乘法-累加指令,其指示512个NPU 126从数据RAM122的一行加载相应的数据字,并从权重RAM 124的一行加载相应的权重字,对数据字输入207和权重字输入206执行第一乘法-累加运算,其与初始化的累加器202零值累加。更具体地,指令指示定序器128在控制输入端213上生成值以选择数据字输入207。在图4的示例中,指定的数据RAM 122行是行17,指定的权重RAM 124行是行0,其指示定序器128输出数据RAM地址123的值17并输出权重RAM地址125的值0。因此,来自数据RAM 122的行17的512个数据字被提供给512个NPU 126的相应数据输入端207,来自权重RAM124的行0的512个权重字被提供给512个NPU 126的相应权重输入端206。
在地址2,第三行指定具有计数511的乘法-累加旋转指令,其指示512个NPU 126中的每一个执行511次乘法-累加运算。该指令指示512个NPU 126,对于511次乘法-累加运算中的每一个,输入到ALU 204的数据字209是来自相邻NPU 126的旋转值211。即,指令指示定序器128在控制输入端213上生成选择旋转值211的值。另外,指令指示512个NPU 126从权重RAM 124的“下一”行加载用于511次乘法-累加运算中的每一个的相应权重字。即,指令指示定序器128将权重RAM地址125相对于其在先前时钟周期中的值递增1,在该示例中,将是指令的第一时钟周期上的行1,下一时钟周期上的行2,下一时钟周期上的行3,依此类推,直至第511个时钟周期上的行511。对于511次乘法-累加运算中的每一个,旋转输入211和权重字输入206的乘积与累加器202中的先前值累加。512个NPU 126在511个时钟周期中执行511次乘法-累加运算,其中,每个NPU 126对来自数据RAM 122的行17的不同数据字(即,在前一周期中由相邻NPU 126操作的数据字)和与该数据字相关联的不同权重字(其在概念上是到神经元的不同连接输入)执行乘法-累加运算。在该示例中,假设到每个NPU 126(神经元)的连接输入的数量是512,因此涉及512个数据字和512个权重字。一旦执行了行2的乘法-累加旋转指令的最后一次迭代,累加器202就包含所有512个连接输入的乘积之和。在一个实施例中,NPU 126指令集不具有用于每种类型的ALU运算(例如,如上所述的乘法-累加、累加器和权重字的最大值等)的单独指令,而是包括指示ALU 204执行由初始化NPU指令指定的(诸如在图29A的ALU函数2926中指定的)ALU运算的“执行”指令。
在地址3,第四行指定激活函数指令。激活函数指令指示AFU 212对累加器202的值217执行指定的激活函数以生成结果133。下面更详细地描述根据一个实施例的激活函数。
在地址4,第五行指定写AFU输出指令,其指示512个NPU 126将其AFU212输出作为结果133回写到数据RAM 122的一行,在该示例中为行16。即,指令指示定序器128输出数据RAM地址123的值16和写命令(与在地址1的乘法-累加指令的情况下的读命令相反)。优选地,在流水线特性中,写AFU输出指令的执行可以与其他指令的执行重叠,使得写AFU输出指令在单个时钟周期中有效地执行。
优选地,每个NPU 126被配置为包括各种功能元件的流水线,例如多路复用寄存器208(和图7的多路复用寄存器705)、ALU 204、累加器202、AFU 212、(图8的)多路复用器802、行缓冲器1104和(图11的)AFU 1112等,其中一些本身可以是流水线的。除了数据字207和权重字206之外,流水线从程序存储器129接收指令。指令沿着流水线向下流动并控制各个功能单元。在可替换的实施例中,激活函数指令不包括在程序中。相反,初始化NPU指令指定要对累加器202的值217执行的激活函数,一旦已经生成最终累加器202值217,即一旦在地址2的乘法-累加旋转指令的最后一次迭代完成,就将指示所指定的激活函数的值保存在配置寄存器中,以供以后由流水线的AFU 212部分使用。优选地,为了省电的目的,流水线的AFU212部分不运行,直到写AFU输出指令到达它,此时AFU 212被加电并且在由初始化指令指定的累加器202输出217上执行激活函数。
现在参考图5,示出了例示由NNU 121执行图4的程序的时序图。时序图的每一行对应于第一列中指示的连续时钟周期。每个其他列对应于512个NPU126中的不同一个并指示其操作。为了说明的简单和清楚,仅示出了用于NPU 0、1和511的操作。
在时钟0,512个NPU 126中的每一个执行图4的初始化指令,其在图5中通过向累加器202分配零值来示出。
在时钟1,512个NPU 126中的每一个执行在图4的地址1的乘法-累加指令。NPU 0用数据RAM 122行17字0和权重RAM 124行0字0的乘积累加累加器202值(其为零);NPU 1用数据RAM 122行17字1和权重RAM 124行0字1的乘积累加累加器202的值(其为零),依此类推,直至NPU 511用数据RAM 122行17字511和权重RAM 124行0字511的乘积累加累加器202的值(其为零),如图所示。
在时钟2,512个NPU 126中的每一个执行在图4的地址2的乘法-累加旋转指令的第一次迭代。NPU 0用从NPU 511的多路复用寄存器208输出端209接收的旋转数据字211(它是从数据RAM 122接收的数据字511)和权重RAM124行1字0的乘积累加累加器202的值;NPU 1用从NPU 0的多路复用寄存器208输出端209接收的旋转数据字211(它是从数据RAM 122接收的数据字0)和权重RAM 124行1字1的乘积累加累加器202的值;依此类推,直至NPU511用从NPU 510的多路复用寄存器208输出端209接收的旋转数据字211(它是从数据RAM 122接收的数据字510)和权重RAM 124行1字511的乘积累加累加器202的值,如图所示。
在时钟3,512个NPU 126中的每一个执行在图4的地址2的乘法-累加旋转指令的第二次迭代。NPU 0用从NPU 511的多路复用寄存器208输出端209接收的旋转数据字211(它是从数据RAM 122接收的数据字510)和权重RAM124行2字0的乘积累加累加器202的值;NPU 1用从NPU 0的多路复用寄存器208输出端209接收的旋转数据字211(它是从数据RAM 122接收的数据字511)和权重RAM 124行2字1的乘积累加累加器202的值;依此类推,直至NPU 511用从NPU 510的多路复用寄存器208输出端209接收的旋转数据字211(它是从数据RAM 122接收的数据字509)和权重RAM 124行2字511的乘积累加累加器202的值,如图所示。如图5的省略号所示,这对于随后的509个时钟周期中的每一个继续进行,直至……
在时钟512,512个NPU 126中的每一个执行在图4的地址2的乘法-累加旋转指令的第511次迭代。NPU 0用从NPU 511的多路复用寄存器208输出端209接收的旋转数据字211(它是从数据RAM 122接收的数据字1)和权重RAM124行511字0的乘积累加累加器202的值;NPU 1用从NPU 0的多路复用寄存器208输出端209接收的旋转数据字211(它是从数据RAM122接收的数据字2)和权重RAM 124行511字1的乘积累加累加器202的值;依此类推,直至NPU 511用从NPU 510的多路复用寄存器208输出端209接收的旋转数据字211(它是从数据RAM 122接收的数据字0)和权重RAM 124行511字511的乘积累加累加器202的值,如图所示。在一个实施例中,需要多个时钟周期来从数据RAM 122和权重RAM 124读取数据字和权重字以在图4的地址1执行乘法-累加指令;然而,数据RAM 122和权重RAM 124及NPU 126是流水线的,从而一旦开始第一乘法-累加运算(例如,如图5的时钟1所示),则随后的乘法累加运算(例如,时钟2-512期间所示)就在连续的时钟周期中开始。优选地,响应于通过架构指令(例如,MTNN或MFNN指令(下面参考图14和15描述))或架构指令被转换为的微指令访问数据RAM 122和/或权重RAM 124,NPU 126可以暂时停止。
在时钟513,512个NPU 126中的每一个的AFU 212执行在图4的地址3的激活函数指令。最后,在时钟514,512个NPU 126中的每一个通过将其结果133回写到数据RAM 122的行16的其相应字,即NPU 0的结果133被写入数据RAM 122的字0,NPU 1的结果133被写入数据RAM 122的字1,依此类推,直至NPU 511的结果133被写入数据RAM 122的字511,而执行在图4的地址4的写AFU输出指令。上面关于图5说明的操作也在图6A中以框图形式示出。
现在参考图6A,示出了例示用于执行图4的程序的图1的NNU 121的框图。NNU 121包括512个NPU 126、接收其地址输入123的数据RAM 122和接收其地址输入125的权重RAM124。虽然未示出,但在时钟0,512个NPU 126执行初始化指令。如图所示,在时钟1上,将行17的512个16位数据字从数据RAM 122中读出并提供给512个NPU 126。在时钟1至512上,将行0至511的512个16位权重字分别从权重RAM 124读出并提供给512个NPU 126。虽然未示出,但在时钟1上,512个NPU 126对加载的数据字和权重字执行它们各自的乘法-累加运算。在时钟2至512上,512个NPU 126的多路复用寄存器208作为512个16位字旋转器操作,以将数据RAM 122的行17的先前加载的数据字旋转到相邻NPU 126,并且NPU 126对相应的旋转数据字和从权重RAM124加载的相应权重字执行乘法-累加运算。虽然未示出,但在时钟513上,512个AFU 212执行激活指令。在时钟514上,512个NPU 126将它们各自的512个16位结果133回写到数据RAM 122的行16。
可以观察到,生成产生并回写到数据RAM 122或权重RAM 124的结果字(神经元输出)所需的时钟数大约是神经网络的当前层接收的数据输入(连接)的数量的平方根。例如,如果当前层具有512个神经元,每个神经元具有来自前一层的512个连接,则连接的总数为256K,并且生成用于当前层的结果所需的时钟数略多于512。因此,NNU 121为神经网络计算提供了极高的性能。
现在参考图6B,示出了例示图1的处理器100执行架构程序的操作的流程图,该架构程序使用NNU 121来执行典型地与人工神经网络的隐藏层的神经元相关联的乘法-累加激活函数计算,例如由图4的程序执行的。图6B的示例假定对于4个隐藏层(通过框602处的NUM_LAYERS变量的初始化来表示)的计算,每个隐藏层具有512个神经元,每个神经元都完全连接到前一层的512个神经元(通过使用图4的程序)。然而,应当理解,为了说明的目的选择这些层和神经元的数量,并且NNU 121可以用于对于不同数量的隐藏层和每层的不同数量的神经元以及对于非完全连接的神经元执行类似的计算。在一个实施例中,对于层中不存在的神经元或对于到神经元的不存在的连接,可以将权重值设置为零。优选地,架构程序将第一权重集合写入权重RAM 124并启动NNU121,并且当NNU 121执行与第一层相关联的计算时,架构程序将第二权重集合写入权重RAM 124,使得一旦NNU 121完成对于第一隐藏层的计算,NNU 121就可以开始对于第二层的计算。以此方式,架构程序在权重RAM 124的两个区域之间来回往复,以便保持NNU 121被充分利用。流程在框602处开始。
在框602处,处理器100(即,在处理器100上运行的架构程序)将到神经元的当前隐藏层的输入值写入数据RAM 122,例如写入数据RAM 122的行17,如关于图6A所示和所述的。可替换地,作为NNU 121对于在前层(例如,卷积、池化或输入层)的运算的结果133,值可能已经在数据RAM 122的行17中。另外,架构程序将变量N初始化为值1。变量N表示由NNU 121处理的隐藏层的当前层。此外,架构程序将变量NUM_LAYERS初始化为值4,因为在该示例中有4个隐藏层。流程进行到框604。
在框604处,处理器100将层1的权重字写入权重RAM 124,例如写入行0到511,如图6A所示。流程进行到框606。
在框606处,处理器100使用指定写入程序存储器129的函数1432的MTNN1400指令将乘法-累加-激活函数程序(例如,图4的)写入NNU 121程序存储器129。然后,处理器100使用指定开始执行程序的函数1432的MTNN 1400指令来启动NNU程序。流程进行到判定框608。
在判定框608处,架构程序确定变量N的值是否小于NUM_LAYERS。如果是,则流程进行到框612;否则,流程进行到框614。
在框612处,处理器100将用于层N+1的权重字写入权重RAM 124,例如写入行512到1023。因此,有利地,在NNU 121正在对当前层执行隐藏层计算时,架构程序将用于下一层的权重字写入权重RAM 124,使得一旦对于当前层的计算完成,即写入数据RAM 122,NNU 121就可立即开始执行对于下一层的隐藏层计算。流程进行到框614。
在框614处,处理器100确定当前运行的NNU程序(在层1的情况下在框606处开始,在层2至4的情况下在框618处开始)已经完成。优选地,处理器100通过执行读取NNU 121状态寄存器127的MFNN 1500指令来确定这一点。在替代实施例中,NNU 121生成中断以指示其已完成乘法-累加-激活函数层程序。流程进行到判定框616。
在判定框616处,架构程序确定变量N的值是否小于NUM_LAYERS。如果是,则流程进行到框618;否则,流程进行到框622。
在框618处,处理器100更新乘法-累加-激活函数程序,使得其可以执行对于层N+1的隐藏层计算。更具体地,处理器100将图4的地址1处的乘法-累加指令的数据RAM 122行值更新为前一层将其结果写入其中的数据RAM 122的行(例如,更新为行16),并且更新输出行(例如,更新为行15)。然后,处理器100启动更新的NNU程序。可替换地,图4的程序指定地址4的输出指令中的相同行作为在地址1的乘法-累加指令中指定的行(即,从数据RAM 122中读取的行)。在该实施例中,输入数据字的当前行被重写(这是可以接受的,只要数据字的行不需要用于某些其它目的,因为数据字的行已经被读入多路复用寄存器208并通过N字旋转器在NPU 126中旋转)。在此情况下,在框618处不需要更新NNU程序,而是仅需要重新开始它。流程进行到框622。
在框622处,处理器100从层N的数据RAM 122读取NNU程序的结果。然而,如果结果简单地由下一层使用,则架构程序可能不需要从数据RAM 122读取结果,而是将它们留在数据RAM 122中用于下一隐藏层计算。流程进行到判定框624。
在判定框624处,架构程序确定变量N的值是否小于NUM_LAYERS。如果是,则流程进行到框626;否则,流程结束。
在框626处,架构程序将N递增1。流程返回到判定框608。
如从图6B的示例可以确定的,大约每512个时钟周期,NPU 126从数据RAM 122读取一次和写入一次(借助于图4的NNU程序的操作)。此外,NPU126大约在每个时钟周期读取权重RAM 124以读取权重字的行。因此,以NNU121执行隐藏层运算的混合方式消耗权重RAM124的整个带宽。另外,假设包括诸如图17的缓冲器1704的写入和读取缓冲器的实施例与NPU 126同时读取,处理器100写入权重RAM 124,使得缓冲器1704大约每16个时钟周期执行一次对权重RAM 124的写入以写入权重字。因此,在权重RAM 124的单端口实施例(例如参照图17所描述的)中,大约每16个时钟周期,NPU 126必须停止从权重RAM 124读取,以使缓冲器1704能够写入权重RAM 124。然而,在权重RAM 124是双端口的实施例中,NPU 126不需要停止。
现在参考图7,示出了例示根据替代实施例的图1的NPU 126的框图。图7的NPU 126在许多方面与图2的NPU 126类似。然而,图7的NPU 126还包括第二2-输入多路复用寄存器705。多路复用寄存器705选择其输入端206或711中的一个以存储在其寄存器中,然后在随后的时钟周期上在其输出端203上提供。输入端206从权重RAM 124接收权重字。另一个输入端711接收相邻NPU126的第二多路复用寄存器705的输出203。优选地,NPU J的多路复用寄存器705输入端711接收NPU 126实例J-1的多路复用寄存器705输出203,并将NPU J的输出提供给NPU 126实例J+1的多路复用寄存器705输入端711。以此方式,N个NPU 126的多路复用寄存器705共同作为N字旋转器操作,类似于上面关于图3所述的方式,但是对于权重字而不是数据字。控制输入713控制多路复用寄存器705选择两个输入中的哪个来存储在其寄存器中并随后在输出端203上提供。
包括多路复用寄存器208和/或多路复用寄存器705(以及诸如图18和23的其它实施例的多路复用寄存器)以有效地形成旋转从数据RAM 122和/或权重RAM 124接收的行的数据/权重的大旋转器具有的优点是NNU 121不需要极大的多路复用器,否则在数据RAM122和/或权重RAM 124之间就需要极大的多路复用器,以便向适当的NNU 121提供必要的数据/重量字。
除激活函数结果外,回写累加器值
在一些应用中,处理器100接收回(例如,经由图15的MFNN指令到媒体寄存器118)原始累加器202值217(在其它执行单元112上执行的指令可以对其执行计算)是有用的。例如,在一个实施例中,为了降低AFU 212的复杂性,它不被配置为执行softmax激活函数。因此,NNU 121可以将原始累加器202值217或其子集输出到数据RAM 122或权重RAM 124,架构程序随后从数据RAM 122或权重RAM 124读取它,并对原始值执行计算。然而,原始累加器202的值217的使用不限于softmax的执行,可以设想其他用途。
现在参考图8,示出了例示根据替代实施例的图1的NPU 126的框图。图8的NPU 126在许多方面类似于图2的NPU 126。然而,图8的NPU 126包括具有控制输入803的AFU 212中的多路复用器(mux)802。累加器202的宽度(以位为单位)大于数据字的宽度。多路复用器802具有接收累加器202输出217的数据字宽度的部分的多个输入。在一个实施例中,累加器202的宽度为41位,NPU 126被配置为输出16位的结果字133;因此,例如,多路复用器802(或图30的多路复用器3032和/或多路复用器3037)包括分别接收累加器202输出217的位[15:0]、位[31:16]和位[47:32]的三个输入端。优选地,将累加器202没有提供的输出位(例如,位[47:41])强制为零值位。
定序器128在控制输入端803上生成值,以控制多路复用器802响应于写ACC指令(例如下述图9的地址3至5处的写ACC指令)选择累加器202的字(例如,16位)中的一个字。优选地,多路复用器802还具有一个或多个输入端,其接收生成数据字的宽度的输出的激活函数电路(例如,图30的元件3022、3024、3026、3018、3014和3016)的输出。定序器128在控制输入端803上生成值,以响应于诸如在图4的地址4处的写AFU输出指令之类的指令而控制多路复用器802选择激活函数电路输出中的一个,而不是累加器202的字中的一个。
现在参考图9,示出了例示用于存储在图1的NNU 121的程序存储器129中并由该NNU 121执行的程序的表。图9的示例性程序在许多方面与图4的程序类似。具体地,在地址0至2的指令是相同的。然而,在图4的地址3和4的指令在图9中由写ACC指令代替,其指示512个NPU 126将它们的累加器202输出217作为结果133回写到数据RAM 122的三行,在该示例中是行16到18。即,写ACC指令指示定序器128在第一时钟周期中输出数据RAM地址123的值16和写命令,在第二时钟周期中输出数据RAM地址123的值17和写命令,并且在第三时钟周期中输出数据RAM地址123的值18和写命令。优选地,写ACC指令的执行可以与其它指令的执行重叠,使得写ACC指令在三个时钟周期中有效地执行,一个时钟周期用于写入数据RAM122中的一行。在一个实施例中,用户指定控制寄存器127(图29A的)中激活函数2934和输出命令2956字段的值,以完成将累加器202的所期望部分写入数据RAM 122或权重RAM124。可替换地,不是回写累加器202的全部内容,写ACC指令可以可任选地回写累加器202的子集。在一个实施例中,可以回写累加器202的规范形式,如下面关于图29至31更详细地描述的。
现在参考图10,示出了例示由NNU 121执行图9的程序的时序图。图10的时序图类似于图5的时序图,时钟0至512是相同的。然而,在时钟513-515,512个NPU 126中的每一个的AFU 212执行图9的地址3至5处的写ACC指令中的一个。具体地,在时钟513,512个NPU 126中的每一个将累加器202输出217的位[15:0]作为其结果133回写到数据RAM 122的行16的其相应字;在时钟514,512个NPU 126中的每一个将累加器202输出217的位[31:16]作为其结果133回写到数据RAM 122的行17的其相应字;在时钟515,512个NPU 126中的每一个将累加器202输出217的位[40:32]作为其结果133回写到数据RAM122的行18的其相应字。优选地,位[47:41]被强制为零值。
共享AFU
现在参考图11,示出了例示图1的NNU 121的实施例的框图。在图11的实施例中,神经元被分成两部分,即激活函数单元部分和ALU部分(其还包括移位寄存器部分),每个激活函数单元部分由多个ALU部分共享。在图11中,ALU部分被称为NPU 126,共享的激活函数单元部分被称为AFU 1112。这与例如图2的实施例相反,其中,每个神经元包括其自己的AFU212。因此,例如,在一个实施例中,图11的实施例的NPU126(ALU部分)包括图2的累加器202、ALU 204、多路复用寄存器208和寄存器205,但不包括AFU 212。在图11的实施例中,NNU121包括512个NPU 126作为示例;然而,可以设想具有其他数量的NPU 126的其他实施例。在图11的示例中,512个NPU 126被分组为64组,每组有8个NPU 126,在图11中被称为组0至组63。
NNU 121还包括行缓冲器1104和耦合在NPU 126和行缓冲器1104之间的多个共享AFU 1112。行缓冲器1104具有与数据RAM 122或权重RAM 124的行相同的宽度(以位为单位),例如512个字。每个NPU 126组有一个AFU 1112,即,每个AFU 1112都具有对应的NPU126组;因此,在图11的实施例中,存在对应于64个NPU 126组的64个AFU 1112。组中的八个NPU 126中的每一个共享对应的AFU 1112。可以设想每组具有不同数量的AFU 1112和NPU126的其它实施例。例如,考虑组中的两个或四个或十六个NPU 126共享AFU 1112的其它实施例。
共享AFU 1112的动机是减小NNU 121的尺寸。以性能降低为代价获得尺寸减小。即,取决于共享率,可能需要几个时钟来生成用于整个NPU 126阵列的结果133,如下面的图12所示,例如,其中,由于8:1共享率,需要七个额外时钟周期。然而,一般来说,与生成累加和所需的时钟数量(例如,对于每个神经元具有512个连接的层,512个时钟)相比,额外的时钟数量(例如,7)相对较小。因此,相对较小的性能影响(例如,计算时间增加百分之一)可以是NNU 121尺寸减小的值得的折衷。
在一个实施例中,NPU 126中的每一个包括执行相对简单的激活函数的AFU 212,从而能够使简单AFU 212相对较小并从而包括在每个NPU 126中;而共享的或复杂的AFU1112执行相对复杂的激活函数,因此相对显著地大于简单AFU 212。在这个实施例中,仅当指定需要共享复杂AFU 1112的复杂激活函数时,而不是当指定了简单AFU 212被配置为执行的激活函数时,才需要额外的时钟周期。
现在参考图12和13,示出了例示图11的NNU 121执行图4的程序的两个时序图。图12的时序图类似于图5的时序图,时钟0至512相同。然而,在时钟513,操作与图5的时序图中所描述的不同,因为图11的NPU 126共享AFU1112;即,一组的NPU 126共享与该组相关联的AFU 1112,图11示出了共享。
图13的时序图的每一行对应于在第一列中指示的连续时钟周期。其他列中的每一列对应于64个AFU 1112中的不同的一个并指示其操作。为了说明的简单和清楚,仅示出了用于AFU 0、1和63的操作。图13的时钟周期对应于图12的时钟周期,但示出了NPU 126以不同方式共享AFU 1112。在时钟0-512,64个AFU 1112中的每一个不运行,如图13所示,而NPU126执行初始化NPU和乘法-累加及乘法-累加旋转指令。
如图12和13所示,在时钟513,AFU 0(与组0相关联的AFU 1112)开始对作为组0中第一个NPU 126的NPU 0的累加器202值217执行指定的激活函数,并且AFU 0的输出将被存储到行缓冲器1104字0。同样在时钟513,AFU 1112中的每个开始在其相应NPU 126组中的第一个NPU 126的累加器202上执行指定的激活函数。因此,在时钟513中,如图13所示,AFU 0开始在NPU 0的累加器202上执行指定的激活函数,以生成将被存储到行缓冲器1104字0的结果;AFU 1开始在NPU 8的累加器202上执行指定的激活函数,以生成将被存储到行缓冲器1104字8的结果;依此类推,直至AFU 63开始在NPU504的累加器202上执行指定的激活函数,以生成将被存储到行缓冲器1104字504的结果。
在时钟514,AFU 0(与组0相关联的AFU 1112)开始对作为组0中的第二个NPU 126的NPU 1的累加器202值217执行指定的激活函数,并且AFU的输出0将被存储到行缓冲器1104字1,如图所示。同样在时钟514,AFU 1112中的每个开始在其相应NPU 126组中的第二个NPU 126的累加器202上执行指定的激活函数。因此,在时钟514中,如图13所示,AFU 0开始在NPU 1的累加器202上执行指定的激活函数,以生成将被存储到行缓冲器1104字1的结果;AFU 1开始在NPU 9的累加器202上执行指定的激活函数,以生成将被存储到行缓冲器1104字9的结果;依此类推,直至AFU 63开始在NPU 505的累加器202上执行指定的激活函数,以生成将被存储到行缓冲器1104字505的结果。该模式继续,直到在时钟周期520,AFU 0(与组0相关联的AFU 1112)开始对作为组0中的第八个(最后一个)NPU 126的NPU 7的累加器202值217执行指定的激活函数,AFU 0的输出将被存储到行缓冲器1104字7,如图所示。同样在时钟520,AFU 1112的每个开始在其相应NPU 126组中的第八个NPU 126的累加器202上执行指定的激活函数。因此,在时钟520中,如图13所示,AFU0开始在NPU 7的累加器202上执行指定的激活函数,以生成将被存储到行缓冲器1104字7的结果;AFU 1开始在NPU 15的累加器202上执行指定的激活函数,以生成将被存储到行缓冲器1104字15的结果;依此类推,直至AFU 63开始在NPU 511的累加器202上执行指定的激活函数,以生成将被存储到行缓冲器1104字511的结果。
在时钟521,一旦已经生成了与512个NPU 126相关联的所有512个结果并将其写入行缓冲器1104,行缓冲器1104就开始将其内容写入数据RAM 122或权重RAM 124。以此方式,64组NPU 126中的每一个的AFU 1112执行图4的地址3处的激活函数指令的一部分。
诸如图11的在ALU 204的组中共享AFU 1112的实施例结合整数ALU 204是特别有利的,如下面例如关于图29A至33更多地描述的。
MTNN和MFNN架构指令
现在参考图14,示出了例示移动到神经网络(MTNN)架构指令1400及其相对于图1的NNU 121的各部分的操作的框图。MTNN指令1400包括操作码字段1402、src1字段1404、src2字段1406、gpr字段1408和立即字段1412。MTNN指令1400是架构指令,即它被包括在处理器100的指令集架构中。优选地,指令集架构将操作码字段1402的预定值与MTNN指令1400相关联,以将其与指令集架构中的其他指令区分开。MTNN指令1400操作码1402可以包括或可以不包括诸如在x86架构中是常见的前缀。
立即字段1412向NNU 121的控制逻辑1434提供指定功能1432的值。优选地,功能1432作为图1的微指令105的立即操作数提供。可以由NNU 121执行的功能1432包括但不限于写入数据RAM 122,写入权重RAM 124,写入程序存储器129,写入控制寄存器127,开始执行程序存储器129中的程序,暂停执行程序存储器129中的程序,完成程序存储器129中的程序的执行的请求通知(例如,中断),以及重置NNU 121。优选地,NNU指令集包括其结果指示NNU程序完成的指令。可替换地,NNU指令集包括显式生成中断指令。优选地,除了数据RAM122、权重RAM 124、程序存储器129的内容保持原样之外,重置NNU 121包括有效地迫使NNU121返回到复位状态(例如,内部状态机被清除并设置为空闲状态)。另外,诸如累加器202的内部寄存器不受重置功能的影响,并且必须例如通过图4的地址0处的初始化NPU指令来明确地清除。在一个实施例中,功能1432可以包括直接执行功能,其中,第一源寄存器包含微操作(参见例如图34的微操作3418)。直接执行功能指示NNU 121直接执行指定的微操作。以此方式,架构程序可以直接控制NNU 121执行操作,而不是将指令写入程序存储器129,然后指示NNU 121执行程序存储器中的指令,或者通过执行MTNN指令1400(或图15的MFNN指令1500)。图14示出了写入数据RAM 122的功能1432的示例。
gpr字段1408指定通用寄存器文件116中的GPR中的一个。在一个实施例中,每个GPR是64位。通用寄存器文件116将值从所选择的GPR提供给NNU121,如图所示,NNU 121使用该值作为地址1422。地址1422选择在功能1432中指定的存储器的行。在数据RAM 122或权重RAM 124的情况下,地址1422另外选择位于所选择的行内且大小为媒体寄存器的大小(例如512位)的两倍的块。优选地,该位置在512位的边界上。在一个实施例中,多路复用器选择地址1422(或在下面描述的MFNN指令1400的情况下的地址1422)或来自定序器128的地址123/125/131,以提供给数据RAM 122/权重RAM 124/程序存储器129。在一个实施例中,如下面更详细描述的,数据RAM 122是双端口的,以允许NPU 126与媒体寄存器118读/写数据RAM 122同时读/写数据RAM 122。在一个实施例中,出于类似的目的,权重RAM 124也是双端口的。
src1字段1404和src2字段1406各自指定媒体寄存器文件118中的媒体寄存器。在一个实施例中,每个媒体寄存器118是256位。媒体寄存器文件118将来自所选择的媒体寄存器的连续数据(例如,512位)提供给数据RAM 122(或权重RAM 124或程序存储器129),用于写入由地址1422指定的所选行1428和所选行1428内由地址1422指定的位置,如图所示。有利地,通过执行一系列MTNN指令1400(以及下面描述的MFNN指令1400),在处理器100上执行的架构程序可以填充数据RAM 122的行和权重RAM 124的行,并将程序写入程序存储器129,例如本文所描述的(例如,图4和图9的)程序,以使NNU 121以极高的速度对数据和权重执行运算,以完成人工神经网络。在一个实施例中,架构程序直接控制NNU 121,而不是将程序写入程序存储器129。
在一个实施例中,MTNN指令1400不指定两个源寄存器(例如,1404和1406),而是指定起始源寄存器和多个源寄存器Q。这种形式的MTNN指令1400指示处理器100将指定为开始源寄存器的媒体寄存器118以及接下来的Q-1个顺序媒体寄存器118写入NNU 121,即写入指定的数据RAM 122或权重RAM124。优选地,指令转换器104将MTNN指令1400转换成与写入所有Q个指定的媒体寄存器118所需的一样多的微指令。例如,在一个实施例中,当MTNN指令1400将开始源寄存器指定为MR4并且Q为8时,则指令转换器104将MTNN指令1400转换为四个微指令,其中第一个微指令写MR4和MR5,其中第二个微指令写MR6和MR7,其中第三个微指令写MR8和MR9,其中第四个微指令写MR10和MR11。在从媒体寄存器118到NNU 121的数据路径是1024位而不是512位的替代实施例中,指令转换译器104将MTNN指令1400转换为两个微指令,其中第一个微指令写MR4到MR7,其中第二个微指令写MR8到MR11。考虑类似的实施例,其中,MFNN指令1500指定起始目的地寄存器和多个目的地寄存器,以使得与单个媒体寄存器118相比能够每MFNN指令1500读取数据RAM 122或权重RAM 124的行的更大的块。
现在参考图15,示出了例示从神经网络移动(MFNN)架构指令1500及其相对于图1的NNU 121的各部分的操作的框图。MFNN指令1500包括操作码字段1502、dst字段1504、gpr字段1508和立即字段1512。MFNN指令1500是架构指令,即,其被包括在处理器100的指令集架构中。优选地,指令集架构将操作码字段1502的预定值与MFNN指令1500相关联,以将其与指令集架构中的其他指令区分开。MFNN指令1500操作码1502可以包括或可以不包括诸如在x86架构中是常见的前缀。
立即字段1512向NNU 121的控制逻辑1434提供指定功能1532的值。优选地,功能1532作为图1的微指令105的立即操作数提供。可以由NNU 121执行的功能1532包括但不限于从数据RAM 122读取,从权重RAM 124读取,从程序存储器129读取以及从状态寄存器127读取。图15示出了从数据RAM 122读取的功能1532的示例。
gpr字段1508指定通用寄存器文件116中的GPR中的一个。通用寄存器文件116将值从所选择的GPR提供给NNU 121,如图所示,其使用该值作为地址1522,地址1522以类似于图14的地址1422的方式操作,以选择在功能1532中指定的存储器的行,在数据RAM 122或权重RAM 124的情况下,地址1522另外选择位于在所选择的行内且大小为媒体寄存器的大小(例如256位)的块。优选地,该位置在256位的边界上。
dst字段1504指定媒体寄存器文件118中的媒体寄存器。媒体寄存器文件118从数据RAM 122(或权重RAM 124或程序存储器129)接收到所选择的媒体寄存器中的数据(例如,256位),该数据从由地址1522指定的所选行1528和从所选行1528内由地址1522指定的位置读取,如图所示。
NNU内部RAM端口配置
现在参考图16,示出了例示图1的数据RAM 122的实施例的框图。数据RAM 122包括存储器阵列1606、读端口1602和写端口1604。存储器阵列1606保存数据字,并且优选地被布置为如上所述的N个字的D行。在一个实施例中,存储器阵列1606包括64个水平排列的静态RAM单元的阵列,其中每个单元是128位宽和64高以提供8192位宽且具有64行的64KB数据RAM 122,数据RAM122占据大约0.2平方毫米的管芯面积。然而,可以设想其它实施例。
读端口1602优选地以多路复用方式耦合到NPU 126和媒体寄存器118(更确切地说,媒体寄存器118可以通过结果总线耦合到读端口1602,结果总线还可以向重排序缓冲器和/或到其他执行单元112的结果转发总线提供数据)。NPU126和媒体寄存器118共享读端口1602以读取数据RAM 122。写端口1604也优选地以多路复用方式耦合到NPU 126和媒体寄存器118。NPU 126和媒体寄存器118共享写端口1604以写入数据RAM 122。因此,有利地,在NPU126从数据RAM 122读取时,媒体寄存器118可以同时写入数据RAM 122,或者在媒体寄存器118从数据RAM 122读取时,NPU 126可以同时写入数据RAM 122。这可以有利地提供改进的性能。例如,当媒体寄存器118向数据RAM 122写入更多数据字时,NPU 126可以读取数据RAM122(例如,继续执行计算)。对于另一示例,在媒体寄存器118从数据RAM 122读取计算结果的同时,NPU 126可以将计算结果写入数据RAM 122。在一个实施例中,NPU 126可以向数据RAM 122写入一行计算结果,同时NPU 126也从数据RAM 122读取一行数据字。在一个实施例中,存储器阵列1606被配置在存储体(bank)中。当NPU 126访问数据RAM 122时,所有存储体被激活以访问存储器阵列1606的整个行;而当媒体寄存器118访问数据RAM 122时,仅激活指定的存储体。在一个实施例中,每个存储体是128位宽,媒体寄存器118是256位宽,因此例如每个媒体寄存器118访问激活两个存储体。在一个实施例中,端口1602/1604中的一个是读/写端口。在一个实施例中,端口1602和1604二者都是读/写端口。
如本文所述的NPU 126的旋转器能力的优点是其有助于数据RAM 122的存储器阵列1606具有显著更少的行的能力,且因此比其它情况下为了确保高度利用NPU 126所需的相对小得多,高度利用NPU 126要求架构程序(经由媒体寄存器118)在NPU 126执行计算时能够不断地向数据RAM 122提供数据并且从其取回结果。
内部RAM缓冲区
现在参考图17,示出了例示图1的权重RAM 124和缓冲器1704的实施例的框图。权重RAM 124包括存储器阵列1706和端口1702。存储器阵列1706保存权重字,并且优选地被布置为如上所述的N个字的W行。在一个实施例中,存储器阵列1706包括128个水平排列的静态RAM单元的阵列,其中每个单元是64位宽和2048高以提供8192位宽且具有2048行的2MB权重RAM 124,RAM 124占据大约2.4平方毫米的管芯面积。然而,可以设想其它实施例。
端口1702优选地以多路复用方式耦合到NPU 126和缓冲器1704。NPU 126和缓冲器1704经由端口1702读取和写入权重RAM 124。缓冲器1704还耦合到图1的媒体寄存器118,使得媒体寄存器118通过缓冲器1704读取和写入权重RAM 124。因此,有利地,在NPU 126从权重RAM 124读取或向权重RAM 124写入时,媒体寄存器118可以同时向缓冲器1704写入或从缓冲器1704读取(尽管优选地,如果它们同时执行,则NPU 126停止,以避免在缓冲器1704访问权重RAM 124时访问权重RAM 124)。这可以有利地提供改进的性能,特别是由于媒体寄存器118对权重RAM 124的读/写比NPU 126对权重RAM 124的读/写相对小得多。例如,在一个实施例中,NPU 126一次读/写8192位(一行),而媒体寄存器118是256位宽,并且每个MTNN指令1400写入两个媒体寄存器118,即512位。因此,在架构程序执行十六个MTNN指令1400以填充缓冲器1704的情况下,仅少于大约百分之六的时间对于访问权重RAM 124在NPU126和架构程序之间发生冲突。在替代实施例中,指令转换器104将MTNN指令1400转换为两个微指令105,每个微指令将单个媒体寄存器118写入缓冲器1704,在这种情况下,对于访问权重RAM124甚至更少地在NPU 126和架构程序之间发生冲突。
在包括缓冲器1704的一个实施例中,由架构程序写入权重RAM 124需要多个MTNN指令1400。一个或多个MTNN指令1400指定功能1432以写入缓冲器1704的指定块,随后是一个MTNN指令1400,其指定指示NNU 121将缓冲器1704的内容写入权重RAM 124的指定行的功能1432,其中,块的大小是媒体寄存器118的位数的两倍,块在缓冲器1704内自然地对准。在一个实施例中,在指定写入缓冲器1704的指定块的功能1432的每个MTNN指令1400中,包括具有对应于缓冲器1704的每个块的位的位掩码。将来自两个指定源寄存器118的数据写入缓冲器1704的其位掩码中的相应位被置位的每个块。这对于权重RAM 124的行内的重复数据值是有用的。例如,为了使缓冲器1704(以及随后的权重RAM 124的行)为零,编程器可以用零加载源寄存器并置位位掩码的所有位。另外,位掩码使得编程器仅向缓冲器1704的所选块写入,从而将先前的数据保留在其他块中。
在包括缓冲器1704的一个实施例中,由架构程序从权重RAM 124读取需要多个MFNN指令1500。初始MFNN指令1500指定功能1532以从权重RAM124的指定行加载缓冲器1704,随后是一个或多个MFNN指令1500,其指定将缓冲器1704的指定块读取到目的地寄存器中的功能1532,其中,块的大小是媒体寄存器118的位数,块在缓冲器1704内自然地对准。考虑其他实施例,其中,权重RAM 124包括多个缓冲器1704以进一步减少NPU 126和架构程序之间对于访问权重RAM 124的竞争,其借助于在NPU 126执行的同时增加可以由架构程序进行的访问的数量,这可以增大在NPU 126不需要访问权重RAM 124的时钟周期期间可以由缓冲器1704执行访问的可能性。
虽然图16说明了双端口数据RAM 122,但是可以设想权重RAM 124也是双端口的其他实施例。此外,虽然图17说明了与权重RAM 124一起使用的缓冲器,但是可以设想数据RAM122还具有类似于缓冲器1704的相关缓冲器的其他实施例。
动态可配置NPU
现在参考图18,示出了例示图1的动态可配置NPU 126的框图。图18的NPU 126在许多方面类似于图2的NPU 126。然而,图18的NPU 126可动态配置为以两种不同配置中的一种操作。在第一配置中,图18的NPU 126类似于图2的NPU 126操作。即,在本文称为“宽”配置或“单”配置的第一配置中,NPU 126的ALU 204对单个宽数据字和单个宽权重字(例如,16位)执行运算以生成单个宽结果。相比之下,在本文称为“窄”配置或“双”配置的第二配置中,NPU 126对两个窄数据字和两个相应窄权重字(例如,8位)执行运算以生成两个相应的窄结果。在一个实施例中,NPU 126的配置(宽或窄)由初始化NPU指令(例如,在下面描述的图20的地址0)进行。可替换地,配置通过MTNN指令进行,其功能1432指定将NPU 126配置为该配置(宽或窄)。优选地,配置寄存器由确定配置(宽或窄)的程序存储器129指令或MTNN指令填充。例如,将配置寄存器输出提供给ALU 204、AFU 212和生成多路复用寄存器控制信号213的逻辑。一般来说,图18的NPU 126的元件执行与图2的其类似编号的元件相似的功能,为了理解图18,应参考图2。然而,现在将描述图18的实施例,包括与图2的不同之处。
图18的NPU 126包括两个寄存器205A和205B、两个3-输入多路复用寄存器208A和208B、ALU 204、两个累加器202A和202B、以及两个AFU 212A和212B。寄存器205A/205B中的每一个分别是图2的寄存器205的宽度(例如,8位)的一半。寄存器205A/205B中的每一个从权重RAM 124接收相应的窄权重字206A/206B(例如,8位),在随后的时钟周期上将其输出203A/203B提供给ALU 204的操作数选择逻辑电路1898。当NPU 126处于宽配置时,寄存器205A/205B有效地一起运行以从权重RAM 124接收宽权重字206A/206B(例如,16位),类似于图2的实施例的寄存器205的方式;当NPU 126处于窄配置时,寄存器205A/205B有效地单独地运行,每一个从权重RAM 124接收窄权重字206A/206B(例如,8位),使得NPU 126实际上是两个单独的窄NPU。然而,权重RAM 124的相同输出位耦合到并提供给寄存器205A/205B,而不管NPU126的配置如何。例如,NPU 0的寄存器205A接收字节0,NPU的寄存器205B0接收字节1,NPU 1的寄存器205A接收字节2,NPU 1的寄存器205A接收字节3,依此类推,直至NPU 511的寄存器205B接收字节1023。
多路复用寄存器208A/208B中的每一个分别是图2的寄存器208的宽度(例如,8位)的一半。多路复用寄存器208A选择其输入端207A或211A或1811A中的一个以存储在其寄存器中,然后在随后的时钟周期上在其输出端209A上提供,多路复用寄存器208B选择其输入端207B或211B或1811B中的一个以存储在其寄存器中,然后在随后的时钟周期上在其输出端209B上提供给操作数选择逻辑电路1898。输入端207A从数据RAM 122接收窄数据字(例如,8位),输入端207B从数据RAM 122接收窄数据字。当NPU 126处于宽配置时,多路复用寄存器208A/208B有效地一起运行以从数据RAM 122接收宽数据字207A/207B(例如,16位),类似于图2的实施例的多路复用器208的方式;当NPU 126处于窄配置时,多路复用器寄存器208A/208B有效地单独运行,每一个从数据RAM 122接收窄数据字207A/207B(例如,8位),使得NPU 126实际上是两个单独的窄NPU。然而,无论NPU 126的配置如何,数据RAM 122的相同输出位耦合到并提供给多路复用寄存器208A/208B。例如,NPU 0的多路复用寄存器208A接收字节0,NPU 0的多路复用寄存器208B接收字节1,NPU1的多路复用寄存器208A接收字节2,NPU 1的多路复用寄存器208A接收字节3,依此类推,直至NPU 511的多路复用寄存器208B接收字节1023。
输入端211A接收相邻NPU 126的多路复用寄存器208A的输出209A,输入端211B接收相邻NPU 126的多路复用寄存器208B的输出209B。输入端1811A接收相邻NPU 126的多路复用寄存器208B的输出209B,输入端1811B接收当前NPU 126的多路复用器208A的输出209A,如图所示。图18所示的NPU 126被表示为图1的N个NPU 126中的NPU J。即,NPU J是N个NPU 126的代表性实例。优选地,NPU J的多路复用寄存器208A输入端211A接收NPU126实例J-1的多路复用寄存器208A输出209A,NPU J的多路复用寄存器208A输入端1811A接收NPU126实例J-1的多路复用寄存器208B输出209B,NPU J的多路复用寄存器208A输出209A被提供给NPU 126实例J+1的多路复用寄存器208A输入端211A和NPU 126实例J的多路复用寄存器208B输入端211B;NPU J的多路复用寄存器208B输入端211B接收NPU 126实例J-1的多路复用寄存器208B输出209B,NPU J的多路复用寄存器208B输入端1811B接收NPU 126实例J的多路复用寄存器208A输出209A,NPU J的多路复用寄存器208B输出209B被提供给NPU 126实例J+1的多路复用寄存器208A输入端1811A和NPU 126实例J+1的多路复用寄存器208B输入端211B。
控制输入213控制多路复用寄存器208A/208B中的每一个选择三个输入中的哪一个存储在其相应寄存器中并随后在相应的输出端209A/209B上提供。当指示NPU 126从数据RAM 122加载行时(例如,通过图20的地址1处的乘法-累加指令,如下所述),不管NPU 126是处于宽配置还是窄配置,控制输入213控制多路复用寄存器208A/208B中的每一个从数据RAM 122的所选择的行的相应窄字中选择各自的窄数据字207A/207B(例如,8位)。
当指示NPU 126旋转先前接收到的数据行值(例如,通过图20的地址2处的乘法-累加旋转指令,如下所述)时,如果NPU 126处于窄配置,则控制输入213控制多路复用寄存器208A/208B中的每一个选择相应的输入1811A/1811B。在此情况下,多路复用寄存器208A/208B有效地单独运行,使得NPU 126实际上是两个单独的窄NPU。以此方式,N个NPU 126的多路复用寄存器208A和208B作为2N窄字旋转器共同操作,如下面关于图19更详细描述的。
当指示NPU 126旋转先前接收到的数据行值时,如果NPU 126处于宽配置,则控制输入213控制多路复用寄存器208A/208B中的每一个选择相应的输入211A/211B。在此情况下,多路复用寄存器208A/208B有效地一起运行,就好像NPU 126是单个宽NPU 126。以此方式,N个NPU 126的多路复用寄存器208A和208B作为N宽字旋转器共同操作,类似于关于图3所描述的方式。
ALU 204包括操作数选择逻辑电路1898、宽乘法器242A、窄乘法器242B、宽两输入多路复用器1896A、窄两输入多路复用器1896B、宽加法器244A和窄加法器244B。有效地,ALU204包括操作数选择逻辑电路1898、宽ALU 204A(包括宽乘法器242A、宽多路复用器1896A和宽加法器244A)和窄ALU 204B(包括窄乘法器242B、窄多路复用器1896B和窄加法器244B)。优选地,宽乘法器242A乘以两个宽字,类似于图2的乘法器242,例如16位乘16位乘法器。窄乘法器242B乘以两个窄字,例如生成16位结果的8位乘8位乘法器。当NPU 126处于窄配置时,宽乘法器242A在操作数选择逻辑电路1898的帮助下被有效地用作窄乘法器以乘以两个窄字,使得NPU126有效地用作两个窄NPU。优选地,宽加法器244A将宽多路复用器1896A的输出和宽累加器202A输出217A相加,以生成用于提供给宽累加器202A的和215A,类似于图2的加法器244。窄加法器244B将窄多路复用器1896B的输出和窄累加器202B输出217B相加,以生成用于提供给窄累加器202B的和215B。在一个实施例中,窄累加器202B是28位宽,以避免高达1024个16位乘积的累加中的精度损失。当NPU 126处于宽配置时,窄乘法器242B、窄多路复用器1896B、窄加法器244B,窄累加器202B和窄AFU 212B优选地不运行,以减少功耗。
操作数选择逻辑电路1898从209A、209B、203A和203B选择操作数以提供给ALU 204的其它元件,如下面更详细描述的。优选地,操作数选择逻辑电路1898还执行其他功能,例如执行有符号值数据字和权重字的符号扩展。例如,如果NPU 126处于窄配置,则操作数选择逻辑电路1898在将窄数据字和权重字提供给宽乘法器242A之前将其符号扩展到宽字的宽度。类似地,如果指示ALU204让窄数据/权重字(通过宽多路复用器1896A旁路宽乘法器242A)通过,则操作数选择逻辑电路1898在将窄数据字和权重字提供给宽加法器244A之前将其符号扩展到宽字的宽度。优选地,逻辑电路还存在于图2的NPU 126的ALU204中,以执行符号扩展功能。
宽多路复用器1896A接收宽乘法器242A的输出和来自操作数选择逻辑电路1898的操作数,并选择输入中的一个以提供给宽加法器244A,窄多路复用器1896B接收窄乘法器242B的输出和来自操作数选择逻辑电路1898的操作数,并选择输入中的一个以提供给窄加法器244B。
由操作数选择逻辑电路1898提供的操作数取决于NPU 126的配置以及在由ALU204基于由正由NPU 126执行的指令指定的功能而执行的算术和/或逻辑运算。例如,如果指令指示ALU 204执行乘法-累加并且NPU 126处于宽配置,则操作数选择逻辑电路1898在一个输入端上向宽乘法器242A提供是输出209A和209B的串联的宽字,并且在另一个输入端上提供是输出203A和203B的串联的宽字,窄乘法器242B不运行,使得NPU 126用作类似于图2的NPU 126的单个宽NPU 126。然而,如果指令指示ALU 204执行乘法-累加且NPU 126处于窄配置,则操作数选择逻辑电路1898在一个输入端上向宽乘法器242A提供窄数据字209A的扩展或加宽的形式,另一个输入端上提供窄权重字203A的扩展形式;另外,操作数选择逻辑电路1898在一个输入端上向窄乘法器242B提供窄数据字209B,在另一个输入端上提供窄权重字203B。为了扩展或加宽窄字,如果窄字是有符号的,则操作数选择逻辑电路1898对窄字进行符号扩展,而如果窄字是无符号的,则操作数选择逻辑电路1898用零值高位填充窄字。
对于另一示例,如果NPU 126处于宽配置并且指令指示ALU 204执行权重字的累加,则宽乘法器242A被旁路,并且操作数选择逻辑电路1898将输出203A和203B的串联提供给宽多路复用器1896A,以提供给宽加法器244A。然而,如果NPU126处于窄配置并且指令指示ALU 204执行权重字的累加,则宽乘法器242A被旁路,并且操作数选择逻辑电路1898将输出203A的扩展形式提供给宽多路复用器1896A,用于提供给宽加法器244A;窄乘法器242B被旁路,并且操作数选择逻辑电路1898将输出203B的扩展形式提供给窄多路复用器1896B,以提供给窄加法器244B。
对于另一示例,如果NPU 126处于宽配置并且指令指示ALU 204执行数据字的累加,则宽乘法器242A被旁路,并且操作数选择逻辑电路1898将输出209A和209B的串联提供给宽多路复用器1896A,以提供给宽加法器244A。然而,如果NPU 126处于窄配置并且指令指示ALU 204执行数据字的累加,则宽乘法器242A被旁路,并且操作数选择逻辑电路1898将输出209A的扩展形式提供给宽多路复用器1896A,以提供给宽加法器244A;窄乘法器242B被旁路,并且操作数选择逻辑电路1898将输出209B的扩展形式提供给窄多路复用器1896B,以提供给窄加法器244B。权重/数据字的累加可用于执行在一些人工神经网络应用(例如图像处理)的池化层中使用的求均值运算。
优选地,NPU 126还包括用于旁路宽加法器244A的第二宽多路复用器(未示出),以便于在宽配置中以宽数据/权重字加载宽累加器202A或者在窄配置中以扩展窄数据/权重字加载宽累加器202A,还包括用于旁路窄加法器244B的第二窄多路复用器(未示出),以便于在窄配置中以窄数据/权重字加载窄累加器202B。优选地,ALU 204还包括接收相应累加器值217A/217B和相应多路复用器1896A/1896B输出的宽和窄比较器/多路复用器组合(未示出),以选择累加器值217A/217B与数据/权重字209A/B/203A/B中的最大值,这是在一些人工神经网络应用的池化层中使用的操作,如下面例如关于图27和28更详细描述的。另外,操作数选择逻辑电路1898被配置为提供零值操作数(用于与零相加或用于清零累加器)并且提供一值操作数(用于乘以1)。
窄AFU 212B接收窄累加器202B的输出217B并对其执行激活函数以生成窄结果133B,宽AFU 212A接收宽累加器202A的输出217A并对其执行激活函数以生成宽结果133A。当NPU 126处于窄配置时,宽AFU 212A相应地考虑宽累加器202A的输出217A,并对其执行激活函数以生成窄结果,例如8位,例如如下面关于图29A至30更详细描述的。
从上述说明可以观察到,有利地,当处于窄配置时,单个NPU 126有效地作为两个窄NPU操作,因此对于较小的字,提供大约高达两倍于当处于宽配置时的吞吐量。例如,假设具有1024个神经元的神经网络层,每个神经元从前一层接收1024个窄输入(并且具有窄权重字),导致1兆连接。与具有宽配置中的512个NPU 126的NNU 121相比,具有窄配置中的512个NPU 126的NNU 121(1024窄NPU)能够在大约一半的时间(大约1026个时钟对514个时钟)中处理四倍的连接数量(1兆连接对256K连接),尽管是窄字而不是宽字。
在一个实施例中,图18的动态可配置NPU 126包括类似于多路复用寄存器208A和208B的3-输入多路复用寄存器,替代寄存器205A和205B,以实现用于从权重RAM 124接收的权重字行的旋转器,有点类似于关于图7的实施例所描述的方式,但是以如关于图18所描述的动态可配置方式。
现在参考图19,示出了例示根据图18的实施例的图1的NNU 121的N个NPU 126的2N个多路复用寄存器208A/208B的布置的实施例的框图,以说明它们作为用于从图1的数据RAM 122接收的一行数据字207的旋转器的操作。在图19的实施例中,N是512,使得NNU 121具有1024个多路复用寄存器208A/208B,表示为0至511,对应于512个NPU 126和实际上1024个窄NPU,如图所示。NPU126内的两个窄NPU表示为A和B,并且在每个多路复用寄存器208内,示出了对应的窄NPU的指定。更具体地,NPU126 0的多路复用寄存器208A被指定为0-A,NPU126 0的多路复用寄存器208B被指定为0-B,NPU126 1的多路复用寄存器208A被指定为1-A,NPU126 1的多路复用寄存器208B被指定为1-B,NPU 126 511的多路复用寄存器208A被指定为511-A,并且NPU 126 511的多路复用寄存器208B被指定为0-B,它们的值也对应于下面描述的图21的窄NPU。
每个多路复用寄存器208A接收数据RAM 122的D行中的一行的其对应的窄数据字207A,每个多路复用寄存器208B接收数据RAM 122的D行中的一行的其对应的窄数据字207B。即,多路复用寄存器0A接收数据RAM 122行的窄数据字0,多路复用寄存器0B接收数据RAM 122行的窄数据字1,多路复用寄存器1A接收数据RAM 122的窄数据字2,多路复用寄存器1B接收数据RAM 122行的窄数据字3,依此类推,直至多路复用寄存器511A接收数据RAM122行的窄数据字1022,多路复用寄存器511B接收数据RAM 122行的窄数据字1023。另外,多路复用寄存器1A在其输入端211A上接收多路复用寄存器0A的输出209A,多路复用寄存器1B在其输入端211B上接收多路复用寄存器0B的输出209B,依此类推,直至多路复用寄存器511A,它在其输入端211A上接收多路复用寄存器510A的输出209A,和多路复用寄存器511B,它在其输入端211B上接收多路复用寄存器510B的输出209B,多路复用寄存器0A在其输入端211A上接收多路复用寄存器511A的输出209A,多路复用寄存器0B在其输入端211B上接收多路复用寄存器511B的输出209B。多路复用器208A/208B中的每一个接收控制输入213,其控制是选择数据字207A/207B还是旋转输入211A/211B或旋转输入1811A/1811B。最后,多路复用寄存器1A在其输入端1811A上接收多路复用寄存器0B的输出209B,多路复用寄存器1B在其输入端1811B上接收多路复用寄存器1A的输出209A,依此类推,直至多路复用寄存器511A,它在其输入端1811A上接收多路复用寄存器510B的输出209B,和多路复用寄存器511B,它在其输入端1811B上接收多路复用寄存器511A的输出209A,多路复用寄存器0A在其输入端1811A上接收多路复用寄存器511B的输出209B,多路复用寄存器0B在其输入端1811B上接收多路复用寄存器0A的输出209A。多路复用寄存器208A/208B中的每一个接收控制输入213,其控制是选择数据字207A/207B还是旋转输入211A/211B或旋转输入1811A/1811B。如下面更详细地描述的,在一种操作模式中,在第一时钟周期上,控制输入213控制多路复用寄存器208A/208B中的每一个选择数据字207A/207B用于存储在寄存器中并用于随后提供给ALU 204;在随后的时钟周期(例如,如上所述的M-1个时钟周期)期间,控制输入213控制多路复用寄存器208A/208B中的每一个以选择旋转输入1811A/1811B用于存储在寄存器中并用于随后提供给ALU204。
现在参考图20,示出了例示用于存储在根据图18的实施例的具有NPU 126的图1的NNU 121的程序存储器129中并由NNU 121执行的程序的表。图20的示例性程序在许多方面类似于图4的程序。但现在将说明区别。在地址0的初始化NPU指令指定NPU 126将处于窄配置。另外,地址2处的乘法-累加旋转指令指定1023的计数,并且需要1023个时钟周期,如图所示。这是因为图20的示例有效地假设一层的1024个窄(例如,8位)神经元(NPU),每个神经元具有来自前一层的1024个神经元的1024个连接输入,总共1024K个连接。每个神经元从每个连接输入接收8位数据值,并将8位数据值乘以适当的8位权重值。
现在参考图21,示出了例示由包括以窄配置操作的图18的NPU 126的NNU121执行图20的程序的时序图。图21的时序图在许多方面类似于图5的时序图;但现在将说明区别。
在图21的时序图中,NPU 126处于窄配置,因为在地址0处的初始化NPU指令将它们初始化为窄配置。因此,512个NPU 126有效地作为1024个窄NPU(或神经元)操作,其在列中指定为NPU 0-A和NPU 0-B(NPU 126 0的两个窄NPU)、NPU 1-A和NPU 1-B(NPU126 1的两个窄NPU),依此类推,直至NPU511-A和NPU511-B(NPU126 511的两个窄NPU)。为了说明的简单和清楚,仅示出了用于窄NPU 0-A、0-B和511-B的操作。由于地址2处的乘法-累加旋转指定需要1023个时钟的1023计数的事实,图21的时序图的行包括直到时钟周期1026。
在时钟0,1024个NPU中的每一个执行图4的初始化指令,其在图5中通过向累加器202分配零值来示出。
在时钟1,1024个窄NPU中的每一个执行图20的地址1处的乘法-累加指令。窄NPU0-A用数据RAM 122行17窄字0和权重RAM 124行0窄字0的乘积累加累加器202A值(其为零);窄NPU 0-B用数据RAM 122行17窄字1和权重RAM 124行0窄字1的乘积累加累加器202B值(其为零);依此类推,直至窄NPU 511-B用数据RAM 122行17窄字1023和权重RAM 124行0窄字1023的乘积累加累加器202B值(其为零),如图所示。
在时钟2,1024个窄NPU中的每一个执行图20的地址2处的乘法-累加旋转指令的第一次迭代。窄NPU 0-A用从窄NPU 511-B的多路复用寄存器208B输出端209B接收的旋转窄数据字1811A(其是从数据RAM 122接收的窄数据字1023)和权重RAM 124行1窄字0的乘积累加累加器202A值217A;窄NPU0-B用从窄NPU 0-A的多路复用寄存器208A输出端209A接收的旋转窄数据字1811B(其是从数据RAM 122接收的窄数据字0)和权重RAM 124行1窄字1的乘积累加累加器202B值217B;依此类推,直至窄NPU 511-B用从窄NPU511-A的多路复用寄存器208A输出端209A接收的旋转窄数据字1811B(其是从数据RAM 122接收的窄数据字1022)和权重RAM 124行1窄字1023的乘积累加累加器202B值217B,如图所示。
在时钟3,1024个窄NPU中的每一个执行图20的地址2处的乘法-累加旋转指令的第二次迭代。窄NPU 0-A用从窄NPU 511-B的多路复用寄存器208B输出端209B接收的旋转窄数据字1811A(其是从数据RAM 122接收的窄数据字1022)和权重RAM 124行2窄字0的乘积累加累加器202A值217A;窄NPU0-B用从窄NPU 0-A的多路复用寄存器208A输出端209A接收的旋转窄数据字1811B(其是从数据RAM 122接收的窄数据字1023)和权重RAM 124行2窄字1的乘积累加累加器202B值217B;依此类推,直至窄NPU 511-B用从窄NPU511-A的多路复用寄存器208A输出端209A接收的旋转窄数据字1811B(其是从数据RAM 122接收的窄数据字1021)和权重RAM 124行2窄字1023的乘积累加累加器202B值217B,如图所示。如图21的省略号所示,这对于随后的1021个时钟周期中的每一个继续,直到……
在时钟1024,1024个窄NPU中的每一个执行图20的地址2处的乘法-累加旋转指令的第1023次迭代。窄NPU 0-A用从窄NPU 511-B的多路复用寄存器208B输出端209B接收的旋转窄数据字1811A(其是从数据RAM 122接收的窄数据字1)和权重RAM 124行1023窄字0的乘积累加累加器202A值217A;NPU 0-B用从NPU 0-A的多路复用寄存器208A输出端209A接收的旋转窄数据字1811B(其是从数据RAM 122接收的窄数据字2)和权重RAM 124行1023窄字1的乘积累加累加器202B值217B;依此类推,直至NPU 511-B用从NPU511-A的多路复用寄存器208A输出端209A接收的旋转窄数据字1811B(其是从数据RAM 122接收的窄数据字0)和权重RAM 124行1023窄字1023的乘积累加累加器202B值,如图所示。
在时钟1025,1024个窄NPU中的每一个的AFU 212A/212B执行图20的地址3处的激活函数指令。最后,在时钟1026,1024个窄NPU中的每一个执行图20的地址4处的写AFU输出指令,通过将其窄结果133A/133B回写到数据RAM 122的行16的相应窄字,即,NPU 0-A的窄结果133A被写入数据RAM122的窄字0,NPU 0-B的窄结果133B被写入数据RAM 122的窄字1,依此类推,直至NPU 511-B的窄结果133被写入数据RAM 122的窄字1023。以上相对于图21说明的操作也在图22中以框图形式示出。
现在参考图22,示出了例示包括用以执行图20的程序的图18的NPU 126的图1的NNU 121的框图。NNU 121包括512个NPU 126,即1024个窄NPU,接收其地址输入123的数据RAM 122和接收其地址输入125的权重RAM 124。尽管未示出,但在时钟0上,1024个窄NPU执行图20的初始化指令。如图所示,在时钟1上,将行17的1024个8位数据字从数据RAM 122中读出并提供给1024个窄的NPU。在时钟1至1024,将行0至1023的1024个8位权重字分别从权重RAM 124中读出并提供给1024个窄的NPU。尽管未示出,但在时钟1上,1024个窄NPU对加载的数据字和权重字执行它们各自的乘法累加运算。在时钟2至1024上,1024个窄NPU的多路复用寄存器208A/208B作为1024个8位字旋转器操作以将数据RAM 122的行17的先前加载的数据字旋转到相邻的窄NPU,窄NPU对相应的旋转数据窄字和从权重RAM 124加载的相应窄权重字执行乘法-累加运算。尽管未示出,但是在时钟1025上,1024个窄AFU212A/212B执行激活指令。在时钟1026上,1024个窄NPU将它们各自的1024个8位结果133A/133B回写到数据RAM 122的行16。
如可以观察到的,图18的实施例可能优于图2的实施例,例如,因为它为程序员提供了执行计算的灵活性,即,当要被建模的特定应用需要较大精度量时使用宽数据和权重字(例如,16位),以及当应用需要较小精度量时使用窄数据和权重字(例如,8位)。从一个角度来看,图18的实施例以额外的窄元件(例如,多路复用寄存器208B、寄存器205B、窄ALU204B、窄累加器202B、窄AFU 212B)的代价(这是NPU 126的面积增加大约50%)提供了对于窄数据应用的图2的实施例的两倍吞吐量。
三模式NPU
现在参考图23,示出了例示根据替代实施例的图1的动态可配置NPU 126的框图。图23的NPU 126不仅可配置为宽配置和窄配置,而且可配置为本文中称为“漏斗”配置的第三配置。图23的NPU 126在许多方面类似于图18的NPU126。然而,图18的宽加法器244A在图23的NPU 126中被替换为接收第三加数2399的3-输入宽加法器2344A,第三加数2399是窄多路复用器1896B的输出的扩展形式。用于操作具有图23的NPU 126的NNU 121的程序在大多数方面与图20的程序类似。然而,地址0处的初始化NPU指令将NPU 126初始化为漏斗配置,而不是窄配置。另外,地址2处的乘法-累加旋转指令的计数为511而不是1023。
当在漏斗配置中时,NPU 126当在执行诸如图20的地址1处的乘法-累加指令时类似于处于窄配置时操作,因为其接收两个窄数据字207A/207B和两个窄权重字206A/206B;宽乘法器242A将数据字209A和权重字203A相乘以生成宽多路复用器1896A选择的乘积246A;窄乘法器242B将数据字209B和权重字203B相乘以生成窄多路复用器1896B选择的乘积246B。然而,宽加法器2344A将乘积246A(由宽多路复用器1896A选择)和乘积246B/2399(由宽多路复用器1896B选择)加到宽累加器202A值217A,窄加法器244B和窄累加器202B不运行。此外,当在漏斗配置中时,当执行诸如图20的地址2的乘法-累加旋转指令时,控制输入213使得多路复用寄存器208A/208B旋转两个窄字(例如,16位),即多路复用寄存器208A/208B选择它们各自的211A/211B输入,就好像它们处于宽配置中。然而,宽乘法器242A将数据字209A和权重字203A相乘以生成宽多路复用器1896A选择的乘积246A;窄乘法器242B将数据字209B和权重字203B相乘以生成窄多路复用器1896B选择的乘积246B;宽加法器2344A将乘积246A(由宽多路复用器1896A选择)和乘积246B/2399(由宽多路复用器1896B选择)加到宽累加器202A值217A,窄加法器244B和窄累加器202B不运行,如上所述。最后,当在漏斗配置中时,当执行诸如图20的地址3的激活函数指令时,宽AFU 212A对所得到的和215A执行激活函数以生成窄结果133A,并且窄AFU 212B不运行。因此,只有A个窄NPU生成窄结果133A,而由B个窄NPU生成的窄结果133B无效。因此,回写的结果行(例如,到行16,如在图20的地址4的指令)包括空洞,因为只有窄结果133A有效,而窄结果133B无效。因此,在概念上,每个时钟周期每个神经元(图23的NPU 126)处理两个连接数据输入,即,通过用它们各自的权重乘以两个窄数据字,并且累加两个乘积,这与图2和18的实施例相反,图2和18的实施例每一个在每个时钟周期处理单个连接数据输入。
如相对于图23的实施例可以观察到的,产生并回写到数据RAM 122或权重RAM 124的结果字(神经元输出)的数量是接收的数据输入(连接)数量的平方根的一半,并且回写的结果行具有空洞,即,每隔一个窄字结果是无效的,更具体地,B个窄NPU结果是无意义的。因此,图23的实施例在具有两个连续层的神经网络中可能特别有效,其中,例如第一层具有两倍于第二层的神经元(例如,第一层具有完全连接到第二层512个神经元的1024个神经元)。此外,如果必要的话,在NNU 121执行与数据RAM 122和/或权重RAM 124的其它行相关联的其他计算时,其他执行单元112(例如,媒体单元,例如x86AVX单元)可以对分散的结果行(即,具有空洞)执行压缩(pack)操作以使其紧凑(即,没有空洞)以用于随后的计算中。
混合NNU操作;卷积和池化能力
根据本文描述的实施例的NNU 121的优点在于,NNU 121能够以类似于协处理器的方式同时操作,因为它执行其自己的内部程序,并以类似于处理器的执行单元的方式操作,因为它执行发布给它的架构指令(或从其转换的微指令)。架构指令是由包括NNU 121的处理器执行的架构程序。以此方式,NNU 121以混合方式操作,这是有利的,因为它提供了维持NNU 121的高利用率的能力。例如图24至26示出了NNU 121执行卷积运算的操作,其中NNU121被高度利用,图27至28示出了NNU 121执行池化操作的操作,这些是卷积层和池化层以及其他数字数据计算应用例如图像处理(例如,边缘检测、锐化、模糊化、识别/分类)所需要的。然而,NNU 121的混合操作不限于执行卷积或池化操作,而是混合特征可以用于执行其他操作,例如如上关于图4至13所述的经典神经网络乘法-累加和激活函数操作。也就是说,处理器100(更具体地,保留站108)向NNU 121发出MTNN 1400和MFNN 1500指令,作为响应,NNU 121将数据写入存储器122/124/129,并且从存储器122/124读取由NNU 121写入那里的结果,同时NNU 121响应于由处理器100(经由MTNN 1400指令)写入程序存储器129的执行程序来读取和写入存储器122/124/129。
现在参考图24,示出了例示由图1的NNU 121用来执行卷积运算的数据结构的示例的框图。框图包括卷积核2402、数据阵列2404以及图1的数据RAM 122和权重RAM 124。优选地,数据阵列2404(例如,图像像素的)保存在附接到处理器100的系统存储器(未示出),并由执行MTNN指令1400的处理器100加载到NNU 121的权重RAM 124中。卷积运算是将第一矩阵与第二矩阵卷积的运算,第二矩阵在本文中被称为卷积核。如在本公开内容的语境中所理解的,卷积核是系数的矩阵,其也可以被称为权重、参数、元素或值。优选地,卷积核2042是由处理器100执行的架构程序的静态数据。
数据阵列2404是数据值的二维阵列,每个数据值(例如,图像像素值)是数据RAM122或权重RAM 124的字的大小(例如,16位或8位)。在该示例中,数据值是16位字,NNU 121被配置为512个宽配置NPU 126。另外,在该实施例中,NPU 126包括用于从权重RAM 124接收权重字206的多路复用寄存器,例如图7的多路复用寄存器705,以便执行从权重RAM 124接收的数据值行的集体旋转器操作,如下面更详细描述的。在该示例中,数据阵列2404是2560列×1600行像素阵列。当架构程序将数据阵列2404与卷积核2402卷积时,其将数据阵列2404分成20个块,每个块是512×400数据矩阵2406,如图所示。
在该示例中,卷积核2042是系数或权重或参数或元素的3×3矩阵。第一行系数表示为C0,0;C0,1和C0,2;第二行系数表示为C1,0;C1,1和C1,2;第三行系数表示为C2,0;C2,1和C2,2。例如,可以用于执行边缘检测的卷积核具有以下系数:0、1、0、1、-4、1、0、1、0。对于另一个示例,可以用于高斯模糊图像的卷积核具有以下系数:1、2、1、2、4、2、1、2、1。在此情况下,通常对最终累加值执行除法,其中,除数是卷积核2042的元素的绝对值的和,在该示例中为16。对于另一个示例,除数是卷积核2042的元素的数量。对于另一个示例,除数是将卷积压缩回期望的值范围内的值,除数是从卷积核2042的元素的值、期望的范围以及被卷积的矩阵的输入值的范围确定的。
如图24所示并且相关于图25更详细地描述的,架构程序用卷积核2042的系数写入数据RAM 122。优选地,以行优先顺序用卷积核2402的不同元素写入数据RAM 122的九个(卷积核2402中元素的数量)连续行中的每一个的所有字。即,用第一系数C0,0写入一行的每个字;用第二系数C0,1写入下一行;用第三系数C0,2写入下一行;用第四系数C1,0写入下一行;依此类推,直到用第九系数C2,2写入第九行的每个字,如图所示。为了卷积数据阵列2404的块的数据矩阵2406,NPU 126按顺序重复读取保存卷积核2042系数的数据RAM 122的九行,如下面特别是相关于图26A更详细地描述的。
如图24所示并且相关于图25更详细地描述的,架构程序用数据矩阵2406的值写入权重RAM 124。当NNU程序执行卷积时,它将所得到的矩阵回写到权重RAM 124。优选地,架构程序将第一数据矩阵2406写入权重RAM 124并启动NNU 121,并且当NNU 121利用卷积核2042卷积第一数据矩阵2406时,架构程序将第二数据矩阵2406写入权重RAM 124,使得一旦NNU 121完成第一数据矩阵2406的卷积,NNU 121就可以开始卷积第二数据矩阵2406,如关于图25更详细地描述的。以此方式,架构程序在权重RAM 124的两个区域之间来回往复,以便保持充分利用NNU 121。因此,图24的示例示出了对应于占据权重RAM 124的行0到399的第一块的第一数据矩阵2406A,以及对应于占据权重RAM 124的行500到899的第二块的第二数据矩阵2406B。此外,如图所示,NNU 121将卷积的结果回写到权重RAM 124的行900-1299和1300-1699,架构程序随后从权重RAM 124读出它。保存在权重RAM 124中的数据矩阵2406的数据值被表示为“Dx,y”,其中,“x”是权重RAM 124的行号,“y”是权重RAM 124的字或列号。因此,例如行399中的数据字511在图24中表示为D399,511,其由NPU 511的多路复用寄存器705接收。
现在参考图25,示出了图1的处理器100执行架构程序的操作的流程图,该架构程序使用NNU 121来执行卷积核2042与图24的数据阵列2404的卷积。流程在框2502开始。
在框2502处,处理器100(即,在处理器100上运行的架构程序)以关于图24所示和所述的方式将图24的卷积核2042写入数据RAM 122。另外,架构程序将变量N初始化为值1。变量N表示由NNU 121处理的数据阵列2404的当前块。另外,架构程序将变量NUM_CHUNKS初始化为值20。流程进行到框2504。
在框2504处,处理器100将用于块1的数据矩阵2406写入权重RAM 124,如图24所示(例如,块1的数据矩阵2406A)。流程进行到框2506。
在框2506处,处理器100使用MTNN 1400指令来将卷积程序写入NNU 121程序存储器129,所述MTNN 1400指令指定用于写入程序存储器129的功能1432。然后,处理器100使用指定用于开始执行程序的功能1432的MTNN 1400指令启动NNU卷积程序。相关于图26A更详细地描述NNU卷积程序的示例。流程进行到判定框2508。
在判定框2508处,架构程序确定变量N的值是否小于NUM_CHUNKS。如果是,则流程进行到框2512;否则,流程进行到框2514。
在框2512处,处理器100将用于块N+1的数据矩阵2406写入权重RAM124,如图24所示(例如,块2的数据矩阵2406B)。因此,有利地,在NNU 121对当前块执行卷积的同时,架构程序将用于下一个块的数据矩阵2406写入权重RAM 124,使得一旦当前块的卷积完成,即,写入权重RAM 124,NNU 121就可以立即开始对下一个块执行卷积。流程前进到框2514。
在框2514处,处理器100确定当前运行的NNU程序(在块1的情况下在框2506处开始,在块2-20的情况下在框2518处开始)已经完成。优选地,处理器100通过执行用于读取NNU 121状态寄存器127的MFNN 1500指令来来确定这一点。在替代实施例中,NNU 121生成中断以指示其已经完成卷积程序。流程进行到判定框2516。
在判定框2516处,架构程序确定变量N的值是否小于NUM_CHUNKS。如果是,则流程进行到框2518;否则,流程进行至步骤2522。
在框2518处,处理器100更新卷积程序,使得其可以卷积块N+1。更具体地,处理器100将地址0处的初始化NPU指令的权重RAM 124行值更新为数据矩阵2406的第一行(例如,对于数据矩阵2406A为行0或对于数据矩阵2406B为行500)并更新输出行(例如,为900或1300)。然后,处理器100启动更新的NNU卷积程序。流程进行到框2522。
在框2522处,处理器100从用于块N的权重RAM 124读取NNU卷积程序的结果。流程进行到判定框2524。
在判定框2524处,架构程序确定变量N的值是否小于NUM_CHUNKS。如果是,则流程进行到框2526;否则,流程结束。
在框2526处,架构程序将N增加1。流程返回到判定框2508。
现在参考图26A,示出了执行数据矩阵2406与图24的卷积核2042的卷积并将其回写到权重RAM 124的NNU程序的程序列表。程序通过地址1到9的指令的循环体循环多次。在地址0的初始化NPU指令指定每个NPU 126执行循环体的次数,在图26A的例子中该次数具有循环计数值400,对应于图24的数据矩阵2406中的行数,并且在循环结束处(在地址10)的循环指令递减当前循环计数值,如果结果非零,则导致控制以返回到循环体的顶部(即,到地址1处的指令)。初始化NPU指令还将累加器202清零。优选地,地址10处的循环指令也将累加器202清零。可替换地,如上所述,地址1处的乘法-累加指令可以指定将累加器202清零。
对于程序的循环体的每次执行,512个NPU 126同时执行3×3卷积核2402与数据矩阵2406的512个相应的3×3子矩阵的512个卷积。卷积是卷积核2042的元素及其各自子矩阵的相应元素的九个乘积的和。在图26A的实施例中,512个相应3×3子矩阵中的每一个的原点(中心元素)是图24的数据字Dx+1,y+1,其中,y(列号)是NPU 126的号,x(行号)是由图26A的程序的地址1处的乘法-累加指令读取的当前权重RAM 124行号(同样,行号由地址0处的初始化NPU指令初始化,在地址3和5的每个乘法-累加指令处递增,并由地址9处的递减指令更新)。因此,对于程序的每个循环,512个NPU 126计算512个卷积,并将512个卷积结果回写到权重RAM 124的指定行。在本说明书中,为简单起见,忽略边缘处理,但应注意,NPU 126的集体旋转特征的使用将导致两个列从数据矩阵2406的一个垂直边缘(例如,在图像处理的情况下的图像的垂直边缘)环绕到另一个垂直边缘(例如,从左边缘到右边缘,或反之亦然)。现在将说明循环体。
在地址1处是指定数据RAM 122的行0并隐含地使用当前权重RAM 124行的乘法-累加指令,其优选地保存在定序器128中(并且对于第一次通过循环体,其由地址0处的指令初始化为0)。即,地址1处的指令使每个NPU126从数据RAM 122的行0读取其相应的字,并从当前权重RAM 124行读取其相应的字,并对这两个字执行乘法-累加运算。因此,例如,NPU 5将C0,0和Dx,5相乘(其中,“x”是当前权重RAM 124行),将结果加到累加器202的值217,并将总和写回到累加器202。
在地址2处是乘法-累加指令,其指定递增数据RAM 122行(即,到行1),然后在递增的地址处从数据RAM 122读取行。该指令还指定将每个NPU 126的多路复用寄存器705中的值旋转到相邻的NPU 126,在此情况下,该值是响应于地址1处的指令,刚刚从权重RAM 124读取的数据矩阵2406值的行。在图24至图26的实施例中,NPU 126被配置为将多路复用寄存器705的值向左旋转,即从NPU J向NPU J-1旋转,而不是如上相关于图3、7和19所述的从NPUJ向NPU J+1旋转。应当理解,在NPU 126被配置为向右旋转的实施例中,架构程序可以以不同的顺序(例如,围绕其中心列旋转)将卷积核2042的系数值写入数据RAM 122中,以便实现类似的卷积结果。此外,架构程序可以根据需要执行卷积核2042的附加预处理(例如,转置)。另外,指令指定计数值2。因此,地址2处的指令导致NPU 126的每个从数据RAM 122的行1读取其对应的字,并将旋转的字接收到多路复用寄存器705中,对两个字执行乘法-累加运算。由于计数值为2,所以指令还使NPU 126的每个重复刚刚说明的操作。即,定序器128使数据RAM 122行地址123递增(即,为行2),并且每个NPU 126从数据RAM 122的行2读取其相应的字,并将旋转的字接收到多路复用寄存器705中,对两个字执行乘法-累加运算。因此,例如,假设当前权重RAM 124的行是27,在执行地址2处的指令之后,NPU 5将C0,1和D27,6的乘积以及C0,2和D27,7的乘积累加到其累加器202中。因此,在地址1和2处的指令完成之后,C0,0和D27,5的乘积、C0,1和D27,6的乘积以及C0,2和D27,7的乘积将与来自先前通过循环体的所有其它累加值一起累加到累加器202中。
地址3和4处的指令执行与地址1和2处的指令类似的操作,但借助于权重RAM 124行递增指示符而用于权重RAM 124的下一行,及用于数据RAM 122接下来的三行,即,行3至5。即,对于NPU 5,例如,在地址1到4处的指令完成之后,C0,0和D27,5的乘积、C0,1和D27,6的乘积、C0,2和D27,7的乘积、C1,0和D28,5的乘积、C1,1和D28,6的乘积以及C1,2和D28,7的乘积将与来自先前通过循环体的所有其它累加值一起累加到累加器202中。
地址5和6处的指令执行与地址3和4处的指令类似的操作,但用于权重RAM 124的下一行以及用于数据RAM 122接下来的三行,即行6至8。即,对于NPU 5,例如,在地址1至6的指令完成之后,C0,0和D27,5的乘积、C0,1和D27,6的乘积、C0,2和D27,7的乘积、C1,0和D28,5的乘积、C1,1和D28,6的乘积、C1,2和D28,7的乘积、C2,0和D29,5的乘积、C2,1和D29,6的乘积以及C2,2和D29,7的乘积将与来自先前通过循环体的所有其它累加值一起累加到累加器202中。即,在地址1至6处的指令完成之后,并且假设在循环体的开始处的权重RAM 124行是27,NPU 5例如将使用卷积核2042卷积以下3×3子矩阵:
更一般地,在地址1至6处的指令完成之后,512个NPU 126中的每一个将使用卷积核2042来卷积以下3×3子矩阵:
其中,r是循环体开始处的权重RAM 124行地址值,n是NPU 126的号。
地址7处的指令使累加器202的值217通过AFU 212。通过功能使是从数据RAM 122和权重RAM 124读取的字的大小(以位为单位)(即,在该示例中,16位)的字通过。优选地,用户可以指定输出的格式,例如,多少输出位是小数位,如下面更详细描述的。可替换地,不是指定通过激活函数,而是指定除法激活函数,其例如本文关于图29A和30所述的,例如使用图30的“除法器”3014/3016之一来将累加器202的值217除以除数。例如,在具有诸如上述高斯模糊核的第十六个系数的系数而不是通过函数的卷积核2042的情况下,在地址7处的激活函数指令可以指定除法(例如,除以16)激活函数。可替换地,架构程序可在将卷积核2042系数写入数据RAM 122之前对它们执行除以16,并相应地为卷积核2402值调整二进制小数点的位置,例如使用图29的数据二进制小数点2922,如下所述。
地址8处的指令将AFU 212的输出写入由输出行寄存器的当前值指定的权重RAM124的行,所述当前值由地址0处的指令初始化并且每次通过循环就借助指令中的递增指示符而递增。
如可从具有3×3卷积核2402的图24到26的示例中确定,NPU 126大约每三个时钟周期读取权重RAM 124以读取数据矩阵2406的一行,大约每12个时钟周期写入权重RAM 124以写入卷积结果矩阵。另外,假定包括诸如图17的缓冲器1704的写入和读取缓冲器的实施例同时与NPU 126读取和写入,处理器100读取和写入权重RAM 124,使得缓冲器1704大约每16个时钟周期执行权重RAM 124的一个写入和一个读取,以分别写入数据矩阵2406并读取卷积结果矩阵。因此,权重RAM 124的大约一半带宽由NNU 121执行卷积运算的混合方式消耗。虽然该示例包括3×3卷积核2042,但是可以采用其他大小的卷积核,例如2x2、4x4、5x5、6x6、7x7、8x8等矩阵,在此情况下,NNU程序将变化。在较大卷积核的情况下,消耗较小百分比的权重RAM 124带宽,因为NPU 126由于乘法-累加指令的旋转形式中的计数较大而以较小百分比的时间读取权重RAM 124(例如,在图26A的程序的地址2、4和6处以及更大的卷积核所需的额外的这种指令)。
可替换地,不是将卷积的结果回写到权重RAM 124的不同行(例如,900-1299和1300-1699),而是架构程序将NNU程序配置为在不再需要行之后,重写输入数据矩阵2406的行。例如,在3×3卷积核的情况下,不是将数据矩阵2406写入权重RAM 124的行0-399,而是架构程序将数据矩阵2406写入行2-401,并且NNU程序被配置为将卷积结果写入从行0开始并随每次通过循环体递增的权重RAM 124。以此方式,NNU程序仅重写不再需要的行。例如,在第一次通过循环体之后(或者更具体地在执行加载到权重RAM 124的行0中的地址1处的指令之后),现在可以重写行0中的数据,但在通过循环体的第二次通过中需要行1-3中的数据,因此不被通过循环体的第一次通过重写;类似地,在第二次通过循环体之后,现在可以重写行1中的数据,但在通过循环体的第二次通过中需要行2-4中的数据,因此不被通过循环体的第二次通过重写;依此类推。在这个实施例中,每个数据矩阵2406(块)的高度可以更大(例如,800行),导致更少的块。
可替换地,不是将卷积的结果回写到权重RAM 124,而是架构程序将NNU程序配置为将卷积的结果回写到卷积核2402上方的数据RAM 122的行(例如,行8上方),并且当NNU121写入结果时(例如,下面描述的使用图26B的最近写入的数据RAM 122的行2606的地址),架构程序从数据RAM 122读取结果。在权重RAM 124是单端口且数据RAM 122是双端口的实施例中,该替代方案可能是有利的。
从根据图24至26A的实施例的NNU 121的操作可以观察到,图26A的程序的每次执行花费大约5000个时钟周期,因此,图24的整个2560×1600数据阵列2404的卷积花费大约100,000个时钟周期,这显著小于通过常规方法执行类似任务所需的时钟周期的数量。
现在参考图26B,示出了例示根据一个实施例的图1的NNU 121的控制寄存器127的某些字段的框图。状态寄存器127包括:字段2602,其指示由NPU126最近写入的权重RAM 124的行的地址;字段2606,其指示由NPU 126最近写入的数据RAM 122的行的地址;字段2604,其指示由NPU 126最近读取的权重RAM 124的行的地址;以及字段2608,其指示由NPU 126最近读取的数据RAM 122的行的地址。这使得在处理器100上执行的架构程序能够确定NNU121在其通过读取和/或写入数据RAM 122和/或权重RAM 124推进时的进度。采用该能力以及如上所述重写输入数据矩阵(或将结果写入数据RAM 122,如上所述)的选择,图24的数据阵列2404可以被处理为512×1600的5个块而不是512×400的20个块,如下所述。处理器100从行2开始将第一512×1600块写入权重RAM 124,并且启动NNU程序(其循环计数为1600,初始化的权重RAM 124输出行为0)。当NNU 121执行NNU程序时,处理器100监视权重RAM 124输出的位置/地址,以便(1)读取(使用MFNN 1500指令)权重RAM 124的具有由NNU 121写入的有效卷积结果的行(从行0开始),以及(2)一旦已经读取有效卷积结果,就将它们写入第二512×1600数据矩阵2406(从行2开始),使得当NNU 121在第一512×1600块上完成NNU程序时,处理器100可以根据需要立即更新NNU程序,并再次启动它以处理第二512×1600块。对于剩余的三个512×1600块,该过程重复三次以实现NNU 121的高利用率。
有利地,在一个实施例中,AFU 212包括有效地执行累加器202值217的有效除法的能力,如下面特别关于图29A和29B和30更详细地描述的。例如,将累加器202值217除以16的激活函数NNU指令可以用于上述高斯模糊矩阵。
虽然在图24的示例中使用的卷积核2402是应用于整个数据阵列2404的小型静态卷积核,但是在其他实施例中,卷积核可以是具有与数据阵列2404的不同数据值相关联的唯一权重的大矩阵,例如在卷积神经网络中常见的。当以这种方式使用NNU 121时,架构程序可以交换数据矩阵和卷积核的位置,即,将数据矩阵设置在数据RAM 122并将卷积核设置在权重RAM 124中,并且可以由NNU程序的给定执行所处理的行的数量可以相对较小。
现在参考图27,示出了例示用输入数据填充的图1的权重RAM 124的示例的框图,由图1的NNU 121在该输入数据上执行池化操作。由人工神经网络的池化层执行的池化操作通过获取输入矩阵的子区域或子矩阵并计算子矩阵的最大值或平均值来降低输入数据(例如,图像或卷积图像)的矩阵的维度,最大值或平均值变为结果矩阵或池化矩阵。在图27和28的示例中,池化操作计算每个子矩阵的最大值。池化操作在例如执行对象分类或检测的人工神经网络中特别有用。通常,池化操作有效地将其输入矩阵的大小减小了所检查的子矩阵中的元素数量的因子,特别地,在每个维度中将输入矩阵减少了子矩阵的相应维度中的元素的数量。在图27的示例中,输入数据是存储在权重RAM 124的行0到1599中的宽字(例如,16位)的512×1600矩阵。在图27中,字由它们的行、列位置表示,例如,行0和列0中的字被表示为D0,0;行0和列1中的字被表示为D0,1;行0和列2中的字被表示为D0,2;依此类推,直至行0和列511中的字被表示为D0,511。类似地,行1和列0中的字被表示为D1,0;行1和列1中的字被表示为D1,1;行1和列2中的字被表示为D1,2;依此类推,直至行1和列511中的字被表示为D1,511;依此类推,直至行1599和列0中的字被表示为D1599,0;行1599和列1中的字被表示为D1599,1;行1599和列2中的字被表示为D1599,2;依此类推,直至行1599和列511中的字被表示为D1599,511。
现在参考图28,示出了执行图27的输入数据矩阵的池化操作并将其回写到权重RAM 124的NNU程序的程序列表。在图28的示例中,池化操作计算输入数据矩阵的各个4×4子矩阵的最大值。程序通过地址1到10的指令的循环体循环多次。在地址0的初始化NPU指令指定每个NPU 126执行循环体的次数,在图28的例子中该次数具有循环计数值400,在循环结束处(在地址11处)的循环指令递减当前循环计数值,如果结果为非零,则使控制返回循环体的顶部(即,返回到指令在地址1)。权重RAM 124中的输入数据矩阵被NNU程序有效地处理为四个相邻行(即,行0-3、行4-7、行8-11,依此类推,直至行1596-1599)的400个互斥组。每组四个相邻行包括128个4×4子矩阵,即,由一组的四行和四个相邻列(即列0-3、4-7、8-11,依此类推,直至列508-511)的交叉形成的元素的4×4子矩阵。在512个NPU 126中,512个NPU 126中的每一第四个NPU 126(即,128个)对相应的4×4子矩阵执行池化操作,NPU 126的其他四分之三未使用。更具体地,NPU 0、4、8,依此类推,直至NPU 508对它们各自的4×4子矩阵执行池化操作,4×4子矩阵的最左列号对应于NPU号,其下行对应于当前权重RAM124行值,它由地址0处的初始化指令初始化为零,并且在循环体的每次迭代时递增4,如下文更详细地描述。循环体的400次迭代对应于图27的输入数据矩阵的4×4子矩阵的组的数量(输入数据矩阵的1600行除以4)。初始化NPU指令还将累加器202清零。优选地,地址11处的循环指令也将累加器202清零。可替换地,地址1处的maxwacc指令指定将累加器202清零。
对于程序的循环体的每次迭代,128个使用的NPU 126同时执行输入数据矩阵的当前4行组的128个各自的4×4子矩阵的128个池化操作。更具体地,池化操作确定4×4子矩阵的十六个元素的最大值元素。在图28的实施例中,对于所使用的128个NPU 126的每个NPUy,4×4子矩阵的左下元素是图27的元素Dx,y,其中,x是循环体开始时当前权重RAM 124行号,它由图28的程序的地址1处的maxwacc指令读取(同样,行号由地址0处的初始化NPU指令初始化,并在地址3、5和7的每个maxwacc指令处递增)。因此,对于程序的每个循环,所使用的128个NPU 126将当前行组的各自128个4×4子矩阵的相应最大值元素回写到权重RAM124的指定行。现在将说明循环体。
在地址1处是隐含地使用当前权重RAM 124行的maxwacc指令,其优选地保存在定序器128中(并且对于第一次通过循环体,其由地址0处的指令初始化为零)。地址1处的指令使每个NPU126从权重RAM124的当前行读取其相应的字,将该字与累加器202的值217进行比较,并在累加器202中存储两个值中的最大值。因此,例如,NPU 8确定累加器202值217和数据字Dx,8的最大值(其中“x”是当前权重RAM 124行),并将最大值回写到累加器202。
在地址2处是指定将每个NPU 126的多路复用寄存器705中的值旋转到相邻NPU126的maxwacc指令,在此情况下,该值是响应于地址1处的指令,刚刚从权重RAM 124读取的输入数据矩阵值的行。在图27至图28的实施例中,NPU 126被配置为将多路复用寄存器705的值向左旋转,即从NPU J到NPU J-1,如上相关于图24至26所述的。此外,指令指定计数值3。因此,地址2处的指令导致每个NPU 126将旋转字接收到多路复用寄存器705中,并确定旋转字和累加器202值217中的最大值,然后再重复该操作两次。即,每个NPU 126三次将旋转字接收到多路复用寄存器705中,并且确定旋转字和累加器202值217中的最大值。因此,例如,假设循环体开始处的当前权重RAM 124行是36,则在执行地址1和2处的指令之后,NPU 8例如将在循环体开始处的累加器202及四个权重RAM 124字D36,8和D36,9和D36,10和D36,11中的最大值存储在其累加器202中。
在地址3和4处的maxwacc指令执行与地址1和2处的指令类似的操作,但借助权重RAM 124行递增指示符而用于权重RAM 124的下一行。即,假设循环体开始处的当前权重RAM124行是36,在地址1到4处的指令完成之后,NPU 8例如将循环体的开始处的累加器202及八个权重RAM 124字D36,8和D36,9和D36,10和D36,11和D37,8和D37,9和D37,10和D37,11中的最大值存储在其累加器202中。
在地址5至8处的maxwacc指令执行与地址3和4处的指令类似的操作,但用于权重RAM 124的接下来的两行。即,假设循环体开始处的当前权重RAM124行是36,在地址1至8的指令完成之后,例如,NPU 8将循环体开始处的累加器202及16个权重RAM 124字D36,8和D36,9和D36,10和D36,11和D37,8和D37,9和D37,10和D37,11和D38,8和D38,9和D38,10和D38,11和D39,8和D39,9和D39,10和D39,11中的最大值存储在其累加器202中。即,在地址1至8处的指令完成之后,并且假设循环体开始处的权重RAM 124行是36,则NPU8例如将已经确定以下4×4子矩阵的最大值:
更一般地,在地址1至8处的指令完成之后,所使用的128个NPU 126中的每一个将已经确定以下4×4子矩阵的最大值:
其中,r是循环体开始处的权重RAM 124行地址值,n是NPU 126的号。
地址9处的指令使累加器202值217通过AFU 212。通过功能使是从权重RAM 124读取的字的大小(以位为单位)(即,在该示例中,16位)的字通过。优选地,用户可以指定输出的格式,例如,多少输出位是小数位,如下面更详细描述的。
地址10处的指令将累加器202值217写入由输出行寄存器的当前值指定的权重RAM124的行,输出行寄存器的当前值由地址0处的指令初始化并借助于指令中的递增指示符而每次通过循环则递增。更具体地,地址10处的指令将累加器202的宽字(例如,16位)写入权重RAM 124。优选地,指令写入由输出二进制小数点2916指定的16位,如下面关于图29A和29B更详细地描述的。
可以观察到,通过循环体的迭代写入权重RAM 124的每一行包括具有无效数据的空洞。即,所得到的133个宽字1到3、5到7、9到11,依此类推,直至宽字509到511是无效的或未使用的。在一个实施例中,AFU 212包括多路复用器,其能够将结果压缩到行缓冲器(例如图11的行缓冲器1104)的相邻字中,用于回写到输出权重RAM 124行。优选地,激活函数指令指定每个空洞中的字的数量,空洞中的字的数量用于控制多路复用器以压缩结果。在一个实施例中,空洞的数量可以被指定为从2到6的值,以便压缩池化3×3、4×4、5×5、6×6或7×7子矩阵的输出。可替换地,在处理器100上执行的架构程序从权重RAM 124读取所得到的稀疏(即,包括空洞)结果行,并使用其它执行单元112(例如使用例如x86SSE指令的架构压缩指令的媒体单元)执行压缩功能。有利地,以类似于上述的及利用NNU 121的混合特性的那些的并发方式,在处理器100上执行的架构程序可以读取状态寄存器127,以监视权重RAM124的最近写入的行(例如,图26的字段2602)以读取所得到的稀疏行,将其压缩,并将其回写到权重RAM 124的相同行,使得其准备好用作神经网络的下一层的输入数据矩阵,例如卷积层或典型神经网络层(即,乘法-累加层)。此外,虽然说明了对4×4子矩阵执行池化操作的实施例,但是可以修改图28的NNU程序以对其它大小的子矩阵(诸如3×3、5×5、6×6或7×7子矩阵)执行池化操作。
还可以观察到,写入权重RAM 124的结果行的数量是输入数据矩阵的行数的四分之一。最后,在该示例中,不使用数据RAM 122。然而,可替换地,可以使用数据RAM 122而不是权重RAM 124来执行池化操作。
在图27和图28的示例中,池化操作计算子区域的最大值。然而,可以修改图28的程序以通过例如用sumwacc指令(将权重字与累加器202值217求和)替换maxwacc指令并改变在地址9处的激活函数指令以将累加结果除以(优选地通过倒数乘法,如下所述)每个子区域的元素数量(在该示例中为16),来计算子区域的平均值。
从根据图27和28的实施例的NNU 121的操作可以观察到,图28的程序的每次执行花费大约6000个时钟周期来执行图27的整个512×1600数据矩阵的池化操作,这显著小于通过常规方法执行类似任务所需的时钟周期的数量。
可替换地,不是将池化操作的结果回写到权重RAM 124,而是架构程序将NNU程序配置为将结果回写到数据RAM 122的行,并且架构程序在NNU 121写入结果(例如,使用图26B的最近写入的数据RAM 122行2606的地址)时从数据RAM 122读取结果。在权重RAM 124是单端口且数据RAM 122是双端口的实施例中,该替代方案是有利的。
具有用户提供的二进制小数点的定点算法,全精度定点累加,用户指定的倒数值,
累加器值的随机舍入和可选择的激活/输出函数
一般来说,在数字计算设备中执行算术的硬件单元可以被划分为通常所称的“整数”单元和“浮点”单元,因为它们分别对整数和浮点数执行算术运算。浮点数具有量值(或尾数)和指数,通常具有符号。指数是相对于量值的小数点(通常为二进制小数点)的位置的指示。相比之下,整数没有指数,而只有一个量值,通常具有符号。浮点单元的优点在于,它使得程序员能够使用可以在非常大的范围内取不同值的数字,硬件负责根据需要调整数字的指数值,程序员不必这样做。例如,假设两个浮点数0.111x 1029和0.81x 1031相乘。(在这里使用十进制或者基数为10的示例,虽然浮点数单位最常使用基数为2的浮点数)。浮点单元自动负责乘以尾数,添加指数,然后将结果归一化回为值.8991x 1059。对于另一个示例,假设相同的两个浮点数相加。浮点单元自动负责在尾数的二进制小数点相加之前对准它们,以生成值为.81111x 1031的结果和。
然而,与浮点单元相关联的复杂性和随之而来的大小、功率消耗和每指令的时钟和/或延长的循环时间的增加是众所周知的。实际上,由于这个原因,许多设备(例如,嵌入式处理器、微控制器和相对低成本和/或低功率微处理器)不包括浮点单元。从上面的示例可以观察到,浮点单元的一些复杂性包括:执行与浮点加法和乘法/除法相关联的指数计算的逻辑(加法器用于加/减操作数的指数以产生用于浮点乘法/除法的结果指数值,减法器用于确定操作数的减法指数以确定用于浮点加法的二进制小数点对准移位量)、完成用于浮点加法的尾数的二进制小数点对准的移位器、归一化浮点结果的移位器。另外,流程进行到块单元通常需要:执行浮点结果的舍入的逻辑、在整数和浮点格式之间或在不同浮点精度格式之间转换的逻辑(例如,扩展精度、双精度、单精度、半精度)、前导零和前导一检测器、以及处理特殊浮点数(如非正规数、NAN和无穷大)的逻辑。
此外,存在的缺点是浮点单元正确性验证的显著复杂性,主要是由于必须验证的设计的数量空间增大,这可能延长产品开发周期和上市时间。此外,如上所述,浮点算术意味着对于计算中涉及的每个浮点数的存储和使用单独的尾数字段和指数字段,这可以增加所需的储存量和/或在给定存储整数的相等储存量的情况下降低精度。通过使用对整数执行算术运算的整数单元来避免这些缺点中的许多缺点。
通常,程序员编写处理小数(即,不是整数的数)的程序。程序可以在不具有浮点单元的处理器上运行,或者如果它们具有,则由处理器的整数单元执行的整数指令可以更快。为了利用与整数单元相关的潜在性能优点,程序员采用通常所说的对定点数的定点算法。这种程序包括在整数单元上执行以处理整数数字或整数数据的指令。软件知道数据是小数的,并且包括对整数数据执行运算以处理数据实际上是小数的事实(例如,对准移位)的指令。基本上,定点软件手动执行浮点单元执行的一些或全部功能。
如本公开内容中所使用的,“定点”数(或值或操作数或输入或输出)是其存储位被理解为包括表示定点数的小数部分的位(本文中称为“小数位”)的数。定点数的存储位包括在存储器或寄存器中,例如存储器或寄存器中的8位或16位字。此外,定点数的存储位全部用于表示量值,在一些情况下,位用于表示符号,但是定点数的存储位都不用于表示数的指数。此外,定点数的小数位的数量或二进制小数点位置指定于与定点数的存储位不同的存储器中,并且对于定点数所属的定点数集合,例如处理单元阵列的输入操作数、累加值或输出结果的集合,以共享或全局方式指示小数位的数量或二进制小数点位置。
有利地,本文说明了其中ALU是整数单元,但激活函数单元包括定点算术硬件辅助或加速的实施例。这使得ALU部分能够更小和更快,这有助于在管芯上的给定空间内具有更多的ALU。这意味着每个管芯空间有更多的神经元,这在神经网络单元中是特别有利的。
此外,有利地,与对于每个浮点数需要指数存储位的浮点数相比,说明了定点数以存储位的数目的指示来表示的实施例,其中,存储位是用于整个数字集合的小数位,但该指示位于单个共享存储器中,其全局地指示用于整个集合(例如,一系列操作的输入集合,该系列的累加值的集合,输出集合)的所有数字的小数位的数目。优选地,NNU的用户能够指定该数字集合的小数存储位的数量。因此,应当理解,尽管在许多语境(例如,公共数学)中,术语“整数”是指有符号整数,即,不具有小数部分的数字,但是本语境中的术语“整数”可以指代具有小数部分的数字。此外,本语境中的术语“整数”旨在区别于其各自存储的位的一部分用于表示浮点数的指数的浮点数。类似地,整数算术运算(诸如由整数单元执行的整数乘法或加法或比较)假定操作数不具有指数,因此整数单元的整数元件(例如整数乘法器、整数加法器、整数比较器)不包括处理指数的逻辑,例如,不为了加法或比较运算而移动尾数以对准二进制小数点,不为乘法运算添加指数。
另外,本文描述了包括大硬件整数累加器的实施例,用以在不损失精度的情况下累加大系列的整数运算(例如,大约1000个乘法-累加数量级)。这使得NNU能够避免处理浮点数,而同时保持累加值中的完全精度,而不必由于溢出而使其饱和或导致不准确的结果。一旦该系列整数运算已经将结果累加到全精度累加器中,定点硬件辅助执行必要的缩放和饱和,以使用用户指定的累加值的小数位数量的指示和输出值中小数位的期望数量,将全精度累加值转换为输出值,如下面更详细描述的。
如下面更详细地描述的,优选地,激活函数单元可以在将累加器值从其全精度形式压缩以用作激活函数的输入或者被传递时,对累加器值选择性地执行随机舍入。最后,可以选择性地指示NPU应用不同的激活函数和/或输出由神经网络的给定层的不同需求所规定的累加器值的各种不同形式。
现在参考图29A,示出了例示图1的控制寄存器127的实施例的框图。控制寄存器127可以包括多个控制寄存器127。如图所示,控制寄存器127包括以下字段:配置2902、带符号数据2912、带符号权重2914、数据二进制小数点2922、权重二进制小数点2924、ALU函数2926、舍入控制2932、激活函数2934、倒数2942、移位量2944、输出RAM 2952、输出二进制小数点2954和输出命令2956。控制寄存器127值可以由MTNN指令1400和NNU程序的指令(例如启动指令)写入。
配置2902值指定NNU 121是处于窄配置、宽配置还是漏斗配置中,如上所述。配置2902意味着从数据RAM 122和权重RAM 124接收的输入字的大小。在窄配置和漏斗配置中,输入字的大小为窄(例如,8位或9位),而在宽配置,输入字的大小为宽(例如,12位或16位)。此外,配置2902意味着输出结果133的大小,其与输入字大小相同。
有符号数据值2912如果为真,则指示从数据RAM 122接收的数据字是有符号值,如果为假,则指示它们是无符号值。有符号权重值2914如果为真,则指示从权重RAM 124接收的权重字是有符号值,如果为假,则指示它们是无符号值。
数据二进制小数点2922值指示从数据RAM 122接收的数据字的二进制小数点的位置。优选地,数据二进制小数点2922值指示自二进制小数点的位置的右侧起的位位置的数量。也就是说,数据二进制小数点2922指示数据字的多少个最低有效位是小数位,即,在二进制小数点的右侧。类似地,权重二进制小数点2924值指示从权重RAM 124接收的权重字的二进制小数点的位置。优选地,当ALU函数2926是乘法和累加或输出累加器时,则NPU 126将保存在累加器202中的值的二进制小数点的右侧的位数确定为数据二进制小数点2922和权重二进制小数点2924的和。因此,例如,如果数据二进制小数点2922的值为5,权重二进制小数点2924的值为3,则累加器202中的值具有该二进制小数点右侧的8位。当ALU函数2926是和/最大值累加器和数据/权重字或通过数据/权重字时,NPU 126将保存在累加器202中的值的二进制小数点右侧的位数分别确定为数据/权重二进制小数点2922/2924。在下面关于图29B描述的替换实施例中,不是指定各个数据二进制小数点2922和权重二进制小数点2924,而是指定单个累加器二进制小数点2923。
ALU函数2926指定由NPU 126的ALU 204执行的函数。如上所述,ALU函数2926可以包括但不限于:将数据字209和权重字203相乘并与累加器202累加乘积;累加器202和权重字203求和;累加器202和数据字209求和;累加器202和数据字209的最大值;累加器202和权重字203的最大值;输出累加器202;使数据字209通过;使权重字203通过;输出零。在一个实施例中,ALU函数2926由NNU启动指令指定并且由ALU 204响应于执行指令(未示出)而使用。在一个实施例中,ALU函数2926由单独的NNU指令指定,例如上述乘法-累加和maxwacc指令。
舍入控制2932指定(图30的)舍入器3004使用哪种舍入形式。在一个实施例中,可以指定的舍入模式包括但不限于:不舍入、舍入到最接近和随机舍入。优选地,处理器100包括(图30的)随机位源3003,其生成随机位3005,随机位3005被采样并用于执行随机舍入以减少舍入偏差的可能性。在一个实施例中,当舍入位3005为1并且粘着位为0时,如果采样的随机位3005为真,则NPU 126上舍入(round up),如果随机位3005为假则不上舍入。在一个实施例中,随机位源3003基于处理器100的随机电特性的采样(例如半导体二极管或电阻器上的热噪声)生成随机位3005,但是可以设想其他实施例。
激活函数2934指定应用于累加器202值217的函数,以生成NPU 126的输出133。如上面和下面更详细地描述的,激活函数2934包括但不限于:S形;双曲正切;softplus;校正;除2的已指定幂;乘以用户指定的倒数值以完成有效的除法;通过全累加器;及作为规范大小通过累加器,这将在下面更详细地描述。在一个实施例中,激活函数由NNU激活函数指令指定。可替换地,激活函数由启动指令指定并响应于输出指令(例如,图4的地址4处的写AFU输出指令)而应用,在该实施例中,图4的地址3处的激活函数指令被归入输出指令。
倒数2942值指定与累加器202值217相乘以完成累加器202值217的除法的值。即,用户指定倒数2942值作为实际期望除数的倒数。这例如结合卷积和池化操作是有用的,如本文所述。优选地,用户以两部分指定倒数2942值,如下面关于图29C更详细地描述的。在一个实施例中,控制寄存器127包括使得用户能够指定借助多个内置除数值中的一个的除法的字段(未示出),所述多个内置除数值是常用卷积核的大小,例如9、25、36或49。在这个实施例中,AFU 212可以存储内置除数的倒数,用于乘以累加器202值217。
移位量2944指定AFU 212的移位器将累加器202值217向右移位以完成除以2的幂的位数。这同样结合大小为2的幂的卷积核是有用的。
输出RAM 2952值指定数据RAM 122和权重RAM 124中的哪一个接收输出结果133。
输出二进制小数点2954值指示输出结果133的二进制小数点的位置。优选地,输出二进制小数点2954指示自输出结果133的二进制小数点的位置的右侧起的位位置的数量。也就是说,输出二进制小数点2954指示输出结果133的多少个最低有效位是小数位,即,在二进制小数点的右侧。AFU 212基于输出二进制小数点2954的值(在大多数情况下还基于数据二进制小数点2922、权重二进制小数点2924、激活函数2934和/或配置2902的值)执行舍入、压缩、饱和和大小转换。
输出命令2956控制输出结果133的多个方面。在一个实施例中,AFU 212采用规范大小的概念,其是由配置2902指定的宽度的大小(以位为单位)的两倍。因此例如,如果配置2902意指从数据RAM 122和权重RAM 124接收的输入字的大小是8位,则规范大小是16位;对于另一示例,如果配置2902意指从数据RAM 122和权重RAM 124接收的输入字的大小是16位,则规范大小是32位。如本文所描述的,为了保持中间计算(例如分别1024和512个NNU乘法-累加指令)的全精度,累加器202的大小是大的(例如,窄累加器202B是28位,宽累加器202A是41位)。因此,对于激活函数2934的大多数值(除了通过全累加器以外),累加器202值217比规范大小和AFU 212(例如,下面关于图30描述的CCS 3008)更大(以位为单位),将累加器202的值217压缩到规范大小的值。输出命令2956的第一预定值指示AFU 212执行指定的激活函数2934以生成与原始输入字相同大小(即,一半的规范大小)的内部结果,并将内部结果输出作为输出结果133。输出命令2956的第二预定值指示AFU 212执行指定的激活函数2934以生成大小为原始输入字(即,规范大小)的两倍的内部结果,并且输出内部结果的下半部分作为输出结果133;输出命令2956的第三预定值指示AFU 212输出规范大小内部结果的上半部分作为输出结果133。输出命令2956的第四预定值指示AFU 212输出累加器202的原始最低有效字(其宽度由配置2902指定)作为输出结果133;第五预定值指示AFU 212输出累加器202的原始中等有效字作为输出结果133;第六预定值指示AFU 212输出累加器202的原始最高有效字作为输出结果133,如上面关于图8至10所述的。如上所述,输出全累加器202大小或规范大小的内部结果可能是有利的,例如,用于使处理器100的其他执行单元112能够执行激活函数,例如softmax激活函数。
虽然将图29A(以及图29B和29C)的字段描述为存在于控制寄存器127中,但是在其它实施例中,字段中的一个或多个可以存在于NNU 121的其他部分中。优选地,许多字段包括在NNU指令自身中并由定序器128解码以生成控制ALU 204和/或AFU 212的微操作3416(图34的)。另外,字段可以被包括在媒体寄存器118中存储的控制ALU 204和/或AFU 212的微操作3414(图34的)中。在这种实施例中,最低限度地使用初始化NNU指令,在其他实施例中消除了初始化NNU指令。
如上所述,NNU指令能够指定对存储器操作数(例如,来自数据RAM 122和/或权重RAM 124的字)或旋转的操作数(例如,来自多路复用寄存器208/705)执行ALU运算。在一个实施例中,NNU指令还可以将操作数指定为激活函数的寄存输出(例如,图30的寄存器3038的输出)。另外,如上所述,NNU指令能够指定递增数据RAM 122或权重RAM 124的当前行地址。在一个实施例中,NNU指令可以指定一最接近的有符号整数增量值,其被添加到当前行来实现递增或递减一个非一的值。
现在参考图29B,示出了例示根据替代实施例的图1的控制寄存器127的实施例的框图。图29B的控制寄存器127类似于图29A的控制寄存器127;但图29B的控制寄存器127包括累加器二进制小数点2923。累加器二进制位2923指示用于累加器202的二进制小数点的位置。优选地,累加器二进制小数点2923值指示自二进制小数点的位置的右边起的位位置的数量。换句话说,累加器二进制小数点2923指示累加器202的多少个最低有效位是小数位,即,在二进制小数点的右边。在该实施例中,明确地指定累加器二进制小数点2923,而不是如上面关于图29A的实施例所描述的那样隐含地确定。
现在参考图29C,示出了例示根据一个实施例的存储为两个部分的图29A的倒数2942的实施例的框图。第一部分2962是移位值,其指示在用户期望乘以累加器202值217的真倒数值中的消除的前导零2962的数量。前导零的数量是紧接着二进制小数点右边的连续零的数量。第二部分2694是前导零消除倒数2964值,即,除去所有前导零的真倒数值。在一个实施例中,消除的前导零2962的数量被存储为四位,前导零消除的倒数2964值被存储为8位无符号值。
为了通过示例来说明,假定用户期望累加器202值217乘以49的倒数。用13个小数位表示的49的倒数的二进制表示是0.0000010100111,其具有五个前导零。在这种情况下,用户用值5填充消除的前导零2962的数量,并用值10100111填充前导零消除倒数2964。在(图30的)倒数乘法器“除法器A”3014将累加器202值217和前导零消除倒数2964值相乘后,它将所得到的乘积右移了消除前导零2962的数量。这个实施例可以有利地以相对少量的位实现高精度代表倒数2942值。
现在参考图30,示出了更详细地例示图2的AFU 212的实施例的框图。AFU212包括:图1的控制寄存器127;接收累加器202值217的正型转换器(PFC)及输出二进制小数点对准器(OBPA)3002;舍入器3004,其接收累加器202值217和由OBPA 3002移出的位的数量的指示;生成随机位3005的随机位源3003,如上所述;接收PFC及OBPA 3002的输出和舍入器3004的输出的第一多路复用器3006;接收第一多路复用器3006的输出的到规范尺寸压缩器(CCS)及饱和器3008;接收CCS及饱和器3008的输出的位选择器及饱和器3012;接收CCS及饱和器3008的输出的校正器3018;接收CCS及饱和器3008的输出的倒数乘法器3014;接收CCS及饱和器3008的输出的右移位器3016;接收位选择器及饱和器3012的输出的双曲正切(tanh)模块3022;接收位选择器及饱和器3012的输出的S形模块3024;接收位选择器及饱和器3012的输出的softplus模块3026;第二多路复用器3032,其接收tanh模块3022、S形模块3024、softplus模块3026、校正器3108、倒数乘法器3014、右移位器3016的输出及CSS及饱和器3008的通过规范大小输出3028;接收第二多路复用器3032的输出的符号恢复器3034;接收符号恢复器3034的输出的尺寸转换器及饱和器3036;接收尺寸转换器及饱和器3036的输出以及累加器输出217的第三多路复用器3037;及接收多路复用器3037的输出且其输出是图1的结果133的输出寄存器3038。
PFC及OBPA 3002接收累加器202值217。优选地,累加器202值217是如上所述的全精度值。即,累加器202具有足够数量的存储位以保存累加值,该累加值是由整数加法器244生成的由整数乘法器242生成的一系列乘积的和,不丢弃乘法器242的各个乘积或加法器244的和的任何位,使得不存在精度损失。优选地,累加器202至少具有足够数量的位以保存NNU 121可编程执行的乘积累加的最大数量。例如,参考图4的程序来说明,当处于宽配置中时,NNU121可编程以执行的乘积累加的最大数量是512,累加器202位宽度是41。对于另一示例,参考图20的程序来说明,当处于窄配置中时,NNU 121可编程以执行的乘积累加的最大数量是1024,累加器202位宽度是28。概括地说,全精度累加器202包括至少Q位,其中,Q是M和log2P的和,其中,M是乘法器242的整数乘积的位宽度(例如,对于窄乘法器242为16位,或对于宽乘法器242为32位),P为可以被累加到累加器202中的整数乘积的最大可允许数量。优选地,借助对NNU 121的编程器的编程规范来指定乘积累加的最大数量。在一个实施例中,在假设从数据/权重RAM 122/124加载数据/权重字206/207的行的一个在前乘法-累加指令(例如,图4的地址1处的指令)的情况下,定序器128迫使乘法-累加NNU指令(例如,图4的地址2处的指令)的计数的最大值例如为511。
有利地,通过包括具有足够大的位宽度的累加器202来累加用于最大数量的可允许累加的全精度值,这简化了NPU 126的ALU 204部分的设计。特别地,其减轻了对使由整数加法器244生成的和饱和的逻辑的需要,该逻辑会使较小累加器溢出并且需要跟踪累加器的二进制小数点位置以确定是否发生溢出以获知是否需要饱和。为了通过示例说明包括非全精度累加器并且替代地包括饱和逻辑以处理非全精度累加器的溢出的设计的问题,假设如下。
(1)数据字值的范围在0和1之间,存储的所有位用于存储小数位。权重字的范围在-8和+8之间,除了三个存储位之外的所有位用于存储小数位。并且,用于输入到双曲正切激活函数的累加值的范围在-8和+8之间,除了三个存储位之外的所有位用于存储小数位。
(2)累加器的位宽度是非全精度(例如,仅乘积的位宽度)。
(3)假定累加器是全精度,则最终累加值将大致在-8和+8之间(例如,+4.2);然而,在系列中的“点A”之前的乘积往往更经常为正,而在点A之后的乘积往往更经常为负。
在这种情况下,可能获得不准确的结果(即,除+4.2之外的结果)。这是因为在点A之前的某点处,当应该是更大的值(例如+8.2)时,累加器可以饱和到最大值+8,导致剩余的+0.2的丢失。对于更多的乘积累加,累加器甚至可以保持在饱和值,导致损失更多的正值。因此,如果累加器具有全精度位宽度,则累加器的最终值可以是一个比它将会具有的更小的数(即,小于+4.2)。
如果累加器202值217为负,则PFC 3002将该值转换为正形式,并且生成指示原始值是正还是负的附加位,该附加位与该值一起沿着AFU 212传递。转换为正形式简化了AFU212的后续操作。例如,其实现了仅正值输入到tanh 3022和S形3024模块,从而简化它们。另外,这简化了舍入器3004和饱和器3008。
OBPA 3002向右移位或缩放正形式值,以使其与在控制寄存器127中指定的输出二进制小数点2954对准。优选地,OBPA 3002将移位量计算为差值,该差值是从累加器202值217的小数位的数量(例如,由累加器二进制小数点2923指定或由数据二进制小数点2922和权重二进制小数点2924的和指定)减去输出的小数位的数量(例如,由输出二进制小数点2954指定)。因此,例如,如果累加器202二进制小数点2923是8(如上例所示),并且输出二进制小数点2954是3,则OBPA 3002将正形式值右移5位以生成提供给多路复用器3006和舍入器3004的结果。
舍入器3004舍入累加器202值217。优选地,舍入器3004生成由PFC及OBPA 3002生成的正形式值的舍入形式,并且将舍入形式提供给多路复用器3006。舍入器3004根据上述舍入控制2932来舍入,这可以包括使用随机位3005的随机舍入,如下文所述。多路复用器3006基于舍入控制2932(其可以包括随机舍入,如本文所述)选择其输入中的一个,即,来自PFC及OBPA 3002的正形式值或来自舍入器3004的其舍入形式,并且将所选择的值提供给CCS及饱和器3008。优选地,如果舍入控制2932指定不舍入,则多路复用器3006选择PFC及OBPA 3002的输出,否则选择舍入器3004的输出。考虑其他实施例,其中,AFU 212执行额外的舍入。例如,在一个实施例中,比特选择器3012基于当其压缩CCS及饱和器3008输出的位(如下所述)时丢失的低阶位来舍入。对于另一个示例,在一个实施例中,舍入倒数乘法器3014的乘积(如下所述)。对于又一示例,在一个实施例中,当尺寸转换器3036转换到适当的输出大小(如下所述)时,尺寸转换器3036舍入,这可能涉及丢失在舍入确定中使用的低阶位。
CCS 3008将多路复用器3006输出值压缩为规范大小。因此,例如,如果NPU 126在窄或漏斗配置2902中,则CCS 3008将28位多路复用器3006输出值压缩为16位;如果NPU 126在宽配置2902中,则CCS 3008将41位多路复用器3006输出值压缩为32位。然而,在压缩到规范大小之前,如果预压缩值大于在规范形式中可表达的最大值,则饱和器3008将预压缩值饱和为规范形式中可表达的最大值。例如,如果最高有效规范形式位左侧的预压缩值的任何位具有1值,则饱和器3008饱和到最大值(例如,全部1)。
优选地,tanh 3022、S形3024和softplus 3026模块包括查找表,例如可编程逻辑阵列(PLA)、只读存储器(ROM)、组合逻辑门等等。在一个实施例中,为了简化和减小模块3022/3024/3026的大小,为它们提供了具有3.4形式的输入值,即,三个整数位和四个小数位,即,输入值在二进制小数点的右边具有四位和在二进制小数点的左边具有三位。选择这些值是因为在3.4形式的输入值范围(-8,+8)的极值处,输出值渐近地接近其最小/最大值。然而,可以设想将二进制小数点设置在不同位置的其它实施例,例如以4.3形式或2.5形式。比特选择器3012选择满足3.4形式准则的CCS及饱和器3008输出的位,其涉及压缩,即一些位丢失,因为规范形式具有更大数量的位。然而,在选择/压缩CCS及饱和器3008输出值之前,如果预压缩值大于以3.4形式可表达的最大值,则饱和器3012将预压缩值饱和为在3.4形式中可表达的最大值。例如,如果最高有效3.4形式位左侧的预压缩值的任何位具有1值,则饱和器3012饱和到最大值(例如,全部1)。
tanh 3022、S形3024和softplus 3026模块对由CCS及饱和器3008输出的3.4形式值执行它们各自的激活函数(如上所述)以生成结果。优选地,tanh 3022和S形3024模块的结果是0.7形式的7位结果,即零个整数位和七个小数位,即输入值在二进制小数的右边有七位。优选地,softplus模块3026的结果是3.4形式的7位结果,例如,与模块3026的输入相同的形式。优选地,将tanh 3022、S形3024和softplus 3026模块的输出扩展到规范形式(例如,根据需要添加的前导零)并且对准,以具有由输出二进制小数点2954值指定的二进制小数点。
校正器3018生成CCS及饱和器3008的输出值的校正形式。即,如果CCS及饱和器3008的输出值(其符号如上所述被管线传递)为负,则校正器3018输出零值;否则,校正器3018输出其输入值。优选地,校正器3018的输出是规范形式并且具有由输出二进制小数点2954值指定的二进制小数点。
倒数乘法器3014将CCS及饱和器3008的输出乘以在倒数值2942中指定的用户指定的倒数值,以生成其规范大小乘积,它实际上是CCS及饱和器3008的输出与作为倒数2942值的倒数的除数的商。优选地,倒数乘法器3014的输出是规范形式并且具有由输出二进制小数点2954值指定的二进制小数点。
右移位器3016将CCS及饱和器3008的输出移位由移位量值2944中指定的用户指定的位数,以生成其规范大小商。优选地,右移位器3016的输出是规范形式并且具有由输出二进制小数点2954值指定的二进制小数点。
多路复用器3032选择由激活函数2934值指定的适当输入,并将该选择提供给符号恢复器3034,如果初始累加器202值217是负值,则符号恢复器3034将多路复用器3032的正形式输出转换为负形式,例如,转换为二的补码形式。
尺寸转换器3036基于输出命令2956的值将符号恢复器3034的输出转换为适当的大小,这些值在上面相关于图29A进行了说明。优选地,符号恢复器3034的输出具有由输出二进制小数点2954值指定的二进制小数点。优选地,对于输出命令2956的第一预定值,尺寸转换器3036丢弃符号恢复器3034输出的上半部分的位。此外,如果符号恢复器3034的输出是正的并且超过由配置2902指定的字大小可表达的最大值、或者是负的并且小于字大小可表达的最小值,则饱和器3036将其输出饱和到字大小可表达的相应最大/最小值。对于第二和第三预定值,尺寸转换器3036使符号恢复器3034输出通过。
多路复用器3037基于输出命令2956选择尺寸转换器及饱和器3036输出或累加器202输出217,以提供给输出寄存器3038。更具体地,对于输出命令2956的第一和第二预定值,多路复用器3037选择尺寸转换器及饱和器3036的输出的低位字(其大小由配置2902指定)。对于第三预定值,多路复用器3037选择尺寸转换器及饱和器3036输出的高位字。对于第四预定值,多路复用器3037选择原始累加器202值217的低位字;对于第五预定值,多路复用器3037选择原始累加器202值217的中间字;对于第六预定值,多路复用器3037选择原始累加器202值217的高位字。如上所述,优选地,AFU 212将原始累加器202值217的高位字的高位填充为零。
现在参考图31,示出了图30的AFU 212的操作的示例。如图所示,配置2902被设置为NPU 126的窄配置。另外,带符号数据2912和带符号权重2914的值为真。另外,数据二进制小数点2922值指示将数据RAM 122字的二进制小数点定位为使得在二进制小数点右侧有7位,由NPU 126中的一个接收的第一数据字的示例值显示为0.1001110。此外,权重二进制小数点2924值指示将权重RAM 124字的二进制小数点定位为使得在二进制小数点右侧有3位,由NPU 126中的一个接收的第一数据字的示例值显示为00001.010。
第一数据和权重字的16位乘积(其与累加器202的初始零值累加)显示为000000.1100001100。因为数据二进制小数点2912是7并且权重二进制小数点2914是3,所以隐含的累加器202二进制小数点被定位为使得在二进制小数点右侧有10位。在窄配置的情况下,在示例实施例中,累加器202是28位宽。在该示例中,示出了在执行所有ALU运算(例如,图20的所有1024个乘法-累加)之后累加器202的000000000000000001.1101010100的值217。
输出二进制小数点2954值指示将用于输出的二进制小数点定位为使得在二进制小数点右侧有7位。因此,在通过OBPA 3002和CCS 3008之后,累加器202值217被缩放、舍入和压缩为规范形式值000000001.1101011。在该示例中,输出二进制小数点位置指示7个小数位,并且累加器202二进制小数点位置指示10个小数位。因此,OBPA 3002计算差值3,并且通过将累加器202值217右移3位来缩放累加器202值217。这在图31中由累加器202值217的3个最低有效位(二进制100)的丢失来指示。此外,在该示例中,舍入控制2932值指示使用随机舍入,并且在该示例中,假设采样随机位3005为真。因此,最低有效位向上舍入,因为根据上述描述,累加器202值217的舍入位(通过累加器202值217的缩放移出的3位的最高有效位)为1,并且粘着位(通过累加器202值217的缩放移出的3位的2个最低有效位的布尔运算OR)为零。
在该示例中,激活函数2934指示使用S形函数。因此,位选择器3012选择规范形式值的位,使得到S形模块3024的输入具有如上所述的三个整数位和四个小数位,即如图所示的值001.1101。S形模块3024输出置于规范形式中显示为000000000.1101110的值。
在示例中的输出命令2956指定第一预定值,即,输出由配置2902指示的字大小,在这种情况下其是窄字(8位)。因此,尺寸转换器3036将规范S形输出值转换为8位量,其隐含二进制小数点被定位为使得在该二进制小数点右侧有7位,得到输出值01101110,如图所示。
现在参考图32,示出了图30的AFU 212的操作的第二示例。图32的示例示出了当激活函数2934指示使规范大小的累加器202值217通过时AFU 212的操作。如图所示,将配置2902设置为NPU 126的窄配置。
在该示例中,累加器202是28位宽,并且将累加器202二进制小数点定位为使得在二进制小数点右侧有10位(如上所述,或者因为根据一个实施例的数据二进制位2912和权重二进制小数点2914的和是10,或者因为根据替代实施例,累加器二进制小数点2923被明确地指定为具有值10)。在该示例中,图32示出在执行所有ALU运算之后累加器202的值217为000001100000011011.1101111010。
在该示例中,输出二进制小数点2954值指示将用于输出的二进制小数点定位为使得在二进制小数点右侧有4位。因此,在通过OBPA 3002和CCS 3008之后,累加器202值217被饱和并压缩到规范形式值111111111111.1111,如图所示,其由多路复用器3032接收作为规范大小通过值3028。
在该示例中,示出了两个输出命令2956。第一输出命令2956指定第二预定值,即,输出规范形式大小的低位字。由于由配置2902指示的大小是窄字(8位),这意味着16位的规范大小,所以尺寸转换器3036选择规范大小通过值3028的低8位以产生8位值11111111,如图所示。第二输出命令2956指定第三预定值,即,输出规范形式大小的高位字。因此,尺寸转换器3036选择规范大小通过值3028的高8位以产生8位值11111111,如图所示。
现在参考图33,示出了图30的AFU 212的操作的第三示例。图33的示例示出了当激活函数2934指示使完整原始累加器202的值217通过时AFU 212的操作。如图所示,将配置2902设置为NPU 126的宽配置(例如,16-位输入字)。
在该示例中,累加器202是41位宽,并且将累加器202二进制小数点定位为使得在二进制小数点右侧有8位(如上所述,或者因为根据一个实施例,数据二进制小数点2912和权重二进制小数点2914的和是8,或者因为根据替代实施例,累加器二进制小数点2923被明确地指定为具有值8)。在该示例中,图33示出在执行所有ALU运算之后累加器202的值217为001000000000000000001100000011011.11011110。
在该示例中,示出了三个输出命令2956。第一输出命令2956指定第四预定值,即输出原始累加器202值的低位字;第二输出命令2956指定第五预定值,即输出原始累加器202值的中间字;第三输出命令2956指定第六预定值,即输出原始累加器202的值的高位字。由于由配置2902指示的大小是宽字(16位),因此图33示出响应于第一输出命令2956,多路复用器3037选择16位值0001101111011110;响应于第二输出命令2956,多路复用器3037选择16位值0000000000011000;响应于第三输出命令2956,多路复用器3037选择16位值0000000001000000。
如上所述,有利地,NNU 121对整数数据而不是浮点数据进行操作。这具有简化每个NPU 126或至少ALU 204部分的优点。例如,ALU 204不需要包括在浮点实施方式中将乘法器242的被乘数的指数相加所需的加法器。类似地,ALU 204不需要包括在浮点实施方式中将用于加法器234的加数的二进制小数点对准所需的移位器。如本领域技术人员将理解的,浮点单元通常是非常复杂的;因此,这些仅是对ALU 204的简化的示例,借助具有使用户能够指定相关二进制小数点的硬件定点辅助的当前整数实施例享有其他简化。ALU 204是整数单元的事实可有利地得到比浮点实施例更小(和更快)的NPU 126,这进一步有利地促进了将大的NPU 126阵列包含在NNU 121中。AFU 212部分基于在累加值中期望的小数位的优选地用户指定的数量和在输出值中期望的小数位的数量来处理累加器202值217的缩放和饱和。有利地,可以通过在ALU 204部分中共享AFU 212来平摊AFU 212的定点硬件辅助中的任何额外复杂性和随之而来的尺寸、功耗和/或时间的增加,例如如关于图11的实施例所述的,因为在共享的实施方式中可以减少AFU 1112的数量。
有利地,本文描述的实施例享有与优于浮点算术单元的硬件整数算术单元的复杂性降低相关联的许多益处,同时仍提供对小数(即,具有二进制小数点的数字)的算术运算。浮点运算的优点在于其适应对其各自值可能在非常宽的值范围(其实际上仅由可以非常大的指数范围的大小限制)内的任何地方的数据的算术运算。即,每个浮点数具有其自己的潜在唯一指数值。然而,这里描述的实施例认识到并利用以下的事实,即存在输入数据高度并行化并且其值在相对窄的范围内使得所有并行化值的“指数”可以是相同的某些应用。因此,实施例使得用户能够一次为所有输入值和/或累加值指定二进制小数点位置。类似地,实施例使得用户能够一次针对所有输出值指定二进制小数点位置,认识到并利用并行化输出的类似范围特性。人工神经网络是这种应用的示例,但是实施例可以用于执行其他应用的计算。通过一次为多个输入指定二进制小数点位置,而不是为每个单独的输入数指定二进制小数点位置,实施例提供了比浮点实施方式更有效地存储器空间使用(例如,需要更少的存储器)和/或提供对于类似存储量的精度增加,因为在浮点实施方式中将用于指数的位可以用于指定量值中的更高精度。
进一步有利地,实施例认识到在大系列整数运算的累加期间可能经历的潜在精度损失(例如,较不重要的小数位的溢出或丢失),并且提供解决方案,主要以足够大的累加器的形式,以避免精度损失。
NNU微操作的直接执行
现在参考图34,示出了例示图1的处理器100以及图1的NNU 121的更详细部分的框图。NNU 121包括NPU 126的流水线级3401。由分级寄存器分离的流水线级3401包括完成如本文所述的NPU 126的操作的组合逻辑,诸如布尔逻辑门、多路复用器、加法器、乘法器、比较器等等。流水线级3401从多路复用器3402接收微操作3418。微操作3418沿着流水线级3401向下流动并控制其组合逻辑。微操作3418是位的集合。优选地,微操作3418包括数据RAM 122存储器地址123、权重RAM 124存储器地址125、程序存储器129存储器地址131、多路复用寄存器208/705控制信号213/713、多路复用器802控制信号803和控制寄存器127的许多字段(例如,图29A至29C的)等等的位。在一个实施例中,微操作3418包括大约120位。多路复用器3402从三个不同源接收微操作,并且选择它们中的一个作为用于提供给流水线级3401的微操作3418。
到多路复用器3402的一个微操作源是图1的定序器128。定序器128对从程序存储器129接收的NNU指令进行解码,并且作为响应生成提供给多路复用器3402的第一输入的微操作3416。
到多路复用器3402的第二微操作源是解码器3404,其接收来自图1的保留站108的微指令105以及来自GPR 116和媒体寄存器118的操作数。优选地,微指令105由指令转换器104响应于转换MTNN指令1400和MFNN指令1500而生成,如上所述。微指令105可以包括指定特定功能(其由MTNN指令1400或MFNN指令1500指定)的立即字段,诸如开始和停止执行程序存储器129中的程序、直接执行来自媒体寄存器118的微操作、或读/写NNU 121的存储器,如上所述。解码器3404解码微指令105,并且作为响应生成提供给多路复用器3402的第二输入端的微操作3412。优选地,响应于MTNN/MFNN 1400/1500指令的一些功能1432/1532,不需要解码器3404生成微操作3412以沿流水线3401向下发送,例如,写入控制寄存器127、开始执行程序存储器129中的程序、暂停执行程序存储器129中的程序、等待程序存储器129中的程序的执行完成,从状态寄存器127读取及重置NNU 121。
到多路复用器3402的第三微操作源是媒体寄存器118自身。优选地,如上相关于图14所述的,MTNN指令1400可以指定指示NNU 121直接执行从媒体寄存器118提供到多路复用器3402的第三输入端的微操作3414的功能。直接执行由架构媒体寄存器118提供的微操作3414对于NNU 121的测试(例如内置自测试(BIST))和调试(debug)特别有用。
优选地,解码器3404生成控制多路复用器3402选择的模式指示符3422。当MTNN指令1400指定开始运行来自程序存储器129的程序的功能时,解码器3404生成模式指示符3422值,该值使得多路复用器3402从定序器128选择微操作3416,直到发生错误或直到解码器3404遇到指定停止运行来自程序存储器129的程序的功能的MTNN指令1400。当MTNN指令1400指定指示NNU 121直接执行从媒体寄存器118提供的微操作3414的功能时,解码器3404生成模式指示符3422值,该值使得多路复用器3402选择来自媒体寄存器118的微操作3414。否则,解码器3404生成模式指示符3422值,该值使得多路复用器3402选择来自解码器3404的微操作3412。
可变速率神经网络单元
可能存在NNU 121运行程序然后在它可以运行其下一个程序之前空闲等待处理器100进行它所需要的事情的情况。例如,假定类似于关于图3至图6A描述的情况,其中,NNU121运行乘法-累加-激活函数程序(其也可以被称为前馈神经网络层程序)的两个或多个连续实例。与NNU 121运行该程序所花费的相比,处理器100可能花费明显更长的时间,将512KB的权重值写入权重RAM124,该权重值将由NNU程序的下一次运行使用。换句话说,NNU121可以在相对少量的时间内运行程序,然后在处理器100完成将下一权重值写入权重RAM124以用于程序的下一运行时闲置。这种情况在图36A中可视地示出,其在下面更详细地描述。在这种情况下,可能有利的是以较慢的速率运行NNU 121并且花费更长的时间来执行程序,由此在更长的时间内展开NNU 121运行程序所需的能量消耗,一般来说,这可以往往保持NNU 121并且或许处理器100的温度较低。这种情况被称为松弛模式并且在图36B中可视地示出,其在下面更详细地描述。
现在参考图35,示出了例示包括可变速率NNU 121的处理器100的框图。处理器100在许多方面类似于图1的处理器100,并且相同编号的元件是类似的。图35的处理器100还包括耦合到处理器100的功能单元(即,指令提取单元101、指令高速缓存102、指令转换器104、重命名单元106、保留站108、NNU 121、其他执行单元112、存储器子系统114、通用寄存器116和媒体寄存器118)的时钟生成逻辑电路3502。时钟生成逻辑电路3502包括诸如锁相环(PLL)这样的时钟发生器,其生成具有主时钟速率或时钟频率的时钟信号。例如,主时钟速率可以是1GHz、1.5GHz、2GHz等。时钟速率表示每秒时钟信号的周期数,例如高和低状态之间的振荡数。优选地,时钟信号具有平衡的占空比,即高半部分周期和另一低半部分周期;可替换地,时钟信号具有不平衡占空比,其中,时钟信号处于高状态比其处于低状态时长,反之亦然。优选地,PLL可配置为以多个时钟速率生成主时钟信号。优选地,处理器100包括电源管理模块,其基于各种因素自动调整主时钟速率,因素包括动态检测的处理器100的操作温度、利用率以及来自指示期望性能的系统软件(例如,操作系统、BIOS)的命令和/或功率节省指示符。在一个实施例中,电源管理模块包括处理器100的微代码。
时钟生成逻辑电路3502还包括时钟分配网络或时钟树。时钟树将主时钟信号分配到处理器100的功能单元,其在图35中被指示为到指令提取单元101的时钟信号3506-1,到指令高速缓存102的时钟信号3506-2,到指令转换器104的时钟信号3506-10,到重命名单元106的时钟信号3506-9,到保留站108的时钟信号3506-8,到NNU 121的时钟信号3506-7,到其它执行单元112的时钟信号3506-4,到存储器子系统114的时钟信号3506-3,到通用寄存器116的时钟信号3506-5和到媒体寄存器118的时钟信号3506-6,它们被统称为时钟信号3506。时钟树包括将主时钟信号3506发送到它们各自的功能单元的节点或线。另外,优选地,时钟生成逻辑电路3502包括时钟缓冲器,其根据需要重新生成主时钟信号,以提供更干净的时钟信号和/或提高主时钟信号的电压电平,特别是对于长节点。另外,每个功能单元还可以根据需要包括其自己的子时钟树,其重新生成和/或提升其接收的相应主时钟信号3506。
NNU 121包括时钟降低逻辑电路3504,其接收松弛指示器3512并且接收主时钟信号3506-7,并且作为响应,生成辅助时钟信号。辅助时钟信号具有的时钟速率与主时钟速率的时钟速率相同,或者在松弛模式下,相对于主时钟速率降低编程到松弛指示器3512中的量,其可能提供热效益。时钟降低逻辑电路3504在许多方面类似于时钟生成逻辑电路3502,因为它包括时钟分配网络或时钟树,其将辅助时钟信号分配到NNU 121的各个块,其被指示为到NPU 126的阵列的时钟信号3508-1,到定序器128的时钟信号3508-2,到接口逻辑电路3514的时钟信号3508-3,它们被统称为或者单独地称为辅助时钟信号3508。优选地,NPU126包括多个流水线级3401,如关于图34所描述的,多个流水线级3401包括从时钟降低逻辑电路3504接收辅助时钟信号3508-1的流水线分级寄存器。
NNU 121还包括接收主时钟信号3506-7和辅助时钟信号3508-3的接口逻辑电路3514。接口逻辑电路3514耦合在处理器100的前端的较低部分(例如,保留站108、媒体寄存器118和通用寄存器116)和NNU 121的各种块(即,时钟降低逻辑电路3504、数据RAM 122、权重RAM 124、程序存储器129和定序器128)之间。接口逻辑电路3514包括数据RAM缓冲器3522、权重RAM缓冲器3524、图34的解码器3404和松弛指示器3512。松弛指示器3512保存指定NPU126的阵列执行NNU程序指令将慢多少(如果有的话)的值。优选地,松弛指示器3512指定除数值N,借助该除数值N,时钟降低逻辑电路3504将主时钟信号3506-7进行分频以生成辅助时钟信号3508,使得辅助时钟信号3508具有1/N的速率。优选地,N的值可以被编程为多个不同的预定值中的任一个,以使得时钟降低逻辑电路3504以小于主时钟速率的相应的多个不同速率生成辅助时钟信号3508。
在一个实施例中,时钟降低逻辑电路3504包括时钟分频器电路,用于将主时钟信号3506-7除以松弛指示器3512的值。在一个实施例中,时钟降低逻辑电路3504包括时钟门(例如,与门),其使用仅在主时钟信号3506-7的每N个周期才为真一次的使能信号来对主时钟信号3506-7进行门控。例如,包括计数到N的计数器的电路可以用于生成使能信号。当伴随的逻辑电路检测到计数器的输出匹配N时,逻辑电路在辅助时钟信号3508上生成真脉冲,并且重置计数器。优选地,松弛指示器3512值可由诸如图14的MTNN 1400指令的架构指令编程。优选地,在处理器100上运行的架构程序恰好在指示NNU 121开始运行NNU程序之前将松弛值编程到松弛指示器3512中,如相关于图37更详细地描述的。
权重RAM缓冲器3524耦合在权重RAM 124和媒体寄存器118之间,用于缓冲它们之间的数据传输。优选地,权重RAM缓冲器3524类似于图17的缓冲器1704的一个或多个实施例。优选地,权重RAM缓冲器3524的从媒体寄存器118接收数据的部分由主时钟信号3506-7以主时钟速率进行时钟控制,权重RAM缓冲器3524的从权重RAM 124接收数据的部分由辅助时钟信号3508-3以辅助时钟速率进行时钟控制,辅助时钟速率可以相对于主时钟速率降低或不降低,这取决于编程到松弛指示器3512中的值,即取决于NNU 121是以松弛模式还是正常模式操作。在一个实施例中,权重RAM 124是单端口的,如上文关于图17所描述的,并且可由媒体寄存器118经由权重RAM缓冲器3524以及由图11的NPU 126或行缓冲器1104以仲裁的方式访问。在替代实施例中,权重RAM 124是双端口的,如上文关于图16所描述的,每个端口可由媒体寄存器118经由权重RAM缓冲器3524且由NPU 126或行缓冲器1104以并发方式访问。
类似地,数据RAM缓冲器3522耦合在数据RAM 122和媒体寄存器118之间,用于缓冲它们之间的数据传输。优选地,数据RAM缓冲器3522类似于图17的缓冲器1704的一个或多个实施例。优选地,从媒体寄存器118接收数据的数据RAM缓冲器3522的部分由主时钟信号3506-7以主时钟速率进行时钟控制,从数据RAM 122接收数据的数据RAM缓冲器3522的部分由辅助时钟信号3508-3以辅助时钟速率进行时钟控制,辅助时钟速率可以或可以不相对于主时钟速率降低,这取决于编程到松弛指示器3512中的值,即取决于NNU 121是以松弛模式还是正常模式操作。在一个实施例中,数据RAM 122是单端口的,如上文关于图17所描述的,并且可由媒体寄存器118经由数据RAM缓冲器3522以及由图11的NPU 126或行缓冲器1104以仲裁的方式访问。在替代实施例中,数据RAM 122是双端口的,如上文关于图16所描述的,每个端口可由媒体寄存器118经由数据RAM缓冲器3522且由NPU 126或行缓冲器1104以并发方式访问。
优选地,不管数据RAM 122和/或权重RAM 124是单端口还是双端口的,接口逻辑电路3514都包括数据RAM缓冲器3522和权重RAM缓冲器3524,以便提供主时钟域和辅助时钟域之间的同步。优选地,数据RAM 122、权重RAM124和程序存储器129中的每一个包括静态RAM(SRAM),其包括相应的读使能、写使能和存储器选择信号。
如上所述,NNU 121是处理器100的执行单元。执行单元是执行架构指令被转换为的微指令的处理器的功能单元,诸如图1的架构指令103被转换为的微指令105,或者执行架构指令103本身的处理器的功能单元。执行单元从处理器的通用寄存器(例如GPR 116和媒体寄存器118)接收操作数。执行单元响应于执行可被写入通用寄存器的微指令或架构指令而生成结果。架构指令103的示例是分别关于图14和图15说明的MTNN指令1400和MFNN指令1500。微指令实施架构指令。更具体地,执行单元对架构指令被转换为的一个或多个微指令的集体执行对由架构指令指定的输入执行架构指令所指定的操作,以产生由架构指令规定的结果。
现在参考图36A,示出了例示具有在正常模式下(即,以主时钟速率)操作的NNU121的处理器100的操作的示例的时序图。时间在时序图中从左到右前进。处理器100以主时钟速率运行架构程序。更具体地,处理器100前端(例如,指令提取单元101、指令高速缓存102、指令转换器104、重命名单元106、保留站108)以主时钟速率提取、解码并向NNU 121和其他执行单元112发出架构指令。
最初,架构程序执行前端100向NNU 121发出的指示NNU 121开始运行其程序存储器129中的NNU程序的架构指令(例如,MTNN指令1400)。之前,架构程序执行架构指令以用指定主时钟速率的值写入松弛指示器3512,即,将NNU 121置于正常模式中。更具体地,编程到松弛指示器3512中的值使得时钟降低逻辑电路3504以主时钟信号3506的主时钟速率生成辅助时钟信号3508。优选地,在此情况下,时钟降低逻辑电路3504的时钟缓冲器简单地升高主时钟信号3506。此外之前,架构程序执行架构指令以写入数据RAM 122和权重RAM124,并将NNU程序写入程序存储器129。响应于开始NNU程序MTNN指令1400,NNU 121以主时钟速率开始运行NNU程序,因为松弛指示器3512被编程有主速率值。在开始NNU 121运行之后,架构程序继续以主时钟速率执行架构指令,包括和主要是MTNN指令1400,以写入和/或读取数据RAM 122和权重RAM 124,为NNU程序的下一个实例或调用或运行做准备。
如图36A中的示例所示,NNU 121以比架构程序所花费的显著更少的时间(例如,四分之一的时间)完成运行NNU程序以完成写入/读取数据RAM 122和权重RAM 124。例如,NNU121可以花费大约1000个时钟周期来运行NNU程序,而架构程序花费大约4000个时钟周期来运行,两者都以主时钟速率运行。因此,NNU 121在明显长的时间(该示例中是例如大约3000个主时钟速率周期)的剩余时间闲置。如图36A中的示例所示,该模式继续另一次,并且可以继续几次,这取决于神经网络的大小和配置。因为NNU 121可以是处理器100的较大且晶体管密集的功能单元,所以它可以生成相当大量的热,特别是在以主时钟速率运行时。
现在参考图36B,示出了例示具有在松弛模式下(即,以小于主时钟速率的速率)操作的NNU 121的处理器100的操作的示例的时序图。图36B的时序图在许多方面类似于图36A的时序图,因为处理器100以主时钟速率运行架构程序。并且在该示例中假设图36B的架构程序和NNU程序与图36A的架构程序和NNU程序相同。然而,在开始NNU程序之前,架构程序执行MTNN指令1400,MTNN指令1400用使得时钟降低逻辑电路3504以小于主时钟速率的辅助时钟速率生成辅助时钟信号3508的值编程松弛指示器3512。即,架构程序将NNU 121置于在图36B中的松弛模式中,而不是如图36A中的正常模式中。因此,NPU 126以辅助时钟速率执行NNU程序,其在松弛模式下小于主时钟速率。在该示例中,假设松弛指示器3512被编程有指定辅助时钟速率是主时钟速率的四分之一的值。结果,通过比较图36A和36B可以看出,与在正常模式下运行NNU程序相比,NNU 121在松弛模式下运行NNU程序花费大约四倍的时间,使得NNU 121空闲的时间量相对较短。因此,用于运行NNU程序的能量由图36B中的NNU 121在大约比图36A中NNU 121在正常模式下运行程序时长四倍的时间段上消耗。因此,NNU 121生成用以在图36B中以图36A中的大约四分之一的速率运行NNU程序的热量,这可以具有如本文所述的热效益。
现在参考图37,示出了例示图35的处理器100的操作的流程图。该流程图示出的操作在许多方面类似于上面关于图35、36A和36B所描述的操作。流程开始于框3702。
在框3702处,处理器100执行MTNN指令1400,以用权重写入权重RAM124并用数据写入数据RAM 122。流程进行到框3704。
在框3704处,处理器100执行MTNN指令1400,以用指定比主时钟速率更低的速率的值来编程松弛指示器3512,即,将NNU 121置于松弛模式中。流程进行到框3706。
在框3706处,处理器100执行MTNN指令1400,以指示NNU 121开始运行NNU程序,类似于图36B中可见到的方式。流程进行到框3708。
在框3708处,NNU 121开始运行NNU程序。并行地,处理器100执行MTNN指令1400以用新权重写入权重RAM 124(并且有可能用新数据写入数据RAM 122)和/或执行MFNN指令1500以从数据RAM 122读取结果(并且有可能从权重RAM 124读取结果)。流程进行到框3712。
在框3712处,处理器100执行MFNN指令1500(例如,读取状态寄存器127),以检测NNU 121是否完成运行其程序。假设架构程序选择了松弛指示器3512的良好值,则NNU 121运行NNU程序所花费的时间量与处理器100执行访问权重RAM 124和/或数据RAM 122的架构程序的部分所花费的大约相同,如图36B可见的。流程进行到框3714。
在框3714处,处理器100执行MTNN指令1400,以用指定主时钟速率的值来编程松弛指示器3512,即,将NNU 121置于正常模式中。流程进行到框3716。
在框3716处,处理器100执行MTNN指令1400,以指示NNU 121开始运行NNU程序,类似于图36A中可见到的方式。流程进行到框3718。
在框3718处,NNU 121开始以正常模式运行NNU程序。流程在框3718处结束。
如上所述,相对于NNU在正常模式下(即,在处理器的主时钟速率下)运行程序的时间,在松弛模式下运行NNU程序将NNU运行程序的时间扩展开,这可以提供热效益。更具体地,当NNU在松弛模式下运行程序的同时,器件(例如,晶体管、电容器、导线)将可能在较低的温度下操作,因为NNU以较慢的速率生成由NNU(例如,半导体器件、金属层、下面的衬底)和周围的封装及冷却解决方案(例如,散热器、风扇)耗散的热。总体上这还可以降低处理器管芯的其它部分中的器件的温度。器件的较低工作温度,特别是它们的结(junction)温度,可以具有漏电流较少的益处。此外,由于每单位时间汲取的电流量较少,所以可以减小感应噪声和电阻压降噪声。此外,较低的温度可对处理器的MOSFET的负偏置温度不稳定性(NBTI)和正偏置温度不稳定性(PBTI)具有积极的影响,从而增加器件及因而增加处理器部分的可靠性和/或寿命。较低的温度还可以减少处理器的金属层中的焦耳加热和电迁移。
架构程序与非架构程序关于NNU的共享资源的通信机制
如上所述,例如关于图24至图28以及图35至图37,数据RAM 122和权重RAM 124是共享资源。NPU 126和处理器100的前端都共享数据RAM 122和权重RAM 124。更具体地,NPU126和处理器100的前端(例如,媒体寄存器118)写和读数据RAM 122和权重RAM 124。换句话说,在处理器100上运行的架构程序与在NNU 121上运行的NNU程序共享数据RAM 122和权重RAM124,在一些情况下,这需要在架构程序和NNU程序之间流程的控制,如上所述。在某种程度上,这种资源共享也适用于程序存储器129,因为架构程序写入它并且定序器128读取它。以上和以下说明的实施例提供了用于控制对架构程序和NNU程序之间的共享资源的访问流程的高性能解决方案。
在所说明的实施例中,NNU程序也被称为非架构程序,NNU指令也被称为非架构指令,NNU指令集(以上也称为NPU指令集)也称为非架构指令集。非架构指令集与架构指令集不同。在处理器100包括将架构指令转换为微指令的指令转换器104的实施例中,非架构指令集也与微指令集不同。
现在参考图38,示出了更详细地例示NNU 121的定序器128的框图。如上所述,定序器128将存储器地址131提供给程序存储器129,以选择提供给定序器128的非架构指令。存储器地址131保存在定序器128的程序计数器3802中,如图38所示。定序器128通常通过程序存储器129的顺序地址递增,除非定序器128遇到非架构控制指令,例如循环或分支指令,在此情况下,定序器128将程序计数器3802更新为控制指令的目标地址,即,更新为在控制指令的目标处的非架构指令的地址。因此,保存在程序计数器3802中的地址131指定当前被提取以由NPU126执行的非架构程序的非架构指令的程序存储器129中的地址。有利地,程序计数器3802的值可以由架构程序经由状态寄存器127的NNU程序计数器字段3912获得,如下面相关于图39所述的。这使得架构程序能够基于非架构程序的进展做出关于在何处从/向数据RAM 122和/或权重RAM 124读/写数据的决定。
定序器128还包括与非架构循环指令(例如图26A的地址10处的循环到1指令和图28的地址11处的循环到1指令)结合使用的循环计数器3804。在图26A和28的示例中,以在地址0处的非架构初始化指令中指定的值(例如值400)加载循环计数器3804。每次定序器128遇到循环指令并跳转到目标指令(例如,图26A的地址1处的乘法-累加指令或图28的地址1处的maxwacc指令),定序器128就递减循环计数器3804。一旦循环计数器3804达到零,定序器128就进行到下一个顺序非架构指令。在替代实施例中,当首次遇到循环指令时,以在循环指令中指定的循环计数值加载循环计数器3804,从而消除对经由非架构初始化指令初始化循环计数器3804的需求。因此,循环计数器3804的值指示将执行非架构程序的循环体多少次。有利地,循环计数器3804的值可以由架构程序经由状态寄存器127的循环计数3914字段来获得,如下面关于图39所描述的。这使得架构程序能够基于非架构程序的进展做出关于在何处从/向数据RAM 122和/或权重RAM 124读/写数据的决定。在一个实施例中,定序器128包括三个附加的循环计数器以适应非架构程序中的嵌套循环,其它三个循环计数器的值也可经由状态寄存器127读取。循环指令中的位指示四个循环计数器中的哪一个用于当前循环指令。
定序器128还包括迭代计数器3806。迭代计数器3806结合非架构指令(例如图4、9、20和26A的地址2处的乘法-累加指令,及图28的地址2处的maxwacc指令(例如其将在下文中称为“执行”指令))一起使用。在上述示例中,每个执行指令分别指定511、511、1023、2和3的迭代计数。当定序器128遇到指定非零迭代计数的执行指令时,定序器128用指定的值加载迭代计数器3806。另外,定序器128生成适当的微操作3418以控制图34的NPU 126流水线级3401中的逻辑电路用于执行并递减迭代计数器3806。如果迭代计数器3806大于零,则定序器128再次生成适当的微操作3418以控制NPU 126中的逻辑电路并递减迭代计数器3806。定序器128以这种方式继续,直到迭代计数器3806达到零。因此,迭代计数器3806的值指示将执行在非架构执行指令中指定的操作(例如,乘法-累加、最大值、累加器与数据/权重字的和)多少次。有利地,迭代计数器3806的值可以由架构程序经由状态寄存器127的迭代计数3916字段来获得,如下面关于图39所描述的。这使得架构程序能够基于非架构性程序的进展做出关于在何处从/向数据RAM 122和/或权重RAM 124读/写数据的决定。
现在参考图39,示出了例示NNU 121的控制和状态寄存器127的某些字段的框图。这些字段包括由执行非架构程序的NPU 126最近写入的权重RAM行2602的地址、由执行非架构程序的NPU 126最近读取权重RAM行2604的地址、由执行非架构程序的NPU 126最近写入的数据RAM行2606的地址以及由执行非架构程序的NPU 126最近读取的数据RAM行2604的地址,这在以上相关于图26B进行了说明。另外,字段包括NNU程序计数器3912、循环计数3914和迭代计数3916。如上所述,状态寄存器127可由架构程序读取到媒体寄存器118和/或通用寄存器116中,例如,通过MFNN指令1500,包括NNU程序计数器3912、循环计数3914和迭代计数3916字段值。程序计数器3912的值反映图38的程序计数器3802的值。循环计数3914的值反映循环计数器3804的值。迭代计数3916的值反映迭代计数器3806的值。在一个实施例中,定序器128在每次修改程序计数器3802、循环计数器3804或迭代计数器3806时更新程序计数器3912、循环计数3914和迭代计数3916字段值,使得当架构程序读取它们时字段值是当前的。在另一实施例中,当NNU 121执行读取状态寄存器127的架构指令时,NNU 121简单地获得程序计数器3802、循环计数器3804和迭代计数器3806的值,并将它们提供回架构指令(例如,到媒体寄存器118或通用寄存器116中)。
从前面可以观察到,图39的状态寄存器127的字段的值可以被表征为指示非架构程序在其由NNU 121执行期间所做进展的信息。上面已经描述了非架构程序的进展的具体方面,诸如程序计数器3802值、循环计数器3804值、迭代计数器3806值、最近写入/读取2602/2604的权重RAM 124地址125以及最近写入/读取2606/2608的数据RAM 122地址123。在处理器100上执行的架构程序可以从状态寄存器127读取图39的非架构程序进度值,并且使用该信息例如通过诸如比较和分支指令的架构指令来做出决定。例如,架构程序决定哪些行向/从数据RAM 122和/或权重RAM 124写入/读取数据/权重,以控制进和出数据RAM122或权重RAM 124的数据流,特别是用于大数据集和/或用于不同非架构程序的重叠执行实例。上面和下面描述了由架构程序做出的决定的示例。
例如,如上文关于图26A所述的,架构程序配置非架构程序以将卷积的结果回写到卷积核2402上方的数据RAM 122的行(例如,在行8上方),并且当NNU 121通过使用最近写入的数据RAM 122行2606的地址来写入结果时,架构程序从数据RAM 122读取结果。
对于另一实例,如上文关于图26B所述的,架构程序使用来自图38的状态寄存器127字段的信息来确定非架构程序执行512×1600的5个块中的图24的数据阵列2404的卷积的进展。架构程序将2560×1600数据阵列2404的第一512×1600块写入权重RAM 124中,并开始具有循环计数为1600且初始化的权重RAM 124输出行为0的非架构程序。当NNU 121执行非架构程序时,架构程序读取状态寄存器127以确定最近写入的权重RAM行2602,使得其可以读取由非架构程序写入的有效卷积结果并且在架构程序已经读取它们之后写入有效卷积结果之上的下一个512x 1600块,使得当NNU 121在第一512×1600块上完成非架构程序时,处理器100可以根据需要立即更新非架构程序并再次开始它来处理下一个512x 1600块。
对于另一示例,假设架构程序使NNU 121执行一系列典型神经网络乘法-累加-激活函数运算,其中,权重被存储在权重RAM 124中并且结果被回写到数据RAM 122。在此情况下,一旦非架构程序读取了权重RAM 124的一行,它将不再读取它。因此,架构程序可以被配置为一旦当前权重已经被非架构程序读取/使用,就开始用用于非架构程序的下一个执行实例(例如,用于下一个神经网络层)的新权重来重写权重RAM 124中的权重。在此情况下,架构程序读取状态寄存器127以获得最近读取的权重RAM行2604的地址,以决定在何处它可以将新的权重集合写入到权重RAM 124中。
对于另一示例,假设架构程序知道非架构程序包括具有大迭代计数的执行指令,例如图20的地址2处的非架构乘法-累加指令。在此情况下,架构程序可能需要知道迭代计数3916,以便大致知道完成非架构指令将需要多少时钟周期,使得架构程序可以决定采取两个或多个动作中的哪一个。例如,如果时间较长,则架构程序可以放弃对另一架构程序(例如操作系统)的控制。类似地,假设架构程序知道非架构程序包括具有相对大的循环计数的循环体,例如图28的非架构程序。在此情况下,架构程序可能需要知道循环计数3914以便大致知道完成非架构程序将需要多少时钟周期,从而架构程序可以决定采取两个或多个动作中的哪一个。
对于另一示例,假设架构程序使NNU 121执行类似于关于图27和28描述的池化操作,其中,要池化的数据被存储在权重RAM 124中并且结果被回写到权重RAM 124中。然而,不同于图27和28的示例,假设将结果回写到权重RAM 124的前400行,例如行1600到1999。在此情况下,一旦非架构程序已经读取其池化的权重RAM 124的四行,它将不再读取它。因此,架构程序可以被配置为一旦当前的四行已经被非架构程序读取/使用,就开始用新数据(例如,用于非架构程序的下一执行实例的权重,例如用以对池化数据执行典型的乘法-累加-激活函数运算)来重写权重RAM 124中的数据。在此情况下,架构程序读取状态寄存器127以获得最近读取的权重RAM行2604的地址,以决定在何处它可以将新的权重集合写入到权重RAM 124中。
递归神经网络加速
传统的前馈神经网络不包括到网络的先前输入的记忆。前馈神经网络通常用于执行随着时间过去到网络的各种输入彼此独立的任务,输出也是如此。相比之下,递归神经网络(RNN)通常有助于执行对于随着时间到网络的输入序列具有重要性的任务。(该序列通常称为时间步长)。因此,RNN包括记忆或内部状态的概念,其基于网络响应于序列中的先前输入而进行的计算而保存信息,并且RNN的输出取决于内部状态以及下一个时间步长的输入。语音识别、语言建模、文本生成、语言翻译、图像描述生成和某些形式的手写识别是往往由RNN良好执行的任务的示例。
三个公知的示例是Elman RNN、Jordan RNN和长短记忆(LSTM)网络。Elman RNN包括记忆当前时间步长的RNN的隐藏层的状态的语境节点,其被提供作为下一时间步长的隐藏层的输入。Jordan RNN是类似的,除了语境节点记忆RNN的输出层的状态而不是隐藏层的状态。LSTM网络包括LSTM单元的LSTM层。每个LSTM单元具有当前时间步长的当前状态和当前输出以及新的或下一时间步长的新状态和新输出。LSTM单元包括输入门和输出门,以及使单元忘记其记忆状态的忘记门。这三种类型的RNN在下面更详细地描述。
在本公开内容的语境中,对于诸如Elman或Jordan RNN的递归神经网络(RNN),NNU在每个实例中执行时间步长,其中它获得输入层节点值集合并执行通过RNN传播它们以生成输出层节点值以及隐藏层和语境层节点值所必需的计算。因此,输入层节点值与将它们用于计算隐藏、输出和语境层节点值的时间步长相关联;并且隐藏、输出和语境层节点值与生成它们的时间步长相关联。输入层节点值是由RNN建模的系统的采样值,例如图像、语音样本、金融市场数据的快照。对于LSTM网络,NNU在每个实例中执行时间步骤,其中它获得记忆单元输入值集合并且执行生成记忆单元输出值(以及单元状态和输入门、忘记门和输出门值)所必需的计算,其也可以被称为通过LSTM层单元传播单元输入值。因此,单元输入值与将其用于计算单元状态和输入门、忘记门和输出门值的时间步长相关联;单元状态和输入门、忘记门和输出门值与生成它们的时间步长相关联。
语境层节点值(也称为状态节点)是神经网络的状态,该状态基于与先前时间步长相关联的输入层节点值,而不仅仅是与当前时间步长相关联的输入层节点值。由NNU在时间步长中执行的计算(例如,用于Elman或Jordan RNN的隐藏层节点值计算)是在先前时间步长中生成的语境层节点值的函数。因此,在时间步长开始时的网络状态(语境节点值)影响在时间步长期间生成的输出层节点值。此外,在时间步长结束时的网络状态受时间步长的输入节点值和在时间步长开始时的网络状态的影响。类似地,对于LSTM单元,单元状态值基于与先前时间步长相关联的记忆单元输入值,而不仅仅是与当前时间步长相关联的记忆单元输入值。因为由NNU在一个时间步长中执行的计算(例如,下一个单元状态)是在先前时间步长中生成的单元状态值的函数,所以在时间步长开始时的网络状态(单元状态值)影响在时间步长期间生成的单元输出值,并且在时间步长结束时的网络状态受到时间步长的单元输入值和网络的先前状态的影响。
现在参考图40,示出了例示Elman RNN的示例的框图。图40的Elman RNN包括表示为D0、D1至Dn的输入层节点或神经元,统称为多个输入层节点D,并且一般个别地称为输入层节点D;表示为Z0、Z1至Zn的隐藏层节点/神经元,统称为多个隐藏层节点Z,并且一般个别地称为隐藏层节点Z;表示为Y0、Y1至Yn的输出层节点/神经元,统称为多个输出层节点Y,并且一般个别地称为输出层节点Y;以及表示为C0、C1到Cn的语境层节点/神经元,统称为多个语境层节点C,并且一般个别地称为语境层节点C。在图40的示例性Elman RNN中,每个隐藏层节点Z具有与每个输入层节点D的输出的输入连接,并且具有与每个语境层节点C的输出的输入连接;每个输出层节点Y具有与每个隐层节点Z的输出的输入连接;并且每个语境层节点C具有与对应的隐藏层节点Z的输出的输入连接。
在许多方面,Elman RNN与传统的前馈人工神经网络类似地操作。即,对于给定节点,存在与到节点的每个输入连接相关联的权重;将输入连接上的节点接收的值乘以其相关联的权重以生成乘积;节点将与所有输入连接相关联的乘积相加以生成和(也可以存在包括在和中的偏差项);通常,对和执行激活函数以生成节点的输出值,有时称为节点的激活。对于传统的前馈网络,数据总是沿着一个方向流动:从输入层到输出层。即,输入层向隐藏层(通常是多个隐藏层)提供值,隐藏层生成提供给输出层的其输出值,输出层生成可被捕获的输出。
然而,与传统的前馈网络相反,Elman RNN包括向后反馈的一些连接,即,从图40的多个隐藏层节点Z到多个语境层节点C的连接。Elman RNN操作使得当多个输入层节点D在新的时间步长中向多个隐藏层节点Z提供输入值时,多个语境节点C响应于先前输入(称为当前时间步长)向隐藏层Z提供是多个隐藏层节点Z的输出值的值。在这个意义上,Elman RNN的语境节点C是基于先前时间步长的输入值的存储器。现在将相关于图41和图42来说明执行与图40的Elman RNN相关联的计算的NNU 121的实施例的操作。
为了本公开内容的目的,Elman RNN是至少包括输入节点层、隐藏节点层、输出节点层和语境节点层的递归神经网络。对于给定的时间步长,语境节点层存储由隐藏节点层反馈到语境节点层的隐藏节点层在先前时间步长中生成的结果。反馈到语境层的结果可以是激活函数的结果,或者在不执行激活函数的情况下,它们可以是由隐藏节点层执行的累加的结果。
现在参考图41,示出了例示当NNU 121执行与图40的Elman RNN相关联的计算时NNU 121的数据RAM 122和权重RAM 124内的数据布局的示例的框图。在图41的示例中,假设图40的Elman RNN具有512个输入节点D、512个隐藏节点Z、512个语境节点C和512个输出节点Y。此外,假设Elman RNN完全连接,即,所有512个输入节点D作为输入连接到每个隐藏节点Z,所有512个语境节点C作为输入连接到每个隐藏节点Z,并且所有512个隐藏节点Z作为输入连接到每个输出节点Y。此外,NNU 121被配置为512个NPU 126或神经元,例如,在宽配置中。最后,假设与从语境节点C到隐藏节点Z的连接相关联的权重都具有值1;因此,不需要存储这些单一权重值。
权重RAM 124的下部512行(行0到511)保存与多个输入节点D和多个隐藏节点Z之间的连接相关联的权重值,如图所示。更具体地,如图所示,行0保存与从输入节点D0到隐藏节点Z的输入连接相关联的权重,即,字0保存与输入节点D0和隐藏节点Z0之间的连接相关联的权重,字1保存与输入节点D0和隐藏节点Z1之间的连接相关联的权重,字2保存与输入节点D0和隐藏节点Z2之间的连接相关联的权重,依此类推,直至字511保存与输入节点D0和隐藏节点Z511之间的连接相关联的权重;行1保存与从输入节点D1到隐藏节点Z的输入连接相关联的权重,即,字0保存与输入节点D1和隐藏节点Z0之间的连接相关联的权重,字1保存与输入节点D1和隐藏节点Z1之间的连接相关联的权重,字2保存与输入节点D1和隐藏节点Z2之间的连接相关联的权重,依此类推,直至字511保存与输入节点D1和隐藏节点Z511之间的连接相关联的权重;直至行511保存与从输入节点D511到隐藏节点Z的输入连接相关联的权重,即,字0保存与输入节点D511和隐藏节点Z0之间的连接相关联的权重,字1保存与输入节点D511和隐藏节点Z1之间的连接相关联的权重,字2保存与输入节点D511和隐藏节点Z2之间的连接相关联的权重,依此类推,直至字511保存与输入节点D511和隐藏节点Z511之间的连接相关联的权重。这类似于上面关于图4至图6A说明的布局和使用。
以类似的方式,权重RAM 124接下来的512行(行512到1023)保存与多个隐藏节点Z和多个输出节点Y之间的连接相关联的权重值,如图所示。
数据RAM 122保存用于时间步长序列的Elman RNN节点值。更具体地,三行的三元组保存用于给定时间步长的节点值。在数据RAM 122具有64行的实施例中,数据RAM 122可以保存用于20个不同时间步长的节点值,如图所示。在图41的示例中,行0到2保存用于时间步长0的节点值,行3到5保存用于时间步长1的节点值,依此类推,直至行57到59保存用于时间步长19的节点值。三元组的第一行保存时间步长的输入节点D值。三元组的第二行保存时间步长的隐藏节点Z值。三元组的第三行保存时间步长的输出节点Y值。如图所示,数据RAM122中的每一列保存其相应神经元或NPU 126的节点值。即,列0保存与节点D0、Z0和Y0相关联的节点值,它们的计算由NPU 0执行;列1保存与节点D1、Z1和Y1相关联的节点值,它们的计算由NPU 1执行;依此类推,直至列511保存与节点D511、Z511和Y511相关联的节点值,它们的计算由NPU 511执行,如下面关于图42更详细地说明的。
如图41所示,与给定时间步长相关联的三元组的第二行中的隐藏节点Z值是用于下一时间步长的语境节点C值。即,NPU 126在时间步长期间计算和写入的Z值变为NPU 126使用的C值,(连同下一时间步长的输入节点D值一起)用于在下一时间步长期间计算Z值。假设语境节点C的初始值(即,用于计算时间步长0的行1中的Z值的C值)为零。这在下面关于图42的非架构程序更详细地描述。
优选地,输入节点D值(在图41的示例中的行0、3依此类推,直至57中)由在处理器100上运行的架构程序经由MTNN指令1400写入/填充到数据RAM122中并且由在NNU 121上运行的非架构程序(诸如图42的非架构程序)读取/使用。相反,隐藏/输出节点Z/Y值(在图41的示例中的行1和2、4和5依此类推,直至58和59中的)由在NNU 121上运行的非架构程序写入/填充到数据RAM 122中并且由在处理器100上运行的架构程序经由MFNN指令1500读取/使用。图41的示例假设架构程序:(1)用20个不同时间步长的输入节点D值(行0、3依此类推,直至57)填充数据RAM 122;(2)开始图42的非架构程序;(3)检测非架构程序已完成;(4)从数据RAM 122读出输出节点Y值(行2、5、依此类推,直至59);及(5)按照完成任务(例如用于执行对移动电话的用户做出的陈述的识别的计算)所需的次数重复步骤(1)至(4)。
在替代方案中,架构程序:(1)用单个时间步长的输入节点D值(例如,行0)填充数据RAM 122;(2)开始非架构程序(图42的不需要循环并访问数据RAM 122行的单个三元组的修改形式);(3)检测非架构程序已完成;(4)从数据RAM 122读出输出节点Y值(例如,行2);及(5)按照完成任务所需的次数重复步骤(1)至(4)。根据对RNN的输入值进行采样的方式,两种方案中的任一种都可以是优选的。例如,如果任务容许对多个时间步长(例如,20数量级的)对输入进行采样并且执行计算,则第一方案可能是优选的,因为它可能更具计算资源效率和/或有更高性能,而如果任务不能仅容许在单个时间步长的采样,则可能需要第二方案。
考虑类似于第二方案的第三实施例,但其中,不使用数据RAM 122行的单个三元组,非架构程序使用行的多个三元组,即,用于每个时间步长的不同三元组,类似于第一方案。在第三实施例中,优选地,架构程序包括在步骤(2)之前的步骤,其中,它在开始它之前更新非架构程序,例如通过更新地址1处的指令中的数据RAM 122行以指向下一个三元组。
现在参考图42,示出了例示用于存储在NNU 121的程序存储器129中并由NNU 121执行以实现Elman RNN并且使用根据图41的布置的数据和权重的程序的表。上面已经详细说明了图42(以及图45、48、51、54和57)的非架构程序的一些指令(例如,MULT-ACCUM、LOOP、INITIALIZE指令),并且在下面的说明中假设这些说明,除非另有表述。
图42的示例性程序包括地址0至12处的13个非架构指令。地址0处的指令(INITIALIZE NPU、LOOPCNT=20)清零累加器202,并将循环计数器3804初始化为值20,使得循环体(地址4到11的指令)被执行20次。优选地,初始化指令还将NNU 121置于宽配置中,使得NNU 121被配置为512个NPU 126。从下面的说明中可以观察到,512个NPU 126在地址1至3和7至11的指令的执行期间对应于512个隐藏层节点Z并且作为512个隐藏层节点Z操作,并且在地址4至6的指令的执行期间对应于512个输出层节点Y并且作为512个输出层节点Y操作。
地址1到3处的指令在程序循环体之外,并且只执行一次。它们计算多个隐藏层节点Z的初始值,并将它们写入数据RAM 122的行1,以由地址4至6处的指令的第一执行实例使用,以计算第一时间步长(时间步长0)的多个输出层节点Y。另外,通过地址1至3处的指令计算并写入数据RAM 122的行1的隐藏层节点Z值变为在用于第二时间步长(时间步长1)的隐层节点Z值的计算中要由地址7和8处的指令的第一执行实例使用的语境层节点C值。
在地址1和2处的指令的执行期间,512个NPU 126的每个NPU 126执行将数据RAM122的行0中的512个输入节点D值乘以来自权重RAM 124的行0到511的NPU 126的各自权重列的512个乘法运算,以生成累加在相应NPU126的累加器202中的512个乘积。在地址3处的指令的执行期间,使512个NPU 126的512个累加器202的值通过并写入数据RAM 122的行1。即,地址3的输出指令向数据RAM 122的行1写入作为初始隐藏层Z值的512个NPU 126中的每一个的累加器202值,然后清零累加器202。
由图42的非架构程序的地址1到2处的指令执行的操作在许多方面类似于由图4的非架构程序的地址1到2处的指令执行的操作。更具体地,地址1处的指令(MULT-ACCUM DRROW 0)指示512个NPU 126中的每一个将数据RAM 122的行0的相应字读入其多路复用寄存器208中,将权重RAM 124的行0的相应字读入其多路复用寄存器705中,将数据字和权重字相乘以生成乘积并将乘积加到累加器202。地址2处的指令(MULT-ACCUM ROTATE、WR ROW+1、COUNT=511)指示512个NPU 126中的每一个将来自相邻NPU 126的字旋转到其多路复用寄存器208中(使用由NNU的512个多路复用寄存器208的集体操作形成的512字旋转器,其中数据RAM 122行刚刚被地址1处的指令读取),将权重RAM 124的下一行的相应字读入其多路复用寄存器705中,将数据字和权重字相乘以生成乘积并将乘积加到累加器202,并且执行该操作511次。
此外,图42的地址3的单个非架构输出指令(OUTPUT PASSTHRU、DR OUT ROW 1、CLRACC)组合了图4的地址3和4处的激活函数指令和写输出指令的操作(尽管在图42的程序中,使累加器202的值通过,而在图4的程序中,对累加器202值执行激活函数)。即,在图42的程序中,在输出指令中(也在地址6和11的输出指令中)指定对累加器202值执行的激活函数(如果有的话),而不是如图4的程序中在不同的非架构激活函数指令中。考虑图4(以及图20、26A和28)的非架构程序的替代实施例,其中,(例如,图4的地址3和4处的)激活函数指令和写输出指令的操作组合成如图42所示的单个非架构输出指令。图42的示例假设隐藏层(Z)的节点不对累加器值执行激活函数。然而,可以设想其他实施例,其中,隐藏层(Z)对累加器值执行激活函数,在这种情况下,地址3和11处的指令这样做,例如S形、tanh、校正。
与地址1到3处的指令的单个执行实例相反,地址4到11处的指令在程序循环体内部并且被执行循环计数(例如,20)中指示的次数。地址7至11处的指令的前19个执行实例计算多个隐藏层节点Z的值,并将它们写入数据RAM122以由地址4至6处的指令的第二至第二十执行实例使用,以计算剩余时间步长(时间步长1至19)的多个输出层节点Y。(地址7至11处的指令的最后/第二十执行实例计算多个隐藏层节点Z的值,并将它们写入数据RAM 122的行61,但不使用它们。)
在地址4和5处的指令(MULT-ACCUM DR ROW+1、WR ROW 512和MULT-ACCUM ROTATE、WR ROW+1、COUNT=511)的第一执行实例(对于时间步长0)期间,512个NPU 126的每个NPU126执行将数据RAM 122的行1中的512个隐藏节点Z值(它们由地址1至3的指令的单个执行实例生成和写入)乘以来自权重RAM 124的行512到1023的NPU 126各自权重列的512个乘法运算,以生成累加到相应NPU 126的累加器202中的512个乘积。在地址6处的指令(OUTPUTACTIVATION FUNCTION、DR OUT ROW+1、CLR ACC)的第一执行实例期间,对512个累加值执行激活函数(例如,S形、tanh、校正)以计算输出节点Y层值,并且将结果写入数据RAM 122的行2。
在地址4和5处的指令的第二执行实例(对于时间步长1)期间,512个NPU 126的每个NPU 126执行将数据RAM 122的行4中的512个隐藏节点Z值(由地址7到11的指令的第一执行实例生成和写入)乘以来自权重RAM 124的行512到1023的NPU 126各自权重列的512个乘法运算,以生成累加到相应的NPU 126的累加器202中512个乘积,在地址6处的指令的第二执行实例期间,对512个累加值执行激活函数以计算写入数据RAM 122的行5的输出节点Y层值;在地址4和5处的指令的第三执行实例(对于时间步长2)期间,512个NPU 126的每个NPU126执行将数据RAM 122的行7中的512个隐藏节点Z值(由地址7到11的指令的第二执行实例生成和写入)乘以来自权重RAM 124的行512到1023的NPU 126各自权重列的512个乘法运算,以生成累加到相应的NPU 126的累加器202中512个乘积,在地址6处的指令的第三执行实例期间,对512个累加值执行激活函数以计算输出节点Y层值,并且将结果写入数据RAM122的行8;依此类推,直至在地址4和5处的指令的第二十执行实例(对于时间步长19)期间,512个NPU 126的每个NPU 126执行将数据RAM 122的行58中的512个隐藏节点Z值(由地址7到11的指令的第十九执行实例生成和写入)乘以来自权重RAM 124的行512到1023的NPU126各自权重列的512个乘法运算,以生成累加到相应的NPU 126的累加器202中512个乘积,在地址6处的指令的第二十执行实例期间,对512个累加值执行激活函数以计算输出节点Y层值,并且将结果写入数据RAM 122的行59。
在地址7和8处的指令的第一执行实例期间,512个NPU 126中的每一个将由地址1至3处的指令的单个执行实例生成的数据RAM 122的行1的512个语境节点C值累加到其累加器202中。更具体地,地址7处的指令(ADD_D_ACC DR ROW+0)指示512个NPU 126中的每一个将数据RAM 122的当前行(第一执行实例期间的行0)的相应字读入其多路复用寄存器208中,并将该字加到累加器202。地址8处的指令(ADD_D_ACC ROTATE、COUNT=511)指示512个NPU 126中的每一个将来自相邻NPU 126的字旋转到其多路复用寄存器208(使用通过NNU121的512个多路复用寄存器208的集体操作形成的512字旋转器,其中,数据RAM 122行刚刚被地址7处的指令读取),并将该字加到累加器202,并执行该操作511次。
在地址7和8处的指令的第二执行实例期间,512个NPU 126中的每一个将由地址9至11处的指令的第一执行实例生成并写入的数据RAM 122的行4的512个语境节点C值累加到其累加器202中;在地址7和8处的指令的第三执行实例期间,512个NPU 126中的每一个将由地址9至11处的指令的第二执行实例生成和写入的数据RAM 122的行7的512个语境节点C值累加到其累加器202中;依此类推,直至在地址7和8的指令的第二十执行实例期间,512个NPU 126中的每一个将由地址9至11处的指令的第十九执行实例生成并写入的数据RAM 122的行58的512个语境节点C值累加到其累加器202中。
如上所述,图42的示例假设与从语境节点C到隐藏层节点Z的连接相关联的权重都具有单一值。然而,在这些连接具有非零权重值的替代实施例Elman RNN中,在执行图42的程序之前将权重设置在权重RAM 124中(例如,在行1024到1535中),在地址7处的程序指令是MULT-ACCUM DR ROW+0、WR ROW 1024,在地址8处的程序指令是MULT-ACCUM ROTATE、WRROW+1、COUNT=511。优选地,地址8处的指令不访问权重RAM 124,而是通过地址7处的指令旋转从权重RAM 124读取到多路复用寄存器705中的值。在执行地址8处的指令的511个时钟周期期间不访问权重RAM 124可能是有利的,因为它为架构程序留出更多的带宽以访问权重RAM 124。
在地址9和10处的指令(MULT-ACCUM DR ROW+2、WR ROW 0和MULT-ACCUM ROTATE、WR ROW+1、COUNT=511)的第一执行实例(对于时间步长1)期间,512个NPU 126的每个NPU126执行将数据RAM 122的行3中的512个输入节点D值乘以来自权重RAM 124的行0到511的NPU 126各自权重列的512个乘法运算,以生成512个乘积,该512个乘积与由地址7和8处的指令执行的512个语境C节点值的累加值一起累加到相应的NPU 126的累加器202中,以计算隐藏节点Z层值,在地址11处的指令(OUTPUT PASSTHRU、DR OUT ROW+2、CLR ACC)的第一次执行期间,使512个NPU126的512个累加器202的值通过并写入数据RAM 122的行4,并且累加器202被清零;在地址9和10处的指令的第二执行实例(对于时间步长2)期间,512个NPU 126的每个NPU 126执行将数据RAM 122的行6中的512个输入节点D值乘以来自权重RAM 124的行0到511的NPU 126各自权重列的512个乘法运算,以生成512个乘积,该512个乘积与由地址7和8处的指令执行的512个语境C节点值的累加值一起累加到相应的NPU 126的累加器202中,以计算隐藏节点Z层值,在地址11处的指令的第二次执行期间,使512个NPU 126的512个累加器202的值通过并写入数据RAM 122的行7,并且累加器202被清零;依此类推,直至在地址9和10的指令的第十九执行实例(对于时间步长19)期间,512个NPU 126的每个NPU126执行将数据RAM 122的行57中的512个输入节点D值乘以来自权重RAM 124的行0到511的NPU 126各自权重列的512个乘法运算,以生成512个乘积,该512个乘积与由地址7和8处的指令执行的512个语境C节点值的累加值一起累加到相应的NPU 126的累加器202中,以计算隐藏节点Z层值,在地址11处的指令的第十九次执行期间,使512个NPU 126的512个累加器202的值通过并写入数据RAM 122的行58,并且累加器202被清零。如上所述,不使用在地址9和10处的指令的第二十执行实例期间生成并且写入数据RAM 122的行61的隐藏节点Z层值。
如果新的循环计数器3804的值大于零,则地址12处的指令(LOOP 4)递减循环计数器3804并循环回到地址4处的指令。
现在参考图43,示出了例示Jordan RNN的示例的框图。图43的Jordan RNN在许多方面与图40的Elman RNN类似,因为它包括输入层节点/神经元D、隐层节点/神经元Z、输出层节点/神经元Y和语境层节点/神经元C。但在图43的Jordan RNN中,语境层节点C具有从相应输出层节点Y的输出向后反馈的其输入连接,而不是如在图40的Elman RNN中从隐藏层节点Z的输出。
出于本公开内容的目的,Jordan RNN是至少包括输入节点层、隐藏节点层、输出节点层和语境节点层的递归神经网络。在给定时间步长的开始,语境节点层包含由输出节点层反馈到在前时间步长中输出节点层生成的语境节点层的结果。反馈到语境层的结果可以是激活函数的结果,或者在不执行激活函数的情况下,它们可以是由输出节点层执行的累加的结果。
现在参考图44,示出了例示当NNU 121执行与图43的Jordan RNN相关联的计算时NNU 121的数据RAM 122和权重RAM 124内的数据布局的示例的框图。在图44的示例中,假定图43的Jordan RNN具有512个输入节点D、512个隐藏节点Z、512个语境节点C和512个输出节点Y。此外,假设Jordan RNN完全连接,即,所有512个输入节点D作为输入连接到每个隐藏节点Z,所有512个语境节点C作为输入连接到每个隐藏节点Z,所有512个隐藏节点Z作为输入连接到每个输出节点Y。在图44的示例性Jordan RNN中,虽然激活函数被应用于累加器202的值以生成输出层节点Y值,但是假设在应用激活函数之前将累加器202的值传递到语境层节点C而不是实际输出层节点Y值。另外,NNU 121被配置为512个NPU 126或神经元,例如,在宽配置中。最后,假设与从语境节点C到隐藏节点Z的连接相关联的权重都具有值1;因此,不需要存储这些单一权重值。
类似于图41的示例,权重RAM 124的下部512行(行0到511)保存与输入节点D和隐藏节点Z之间的连接相关联的权重值,权重RAM 124接下来的512行(行512到1023)保存与隐藏节点Z和输出节点Y之间的连接相关联的权重值,如图所示。
类似于图41的示例,数据RAM 122保存用于时间步长序列的Jordan RNN节点值;但四行的四元组保存图44的示例的给定时间步长的节点值。在数据RAM 122具有64行的实施例中,数据RAM 122可以保存15个不同时间步长的节点值,如图所示。在图44的示例中,行0到3保存时间步长0的节点值,行4到7保存时间步长1的节点值,依此类推,直至行60到63保存时间步长15的节点值。四元组的第一行保存时间步长的输入节点D值。四元组的第二行保存时间步长的隐藏节点Z值。四元组的第三行保存时间步长的语境节点C值。四元组的第四行保存时间步长的输出节点Y值。如图所示,数据RAM 122中的每一列保存其相应神经元或NPU 126的节点值。即,列0保存与节点D0、Z0、C0和Y0相关联的节点值,它们的计算由NPU 0执行;列1保存与节点D1、Z1、C1和Y1相关联的节点值,它们的计算由NPU 1执行;依此类推,直至列511保存与节点D511、Z511、C511和Y511相关联的节点值,它们的计算由NPU 511执行,如下面关于图44更详细地描述的。
对于给定的时间步长,图44中示出的语境节点C值在该时间步长中生成并且在下一时间步长中用作输入。即,NPU 126在时间步长期间计算和写入的C值变为NPU 126使用的C值,(连同下一时间步长的输入节点D值一起)用于在下一时间步长期间计算Z值。假设语境节点C的初始值(即,用于计算时间步长0的行1中的Z值的C值)为零。这在下面关于图45的非架构程序更详细地描述。
如上文关于图41所描述,优选地,(在图44的示例中的行0、4依此类推,直至60中的)输入节点D值由在处理器100上运行的架构程序经由MTNN指令1400写入/填充到数据RAM122中并且由在NNU 121上运行的非架构程序(诸如图45的非架构程序)读取/使用。相反,隐藏/语境/输出节点Z/C/Y值(在图44的示例中的行1/2/3、4/5/6依此类推,直至60/61/62中的)由在NNU 121上运行的非架构程序写入/填充到数据RAM 122中并且由在处理器100上运行的架构程序经由MFNN指令1500读取/使用。图44的示例假设架构程序:(1)用15个不同时间步长的输入节点D值(行0、4依此类推,直至60)填充数据RAM 122;(2)开始图45的非架构程序;(3)检测非架构程序已完成;(4)从数据RAM 122读出输出节点Y值(行3、7、依此类推,直至63);及(5)按照完成任务(例如用于执行对移动电话的用户做出的陈述的识别的计算)所需的次数重复步骤(1)至(4)。
在替代方案中,架构程序:(1)用单个时间步长的输入节点D值(例如,行0)填充数据RAM 122;(2)开始非架构程序(图45的不需要循环并访问数据RAM 122行的单个四元组的修改形式);(3)检测非架构程序已完成;(4)从数据RAM 122读出输出节点Y值(例如,行3);及(5)按照完成任务所需的次数重复步骤(1)至(4)。根据对RNN的输入值进行采样的方式,两种方案中的任一种都可以是优选的。例如,如果任务容许对多个时间步长(例如,15的数量级)对输入进行采样并且执行计算,则第一方案可能是优选的,因为它可能更具计算资源效率和/或有更高性能,而如果任务不能仅容许在单个时间步长的采样,则可能需要第二方案。
考虑类似于第二方案的第三实施例,但其中类似于第一方案,不使用数据RAM 122行的单个四元组,非架构程序使用行的多个四元组,即,用于每个时间步长的不同四元组。在第三实施例中,优选地,架构程序包括在步骤(2)之前的步骤,其中,它在开始步骤(2)之前更新非架构程序,例如通过更新地址1处的指令中的数据RAM 122行以指向下一个四元组。
现在参考图45,示出了例示用于存储在NNU 121的程序存储器129中并由NNU 121执行以实现Jordan RNN并且使用根据图44的布置的数据和权重的程序的表。图45的非架构程序在许多方面类似于图42的非架构,但说明不同之处。
图45的示例性程序包括在地址0至13处的14个非架构指令。地址0处的指令是初始化指令,其清零累加器202并将循环计数器3804初始化为值15以使循环体(地址4到12的指令)执行15次。优选地,初始化指令还将NNU 121置于宽配置中,使得NNU 121被配置为512个NPU 126。可以观察到,512个NPU 126在执行地址1至3和8至12的指令期间对应于512个隐藏层节点Z,并且作为512个隐藏层节点Z操作,且在执行地址4、5和7的指令期间对应于512个输出层节点Y,并且作为512个输出层节点Y操作。
地址1至5和7处的指令与图42的地址1至6处的指令相同,并且执行相同的功能。地址1到3处的指令计算隐藏层节点Z的初始值,并将它们写入数据RAM 122的行1,以由地址4、5和7处的指令的第一执行实例使用,以计算第一时间步长(时间步长0)的输出层节点Y。
在地址6处的输出指令的第一执行实例期间,使由地址4和5处的指令累加的512个累加器202值(其随后由地址7处的输出指令用于计算和写入输出节点Y层值)通过并写入数据RAM 122的行2,它们是在第一时间步长(时间步长0)中产生并在第二时间步长(时间步长1)期间使用的语境层节点C值;在地址6处的输出指令的第二执行实例期间,使由地址4和5处的指令累加的512个累加器202值(其随后由地址7处的输出指令用于计算和写入输出节点Y层值)通过并写入数据RAM 122的行6,它们是在第二时间步长(时间步长1)中产生并在第三时间步长(时间步长2)期间使用的语境层节点C值;依此类推,直至在地址6处的输出指令的第十五执行实例期间,使由地址4和5处的指令累加的512个累加器202值(其随后由地址7处的输出指令用于计算和写入输出节点Y层值)通过并写入数据RAM 122的行58,它们是在第十五时间步长(时间步长14)中产生的语境层节点C值(它们由地址8处的指令读取,但是不使用它们)。
地址8到12的指令与图42的地址7到11的指令相同,具有一个差别,并且执行相同的功能。差别是图45的地址8处的指令,数据RAM 122的行递增1(ADD_D_ACC DR ROW+1),而在图42的地址7的指令中,数据RAM 122的行递增零(ADD_D_ACC DR ROW+0)。这是由于数据RAM 122中的数据的布局的差异,具体地,图44中的布局在四元组中包括用于语境层节点C值的单独的行(例如,行2、6、10等),而图41中的布局在三元组中不包括用于语境层节点C值的单独行,而是语境层节点C值与隐藏层节点Z值共享一行(例如,行1、4、7等)。地址8到12处的指令的15个执行实例计算隐藏层节点Z的值,并将它们写到数据RAM 122(在行5、9、13依此类推,直至57),以由在地址4、5和7处的指令的第二到第十六个执行实例用于计算第二到第十五时间步长(时间步长1到14)的输出层节点Y。(地址8到12处的指令的最后/第十五执行实例计算隐藏层节点Z的值,并将它们写入数据RAM 122的行61,但不使用它们。)
如果新的循环计数器3804值大于零,则地址13处的循环指令递减循环计数器3804并循环回到地址4处的指令。
在替代实施例中,将Jordan RNN设计为使得语境节点C保存输出节点Y的激活函数值,即,对其执行激活函数的累加值。在这个实施例中,地址6处的非架构指令不包括在非架构程序中,因为输出节点Y的值与语境节点C的值相同。因此,消耗较少的数据RAM 122的行。更确切地说,不存在保存语境节点C值(例如,2、6、59)的图44的每一行。另外,每个时间步长仅需要数据RAM 122的三行,从而容纳20个时间步长,而不是15个,并且适当地修改图45的非架构程序的指令的寻址。
LSTM单元
在递归神经网络中使用的长短记忆(LSTM)单元概念早已为人所知。参见例如LongShort-Term Memory,Sepp Hochreiter和Jürgen Schmidhuber,Neural Computation,1997年11月15日,Vol.9,No.8,第1735-1780页;Learning to Forget:Continual Predictionwith LSTM,Felix A.Gers,Jürgen Schmidhuber和Fred Cummins,Neural Computation,2000年10月,Vol.12,No.10,第2451-2471页;二者均可从MIT Press Journals获得。LSTM单元可以以各种形式构建。下面关于图46描述的LSTM单元4600在LSTM单元之后被建模,该LSTM单元在http://deeplearning.net/tutorial/lstm.html得到的题为LSTM Networksfor Sentiment Analysis的教程中说明,其副本在10/19/2015下载(以下简称“LSTM教程”),并在随附的信息披露声明(IDS)中提供。提供LSTM单元4600作为说明本文所描述的NNU 121的实施例有效地执行与通常LSTM相关联的计算的能力的方式。应当理解,包括关于图49说明的实施例的NNU 121可以用于有效地执行与除了图46中描述的LSTM单元之外的其他LSTM单元相关联的计算。
优选地,NNU 121可以用于对包括连接到其他层的LSTM单元的层的递归神经网络执行计算。例如,在LSTM教程中,网络包括接收LSTM层的LSTM单元的输出(H)的平均池化层和接收平均池化层的输出的逻辑回归层。
现在参考图46,示出了例示LSTM单元4600的实施例的框图。
LSTM单元4600包括记忆单元输入(X)、记忆单元输出(H)、输入门(I)、输出门(O)、忘记门(F)、单元状态(C)和候选单元状态(C'),如图所示。输入门(I)将记忆单元输入(X)选通到单元状态(C),输出门(O)将单元状态(C)选通到记忆单元输出(H)。单元状态(C)作为时间步长的候选单元状态(C')被反馈。忘记门(F)选通反馈并成为下一时间步长的单元状态(C)的候选单元状态(C')。
在图46的实施例中,以下等式用于计算上面指定的各种值:
(1)I=SIGMOID(Wi*X+Ui*H+Bi)
(2)F=SIGMOID(Wf*X+Uf*H+Bf)
(3)C’=TANH(Wc*X+Uc*H+Bc)
(4)C=I*C’+F*C
(5)O=SIGMOID(Wo*X+Uo*H+Bo)
(6)H=O*TANH(C)
Wi和Ui是与输入门(I)相关联的权重值,Bi是与输入门(I)相关联的偏差值。Wf和Uf是与忘关门(F)相关联的权重值,Bf是与忘记门(F)相关联的偏差值。Wo和Uo是与输出门(O)相关联的权重值,Bo是与输出门(O)相关联的偏差值。如图所示,等式(1)、(2)和(5)分别计算输入门(I)、忘记门(F)和输出门(O)。等式(3)计算候选单元状态(C'),等式(4)使用当前单元状态(C)作为输入,即,使用当前时间步长的单元状态(C),计算候选单元状态(C')。等式(6)计算单元输出(H)。考虑对输入门、忘记门、输出门、候选单元状态、单元状态和单元输出采用不同计算的LSTM单元的其它实施例。
为了本公开内容的目的,LSTM单元包括记忆单元输入、记忆单元输出、单元状态、候选单元状态、输入门、输出门和忘记门。对于每个时间步长,输入门、输出门、忘记门和候选单元状态是当前时间步长记忆单元输入和在前时间步长记忆单元输出和相关权重的函数。时间步长的单元状态是在前时间步长单元状态、候选单元状态、输入门和忘记门的函数。在这个意义上,单元状态被反馈并用于计算下一时间步长单元状态。时间步长的记忆单元输出是针对时间步长和输出门计算的单元状态的函数。LSTM网络是包括LSTM单元层的神经网络。
现在参考图47,示出了例示当NNU 121执行与图46的128个LSTM单元4600的层相关联的计算时,NNU 121的数据RAM 122和权重RAM 124内的数据布局的示例的框图。在图47的示例中,NNU 121被配置为512个NPU 126或神经元,例如在宽配置中,但是仅使用128个NPU126(例如,NPU 0至127)生成的值,因为在该示例中在LSTM层中只有128个LSTM单元4600。
如图所示,权重RAM 124保存NNU 121的对应NPU 0到127的权重值、偏差值和中间值。权重RAM 124的列0到127保存NNU 121的对应NPU 0到127的权重值、偏差值和中间值。行0到14各自保存以上等式(1)到(6)的用于提供给NPU 0到127的以下各自值中的128个:Wi、Ui、Bi、Wf、Uf、Bf、Wc、Uc、Bc、C'、TANH(C)、C、Wo、Uo、Bo。优选地,权重值和偏置差值-Wi、Ui、Bi、Wf、Uf、Bf、Wc、Uc、Bc、Wo、Uo、Bo(在行0到8和12到14中)-由在处理器100上运行的架构程序经由MTNN指令1400来写入/填充到权重RAM 124中,并且由在NNU 121上运行的非架构程序(诸如图48的非架构程序)读取/使用。优选地,中间值——C'、TANH(C)、C(在行9到11中)——由在NNU 121上运行的非架构程序写入/填充到权重RAM 124中,并且同样被在NNU121上运行的非架构程序读取/使用,如下面更详细描述的。
如图所示,数据RAM 122保存时间步长序列的输入(X)值、输出(H)值、输入门(I)值、忘记门(F)值和输出门(O)值。更具体地,五行的五元组保存给定时间步长的X、H、I、F和O值。在数据RAM 122具有64行的实施例中,数据RAM 122可以保存12个不同时间步长的单元值,如图所示。在图47的示例中,行0到行4保存时间步长0的单元值,行5到行9保存时间步长1的单元值,依此类推,直至行55到行59保存时间步长11的单元值。五元组的第一行保存时间步长的X值。五元组的第二行保存时间步长的H值。五元组的第三行保存时间步长的I值。五元组的第四行保存时间步长的F值。五元组的第五行保存时间步长的O值。如图所示,数据RAM 122中的每一列保存其对应的神经元或NPU 126的值。也就是说,列0保存与LSTM单元0相关联的值,其计算由NPU 0执行;列1保存与LSTM单元1相关联的值,其计算由NPU 1执行;依此类推,直至列127保存与LSTM单元127相关联的值,其计算由NPU127执行,如下面关于图48更详细地描述的。
优选地,由在处理器100上运行的架构程序经由MTNN指令1400将(在行0、5、9依此类推,直至55中的)X值写入/填充到数据RAM 122中,并且由在NNU 121上运行的非架构程序(诸如图48的非架构程序)读取/使用。优选地,I、F和O值(在行2/3/4、7/8/9、12/13/14依此类推,直至57/58/59中的)由在NNU 121上运行的非架构程序写入/填充到数据RAM 122中,并且同样被在NNU 121上运行的非架构程序读取/使用,如下面更详细描述的。优选地,(在行1、6、10依此类推,直至56中的)H值由在NNU 121上运行的非架构程序写入/填充到数据RAM 122中,并且同样被在NNU 121上运行的非架构程序读取/使用,并且被在处理器100上运行的架构程序RAM 124经由MFNN指令1500读取。
图47的示例假定架构程序:(1)用12个不同时间步长的输入X值(行0、5依此类推,直至55)填充数据RAM 122;(2)开始图48的非架构程序;(3)检测非架构程序已完成;(4)从数据RAM 122读出输出H值(行1、6依此类推,直至59);和(5)按照完成任务(例如用于执行对移动电话的用户做出的陈述的识别的计算)所需的次数重复步骤(1)至(4)。
在替代方案中,架构程序:(1)用单个时间步长的输入X值(例如,行0)填充数据RAM122;(2)开始非架构程序(图48的不需要循环并访问数据RAM122行的单个五元组的修改形式);(3)检测非架构程序已完成;(4)从数据RAM 122读出输出H值(例如,行1);及(5)按照完成任务所需的次数重复
步骤(1)至(4)。根据对LSTM层的输入X值进行采样的方式,两种方案中的任一种都可以是优选的。例如,如果任务容许对多个时间步长(例如,12的数量级)对输入进行采样并且执行计算,则第一方案可能是优选的,因为它可能更具计算资源效率和/或有更高性能,而如果任务不能仅容许在单个时间步长的采样,则可能需要第二方案。
考虑类似于第二方案的第三实施例,但其中类似于第一方案,不使用数据RAM 122行的单个五元组,非架构程序使用行的多个五元组,即,用于每个时间步长的不同五元组。在第三实施例中,优选地,架构程序包括在步骤(2)之前的步骤,其中,它在开始步骤(2)之前更新非架构程序,例如通过更新地址0处的指令中的数据RAM 122行以指向下一个五元组。
现在参考图48,示出了例示用于存储在NNU 121的程序存储器129中并由NNU 121执行以完成与LSTM单元层相关联的计算并且使用根据图47的布置的数据和权重的程序的表。图48的示例性程序包括地址0到23处的24个非架构指令。地址0处的指令(INITIALIZENPU、CLR ACC,LOOPCNT=12、DR IN ROW=-1、DR OUT ROW=2)清零累加器202,并且将循环计数器3804初始化为值12,以使循环体(地址1至22的指令)被执行12次。初始化指令还将要读取的数据RAM 122行(例如,图26/39的寄存器2608)初始化为值-1,其将由地址1处的指令的第一执行实例递增到零。初始化指令还将要写入的数据RAM 122行(例如,图26/39的寄存器2606)初始化为行2。优选地,初始化指令还将NNU 121置于宽配置中,使得NNU 121被配置为512个NPU 126。从下面的说明可以观察到,在地址0到23的指令的执行期间,512个NPU126中的128个对应于128个LSTM单元4600并且作为128个LSTM单元4600操作。
在地址1到4处的指令的第一执行实例期间,128个NPU 126中的每一个(即,NPU126 0到127)计算第一时间步长(时间步长0)的其相应LSTM单元4600的输入门(I)值,并将I值写入数据RAM 122的行2的相应字;在地址1至4处的指令的第二执行实例期间,128个NPU126中的每一个计算第二时间步长(时间步长1)的其相应LSTM单元4600的I值,并将I值写入数据RAM 122的行7的相应字;依此类推,直至在地址1到4处的指令的第十二执行实例期间,128个NPU 126中的每一个计算第十二时间步长(时间步长11)的其相应LSTM单元4600的I值,并将I值写入数据RAM 122的行57的相应字,如图47所示。
更具体地,地址1处的乘法-累加指令读取当前数据RAM 122行之后的包含与当前时间步长相关联的单元输入(X)值的下一行(在第一执行实例期间的行0,在第二执行实例期间的行5,依此类推,直至第十二执行实例的行55),并读取包含Wi值的权重RAM 124的行0,并将它们相乘以生成累加到累加器202中的第一乘积,累加器202刚刚在地址0处的初始化指令或在地址22处的指令清零。接下来,地址2处的乘法-累加指令读取包含与当前时间步长相关联的单元输出(H)值的下一个数据RAM 122行(在第一执行实例期间的行1,在第二执行实例期间的行6,依此类推,直至第十二执行实例的行56),并且读取包含Ui值的权重RAM 124的行1,并将它们相乘以生成加到累加器202的第二乘积。通过地址2处的指令(以及地址6、10和18处的指令)从数据RAM 122读取的与当前时间步长相关联的H值在前一时间步长期间生成,并通过地址22处的输出指令被写入数据RAM 122;然而,在地址2处的指令的第一执行实例的情况下,数据RAM 122的行1中的H值被写入初始值。优选地,架构程序(例如,使用MTNN指令1400)在开始图48的非架构程序之前将初始H值写入数据RAM 122的行1;然而,考虑非架构程序包括将初始H值写入数据RAM 122的行1的初始指令的其它实施例。在一个实施例中,初始H值为零。接下来,地址3处的将权重字加到累加器指令(ADD_W_ACC WRROW 2)读取包含Bi值的权重RAM 124的行2,并将它们加到累加器202。最后,地址4处的输出指令(OUTPUT SIGMOID、DR OUT ROW+0、CLR ACC)对累加器202值执行S形激活函数,并将结果写入当前数据RAM 122输出行(第一执行实例的行2,第二执行实例的行7,依此类推,直至第十二执行实例的行57),并清零累加器202。
在地址5至8处的指令的第一执行实例期间,128个NPU 126中的每一个计算第一时间步长(时间步长0)的其相应LSTM单元4600的忘记门(F)值,并将F值写到数据RAM 122的行3的相应字;在地址5至8处的指令的第二执行实例期间,128个NPU 126中的每一个计算第二时间步长(时间步长1)的其相应LSTM单元4600的F值,并将F值写到数据RAM 122的行8的相应字;依此类推,直至在地址5到8处的指令的第十二执行实例期间,128个NPU 126中的每一个计算第十二时间步长(时间步长11)的其相应LSTM单元4600的F值,并将F值写到数据RAM122的行58的相应字,如图47所示。地址5到8的指令以类似于如上所述地址1到4的指令的方式计算F值,但地址5到7处的指令分别从权重RAM 124的行3、4和5读取Wf、Uf和Bf值,以执行乘法和/或加法运算。
在地址9到12的指令的十二个执行实例期间,128个NPU 126中的每一个计算相应时间步长的其相应LSTM单元4600的候选单元状态(C')值,并将C'值到权重RAM 124的行9的相应字。地址9到12的指令以类似于如上所述地址1到4的指令的方式计算C'值,但地址9到11的指令分别从权重RAM 124的行6、7和8读取Wc、Uc和Bc值,以执行乘法和/或加法运算。另外,地址12处的输出指令执行tanh激活函数而不是S形激活函数(如地址4处的输出指令那样)。
更具体地,地址9处的乘法-累加指令读取包含与当前时间步长相关联的单元输入(X)值的当前数据RAM 122行(在第一执行实例期间的行0,在第二执行实例期间的行5,依此类推,直至第十二执行实例的行55),并读取包含Wc值的权重RAM 124的行6,并将它们相乘以生成累加到累加器202中的第一乘积,其刚刚由地址8处的指令清零。接下来,地址10处的乘法-累加指令读取包含与当前时间步长相关联的单元输出(H)值的下一个数据RAM 122行(第一执行实例期间的行1,第二执行实例期间的行6,依此类推,直至第十二执行实例的行56),并读取包含Uc值的权重RAM 124的行7,并将它们相乘以生成加到累加器202的第二乘积。接下来,地址11处的将权重字加到累加器指令读取包含Bc值的权重RAM 124的行8,并将它们加到累加器202。最后,地址12的输出指令(OUTPUT TANH、WR OUT ROW 9、CLR ACC)对累加器202值执行tanh激活函数,并将结果写入权重RAM 124的行9并清零累加器202。
在地址13至16处的指令的十二个执行实例期间,128个NPU 126中的每一个计算相应时间步长的其相应LSTM单元4600的新单元状态(C)值,并将新C值写入权重RAM 124的行11的相应字,并计算tanh(C),并将其写入权重RAM 124的行10的相应字。更具体地,地址13处的乘法-累加指令读取当前数据RAM 122行之后的包含与当前时间步长相关联的输入门(I)值的下一行(第一执行实例期间的行2,第二执行实例期间的行7,依此类推,直至第十二执行实例的行57),并读取包含候选单元状态(C')值(刚刚由地址12处的指令写入)的权重RAM 124的行9,并将它们相乘以生成累加到累加器202中的第一乘积,累加器202刚刚由地址12处的指令清零。接下来,地址14处的乘法-累加指令读取包含与当前时间步长相关联的忘记门(F)值的下一个数据RAM 122行(第一执行实例期间的行3,第二执行实例期间的行8,依此类推,直至第十二执行实例的行58),并读取包含在前一时间步长期间计算的当前单元状态(C)值(由地址15处的指令的最近执行实例写入)的权重RAM 124的行11,并将它们相乘以生成加到累加器202的第二乘积。接下来,地址15处的输出指令(OUTPUT PASSTHRU、WROUT ROW 11)使累加器202的值通过,并将它们写入权重RAM的行11。应当理解,由地址14处的指令从数据RAM 122的行11读取的C值是由地址13至15处的指令的最近执行实例生成和写入的C值。地址15处的输出指令不清零累加器202,使得它们的值可以由地址16处的指令使用。最后,地址16处的输出指令(OUTPUT TANH、WR OUT ROW 10、CLR ACC)对累加器202值执行tanh激活函数,并将结果写入权重RAM124的行10,以供计算单元输出(H)值的地址21处的指令使用。地址16处的指令清零累加器202。
在地址17至20处的指令的第一执行实例期间,128个NPU 126中的每一个计算第一时间步长(时间步长0)的其相应LSTM单元4600的输出门(O)值,并将O值写到数据RAM 122的行4的相应字;在地址17至20处的指令的第二执行实例期间,128个NPU 126中的每一个计算第二时间步长(时间步长1)的其相应LSTM单元4600的O值,并将O值写到数据RAM 122的行9的相应字;依此类推,直至在地址17至20处的指令的第十二执行实例期间,128个NPU 126中的每一个计算第十二时间步长(时间步长11)的其相应LSTM单元4600的O值,并将O值写到数据RAM 122的行58的相应字,如图47所示。地址17至20处的指令以类似于如上所述的地址1至4处的指令的方式计算O值,但地址17至19处的指令分别从权重RAM 124的行12、13和14读取Wo、Uo和Bo值,以执行乘法和/或加法运算。
在地址21至22处的指令的第一执行实例期间,128个NPU 126中的每一个计算第一时间步长(时间步长0)的其相应LSTM单元4600的单元输出(H)值,并将H值写到数据RAM 122的行6的相应字;在地址21至22处的指令的第二执行实例期间,128个NPU 126中的每一个计算第二时间步长(时间步长1)的其相应LSTM单元4600的H值,并将H值写到数据RAM 122的行11的相应字;依此类推,直至在地址21至22处的指令的第十二执行实例期间,128个NPU 126中的每一个计算第十二时间步长(时间步长11)的其相应LSTM单元4600的H值,并将H值写到数据RAM 122的行60的相应字,如图47所示。
更具体地,地址21处的乘法-累加指令读取当前数据RAM 122行之后的包含与当前时间步长相关联的输出门(O)值的接下来的第三行(在第一执行实例期间的行4,在第二执行实例期间的行9,依此类推,直至在第十二执行实例期间的行59),并读取包含tanh(C)值(由地址16处的指令写入)的权重RAM124的行10,并将它们相乘以生成累加到累加器202中的乘积,该累加器202刚刚被地址20处的指令清零。然后,地址22处的输出指令使累加器202的值通过,并将它们写入数据RAM 122的接下来的第二输出行11(在第一执行实例期间的行6,在第二执行实例期间的行11,依此类推,直至在第十二执行实例期间的行61),并且清零累加器202。应当理解,由地址22处的指令写入数据RAM 122的行(在第一执行实例期间的行6,在第二执行实例期间的行11,依此类推,直至第十二执行实例的行61)的H值是由地址2、6、10和18处的指令的随后执行实例消耗/读取的。然而,写入第十二执行实例的行61的H值不是由地址2、6、10和18处的指令的执行实例消耗/读取;而是优选地由架构程序消耗/读取。
如果新的循环计数器3804的值大于零,则地址23处的指令(LOOP 1)递减循环计数器3804并循环回到地址1处的指令。
现在参考图49,示出了例示在NPU组内具有输出缓冲器屏蔽和反馈能力的NNU 121实施例的框图。图49示出了四个NPU126的单个NPU组4901。尽管图49示出了单个NPU组4901,但应当理解,NNU 121的每个NPU 126包括在NPU组4901中,使得存在N/J个NPU组4901,其中,N是NPU 126的数量(例如,宽配置中的512个或窄配置中的1024个),J是组4901中的NPU 126的数量(例如,在图49的实施例中为四)。图49将NPU组4901的四个NPU 126称为NPU 0、NPU1、NPU 2和NPU 3。
图49的实施例中的每个NPU 126类似于上面关于图7描述的NPU 126,并且相同编号的元件是相似的。然而,多路复用寄存器208被修改为包括四个附加输入端4905,多路复用寄存器705被修改为包括四个附加输入端4907,选择输入213被修改以从原始输入端211和207以及附加输入端4905中进行选择,用于在输出端209上提供,选择输入713被修改以从原始输入端711和206以及附加输入端4907中进行选择,用于在输出端203上提供。
示出了图11的行缓冲器1104的一部分,在图49中称为输出缓冲器1104。更具体地,示出了输出缓冲器1104的字0、1、2和3,其接收与NPU 0、1、2和3相关联的四个AFU 212的相应输出。输出缓冲器1104的包括对应于NPU组4901的N个字的部分被称为输出缓冲器字组。在图49的实施例中,N是4。输出缓冲器1104的四个字作为到多路复用寄存器208的四个附加输入4905并作为到多路复用寄存器705的四个附加输入4907而被反馈并被接收。输出缓冲器字组到它们各自的NPU组4901的反馈为非架构程序的算术指令提供为其输入选择与NPU组4901相关联的输出缓冲器1104的(即,输出缓冲器字组的)字中的一个或两个的能力,其示例在下面关于图51的非架构程序(例如,在地址4、8、11、12和15处)说明。即,在非架构指令中指定的输出缓冲器1104的字确定在选择输入213/713上生成的值。该能力有效地使得输出缓冲器1104能够用作中间生成和使用的值的各种类型的便笺式存储器,这可以使得非架构程序能够减少对数据RAM 122和/或权重RAM 124的写入次数以及随后从其读取的次数。优选地,输出缓冲器1104或行缓冲器1104包括寄存器的一维阵列,其可以被配置为存储1024个窄字或512个宽字。优选地,输出缓冲器1104可以在单个时钟周期中读取并且在单个时钟周期中写入。与架构程序和非架构程序都可访问的数据RAM 122和权重RAM 124不同,输出缓冲器1104不能被架构程序访问,而只能由非架构程序访问。
输出缓冲器1104被修改为接收掩码输入4903。优选地,掩码输入4903包括对应于与NPU组4901的四个NPU 126相关联的输出缓冲器1104的四个字的四个位。优选地,如果对应于输出缓冲器1104的字的掩码输入4903位为真,则输出缓冲器1104的字保持其当前值;否则,输出缓冲器1104的字用AFU 212输出更新。即,如果对应于输出缓冲器1104的字的掩码输入4903位为假,则将AFU 212输出写入输出缓冲器1104的字。这为非架构程序的输出指令提供了选择性地将AFU 212输出写入输出缓冲器1104的一些字,并保持输出缓冲器1104的其它字的当前值的能力,其示例在下面关于图51的非架构程序的指令(例如,在地址6、10、13和14处的)说明。即,在非架构指令中指定的输出缓冲器1104的字确定在掩码输入4903上生成的值。
为了简单起见,图49没有示出多路复用寄存器208/705的输入1811(例如,图18、19和23的)。但考虑支持动态可配置NPU 126和输出缓冲器1104的反馈/屏蔽的实施例。优选地,在这种实施例中,输出缓冲器字组是相应地可动态配置的。
应当理解,虽然描述了NPU组4901中的NPU 126的数量为四的实施例,但是考虑数量更大或更小的其他实施例。此外,在包括诸如图52所示的共享AFU 1112的实施例中,在NPU组4901中的NPU 126的数量和AFU 212组中的NPU 126的数量之间可以存在协同关系。NPU组内的输出缓冲器1104屏蔽和反馈能力特别有益于有效地执行与LSTM单元4600相关联的计算,如相关于图50和51更详细地描述的。
现在参考图50,示出了例示当图49的NNU 121执行与图46的LSTM单元4600的层相关联的计算时NNU 121的数据RAM 122、权重RAM 124和输出缓冲器1104内的数据布局的示例的框图。在图50的示例中,NNU 121被配置为512个NPU 126或者神经元,例如在宽配置中。类似于图47和48的示例,在图50和51的示例中,在LSTM层中仅有128个LSTM单元4600。然而,在图50的示例中,使用由所有512个NPU 126(例如,NPU 0至127)生成的值。有利地,当执行图51的非架构程序时,每个NPU组4901共同作为LSTM单元4600操作。
如图所示,数据RAM 122保存时间步长序列的单元输入(X)和输出(H)值。更具体地,两行的一对保存给定时间步长的X和H值。在数据RAM 122具有64行的实施例中,数据RAM122可以保存31个不同时间步长的单元值,如图所示。在图50的示例中,行2和3保存时间步长0的值,行4和5保存时间步长1的单元值,依此类推,直至行62和63保存时间步长30的单元值。对中第一行保存时间步长的X值,对中的第二行保存时间步长的H值。如图所示,对应于数据RAM 122中的NPU组4901的四列的每一组保存其对应的LSTM单元4600的值。即,列0-3保存与LSTM单元0相关联的值,其计算由NPU 0-3(即,NPU组0)执行;列4-7保存与LSTM单元1相关的值,其计算由NPU4-7(即,NPU组1)执行,依此类推,直至列508-511保存与LSTM单元127相关联的值,其计算由NPU 508-511(即,NPU组127)执行,如下面关于图51更详细描述的。如图所示,不使用行1,行0保存初始单元输出(H)值,优选地由架构程序以零值填充,但考虑非架构的初始指令填充行0的初始单元输出(H)值的实施例。
优选地,X值(在行2、4、6依此类推,直至62中的)由在处理器100上运行的架构程序经由MTNN指令1400写入/填充到数据RAM 122中,并且由在NNU 121上运行的非架构程序(诸如图50的非架构程序)读取/使用。优选地,H值(在行3、5、7依此类推,直至63中的)由在NNU121上运行的非架构程序写入/填充到数据RAM 122中并且同样由在NNU 121上运行的非架构程序读取/使用,如下面更详细描述的。优选地,H值还由在处理器100上运行的架构程序经由MFNN指令1500读取。注意,图51的非架构程序假设在对应于NPU组4901的四列的每一组内(例如,列0-3、4-7、5-8依此类推,直至508-511),给定行中的四个X值用相同的值(例如,由架构程序)填充。类似地,图51的非架构程序在对应于给定行中的NPU组4901的四列的每一组内为四个H值计算和写入相同值。
如图所示,权重RAM 124保存NNU 121的NPU的权重值、偏差值和单元状态(C)值。在对应于NPU组4901的四列的每一组(例如,列0-3、4-7、5-8依此类推,直至508-511)中:(1)其索引除以4的余数等于3的列分别保存行0、1、2和6中的Wc、Uc、Bc和C值;(2)其索引除以4的余数等于2的列分别保存行3、4和5中的Wo、Uo和Bo值;(3)其索引除以4的余数4等于1的列分别保存行3、4和5中的Wf、Uf和Bf值;及(4)其索引除以4的余数等于0的列分别保存行3、4和5中的Wi、Ui和Bi值。优选地,权重值和偏差值——Wi、Ui、Bi、Wf、Uf、Bf、Wc、Uc、Bc、Wo、Uo、Bo(在行0到5中)——由在处理器100上运行的架构程序经由MTNN指令1400写入/填充到RAM124,并且由在NNU 121上运行的非架构程序(例如图51的非架构程序)读取/使用。优选地,中间C值由在NNU 121上运行的非架构程序写入/填充到权重RAM 124并且由在NNU 121上运行的非架构程序读取/使用,如下面更详细描述的。
图50的示例假定架构程序:(1)用31个不同时间步长的输入X值(行2、4依此类推,直至62)填充数据RAM 122;(2)开始图51的非架构程序;(3)检测非架构程序已完成;(4)从数据RAM 122读出输出H值(行3、5依此类推,直至63);及(5)按照完成任务(例如用于执行对移动电话的用户做出的陈述的识别的计算)所需的次数重复步骤(1)至(4)。
在替代方案中,架构程序:(1)用单个时间步长的输入X值(例如,行2)填充数据RAM122;(2)开始非架构程序(图51的不需要循环并访问单对数据RAM 122行的单个对的修改形式);(3)检测非架构程序已完成;(4)从数据RAM 122读出输出H值(例如,第3行);和(5)按照完成任务所需的次数重复步骤(1)至(4)。根据对LSTM层的输入X值进行采样的方式,两种方案中的任一种都可以是优选的。例如,如果任务容许对多个时间步长(例如,31数量级的)对输入进行采样并且执行计算,则第一方案可能是优选的,因为它可能更具计算资源效率和/或有更高性能,而如果任务不能仅容许在单个时间步长的采样,则可能需要第二方案。
考虑类似于第二方案的第三实施例,但其中,不使用数据RAM 122行的单个对,非架构程序使用行的多个对,即,用于每个时间步长的不同对,类似于第一方案。在第三实施例中,优选地,架构程序包括在步骤(2)之前的步骤,其中,它在开始它之前更新非架构程序,例如通过更新地址1处的指令中的数据RAM 122行以指向下一对。
如图所示,输出缓冲器1104保存在针对NNU 121的对应NPU 0至511执行图51的非架构程序的不同地址处的指令之后的单元输出(H)、候选单元状态(C')、输入门(I)、忘记门(F)、输出门(O)、单元状态C)和tanh(C),如图所示。在每个输出缓冲器字组(例如,对应于NPU组4901的输出缓冲器1104的四个字的组,例如字0-3、4-7、5-8依此类推,直至508-511)中,其索引除以4的余数等于3的字被称为OUTBUF[3],其索引除以4的余数等于2的字被称为OUTBUF[2],其索引除以4的余数等于1的字被称为OUTBUF[1],其索引除以4的余数等于0的字称为OUTBUF[0]。
如图所示,在图51的非架构程序的地址2处的指令的执行之后,对于每个NPU组4901,用相应LSTM单元4600的初始单元输出(H)值写入输出缓冲器1104的所有四个字。在地址6处的指令的执行之后,对于每个NPU组4901,用相应LSTM单元4600的候选单元状态(C')值写入OUTBUF[3],并且将输出缓冲器1104的其它三个字保持它们先前的值。在地址10处的指令的执行之后,对于每个NPU组4901,用相应LSTM单元4600的输入门(I)值写入OUTBUF[0],用相应LSTM单元4600的忘记门(F)值写入OUTBUF[1],用相应LSTM单元4600的输出门(O)值写入OUTBUF[2],并且OUTBUF[3]保持其先前的值。在地址13处的指令的执行之后,对于每个NPU组4901,用相应LSTM单元4600的新单元状态(C)值写入OUTBUF[3](由于包括时隙3中的C值的输出缓冲器1104被写入权重RAM 124的行6,如以下相关于图51更详细说明的),输出缓冲器1104的其它三个字保持它们以前的值。在地址14处的指令的执行之后,对于每个NPU组4901,用相应LSTM单元4600的tanh(C)值写入OUTBUF[3],输出缓冲器1104的其他三个字保持其先前的值。在地址16处的指令的执行之后,对于每个NPU组4901,输出缓冲器1104的所有四个字都用相应LSTM单元4600的新单元输出(H)值写入。在程序在地址17循环回到地址3时,该模式从地址6到地址16(即,排除在地址2处的执行,因为它在程序循环之外)重复三十次以上。
现在参考图51,示出了例示用于存储在图49的NNU 121的程序存储器129中并由NNU 121执行以实现与LSTM单元层相关联的计算并且使用根据图50的布置的数据和权重的程序的表。图51的示例性程序包括在地址0到17处的18个非架构指令。地址0处的指令是初始化指令,其清零累加器202并将循环计数器3804初始化为值31以使循环体(地址1至17的指令)执行31次。初始化指令还将待写入的数据RAM 122行(例如,图26/39的寄存器2606)初始化为值1,其将由地址16处的指令的第一执行实例递增到3。优选地,初始化指令还将NNU121置于宽配置中,使得NNU 121被配置为512个NPU 126。从下面的描述可以观察到,在地址0至17的指令的执行期间,512个NPU 126的128个NPU组4901中的每一个对应于128个LSTM单元4600中的一个并作为128个LSTM单元4600中的一个操作。
地址1和2处的指令在循环体之外并且仅执行一次。它们生成初始单元输出(H)值(例如零值)并将其写入输出缓冲器1104的所有字。地址1处的指令从数据RAM 122的行0读取初始H值,并将它们放入累加器202,累加器202由地址0处的指令清零。地址2处的指令(OUTPUT PASSTHRU、NOP、CLR ACC)传递累加器202值到达输出缓冲器1104,如图50所示。地址2处的输出指令(以及图51的其他输出指令)中的“NOP”标记指示正被输出的值仅被写入到输出缓冲器1104而不被写入存储器,即,既不被写入数据RAM 122也不被写入权重RAM124。地址2处的指令还清零累加器202。
地址3至17处的指令在循环体内并执行循环计数次数(例如,31)。
地址3至6处的指令的每个执行实例计算当前时间步长的tanh(C')值并将其写入OUTBUF[3],其将由地址11处的指令使用。更具体地,地址3处的乘法-累加指令从当前数据RAM 122读取行(例如,2、4、6依此类推,直至62)读取与时间步长相关联的单元输入(X)值,并从权重RAM 124的行0读取Wc值,并将它们相乘以生成加到累加器202的乘积,累加器202由地址2的指令清零。
在地址4处的乘法累加指令(MULT-ACCUM OUTBUF[0]、WR ROW 1)从OUTBUF[0]读取(即,NPU组4901的所有4个NPU 126)H值并从权重RAM124的行1读取Uc值,并将它们相乘以生成加到累加器202的第二乘积。
在地址5处的将权重字加到累加器指令(ADD_W_ACC WR ROW 2)从权重RAM 124的行2读取Bc值,并将它们加到累加器202。
地址6处的输出指令(OUTPUT TANH、NOP、MASK[0:2]、CLR ACC)对累加器202的值执行tanh激活函数,并且将结果仅写入OUTBUF[3](即,仅其索引除以4的余数等于3的NPU组4901的NPU 126写入其结果),累加器202被清零。即,地址6处的输出指令屏蔽OUTBUF[0]、OUTBUF[1]和OUTBUF[2](由MASK[0:2]命名指示),以使它们保持其当前值,如图50所示。另外,地址6处的输出指令不写入存储器(如NOP标记所示)。
地址7至10处的指令的每个执行实例计算当前时间步长的输入门(I)、忘记门(F)和输出门(O)值并将它们分别写入OUTBUF[0]、OUTBUF[1]、OUTBUF[2],它们将分别由地址11、12和15处的指令使用。更具体地,地址7处的乘法-累加指令从当前数据RAM 122读取行(例如,2、4、6依此类推,直至62)读取与时间步长相关联的单元输入(X)值,并从权重RAM124的行3读取Wi、Wf和Wo值,并将它们相乘,以生成加到累加器202的乘积,累加器202被地址6处的指令清零。更具体地说,在NPU组4901中,其索引除以4的余数等于0的NPU 126计算X和Wi的乘积,其索引除以4的余数等于1的NPU 126计算X和W f的乘积,其索引除以4的余数等于2的NPU 126计算X和Wo的乘积。
地址8处的乘法-累加指令从OUTBUF[0]读取(即,NPU组4901的所有4个NPU 126)H值,并从权重RAM 124的行4读取Ui、Uf和Uo值,并且将它们相乘以生成加到累加器202的第二乘积。更具体地,在NPU组4901内,其索引除以4的余数等于0的NPU 126计算H和Ui的乘积,其索引除以4的余数等于1计算H和Uf的乘积,其索引除以4的余数等于2的NPU 126计算H和Uo的乘积。
在地址9处的将权重字加到累加器指令从权重RAM 124的行5读取Bi、Bf和Bo值,并将它们加到累加器202。更具体地,在NPU组4901内,其索引除以4的余数等于0的NPU 126加上Bi值,其索引除以4的余数等于1的NPU126加上Bf值,其索引除以4的余数等于2的NPU 126加上Bo值。
地址10处的输出指令(OUTPUT SIGMOID、NOP、MASK[3]、CLR ACC)对累加器202值执行S形激活函数,并将计算的I、F和O值分别写入OUTBUF[0]、OUTBUF[1]和OUTBUF[2],并且清零累加器202,但不写入存储器。即,地址10处的输出指令屏蔽OUTBUF[3](如MASK[3]标记所示),以使其保持其当前值(为C'),如图50所示。
地址11至13处的指令的每个执行实例计算由当前时间步长生成的新单元状态(C)值并将其写入权重RAM 124的行6,更具体地,写入对应于NPU组4901的四列内其索引除以4的余数等于3的行6的字,以用于下一时间步长(即,通过在下一循环迭代期间在地址12处的指令)。另外,地址14处的指令的每个执行实例将tanh(C)值写入OUTBUF[3],其将由地址15处的指令使用。
更具体地,地址11处的乘法-累加指令(MULT-ACCUM OUTBUF[0]、OUTBUF[3])从OUTBUF[0]读取输入门(I)值,并从OUTBUF[3]读取候选单元状态(C')值,并将它们相乘以生成加到累加器202的第一乘积,累加器202被地址10处的指令清零。更具体地说,NPU组4901内的每个四个NPU 126计算第一乘积I和C'。
地址12处的乘法-累加指令(MULT-ACCUM OUTBUF[1]、WR ROW 6)指示NPU 126从OUTBUF[1]读取忘记门(F)值,并从权重RAM 124的行6读取其相应的字,并且将它们相乘以生成加到由地址11处的指令生成的累加器202中的第一乘积的第二乘积。更具体地,从行6读出的字是在其索引除以4的余数等于3的NPU组4901的NPU 126的情况下的在前时间步长中计算的当前单元状态(C)值,使得第一和第二乘积的和是新单元状态(C)。然而,从行6读取的字对于NPU组4901的其他三个NPU126是无关值,因为它们的所得累加值将不被使用,即将不会通过地址13和14处的指令被放入输出缓冲器1104中,并且将由地址4处的指令清零。即,只使用由其索引除以4的余数等于3的NPU组4901的NPU 126生成的结果新单元状态(C)值,即每个在地址13和14处的指令。
在地址12处的指令的第二至第三十一个执行实例的情况下,从权重RAM124的行6读取的C值在循环体的在前迭代期间由在地址13处的指令写入。然而,对于地址12处的指令的第一执行实例,通过在开始图51的非架构程序之前的架构程序或通过非架构程序的修改形式以初始值写入行6中的C值。
地址13处的输出指令(OUTPUT PASSTHRU、WR ROW 6、MASK[0:2])将累加器202值(即,计算出4的余数等于3的NPU 126将其计算的C值写入输出缓冲器11的C值)传递至仅到达OUTBUF[3](即,NPU组4901中仅其索引除以04),用更新的输出缓冲器1104写入权重RAM124的行6,如图50所示。即,地址13的指令屏蔽OUTBUF[0]、OUTBUF[1]和OUTBUF[2],使它们保持其当前值(I、F和O)。如上所述,仅使用对应于其索引除以4的余数等于3的NPU组4901的每一组四列内的行6的字中的C值,即通过地址12处的指令;因此,非架构程序不关心权重RAM 124的行6的列0-2、4-6依此类推,直至508-510中的值,如图50所示(其是I、F和O值)。
地址14处的输出指令(OUTPUT TANH、NOP、MASK[0:2]、CLR ACC)对累加器202值执行tanh激活函数,并将计算出的tanh(C)值写入OUTBUF[3],并清零累加器202,但不写入存储器。地址14处的输出指令(如地址13处的输出指令一样)屏蔽OUTBUF[0]、OUTBUF[1]和OUTBUF[2],以使它保持当前值,如图50所示。
地址15至16处的指令的每个执行实例计算当前时间步长生成的单元输出(H)值并将其写入数据RAM 122的当前输出行之后接下来的第二行,其将由架构程序读取并且在下一时间步长(即,在下一循环迭代期间通过地址3和7处的指令)中使用。更具体地,地址15处的乘法-累加指令从OUTBUF[2]读取输出门(O)值,并从OUTBUF[3]读取tanh(C)值,并将它们相乘以生成加到累加器202的乘积,累加器202由地址14处的指令清零。更具体地,NPU组4901内的每个四个NPU 126计算O和tanh(C)的乘积。
地址16处的输出指令使累加器202的值通过,并且将所计算的H值在第一执行实例期间写入行3,在第二执行实例期间写入行5,依此类推,在第三十一执行实例期间写入行63,如图50所示,其随后由地址4和8处的指令使用。另外,如图50所示,将所计算的H值放入输出缓冲器1104中,以便随后由地址4和8处的指令使用。地址16处的输出指令还清零累加器202。在一个实施例中,LSTM单元4600被设计为使得地址16处的输出指令(和/或图48的地址22处的输出指令)具有激活函数,例如S形或tanh,而不是使累加器202的值通过。
如果新的循环计数器3804值大于零,则地址17处的循环指令递减循环计数器3804并循环回到地址3处的指令。
可以观察到,图51的非架构程序的循环体中的指令的数量比图48的非架构的指令的数量少约34%,其借助于输出缓冲器1104反馈以及图49的NNU 121实施例的屏蔽能力。另外,图51的非架构程序的数据RAM 122中的存储器布局容纳的时间步长数量约为图48的三倍,这借助于输出缓冲器1104反馈以及图49的NNU 121实施例的屏蔽能力。取决于采用NNU121执行LSTM单元层计算的特定架构程序应用,这些改进可能是有帮助的,特别是在LSTM层中的LSTM单元4600数量小于或等于128的应用中。
在图47至51的实施例中,假定权重值和偏差值在时间步长上保持相同。然而,考虑权重值和偏差值随时间步长变化的其它实施例,在这种情况下,不是如图47和50所示的用权重值和偏差值的单个集合填充权重RAM 124,用每个时间步长不同的权重值和偏差值集合填充权重RAM 124,并且相应地修改图48和51的非架构程序的权重RAM 124地址。
已经说明了图47至51的实施例,其中一般来说,权重值、偏差值和中间值(例如C,C')存储在权重RAM 124中,输入值和输出值(例如,X、H)存储在数据RAM 122中。这对于数据RAM 122是双端口并且权重RAM 124是单端口的实施例是有利的,因为从非架构程序和架构程序到数据RAM 122的业务量更多。然而,由于权重RAM 124较大,因此考虑写入非架构程序和架构程序以交换其中存储了值的存储器(即,数据RAM 122和权重RAM 124)的实施例。即,将W、U、B、C'、tanh(C)和C值存储在数据RAM 122中,将X、H、I、F和O值存储在权重RAM 124中(图47的修改实施例);及将W、U、B、C值存储在数据RAM 122中,将X和H值存储在权重RAM 124中(图50的修改实施例)。对于这些实施例,可以批量地一起处理更大数量的时间步长,因为权重RAM 124较大。这对于利用NNU 121执行得益于更大数量的时间步长并且单端口存储器(例如,权重RAM 124)提供足够带宽的计算的一些架构程序应用可能是有利的。
现在参考图52,示出了例示具有NPU组内的输出缓冲器屏蔽和反馈能力并且采用共享AFU 1112的NNU 121实施例的框图。图52的NNU 121在许多方面与图49的NNU 121类似,并且相同编号的元件是相似的。然而,图49的四个AFU 212被替换为单个共享AFU 1112,其接收四个累加器202的四个输出217,并且生成到OUTBUF[0]、OUTBUF[1]、OUTBUF[2]和OUTBUF[3]的四个输出。图52的NNU 121以与上文关于图49至51所述的方式类似的方式,并且与上文关于图11至13所述的关于共享AFU 1112的操作的方式类似的方式操作。
现在参考图53,示出了例示根据可替换实施例的当图49的NNU 121执行与图46的128个LSTM单元4600的层相关联的计算时NNU 121的数据RAM122、权重RAM 124和输出缓冲器1104内的数据布局的示例的框图。图53的示例在许多方面与图50的示例类似。但在图53中,Wi、Wf和Wo值在行0中(而不是如图50中的行3中);Ui、Uf和Uo值在行1中(而不是如图50中的行4);Bi、Bf和Bo值在行2中(而不是如图50中的行5);C值在行3中(而不是如图50中的行6)。另外,输出缓冲器1104的内容在图53中与图50中相同,然而,由于图54的非架构程序与图51的差异(下面将更详细地说明差异),在7处(而不是图50中的10)的指令执行之后,输出缓冲器1104中存在第三行的内容(即,I、F、O和C'值);在10处(而不是图50中的13)的指令执行之后,输出缓冲器1104中存在第四行的内容(即,I、F、O和C值);在11处(而不是图50中的14)的指令执行之后,输出缓冲器1104中存在第五行的内容(即I、F、O和tanh(C)值);在执行13处(而不是图50中的16)的指令执行之后,输出缓冲器1104中存在第六行的内容(即,H值)。
现在参考图54,示出了例示用于存储在图49的NNU 121的程序存储器129中并由图49的NNU 121执行以实现与LSTM单元层相关联的计算并且使用根据图53的布置的数据和权重的程序的表。图54的示例性程序在许多方面类似于图51的程序。更具体地,地址0到5的指令在图54和51中是相同的;图54的地址7和8处的指令与图51的地址10和11处的指令相同;并且图54的地址10至14处的指令与图51的地址13至17处的指令相同。
然而,图54的地址6处的指令不清零累加器202(而是图51的地址6处的指令进行)。此外,图54的非架构中不存在地址7到9的指令。最后,图54的地址9处的指令与图51的地址12处的指令相同,除了图54的地址9处的指令从权重RAM 124的行3读取,而图51的地址12处的指令从权重RAM 124的行6读取。
作为图54和51的非架构程序之间的差异的结果,图53的布局少使用权重RAM 124的三行,并且在程序循环中少包括三个指令。实际上,图54的非架构程序的循环体的大小基本上是图48的非架构程序的循环体的大小的一半,大约是图51的非架构程序的循环体的大小的80%。
现在参考图55,示出了例示根据替代实施例的NPU 126的各部分的框图。更具体地,对于图49的NPU 126的单个NPU 126,示出了多路复用寄存器208及其相关联的输入端207、211和4905,以及多路复用寄存器705及其相关联的输入端206、711和4907。除了图49的输入之外,NPU 126的多路复用寄存器208和多路复用寄存器705各自接收index_within_group输入5599。index_within_group输入5599指示其NPU组4901内的特定NPU 126的索引。因此,例如,在每个NPU组4901具有四个NPU 126的实施例中,在每个NPU组4901内,NPU 126中的一个在其index_within_group输入端5599上接收值零,NPU 126中的一个在其index_within_group输入端5599上接收值1,NPU 126中的一个在其index_within_group输入端5599上接收值2,NPU 126中的一个在其index_within_group输入端5599上接收值3。换句话说,由NPU 126接收的index_within_group输入5599值是其在NNU 121中的索引除以J的余数,其中,J是NPU组4901中的NPU 126的数量。因此,例如,NPU 73在其index_within_group输入端5599上接收值1,NPU 353在其index_within_group输入端5599上接收值3,NPU 6在其index_within_group输入端5599上接收值2。
另外,当控制输入213指定预定值(本文称为“SELF”)时,多路复用寄存器208选择对应于index_within_group输入5599值的输出缓冲器1104输入4905。因此,有利地,当非架构指令指定从输出缓冲器1104接收具有值SELF的数据(在图57的地址2和7处的指令中表示为OUTBUF[SELF])时,每个NPU 126的多路复用寄存器208从输出缓冲器1104接收其相应的字。因此,例如,当NNU 121执行在图57的地址2和7处的非架构指令时,NPU 73的多路复用寄存器208选择四个输入4905中的第二个(索引1)以从输出缓冲器1104接收字73,NPU 353的多路复用寄存器208选择四个输入4905中的第四个(索引3)以从输出缓冲器1104接收字353,NPU 6的多路复用寄存器208选择四个输入4905的第三个(索引2)以从输出缓冲器1104接收字6。尽管未在图57的非架构程序中采用,但非架构指令可以指定从具有值SELF的输出缓冲器1104接收数据(OUTBUF[SELF]),以使得控制输入713指定预定值,使得每个NPU126的多路复用寄存器705从输出缓冲器1104接收其相应的字。
现在参考图56,示出了例示当NNU 121执行与图43的Jordan RNN相关联的计算,但是采用图55的实施例提供的益处时,NNU 121的数据RAM 122和权重RAM 124内的数据布局的示例的框图。权重RAM 124内的权重的布局与图44的相同。数据RAM 122内的值的布局类似于图44的相似,除了每个时间步长具有保存输入层节点D值和输出层节点Y值的行的相关对,而不是如图44所示的行的四元组。即,隐藏层Z值和语境层C值没有写入数据RAM 122。相反,输出缓冲器1104用作用于隐藏层Z值和语境层C值的便笺式存储器,如关于图57的非架构程序更详细地描述的。有利地,OUTBUF[SELF]输出缓冲器1104反馈特征潜在地使得非架构程序能够更快(由于用来自输出缓冲器1104的两个写入和两个读取来替换来自数据RAM122的两个写入和两个读取),并且使得每个时间步长能够使用更少的数据RAM 122空间,这使得数据RAM 122能够保存大约两倍于图44和45的实施例的时间步长,具体地32个时间步长,如图所示。
现在参考图57,示出了例示用于存储在NNU 121的程序存储器129中并且由NNU121执行以实现Jordan RNN并且使用根据图56的布置的数据和权重的程序的表。图57的非架构程序在一些方面类似于图45的非架构,将说明区别。
图57的示例性程序包括在地址0到11处的12个非架构指令。地址0处的初始化指令清零累加器202,并将循环计数器3804初始化为值32,以使循环体(地址2至11的指令)被执行32次。地址1处的输出指令将累加器202的零值(由地址0处的初始化指令清零)放入到输出缓冲器1104。可以观察到,512个NPU 126在地址2到6的指令的执行期间对应于512个隐藏层节点Z,并且作为512个隐藏层节点Z操作,并且在地址7到10的指令的执行期间对应于512个输出层节点Y并且作为512个输出层节点Y操作。即,在地址2到6的指令的32个执行实例6计算32个相应时间步长的隐藏层节点Z的值,并将它们放入输出缓冲器1104中以由地址7至9的指令的相应32个执行实例使用,以计算相应的32个时间步长的输出层节点Y并将其写入数据RAM 122,并由地址10处的指令的相应32个执行实例使用,以将相应的32个时间步长的语境层节点C放入输出缓冲器1104中。(不使用放入输出缓冲器1104的第三十二时间步长的语境层节点C)。
在地址2和3处的指令(ADD_D_ACC OUTBUF[SELF]和ADD_D_ACC ROTATE、COUNT=511)的第一执行实例期间,512个NPU 126中的每一个将其输出缓冲器1104的512个语境节点C值累加到其累加器202中,它们通过执行地址0到1的指令而生成和写入。在地址2和3处的指令的第二和随后的执行实例期间,512个NPU 126中的每一个将输出缓冲器1104的512个语境节点C值累加到其累加器202中,这些语境节点C值是通过执行地址7至8和10处的指令而生成和写入的。更具体地,地址2处的指令指示每个NPU 126的多路复用寄存器208选择其相应的输出缓冲器1104字,如上所述,并将输出缓冲器1104字加到累加器202;地址3处的指令指示NPU 126将语境节点C值在由512个NPU 126中的512个NPU 126的所连接的多路复用寄存器208共同形成的512字旋转器中旋转,以使得每个NPU 126能够将512个语境节点C值累加到其累加器202中。地址3处的指令不清零累加器202,这使得地址4和5处的指令能够将输入层节点D(乘以其对应的权重)与通过执行地址2和3处的指令累加的语境节点C值累加。
在地址4和5处的指令(MULT-ACCUM DR ROW+2、WR ROW 0和MULT-ACCUM ROTATE、WRROW+1、COUNT=511)的每个执行实例期间,512个NPU 126的每个NPU 126执行将与当前时间步长相关联的数据RAM 122的行(例如,用于时间步长0的行0,用于时间步长1的行2,依此类推,直至用于时间步长31的行62)中的512个输入节点D值乘以来自权重RAM 124的行0到511的NPU 126的各自权重列的512个乘法运算,生成512个乘积,该512个乘积与由地址2和3处的指令执行的512个语境C节点值的累加一起累加到相应NPU 126的累加器202中以计算隐藏节点Z层值。
在地址6处的指令(OUTPUT PASSTHRU、NOP、CLR ACC)的每次执行期间,使512个NPU126的512个累加器202的值通过并写入输出缓冲器1104的其相应字,并且累加器202被清零。
在地址7和8处的指令(MULT-ACCUM OUTBUF[SELF]、WR ROW 512和MULT-ACCUMROTATE、WR ROW+1、COUNT=511)的每个执行实例期间,512个NPU 126的每个NPU 126执行将输出缓冲器1104中的512个隐藏节点Z值(它们由地址2到6处的指令的相应执行实例生成和写入)乘以来自权重RAM 124的行512到1023的NPU 126的各自权重列的512个乘法运算,以生成累加到相应NPU 126的累加器202中的512个乘积。
在地址9处的指令(OUTPUT ACTIVATION FUNCTION、DR OUT ROW+2)的每个执行实例期间,对512个累加值执行激活函数(例如,tanh、S形、校正)以计算输出节点Y层值,其被写入与当前时间戳相关联的数据RAM 122的行(例如,用于时间步长0的行1,用于时间步长1的行3,依此类推,直至用于时间步长31的行63)。地址9处的输出指令不清零累加器202。
在地址10处的指令(OUTPUT PASSTHRU、NOP、CLR ACC)的每个执行实例期间,将由地址7和8处的指令累加的512个值放入输出缓冲器1104中以供地址2和3处的指令的下一个执行实例使用,并且累加器202被清零。
如果新的循环计数器3804值大于零,则地址11处的循环指令递减循环计数器3804并循环回到地址2处的指令。
如关于图44所描述,在由图57的非架构性程序执行的示例性Jordan RNN中,虽然将激活函数应用于累加器202值以生成输出层节点Y值,但假设在应用激活函数之前使累加器202值通过到达语境层节点C而不是实际输出层节点Y值。然而,对于将激活函数应用于累加器202值以生成语境层节点C的Jordan RNN,地址10处的指令将从图57的非架构程序中消除。虽然描述了Elman或Jordan RNN包括单个隐藏节点层(例如,图40和42)的实施例,但是应当理解,处理器100和NNU 121的实施例被配置为以类似于本文所述的方式有效地执行与包括多个隐藏层的RNN相关联的计算。
如上面关于图2所描述的,有利地,每个NPU 126被配置为作为人工神经网络中的神经元操作,并且NNU 121的所有NPU 126以大规模并行方式操作,以有效地计算网络层的神经元输出值。NNU操作的并行方式,特别是通过使用集合NPU多路复用寄存器旋转器,可能与计算神经元层输出值的常规方式直觉上相反。更具体地,常规方式通常涉及执行与单个神经元或相对小的神经元子集相关联的计算(例如,使用并行算术单元来执行乘法和加法),然后移动到执行与在层中的下一个神经元相关的计算,以顺序方式依此类推,直到已经对层中的所有神经元执行了计算。相反,每个时钟周期,NNU 121的所有NPU 126(神经元)并行地执行与所有神经元输出的生成相关联的计算的小子集(例如,单个乘法和累加)。有利地,在大约M个时钟周期的结束处(其中M是连接到当前层的节点的数量),NNU 121已经计算了所有神经元的输出。对于许多人工神经网络配置,由于大量的NPU 126,NNU 121能够在M个时钟周期的结束时计算整个层的所有神经元的神经元输出值。从本文的说明可以看出,这种计算效率对于所有种类的人工神经网络计算都是有用的,包括但不限于前馈和递归神经网络,例如Elman、Jordan和LSTM网络。最后,尽管说明了NNU 121被配置为512个NPU 126(例如,以宽字配置)以执行递归神经网络计算的实施例,但是可以设想其他实施例,其中,NNU 121被配置为1024个NPU 126(例如,以窄字配置)以执行递归神经网络计算,并且如上所述,考虑具有与512或1024不同数量的NPU 126的NNU 121的实施例。
3维卷积神经网络
卷积神经网络在深度学习领域中变得越来越流行,并且在图像识别领域中生成令人印象深刻的结果,在诸如自然语言处理、推荐系统和游戏之类的其他领域中具有有前途的结果。卷积神经网络包括至少一个卷积层,其将输入与滤波器卷积以产生输出。通常,卷积神经网络包括一系列这样的卷积层,其中,卷积层的输出作为后续卷积层的输入提供,可能在其间具有池化层。
卷积神经网络的启发归因于对动物视觉皮质的性质的研究,其中,单个神经元对在动物眼睛的视野的子区域内接收的光做出响应。子区域被称为神经元的接受场。视觉皮质神经元的重叠接受场构成视野。更具体地,神经元能够在接受场内检测特定形状,例如具有特定取向的直边缘或特定颜色的斑点。由于跨越视野的类似神经元的平铺,动物的大脑可以检测特定形状,而不管形状在视野内的位置。这种现象可以称为平移不变性。当输入数据是平移不变量时,许多卷积神经网络显得特别有用,因为滤波器权重与整个输入(例如,整个图像)相关。平移不变性特征使得滤波器能够在整个输入上被重新使用,从而相对于例如以上也被称为经典神经网络层或乘法-累加层的完全连接层大大减少了所需的权重的数量。本文说明的是加速与上述NNU 121的实施例以及附加实施例上的卷积神经网络相关的计算的执行的方法的实施例。
如上所述,卷积运算是将第一矩阵与第二矩阵卷积的运算。第二矩阵在上面被称为卷积核;然而,关于下面描述的图,第二矩阵通常被称为权重、参数、元素或值的滤波器。另外,尽管上文关于图24至26说明的第一矩阵和第二矩阵是二维(2D)矩阵,但是下面说明了第一矩阵和第二矩阵是3维(3D)矩阵的卷积运算,因为3D卷积是经常在卷积神经网络中使用。即,输入是3D矩阵,并且滤波器是3D矩阵,现在将相关于图58来说明。
现在参考图58,示出了例示诸如通常由卷积神经网络执行的3维(3D)卷积计算任务的框图。更具体地,3D输入5802与多个滤波器5804卷积以生成输出5808。通常,输入5802具有W列、H行和C个通道;存在每一个具有S列、R行和C个通道(对应于输入5802的C个通道)的F个滤波器5804;并且存在每一个具有P列和Q行的F个输出5808(对应于F个滤波器5804)。W、H、C、F、S、R、Q和P是由NNU 121硬件执行的特定神经网络的超参数。相对于执行它们的硬件,神经网络的超参数是动态的,因为尽管硬件的特性是静态的(例如,算术逻辑单元的数量,存储器宽度),但是超参数对于NNU 121执行的不同神经网络是不同的。例如,一个神经网络可以被设计为执行图像识别,而另一个神经网络可以被设计为播放GO。此外,即使在图像识别/GO网络内,各自都可以具有不同的超参数,包括层数、层尺寸(节点和互连的数量)和层类型(例如,完全连接、卷积、池化、LSTM)。
作为说明性示例,输入5802可以包括W=12列、H=12行和C=20个通道;可以存在50个滤波器5804,每个具有S=5列和R=5行;并且可以存在50个输出5808,每个输出具有P=8列和Q=8行,它们是设计用于对手写数字进行分类的公知神经网络的卷积层的输入、滤波器和输出的超参数,例如可以使用公知的MNIST数据库训练的,即LeCun,Y.、Bottou,L.、Bengio,Y.和Haffner,P.(1998)Gradient-based learning applied to documentrecognition,Proceedings of the IEEE,86(11),2278–2324中说明的LeNet 5的变体。下面相关于图59至69说明NNU 121执行卷积计算以便将12×12×20输入5802与50个5×5滤波器5804卷积以生成50个8×8输出5808的方法的实施例,以通过示例进一步说明将3D输入与3D滤波器进行卷积以生成NNU 121的输出的更一般的方法,该NNU 121特别是具有NPU 126的阵列的神经网络单元,该NPU 126具有多路复用寄存器(例如,208),多路复用寄存器被配置为提供将从数据RAM122接收的输入数据的行围绕NPU 126的阵列旋转的能力,如本文所述的。但现在将关于图58说明要解决的一般问题,即,将W×H×C输入5802与F个S×R×C滤波器5804进行卷积以生成F个P×Q输出5808的数学运算。更具体地,将说明将W×H×C输入5802与单个S×R×C滤波器5804进行卷积以生成单个P×Q输出5808的数学运算。
在图24至26的语境中,卷积是3×3卷积核的元素和相应子矩阵的其对应元素的9个乘积的和。类似地,在图58的语境中,卷积是S×R×C滤波器5804的元素与输入5802的相应S×R×C子矩阵的其对应元素的S×R×C乘积的和。所得到的和或卷积是输出5808的P×Q值中的一个。更具体地,假设滤波器5804的S列和R行的基于零的索引值,所得到的卷积在输出5808的位置[s,r]处,其中,s是被卷积的输入5802的S×R×C子矩阵的左上元素的列的索引,r是被卷积的输入5802的S×R×C子矩阵的左上元素的行的索引。因此,例如,将Y[s,r]表示为输出5808元素,将X[i,j,k]表示为输入5802元素,将F[m,n,k]表示为滤波器5804元素,其中,i是输入5802的列索引,j是输入5802的行索引,m是滤波器5804的列索引,n是滤波器5804的行索引,k是通道索引,则:
Y[s,r]=
X[s,r,0]*F[0,0,0]+
X[s+1,r,0]*F[1,0,0]+...
X[s+S–1,r,0]*F[S–1,0,0]+
X[s,r+1,0]*F[0,1,0]+
X[s+1r+1,0]*F[1,1,0]+...
X[s+S–1,r+1,0]*F[S–1,1,0]+
...
X[s,r+R–1,0]*F[0,R–1,0]+
X[s+1,r+R–1,0]*F[1,R–1,0]+...
X[s+S–1,r+R–1,0]*F[S–1,R–1,0]+
X[s,r,1]*F[0,0,1]+
X[s+1,r,1]*F[1,0,1]+...
X[s+S–1,r,1]*F[S–1,0,1]+
X[s,r+1,1]*F[0,1,1]+
X[s+1,r+1,1]*F[1,1,1]+...
X[s+S–1,r+1,1]*F[S–1,1,1]+
...
X[s,r+R–1,1]*F[0,R–1,1]+
X[s+1,r+R–1,1]*F[1,R–1,1]+...
X[s+S–1,r+R–1,1]*F[S–1,R–1,1]+
X[s,r,C–1]*F[0,0,C–1]+
X[s+1,r,C–1]*F[1,0,C–1]+...
X[s+S–1,r,C–1]*F[S–1,0,C–1]+
X[s,r+1,C–1]*F[0,1,C–1]+
X[s+1,r+1,C–1]*F[1,1,C–1]+...
X[s+S–1,r+1,C–1]*F[S–1,1,C–1]+
...
X[s,r+R–1,C–1]*F[0,R–1,C–1]+
X[s+1,r+R–1,C–1]*F[1,R–1,C–1]+...
X[s+S–1,r+R–1,C–1]*F[S–1,R–1,C–1].
等式(7)
因此,例如,当S=R=5且C=20时,输出5808的P×Q值的每个值是5×5×20=500个乘积的和。
上面的说明假设在输入5802的边界周围没有使用通常被称为“有效”卷积(与“相同大小”卷积相反)的填充。因此,输出5808的尺寸小于输入5802的列和行尺寸。更具体地,P=W-S+1,并且Q=H-R+1。在相同大小的卷积的情况下,使用填充(例如,零填充),以使输出5808的尺寸与输入5802的列和行尺寸相同,即P=W且Q=H。
现在参考图59,示出了例示将数据RAM 122行分为输入块5902,将权重RAM 124行分为滤波器块5904,将NPU阵列126分为成NPU块5906和将数据RAM 122行分为输出块5908的框图。在图59的实施例中,将NNU 121中的NPU 126的数量指定为N,相应地,从数据RAM 122的行接收的字的数量是N,从权重RAM 124的行接收的字的数量是N。如图所示,将N个NPU126和从数据RAM 122/权重RAM 124接收的N个字指定为0到N-1。
将块5902/5904/5906/5908的数量指定为G,并且将G块指定为0到G-1,如图所示。G被计算为N和B的商。B是块大小。B是至少与W一样大的N的最小因数,W是图58的输入5802的列数。例如,如果N是1024并且W是12,则B是16,因为16是大于12的1024的最小因数,并且G=1024/16=64。
如图59所示,将数据RAM 122/权重RAM 124的行的N个字在G个块的第一个中指定为0、1、2至B-1;在G个块的第二个中指定为B、B+1至2B-1;依此类推,直至在块G-1中指定为N-B、N-B+1至N-1。各个编号的块彼此对应。即,NPU块0从数据RAM 122接收输入块0并从权重RAM 124接收滤波器块0,并生成输出块0;NPU块1从数据RAM 122接收输入块1并从权重RAM124接收滤波器块1,并生成输出块1;依此类推,直至NPU块N-1从数据RAM 122接收输入块N-1并从权重RAM 124接收滤波器块N-1,并生成输出块N-1。下面说明由NPU块5906内的各个NPU 126生成输出块5908的结果。
将NPU 126阵列、数据RAM 122行、权重RAM 124行和数据RAM 122行分为每个大小为B的它们各自的G个NPU块5906、输入块5902、滤波器块5904和输出块5908有利于NNU 121将输入5802与滤波器5804卷积而以有效的方式生成输出5808。具体地,结合数据RAM 122和权重RAM 124内的输入数据和滤波器权重的布局,分块有利于独特的嵌套循环结构,其有利地使用NNU121的旋转器多路复用寄存器208结构来旋转与输入5802的所有C个通道相关联的输入块5902,使得与F个滤波器5804相关联的G个NPU块5906中的F个NPU块的每一个“看见”(即,接收)输入5802的所有C个通道,以便与其相应滤波器5804卷积。更具体地,NNU 121将数据RAM 122的行的输入块5902读取到多路复用器寄存器208中,然后使用由多路复用器寄存器208形成的旋转器使输入块5902旋转通过至少C个相邻NPU块5906。这使得在输入5802的另一行被读入多路复用器寄存器208之前,每个NPU 126能够执行其对应的滤波器5804的行的所有通道与输入5802的行的所有通道的乘法-累加运算(例如,执行列-通道-求和,如下面关于图60所说明的),如关于图60的伪代码更详细地说明的。NNU 121的使用相对于基于上述等式(7)的考察而应用的更直观的传统方法而言是独特和有效的。
从前述可以观察到,尽管N是静态的,但是B和因此的G是动态的,因为它们不仅是N的函数,而且是W的函数,W是NNU 121正在执行的特定神经网络的超参数。G和B的值被合并到在NNU 121上执行的非架构程序中以执行卷积运算,如下面更详细说明的。
现在参考图60,示出了例示由在NNU 121上执行以执行3D卷积任务(诸如图58所示)的非架构程序执行的计算的伪代码。伪代码列表包括行号以便于其说明。在图60中,行号从2开始,并且跳过行号4、16、18、21-22和25。这使得图60的伪代码可以更容易地与图63、67和69的伪代码相比较,其中,伪代码的类似指令具有对应的行号。还应注意,在图67和69中跳过了行18和22,而行1至26全部包括在图63和65中。
在查看图60的伪代码的同时,应该记住,相同的指令或操作由NNU 121的所有NPU126同时执行,例如如上面关于图1至48所说明的。因此,虽然可以相对于用作卷积神经网络层的单个神经元以生成输出5808的单个元素或卷积结果的单个NPU 126来说明图60的部分,但是应当理解,所有NPU 126同时操作以根据图60的伪代码生成结果。然而,还应该记住,在许多情况下,根据卷积神经网络层的超参数,NPU块5906内的一些NPU 126在可以生成不使用的结果。此外,虽然给定输出块5908内的输出5808的Q行中的行的P个卷积结果被打包在一起,但是在输出块5908的边界上可能存在不使用的一些结果。因此,在写入N个结果的数据RAM 122(或权重RAM 124)的行内(例如,在图60的行24),所有的F×P个卷积结果通常不被打包在一起。优选地,另一非架构程序(或相同非架构程序的附加部分)将未打包的卷积结果一起收集以用于输入到神经网络的下一层。最后,可以在数据RAM 122内的输入5802的布局和权重RAM 124内的滤波器5804的布局的语境中更充分地理解图60,其四个实施例在下面相关于图61至图69来说明。
伪代码包括四个嵌套循环,表示为循环1、循环2、循环3和循环4。循环1是外循环,循环4是内循环。循环1针对输出5808的Q个输出行中的每一个进行迭代。循环2针对滤波器5804的R个滤波器行中的每一个进行迭代。循环3针对输入5802的C个通道中的至少每个通道进行迭代。如下更详细说明的,除了C个通道之外,循环3还针对间隙输入块组(例如,参见图61B的6103)的数量(如果存在)进行迭代。循环4针对滤波器5804的S个滤波器列中的每一个进行迭代。当可视化在输入5802体积的相应大小的部分上空间布置的S列、R行、C个通道滤波器5804时,可以借助以下每个循环更详细的解释而在下一段概括四个循环。非架构程序可以通过使用LOOP指令以及INITIALIZE指令(例如图26A,28、42、45、48、51、54或57的INITIALIZE和LOOP指令)来完成循环。循环1可以通过将LOOPCNT分配给Q来完成。优选地,三个外循环(循环1、2和3)可以通过使用INITIALIZE和LOOP指令来完成;而内循环(循环4)可以使用与乘法-累加指令(例如图4、9、20、26A,42、45或57的MULT-ACCUM指令)相关联的COUNT值来完成。
根据循环4(内循环),每个NPU 126将其相应的滤波器5804的行的S个权重与S个覆盖的输入5804元素的S个积的和累加到其累加器202中,该和在此称为列-和。根据循环3,循环4将用于C个通道的第一通道的第一列-和累加到累加器202中,然后将第二通道的第二列与第一列-和累加到累加器202中,依此类推,直至它累加了滤波器5804的所有C个通道C个列-和。在一些情况下,根据超参数,循环3可以将与间隙输入块组6103和间隙滤波器块组6104(见图61)相关联的附加零值列-和累加到累加器202中。(对于每个滤波器5804,处理通道的顺序根据滤波器的NPU块5906在NPU块5906中的位置而变化,特别是根据滤波器的NPU块5906的索引除以通道数C的余数而变化,如下更详细说明的。)因此,在循环3的实例完成时,NNU 121将累加滤波器5804的水平2D片与其对应的输入5802的2D覆盖水平2D片的S×C个乘积的和,该和在此将被称为列-通道-和。根据循环2,循环3将滤波器5804的行0的第一列-通道-和累加到累加器202中,然后将滤波器5804的行1的第二列-通道-和累加到累加器202中,依此类推,直至它累加了滤波器5804的所有R行R个列-通道-和。因此,在循环2的实例完成时,NNU 121将累加滤波器5804与其对应的输入5802的覆盖体积的S×C×R个乘积的和,该和在此将被称为列-通道-行-和,并且其是输出5806的Q行的单行的最终卷积结果。在循环2的末尾,NPU126将F个列-通道-行-和写入数据RAM 122的行。可以观察到,以列-通道-行顺序计算列-通道-行-和,与常规列-行-通道顺序相反。这是有利的,因为其利用NNU 121的N宽多路复用寄存器208旋转器能力。根据循环1,循环2将输出5806的行0的第一列-通道-行-和累加到累加器202中,然后累加输出5806的行1的第二列-通道-行-和,依此类推,直到它生成输出5806的所有Q行的列-通道-行-和,并将其输出到数据RAM 122。
尽管一般将从外部(即,相对于外循环然后是后面的内循环)说明图60的非架构程序以帮助理解,但将首先说明循环4(最内循环)。
循环4使每个NPU 126的乘法器242执行S个乘法以生成S个乘积。随着生成S个乘积中的每一个,它被累加到累加器202中。因此,在循环4完成时,累加器202保存的中间总和比其在循环4开始之前保存的多S个乘积,即,它保存另一列-和。每个NPU 126的循环4的S个乘法中的每一个将W列的相应列和C个通道的通道及输入5802的H行的行中的输入5802的元素作为第一操作数。W列的列取决于正在执行循环4的哪一个迭代以及NPU块5906内的NPU126的位置。C个通道的通道(包括间隙输入块组的数量,如果有的话)取决于正在执行循环3的哪一个迭代,以及包括NPU 126的NPU块5906的位置。H行的行取决于正在执行循环1的哪一个迭代和循环2的哪一个迭代的组合。第一操作数(输入5802元素)或者从数据RAM 122读入到多路复用器208中(例如,在图60的行8),或者从相邻的NPU 126旋转到多路复用器208中(例如,在图60的行15或行19)。S个乘法中的每一个将S列的相应列和C个通道的通道及与对应于包括NPU 126的NPU块5906的滤波器块5904相关联的滤波器5804的R行的行中的权重作为第二操作数。S列的列取决于正在执行循环4的哪一个迭代。C个通道的通道(包括间隙输入块组的数量,如果有的话)取决于正在执行循环3的哪一个迭代以及包括NPU 126的NPU块5906的位置。R行的行取决于正在执行循环2的哪一个迭代。第二操作数(权重)从权重RAM124读入寄存器205(或多路复用寄存器705)中(例如,在图60的行13)。
在一个实施例中,循环4的执行实例可由单个MULT-ACCUM/执行非架构指令来完成,该指令指定S的计数,指定到多路复用寄存器208的输入211(即,来自相邻NPU 126的多路复用寄存器208的旋转输入5802元素字)作为第一乘法器242输入,并指定从权重RAM124中将权重字读入寄存器205中作为第二乘法器242输入。可替换地,非架构程序可以包括一对MULT-ACCUM/执行非架构指令以完成循环4的执行实例。例如,第一个一个或多个指令指定计数为1,指定到多路复用寄存器208的输入211-2、211-4和/或211-8(即,分别来自离开二、四和/或八个的NPU 126的多路复用寄存器208的旋转输入5802元素字,以完成多字旋转,如关于图70和71的多字距离旋转操作更详细说明的)作为第一乘法器242输入,并且指定从权重RAM 124将字读入寄存器205中作为第二乘法器242输入。第二指令指定S的计数减1,指定到多路复用寄存器208的输入211作为第一乘法器242输入,并指定从权重RAM 124将字读入寄存器205中作为第二乘法器242输入。通过指定大于一个旋转,第一指令可以用于针对除了循环3的第一次迭代之外的所有循环有效地实现图60的行19处说明的块对准。现在将说明外循环。
循环1的每次迭代清零N个NPU 126的N个累加器202。非架构程序可以使用INITIALIZE指令或“执行”指令来清零累加器202,例如如上所述(例如,关于图4)。然后循环1的每次迭代执行循环2,循环2将结果累加到N个累加器202中。最后,循环1的每次迭代将由循环2生成的列-通道-行-和从N个累加器202写入数据RAM 122的行(或者可替换地权重RAM124的行)。在循环2的执行实例完成时,在累加器202中的列-通道-行-和包括在数学上等价于上述等式(7)中说明的卷积。累加器202中的卷积列-通道-行-和是F个输出5808的Q行的行。更具体地,G个NPU块5906中的F个生成F个相应的输出块5908;并且对于F个输出5808的相应输出5808,F个输出块5908中的每一个包括相应输出5808的Q行的行。在F小于G的情况下,NPU块5906的G-F个累加器202的结果不使用。Q行的行的P个卷积列-通道-行-和从相关NPU块5906的B个NPU 126的累加器202的子集提供,不使用其他累加器202。循环1的每次迭代产生输出5808的Q行的不同行,F个NPU块5906中的每一个产生对应于F个NPU块5906的G个输出块5908的F个中对应的一个中的F个输出5808中的不同的一个。
NPU块5906内的累加器202的有效/使用子集尤其取决于块大小B与输入列W的数量之间的差异(如果有的话),以及是否生成“有效”或“相同大小”卷积输出。在W等于B并且需要相同大小的卷积的情况下,子集包括NPU块5906的累加器202的所有B个,在这种情况下P也等于B和W。下面相对于图62的实施例更详细地说明累加器202的子集;然而,应当记住,输出5808的每个单独元素或卷积列-通道-行-和是由其累加器202内的单个NPU 126生成的。
此外,优选地,在NPU 126累加器202内完全生成单独的卷积列-通道-行-和,无需向数据RAM 122(或权重RAM 124)写入任何中间部分和并随后将它们读回。这有利地避免了损失卷积列-通道-行-和的精度。如上所述,优选地,累加器202的宽度显著宽于从数据RAM122和/或权重RAM 124输入和/或向数据RAM 122和/或权重RAM 124写入的单个字的宽度。优选地,在被写入到数据RAM 122之前,累加器202的值被转换、饱和/或压缩到数据RAM122/权重RAM 124字的大小。例如,如上所述,例如关于图30至33的,累加器202的值(可以是28位)可以在被写入数据RAM 122之前被转换、饱和和/或压缩为8位字。
循环2的每次迭代从数据RAM 122中将一行读入N个多路复用寄存器208。更具体地,G个NPU块5906将数据RAM 122行被分为的G个输入块5902中的相应一个读入其多路复用寄存器208。使用多路复用寄存器208旋转器通过循环3将G个输入块5902围绕NNU 121旋转到不同的NPU块2906。非架构程序可以使用诸如上述的MULT-ACCUM指令或“执行”指令将数据RAM 122行读取到多路复用寄存器208中。MULT-ACCUM/执行指令还可以指定从权重RAM124读取行,如关于循环4更详细地说明的。在读取数据RAM 122行之后,循环2的每次迭代然后执行循环3。
循环3的每次迭代执行循环4,然后旋转多路复用寄存器208以将输入块5902与下一个相邻的NPU块5906对准。有利地,这使得每个NPU 126块能够为C个通道的不同通道,即为与现在旋转到与NPU块5906对准的输入块5902相关联的通道,累加另一个列-和。优选地,在循环4完成时,多路复用寄存器208中的输入块5902将已经旋转S个字,如下所述。因此,为了使输入块5902与下一个相邻的NPU块5906对准,非架构程序将优选地将多路复用寄存器208旋转B减S个字。然而,取决于非架构程序的实施方式,特别是循环4,对准旋转可能需要将多路复用寄存器208旋转B减S加一个字。非架构程序可以旋转多路复用寄存器208以使用诸如上述的一个或多个MULT-ACCUM指令或“执行”指令将输入块5902与下一个相邻的NPU块5906对准。一个或多个非架构指令可以包括多字距离旋转,例如下面参照图70和71所说明的。因此,如可以观察到的,循环2的每次迭代产生F个列-通道-行-和或卷积,并将它们写入数据RAM 122的行。
尽管说明了执行“有效”卷积的实施例,但是可以设想执行“相同大小”卷积的其他实施例。有效卷积和相同大小的卷积之间的差异涉及如何处理输入5802的边缘,这又影响输出5808的大小。有效卷积产生具有比输入5802行和列数量更少的输出5808;而相同大小卷积产生具有与输入5802相同数量的行和列的输出5808。例如,执行12×12输入与5×5滤波器的有效卷积产生8×8输出;而执行12×12输入与5×5滤波器的相同大小卷积产生12×12输出。为了实现这一点,有效卷积运算仅对输入的实际现有值,即“有效”值,执行乘法-累加;而相同大小的卷积运算必须假设在输入中实际上不存在的4行和4列的值,即“无效”值。相同大小的卷积运算必须假设一些无效值(例如,通常为零),因为当5×5滤波器扫过12×12输入时,在右边缘(或左边缘或其组合)将有4行不具有要乘以的相应输入5802元素。
现在参考图61A和61B,统称为图61,示出了例示根据一个实施例在数据RAM 122内的输入块5902的组的布局6101和在权重RAM 124内的滤波器块5904的组的布局6102的框图,用于将12×12×20输入5802与50个5×5滤波器5804进行卷积以生成50个8×8输出5808。图61的示例假设具有1024个NPU 126的NNU 121;即N=1024(见图59)。因此,由于超参数W=12,则B=16,即N的最小因数至少与W一样大;并且因为B=16,则G=1024/16=64。因此,存在64个NPU块5906,每个数据RAM 122行有64个输入块5902,并且每个权重RAM124行有64个滤波器块5904。图61示出了基于零的输入块索引0至63和滤波器块索引0至63,其对应于NPU块索引0至63,如上面关于图59所述的。即,具有索引0的每个输入块5902和滤波器块5904由具有索引0的NPU块5906接收;具有索引1的每个输入块5902和滤波器块5904由具有索引1的NPU块5906接收;依此类推,直至具有索引63的每个输入块5902和滤波器块5904由具有索引63的NPU块5906接收。在图61的实施例中,索引0处的输入块包括数据RAM 122的字0-15;索引1处的输入块包括数据RAM122的字16-31;依此类推,直至索引63处的输入块包括数据RAM 122的字1008-1023。类似地,索引0处的滤波器块包括权重RAM 124的字0-15;索引1处的滤波器块包括权重RAM 124的字16-31;依此类推,直至索引63处的滤波器块包括权重RAM 124的字1008-1023。
图61示出了64个输入块组。60个输入块组存在于输入块索引0到59中,并且总体表示为I[c],其中,c表示C=20个通道的通道索引。与C=20个通道相关联的20个输入块组-即I[0]到I[19]-的三个实例或副本被平铺在输入块索引0到59上,如下面更详细说明的。四个输入块组(称为间隙输入块组6103,表示为I[G])存在于输入块索引60至63中。优选地,间隙输入块组6103包含零值。输入块组I[c]是在数据RAM 122的H个不同行内并且全部位于相同输入/滤波器/NPU块索引内的数据RAM 122中的一组H个输入块5902。因此,输入块组的所有输入块5902被提供给相同的NPU块5906。此外,每个输入块组I[c]保存输入5802的通道c的H×W垂直片的元素,或者在间隙输入块组6103的情况下为零,如下所述。更具体地,输入块组I[c]的H个输入块5902的每个输入块5902保存输入5802的通道c的H×W垂直片的元素的相应行。
在图61的语境中,输入块组I[c]是在数据RAM 122的12个不同行内的12个输入块5902的组。(在图61的实施例中,12行在数据RAM 122相邻,即在行0-11中;然而,可以设想其他实施例,其中,行不相邻,并且非架构程序被相应地修改以寻址输入块5902所在的数据RAM 122的行。)因此,每个输入块组具有数据RAM 122的每个输入块16个字×12行=192个字。然而,每个输入块5902仅保存输入5802的相应行h和通道c的W=12个元素,输入块5902的剩余B-W=16-12=4个字未被使用(在一个实施例中为0),如图62所示的。更具体地说,每个输入块组I[c]保存输入5802的通道c的12×12垂直片的元素(见图62的6215),或者在间隙输入块组6103的情况下为零。图61的输入块组I[c]的12个输入块5902中的每一个保存输入5802的通道c的12×12垂直片6215的元素的相应行。关于图62更详细地说明输入块组I[c]。图61和62的示例示出了存储在数据RAM 122的行0到11中的输入块组,但是输入块组可以存储在其他行中。即,尽管在图61中,保存输入块组I[c]的数据RAM 122行的行号对应于输入5802的行号,但这是巧合的,其他数据RAM 122行可以存储输入块组,并且如上所述,在一些实施例中,数据RAM 122行可以是非相邻的。
在图61的示例中,数据RAM 122保存64个输入块组,每个输入块组具有12个输入块5902,用于在图61的示例中总共768个输入块5902,以将12×12×20输入5802与50个5×5×20滤波器5804卷积以产生50个8×8输出5806。然而,由于有64个输入块索引并且仅有20个通道,所以20个通道在输入块索引0到59上平铺三次,并且输入块索引60到63的输入块组保存零值,而不是来自输入5802的元素。即,如图所示,输入块组I[0]存在于输入块索引0中,输入块组I[1]存在于输入块索引1中,依此类推,直至输入块组I[19]存在于输入块索引19中;随后模式重复,即,输入块组I[0]存在于输入块索引20中,输入块组I[1]存在于输入块索引21中,依此类推,直至输入块组I[19]存在于输入块索引39;随后该模式再重复一次,即,输入块组I[0]存在于输入块索引40中,输入块组I[1]存在于输入块索引41中,依此类推,直至输入块组I[19]存在于输入块索引59中;存在于输入块索引60至63中的间隙输入块组6103用零填充,使得从其生成的列-和为零,因此当累加在累加器202中时列-和不对最终列-通道-行-和有影响。
当超参数需要时,间隙输入块组6103和间隙滤波器块组6104存在,并且便于使用包括N个多路复用寄存器208的旋转器围绕NNU 121旋转输入块5902,如下面更详细地说明。
图61示出了64×24=1536个滤波器块组,总体上表示为F[f,c]的,其中,f表示F个滤波器5804的滤波器,其中,c表示C=20个通道的通道索引,或者表示为F[G],其表示间隙滤波器块组6104。优选地,间隙滤波器块组6104包含零值。间隙滤波器块组F[G]的目的是将它们与间隙输入块组I[G]卷积。滤波器块组F[f,c]是权重RAM 124的R×S个不同行内的一组R×S个滤波器块5904,并且都位于相同输入/滤波器/NPU块索引内的权重RAM 124中。因此,滤波器f的所有滤波器块组的所有滤波器块5904被提供给相同的NPU块5906。此外,每个滤波器块组F[f,c]保存用于滤波器f的通道c的R×S垂直片的权重(参见图62的6209),或者在间隙滤波器块组F[G]的情况下的零。更具体地,滤波器块组F[f,c]的R×S个滤波器块5904的每个滤波器块5904保存滤波器5804f的通道c的R×S垂直片6209的不同权重的P个副本,如相关于图62更详细地说明的。
在图61的语境中,滤波器块组F[f,c]是权重RAM 124的25个不同行内的25个滤波器块5904的组。(在图61的实施例中,25行在权重RAM 124中相邻,即在行0-24、25-49等中;但可以设想其他实施例,其中,行不相邻,并且非架构程序被相应地修改以寻址滤波器块5904所在的权重RAM 124的行。图66和68说明了具有滤波器块组和滤波器块组内的滤波器块5904的不同布置的实施例。因此,图61的每个滤波器块组F[f,c]具有每滤波器块16个字×每滤波器块组25个滤波器块5904(在25个权重RAM 124行内)=权重RAM 124的400个字。然而,每个滤波器块5904仅保存滤波器5804f的各列s、各行r和通道c的权重的P=8个副本,不使用滤波器块5904的剩余的B-P=16-8=8个字(在一个实施例中为0),如图62所示。更具体地,每个滤波器块组F[f,c]保存用于滤波器5804f的通道c的5×5垂直片6209的权重或者在间隙滤波器块组F[G]的情况下的零。在更具体地,滤波器块组F[f,c]的25个滤波器块5904中的每个滤波器块5904保存滤波器5804f的通道c的5×5垂直片6209的不同权重的8个副本,如关于图62更详细地说明的。
在图61的示例中,权重RAM 124保存64×24=1536个滤波器块组,每一滤波器组具有25个滤波器块5904,用于在图61的示例中的总共38,400个滤波器块5904,以将12×12×20输入5802与50个5×5×20滤波器5804卷积以产生50个8×8输出5806。然而,由于只有50个滤波器5804,64-50=14个NPU块5906产生未使用的卷积;因此,滤波器块索引50到63下的滤波器块组包含无关值,如图所示。如图所示,滤波器块组F[0,0]到F[0,19]和四个间隙滤波器块组F[G]存在于滤波器块索引0中,滤波器块组F[1,0]到F[1,19]和四个间隙滤波器块组F[G]存在于滤波器块索引1中,依此类推,直至滤波器块组F[49,0]至F[49,19]和四个间隙滤波器块组F[G]存在于滤波器块索引49中;并且存在于滤波器块索引50至63中的滤波器块组是无关值。
如上所述,嵌套循环结构有利地使用NNU 121的旋转多路复用寄存器208结构来旋转与输入5802的所有C个通道相关联的输入块5902,使得与F个滤波器5804相关联的G个NPU块5906的每个F见到用于与其对应的滤波器5804卷积的输入5802的所有C个通道。然而,块的数量G=64不能被通道数量C=20均匀除尽的事实产生了对间隙输入块组I[G]的存在的需要和对非架构程序的循环3迭代比用于C=20个通道的20次超出4次(64%20=4,其是间隙输入块组I[G]的数量)的需要。更具体地,假设向右旋转,尽管在索引19到49处的NPU块5906全都将见到通道0到19的输入块5902,但是索引0到18处的NPU块5906不会见到。例如,索引18处的NPU块5906将见到通道0到18,而不是通道19,除非通道19被包括在输入块索引60到63中的一个中。对于另一个示例,在索引0处的NPU块5906将见到通道0和5至19,而不会见到通道1至4,除非通道1至4被包括在输入块索引60至63中,在这种情况下通道19不能被包括在输入块索引60至63中的一个中满足索引18处的NPU块5906。
为了解决这个问题,引入间隙输入块组I[G]以保证使用它们生成的列-和具有零值(由于间隙输入块组I[G]中的零值和/或它们对应的间隙滤波器块组F[G]中的零值),使得所生成的零值列-通道-和不影响最终列-通道-行-和,但允许足够数量的旋转-由于循环3的间隙输入块组I[G]数量附加迭代的结果-使得所有NPU块5906都见到所有20个通道。因此,由于图63中的循环3的迭代计数为24而不是C=20,与没有间隙时(例如如图64-65和68-69的实施例中)所需的相比,每个NPU 126生成每列-通道-行-和的附加的5×4×5=100个列-和(即卷积结果)。然而有利地,间隙输入块组I[G]和/或间隙滤波器块组F[G]的零值可以使得NPU 126为每列-通道-行-和的附加的100个列-和生成零值。
非架构程序寻址权重RAM 124,使得它在输入5802的对应元素存在于NPU126的多路复用寄存器208中时将相关滤波器5804的适当权重读入寄存器705。通过非架构程序对权重RAM 124的寻址与权重RAM 124中的滤波器5804的权重的布局协调。考虑通过非架构程序和协调的权重布局寻址权重RAM 124的各种实施例,图61和66说明了包括间隙的两个不同实施例,图64和68说明了不包括间隙的两个不同实施例。
如图61的示例所示,对于滤波器块索引0,F[0,0]占据权重RAM 124的行0-24,间隙滤波器块组F[G]占据行25-124,F[0,19]占据行125-149,F[0,18]占据行150-174,依此类推,直至F[0,1]占据行575-599;对于滤波器块索引1,F[1,1]占据行0-24,F[1,0]占据行25-49,间隙滤波器块组F[G]占据行50-149,F[1,19]占据行150-174,F[1,18]占据行175-199,依此类推,直至F[1,2]占据行575-599;依此类推,直至对于滤波器块索引19,F[19,19]占据行0-24,F[19,18]占据行25-49,F[19,17]占据行50-74,依此类推,直至F[19,00]占据行475-499,间隙滤波器块组F[G]占据行500-599;对于滤波器块索引20,F[20,0]占据行0-24,F[20,19]占据行25-49,F[20,1]占据行50-74,依此类推,直至F[20,1]占据行475-499,间隙滤波器块组F[G]占据行500-599;对于滤波器块索引21,F[21,1]占据行0-24,F[21,00]占据行25-49,F[21,19]占据行50-74,依此类推,直至F[21,2]占据行475-499,间隙滤波器块组F[G]占据行500-599;依此类推,直至对于滤波器块索引39,F[39,19]占据行0-24,F[39,18]占据行25-49,F[39,17]占据行50-74,依此类推,直至F[39,00]占据行475-499,间隙滤波器块组F[G]占据行500-599;对于滤波器块索引40,F[40,0]占据行0-24,F[40,19]占据行25-49,F[40,1]占据行50-74,依此类推,直至F[40,1]占据行475-499,间隙滤波器块组F[G]占据行500-599;对于滤波器块索引41,F[41,1]占据行0-24,F[41,00]占据行25-49,F[41,19]占据行50-74,依此类推,直至F[41,2]占据行475-499,间隙滤波器块组F[G]占据行500-599;依此类推,直至对于滤波器块索引49,F[49,09]占据行0-24,F[49,08]占据行25-49,F[49,07]占据行50-74,依此类推,直至F[49,10]占据行475-499,间隙滤波器块组F[G]占据行500-599;不考虑滤波器块索引50至63的滤波器块组中的值。图61的示例示出了存储在权重RAM 124的行0至599中的滤波器块组,但是可以设想滤波器块组F[f,c]存储在其他行中的其他实施例。
相关于图63更详细地说明对权重RAM 124寻址以将图61的各个滤波器块组的权重读入NPU 126中。可以观察到,一般来说,当从上到下查看给定滤波器块索引的滤波器块组F[f,c]的通道c值时,列值c的顺序(考虑间隙)是当输入块组围绕NNU 121旋转时其索引对应于滤波器块索引的NPU块5906见到输入块组的通道c(考虑间隙)的顺序。此外,由根据图63的伪代码的非架构程序执行的输入块5902的旋转和权重RAM 124寻址使得间隙滤波器块组F[G]和间隙输入块组I[G]同时存在于NPU 126中,并且因此生成零值列-和。
由于零和任何值的乘积为零,因此仅间隙输入块6103和间隙滤波器块6104中的一个必须包含零,而不是两者。因此,在滤波器5804权重被先验地确定但是输入5802被网络的先前层动态地采样或生成的实施例中,使间隙滤波器块组6104具有零值可能是有利的,以避免必须使间隙输入块组6103归零。然而,考虑间隙输入块组6103为零的其他实施例。
现在参考图62,示出了例示图61的输入块组I[c];滤波器5804f和通道c的5×5垂直片6209;图61的滤波器块组F[f,c];和图59的输出块5908的框图。
图62所示的输入块组I[c]包括12行和16列。16列被索引为0到15,并且对应于输入块5902的16个字。如图62所示,每个列索引值是数据RAM 122列号除以B=16的余数。因此,例如,假设输入图62的块组I[c]对应于存在于输入块索引21中的图61的输入块组I[01]的副本。输入块索引21处的输入块5902存在于数据RAM 122的列336到351。因此,列339中的输入块索引21中的输入块组I[01]的字存在于输入块组索引339%16=3中。在图62的示例中,输入块组I[c]的12行被示出为存在于数据RAM 122的行0至11中,尽管它们可以存在于数据RAM 122的其他行中。由输入块组I[c]的12行和列0至11组成的2D矩阵填充有对应于通道c的输入5802的12×12垂直片6215。垂直片6215是在给定通道c处的输入5802的12行和12列的元素。
不使用输入块组I[c]的列12到15。然而,应当注意,在超参数W大于12的网络中,可以使用这些列中的一些或全部。例如,如果W是14,则将使用列12和13。另外,如果网络执行相同大小卷积而不是有效卷积,则填充元素(例如,零)可以被包括在列12到15以及行12到15中,尽管其他填充实施例被设想为将填充元素设置在实际输入5802元素的边缘处的不同行和/或列中,例如,其中填充元素围绕输入块组I[c]的左边缘和右侧缘以及顶部边缘和底部边缘相对均匀地分布。
在给定通道c处的滤波器5804f的5×5垂直切片6209由通道c处的滤波器5804的5行和5列的权重组成。为了用于说明第一块组,5×5垂直片6209的25个元素中的每一个被标记为0到24。更具体地,从左到右,行0中的元素被标记为0至4,行1被标记为5至9,行2中的元素被标记为10至14,行3中的元素被标记为15至19,并且行4中的元素被标记为20至24。
图62的滤波器块组F[f,c]包括25行和16列。16列被索引为0到15,并且对应于滤波器块5904的16个字。如图62所示,每个列索引值是权重RAM 124列号除以B=16的余数。因此,例如,假设图62的滤波器块组F[f,c]对应于图61的滤波器块组F[21,17],其存在于滤波器块索引21中。滤波器块索引21处的滤波器块5904存在于权重RAM 124的列336至351。因此,列339中的滤波器块索引21中的滤波器块组F[21,17]的字存在于滤波器块组索引339%16=3中。在图62的示例中,滤波器块组F[f,c]的25行被示为存在于权重RAM 124的行0至24中,尽管它们可以存在于权重RAM 124的其他行中。
滤波器块组F[f,c]的25行中的每一行在滤波器块索引4到11中包括5×5垂直片6209的25个权重的相应权重的P=8个拷贝。按顺序取行0到24,相应的权重从行0和列4开始并且直到列0,然后行1和列4到列0,依此类推,到行4和列4到列0。因此,行0包括权重4的8个副本,行1包括权重3的8个副本,依此类推,到行4包括权重0的8个副本;行5包括权重9的8个副本,行6包括权重8的8个副本,依此类推,到行9包括权重5的8个副本;行10包括权重14的8个副本,行11包括权重13的8个副本,依此类推,到行14包括权重10的8个副本;行15包括权重19的8个副本,行16包括权重18的8个副本,依此类推,到行19包括权重15的8个副本;行20包括权重24的8个副本,行21包括权重23的8个副本,依此类推,到行24包括权重20的8个副本。在滤波器块组F[f,c]中的垂直片6209权重的这种布置,以及输入块组I[c]中的输入5802的元素的布置使得5×5垂直片6209的对应权重乘以输入5802的5×5子矩阵的对应元素,该对应元素在输入块5902的输入5802元素在每次内循环4通过NPU块5906旋转时被垂直片6209覆盖。
在执行有效卷积的实施例中,不使用滤波器块组F[f,c]的列0到3和12到15。然而,应当注意,在超参数W大于12的网络中,可以使用这些列中的一些或全部。例如,如果W是14,则列12和13也将包括权重的副本。另外,如果网络执行相同大小卷积而不是有效卷积,则权重的副本可以被包括在列0到3和12到15中的一个或多个中,以乘以填充元素。
图62的输出块5908包括一行和16列。16列被索引0到15,并且对应于输出块5908的16个字。如图62所示,每个列索引值是NPU 126的号或数据RAM 122(或权重RAM 124)列号除以B=16的余数。因此,例如,假定图62的输出块5908对应于输出块索引21。输出块索引21处的输出块5908存在于数据RAM 122(或权重RAM 124)的列336至351中。因此,列339中的输出块索引21中的输出块5908的字存在于输出块组索引339%16=3中。输出块5908的字在列4至11中示出为8个卷积结果或列-通道-行-和列,表示为R0到R7,它们分别对应于输出5806的P=8列的列0到7。即,在每个NPU块5906内,NPU 4生成对应于输出块5908列4的输出5806列0的卷积结果,或者列-通道-行-和,NPU 5生成对应于输出块5908列5的输出5806列1的卷积结果,依此类推,直至NPU 11生成对应于输出块5908列5的输出5806列7的卷积结果;并且NPU 0-3和12-15生成不使用的结果。与上述输入块组I[c]和滤波器块组F[f,c]一样,如果网络的超参数不同和/或如果生成相同大小卷积而不是有效卷积,则可以使用列0至3和12至15。
现在参考图63,示出了例示由在具有N=1024个NPU 126的NNU 121上执行的非架构程序执行的计算的伪代码,用以结合图61的数据RAM 122和权重RAM 124布局将12×12×20输入5802与50个5×5×20滤波器5804卷积以产生50个8×8输出5806。图63的伪代码在许多方面类似于图60的伪代码,但在至少三个方面不同。首先,图63的伪代码假设4个间隙输入块组I[G],如图61所示。其次,图63的伪代码包括数据RAM 122和权重RAM 124寻址的细节,其假定图61的存储器布局。第三,图63的伪代码假设上述的超参数和N的值。因此,行2中的Q=8,行6中的R=5,行9中的总共24次迭代的C=20和间隙数=4,行11中的S=5,并且行19中的对准旋转量为11。仅说明与图60不同的图63的行,因为上面已经详尽说明了图60。
在行1处,即在伪代码的开始处,数据RAM 122行被初始化为零,并且在行4,权重RAM 124行被初始化为零。
在行9处,循环3的迭代次数为24。这是因为24是C=20个通道和为4的间隙数量之和。24的迭代计数使得所有NPU块5906,特别是索引0到18的那些,能够见到所有20个通道的输入块组I[c]。
在行16处,权重RAM 124行递增1,使得在循环4的下一次迭代中,权重RAM 124的下一行被读入寄存器705,其包括图62的滤波器块组F[f,c]的下一行的权重的8个副本。对于循环4的单个执行实例,滤波器块组F[f,c]的25行中的仅五行将被读入用于当前通道c的寄存器705。
在行18处,权重RAM 124行递增20,它是R=5和S=5减S=5的乘积。这将权重RAM124行指向用于下一个通道c的下一个滤波器块组F[f,c],使得在循环3的下一次迭代(循环4的下一个执行实例)时,将滤波器块组F[f,c]的25行中的另外五行读入用于下一个通道c的寄存器705。这是因为每个滤波器块组F[f,c]从它上面的一个偏移权重RAM 124的25行,但是按照循环4的行16的五个执行实例,循环4的执行实例将权重RAM 124行递增5。因此,对于循环4的每个执行实例,只读取和使用滤波器块组F[f,c]的行的五分之一(通常为第1/R个)。在循环2的后续迭代中读取和使用滤波器块组F[f,c]的剩余行。
在行19处,多路复用寄存器208被旋转11,这是B=16和S=5之间的差。这将输入块5902与下一个相邻的NPU块5906对准。这是因为,NPU块5906的宽度是N=16,但是根据循环4的行15的五个执行实例,输入块5902已经被旋转了5。如上所述,旋转11可以通过ROTATE 8指令、ROTATE 2指令和ROTATE 1指令的组合来实现。考虑循环4和/或循环3的一个迭代被展开的实施例,使得在行19处执行旋转12,这可以通过ROTATE 8指令和ROTATE 4指令的组合来实现。
在行21处,数据RAM 122行递增1,使得在循环2的下一次迭代时,在行13处,数据RAM 122的下一行被读入多路复用寄存器208,其包括输入5802的下一行,即,在每个输入块索引处的输入块组I[c]的下一个输入块5902,如图61所示。
在行22处,权重RAM 124行递减575,其是25和23的乘积。值25是R=5和S=5的乘积,其是每个滤波器块组F[f,c]的行数。更具体地,循环3的每次迭代使权重RAM 124的行递增25,这将循环3的下一次迭代指向滤波器块组F[f,c]的开始。值23是C=20加上4个间隙减去1的总和。这是因为对于循环2的每个执行实例,循环3遍历所有24个滤波器块组迭代。递减575使得权重RAM124行指向每个滤波器块索引内的顶部滤波器块组F[f,c],并且指向滤波器块组F[f,c]中的行,其在循环2的当前迭代开始的行之下5行。
在行25处,数据RAM 122行递减4,其为R=5减1。这将数据RAM 122行指向在循环1的当前迭代中卷积的输入5802的第一行之后的输入5802的下一行,使得在循环1的下一迭代期间,3D滤波器5804有效地向下滑动输入5802的一行,以卷积输入5802的下一较低子矩阵。例如,如果循环1的当前迭代将输入5802的行3到7与滤波器5804进行卷积并将累加器202写入到输出块5908,行25操作以使得循环1的下一迭代将输入5802的行4到8与滤波器5804卷积。
现在参考图64A和64B,统称为图64,示出了例示根据可替换实施例的不包括间隙输入/滤波器块组的数据RAM 122内的输入块5902的组的布局6401和权重RAM 124内的滤波器块5904的组的布局6402的框图,用于将12×12×20输入5802与50个5×5滤波器5804进行卷积以生成50个8×8输出5808。图64的示例在许多方面类似于图61的示例,但将说明不同之处。
图64的示例假设具有2048个NPU 126的NNU 121;即,N=2048。因此,由于超参数W=12,于是B=16,即至少与W一样大的N的最小因数;因为B=16,于是G=2048/16=128。因此,存在128个NPU块5906,每个数据RAM122行有128个输入块5902,每个权重RAM 124行有128个滤波器块5904。图64示出了基于零的输入块索引0到127和滤波器块索引0到127,其对应于NPU块索引0到127,如上面关于图59所述。即,具有索引0的每个输入块5902和滤波器块5904由具有索引0的NPU块5906接收;具有索引1的每个输入块5902和滤波器块5904由具有索引1的NPU块5906接收;依此类推,直至具有索引127的每个输入块5902和滤波器块5904由具有索引127的NPU块5906接收。在图64的实施例中,索引0处的输入块包括数据RAM 122的字0-15;索引1处的输入块包括数据RAM 122的字16-31;依此类推,直至索引127处的输入块包括数据RAM 122的字2032-2047。类似地,索引0处的滤波器块包括权重RAM 124的字0-15;索引1处的滤波器块包括权重RAM 124的字16-31;依此类推,直至索引127处的滤波器块包括权重RAM 124的字2032-2047。
图64示出了69个输入块组。69个输入块组存在于输入块索引0至49和109至127中,并且总体上表示为I[c],其中,c表示C=20个通道的通道索引。20个输入块组I[0]到I[19]存在于输入块索引0到19中。另外,20个输入块组I[0]到I[19]存在于输入块索引20到39中。另外,10个输入块组I[0]到I[9]存在于输入块索引40到49中。最后,19个输入块组I[1]到I[19]存在于输入块索引109到127中。未使用存在于输入块索引50到108中的输入块5902。在图64的实施例中不包括间隙输入块组6103。
图64示出了50×20=1000个滤波器块组,总体上表示为F[f,c],其中,f表示F个滤波器5804的滤波器,并且其中,c表示C=20个通道的通道索引。在图64的示例中不包括间隙滤波器块组6104。在图64的示例中,权重RAM 124保存128×20=2560个滤波器块组,每个滤波器块组具有25个滤波器块5904,图64的示例中总共64,000个滤波器块5904,用于将12×12×20输入5802与50个5×5×20滤波器5804进行卷积以产生50个8×8输出5806。然而,由于只有50个滤波器5804,128-50=78个NPU块5906产生未使用的卷积;因此,滤波器块索引50到127下的滤波器块组包含无关值,如图所示。如图所示,滤波器块组F[0,0]到F[0,19]存在于滤波器块索引0中,滤波器块组F[1,0]到F[1,19]存在于滤波器块索引1中,依此类推,直至滤波器块组F[49,0]到F[49,19]存在于滤波器块索引49中;存在于滤波器块索引50到127中的滤波器块组是无关值。存在于滤波器块索引中的滤波器块组的垂直排序与没有间隙滤波器块组的图61的相同;因此,由于不存在图61中占用100行的四个间隙滤波器块组,仅使用行0至499。
如上所述,嵌套循环结构有利地使用NNU 121的旋转器多路复用寄存器208结构来旋转与输入5802的所有C个通道相关联的输入块5902,使得与F个滤波器5804相关联的G个NPU块5906中的F个NPU块的每一个见到用于与其相应滤波器5804卷积的输入5802的所有C个通道。有利地,如上所述,输入块组I[1]到I[19]存在于输入块索引109到127中,使得除了输入块组I[0](即,通道0的输入5802)之外,索引0处的NPU块5906还可以见到输入块组I[1]至I[19],因为它们被旋转到NPU块0;类似地,输入块组I[2]到I[19]存在于输入块索引110到127中,使得除了输入块组I[0]和I[1]之外,索引1处的NPU块5906还可以见到输入块组I[2]到I[19],因为它们被旋转到NPU块1;依此类推,直至输入块组I[19]存在于输入块索引127中,使得除了输入块组I[0]到I[18]之外,索引18处的NPU块5906还可以见到输入块组I[19],因为其被旋转到NPU块18。因此,块的数量G=128不能被通道数量C=20均匀除尽的事实不会造成对于存在间隙输入块组I[G]的需要,也不会造成对于非架构程序的循环3对于C=20个通道迭代多于20次的需要,因为超参数使得附加输入块组I[1]到I[19]可以存在于输入块索引109到127中。应当理解,虽然在图64的示例中,F=50,C=20,N=2048和W=12,使得B=16和G=128,但是可以存在神经网络的其他示例,以使得存在用于附加输入块组存在于较高值输入块索引中的足够空间,因此不需要包括间隙输入/滤波器块组,并且不需要执行循环3的附加迭代。例如,在F=40,C=20,N=1024和W=12的NNU 121上,不需要间隙输入/滤波器块组,因为输入块组I[1]到I[19]可以存在于输入块索引45到63中。即,不应该从图64的示例具有比图61的示例更多数量的NPU 126(N个)的事实推断需要更多数量的NPU126以避免间隙输入/滤波器块组;相反,必须考虑N以及神经网络的相关超参数。
相关于图65更详细地说明对权重RAM 124寻址以将图64的各个滤波器块组的权重读入NPU 126中。可以观察到,当从上到下查看给定滤波器块索引的滤波器块组F[f,c]的通道c值时,列值c的顺序是当输入块组围绕NNU 121旋转时其索引对应于滤波器块索引的NPU块5906见到输入块组的通道c的顺序。
现在参考图65,示出了例示由在具有N=2048个NPU 126的NNU 121上执行的非架构程序执行的计算的伪代码,用于结合图64的数据RAM 122和权重RAM 124布局,将12×12×20输入5802与50个5×5×20滤波器5804进行卷积以产生50个8×8输出5806。图65的伪代码在许多方面类似于图63的伪代码,但不同之处在于图65的伪代码假定没有间隙输入/滤波器块组,如图64所示。因此,行9中的迭代C=20次(与图63的行9中的24次对照)。另外,在行22处,权重RAM 124行递减475,它是25和19的乘积(与图63中的575对照)。与图63一样,值25是R=5和S=5的乘积,它是每个滤波器块组F[f,c]的行数。值19是C=20减1。这是因为对于循环2的每个执行实例,循环3遍历所有20个滤波器块组迭代。递减475使得权重RAM 124行指向每个滤波器块索引内的顶部滤波器块组F[f,c],并且指向滤波器块组F[f,c]中在循环2的当前迭代开始处的行之下5行。
现在参考图66A和66B,统称为图66,示出了例示可替换实施例的权重RAM124内的滤波器块5904的组的布局6602的框图,用于将12×12×20输入5802与50个5×5滤波器5804进行卷积以生成50个8×8输出5808。图66的实施例假设图61的输入块组的布局。图66的示例在许多方面类似于图61的示例,但将说明区别。一般来说,图66的实施例与图61的实施例之间的主要区别在于,体现图63和67的伪代码的非架构程序以不同的方式寻址权重RAM124。
更具体地,在图66的实施例中,每个滤波器组F[f,c,r]由滤波器5804的其滤波器f、其通道c和R行的其行r确定并且具有S=5个滤波器块5904(存在于权重RAM 124的5个相应行中);而在图61的实施例中,每个滤波器组F[f,c]由其滤波器f和其通道c确定,并且具有R×S=5×5=25个滤波器块5904(存在于权重RAM 124的25个相应行中)。存在于图61的布局6102中的相同滤波器块5904存在于图66的布局6602中;然而,它们被布置在权重RAM124的不同地址或行。换句话说,相同的滤波器块5904存在于每个滤波器块索引中;然而,它们以不同的顺序垂直布置,并且图63和67的伪代码对它们有不同的寻址。因此,图61和66的滤波器块组占据权重RAM 124的600行。如图61所示,间隙滤波器块在图66中表示为F[G],但是仅具有5个滤波器块5904(存在于5个相应的权重RAM 124行中)。
图66示出了64×120=7680个滤波器块组,总体上表示为F[f,c,r],其中,f表示F个滤波器5804的滤波器,其中,c表示C=20个通道的通道索引,其中,r表示滤波器5804的行,或F[G],其表示间隙滤波器块组。在图66(和图68)的语境中的滤波器块组F[f,c,r]是权重RAM 124的S个不同行内的一组S个滤波器块5904,并且都位于相同的输入/滤波器/NPU块索引内的权重RAM 124中。因此,滤波器f的所有滤波器块组的所有滤波器块5904被提供给相同的NPU块5906。此外,每个滤波器块组F[f,c,r]保存滤波器5804f的通道c的R×S垂直片的行(例如,图62的垂直片6209的行)的权重,或在间隙滤波器块组F[G]的情况下的零。更具体地,滤波器块组F[f,c,r]的S个滤波器块5904的每个滤波器块5904保存滤波器5804f的通道c的R×S垂直片6209的行r的不同权重的P个副本。
在图66的语境中,滤波器块组F[f,c,r]是权重RAM 124的5个不同行内的5个滤波器块5904的组。(在图66的实施例中,5行在权重RAM 124中相邻,即在行0-4、5-9等中;然而,可以设想其他实施例,其中,行不相邻,并且非架构程序被相应地修改以寻址滤波器块5904所在的权重RAM 124的行。)因此,图66的每个滤波器块组F[f,c,r]具有每个滤波器块16个字×每个滤波器块组5个滤波器块5904(在5个权重RAM 124行内)=权重RAM 124的80个字。与图61一样,每个滤波器块5904保存滤波器5804f的相应列s、相应行r和通道c的权重的P=8个副本,并且不使用滤波器块5904的剩余B-P=16-8=8个字(在一个实施例中为零)。更具体地,每个滤波器块组F[f,c,r]保存滤波器5804f的通道c的5×5垂直片6209的行r的权重,或者在间隙滤波器块组的情况下的零。更具体地,滤波器块组F[f,c,r]的5个滤波器块5904中的每个滤波器块5904保存滤波器5804f的通道c的5×5垂直片6209的行r的不同权重的8个副本。即,每个滤波器块组F[f,c,r]是图62所示的5个相邻行的5个集合中的一个。例如,滤波器块组F[f,c,0]对应于图62的滤波器块组F[f,c]的行0至4;滤波器块组F[f,c,1]对应于行5至9;滤波器块组F[f,c,2]对应于行10至14;滤波器块组F[f,c,3]对应于行15至19;滤波器块组F[f,c,4]对应于行20到24。然而,如图66所示,它们不存在于权重RAM 124的25个相邻行中,而是存在于5个相邻行的5个不同的分离组中。更具体地,用于R=5行的给定行r的5行滤波器块组F[f,c,r]被相邻地分组,并且对于给定行轮流使用C=20个通道c。此外,给定行的滤波器块组F[f,c,r]中的通道顺序与图61的相同。
在图66的示例中,对于图66的示例中的总共38,400个滤波器块5904,权重RAM 124保存64×120=7680个滤波器块组,每一滤波器块组具有5个滤波器块5904,以将12×12×20输入5802与50个5×5×20滤波器5804卷积以产生50个8×8输出5806。然而,由于只有50个滤波器5804,64-50=14个NPU块5906产生不使用的卷积;因此,滤波器块索引50到63下的滤波器块组包含无关值,如图所示。如图所示,存在于滤波器块索引0中的是滤波器块组F[0,0,0]到F[0,19,0]和四个间隙滤波器块组F[G],滤波器块组F[0,0,1]至F[0,19,1]和四个间隙滤波器块组F[G],依此类推,直至滤波器块组F[0,0,4]至F[0,19,4]和四个间隙滤波器块组F[G];存在于滤波器块索引1中的是滤波器块组F[1,0,0]至F[1,19,0]和四个间隙滤波器块组F[G],滤波器块组F[1,0,1]至F[1,19,1]和四个间隙滤波器块组F[G],依此类推,直至滤波器块组F[1,0,4]至F[1,19,4]和四个间隙滤波器块组F[G];依此类推,直至存在于滤波器块索引49中的是滤波器块组F[49,0,0]到F[49,19,0]和四个间隙滤波器块组F[G],滤波器块组F[49,0,1]到F[49,19,1]和四个间隙滤波器块组F[G],依此类推,直至滤波器块组F[49,0,4]到F[49,19,4]和四个间隙滤波器块组F[G];存在于滤波器块索引50至63中的滤波器块组是无关值。
间隙滤波器块组F[f,c,r]的设置与保证使用它们生成的列-和具有零值(由于间隙滤波器块组F[G]中的零值和/或其对应的间隙输入块组I[G]中的零值)一致,使得所得到的零值列-通道-和不对最终列-通道-行-和产生影响,而仍允许足够数量的旋转-作为循环3的间隙输入块组I[G]的数量附加迭代的结果-使得所有NPU块5906都见到所有20个通道。
如图66的示例所示,对于滤波器块索引0:F[0,0,0]占据权重RAM 124的行0-4,四个间隙滤波器块组F[G]占据行5-24,F[0,19,0]占据行25-29,F[0,18,0]占据行30-34,依此类推,直至F[0,1,0]占据行115-119;F[0,0,1]占据行120-124,四个间隙滤波器块组F[G]占据行125-144,F[0,19,1]占据行145-149,F[0,18,1]占据行150-154,依此类推,直至F[0,1,1]占据行235-239;F[0,0,2]占据行240-244,四个间隙滤波器块组F[G]占据行245-264,F[0,19,2]占据行265-269,F[0,18,2]占据行270-274,依此类推,直至F[0,1,2]占据行355-359;F[0,0,3]占据行360-364,四个间隙滤波器块组F[G]占据行365-384,F[0,19,3]占据行385-389,F[0,18,3]占据行390-394,依此类推,直至F[0,1,3]占据行475-479;F[0,0,4]占据行480-484,四个间隙滤波器块组F[G]占据行485-504,F[0,19,4]占据行505-509,F[0,18,4]占据行510-514,依此类推,直至F[0,1,4]占据行595-599。对于滤波器块索引1:F[1,1,0]占据行0-4,F[1,0,0]占据行5-9,四个间隙滤波器块组F[G]占据行10-29,F[1,19,0]占据行30-34,依此类推,直至F[1,2,0]占据行115-119;F[1,1,1]占据行120-124,F[1,0,1]占据行125-129,四个间隙滤波器块组F[G]占据行130-149,F[1,19,1]占据行150-154,依此类推,直至F[1,2,1]占据行235-239;F[1,1,2]占据行240-244,F[1,0,2]占据行245-249,四个间隙滤波器块组F[G]占据行250-269,F[1,19,2]占据行270-274,依此类推,直至F[1,2,2]占据行355-359;F[1,1,3]占据行360-364,F[1,0,3]占据行365-369,四个间隙滤波器块组F[G]占据行370-389,F[1,19,3]占据行390-394,依此类推,直至F[1,2,3]占据行475-479;F[1,1,4]占据行480-484,F[1,0,4]占据行485-489,四个间隙滤波器块组F[G]占据行490-509,F[1,19,4]占据行510-514,依此类推,直至F[1,2,4]占据行595-599。该模式继续用于滤波器块索引19:F[19,19,0]占据行0-4,F[19,18,0]占据行5-9,依此类推,直至F[19,0,0]占据行95-99,四个间隙滤波器块组F[G]占据行100-119;F[19,19,1]占据行120-124,F[19,18,1]占据行125-129,依此类推,直至F[19,0,1]占据行215-219,四个间隙滤波器块组F[G]占据行220-239;F[19,19,2]占据行240-244,F[19,18,2]占据行245-249,依此类推,直至F[19,0,2]占据行335-339,四个间隙滤波器块组F[G]占据行340-359;F[19,19,3]占据行360-364,F[19,18,3]占据行365-369,依此类推,直至F[19,0,3]占据行475-479,四个间隙滤波器块组F[G]占据行460-479;F[19,19,4]占据行480-484,F[19,18,4]占据行485-489,依此类推,直至F[19,0,4]占据行595-599,四个间隙滤波器块组F[G]占据行580-599。F[20,0,0]占据行0-4,F[20,19,0]占据行5-9,依此类推,直至F[20,1,0]占据行95-99,四个间隙滤波器块组F[G]占据行100-119;F[20,0,1]占据行120-124,F[20,19,1]占据行125-129,依此类推,直至F[20,1,1]占据行215-219,四个间隙滤波器块组F[G]占据行220-239;F[20,0,2]占据行240-244,F[20,19,2]占据行245-249,依此类推,直至F[20,1,2]占据行335-339,四个间隙滤波器块组F[G]占据行340-359;F[20,0,3]占据行360-364,F[20,19,3]占据行365-369,依此类推,直至F[20,1,3]占据行475-479,四个间隙滤波器块组F[G]占据行460-479;F[20,0,4]占据行480-484,F[20,19,4]占据行485-489,依此类推,直至F[20,1,4]占据行595-599,四个间隙滤波器块组F[G]占据行580-599。该模式继续用于滤波器块索引49:F[49,9,0]占据行0-4,F[49,8,0]占据行5-9,依此类推,直至F[49,10,0]占据行95-99,四个间隙滤波器块组F[G]占据行100-119;F[49,9,1]占据行120-124,F[49,8,1]占据行125-129,依此类推,直至F[49,10,1]占据行215-219,四个间隙滤波器块组F[G]占据行220-239;F[49,9,2]占据行240-244,F[49,8,2]占据行245-249,依此类推,直至F[49,10,2]占据行335-339,四个间隙滤波器块组F[G]占据行340-359;F[49,9,3]占据行360-364,F[49,8,3]占据行365-369,依此类推,直至F[49,10,3]占据行475-479,四个间隙滤波器块组F[G]占据行460-479;F[49,9,4]占据行480-484,F[49,8,4]占据行485-489,依此类推,直至F[49,10,4]占据行595-599,四个间隙滤波器块组F[G]占据行580-599。不考虑滤波器块索引50到63的滤波器块组中的值。图66的示例示出了存储在权重RAM 124的行0至599中的滤波器块组,但是可以设想滤波器块组F[f,c,r]存储在其他行中的其他实施例。
相关于图67更详细地说明对权重RAM 124寻址以将图66的各个滤波器块组的权重读入NPU 126中。可以观察到,通常,当从上到下查看给定滤波器块索引的滤波器块组F[f,c,r]的通道c值时,列值c的顺序(考虑间隙)是当输入块组围绕NNU 121旋转时其索引对应于滤波器块索引的NPU块5906见到输入块组的通道c(考虑间隙)的顺序。此外,由根据图67的伪代码的非架构程序执行的输入块5902的旋转和权重RAM 124寻址使得间隙滤波器块组F[G]和间隙输入块组I[G]同时存在于NPU 126中,并且因此生成零值列-和。
现在参考图67,示出了例示由在具有N=1024个NPU 126的NNU 121上执行的非架构程序执行的计算的伪代码,用以结合图61的数据RAM 122布局6101和图66的权重RAM 124布局6602将12×12×20输入5802与50个5×5×20滤波器5h804进行卷积以产生50个8×8输出5806。图67的伪代码在许多方面类似于图65的伪代码,但区别在于,图67的伪代码假定间隙输入/滤波器块组,如图61和66所示,并且具有不同的权重RAM 124寻址以与图66的布局6602协调。因此,在行9中,C=20+4个间隙=24次迭代(与图65的行9中的20次对照)。另外,图67中没有行18和22,因为滤波器块5904布置在图66的滤波器块组F[f,c,r]内,使得在行16处的权重RAM 124行的递增1足以寻址正确的行,因此减轻了递增权重RAM 124行(例如,在图65的行18)和递减权重RAM 124行(例如,在图65的行22)的需要。
现在参考图68A和68B,统称为图68,示出了例示根据可替换实施例的不包括间隙输入/滤波器块组的权重RAM 124内的滤波器块5904的组的布局6802的框图,用于将12×12×20输入5802与50个5×5滤波器5804进行卷积以生成50个8×8输出5808。图68的实施例假定图64的输入块组的布局。图68的示例在许多方面类似于图64的示例,但将说明区别。一般来说,图68的实施例与图64的实施例之间的主要区别在于,体现图69和65的伪代码的非架构程序以不同的方式寻址权重RAM 124。
如在图64的示例中一样,图68的示例假设具有2048个NPU 126的NNU121;因此,N-2048。因此,由于超参数W=12,于是B=16,即至少与W一样大的N的最小因数;并且因为B=16,于是G=2048/16=128。因此,存在128个NPU块5906,每个数据RAM 122行有128个输入块5902,并且每个权重RAM 124行有128个滤波器块5904。图68示出了基于零的滤波器块索引0到127,其对应于NPU块索引0到127,如上面关于图59所述的。即,具有索引为0的每个输入块5902和滤波器块5904是由具有索引0的NPU块5906接收;具有索引1的每个输入块5902和滤波器块5904由具有索引1的NPU块5906接收;依此类推,直至具有索引127的每个输入块5902和滤波器块5904由具有索引127的NPU块5906接收。在图68的实施例中,索引0处的输入块包括数据RAM 122的字0-15;索引1处的输入块包括数据RAM 122的字16-31;依此类推,直至索引127处的输入块包括数据RAM 122的字2032-2047。类似地,索引0处的滤波器块包括权重RAM 124的字0-15;索引1处的滤波器块包括权重RAM 124的字16-31;依此类推,直至索引127处的滤波器块包括权重RAM124的字2032-2047。
在图68的实施例中,如在图66的实施例中一样,每个滤波器组F[f,c,r]由滤波器5804的其滤波器f、其通道c和R行的其行r确定并且具有S=5个滤波器块5904(存在于权重RAM 124的5个相应行中)。存在于图64的布局6402中的相同滤波器块5904存在于图68的布局6802中;然而,它们被布置在权重RAM 124的不同地址或行。换句话说,相同的滤波器块5904存在于每个滤波器块索引中;然而,它们以不同的顺序垂直布置,并且图65和69的伪代码对它们的寻址不同。因此,图64和68的滤波器块组占据了权重RAM 124的500行。图68的布局没有间隙滤波器块,如图64的布局中那样。因此,由图69的伪代码对权重RAM 124中布局6802的寻址在许多方面与由图67的伪代码对权重RAM 124中的布局6602的寻址类似,然而,修改图69的伪代码以考虑到没有间隙滤波器/输入块组。
在图68的语境中,如图66中的一样,滤波器块组F[f,c,r]是权重RAM 124的5个不同行内的5个滤波器块5904的组;每个滤波器块组F[f,c,r]每个滤波器块16个字×每个滤波器块组5个滤波器块5904(在5个权重RAM 124行内)=权重RAM 124的80个字;每个滤波器块5904保存滤波器5804f的相应列s、相应行r和通道c的权重的P=8个副本,并且不使用滤波器块5904剩余的B-P=16-8=8个字(在一个实施例中为零);并且每个滤波器块组F[f,c,r]保存用于滤波器5804f的通道c的5×5垂直片6209的行r的权重,或者在间隙滤波器块组的情况下的零。
在图68的示例中,权重RAM 124保存128×100=12,800个滤波器块组,每一滤波器块组具有5个滤波器块5904,用于在图68的示例中的总共64,000个滤波器块5904,以将12×12×20输入5802与50个5×5×20滤波器5804卷积以产生50个8×8输出5806。然而,由于只有50个滤波器5804,128-50=78个NPU块5906产生未使用的卷积;因此,滤波器块索引50到127下的滤波器块组包含无关值,如图所示。如图所示,存在于滤波器块索引0中的是滤波器块组F[0,0,0]到F[0,19,0],滤波器块组F[0,0,1]到F[0,19,1],依此类推,直至过滤块组F[0,0,4]至F[0,19,4];存在于滤波器块索引1中的是滤波器块组F[1,0,0]至F[1,19,0],滤波器块组F[1,0,1]至F[1,19,1],依此类推,直至滤波器块组F[1,0,4]至F[1,19,4];依此类推,直至存在于滤波器块索引49中的是滤波器块组F[49,0,0]到F[49,19,0],滤波器块组F[49,0,1]到F[49,19,1],依此类推,直至滤波器块组F[49,0,4]到F[49,19,4];没有间隙滤波器块组F[G];并且存在于滤波器块索引50到127中的滤波器块组是无关值。
如图68的示例所示,关于滤波器块索引,图66的间隙滤波器块组不存在,在图66中的间隙滤波器块组之下的任何滤波器块组向上滑动以占据由缺少的间隙滤波器块组空出的权重RAM 124行。因此,图68的滤波器块组占据了权重RAM 124的500行,如同图64的实施例,其也没有间隙输入/滤波器块组。图68的示例示出了存储在权重RAM 124的行0到499中的滤波器块组,但是可以设想滤波器块组F[f,c,r]存储在其他行中的其他实施例。关于图69更详细地说明了对权重RAM 124寻址以将图68的各个滤波器块组的权重读入NPU 126中。
现在参考图69,示出了例示由在具有N=2048个NPU 126的NNU 121上执行的非架构程序执行的计算的伪代码,用以结合图64的数据RAM 122布局6401和图68的权重RAM 124布局6802将12×12×20输入5802与50个5×5×20滤波器5804进行卷积以产生50个8×8输出5806。图69的伪代码在许多方面类似于图67的伪代码,但区别在于,图67的伪代码假设间隙输入/滤波器块组,如图61和66所示,而图69的伪代码假设没有间隙。因此,在行9中,迭代C=20次(与图67的行9中的24次对照)。
优选地,架构程序将权重加载到权重RAM 124中(例如,逻辑地分为滤波器块5904),并将输入数据加载到数据RAM 122中(例如,逻辑地分为输入块5902)。架构程序可以以类似于上文(例如关于图25)所说明的方式将权重和数据加载到RAM 122/124中,但在图25的说明中,数据RAM 122保存权重和权重RAM 124保存输入数据和结果数据,而在所说明的用于执行3D卷积的实施例中,数据RAM 122保存输入和输出数据,权重RAM 124保存权重。
可以观察到,尽管输入块5902的输入数据是动态的,但是滤波器块5904的权重是静态的。即,每次执行神经网络时,输入数据可以变化,例如,新的图像或新的图像集合被输入到NNU 121并由NNU 121处理。相反,权重在神经网络的开发(例如训练)期间生成,并且对于神经网络的每个执行实例保持相同。因此,根据期望在滤波器块5904内布置权重的成本仅导致一次,并且可以事先离线完成。因此,以使得非架构程序执行完成将输入与滤波器卷积以生成输出所需的执行所花费的时间最少的方式来布置滤波器块5904内的权重可能是有利的。此外,虽然图64-65和68-69的实施例的非架构程序(即,没有间隙)可以以更少的时钟周期执行,因为它们必须执行更少的旋转操作和更少的乘法-累加运算,但它们需要额外的时间以在输入块5902内适当地布置输入数据(例如,由架构程序),使得将输入与滤波器卷积以生成输出的总时间可以小于采用间隙的实施例。哪种方法更快可以取决于多个因素,包括间隙大小、神经网络的超参数、架构处理器的可用性和存储器子系统特性。
可以观察到,当C(通道数量)是G(块数量)的因子时,间隙输入/滤波器块组(间隙)不是必需的。此外,当C不是G的因子时,如果G减F之差大于或等于C减1,则不需要间隙,使得除了通道0之外的输入5802的所有通道的副本可以被放置在数据RAM 122行的末尾处的未使用的块中。
关于与动态超参数和静态NNU 121硬件配置相关的各种情况,还可以观察到关于跨数据RAM 122行包括的输入5802的C个通道的副本数量(即与包括在数据RAM 122行中的C个通道中的每一个通道相对应的输入块5902的副本数量)的以下内容。例如,在图61和64的实施例中,跨数据RAM 122的行包括的输入5802的C个通道的副本的数量是三个。关于所需的间隙的数量以及对循环3(即,如上所述的关于伪代码的通道迭代循环)的迭代计数的伴随影响还可以观察到以下情况。
在第一种情况下,C小于G的一半,并且F小于G。跨数据RAM 122的行包括的输入5802的C个通道的副本的数量是G除以C的最低值函数下取整函数。因此,在图61和64的示例中,满足第一情况标准的C=20和G=64及F=50,G除以C的最低值函数=floor(64/20)=3,其是跨数据RAM 122的行包括的输入5802的C个通道的副本的数量。在图61和66的示例中,间隙的数量是G除以C的余数,例如64%20=4。此外,未使用的NPU块5906的数量为G减F,因为没有滤波器来使用它们,例如在图61和66的示例中为64-50=14。
在第二种情况下,C在G的一半和G之间,并且F小于G。跨数据RAM 122的行仅包括输入5802的C个通道的单个副本。类似于第一情况,在第二种情况下间隙的数量为G除以C的余数。
在第三种情况下,C大于G,并且F小于G。跨N个数据RAM 122行分解用于输入5802的H行的每行的C个通道,其中,N是2或更大。即,对于每个水平2D输入片(即,输入5802的H行的给定行的所有C个通道),数据RAM122的N行用于保存用于给定输入5802行的C个通道的输入块5902,并且跨N个数据RAM 122行打包C个通道。跨其分解C个通道的数据RAM 122行的数量N是C除以G的顶函数。例如,假定C=200和G=64;则数据RAM 122的N=ceiling(200/64)=4个不同行用于保存与输入5802的H行的给定行相关联的给定水平2D片的所有C=200个通道的输入块5902;并且数据RAM 122的总共H×N行用于保存用于输入5802的H行的所有行的所有C=200个通道的输入块5902。这与图61和64的示例形成对照,其中,需要单个数据RAM122行,因为C=20小于G=64。对于前N-1行中的每一行,没有间隙,并且所有NPU块5906用于生成卷积结果。然而,对于数据RAM 122的N行中的最后一行,如果C不是G的因数,则保存在数据RAM 122最后一行中的剩余通道数将小于G,在此情况下,如在上述第一或第二情况中那样处理N行中的最后一行。在第三种情况下,修改图60的伪代码以添加嵌套在循环2内的第五循环。即,第五循环包括循环3以及循环3之前在行8处将数据RAM 122行读入多路复用寄存器208。第五循环迭代N次,使得对于N个数据RAM 122行的每一行,将该行读入多路复用寄存器208中,并且用该行执行循环3的执行实例。对于第五循环的前N-1次迭代,循环3的迭代计数为G;对于第五循环的N次迭代中的最后一次,循环3的迭代计数是C除以G的余数加上间隙数量(如果有的话)。因此,在完成第五循环的执行实例(例如,对于循环2的每次迭代)时,每个NPU 126的累加器202将已经累加了另一个列-通道-和。换句话说,循环2的每次迭代涉及水平2D输入片(即,输入5802的H行的给定行的所有C个通道)和水平2D滤波器片(即,滤波器5804的R行的给定行的所有C个通道)。对于所有C个通道中的每个通道,列-通道-和是将所涉及的水平2D输入片的通道部分和所涉及的水平2D滤波器片的通道部分卷积以生成列-和,并连续累加所有C个通道的列-和以产生列-通道-和的结果。
在第四种情况下,F大于G。F个滤波器被分成G个滤波器的N-1组和F除以G的余数个滤波器的最后第N组,取决于通道的数量,根据三种情况中的相关一种如上所述地处理每组G(或F%G)个滤波器。在第一实施例中,对于N组滤波器的给定组,计算所有Q个输出行(即,所有Q个列-通道-行-和,或卷积结果)并在移动到下一组滤波器之前将其写入数据RAM122。即,针对N个组中的第一组执行伪代码的第一执行实例,然后对N个组中的第二组执行伪代码的第二执行实例,依此类推,直到对F个滤波器的所有N个组都执行了伪代码的执行实例。在第二实施例中,在移动到Q个输出行的下一行之前,计算并写入所有N个滤波器组的Q个输出行之一。即,循环1的第一迭代为F个滤波器的N个组中的每一个生成Q个输出行的第一输出行,然后循环1的第二迭代为F个滤波器的N个组中的每一个生成Q个输出行的第二输出行,依此类推,直到循环1的迭代为F个滤波器的N个组中的每一个生成所有Q个输出行的输出行。两个实施例中的哪一个是优选的可以取决于各种因素,包括非架构程序和/或架构程序访问的数据RAM 122和权重RAM 124的量。然而,如上所述,优选地,在不向数据RAM 122(或权重RAM 124)写入任何中间部分和并随后将它们读回的情况下,完全在NPU 126累加器202内生成各个卷积列-通道-行-和。这可以有利地避免损失卷积列-通道-行-和的精度。它还可以有利地节省时间,因为对数据RAM 122和/或权重RAM 124的访问可能成本很高。
如可以观察到的,本文说明的使用多路复用寄存器208旋转器以列-通道-行顺序卷积并且旋转不同输入块5902通过NPU块5906的实施例可以优于以列-行-通道顺序进行卷积且没有借助于多路复用寄存器208旋转器的常规方法。一个潜在的优点是实施例可能需要较少访问存储器以读取输入5802数据。参考图60的伪代码,可以使用来自数据RAM 122的单次读取的输入5802数据来执行S×C次乘法-累加运算,例如其是图64的实施例中的5×20=100次乘法-累加运算。另一个潜在的优点是实施例可以减少存储输入5802数据所需的存储器量,因为常规方法可能需要复制输入5802数据以适应按照列-行-通道顺序的卷积。常规方法所需的输入5802数据的复制也可能需要来自架构程序的额外带宽并消耗更多的存储器带宽。
虽然已经说明了NNU 121包括作为单独的存储器的权重RAM 124和数据RAM 122的实施例,但是可以设想权重和输入数据被存储在NNU 121的单个存储器中的其他实施例。虽然相对于在包括单独的权重RAM 124和数据RAM 122的实施例中并行访问两个存储器的能力,由于对单个存储器的争用和对其访问的串行化而可能提供较低的性能,但该实施例更具成本效益。此外,尽管已经说明了神经网络具有特定的超参数集合(例如,H=W=12,C=20,F=50,R=S=5,P=Q=8,有效卷积)且在特定NNU 121配置(例如,1024或2048个NPU126)上执行的实施例,但仅是为了说明的目的而提供那些实施例的说明,考虑其它实施例,具有不同的超参数集合和不同的NNU 121硬件配置,其仍然有效地使用NPU/输入/滤波器块和多路复用寄存器208旋转器操作以结合列-通道-行循环顺序围绕NNU 121旋转输入块5902,以生成列-通道-行-和,或卷积结果。
多字距离旋转
现在参考图70,示出了例示根据支持多字距离旋转操作的替代实施例的NPU 126的一部分的框图。图70包括NPU 126的多路复用寄存器208。NPU 126表示为NPU J,并且是NNU 121的N个NPU 126的阵列之一。在许多方面,图70的多路复用寄存器208类似于图7的多路复用寄存器208,因为它包括输入端207,其从数据RAM 122接收数据字并具有控制输入端213和输出端209。然而,不是如图7的实施例中的具有从相邻NPU 126接收的单个输入端211,图70的实施例的多路复用寄存器208具有来自五个不同的相邻NPU 126的五个输入端。第一输入端211-1来自NPU J-1的输出端209,即,离开当前NPU 126一个的NPU 126,如图7的实施例的输入端211。第二输入端211-2来自NPU J-2的输出端209,即,离开当前NPU 126二个的NPU 126。第三输入端211-4来自NPU J-4的输出端209,即,离开当前NPU 126四个的NPU126。第四输入端211-8来自NPU J-8的输出端209,即,离开当前NPU 126八个的NPU 126。第五输入端211-16来自NPU J-16的输出端209,即,离开当前NPU 126十六的NPU 126。控制输入213操作以选择用于在输出端209上提供的输入207、211-1、211-2、211-4、211-8或者211-16之一。这有利地使得由NNU 121执行的非架构指令能够实现多字距离旋转操作,即,当控制输入选择输入211-2、211-4,211-8或211-16中的一个用于在输出端209上提供时。这对于执行如上所述的3-D卷积(诸如图60、63、65、67和69的行19处的对准旋转操作)的非架构程序的大小减小和效率提高可以是特别有利的。
虽然在图70的实施例中,多路复用寄存器208具有五个输入端,其接收来自离开一个、两个、四个、八个和十六个的五个不同的相邻NPU 126的输出209,但是可以设想其他实施例,其中,多路复用寄存器208具有更多或更少(例如,三个、四个、六个、七个)输入端,其从不同数量的相邻NPU 126(离开不同距离的NPU 126)接收输出209。例如,在一个实施例中,多路复用寄存器208不包括输入端211-2也不包括211-16。此外,尽管图70的实施例中的距离是2的幂,但是可以设想一些距离不是2的幂的其他实施例。
在其他实施例中,多路复用寄存器208还被配置为接收和选择图23的相邻窄字输入1811以支持窄/漏斗配置特征和/或接收和选择图49的输出缓冲器1104的输入4905以支持输出缓冲器1104反馈特征,尽管为简单起见这些输入未在图70中示出。此外,虽然未示出,但是权重多路复用寄存器705也可以类似于图70的多路复用寄存器208来配置,即,接收和选择多字距离的相邻NPU 126的输出203。
现在参考图71,示出了例示包括具有诸如图70的多路复用寄存器208的NPU的NNU126的多字距离旋转特征的四个指令。四个指令中的每一个指定乘法-累加ALU运算,其从当前权重RAM 124行之后的权重RAM 124的下一行接收其权重字,并且经由图70的复用寄存寄存器208从分别离开两个、四个、八个或十六个距离的邻近NPU 126接收其数据字;即,四个指令中的第一个指令指示N个NPU 126中的每一个分别选择(例如,经由控制输入213)输入211-2、211-4,211-8或211-16。这样的指令中的一个或多个可以包括在实施诸如上述的图60、63、65、67和69的伪代码的非架构程序中,以执行行19的对准旋转。非架构指令可以执行除乘法-累加之外的其它ALU运算,例如上文所说明,例如加法、乘法、最大值、最小值、无操作。特别地,可以使用无操作ALU运算来简单地旋转从N个NPU 126中的数据RAM 122读取的行,而不影响累加器202,这在对准旋转的旋转量(即,旋转的字的数量)(例如,行19的)没有得到多路复用寄存器208的直接支持时特别有用。例如,如果旋转量为十一,则可能需要无操作旋转一,随后是无操作旋转两,之后是八的乘法-累加旋转。另外,考虑实施例,其中,NPU 126的权重字被保存在诸如图7的多路复用寄存器705的多路复用寄存器中,其可以包括在N字旋转器中,用于旋转从权重RAM 124接收的一行权重,且其被增强以类似于图70的多路复用寄存器208从来自离开多个距离(例如,一个、两个、四个、八个和十六)的多个不同的邻近NPU 126的输出端209的接收输入。此外,指定多字距离旋转操作的非架构指令可以指定大于一的计数,诸如在图4的地址2处的非架构指令中指定的COUNT=511。
虽然本文已经说明了本发明的各种实施例,但是应当理解,它们是作为示例而非限制而提出的。对于相关计算机领域的技术人员显而易见的是,在不脱离本发明的范围的情况下,可以在形式和细节上进行各种改变。例如,软件可以实现例如本文所述的装置和方法的功能、制造、建模、模拟、描述和/或测试。这可以通过使用通用编程语言(例如,C、C++),包括Verilog HDL、VHDL等的硬件描述语言(HDL)或其他可用程序来实现。这种软件可以设置在诸如磁带、半导体、磁盘或光盘(例如,CD-ROM、DVD-ROM等)、网络、有线线路或其它通信介质的任何已知的计算机可用介质中。本文所述的装置和方法的实施例可以包括在半导体知识产权核心中,诸如处理器核心(例如,在HDL中体现或指定),并且在集成电路的生产中被转换为硬件。另外,本文所说明的装置和方法可以体现为硬件和软件的组合。因此,本发明不应受到本文所说明的任何示例性实施例的限制,而应仅根据所附权利要求及其等同物来限定。具体地,本发明可以在可以在通用计算机中使用的处理器设备内实施。最后,本领域技术人员应当理解,他们可以容易地使用所公开的概念和具体实施例作为设计或修改用于实现本发明的相同目的的其它结构的基础,而不脱离由所附权利要求限定的本发明的范围。
Claims (21)
1.一种装置,包括:
N个处理单元(PU)的阵列,每一个PU具有:
累加器,所述累加器具有输出;
算术单元,所述算术单元具有第一输入、第二输入和第三输入并且在其上执行运算以生成存储在所述累加器中的结果,所述第一输入接收所述累加器的输出;
权重输入,所述权重输入由所述第二输入接收到所述算术单元;及
多路复用寄存器,所述多路复用寄存器具有第一数据输入、第二数据输入、第三数据输入和第四数据输入、由第三输入接收到所述算术单元的输出、及控制所述第一数据输入、第二数据输入、第三数据输入和第四数据输入的选择的控制输入;
第一存储器,所述第一存储器保存N个权重字的行,并将一行的N个权重字提供给所述PU阵列的N个PU的对应权重输入;
第二存储器,所述第二存储器保存N个数据字的行,并将一行的N个数据字提供给所述PU阵列的N个PU的多路复用寄存器的对应第一数据输入;
其中所述多路复用寄存器的输出还由以下接收:
离开一个PU的PU的多路复用寄存器的第二数据输入;
离开2^J个PU的PU的多路复用寄存器的第三数据输入,其中J为大于1的整数;及
离开2^K个PU的PU的多路复用寄存器的第四数据输入,其中K是大于J的整数;
其中当所述控制输入指定所述第二数据输入时,所述N个PU的所述多路复用寄存器共同地作为旋转一个字的N字旋转器操作;
其中当所述控制输入指定所述第三数据输入时,所述N个PU的所述多路复用寄存器共同地作为旋转2^J个字的N字旋转器操作;及
其中当所述控制输入指定所述第四数据输入时,所述N个PU的所述多路复用寄存器共同地作为旋转2^K个字的N字旋转器操作。
2.根据权利要求1所述的装置,
其中所述N个PU的阵列被配置为执行将W列乘以H行乘以C个通道的输入与S列乘以R行乘以C个通道的F个滤波器进行三维卷积以生成P列乘以Q行的F个输出的程序的指令;及
其中所述程序包括指令,使得:
(a)S次,所述控制输入选择所述第二数据输入并且所述算术单元将所述第二输入和第三输入相乘以生成乘积并将所述乘积与所述第一输入累加以生成结果;及
(b)一次或多次,所述控制输入选择所述第三数据输入或第四数据输入以完成旋转B减S个字,其中B是至少与W一样大的N的最小因数。
3.根据权利要求2所述的装置,
其中所述程序包括指令,进一步使得:
(c)与操作(a)同时的S次,所述第一存储器向所述PU阵列的N个PU的相应权重输入提供一行的N个权重字。
4.根据权利要求3所述的装置,
其中所述程序包括指令,进一步使得:
(d)至少执行C次操作(a)、(b)和(c)。
5.根据权利要求4所述的装置,
其中所述程序包括指令,进一步使得:
(e)在操作(d)之前,所述第二存储器向所述PU阵列的N个PU的多路复用寄存器的对应第一数据输入提供一行的N个数据字。
6.根据权利要求5所述的装置,
其中由所述第二存储器提供的行包含与所述输入的H行中的一行相对应的所述输入的水平片。
7.根据权利要求6所述的装置,
其中所述S次中的每一次,由所述第一存储器提供的C行被逻辑地分为F个滤波器块,其中所述F个滤波器块的每个滤波器块包含来自所述F个滤波器中的对应一个滤波器的不同权重的P个副本。
8.根据权利要求7所述的装置,
其中至少部分地通过执行操作(a)和(c)S次中的哪一次以及执行操作(d)至少C次中的哪一次来确定所述不同权重在所述F个滤波器中的一个内的位置。
9.根据权利要求1所述的装置,
其中为了对所述第一输入、第二输入和第三输入执行运算,所述算术单元将所述第二输入和第三输入相乘以生成乘积并且将所述乘积与所述第一输入累加以生成所述结果。
10.根据权利要求1所述的装置,
其中所述N个PU的阵列的每个PU的所述多路复用寄存器还具有第五数据输入,及所述控制输入控制所述第一数据输入、第二数据输入、第三数据输入、第四数据输入和第五数据输入的选择;
其中所述多路复用寄存器的输出还由以下接收:
离开2^L个PU的PU的多路复用寄存器的第五数据输入,其中L是大于K的整数;及
其中当所述控制输入指定所述第五数据输入时,所述N个PU的多路复用寄存器共同地作为旋转2^L个字的N字旋转器操作。
11.一种用于操作装置的方法,所述装置包括N个处理单元(PU)的阵列,每一个处理单元(PU)具有:累加器,所述累加器具有输出;算术单元,所述算术单元具有第一输入、第二输入和第三输入并且在其上执行运算以生成存储在所述累加器中的结果,其中所述第一输入接收所述累加器的输出;所述PU的阵列还具有权重输入,所述权重输入由所述第二输入接收到所述算术单元;及多路复用寄存器,所述多路复用寄存器具有第一数据输入、第二数据输入、第三数据输入和第四数据输入、由第三输入接收到所述算术单元的输出、及控制所述第一数据输入、第二数据输入、第三数据输入和第四数据输入的选择的控制输入;所述装置还包括:第一存储器,所述第一存储器保存N个权重字的行,并将一行的N个权重字提供给所述PU阵列的N个PU的对应权重输入;及第二存储器,所述第二存储器保存N个数据字的行,并将一行的N个数据字提供给所述PU阵列的N个PU的多路复用寄存器的对应第一数据输入;其中所述多路复用寄存器的输出还由以下接收:离开一个PU的PU的多路复用寄存器的第二数据输入,离开2^J个PU的PU的多路复用寄存器的第三数据输入,其中J为大于1的整数,及离开2^K个PU的PU的多路复用寄存器的第四数据输入,其中K是大于J的整数,所述方法包括:
当所述控制输入指定所述第二数据输入时,所述N个PU的所述多路复用寄存器共同地作为旋转一个字的N字旋转器操作;
当所述控制输入指定所述第三数据输入时,所述N个PU的所述多路复用寄存器共同地作为旋转2^J个字的N字旋转器操作;及
当所述控制输入指定所述第四数据输入时,所述N个PU的所述多路复用寄存器共同地作为旋转2^K个字的N字旋转器操作。
12.根据权利要求11所述的方法,
所述N个PU的阵列执行将W列乘以H行乘以C个通道的输入与S列乘以R行乘以C个通道的F个滤波器进行三维卷积,以生成P列乘以Q行的F个输出的程序的指令;及
其中所述执行程序指令包括:
(a)S次,所述控制输入选择所述第二数据输入并且所述算术单元将所述第二输入和第三输入相乘以生成乘积并将所述乘积与所述第一输入累加以生成结果;及
(b)一次或多次,所述控制输入选择所述第三数据输入或第四数据输入以完成旋转B减S个字,其中B是至少与W一样大的N的最小因数。
13.根据权利要求12所述的方法,
其中所述执行程序指令还包括:
(c)与操作(a)同时的S次,所述第一存储器向所述PU阵列的N个PU的相应权重输入提供一行的N个权重字。
14.根据权利要求13所述的方法,
其中所述执行程序指令还包括:
(d)至少执行C次操作(a)、(b)和(c)。
15.根据权利要求14所述的方法,
其中所述执行程序指令还包括:
(e)在操作(d)之前,所述第二存储器向所述PU阵列的N个PU的多路复用寄存器的对应第一数据输入提供一行的N个数据字。
16.根据权利要求15所述的方法,
其中由所述第二存储器提供的行包含与所述输入的H行中的一行相对应的所述输入的水平片。
17.根据权利要求16所述的方法,
其中所述S次中的每一次,由所述第一存储器提供的C行被逻辑地分为F个滤波器块,其中所述F个滤波器块的每个滤波器块包含来自所述F个滤波器中的对应一个滤波器的不同权重的P个副本。
18.根据权利要求17所述的方法,
其中至少部分地通过执行操作(a)和(c)S次中的哪一次以及执行操作(d)至少C次中的哪一次来确定所述不同权重在所述F个滤波器中的一个内的位置。
19.根据权利要求11所述的方法,
其中为了对所述第一输入、第二输入和第三输入执行运算,所述算术单元将所述第二输入和第三输入相乘以生成乘积并且将所述乘积与所述第一输入累加以生成所述结果。
20.根据权利要求11所述的方法,
其中所述N个PU的阵列的每个PU的所述多路复用寄存器还具有第五数据输入,及所述控制输入控制所述第一数据输入、第二数据输入、第三数据输入、第四数据输入和第五数据输入的选择;
其中所述多路复用寄存器的输出还由以下接收:
离开2^L个PU的PU的多路复用寄存器的第五数据输入,其中L是大于K的整数;及
其中当所述控制输入指定所述第五数据输入时,所述N个PU的多路复用寄存器共同地作为旋转2^L个字的N字旋转器操作。
21.一种计算机程序产品,其编码在至少一个非暂时性计算机可用介质中并与计算设备一起使用,所述计算机程序产品包括:
体现在所述介质中的用于指定装置的计算机可用程序代码,所述计算机可用程序代码包括:
第一程序代码,用于指定N个处理单元(PU)的阵列,每一个PU具有:
累加器,所述累加器具有输出;
算术单元,所述算术单元具有第一输入、第二输入和第三输入并且在其上执行运算以生成存储在所述累加器中的结果,所述第一输入接收所述累加器的输出;
权重输入,所述权重输入由所述第二输入接收到所述算术单元;及
多路复用寄存器,所述多路复用寄存器具有第一数据输入、第二数据输入、第三数据输入和第四数据输入、由第三输入接收到所述算术单元的输出、及控制所述第一数据输入、第二数据输入、第三数据输入和第四数据输入的选择的控制输入;
第二程序代码,用于指定第一存储器,所述第一存储器保存N个权重字的行,并将一行的N个权重字提供给所述PU阵列的N个PU的对应权重输入;
第三程序代码,用于指定第二存储器,所述第二存储器保存N个数据字的行,并将一行的N个数据字提供给所述PU阵列的N个PU的多路复用寄存器的对应第一数据输入;
其中所述多路复用寄存器的输出还由以下接收:
离开一个PU的PU的多路复用寄存器的第二数据输入;
离开2^J个PU的PU的多路复用寄存器的第三数据输入,其中J为大于1的整数;及
离开2^K个PU的PU的多路复用寄存器的第四数据输入,其中K是大于J的整数;
其中当所述控制输入指定所述第二数据输入时,所述N个PU的所述多路复用寄存器共同地作为旋转一个字的N字旋转器操作;
其中当所述控制输入指定所述第三数据输入时,所述N个PU的所述多路复用寄存器共同地作为旋转2^J个字的N字旋转器操作;及
其中当所述控制输入指定所述第四数据输入时,所述N个PU的所述多路复用寄存器共同地作为旋转2^K个字的N字旋转器操作。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US15/366,018 | 2016-12-01 | ||
US15/366,018 US10395165B2 (en) | 2016-12-01 | 2016-12-01 | Neural network unit with neural memory and array of neural processing units that collectively perform multi-word distance rotates of row of data received from neural memory |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108133263A true CN108133263A (zh) | 2018-06-08 |
CN108133263B CN108133263B (zh) | 2022-02-25 |
Family
ID=57838137
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711025871.9A Active CN108133263B (zh) | 2016-12-01 | 2017-10-27 | 神经网络单元 |
Country Status (5)
Country | Link |
---|---|
US (1) | US10395165B2 (zh) |
EP (1) | EP3330899B1 (zh) |
JP (1) | JP6357524B2 (zh) |
KR (1) | KR102064642B1 (zh) |
CN (1) | CN108133263B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110069444A (zh) * | 2019-06-03 | 2019-07-30 | 南京宁麒智能计算芯片研究院有限公司 | 一种计算单元、阵列、模块、硬件系统及实现方法 |
WO2020191920A1 (en) * | 2019-03-25 | 2020-10-01 | Huawei Technologies Co., Ltd. | Storing complex data in warp gprs |
CN111753962A (zh) * | 2020-06-24 | 2020-10-09 | 国汽(北京)智能网联汽车研究院有限公司 | 一种加法器、乘法器、卷积层结构、处理器及加速器 |
CN112233715A (zh) * | 2019-07-15 | 2021-01-15 | 美光科技公司 | 用于存储器系统的维护操作 |
WO2021044242A1 (en) * | 2019-09-05 | 2021-03-11 | International Business Machines Corporation | Performing dot product operations using a memristive crossbar array |
Families Citing this family (37)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11775313B2 (en) * | 2017-05-26 | 2023-10-03 | Purdue Research Foundation | Hardware accelerator for convolutional neural networks and method of operation thereof |
US10671349B2 (en) * | 2017-07-24 | 2020-06-02 | Tesla, Inc. | Accelerated mathematical engine |
US11157441B2 (en) | 2017-07-24 | 2021-10-26 | Tesla, Inc. | Computational array microprocessor system using non-consecutive data formatting |
US11157287B2 (en) | 2017-07-24 | 2021-10-26 | Tesla, Inc. | Computational array microprocessor system with variable latency memory access |
US11409692B2 (en) | 2017-07-24 | 2022-08-09 | Tesla, Inc. | Vector computational unit |
US11893393B2 (en) | 2017-07-24 | 2024-02-06 | Tesla, Inc. | Computational array microprocessor system with hardware arbiter managing memory requests |
EP3480747A1 (en) * | 2017-11-06 | 2019-05-08 | Imagination Technologies Limited | Single plane filters |
US11561791B2 (en) | 2018-02-01 | 2023-01-24 | Tesla, Inc. | Vector computational unit receiving data elements in parallel from a last row of a computational array |
US11074041B2 (en) * | 2018-08-07 | 2021-07-27 | NovuMind Limited | Method and system for elastic precision enhancement using dynamic shifting in neural networks |
WO2020046642A1 (en) | 2018-08-31 | 2020-03-05 | Flex Logix Technologies, Inc. | Multiplier-accumulator circuit, logic tile architecture for multiply-accumulate and ic including logic tile array |
KR102604016B1 (ko) | 2018-10-24 | 2023-11-22 | 삼성전자주식회사 | 전자 장치 및 이의 제어방법 |
CN109461119B (zh) * | 2019-01-31 | 2019-05-21 | 深兰人工智能芯片研究院(江苏)有限公司 | 卷积神经网络fpga加速中的图像填充方法及装置 |
US11194585B2 (en) | 2019-03-25 | 2021-12-07 | Flex Logix Technologies, Inc. | Multiplier-accumulator circuitry having processing pipelines and methods of operating same |
US11314504B2 (en) | 2019-04-09 | 2022-04-26 | Flex Logix Technologies, Inc. | Multiplier-accumulator processing pipelines and processing component, and methods of operating same |
US11288076B2 (en) | 2019-09-13 | 2022-03-29 | Flex Logix Technologies, Inc. | IC including logic tile, having reconfigurable MAC pipeline, and reconfigurable memory |
US11455368B2 (en) | 2019-10-02 | 2022-09-27 | Flex Logix Technologies, Inc. | MAC processing pipeline having conversion circuitry, and methods of operating same |
US11475283B2 (en) * | 2019-10-24 | 2022-10-18 | Apple Inc. | Multi dimensional convolution in neural network processor |
US12015428B2 (en) | 2019-11-05 | 2024-06-18 | Flex Logix Technologies, Inc. | MAC processing pipeline using filter weights having enhanced dynamic range, and methods of operating same |
KR20210060024A (ko) | 2019-11-18 | 2021-05-26 | 에스케이하이닉스 주식회사 | 신경망 처리 회로를 포함하는 메모리 장치 |
US11593627B2 (en) | 2019-12-31 | 2023-02-28 | X Development Llc | Artificial neural network architectures based on synaptic connectivity graphs |
US11593617B2 (en) | 2019-12-31 | 2023-02-28 | X Development Llc | Reservoir computing neural networks based on synaptic connectivity graphs |
US11631000B2 (en) | 2019-12-31 | 2023-04-18 | X Development Llc | Training artificial neural networks based on synaptic connectivity graphs |
US11568201B2 (en) | 2019-12-31 | 2023-01-31 | X Development Llc | Predicting neuron types based on synaptic connectivity graphs |
US11625611B2 (en) | 2019-12-31 | 2023-04-11 | X Development Llc | Training artificial neural networks based on synaptic connectivity graphs |
US11620487B2 (en) * | 2019-12-31 | 2023-04-04 | X Development Llc | Neural architecture search based on synaptic connectivity graphs |
US11960856B1 (en) | 2020-01-15 | 2024-04-16 | Flex Logix Technologies, Inc. | Multiplier-accumulator processing pipeline using filter weights having gaussian floating point data format |
US11442881B2 (en) | 2020-04-18 | 2022-09-13 | Flex Logix Technologies, Inc. | MAC processing pipelines, circuitry to control and configure same, and methods of operating same |
CN111563483B (zh) * | 2020-06-22 | 2024-06-11 | 武汉芯昌科技有限公司 | 一种基于精简lenet5模型的图像识别方法及系统 |
TWI754970B (zh) * | 2020-06-22 | 2022-02-11 | 鴻海精密工業股份有限公司 | 加速啟動函數運算的裝置、方法及存儲介質 |
FR3113159B1 (fr) * | 2020-08-03 | 2023-04-21 | Commissariat Energie Atomique | Architecture de calcul reconfigurable pour la mise en œuvre de réseaux de neurones artificiels. |
KR20220028899A (ko) * | 2020-08-31 | 2022-03-08 | 삼성전자주식회사 | 가속기, 가속기의 동작 방법 및 이를 포함한 전자 장치 |
WO2022109333A1 (en) * | 2020-11-20 | 2022-05-27 | Natural Intelligence Systems, Inc. | Neural processing units (npus) and computational systems employing the same |
US20220283779A1 (en) * | 2021-03-03 | 2022-09-08 | Flex Logix Technologies, Inc. | MAC Processing Pipelines, Circuitry to Configure Same, and Methods of Operating Same |
CN115204355A (zh) | 2021-04-14 | 2022-10-18 | 蒂普爱可斯有限公司 | 能够重新使用数据的神经处理单元及其方法 |
US11511772B2 (en) | 2021-04-30 | 2022-11-29 | Deepx Co., Ltd. | NPU implemented for artificial neural networks to process fusion of heterogeneous data received from heterogeneous sensors |
WO2023101472A1 (ko) * | 2021-12-01 | 2023-06-08 | 주식회사 딥엑스 | 프로그램된 활성화 함수 실행 유닛을 포함하는 신경 프로세싱 유닛 |
KR102651560B1 (ko) * | 2021-12-01 | 2024-03-26 | 주식회사 딥엑스 | 프로그램된 활성화 함수 실행 유닛을 포함하는 신경 프로세싱 유닛 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101682391A (zh) * | 2007-03-02 | 2010-03-24 | 高通股份有限公司 | 叠加合成信道滤波器 |
CN103889145A (zh) * | 2014-01-09 | 2014-06-25 | 上海兆芯集成电路有限公司 | 线路板及电子总成 |
CN104115115A (zh) * | 2011-12-19 | 2014-10-22 | 英特尔公司 | 用于多精度算术的simd整数乘法累加指令 |
US20150106316A1 (en) * | 2013-10-16 | 2015-04-16 | University Of Tennessee Research Foundation | Method and apparatus for providing real-time monitoring of an artifical neural network |
CN105704366A (zh) * | 2009-01-30 | 2016-06-22 | 英特赛尔美国有限公司 | 混合格式媒体传输系统和方法 |
Family Cites Families (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5204938A (en) | 1989-05-30 | 1993-04-20 | Loral Aerospace Corp. | Method of implementing a neural network on a digital computer |
FR2686175B1 (fr) | 1992-01-14 | 1996-12-20 | Andre Thepaut | Systeme de traitement de donnees multiprocesseur. |
US5623628A (en) | 1994-03-02 | 1997-04-22 | Intel Corporation | Computer system and method for maintaining memory consistency in a pipelined, non-blocking caching bus request queue |
US5956703A (en) | 1995-07-28 | 1999-09-21 | Delco Electronics Corporation | Configurable neural network integrated circuit |
DE19625569A1 (de) | 1996-06-26 | 1998-01-02 | Philips Patentverwaltung | Signalprozessor |
CN101452400B (zh) | 2007-11-29 | 2011-12-28 | 国际商业机器公司 | 处理多处理器系统中事务缓冲器溢出的方法和系统 |
US8583896B2 (en) | 2009-11-13 | 2013-11-12 | Nec Laboratories America, Inc. | Massively parallel processing core with plural chains of processing elements and respective smart memory storing select data received from each chain |
US8965819B2 (en) | 2010-08-16 | 2015-02-24 | Oracle International Corporation | System and method for effective caching using neural networks |
US9645866B2 (en) | 2010-09-20 | 2017-05-09 | Qualcomm Incorporated | Inter-processor communication techniques in a multiple-processor computing platform |
US9159020B2 (en) | 2012-09-14 | 2015-10-13 | International Business Machines Corporation | Multiplexing physical neurons to optimize power and area |
FR3015068B1 (fr) * | 2013-12-18 | 2016-01-01 | Commissariat Energie Atomique | Module de traitement du signal, notamment pour reseau de neurones et circuit neuronal |
US10817425B2 (en) | 2014-12-26 | 2020-10-27 | Intel Corporation | Hardware/software co-optimization to improve performance and energy for inter-VM communication for NFVs and other producer-consumer workloads |
US20160210044A1 (en) | 2015-01-15 | 2016-07-21 | Commvault Systems, Inc. | Intelligent hybrid drive caching |
US20160328644A1 (en) | 2015-05-08 | 2016-11-10 | Qualcomm Incorporated | Adaptive selection of artificial neural networks |
US10353861B2 (en) | 2015-10-08 | 2019-07-16 | Via Alliance Semiconductor Co., Ltd. | Mechanism for communication between architectural program running on processor and non-architectural program running on execution unit of the processor regarding shared resource |
US10776690B2 (en) | 2015-10-08 | 2020-09-15 | Via Alliance Semiconductor Co., Ltd. | Neural network unit with plurality of selectable output functions |
US10380481B2 (en) | 2015-10-08 | 2019-08-13 | Via Alliance Semiconductor Co., Ltd. | Neural network unit that performs concurrent LSTM cell calculations |
US10228911B2 (en) | 2015-10-08 | 2019-03-12 | Via Alliance Semiconductor Co., Ltd. | Apparatus employing user-specified binary point fixed point arithmetic |
-
2016
- 2016-12-01 US US15/366,018 patent/US10395165B2/en active Active
- 2016-12-20 EP EP16205512.3A patent/EP3330899B1/en active Active
- 2016-12-27 JP JP2016253083A patent/JP6357524B2/ja active Active
- 2016-12-30 KR KR1020160183874A patent/KR102064642B1/ko active IP Right Grant
-
2017
- 2017-10-27 CN CN201711025871.9A patent/CN108133263B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101682391A (zh) * | 2007-03-02 | 2010-03-24 | 高通股份有限公司 | 叠加合成信道滤波器 |
CN105704366A (zh) * | 2009-01-30 | 2016-06-22 | 英特赛尔美国有限公司 | 混合格式媒体传输系统和方法 |
CN104115115A (zh) * | 2011-12-19 | 2014-10-22 | 英特尔公司 | 用于多精度算术的simd整数乘法累加指令 |
US20150106316A1 (en) * | 2013-10-16 | 2015-04-16 | University Of Tennessee Research Foundation | Method and apparatus for providing real-time monitoring of an artifical neural network |
CN103889145A (zh) * | 2014-01-09 | 2014-06-25 | 上海兆芯集成电路有限公司 | 线路板及电子总成 |
Non-Patent Citations (1)
Title |
---|
FARABET ET AL: ""Hardware accelerated convoluational networks for synthetic vision systems"", 《PROCEEDING OF 2010 IEEE INTERNATIONAL SYMPOSIUM ON CIRCUITS AND SYSTEMS》 * |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2020191920A1 (en) * | 2019-03-25 | 2020-10-01 | Huawei Technologies Co., Ltd. | Storing complex data in warp gprs |
CN110069444A (zh) * | 2019-06-03 | 2019-07-30 | 南京宁麒智能计算芯片研究院有限公司 | 一种计算单元、阵列、模块、硬件系统及实现方法 |
CN112233715A (zh) * | 2019-07-15 | 2021-01-15 | 美光科技公司 | 用于存储器系统的维护操作 |
WO2021044242A1 (en) * | 2019-09-05 | 2021-03-11 | International Business Machines Corporation | Performing dot product operations using a memristive crossbar array |
GB2601701A (en) * | 2019-09-05 | 2022-06-08 | Ibm | Performing dot product operations using a memristive crossbar array |
CN111753962A (zh) * | 2020-06-24 | 2020-10-09 | 国汽(北京)智能网联汽车研究院有限公司 | 一种加法器、乘法器、卷积层结构、处理器及加速器 |
CN111753962B (zh) * | 2020-06-24 | 2023-07-11 | 国汽(北京)智能网联汽车研究院有限公司 | 一种加法器、乘法器、卷积层结构、处理器及加速器 |
Also Published As
Publication number | Publication date |
---|---|
EP3330899B1 (en) | 2021-02-24 |
JP6357524B2 (ja) | 2018-07-11 |
US10395165B2 (en) | 2019-08-27 |
EP3330899A1 (en) | 2018-06-06 |
CN108133263B (zh) | 2022-02-25 |
KR20180062910A (ko) | 2018-06-11 |
KR102064642B1 (ko) | 2020-01-08 |
US20180157961A1 (en) | 2018-06-07 |
JP2018092559A (ja) | 2018-06-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108133263A (zh) | 神经网络单元 | |
CN108133264A (zh) | 执行高效3维卷积的神经网络单元 | |
CN108133262A (zh) | 具有用于执行高效3维卷积的存储器布局的神经网络单元 | |
CN106485315B (zh) | 具有输出缓冲器反馈与遮蔽功能的神经网络单元 | |
CN106599990B (zh) | 具有神经存储器的神经网络单元和集体将来自神经存储器的数据列移位的神经处理单元阵列 | |
CN108133269A (zh) | 具有可作为高速缓存存储器或神经网络单元存储器操作的存储器阵列的处理器 | |
CN107844830A (zh) | 具有数据大小和权重大小混合计算能力的神经网络单元 | |
CN108133267A (zh) | 具有可作为最后级高速缓存片或神经网络单元存储器操作的存储器阵列的处理器 | |
CN108564169A (zh) | 硬件处理单元、神经网络单元和计算机可用介质 | |
CN108268944A (zh) | 具有可重塑之存储器之神经网络单元 | |
CN108133268A (zh) | 具有可作为牺牲高速缓存或神经网络单元存储器操作的存储器阵列的处理器 | |
CN108268946A (zh) | 具有阵列宽度可分段之旋转器之神经网络单元 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CP03 | Change of name, title or address | ||
CP03 | Change of name, title or address |
Address after: Room 301, 2537 Jinke Road, Zhangjiang High Tech Park, Pudong New Area, Shanghai 201203 Patentee after: Shanghai Zhaoxin Semiconductor Co.,Ltd. Address before: Room 301, 2537 Jinke Road, Zhangjiang hi tech park, Shanghai 201203 Patentee before: VIA ALLIANCE SEMICONDUCTOR Co.,Ltd. |