本发明涉及一种处理器,特别涉及一种提升人工神经网络的运算效能与效率的处理器。本申请案主张下列的美国临时申请案的国际优先权。这些优先权案的全文并入本案以供参考。本申请案关联于下列同时提出申请的美国申请案。这些关联申请案的全文并入本案以供参考。
背景技术:
::近年来,人工神经网络(artificialneuralnetworks,ANN)重新吸引了人们的注意。这些研究通常被称为深度学习(deeplearning)、计算机学习(computerlearning)等类似术语。通用处理器运算能力的提升也推升了人们在数十年后的现在对于人工神经网络的兴趣。人工神经网络近期的应用包括语言与影像辨识等。对于提升人工神经网络的运算效能与效率的需求似乎正在增加。技术实现要素:有鉴于此,本发明提供一种处理器。此处理器包括一前端部分,架构通用缓存器与执行单元。前端部分用以发布指令至执行单元。执行单元执行被发布的指令。执行单元包括一硬件神经网络单元(NNU)以加速计算。神经网络单元包括一第一存储器,一第二存储器与一第三存储器。第一存储器用以装载关联于人工神经网络(ANN)神经元输出的数据文字。第二存储器用以装载关联于人工神经网络神经元连结的权重文字。第三存储器用以装载一程序,就指令集而言,此程序包含的神经网络单元指令不同于处理器的前端部分发布至神经网络单元的指令。其中,此程序对装载于第一存储器与第二存储器的数据文字与权重文字执行关联于一人工神经网络的计算。其中,这些由前端部分发布至神经网络单元的指令中的第一个指令指示神经网络单元将程序的神经网络单元指令从架构通用缓存器移转至第三存储器。其中,这些由前端部分发布至神经网络单元的指令中的第二个指令指示神经网络单元调用(invoke)储存于第三存储器的程序。本发明还提供一种运作一处理器的方法。此处理器具有一前端部分,架构通用缓存器与执行单元。其中,执行单元用以执行被发布的指令并且包括一硬件神经网络单元。此方法包括:利用前端部分,发布指令至执行单元;利用一第一存储器,装载关联于人工神经网络神经元输出的数据文字;利用一第二存储器,装载关联于人工神经网络神经元连结的权重文字;利用一第三存储器,装载一程序,就指令集而言,此程序包含的神经网络单元指令不同于处理器的前端部分发布至神经网络单元的指令;对装载于第一存储器与第二存储器的数据文字与权重文字执行关联于一人工神经网络的计算;利用这些由前端部分发布至神经网络单元的指令中的第一个指令,指示神经网络单元将程序的神经网络单元指令从架构通用缓存器移转至第三存储器;以及利用这些由前端部分发布至神经网络单元的指令中的第二个指令,指示神经网络单元调用储存于第三存储器的程序。本发明还提供一种编码于至少一非瞬时计算机可使用媒体以供一计算机装置使用的一计算机程序产品。此计算机程序产品包括内含于该媒体的计算机可使用程序代码,用以描述一处理器。此计算机可使用程序代码包括第一程序代码与第二程序代码。第一程序代码用以描述一前端部分,前端部分发布指令至执行单元,执行单元执行此被发布指令。第二程序代码用以描述架构通用缓存器。其中,执行单元包括一硬件神经网络单元以加速计算。此神经网络单元包括一第一存储器,一第二存储器与一第三存储器。第一存储器用以装载关联于人工神经网络神经元输出的数据文字。第二存储器用以装载关联于人工神经网络神经元连结的权重文字。第三存储器用以装载一程序,就指令集而言,此程序包含的神经网络单元指令不同于处理器的前端部分发布至神经网络单元的指令。其中,此程序对装载于第一存储器与第二存储器的数据文字与权重文字执行关联于一人工神经网络的计算。其中,这些由前端部分发布至神经网络单元的指令中的第一个指令指示神经网络单元将程序的神经网络单元指令从架构通用缓存器移转至第三存储器。其中,这些由前端部分发布至神经网络单元的指令中的第二个指令指示神经网络单元调用储存于第三存储器的程序。本发明所采用的具体实施例,将通过以下的实施例及图式作进一步的说明。附图说明图1为显示包含神经网络单元(neuralnetworkunit,NNU)的处理器的方块示意图。图2为显示图1的神经处理单元(neuralprocessingunit,NPU)的方块示意图。图3为方块图,显示利用图1的神经网络单元的N个神经处理单元的N个多任务缓存器,对于由图1的数据随机存取存储器取得的一列数据文字执行如同N个文字的旋转器(rotator)或称循环移位器(circularshifter)的运作。图4为表格,显示一个储存于图1的神经网络单元的程序存储器并由该神经网络单元执行的程序。图5为显示神经网络单元执行图4的程序的时序图。图6A为显示图1的神经网络单元执行图4的程序的方块示意图。图6B为流程图,显示图1的处理器执行架构程序,以利用神经网络单元执行关联于人工神经网络的隐藏层的神经元的典型乘法累加启动函数运算的运作,如同由图4的程序执行的运作。图7为显示图1的神经处理单元的另一实施例的方块示意图。图8为显示图1的神经处理单元的又一实施例的方块示意图。图9为表格,显示一个储存于图1的神经网络单元的程序存储器并由该神经网络单元执行的程序。图10为显示神经网络单元执行图9的程序的时序图。图11为显示图1的神经网络单元的一实施例的方块示意图。在图11的实施例中,一个神经元分成两部分,即启动函数单元部分与算术逻辑单元部分(此部分还包含移位缓存器部分),而各个启动函数单元部分由多个算术逻辑单元部分共享。图12为显示图11的神经网络单元执行图4的程序的时序图。图13为显示图11的神经网络单元执行图4的程序的时序图。图14为方块示意图,显示移动至神经网络(MTNN)架构指令以及其对应于图1的神经网络单元的部分的运作。图15为方块示意图,显示移动至神经网络(MTNN)架构指令以及其对应于图1的神经网络单元的部分的运作。图16为显示图1的数据随机存取存储器的一实施例的方块示意图。图17为显示图1的权重随机存取存储器与缓冲器的一实施例的方块示意图。图18为显示图1的可动态配置的神经处理单元的方块示意图。图19为方块示意图,显示依据图18的实施例,利用图1的神经网络单元的N个神经处理单元的2N个多任务缓存器,对于由图1的数据随机存取存储器取得的一列数据文字执行如同旋转器(rotator)的运作。图20为表格,显示一个储存于图1的神经网络单元的程序存储器并由该神经网络单元执行的程序,而此神经网络单元具有如图18的实施例所示的神经处理单元。图21为显示神经网络单元执行图20的程序的时序图,此神经网络单元具有如图18所示的神经处理单元执行于窄配置。图22为显示图1的神经网络单元的方块示意图,此神经网络单元具有如图18所示的神经处理单元以执行图20的程序。图23为显示图1的可动态配置的神经处理单元的另一实施例的方块示意图。图24为方块示意图,显示由图1的神经网络单元使用以执行卷积(convolution)运算的数据结构的一范例。图25为流程图,显示图1的处理器执行架构程序以利用神经网络单元依据图24的数据阵列执行卷积核的卷积运算。图26A为神经网络单元程序的程序列表,此神经网络单元程序利用图24的卷积核执行数据矩阵的卷积运算并将其写回权重随机存取存储器。图26B为显示图1的神经网络单元的控制缓存器的某些字段的一实施例的方块示意图。图27为方块示意图,显示图1中填入输入数据的权重随机存取存储器的一范例,此输入数据由图1的神经网络单元执行共源运算(poolingoperation)。图28为神经网络单元程序的程序列表,此神经网络单元程序执行图27的输入数据矩阵的共源运算并将其写回权重随机存取存储器。图29A为显示图1的控制缓存器的一实施例的方块示意图。图29B为显示图1的控制缓存器的另一实施例的方块示意图。图29C为显示以两个部分储存图29A的倒数(reciprocal)的一实施例的方块示意图。图30为显示图2的启动函数单元(AFU)的一实施例的方块示意图。图31为显示图30的启动函数单元的运作的一范例。图32为显示图30的启动函数单元的运作的第二个范例。图33为显示图30的启动函数单元的运作的第三个范例。图34为显示图1的处理器以及神经网络单元的部分细节的方块示意图。图35为方块图,显示具有可变率神经网络单元的处理器。图36A为时序图,显示具有神经网络单元的处理器运作于一般模式的一运作范例,此一般模式即以主要时频率运作。图36B为时序图,显示具有神经网络单元的处理器运作于缓和模式的一运作范例,缓和模式的运作时频率低于主要时频率。图37为流程图,显示图35的处理器的运作。图38为方块图,详细显示神经网络单元的序列。图39为方块图,显示神经网络单元的控制与状态缓存器的某些字段。图40为方块图,显示Elman时间递归神经网络(recurrentneuralnetwork,RNN)的一范例。图41为方块图,显示当神经网络单元执行关联于图40的Elman时间递归神经网络的计算时,神经网络单元的数据随机存取存储器与权重随机存取存储器内的数据配置的一范例。图42为表格,显示储存于神经网络单元的程序存储器的程序,此程序由神经网络单元执行,并依据图41的配置使用数据与权重,以达成Elman时间递归神经网络。图43为方块图显示Jordan时间递归神经网络的一范例。图44为方块图,显示当神经网络单元执行关联于图43的Jordan时间递归神经网络的计算时,神经网络单元的数据随机存取存储器与权重随机存取存储器内的数据配置的一范例。图45为表格,显示储存于神经网络单元的程序存储器的程序,此程序由神经网络单元执行,并依据图44的配置使用数据与权重,以达成Jordan时间递归神经网络。图46为方块图,显示长短期记忆(longshorttermmemory,LSTM)胞的一实施例。图47为方块图,显示当神经网络单元执行关联于图46的长短期记忆胞层的计算时,神经网络单元的数据随机存取存储器与权重随机存取存储器内的数据配置的一范例。图48为表格,显示储存于神经网络单元的程序存储器的程序,此程序由神经网络单元执行并依据图47的配置使用数据与权重,以达成关联于长短期记忆胞层的计算。图49为方块图,显示神经网络单元的实施例,此实施例的神经处理单元群组内具有输出缓冲遮蔽与反馈能力。图50为方块图,显示当神经网络单元执行关联于图46的长短期记忆胞层的计算时,图49的神经网络单元的数据随机存取存储器,权重随机存取存储器与输出缓冲器内的数据配置的一范例。图51为表格,显示储存于神经网络单元的程序存储器的程序,此程序由图49的神经网络单元执行并依据图50的配置使用数据与权重,以达成关联于长短期记忆胞层的计算。图52为方块图,显示神经网络单元的实施例,此实施例的神经处理单元群组内具有输出缓冲遮蔽与反馈能力,并且共享启动函数单元。图53为方块图,显示当神经网络单元执行关联于图46的长短期记忆胞层的计算时,图49的神经网络单元的数据随机存取存储器,权重随机存取存储器与输出缓冲器内的数据配置的另一实施例。图54为表格,显示储存于神经网络单元的程序存储器的程序,此程序由图49的神经网络单元执行并依据图53的配置使用数据与权重,以达成关联于长短期记忆胞层的计算。图55为方块图,显示本发明另一实施例的部分神经处理单元。图56为方块图,显示当神经网络单元执行关联于图43的Jordan时间递归神经网络的计算并利用图55的实施例时,神经网络单元的数据随机存取存储器与权重随机存取存储器内的数据配置的一范例。图57为表格,显示储存于神经网络单元的程序存储器的程序,此程序由神经网络单元执行并依据图56的配置使用数据与权重,以达成Jordan时间递归神经网络。具体实施方式具有架构神经网络单元的处理器图1为显示包含神经网络单元(neuralnetworkunit,NNU)121的处理器100的方块示意图。如图中所示,此处理器100包含指令撷取单元101,指令快取102,指令转译器104,重命名单元106,多个保留站108,多个媒体缓存器118,多个通用缓存器116,前述神经网络单元121外的多个执行单元112与存储器子系统114。处理器100为电子装置,作为集成电路的中央处理单元。处理器100接收输入的数字数据,依据由存储器攫取的指令处理这些数据,并产生由指令指示的运算的处理结果作为其输出。此处理器100可用于桌上型计算机、行动装置、或平板计算机,并用于计算、文字处理、多媒体显示与网络浏览等应用。此处理器100还可设置于嵌入系统内,以控制各种包括设备、行动电话、智能电话、车辆、与工业用控制器的装置。中央处理器透过对数据执行包括算术、逻辑与输入/输出等运算,以执行计算机程序(或称为计算机应用程序或应用程序)指令的电子电路(即硬件)。集成电路为一组制作于小型半导体材料,通常是硅,的电子电路。集成电路也通常被用于表示芯片、微芯片或晶粒。指令撷取单元101控制由系统存储器(未图示)攫取架构指令103至指令快取102的运作。指令撷取单元101提供攫取地址至指令快取102,以指定处理器100攫取至高速缓存102的架构指令字节的快取列的存储器地址。攫取地址的选定基于处理器100的指令指针(未图示)的当前值或程序计数器。一般而言,程序计数器会依照指令大小循序递增,直到指令串流中出现例如分支、呼叫或返回的控制指令,或是发生例如中断、陷阱(trap)、例外或错误等例外条件,而需要以如分支目标地址、返回地址或例外向量等非循序地址更新程序计数器。总而言之,程序计数器会因应执行单元112/121执行指令而进行更新。程序计数器也可在侦测到例外条件时进行更新,例如指令转译器104遭遇到未被定义于处理器100的指令集架构的指令103。指令快取102储存攫取自一个耦接至处理器100的系统存储器的架构指令103。这些架构指令103包括移动至神经网络(MTNN)指令与由神经网络移出(MFNN)指令,详如后述。在一实施例中,架构指令103是x86指令集架构的指令,并附加上MTNN指令与MFNN指令。在本揭露内容中,x86指令集架构处理器理解为在执行相同机械语言指令的情况下,与处理器在指令集架构层产生相同结果的处理器。不过,其它指令集架构,例如,进阶精简指令集机器架构(ARM)、升阳(SUN)的可扩充处理器架构(SPARC)、或是增强精简指令集性能运算性能优化架构(PowerPC),也可用于本发明的其它实施例。指令快取102提供架构指令103至指令转译器104,以将架构指令103转译为微指令105。微指令105提供至重命名单元106而最终由执行单元112/121执行。这些微指令105会实现架构指令。就一较佳实施例而言,指令转译器104包括第一部分,用以将频繁执行以及/或是相对较不复杂的架构指令103转译为微指令105。此指令转译器104还包括第二部分,其具有微码单元(未图示)。微码单元具有微码存储器装载微码指令,以执行架构指令集中复杂和/或少用的指令。微码单元还包括微定序器(microsequencer)提供非架构微程序计数器(micro-PC)至微码存储器。就一较佳实施例而言,这些微指令经由微转译器(未图示)转译为微指令105。选择器依据微码单元当前是否具有控制权,选择来自第一部分或第二部分的微指令105提供至重命名单元106。重命名单元106会将架构指令103指定的架构缓存器重命名为处理器100的实体缓存器。就一较佳实施例而言,此处理器100包括重排缓冲器(未图示)。重命名单元106会依照程序顺序将重排缓冲器的项目分配给各个微指令105。如此即可使处理器100依据程序顺序撤除微指令105以及其相对应的架构指令103。在一实施例中,媒体缓存器118具有256位宽度,而通用缓存器116具有64位宽度。在一实施例中,媒体缓存器118为x86媒体缓存器,例如先进向量扩充(AVX)缓存器。在一实施例中,重排缓冲器的各个项目具有储存空间以储存微指令105的结果。此外,处理器100包括架构缓存器档案,此架构缓存器档案具有实体缓存器对应于各个架构缓存器,如媒体缓存器118、通用缓存器116以及其它架构缓存器。(就一较佳实施例而言,举例来说,媒体缓存器118与通用缓存器116的大小不同,即可使用分开的缓存器档案对应至这两种缓存器。)对于微指令105中指定有一个架构缓存器的各个源操作数,重命名单元会利用写入架构缓存器的旧有微指令105中最新一个微指令的重排缓冲器目录,填入微指令105的源操作数字段。当执行单元112/121完成微指令105的执行,执行单元112/121会将其结果写入此微指令105的重排缓冲器项目。当微指令105撤除时,撤除单元(未图示)会将来自此微指令的重排缓冲器字段的结果写入实体缓存器档案的缓存器,此实体缓存器档案关联于由此撤除微指令105所指定的架构目的缓存器。在另一实施例中,处理器100包括实体缓存器档案,其具有的实体缓存器的数量多于架构缓存器的数量,不过,此处理器100不包括架构缓存器档案,而且重排缓冲器项目内不包括结果储存空间。(就一较佳实施例而言,因为媒体缓存器118与通用缓存器116的大小不同,即可使用分开的缓存器档案对应至这两种缓存器。)此处理器100还包括指针表,其具有各个架构缓存器的相对应指针。对于微指令105内指定有架构缓存器的各个操作数,重命名单元会利用一个指向实体缓存器档案内自由缓存器的指针,填入微指令105内的目的操作数字段。若是实体缓存器档案内不存在自由缓存器,重命名单元106会暂时搁置管线。对于微指令105内指定有架构缓存器的各个源操作数,重命名单元会利用一个指向实体缓存器档案中,指派给写入架构缓存器的旧有微指令105中最新微指令的缓存器的指针,填入微指令105内的源操作数字段。当执行单元112/121完成执行微指令105,执行单元112/121会将结果写入实体缓存器档案中微指令105的目的操作数字段指向的缓存器。当微指令105撤除时,撤除单元会将微指令105的目的操作数字段值复制至关联于此撤除微指令105指定的架构目的缓存器的指针表的指针。保留站108会装载微指令105,直到这些微指令完成发布至执行单元112/121以供执行的准备。当一个微指令105的所有源操作数都可取用并且执行单元112/121也可用于执行时,即为此微指令105完成发布的准备。执行单元112/121由重排缓冲器或前述第一实施例所述的架构缓存器档案,或是由前述第二实施例所述的实体缓存器档案接收缓存器源操作数。此外,执行单元112/121可直接透过结果传送总线(未图示)接收缓存器源操作数。此外,执行单元112/121可以从保留站108接收微指令105所指定的立即操作数。MTNN与MFNN架构指令103包括立即操作数以指定神经网络单元121所要执行的功能,而此功能由MTNN与MFNN架构指令103转译产生的一个或多个微指令105所提供,详如后述。执行单元112包括一个或多个加载/储存单元(未图示),由存储器子系统114加载数据并且储存数据至存储器子系统114。就一较佳实施例而言,此存储器子系统114包括存储器管理单元(未图示),此存储器管理单元可包括,例如多个转译查找(lookaside)缓冲器、一个表移动(tablewalk)单元、一个阶层一数据快取(与指令快取102)、一个阶层二统一快取与一个作为处理器100与系统存储器间的接口的总线接口单元。在一实施例中,图1的处理器100以多核处理器的多个处理核心的其中之一来表示,而此多核处理器共享一个最后阶层高速缓存。执行单元112还可包括多个整数单元、多个媒体单元、多个浮点单元与一个分支单元。神经网络单元121包括权重随机存取存储器(RAM)124、数据随机存取存储器122、N个神经处理单元(NPU)126、一个程序存储器129、一个定序器128与多个控制与状态缓存器127。这些神经处理单元126在概念上如同神经网络中的神经元的功能。权重随机存取存储器124、数据随机存取存储器122与程序存储器129均可透过MTNN与MFNN架构指令103分别写入与读取。权重随机存取存储器124排列为W列,每列N个权重文字,数据随机存取存储器122排列为D列,每列N个数据文字。各个数据文字与各个权重文字均为多个位,就一较佳实施例而言,可以是8个位、9个位、12个位或16个位。各个数据文字作为网络中前一层的神经元的输出值(有时以启动值表示),各个权重文字作为网络中关联于进入网络当前层的神经元的连结的权重。虽然在神经网络单元121的许多应用中,装载于权重随机存取存储器124的文字或操作数实际上就是关联于进入神经元的连结的权重,不过需要注意的是,在神经网络单元121的某些应用中,装载于权重随机存取存储器124的文字并非权重,不过因为这些文字是储存于权重随机存取存储器124中,所以仍然以“权重文字”的用语表示。举例来说,在神经网络单元121的某些应用中,例如图24至图26A的卷积运算的范例或是图27至图28的共源运算的范例,权重随机存取存储器124会装载权重以外的对象,例如数据矩阵(如影像像素数据)的元素。同样地,虽然在神经网络单元121的许多应用中,装载于数据随机存取存储器122的文字或操作数实质上就是神经元的输出值或启动值,不过需要注意的是,在神经网络单元121的某些应用中,装载于数据随机存取存储器122的文字并非如此,不过因为这些文字是储存于数据随机存取存储器122中,所以仍然以“数据文字”的用语表示。举例来说,在神经网络单元121的某些应用中,例如图24至图26A的卷积运算的范例,数据随机存取存储器122会装载非神经元的输出,例如卷积核的元素。在一实施例中,神经处理单元126与定序器128包括组合逻辑、定序逻辑、状态机器、或是其组合。架构指令(例如MFNN指令1500)会将状态缓存器127的内容加载其中一个通用缓存器116,以确认神经网络单元121的状态,如神经网络单元121已经从程序存储器129完成一个命令或是一个程序的运作,或是神经网络单元121可自由接收一个新的命令或开始一个新的神经网络单元程序。神经处理单元126的数量可依据需求增加,权重随机存取存储器124与数据随机存取存储器122的宽度与深度也可随之调整进行扩张。就一较佳实施例而言,权重随机存取存储器124会大于数据随机存取存储器122,这是因为典型的神经网络层中存在许多连结,因而需要较大的储存空间储存关联于各个神经元的权重。本文揭露许多关于数据与权重文字的大小、权重随机存取存储器124与数据随机存取存储器122的大小、以及不同神经处理单元126数量的实施例。在一实施例中,神经网络单元121具有一个大小为64KB(8192位x64列)的数据随机存取存储器122,一个大小为2MB(8192位x2048列)的权重随机存取存储器124,以及512个神经处理单元126。此神经网络单元121是以台湾集成电路(TSMC)的16纳米制程制造,其所占面积大约是3.3平方毫米。定序器128由程序存储器129攫取指令并执行,其执行的运作还包括产生地址与控制信号提供给数据随机存取存储器122、权重随机存取存储器124与神经处理单元126。定序器128产生存储器地址123与读取命令提供给数据随机存取存储器122,藉以在D列的N个数据文字中选择其一提供给N个神经处理单元126。定序器128还会产生存储器地址125与读取命令提供给权重随机存取存储器124,藉以在W列的N个权重文字中选择其一提供给N个神经处理单元126。定序器128产生还提供给神经处理单元126的地址123,125的顺序即确定神经元间的“连结”。定序器128还会产生存储器地址123与写入命令提供给数据随机存取存储器122,藉以在D列的N个数据文字中选择其一由N个神经处理单元126进行写入。定序器128还会产生存储器地址125与写入命令提供给权重随机存取存储器124,藉以在W列的N个权重文字中选择其一由N个神经处理单元126进行写入。定序器128还会产生存储器地址131至程序存储器129以选择提供给定序器128的神经网络单元指令,这部分在后续章节会进行说明。存储器地址131对应至程序计数器(未图示),定序器128通常是依据程序存储器129的位置顺序使程序计数器递增,除非定序器128遭遇到控制指令,例如循环指令(请参照如图26A所示),在此情况下,定序器128会将程序计数器更新为此控制指令的目标地址。定序器128还会产生控制信号至神经处理单元126,指示神经处理单元126执行各种不同的运算或功能,例如起始化、算术/逻辑运算、转动/移位运算、启动函数、以及写回运算,相关的范例在后续章节(请参照如图34的微运算3418所示)会有更详细的说明。N个神经处理单元126会产生N个结果文字133,这些结果文字133可被写回权重随机存取存储器124或数据随机存取存储器122的一列。就一较佳实施例而言,权重随机存取存储器124与数据随机存取存储器122直接耦接至N个神经处理单元126。进一步来说,权重随机存取存储器124与数据随机存取存储器122转属于这些神经处理单元126,而不分享给处理器100中其它的执行单元112,这些神经处理单元126能够持续地在每一个时频周期内从权重随机存取存储器124与数据随机存取存储器122的一或二者取得并完成一列,就一较佳实施例而言,可采用管线方式处理。在一实施例中,数据随机存取存储器122与权重随机存取存储器124中的每一个都可以在每一个时频周期内提供8192个位至神经处理单元126。这8192个位可以视为512个16字节或是1024个8字节来进行处理,详如后述。由神经网络单元121处理的数据组大小并不受限于权重随机存取存储器124与数据随机存取存储器122的大小,而只会受限于系统存储器的大小,这是因为数据与权重可在系统存储器与权重随机存取存储器124以及数据随机存取存储器122间透过MTNN与MFNN指令的使用(例如,透过媒体缓存器118)而移动。在一实施例中,数据随机存取存储器122被赋予双端口,使能在由数据随机存取存储器122读取数据文字或写入数据文字至数据随机存取存储器122的同时,写入数据文字至数据随机存取存储器122。另外,包括高速缓存在内的存储器子系统114的大型存储器阶层结构可提供非常大的数据频宽供系统存储器与神经网络单元121间进行数据传输。此外,就一较佳实施例而言,此存储器子系统114包括硬件数据预攫取器,追踪存储器的存取模式,例如由系统存储器加载的神经数据与权重,并对快取阶层结构执行数据预攫取以利于在传输至权重随机存取存储器124与数据随机存取存储器122的过程中达成高频宽与低延迟的传输。虽然本文的实施例中,由权重存储器提供至各个神经处理单元126的其中一个操作数标示为权重,此用语常见于神经网络,不过需要理解的是,这些操作数也可以是其它与计算有关联的类型的数据,而其计算速度可透过这些装置加以提升。图2为显示图1的神经处理单元126的方块示意图。如图中所示,此神经处理单元126的运作可执行许多功能或运算。尤其是,此神经处理单元126可作为人工神经网络内的神经元或节点进行运作,以执行典型的乘积累加功能或运算。也就是说,一般而言,神经网络单元126(神经元)用以:(1)从各个与其具有连结的神经元接收输入值,此连结通常会但不必然是来自人工神经网络中的前一层;(2)将各个输出值乘上关联于其连结的相对应权重值以产生乘积;(3)将所有乘积加总以产生一总数;(4)对此总数执行启动函数以产生神经元的输出。不过,不同于传统方式需要执行关联于所有连结输入的所有乘法运算并将其乘积加总,本发明的各个神经元在给定的时频周期内可执行关联于其中一个连结输入的权重乘法运算并将其乘积与关联于该时点前的时频周期内所执行的连结输入的乘积的累加值相加(累加)。假定一共有M个连结连接至此神经元,在M个乘积加总后(大概需要M个时频周期的时间),此神经元会对此累加数执行启动函数以产生输出或结果。此方式的优点在于可减少所需的乘法器的数量,并且在神经元内只需要一个较小、较简单且更为快速的加法器电路(例如使用两个输入的加法器),而不需使用能够将所有连结输入的乘积加总或甚至对其中一子集合加总所需的加法器。此方式也有利于在神经网络单元121内使用极大数量(N)的神经元(神经处理单元126),如此,在大约M个时频周期后,神经网络单元121就可产生此大数量(N)神经元的输出。最后,对于大量的不同连结输入,由这些神经元构成的神经网络单元121就能有效地作为人工神经网络层执行。也就是说,若是不同层中M的数量有所增减,产生记忆胞输出所需的时频周期数也会相对应地增减,而资源(例如乘法器与累加器)会被充分利用。相较之下,传统设计对于较小的M值而言,会有某些乘法器与加法器的部分未能被利用。因此,因应神经网络单元的连结输出数,本文所述的实施例兼具弹性与效率的优点,而能提供极高的效能。神经处理单元126包括缓存器205、一个双输入多任务缓存器208、算术逻辑单元(ALU)204、累加器202、与启动函数单元(AFU)212。缓存器205由权重随机存取存储器124接收权重文字206并在后续时频周期提供其输出203。多任务缓存器208在两个输入207,211中选择其一储存于其缓存器并在后续时频周期提供于其输出209。输入207接收来自数据随机存取存储器122的数据文字。另一个输入211则接收相邻神经处理单元126的输出209。图2所示的神经处理单元126于图1所示的N个神经处理单元中标示为神经处理单元J。也就是说,神经处理单元J是这N个神经处理单元126的一代表范例。就一较佳实施例而言,神经处理单元126的J范例的多任务缓存器208的输入211接收神经处理单元126的J-1范例的多任务缓存器208的输出209,而神经处理单元J的多任务缓存器208的输出209提供给神经处理单元126的J+1范例的多任务缓存器208的输入211。如此,N个神经处理单元126的多任务缓存器208即可共同运作,如同N个文字的旋转器或称循环移位器,这部分在后续图3会有更详细的说明。多任务缓存器208利用控制输入213控制这两个输入中哪一个会被多任务缓存器208选择储存于其缓存器并于后续提供于输出209。算术逻辑单元204具有三个输入。其中一个输入由缓存器205接收权重文字203。另一个输入接收多任务缓存器208的输出209。再另一个输入接收累加器202的输出217。此算术逻辑单元204会对其输入执行算术和/或逻辑运算以产生一结果提供于其输出。就一较佳实施例而言,算术逻辑单元204执行的算术和/或逻辑运算由储存于程序存储器129的指令所指定。举例来说,图4中的乘法累加指令指定乘法累加运算,也即,结果215会是累加器202数值217与权重文字203以及多任务缓存器208输出209的数据文字的乘积的加总。不过也可以指定其它运算,这些运算包括但不限于:结果215是多任务缓存器输出209传递的数值;结果215是权重文字203传递的数值;结果215是零值;结果215是累加器202数值217与权重203的加总;结果215是累加器202数值217与多任务缓存器输出209的加总;结果215是累加器202数值217与权重203中的最大值;结果215是累加器202数值217与多任务缓存器输出209中的最大值。算术逻辑单元204提供其输出215至累加器202储存。算术逻辑单元204包括乘法器242对权重文字203与多任务缓存器208输出209的数据文字进行乘法运算以产生一乘积246。在一实施例中,乘法器242将两个16位操作数相乘以产生一个32位的结果。此算术逻辑单元204还包括加法器244在累加器202的输出217加上乘积246以产生一总数,此总数即为储存于累加器202的累加运算的结果215。在一实施例中,加法器244在累加器202的一个41位值217加上乘法器242的一个32位结果以产生一个41位结果。如此,在多个时频周期的期间内利用多任务缓存器208所具有的旋转器特性,神经处理单元126即可达成神经网络所需的神经元的乘积加总运算。此算术逻辑单元204也可包括其它电路组件以执行其它如前所述的算术/逻辑运算。在一实施例中,第二加法器在多任务缓存器208输出209的数据文字减去权重文字203以产生一差值,随后加法器244会在累加器202的输出217加上此差值以产生一结果215,此结果即为累加器202内的累加结果。如此,在多个时频周期的期间内,神经处理单元126就能达成差值加总的运算。就一较佳实施例而言,虽然权重文字203与数据文字209的大小相同(以位计),他们也可具有不同的二进制小数点位置,详如后述。就一较佳实施例而言,乘法器242与加法器244为整数乘法器与加法器,相较于使用浮点运算的算术逻辑单元,此算术逻辑单元204具有低复杂度、小型、快速与低耗能的优点。不过,在本发明的其它实施例中,算术逻辑单元204也可执行浮点运算。虽然图2的算术逻辑单元204内只显示一个乘法器242与加法器244,不过,就一较佳实施例而言,此算术逻辑单元204还包括有其它组件以执行前述其它不同的运算。举例来说,此算术逻辑单元204可包括比较器(未图示)比较累加器202与数据/权重文字,以及多工器(未图示)在比较器指定的两个数值中选择较大者(最大值)储存至累加器202。在另一个范例中,算术逻辑单元204包括选择逻辑(未图示),利用数据/权重文字来跳过乘法器242,使加法器224在累加器202的数值217加上此数据/权重文字以产生一总数储存至累加器202。这些额外的运算会在后续章节如图18至图29A有更详细的说明,而这些运算也有助于如卷积运算与共源运算的执行。启动函数单元212接收累加器202的输出217。启动函数单元212会对累加器202的输出执行启动函数以产生图1的结果133。一般而言,人工神经网络的中介层的神经元内的启动函数可用来标准化乘积累加后的总数,尤其可以采用非线性的方式进行。为了“标准化”累加总数,当前神经元的启动函数会在连接当前神经元的其它神经元预期接收作为输入的数值范围内产生一结果值。(标准化后的结果有时会称为“启动”,在本文中,启动是当前节点的输出,而接收节点会将此输出乘上关联于输出节点与接收节点间连结的权重以产生一乘积,而此乘积会与关联于此接收节点的其它输入连结的乘积累加。)举例来说,在接收/被连结神经元预期接收作为输入的数值介于0与1间的情况下,输出神经元会需要非线性地挤压和/或调整(例如向上移位以将负值转换为正值)超出0与1的范围外的累加总数,使其落于此预期范围内。因此,启动函数单元212对累加器202数值217执行的运算会将结果133带到已知范围内。N个神经执行单元126的结果133都可被同时写回数据随机存取存储器122或权重随机存取存储器124。就一较佳实施例而言,启动函数单元212用以执行多个启动函数,而例如来自控制缓存器127的输入会在这些启动函数中选择其一执行于累加器202的输出217。这些启动函数可包括但不限于阶梯函数、校正函数、S型函数、双曲正切函数与软加函数(也称为平滑校正函数)。软加函数的解析公式为f(x)=ln(1+ex),也就是1与ex的加总的自然对数,其中,“e”是欧拉数(Euler’snumber),x是此函数的输入217。就一较佳实施例而言,启动函数也可包括传递(pass-through)函数,直接传递累加器202数值217或其中一部分,详如后述。在一实施例中,启动函数单元212的电路会在单一个时频周期内执行启动函数。在一实施例中,启动函数单元212包括多个表单,其接收累加值并输出一数值,对某些启动函数,如S型函数、双曲正切函数、软加函数等,此数值会近似于真正的启动函数所提供的数值。就一较佳实施例而言,累加器202的宽度(以位计)大于启动函数功能212的输出133的宽度。举例来说,在一实施例中,此累加器的宽度为41位,以避免在累加至最多512个32位的乘积的情况下(这部分在后续章节如对应于图30处会有更详细的说明)损失精度,而结果133的宽度为16位。在一实施例中,在后续时频周期中,启动函数单元212会传递累加器202输出217的其它未经处理的部分,并且会将这些部分写回数据随机存取存储器122或权重随机存取存储器124,这部分在后续章节对应于图8处会有更详细的说明。如此即可将未经处理的累加器202数值透过MFNN指令载回媒体缓存器118,藉此,在处理器100的其它执行单元112执行的指令就可以执行启动函数单元212无法执行的复杂启动函数,例如常见的软极大(softmax)函数,此函数也被称为标准化指数函数。在一实施例中,处理器100的指令集架构包括执行此指数函数的指令,通常表示为ex或exp(x),此指令可由处理器100的其它执行单元112使用以提升软极大启动函数的执行速度。在一实施例中,神经处理单元126采用管线设计。举例来说,神经处理单元126可包括算术逻辑单元204的缓存器,例如位于乘法器与加法器以及/或是算术逻辑单元204的其它电路间的缓存器,神经处理单元126还可包括一个装载启动函数功能212输出的缓存器。此神经处理单元126的其它实施例会在后续章节进行说明。图3为方块图,显示利用图1的神经网络单元121的N个神经处理单元126的N个多任务缓存器208,对于由图1的数据随机存取存储器122取得的一列数据文字207执行如同N个文字的旋转器(rotator)或称循环移位器(circularshifter)的运作。在图3的实施例中,N是512,因此,神经网络单元121具有512个多任务缓存器208,标示为0至511,分别对应至512个神经处理单元126。每个多任务缓存器208会接收数据随机存取存储器122的D列的其中一列上的相对应数据文字207。也就是说,多任务缓存器0会从数据随机存取存储器122列接收数据文字0,多任务缓存器1会从数据随机存取存储器122列接收数据文字1,多任务缓存器2会从数据随机存取存储器122列接收数据文字2,依此类推,多任务缓存器511会从数据随机存取存储器122列接收数据文字511。此外,多任务缓存器1会接收多任务缓存器0的输出209作为另一输入211,多任务缓存器2会接收多任务缓存器1的输出209作为另一输入211,多任务缓存器3会接收多任务缓存器2的输出209作为另一输入211,依此类推,多任务缓存器511会接收多任务缓存器510的输出209作为另一输入211,而多任务缓存器0会接收多任务缓存器511的输出209作为其它输入211。每个多任务缓存器208都会接收控制输入213以控制其选择数据文字207或是循环输入211。在此运作的模式中,控制输入213会在第一时频周期内,控制每个多任务缓存器208选择数据文字207以储存至缓存器并于后续步骤提供给算术逻辑单元204,而在后续的时频周期内(如前述M-1个时频周期),控制输入213会控制每个多任务缓存器208选择循环输入211以储存至缓存器并于后续步骤提供给算术逻辑单元204。虽然图3(以及后续的图7与图19)所描述的实施例中,多个神经处理单元126可用以将这些多任务缓存器208/705的数值向右旋转,也即由神经处理单元J朝向神经处理单元J+1移动,不过本发明并不限于此,在其它的实施例中(例如对应于图24至图26的实施例),多个神经处理单元126可用以将多任务缓存器208/705的数值向左旋转,也即由神经处理单元J朝向神经处理单元J-1移动。此外,在本发明的其它实施例中,这些神经处理单元126可选择性地将多任务缓存器208/705的数值向左或向右旋转,举例来说,此选择可由神经网络单元指令所指定。图4为表格,显示一个储存于图1的神经网络单元121的程序存储器129并由该神经网络单元121执行的程序。如前所述,此范例程序执行与人工神经网络的一层有关的计算。图4的表格显示有四列与三行。每一列对应于程序存储器129中标示于第一行的地址。第二行指定相对应的指令,而第三行指出关联于此指令的时频周期数。就一较佳实施例而言,前述时频周期数表示在管线执行的实施例中每指令时频周期值的有效的时频周期数,而非指令延迟。如图中所示,因为神经网络单元121具有管线执行的本质,每个指令均有相关联的时频周期,位于地址2的指令是一个例外,此指令实际上自己会重复执行511次,因而需要511个时频周期,详如后述。所有的神经处理单元126会平行处理程序中的每个指令。也就是说,所有的N个神经处理单元126都会在同一个时频周期执行第一列的指令,所有的N个神经处理单元126都会在同一个时频周期执行第二列的指令,依此类推。不过本发明并不限于此,在后续章节的其它实施例中,有些指令则是以部分平行部分序列的方式执行,举例来说,如图11的实施例所述,在多个神经处理单元126共享一个启动函数单元的实施例中,启动函数与位于地址3与4的输出指令即是以此方式执行。图4的范例中假定一层具有512个神经元(神经处理单元126),而每个神经元具有512个来自前一层的512个神经元的连结输入,总共有256K个连结。每个神经元会从每个连结输入接收一个16位数据值,并将此16位数据值乘上一个适当的16位权重值。位于地址0的第一列(也可指定至其它地址)会指定初始化神经处理单元指令。此初始化指令会清除累加器202数值使之为零。在一实施例中,初始化指令也可在累加器202内加载数据随机存取存储器122或权重随机存取存储器124的一列中,由此指令所指定的相对应的文字。此初始化指令也会将配置值加载控制缓存器127,这部分在后续图29A与图29B会有更详细的说明。举例来说,可将数据文字207与权重文字209的宽度加载,供算术逻辑单元204利用以确认电路执行的运算大小,此宽度也会影响储存于累加器202的结果215。在一实施例中,神经处理单元126包括一电路在算术逻辑单元204的输出215储存于累加器202前填满此输出215,而初始化指令会将配置值加载此电路,此配置值会影响前述的填满运算。在一实施例中,也可在算术逻辑单元函数指令(如地址1的乘法累加指令)或输出指令(如地址4的写入起始函数单元输出指令)中如此指定,以将累加器202清除至零值。位于地址1的第二列指定乘法累加指令指示这512个神经处理单元126从数据随机存取存储器122的一列加载相对应的数据文字以及从权重随机存取存储器124的一列加载相对应的权重文字,并且对此数据文字输入207与权重文字输入206执行第一乘法累加运算,即加上初始化累加器202零值。进一步来说,此指令会指示定序器128在控制输入213产生一数值以选择数据文字输入207。在图4的范例中,数据随机存取存储器122的指定列为列17,权重随机存取存储器124的指定列为列0,因此定序器会被指示输出数值17作为数据随机存取存储器地址123,输出数值0作为权重随机存取存储器地址125。因此,来自数据随机存取存储器122的列17的512个数据文字提供作为512个神经处理单元126的相对应数据输入207,而来自权重随机存取存储器124的列0的512个权重文字提供作为512个神经处理单元126的相对应权重输入206。位于地址2的第三列指定乘法累加旋转指令,此指令具有一计数其数值为511,以指示这512个神经处理单元126执行511次乘法累加运算。此指令指示这512个神经处理单元126将511次乘法累加运算的每一次运算中输入算术逻辑单元204的数据文字209,作为从邻近神经处理单元126来的旋转值211。也就是说,此指令会指示定序器128在控制输入213产生一数值以选择旋转值211。此外,此指令会指示这512个神经处理单元126将511次乘法累加运算的每一次运算中的相对应权重值加载权重随机存取存储器124的“下一”列。也就是说,此指令会指示定序器128将权重随机存取存储器地址125从前一个时频周期的数值增加一,在此范例中,指令的第一时频周期是列1,下一个时频周期就是列2,在下一个时频周期就是列3,依此类推,第511个时频周期就是列511。在这511个乘法累加运算中的每一个运算中,旋转输入211与权重文字输入206的乘积会被加入累加器202的前一个数值。这512个神经处理单元126会在511个时频周期内执行这511个乘法累加运算,每个神经处理单元126会对于来自数据随机存取存储器122的列17的不同数据文字-也就是,相邻的神经处理单元126在前一个时频周期执行运算的数据文字,以及关联于数据文字的不同权重文字执行一个乘法累加运算在概念上即为神经元的不同连结输入。此范例假设各个神经处理单元126(神经元)具有512个连结输入,因此牵涉到512个数据文字与512个权重文字的处理。在列2的乘法累加旋转指令重复最后一次迭代后,累加器202内就会存放有这512个连结输入的乘积的加总。在一实施例中,神经处理单元126的指令集包括“执行”指令以指示算术逻辑单元204执行由初始化神经处理单元指令指定的算术逻辑单元运算,例如图29A的算术逻辑单元函数2926所指定者,而非对于各个不同类型的算术逻辑运算(例如前述的乘法累加、累加器与权重的最大值等)具有独立的指令。位于地址3的第四列指定启动函数指令。此启动函数指令指示启动函数单元212对于累加器202数值执行所指定的启动函数以产生结果133。启动函数的实施例在后续章节会有更详细的说明。位于地址4的第五列指定写入启动函数单元输出指令,以指示这512个神经处理单元216将其启动函数单元212输出作为结果133写回至数据随机存取存储器122的一列,在此范例中即列16。也就是说,此指令会指示定序器128输出数值16作为数据随机存取存储器地址123以及写入命令(相对应于由地址1的乘法累加指令所指定的读取命令)。就一较佳实施例而言,因为管线执行的特性,写入启动函数单元输出指令可与其它指令同时执行,因此写入启动函数单元输出指令实际上可以在单一个时频周期内执行。就一较佳实施例而言,每个神经处理单元126作为一管线,此管线具有各种不同功能组件,例如多任务缓存器208(以及图7的多任务缓存器705)、算术逻辑单元204、累加器202、启动函数单元212、多工器802(请参照图8)、列缓冲器1104与启动函数单元1112(请参照图11)等,其中某些组件本身即可管线执行。除了数据文字207与权重文字206外,此管线还会从程序存储器129接收指令。这些指令会沿着管线流动并控制多种功能单元。在另一实施例中,此程序内不包含启动函数指令,而是由初始化神经处理单元指令指定执行于累加器202数值217的启动函数,指出被指定的启动函数的数值储存于配置缓存器,供管线的启动函数单元212部分在产生最后的累加器202数值217后,也就是在地址2的乘法累加旋转指令重复最后一次执行后,加以利用。就一较佳实施例而言,为了节省耗能,管线的启动函数单元212部分在写入启动函数单元输出指令到达前会处于不启动状态,在指令到达时,启动函数单元212会启动并对初始化指令指定的累加器202输出217执行启动函数。图5为显示神经网络单元121执行图4的程序的时序图。此时序图的每一列对应至第一行指出的连续时频周期。其它行则是分别对应至这512个神经处理单元126中不同的神经处理单元126并指出其运算。图中仅显示神经处理单元0,1,511的运算以简化说明。在时频周期0,这512个神经处理单元126中的每一个神经处理单元126都会执行图4的初始化指令,在图5中即是将零值指派给累加器202。在时频周期1,这512个神经处理单元126中的每一个神经处理单元126都会执行图4中地址1的乘法累加指令。如图中所示,神经处理单元0会将累加器202数值(即零)加上数据随机存取存储器122的列17的文字0与权重随机存取存储器124的列0的文字0的乘积;神经处理单元1会将累加器202数值(即零)加上数据随机存取存储器122的列17的文字1与权重随机存取存储器124的列0的文字1的乘积;依此类推,神经处理单元511会将累加器202数值(即零)加上数据随机存取存储器122的列17的文字511与权重随机存取存储器124的列0的文字511的乘积。在时频周期2,这512个神经处理单元126中的每一个神经处理单元126都会进行图4中地址2的乘法累加旋转指令的第一次迭代。如图中所示,神经处理单元0会将累加器202数值加上由神经处理单元511的多任务缓存器208输出209接收的旋转数据文字211(即由数据随机存取存储器122接收的数据文字511)与权重随机存取存储器124的列1的文字0的乘积;神经处理单元1会将累加器202数值加上由神经处理单元0的多任务缓存器208输出209接收的旋转数据文字211(即由数据随机存取存储器122接收的数据文字0)与权重随机存取存储器124的列1的文字1的乘积;依此类推,神经处理单元511会将累加器202数值加上由神经处理单元510的多任务缓存器208输出209接收的旋转数据文字211(即由数据随机存取存储器122接收的数据文字510)与权重随机存取存储器124的列1的文字511的乘积。在时频周期3,这512个神经处理单元126中的每一个神经处理单元126都会进行图4中地址2的乘法累加旋转指令的第二次迭代。如图中所示,神经处理单元0会将累加器202数值加上由神经处理单元511的多任务缓存器208输出209接收的旋转数据文字211(即由数据随机存取存储器122接收的数据文字510)与权重随机存取存储器124的列2的文字0的乘积;神经处理单元1会将累加器202数值加上由神经处理单元0的多任务缓存器208输出209接收的旋转数据文字211(即由数据随机存取存储器122接收的数据文字511)与权重随机存取存储器124的列2的文字1的乘积;依此类推,神经处理单元511会将累加器202数值加上由神经处理单元510的多任务缓存器208输出209接收的旋转数据文字211(即由数据随机存取存储器122接收的数据文字509)与权重随机存取存储器124的列2的文字511的乘积。如同图5的省略标号显示,接下来509个时频周期会依此持续进行,直到时频周期512。在时频周期512,这512个神经处理单元126中的每一个神经处理单元126都会进行图4中地址2的乘法累加旋转指令的第511次迭代。如图中所示,神经处理单元0会将累加器202数值加上由神经处理单元511的多任务缓存器208输出209接收的旋转数据文字211(即由数据随机存取存储器122接收的数据文字1)与权重随机存取存储器124的列511的文字0的乘积;神经处理单元1会将累加器202数值加上由神经处理单元0的多任务缓存器208输出209接收的旋转数据文字211(即由数据随机存取存储器122接收的数据文字2)与权重随机存取存储器124的列511的文字1的乘积;依此类推,神经处理单元511会将累加器202数值加上由神经处理单元510的多任务缓存器208输出209接收的旋转数据文字211(即由数据随机存取存储器122接收的数据文字0)与权重随机存取存储器124的列511的文字511的乘积。在一实施例中需要多个时频周期从数据随机存取存储器122与权重随机存取存储器124读取数据文字与权重文字以执行图4中地址1的乘法累加指令;不过,数据随机存取存储器122、权重随机存取存储器124与神经处理单元126为采用管线配置,如此在第一个乘法累加运算开始后(如图5的时频周期1所示),后续的乘法累加运算(如图5的时频周期2-512所示)就会开始在接续的时频周期内执行。就一较佳实施例而言,因应利用架构指令,如MTNN或MFNN指令(在后续图14与图15会进行说明),对于数据随机存取存储器122和/或权重随机存取存储器124的存取动作,或是架构指令转译出的微指令,这些神经处理单元126会短暂地搁置。在时频周期513,这512个神经处理单元126中的每一个神经处理单元126的启动函数单元212都会执行图4中地址3的启动函数。最后,在时频周期514,这512个神经处理单元126中的每一个神经处理单元126会透过将其结果133写回数据随机存取存储器122的列16中的相对应文字以执行图4中地址4的写入启动函数单元输出指令,也就是说,神经处理单元0的结果133会被写入数据随机存取存储器122的文字0,神经处理单元1的结果133会被写入数据随机存取存储器122的文字1,依此类推,神经处理单元511的结果133会被写入数据随机存取存储器122的文字511。对应于前述图5的运算的相对应方块图显示于图6A。图6A为显示图1的神经网络单元121执行图4的程序的方块示意图。此神经网络单元121包括512个神经处理单元126、接收地址输入123的数据随机存取存储器122,与接收地址输入125的权重随机存取存储器124。在时频周期0的时候,这512个神经处理单元126会执行初始化指令。此运作在图中并未显示。如图中所示,在时频周期1的时候,列17的512个16位的数据文字会从数据随机存取存储器122读出并提供至这512个神经处理单元126。在时频周期1至512的过程中,列0至列511的512个16位的权重文字会分别从权重随机存取存储器122读出并提供至这512个神经处理单元126。在时频周期1的时候,这512个神经处理单元126会对加载的数据文字与权重文字执行其相对应的乘法累加运算。此运作在图中并未显示。在时频周期2至512的过程中,512个神经处理单元126的多任务缓存器208会如同一个具有512个16位文字的旋转器进行运作,而将先前由数据随机存取存储器122的列17加载的数据文字转动至邻近的神经处理单元126,而这些神经处理单元126会对转动后的相对应数据文字以及由权重随机存取存储器124加载的相对应权重文字执行乘法累加运算。在时频周期513的时候,这512个启动函数单元212会执行启动指令。此运作在图中并未显示。在时频周期514的时候,这512个神经处理单元126会将其相对应的512个16位结果133写回数据随机存取存储器122的列16。如图中所示,产生结果文字(神经元输出)并写回数据随机存取存储器122或权重随机存取存储器124需要的时频周期数大致为神经网络的当前层接收到的数据输入(连结)数量的平方根。举例来说,若是当前层具有512个神经元,而各个神经元具有512个来自前一层的连结,这些连结的总数就是256K,而产生当前层结果需要的时频周期数就会略大于512。因此,神经网络单元121在神经网络计算方面可提供极高的效能。图6B为流程图,显示图1的处理器100执行架构程序,以利用神经网络单元121执行关联于人工神经网络的隐藏层的神经元的典型乘法累加启动函数运算的运作,如同由图4的程序执行的运作。图6B的范例假定有四个隐藏层(标示于初始化步骤602的变量NUM_LAYERS),各个隐藏层具有512个神经元,各个神经元连结前一层全部的512个神经元(透过图4的程序)。不过,需要理解的是,这些层与神经元的数量的选择为说明本发明,神经网络单元121当可将类似的计算应用于不同数量隐藏层的实施例,每一层中具有不同数量神经元的实施例,或是神经元未被全部连结的实施例。在一实施例中,对于这一层中不存在的神经元或是不存在的神经元连结的权重值会被设定为零。就一较佳实施例而言,架构程序会将第一组权重写入权重随机存取存储器124并启动神经网络单元121,当神经网络单元121正在执行关联于第一层的计算时,此架构程序会将第二组权重写入权重随机存取存储器124,如此,一旦神经网络单元121完成第一隐藏层的计算,神经网络单元121就可以开始第二层的计算。如此,架构程序会往返于权重随机存取存储器124的两个区域,以确保神经网络单元121可以被充分利用。此流程始于步骤602。在步骤602,如图6A的相关章节所述,执行架构程序的处理器100将输入值写入数据随机存取存储器122的当前神经元隐藏层,也就是写入数据随机存取存储器122的列17。这些值也可能已经位于数据随机存取存储器122的列17作为神经网络单元121针对前一层的运算结果133(例如卷积、共源或输入层)。其次,架构程序会将变量N初始化为数值1。变量N代表隐藏层中即将由神经网络单元121处理的当前层。此外,架构程序会将变量NUM_LAYERS初始化为数值4,因为在本范例中有四个隐藏层。接下来流程前进至步骤604。在步骤604,处理器100将层1的权重文字写入权重随机存取存储器124,例如图6A所示的列0至511。接下来流程前进至步骤606。在步骤606中,处理器100利用指定函数1432以写入程序存储器129的MTNN指令1400,将乘法累加启动函数程序(如图4所示)写入神经网络单元121程序存储器129。处理器100随后利用MTNN指令1400以启动神经网络单元程序,此指令指定函数1432开始执行此程序。接下来流程前进至步骤608。在决策步骤608中,架构程序确认变量N的数值是否小于NUM_LAYERS。若是,流程就会前进至步骤612;否则就前进至步骤614。在步骤612中,处理器100将层N+1的权重文字写入权重随机存取存储器124,例如列512至1023。因此,架构程序就可以在神经网络单元121执行当前层的隐藏层计算时将下一层的权重文字写入权重随机存取存储器124,藉此,在完成当前层的计算,也就是写入数据随机存取存储器122后,神经网络单元121就可以立刻开始执行下一层的隐藏层计算。接下来前进至步骤614。在步骤614中,处理器100确认正在执行的神经网络单元程序(就层1而言,在步骤606开始执行,就层2至4而言,则是在步骤618开始执行)是否已经完成执行。就一较佳实施例而言,处理器100会透过执行MFNN指令1500读取神经网络单元121状态缓存器127以确认是否已经完成执行。在另一实施例中,神经网络单元121会产生一中断,表示已经完成乘法累加启动函数层程序。接下来流程前进至决策步骤616。在决策步骤616中,架构程序确认变量N的数值是否小于NUM_LAYERS。若是,流程会前进至步骤618;否则就前进至步骤622。在步骤618中,处理器100会更新乘法累加启动函数程序,使能执行层N+1的隐藏层计算。进一步来说,处理器100会将图4中地址1的乘法累加指令的数据随机存取存储器122列值,更新为数据随机存取存储器122中前一层计算结果写入的列(例如更新为列16)并更新输出列(例如更新为列15)。处理器100随后开始更新神经网络单元程序。在另一实施例中,图4的程序指定地址4的输出指令的同一列作为地址1的乘法累加指令所指定的列(也就是由数据随机存取存储器122读取的列)。在此实施例中,输入数据文字的当前列会被覆写(因为此列数据文字已经被读入多任务缓存器208并透过N文字旋转器在这些神经处理单元126间进行旋转,只要这列数据文字不需被用于其它目的,这样的处理方式就是可以被允许的)。在此情况下,在步骤618中就不需要更新神经网络单元程序,而只需要将其重新启动。接下来流程前进至步骤622。在步骤622中,处理器100从数据随机存取存储器122读取层N的神经网络单元程序的结果。不过,若是这些结果只会被用于下一层,架构程序就不须从数据随机存取存储器122读取这些结果,而可将其保留在数据随机存取存储器122供下一个隐藏层计算之用。接下来流程前进至步骤624。在决策步骤624中,架构程序确认变量N的数值是否小于NUM_LAYERS。若是,流程前进至步骤626;否则就终止此流程。在步骤626中,架构程序会将N的数值增加一。接下来流程会回到决策步骤608。如同图6B的范例所示,大致上每512个时频周期,这些神经处理单元126就会对数据随机存取存储器122执行一次读取与一次写入(透过图4的神经网络单元程序的运算的效果)。此外,这些神经处理单元126大致上每个时频周期都会对权重随机存取存储器124进行读取以读取一列权重文字。因此,权重随机存取存储器124全部的频宽都会因为神经网络单元121以混合方式执行隐藏层运算而被消耗。此外,假定在一实施例中具有一个写入与读取缓冲器,例如图17的缓冲器1704,神经处理单元126进行读取的同时,处理器100对权重随机存取存储器124进行写入,如此缓冲器1704大致上每16个时频周期会对权重随机存取存储器124执行一次写入以写入权重文字。因此,在权重随机存取存储器124为单一端口的实施例中(如同图17的相对应章节所述),大致上每16个时频周期这些神经处理单元126就会暂时搁置对权重随机存取存储器124进行的读取,而使缓冲器1704能够对权重随机存取存储器124进行写入。不过,在双端口权重随机存取存储器124的实施例中,这些神经处理单元126就不需被搁置。图7为显示图1的神经处理单元126的另一实施例的方块示意图。图7的神经处理单元126类似于图2的神经处理单元126。不过,图7的神经处理单元126另外具有一个双输入多任务缓存器705。此多任务缓存器705选择其中一个输入206或711储存于其缓存器,并于后续时频周期提供于其输出203。输入206从权重随机存取存储器124接收权重文字。另一个输入711则是接收相邻神经处理单元126的第二多任务缓存器705的输出203。就一较佳实施例而言,神经处理单元J的输入711会接收的排列在J-1的神经处理单元126的多任务缓存器705输出203,而神经处理单元J的输出203则是提供至排列在J+1的神经处理单元126的多任务缓存器705的输入711。如此,N个神经处理单元126的多任务缓存器705就可共同运作,如同一N个文字的旋转器,其运作类似于前述图3所示的方式,不过是用于权重文字而非数据文字。多任务缓存器705利用控制输入213控制这两个输入中哪一个会被多任务缓存器705选择储存于其缓存器并于后续提供于输出203。利用多任务缓存器208和/或多任务缓存器705(以及如图18与图23所示的其它实施例中的多任务缓存器),实际上构成一个大型的旋转器将来自数据随机存取存储器122和/或权重随机存取存储器124的一列的数据/权重进行旋转,神经网络单元121就不需要在数据随机存取存储器122和/或权重随机存取存储器124间使用一个非常大的多工器以提供需要的数据/权重文字至适当的神经网络单元。除启动函数结果外再写回累加器数值对于某些应用而言,让处理器100接收回(例如透过图15的MFNN指令接收至媒体缓存器118)未经处理的累加器202数值217,以提供给执行于其它执行单元112的指令执行计算,确实有其用处。举例来说,在一实施例中,启动函数单元212不针对软极大启动函数的执行进行配置以降低启动函数单元212的复杂度。所以,神经网络单元121会输出未经处理的累加器202数值217或其中一个子集合至数据随机存取存储器122或权重随机存取存储器124,而架构程序在后续步骤可以由数据随机存取存储器122或权重随机存取存储器124读取并对此未经处理的数值进行计算。不过,对于未经处理的累加器202数值217的应用并不限于执行软极大运算,其它应用也为本发明所涵盖。图8为显示图1的神经处理单元126的又一实施例的方块示意图。图8的神经处理单元126类似于图2的神经处理单元126。不过,图8的神经处理单元126在启动函数单元212内包括多工器802,而此启动函数单元212具有控制输入803。累加器202的宽度(以位计)大于数据文字的宽度。多工器802具有多个输入以接收累加器202输出217的数据文字宽度部分。在一实施例中,累加器202的宽度为41个位,而神经处理单元216可用以输出一个16位的结果文字133;如此,举例来说,多工器802(或图30的多工器3032和/或多工器3037)具有三个输入分别接收累加器202输出217的位[15:0]、位[31:16]与位[47:32]。就一较佳实施例而言,非由累加器202提供的输出位(例如位[47:41])会被强制设定为零值位。定序器128会在控制输入803产生一数值,控制多工器802在累加器202的文字(如16位)中选择其一,以因应写入累加器指令,例如后续图9中位于地址3至5的写入累加器指令。就一较佳实施例而言,多工器802还具有一个或多个输入以接收启动函数电路(如图30中的组件3022,3024,3026,3018,3014与3016)的输出,而这些启动函数电路产生的输出的宽度等于一个数据文字。定序器128会在控制输入803产生数值以控制多工器802在这些启动函数电路输出中选择其,而非在累加器202的文字中选择其,以因应如图4中地址4的启动函数单元输出指令。图9为表格,显示一个储存于图1的神经网络单元121的程序存储器129并由该神经网络单元121执行的程序。图9的范例程序类似于图4的程序。尤其是,二者在地址0至2的指令完全相同。不过,图4中地址3与4的指令在图9中则是由写入累加器指令取代,此指令会指示512个神经处理单元126将其累加器202输出217作为结果133写回数据随机存取存储器122的三列,在此范例中即列16至18。也就是说,此写入累加器指令会指示定序器128在第时频周期输出数值为16的数据随机存取存储器地址123以及写入命令,在第二时频周期输出数值为17的数据随机存取存储器地址123以及写入命令,在第三时频周期则是输出数值为18的数据随机存取存储器地址123与写入命令。就较佳实施例而言,写入累加器指令的执行时间可以与其它指令重迭,如此,写入累加器指令就实际上就可以在这三个时频周期内执行,其中每个时频周期会写入数据随机存取存储器122的列。在实施例中,使用者指定启动函数2934与控制缓存器127的输出命令2956栏的数值(图29A),以将累加器202的所需部份写入数据随机存取存储器122或权重随机存取存储器124。另外,写入累加器指令可以选择性地写回累加器202的子集,而非写回累加器202的全部内容。在实施例中,可写回标准型的累加器202。这部分在后续对应于图29至图31的章节会有更详细的说明。图10为显示神经网络单元121执行图9的程序的时序图。图10的时序图类似于图5的时序图,其中时频周期0至512均为相同。不过,在时频周期513-515,这512个神经处理单元126中每个神经处理单元126的启动函数单元212会执行图9中地址3至5的写入累加器指令的其中之一。尤其是,在时频周期513,512个神经处理单元126中每一个神经处理单元126会将累加器202输出217的位[15:0]作为其结果133写回数据随机存取存储器122的列16中的相对应文字;在时频周期514,512个神经处理单元126中每一个神经处理单元126会将累加器202输出217的位[31:16]作为其结果133写回数据随机存取存储器122的列17中的相对应文字;而在时频周期515,512个神经处理单元126中每一个神经处理单元126会将累加器202输出217的位[40:32]作为其结果133写回数据随机存取存储器122的列18中的相对应文字。就一较佳实施例而言,位[47:41]会被强制设定为零值。共享启动函数单元图11为显示图1的神经网络单元121的一实施例的方块示意图。在图11的实施例中,一个神经元分成两部分,即启动函数单元部分与算术逻辑单元部分(此部分还包含移位缓存器部分),而各个启动函数单元部分由多个算术逻辑单元部分共享。在图11中,算术逻辑单元部分指神经处理单元126,而共享的启动函数单元部分则是指启动函数单元1112。相对于如图2的实施例,各个神经元则是包含自己的启动函数单元212。依此,在图11实施例的一范例中,神经处理单元126(算术逻辑单元部分)可包括图2的累加器202、算术逻辑单元204、多任务缓存器208与缓存器205,但不包括启动函数单元212。在图11的实施例中,神经网络单元121包括512个神经处理单元126,不过,本发明并不限于此。在图11的范例中,这512个神经处理单元126被分成64个群组,在图11中标示为群组0至63,而每个群组具有八个神经处理单元126。神经网络单元121还包括列缓冲器1104与多个共享的启动函数单元1112,这些启动函数单元1112耦接于神经处理单元126与列缓冲器1104间。列缓冲器1104的宽度(以位计)与数据随机存取存储器122或权重随机存取存储器124的一列相同,例如512个文字。每一个神经处理单元126群组具有一个启动函数单元1112,也即,每个启动函数单元1112对应于神经处理单元126群组;如此,在图11的实施例中就存在64个启动函数单元1112对应至64个神经处理单元126群组。同一个群组的八个神经处理单元126共享对应于此群组的启动函数单元1112。本发明也可应用于具有不同数量的启动函数单元以及每一个群组中具有不同数量的神经处理单元的实施例。举例来说,本发明也可应用于每个群组中具有两个、四个或十六个神经处理单元126共享同一个启动函数单元1112的实施例。共享启动函数单元1112有助于缩减神经网络单元121的尺寸。尺寸缩减会牺牲效能。也就是说,依据共享率的不同,会需要使用额外的时频周期才能产生整个神经处理单元126阵列的结果133,举例来说,如以下图12所示,在8∶1的共享率的情况下就需要七个额外的时频周期。不过,一般而言,相较于产生累加总数所需的时频周期数(举例来说,对于每个神经元具有512个连结的一层,就需要512个时频周期),前述额外增加的时频周期数(例如7)相当少。因此,共享启动函数单元对效能的影响非常小(例如,增加大约百分之一的计算时间),对于所能缩减神经网络单元121的尺寸而言会是一个合算的成本。在一实施例中,每一个神经处理单元126包括启动函数单元212用以执行相对简单的启动函数,这些简单的启动函数单元212具有较小的尺寸而能被包含在每个神经处理单元126内;反之,共享的复杂启动函数单元1112则是执行相对复杂的启动函数,其尺寸会明显大于简单的启动函数单元212。在此实施例中,只有在指定复杂启动函数而需要由共享复杂启动函数单元1112执行的情况下,需要额外的时频周期,在指定的启动函数可以由简单启动函数单元212执行的情况下,就不需要此额外的时频周期。图12与图13为显示图11的神经网络单元121执行图4的程序的时序图。图12的时序图类似于图5的时序图,二者的时频周期0至512均相同。不过,在时频周期513的运算并不相同,因为图11的神经处理单元126会共享启动函数单元1112;也即,同一个群组的神经处理单元126会共享关联于此群组的启动函数单元1112,而图11即显示此共享架构。图13的时序图的每一列对应至标示于第一行的连续时频周期。其它行则是分别对应至这64个启动函数单元1112中不同的启动函数单元1112并指出其运算。图中仅显示神经处理单元0,1,63的运算以简化说明。图13的时频周期对应至图12的时频周期,但以不同方式显示神经处理单元126共享启动函数单元1112的运算。如图13所示,在时频周期0至512,这64个启动函数单元1112都是处于不启动状态,而神经处理单元126执行初始化神经处理单元指令、乘法累加指令与乘法累加旋转指令。如图12与图13所示,在时频周期513,启动函数单元0(关联于群组0的启动函数单元1112)开始对神经处理单元0的累加器202数值217执行所指定的启动函数,神经处理单元0即群组0中第一个神经处理单元216,而启动函数单元1112的输出将会被储存于列缓存器1104的文字0。同样在时频周期513,每个启动函数单元1112都会开始对相对应神经处理单元216群组中第一个神经处理单元126的累加器202数值217执行所指定的启动函数。因此,如图13所示,在时频周期513,启动函数单元0开始对神经处理单元0的累加器202执行所指定的启动函数以产生将会储存于列缓存器1104的文字0的结果;启动函数单元1开始对神经处理单元8的累加器202执行所指定的启动函数以产生将会储存于列缓存器1104的文字8的结果;依此类推,启动函数单元63开始对神经处理单元504的累加器202执行所指定的启动函数以产生将会储存于列缓存器1104的文字504的结果。在时频周期514,启动函数单元0(关联于群组0的启动函数单元1112)开始对神经处理单元1的累加器202数值217执行所指定的启动函数,神经处理单元1即群组0中第二个神经处理单元216,而启动函数单元1112的输出将会被储存于列缓存器1104的文字1。同样在时频周期514,每个启动函数单元1112都会开始对相对应神经处理单元216群组中第二个神经处理单元126的累加器202数值217执行所指定的启动函数。因此,如图13所示,在时频周期514,启动函数单元0开始对神经处理单元1的累加器202执行所指定的启动函数以产生将会储存于列缓存器1104的文字1的结果;启动函数单元1开始对神经处理单元9的累加器202执行所指定的启动函数以产生将会储存于列缓存器1104的文字9的结果;依此类推,启动函数单元63开始对神经处理单元505的累加器202执行所指定的启动函数以产生将会储存于列缓存器1104的文字505的结果。这样的处理会持续到时频周期520,启动函数单元0(关联于群组0的启动函数单元1112)开始对神经处理单元7的累加器202数值217执行所指定的启动函数,神经处理单元7即群组0中第八个(最后一个)神经处理单元216,而启动函数单元1112的输出将会被储存于列缓存器1104的文字7。同样在时频周期520,每个启动函数单元1112都会开始对相对应神经处理单元216群组中第八个神经处理单元126的累加器202数值217执行所指定的启动函数。因此,如图13所示,在时频周期520,启动函数单元0开始对神经处理单元7的累加器202执行所指定的启动函数以产生将会储存于列缓存器1104的文字7的结果;启动函数单元1开始对神经处理单元15的累加器202执行所指定的启动函数以产生将会储存于列缓存器1104的文字15的结果;依此类推,启动函数单元63开始对神经处理单元511的累加器202执行所指定的启动函数以产生将会储存于列缓存器1104的文字511的结果。在时频周期521,一旦这512个神经处理单元126的全部512个结果都已经产生并写入列缓存器1104,列缓存器1104就会开始将其内容写入数据随机存取存储器122或是权重随机存取存储器124。如此,每一个神经处理单元126群组的启动函数单元1112都执行图4中地址3的启动函数指令的一部分。如图11所示在算术逻辑单元204群组中共享启动函数单元1112的实施例,特别有助于搭配整数算术逻辑单元204的使用。这部分在后续章节如对应于图29A至图33处会有相关说明。MTNN与MFNN架构指令图14为方块示意图,显示移动至神经网络(MTNN)架构指令1400以及其对应于图1的神经网络单元121的部分的运作。此MTNN指令1400包括执行码字段1402、src1字段1404、src2字段、gpr字段1408与立即字段1412。此MTNN指令为架构指令,也即此指令包含在处理器100的指令集架构内。就一较佳实施例而言,此指令集架构会利用执行码字段1402的默认值,来区分MTNN指令1400与指令集架构内的其它指令。此MTNN指令1400的执行码1402可包括常见于x86架构等的前置码(prefix),也可以不包括。立即字段1412提供一数值以指定函数1432至神经网络单元121的控制逻辑1434。就一较佳实施例而言,此函数1432作为图1的微指令105的立即操作数。这些可以由神经网络单元121执行的函数1432包括写入数据随机存取存储器122、写入权重随机存取存储器124、写入程序存储器129、写入控制缓存器127、开始执行程序存储器129内的程序、暂停执行程序存储器129内的程序、完成执行程序存储器129内的程序后的通知请求(例如中断)、以及重设神经网络单元121,但不限于此。就一较佳实施例而言,此神经网络单元指令组会包括一个指令,此指令的结果指出神经网络单元程序已完成。另外,此神经网络单元指令集包括一个明确产生中断指令。就一较佳实施例而言,对神经网络单元121进行重设的运作包括将神经网络单元121中,除了数据随机存取存储器122、权重随机存取存储器124、程序存储器129的数据会维持完整不动外的其它部分,有效地强制回复至重设状态(例如,清空内部状态机器并将其设定为闲置状态)。此外,内部缓存器,如累加器202,并不会受到重设函数的影响,而必须被明示地清空,例如使用图4中地址0的初始化神经处理单元指令。在一实施例中,函数1432可包括直接执行函数,其第一来源缓存器包含微运算(举例来说,可参照图34的微运算3418)。此直接执行函数指示神经网络单元121直接执行所指定的微运算。如此,架构程序就可以直接控制神经网络单元121执行运算,而非将指令写入程序存储器129并于后续指示神经网络单元121执行此位于程序存储器129内的指令或是透过MTNN指令1400(或图15的MFNN指令1500)的执行。图14显示此写入数据随机存取存储器122的函数的一范例。此gpr字段指定通用缓存器档案116内的通用缓存器。在一实施例中,每个通用缓存器均为64位。此通用缓存器档案116提供所选定的通用缓存器的数值至神经网络单元121,如图中所示,而神经网络单元121将此数值作为地址1422使用。此地址1422会选择函数1432中指定的存储器的一列。就数据随机存取存储器122或权重随机存取存储器124而言,此地址1422会额外选择一数据块,其大小是此选定列中媒体缓存器的位置的两倍(如512个位)。就一较佳实施例而言,此位置位于一个512位边界。在一实施例中,多工器会选择地址1422(或是在以下描述的MFNN指令1400的情况下的地址1422)或是来自定序器128的地址123/125/131提供至数据随机存取存储器124/权重随机存取存储器124/程序存储器129。在一实施例中,数据随机存取存储器122具有双端口,使神经处理单元126能够利用媒体缓存器118对此数据随机存取存储器122的读取/写入,同时读取/写入此数据随机存取存储器122。在一实施例中,为了类似的目的,权重随机存取存储器124也具有双端口。图中的src1字段1404与src2字段1406均指定媒体缓存器档案118的一媒体缓存器。在一实施例中,每个媒体缓存器118均为256位。媒体缓存器档案118会将来自所选定的媒体缓存器的相连数据(例如512个位)提供至数据随机存取存储器122(或是权重随机存取存储器124或是程序存储器129)以写入地址1422指定的选定列1428以及在选定列1428中由地址1422指定的位置,如图中所示。透过一系列MTNN指令1400(以及以下所述的MFNN指令1500)的执行,执行于处理器100的架构程序即可填满数据随机存取存储器122列与权重随机存取存储器124列并将程序写入程序存储器129,例如本文所述的程序(如图4与图9所示的程序)可使神经网络单元121对数据与权重以非常快的速度进行运算,以完成此人工神经网络。在一实施例中,此架构程序直接控制神经网络单元121而非将程序写入程序存储器129。在一实施例中,MTNN指令1400指定一起始来源缓存器以及来源缓存器的数量,即Q,而非指定两个来源缓存器(如字段1404与1406所指定者)。这种形式的MTNN指令1400会指示处理器100将指定为起始来源缓存器的媒体缓存器118以及接下来Q-1个接续的媒体缓存器118写入神经网络单元121,也就是写入所指定的数据随机存取存储器122或权重随机存取存储器124。就一较佳实施例而言,指令转译器104会将MTNN指令1400转译为写入所有Q个所指定的媒体缓存器118所需数量的微指令。举例来说,在一实施例中,当MTNN指令1400将缓存器MR4指定为起始来源缓存器并且Q为8,指令转译器104就会将MTNN指令1400转译为四个微指令,其中第一个微指令写入缓存器MR4与MR5,第二个微指令写入缓存器MR6与MR7,第三个微指令写入缓存器MR8与MR9,而第四个微指令写入缓存器MR10与MR11。在另一个实施例中,由媒体缓存器118至神经网络单元121的数据路径是1024位而非512位,在此情况下,指令转译器104会将MTNN指令1400转译为两个微指令,其中第一个微指令写入缓存器MR4至MR7,第二个微指令则是写入缓存器MR8至MR11。本发明也可应用于MFNN指令1500指定一起始目的缓存器以及目的缓存器的数量的实施例,而使每一个MFNN指令1500可以从数据随机存取存储器122或权重随机存取存储器124的一列读取大于单一媒体缓存器118的数据块。图15为方块示意图,显示移动至神经网络(MTNN)架构指令1500以及其对应于图1的神经网络单元121的部分的运作。此MFNN指令1500包括执行码字段1502、dst字段1504、gpr字段1508以及立即字段1512。MFNN指令为架构指令,也即此指令包含于处理器100的指令集架构内。就一较佳实施例而言,此指令集架构会利用执行码字段1502的默认值,来区分MFNN指令1500与指令集架构内的其它指令。此MFNN指令1500的执行码1502可包括常见于x86架构等的前置码(prefix),也可以不包括。立即字段1512提供一数值以指定函数1532至神经网络单元121的控制逻辑1434。就一较佳实施例而言,此函数1532作为图1的微指令105的立即操作数。这些神经网络单元121可以执行的函数1532包括读取数据随机存取存储器122、读取权重随机存取存储器124、读取程序存储器129、以及读取状态缓存器127,但不限于此。图15的范例显示读取数据随机存取存储器122的函数1532。此gpr字段1508指定通用缓存器档案116内的通用缓存器。此通用缓存器档案116提供所选定的通用缓存器的数值至神经网络单元121,如图中所示,而神经网络单元121将此数值作为地址1522并以类似于图14的地址1422的方式进行运算,藉以选择函数1532中指定的存储器的一列。就数据随机存取存储器122或权重随机存取存储器124而言,此地址1522会额外选择一数据块,其大小即为此选定列中媒体缓存器(如256个位)的位置。就一较佳实施例而言,此位置位于一个256位边界。此dst字段1504于一媒体缓存器档案118内指定一媒体缓存器。如图中所示,媒体缓存器档案118将来自数据随机存取存储器122(或权重随机存取存储器124或程序存储器129)的数据(如256位)接收至选定的媒体缓存器,此数据读取自数据接收中地址1522指定的选定列1528以及选定列1528中地址1522指定的位置。神经网络单元内部随机存取存储器的端口配置图16为显示图1的数据随机存取存储器122的一实施例的方块示意图。此数据随机存取存储器122包括存储器阵列1606、读取端口1602与写入端口1604。存储器阵列1606装载数据文字,就一较佳实施例而言,这些数据排列成如前所述D列的N个文字的阵列。在一实施例中,此存储器阵列1606包括一个由64个水平排列的静态随机存取记忆胞构成的阵列,其中每个记忆胞具有128位的宽度以及64位的高度,如此即可提供一个64KB的数据随机存取存储器122,其宽度为8192位并且具有64列,而此数据随机存取存储器122所使用的晶粒面积大致为0.2平方毫米。不过,本发明并不限于此。就一较佳实施例而言,写入端口1602以多任务方式耦接至神经处理单元126以及媒体缓存器118。进一步来说,这些媒体缓存器118可以透过结果总线耦接至读取端口,而结果总线也用于提供数据至重排缓冲器和/或结果传送总线以提供至其它执行单元112。这些神经处理单元126与媒体缓存器118共享此读取端口1602,以对数据随机存取存储器122进行读取。又,就一较佳实施例而言,写入端口1604也是以多任务方式耦接至神经处理单元126以及媒体缓存器118。这些神经处理单元126与媒体缓存器118共享此写入端口1604,以写入此数据随机存取存储器122。如此,媒体缓存器118就可以在神经处理单元126对数据随机存取存储器122进行读取的同时,写入数据随机存取存储器122,而神经处理单元126也就可以在媒体缓存器118正在对数据随机存取存储器122进行读取的同时,写入数据随机存取存储器122。这样的进行方式可以提升效能。举例来说,这些神经处理单元126可以读取数据随机存取存储器122(例如持续执行计算),而此同时,媒体缓存器118可以将更多数据文字写入数据随机存取存储器122。在另一范例中,这些神经处理单元126可以将计算结果写入数据随机存取存储器122,而此同时,媒体缓存器118则可以从数据随机存取存储器122读取计算结果。在一实施例中,神经处理单元126可以将一列计算结果写入数据随机存取存储器122,同时还从数据随机存取存储器122读取一列数据文字。在一实施例中,存储器阵列1606配置成存储器区块(bank)。在神经处理单元126存取数据随机存取存储器122的时候,所有的存储器区块都会被启动来存取存储器阵列1606的一完整列;不过,在媒体缓存器118存取数据随机存取存储器122的时候,只有所指定的存储器区块会被启动。在一实施例中,每个存储器区块的宽度均为128位,而媒体缓存器118的宽度则是256位,如此,举例来说,每次存取媒体缓存器118就需要启动两个存储器区块。在一实施例中,这些端口1602/1604的其中之一为读取/写入端口。在一实施例中,这些端口1602/1604都是读取/写入端口。让这些神经处理单元126具备如本文所述的旋转器的能力的优点在于,相较于为了确保神经处理单元126可被充分利用而使架构程序(通过媒体缓存器118)得以持续提供数据至数据随机存取存储器122并且在神经处理单元126执行计算的同时,从数据随机存取存储器122取回结果所需要的存储器阵列,此能力有助于减少数据随机存取存储器122的存储器阵列1606的列数,因而可以缩小尺寸。内部随机存取存储器缓冲器图17为显示图1的权重随机存取存储器124与缓冲器1704的一实施例的方块示意图。此权重随机存取存储器124包括存储器阵列1706与端口1702。此存储器阵列1706装载权重文字,就一较佳实施例而言,这些权重文字排列成如前所述W列的N个文字的阵列。在一实施例中,此存储器阵列1706包括一个由128个水平排列的静态随机存取记忆胞构成的阵列,其中每个记忆胞具有64位的宽度以及2048位的高度,如此即可提供一个2MB的权重随机存取存储器124,其宽度为8192位并且具有2048列,而此权重随机存取存储器124所使用的晶粒面积大致为2.4平方毫米。不过,本发明并不限于此。就一较佳实施例而言,此端口1702以多任务方式耦接至神经处理单元126与缓冲器1704。这些神经处理单元126与缓冲器1704透过此端口1702读取并写入权重随机存取存储器124。缓冲器1704还耦接至图1的媒体缓存器118,如此,媒体缓存器118即可透过缓冲器1704读取并写入权重随机存取存储器124。此方式的优点在于,当神经处理单元126正在读取或写入权重随机存取存储器124的时候,媒体缓存器118还可以写入缓冲器118或是从缓冲器118读取(不过若是神经处理单元126正在执行,在较佳的情况下搁置这些神经处理单元126,以避免当缓冲器1704存取权重随机存取存储器124时,存取权重随机存取存储器124)。此方式可以提升效能,特别是因为媒体缓存器118对于权重随机存取存储器124的读取与写入相对上明显小于神经处理单元126对于权重随机存取存储器124的读取与写入。举例来说,在一实施例中,神经处理单元126一次读取/写入8192个位(一列),不过,媒体缓存器118的宽度仅为256位,而每个MTNN指令1400仅写入两个媒体缓存器118,即512位。因此,在架构程序执行十六个MTNN指令1400以填满缓冲器1704的情况下,神经处理单元126与存取权重随机存取存储器124的架构程序间发生冲突的时间会少于大致全部时间的百分之六。在另一实施例中,指令转译器104将一个MTNN指令1400转译为两个微指令105,而每个微指令会将单一个数据缓存器118写入缓冲器1704,如此,神经处理单元126与架构程序在存取权重随机存取存储器124时产生冲突的频率还会进一步减少。在包含缓冲器1704的实施例中,利用架构程序写入权重随机存取存储器124需要多个MTNN指令1400。一个或多个MTNN指令1400指定一函数1432以写入缓冲器1704中指定的数据块,随后一MTNN指令1400指定一函数1432指示神经网络单元121将缓冲器1704的内容写入权重随机存取存储器124的一选定列。单一个数据块的大小为媒体缓存器118的位数的两倍,而这些数据块会自然地排齐于缓冲器1704中。在一实施例中,每个指定函数1432以写入缓冲器1704指定数据块的MTNN指令1400包含一位屏蔽(bitmask),其具有位对应至缓冲器1704的各个数据块。来自两个指定的来源缓存器118的数据被写入缓冲器1704的数据块中,在位屏蔽内的对应位为被设定的各个数据块。此实施例有助于权重随机存取存储器124的一列内存在重复数据值的情形。举例来说,为了将缓冲器1704(以及接下去的权重随机存取存储器124的一列)归零,程序设计者可以将零值加载来源缓存器并且设定位屏蔽的所有位。此外,位屏蔽也可以让程序设计者仅写入缓冲器1704中的选定数据块,而使其它数据块维持其先前的数据状态。在包含缓冲器1704的实施例中,利用架构程序读取权重随机存取存储器124需要多个MFNN指令1500。初始的MFNN指令1500指定一函数1532将权重随机存取单元124的一指定列加载缓冲器1704,随后一个或多个MFNN指令1500指定一函数1532将缓冲器1704的一指定数据块读取至目的缓存器。单一个数据块的大小即为媒体缓存器118的位数,而这些数据块会自然地排齐于缓冲器1704中。本发明的技术特征也可适用于其它实施例,如权重随机存取存储器124具有多个缓冲器1704,透过增加神经处理单元126执行时架构程序的可存取数量,以进一步减少神经处理单元126与架构程序间因存取权重随机存取存储器124所产生的冲突,而增加在神经处理单元126不须存取权重随机存取存储器124的时频周期内,改由缓冲器1704进行存取的可能性。图16描述双端口数据随机存取存储器122,不过,本发明并不限于此。本发明的技术特征也可适用于权重随机存取存储器124也为双端口设计的其它实施例。此外,图17中描述缓冲器搭配权重随机存取存储器124使用,不过,本发明并不限于此。本发明的技术特征也可适用于数据随机存取存储器122具有一个类似于缓冲器1704的相对应缓冲器的实施例。可动态配置的神经处理单元图18为显示图1的可动态配置的神经处理单元126的方块示意图。图18的神经处理单元126类似于图2的神经处理单元126。不过,图18的神经处理单元126可动态配置以运作于两个不同配置的其中之一。在第一个配置中,图18的神经处理单元126的运作类似于图2的神经处理单元126。也就是说,在第一个配置中,在此标示为“宽的”配置或“单一个”配置,神经处理单元126的算术逻辑单元204对单一个宽的数据文字以及单一个宽的权重文字(例如16个位)执行运算以产生单一个宽的结果。相较之下,在第二个配置中,即本文标示为“窄的”配置或“双数”配置,神经处理单元126会对两个窄的数据文字以及两个窄的权重文字(例如8个位)执行运算分别产生两个窄的结果。在一实施例中,神经处理单元126的配置(宽或窄)由初始化神经处理单元指令(例如位于前述图20中地址0的指令)达成。另外,此配置也可以由一个具有函数1432指定来设定神经处理单元设定的配置(宽或窄)的MTNN指令来达成。就一较佳实施例而言,程序存储器129指令或确定配置(宽或窄)的MTNN指令会填满配置缓存器。举例来说,配置缓存器的输出提供给算术逻辑单元204、启动函数单元212以及产生多任务缓存器控制信号213的逻辑。基本上,图18的神经处理单元126的组件与图2中相同编号的组件会执行类似的功能,可从中取得参照以了解图18的实施例。以下针对图18的实施例包含其与图2的不同处进行说明。图18的神经处理单元126包括两个缓存器205A与205B、两个三输入多任务缓存器208A与208B、一个算术逻辑单元204、两个累加器202A与202B、以及两个启动函数单元212A与212B。缓存器205A/205B分别具有图2的缓存器205的宽度的一半(如8个位)。缓存器205A/205B分别从权重随机存取存储器124接收一相对应的窄权重文字206A/B206(例如8个位)并将其输出203A/203B在一后续时频周期提供至算术逻辑单元204的操作数选择逻辑1898。神经处理单元126处于宽配置的时候,缓存器205A/205B就会一起运作以接收来自权重随机存取存储器124的一宽权重文字206A/206B(例如16个位),类似于图2的实施例中的缓存器205;神经处理单元126处于窄配置的时候,缓存器205A/205B实际上就会是独立运作,各自接收来自权重随机存取存储器124的一窄权重文字206A/206B(例如8个位),如此,神经处理单元126实际上就相当于两个窄的神经处理单元各自独立运作。不过,不论神经处理单元126的配置态样为何,权重随机存取存储器124的相同输出位都会耦接并提供至缓存器205A/205B。举例来说,神经处理单元0的缓存器205A接收到字节0、神经处理单元0的缓存器205B接收到字节1、神经处理单元1的缓存器205A接收到字节2、神经处理单元1的缓存器205B接收到字节3、依此类推,神经处理单元511的缓存器205B就会接收到字节1023。多任务缓存器208A/208B分别具有图2的缓存器208的宽度的一半(如8个位)。多任务缓存器208A会在输入207A、211A与1811A中选择一个储存至其缓存器并在后续时频周期由输出209A提供,多任务缓存器208B会在输入207B、211B与1811B中选择一个储存至其缓存器并在后续时频周期由输出209B提供至操作数选择逻辑1898。输入207A从数据随机存取存储器122接收一窄数据文字(例如8个位),输入207B从数据随机存取存储器122接收一窄数据文字。当神经处理单元126处于宽配置的时候,多任务缓存器208A/208B实际上就会是一起运作以接收来自数据随机存取存储器122的一宽数据文字207A/207B(例如16个位),类似于图2的实施例中的多任务缓存器208;神经处理单元126处于窄配置的时候,多任务缓存器208A/208B实际上就会是独立运作,各自接收来自数据随机存取存储器122的一窄数据文字207A/207B(例如8个位),如此,神经处理单元126实际上就相当于两个窄的神经处理单元各自独立运作。不过,不论神经处理单元126的配置态样为何,数据随机存取存储器122的相同输出位都会耦接并提供至多任务缓存器208A/208B。举例来说,神经处理单元0的多任务缓存器208A接收到字节0、神经处理单元0的多任务缓存器208B接收到字节1、神经处理单元1的多任务缓存器208A接收到字节2、神经处理单元1的多任务缓存器208B接收到字节3、依此类推,神经处理单元511的多任务缓存器208B就会接收到字节1023。输入211A接收邻近的神经处理单元126的多任务缓存器208A的输出209A,输入211B接收邻近的神经处理单元126的多任务缓存器208B的输出209B。输入1811A接收邻近神经处理单元126的多任务缓存器208B的输出209B,而输入1811B接收邻近神经处理单元126的多任务缓存器208A的输出209A。图18所示的神经处理单元126属于图1所示的N个神经处理单元126的其中之一并标示为神经处理单元J。也就是说,神经处理单元J是这N个神经处理单元的一代表范例。就一较佳实施例而言,神经处理单元J的多任务缓存器208A输入211A会接收范例J-1的神经处理单元126的多任务缓存器208A输出209A,而神经处理单元J的多任务缓存器208A输入1811A会接收范例J-1的神经处理单元126的多任务缓存器208B输出209B,并且神经处理单元J的多任务缓存器208A输出209A会同时提供至范例J+1的神经处理单元126的多任务缓存器208A输入211A以及范例J的神经处理单元126的多任务缓存器208B输入211B;神经处理单元J的多任务缓存器208B的输入211B会接收范例J-1的神经处理单元126的多任务缓存器208B输出209B,而神经处理单元J的多任务缓存器208B的输入1811B会接收范例J的神经处理单元126的多任务缓存器208A输出209A,并且,神经处理单元J的多任务缓存器208B的输出209B会同时提供至范例J+1的神经处理单元126的多任务缓存器208A输入1811A以及范例J+1的神经处理单元126的多任务缓存器208B输入211B。控制输入213控制多任务缓存器208A/208B中的每一个,从这三个输入中选择其一储存至其相对应的缓存器,并在后续步骤提供至相对应的输出209A/209B。当神经处理单元126被指示要从数据随机存取存储器122加载一列时(例如图20中地址1的乘法累加指令,详如后述),无论此神经处理单元126是处于宽配置或是窄配置,控制输入213会控制多任务缓存器208A/208B中的每一个多任务缓存器,从数据随机存取存储器122的选定列的相对应窄文字中选择一相对应的窄数据文字207A/207B(如8位)。当神经处理单元126接收指示需要对先前接收的数据列数值进行旋转时(例如图20中地址2的乘法累加旋转指令,详如后述),若是神经处理单元126是处于窄配置,控制输入213就会控制多任务缓存器208A/208B中每一个多任务缓存器选择相对应的输入1811A/1811B。在此情况下,多任务缓存器208A/208B实际上会是独立运作而使神经处理单元126实际上就如同两个独立的窄神经处理单元。如此,N个神经处理单元126的多任务缓存器208A与208B共同运作就会如同一2N个窄文字的旋转器,这部分在后续对应于图19处有更详细的说明。当神经处理单元126接收指示需要对先前接收的数据列数值进行旋转时,若是神经处理单元126是处于宽配置,控制输入213就会控制多任务缓存器208A/208B中每一个多任务缓存器选择相对应输入211A/211B。在此情况下,多任务缓存器208A/208B会共同运作而实际上就好像这个神经处理单元126是单一个宽神经处理单元126。如此,N个神经处理单元126的多任务缓存器208A与208B共同运作就会如同一N个宽文字的旋转器,类似对应于图3所描述的方式。算术逻辑单元204包括操作数选择逻辑1898、一个宽乘法器242A、一个窄乘法器242B、一个宽双输入多工器1896A,一个窄双输入多工器1896B,一个宽加法器244A与一个窄加法器244B。实际上,此算术逻辑单元204可理解为包括操作数选择逻辑、一个宽算术逻辑单元204A(包括前述宽乘法器242A、前述宽多工器1896A与前述宽加法器244A)与一个窄算术逻辑单元204B(包括前述窄乘法器242B、前述窄多工器1896B与前述窄加法器244B)。就一较佳实施例而言,宽乘法器242A可将两个宽文字相乘,类似于图2的乘法器242,例如一个16位乘16位的乘法器。窄乘法器242B可将两个窄文字相乘,例如一个8位乘8位的乘法器以产生一个16位的结果。神经处理单元126处于窄配置时,透过操作数选择逻辑1898的协助,即可充分利用宽乘法器242A,将其作为一个窄乘法器使两个窄文字相乘,如此神经处理单元126就会如同两个有效运作的窄神经处理单元。就一较佳实施例而言,宽加法器244A会将宽多工器1896A的输出与宽累加器202A的输出217A相加已产生一总数215A供宽累加器202A使用,其运作类似于图2的加法器244。窄加法器244B会将窄多工器1896B的输出与窄累加器202B输出217B相加以产生一总数215B供窄累加器202B使用。在一实施例中,窄累加器202B具有28位的宽度,以避免在进行多达1024个16位乘积的累加运算时会丧失准确度。神经处理单元126处于宽配置时,窄乘法器244B、窄累加器202B与窄启动函数单元212B最好是处于不启动状态以降低能量耗损。操作数选择逻辑1898会从209A、209B、203A与203B中选择操作数提供至算术逻辑单元204的其它组件,详如后述。就一较佳实施例而言,操作数选择逻辑1898也具有其它功能,例如执行带符号数值数据文字与权重文字的符号延展。举例来说,若是神经处理单元126是处于窄配置,操作数选择逻辑1898会将窄数据文字与权重文字的符号延展至宽文字的宽度,然后才提供给宽乘法器242A。类似地,若是算术逻辑单元204接受指示要传递一个窄数据/权重文字(利用宽多工器1896A跳过宽乘法器242A),操作数选择逻辑1898会将窄数据文字与权重文字的符号延展至宽文字的宽度,然后才提供给宽加法器244A。就一较佳实施例而言,此执行符号延展功能的逻辑也存在于图2的神经处理单元126的算术逻辑运算204的内部。宽多工器1896A接收宽乘法器242A的输出与来自操作数选择逻辑1898的一操作数,并从这些输入中选择其一提供给宽加法器244A,窄多工器1896B接收窄乘法器242B的输出与来自操作数选择逻辑1898的一操作数,并从这些输入中选择其一提供给窄加法器244B。操作数选择逻辑1898会依据神经处理单元126的配置以及算术逻辑单元204将要执行的算术和/或逻辑运算提供操作数,此算术/逻辑运算依据神经处理单元126执行的指令所指定的函数来决定。举例来说,若是指令指示算术逻辑单元204执行一乘法累加运算而神经处理单元126处于宽配置,操作数选择逻辑1898就将输出209A与209B串接构成的一宽文字提供至宽乘法器242A的一输入,而将输出203A与203B串接构成的一宽文字提供至另一输入,而窄乘法器242B则是不启动,如此,神经处理单元126的运作就会如同单一个类似于图2的神经处理单元126的宽神经处理单元126。不过,若是指令指示算术逻辑单元执行一乘法累加运算并且神经处理单元126是处于窄配置,操作数选择逻辑1898就将一延展后或扩张后版本的窄数据文字209A提供至宽乘法器242A的一输入,而将延展后版本的窄权重文字203A提供至另一输入;此外,操作数选择逻辑1898会将窄数据文字209B提供至窄乘法器242B的一输入,而将窄权重文字203B提供至另一输入。为达成如前所述对窄文字进行延展或扩张的运算,若是窄文字带有符号,操作数选择逻辑1898就会对窄文字进行符号延展;若是窄文字不带有符号,操作数选择逻辑1898就会在窄文字加入上方零值位。在另一范例中,若是神经处理单元126处于宽配置并且指令指示算术逻辑单元204执行一权重文字的累加运算,宽乘法器242A就会被跳过,而操作数选择逻辑1898就会将输出203A与203B串接提供至宽多工器1896A以提供给宽加法器244A。不过,若是神经处理单元126处于窄配置并且指令指示算术逻辑单元204执行一权重文字的累加运算,宽乘法器242A就会被跳过,而操作数选择逻辑1898就会将一延展后版本的输出203A提供至宽多工器1896A以提供给宽加法器244A;此外,窄乘法器242B会被跳过,操作数选择逻辑1898会将延展后版本的输出203B提供至窄多工器1896B以提供给窄加法器244B。在另一范例中,若是神经处理单元126处于宽配置并且指令指示算术逻辑单元204执行一数据文字的累加运算,宽乘法器242A就会被跳过,而操作数选择逻辑1898就会将输出209A与209B串接提供至宽多工器1896A以提供给宽加法器244A。不过,若是神经处理单元126处于窄配置并且指令指示算术逻辑单元204执行一数据文字的累加运算,宽乘法器242A就会被跳过,而操作数选择逻辑1898就会将一延展后版本的输出209A提供至宽多工器1896A以提供给宽加法器244A;此外,窄乘法器242B会被跳过,操作数选择逻辑1898会将延展后版本的输出209B提供至窄多工器1896B以提供给窄加法器244B。权重/数据文字的累加计算有助于平均运算,平均运算可用如影像处理在内的某些人工神经网络应用的共源(pooling)层。就一较佳实施例而言,神经处理单元126还包括第二宽多工器(未图示),用以跳过宽加法器244A,以利于将宽配置下的宽数据/权重文字或是窄配置下的延展后的窄数据/权重文字加载宽累加器202A,以及第二窄多工器(未图示),用以跳过窄加法器244B,以利于将窄配置下的窄数据/权重文字加载窄累加器202B。就一较佳实施例而言,此算术逻辑单元204还包括宽与窄的比较器/多工器组合(未图示),此比较器/多工器组合接收相对应的累加器数值217A/217B与相对应的多工器1896A/1896B输出,藉以在累加器数值217A/217B与一数据/权重文字209A/209B/203A/203B间选择最大值,某些人工神经网络应用的共源(pooling)层使用此运算,这部分在后续章节,例如对应于图27与图28处,会有更详细的说明。此外,操作数选择逻辑1898用以提供数值零的操作数(用于加零的加法运算或是用以清除累加器),并提供数值一的操作数(用于乘一的乘法运算)。窄启动函数单元212B接收窄累加器202B的输出217B并对其执行启动函数以产生窄结果133B,宽启动函数单元212A接收宽累加器202A的输出217A并对其执行启动函数以产生宽结果133A。神经处理单元126处于窄配置时,宽启动函数单元212A会依此配置理解累加器202A的输出217A并对其执行启动函数以产生窄结果,如8位,这部分在后续章节如对应于图29A至图30处有更详细的说明。如前所述,单一个神经处理单元126在处于窄配置时实际上可以作为两个窄神经处理单元来运作,因此,对于较小的文字而言,相较于宽配置时,大致上可以提供多达两倍的处理能力。举例来说,假定神经网络层具有1024个神经元,而每个神经元从前一层接收1024个窄输入(并具有窄权重文字),如此就会产生一百万个连结。对于具有512个神经处理单元126的神经网络单元121而言,在窄配置下(相当于1024个窄神经处理单元),虽然处理的是窄文字而非宽文字,不过其所能处理的连结数可以达到宽配置的四倍(一百万个连结对上256K个连结),而所需的时间大致为一半(约1026个时频周期对上514个时频周期)。在一实施例中,图18的动态配置神经处理单元126包括类似于多任务缓存器208A与208B的三输入多任务缓存器以取代缓存器205A与205B,以构成一旋转器,处理由权重随机存取存储器124接收的权重文字列,此运作部分类似于图7的实施例所描述的方式但应用于图18所述的动态配置中。图19为一方块示意图,显示依据图18的实施例,利用图1的神经网络单元121的N个神经处理单元126的2N个多任务缓存器208A/208B,对于由图1的数据随机存取存储器122取得的一列数据文字207执行如同一旋转器的运作。在图19的实施例中,N是512,神经处理单元121具有1024个多任务缓存器208A/208B,标示为0至511,分别对应至512个神经处理单元126以及实际上1024个窄神经处理单元。神经处理单元126内的两个窄神经处理单元分别标示为A与B,在每个多任务缓存器208中,其相对应的窄神经处理单元亦加以标示。进一步来说,标示为0的神经处理单元126的多任务缓存器208A标示为0-A,标示为0的神经处理单元126的多任务缓存器208B标示为0-B,标示为1的神经处理单元126的多任务缓存器208A标示为1-A,标示为1的神经处理单元126的多任务缓存器208B标示为1-B,标示为511的神经处理单元126的多任务缓存器208A标示为511-A,而标示为511的神经处理单元126的多任务缓存器208B标示为511-B,其数值亦对应至后续图21所述的窄神经处理单元。每个多任务缓存器208A在数据随机存取存储器122的D列的其中一列中接收其相对应的窄数据文字207A,而每个多任务缓存器208B在数据随机存取存储器122的D列的其中一列中接收其相对应的窄数据文字207B。也就是说,多任务缓存器0-A接收数据随机存取存储器122列的窄数据文字0,多任务缓存器0-B接收数据随机存取存储器122列的窄数据文字1,多任务缓存器1-A接收数据随机存取存储器122列的窄数据文字2,多任务缓存器1-B接收数据随机存取存储器122列的窄数据文字3,依此类推,多任务缓存器511-A接收数据随机存取存储器122列的窄数据文字1022,而多任务缓存器511-B则是接收数据随机存取存储器122列的窄数据文字1023。此外,多任务缓存器1-A接收多任务缓存器0-A的输出209A作为其输入211A,多任务缓存器1-B接收多任务缓存器0-B的输出209B作为其输入211B,依此类推,多任务缓存器511-A接收多任务缓存器510-A的输出209A作为其输入211A,多任务缓存器511-B接收多任务缓存器510-B的输出209B作为其输入211B,并且多任务缓存器0-A接收多任务缓存器511-A的输出209A作为其输入211A,多任务缓存器0-B接收多任务缓存器511-B的输出209B作为其输入211B。每个多任务缓存器208A/208B都会接收控制输入213以控制其选择数据文字207A/207B或是旋转后输入211A/211B或是旋转后输入1811A/1811B。最后,多任务缓存器1-A接收多任务缓存器0-B的输出209B作为其输入1811A,多任务缓存器1-B接收多任务缓存器1-A的输出209A作为其输入1811B,依此类推,多任务缓存器511-A接收多任务缓存器510-B的输出209B作为其输入1811A,多任务缓存器511-B接收多任务缓存器511-A的输出209A作为其输入1811B,并且多任务缓存器0-A接收多任务缓存器511-B的输出209B作为其输入1811A,多任务缓存器0-B接收多任务缓存器0-A的输出209A作为其输入1811B。每个多任务缓存器208A/208B都会接收控制输入213以控制其选择数据文字207A/207B或是旋转后输入211A/211B或是旋转后输入1811A/1811B。在一运算模式中,在第一时频周期,控制输入213会控制每个多任务缓存器208A/208B选择数据文字207A/207B储存至缓存器供后续提供至算术逻辑单元204;而在后续时频周期(例如前述的M-1时频周期),控制输入213会控制每个多任务缓存器208A/208B选择旋转后输入1811A/1811B储存至缓存器供后续提供至算术逻辑单元204,这部分在后续章节会有更详细的说明。图20为一表格,显示一个储存于图1的神经网络单元121的程序存储器129并由该神经网络单元121执行的程序,而此神经网络单元121具有如图18的实施例所示的神经处理单元126。图20的范例程序类似于图4的程序。以下针对其差异进行说明。位于地址0的初始化神经处理单元指令指定神经处理单元126将会进入窄配置。此外,如图中所示,位于地址2的乘法累加旋转指令指定一数值为1023的计数值并需要1023个时频周期。这是因为图20的范例中假定在一层中实际上具有1024个窄(如8位)神经元(即神经处理单元),每个窄神经元具有1024个来自前一层的1024个神经元的连结输入,因此总共有1024K个连结。每个神经元从每个连结输入接收一个8位数据值并将此8位数据值乘上一个适当的8位权重值。图21为显示神经网络单元121执行图20的程序的时序图,此神经网络单元121具有如图18所示的神经处理单元126执行于窄配置。图21的时序图类似于图5的时序图。以下针对其差异进行说明。在图21的时序图中,这些神经处理单元126会处于窄配置,这是因为位于地址0的初始化神经处理单元指令将其初始化为窄配置。所以,这512个神经处理单元126实际上运作起来就如同1024个窄神经处理单元(或神经元),这1024个窄神经处理单元在字段内以神经处理单元0-A与神经处理单元0-B(标示为0的神经处理单元126的两个窄神经处理单元),神经处理单元1-A与神经处理单元1-B(标示为1的神经处理单元126的两个窄神经处理单元),依此类推直到神经处理单元511-A与神经处理单元511-B(标示为511的神经处理单元126的两个窄神经处理单元),加以指明。为简化说明,图中仅显示窄神经处理单元0-A、0-B与511-B的运算。因为位于地址2的乘法累加旋转指令所指定的计数值为1023,而需要1023个时频周期进行运作因此,图21的时序图的列数包括多达1026个时频周期。在时频周期0,这1024个神经处理单元的每一个都会执行图4的初始化指令,即图5所示指派零值至累加器202的运作。在时频周期1,这1024个窄神经处理单元的每一个都会执行图20中位于地址1的乘法累加指令。如图中所示,窄神经处理单元0-A将累加器202A数值(即零)加上数据随机存取单元122的列17窄文字0与权重随机存取单元124的列0窄文字0的乘积;窄神经处理单元0-B将累加器202B数值(即零)加上数据随机存取单元122的列17窄文字1与权重随机存取单元124的列0窄文字1的乘积;依此类推直到窄神经处理单元511-B将累加器202B数值(即零)加上数据随机存取单元122的列17窄文字1023与权重随机存取单元124的列0窄文字1023的乘积。在时频周期2,这1024个窄神经处理单元的每一个都会执行图20中位于地址2的乘法累加旋转指令的第一次迭代。如图中所示,窄神经处理单元0-A将累加器202A数值217A加上由窄神经处理单元511-B的多任务缓存器208B输出209B所接收的旋转后窄数据文字1811A(也就是由数据随机存取存储器122所接收的窄数据文字1023)与权重随机存取单元124的列1窄文字0的乘积;窄神经处理单元0-B将累加器202B数值217B加上由窄神经处理单元0-A的多任务缓存器208A输出209A所接收的旋转后窄数据文字1811B(也就是由数据随机存取存储器122所接收的窄数据文字0)与权重随机存取单元124的列1窄文字1的乘积;依此类推,直到窄神经处理单元511-B将累加器202B数值217B加上由窄神经处理单元511-A的多任务缓存器208A输出209A所接收的旋转后窄数据文字1811B(也就是由数据随机存取存储器122所接收的窄数据文字1022)与权重随机存取单元124的列1窄文字1023的乘积。在时频周期3,这1024个窄神经处理单元的每一个都会执行图20中位于地址2的乘法累加旋转指令的第二次迭代。如图中所示,窄神经处理单元0-A将累加器202A数值217A加上由窄神经处理单元511-B的多任务缓存器208B输出209B所接收的旋转后窄数据文字1811A(也就是由数据随机存取存储器122所接收的窄数据文字1022)与权重随机存取单元124的列2窄文字0的乘积;窄神经处理单元0-B将累加器202B数值217B加上由窄神经处理单元0-A的多任务缓存器208A输出209A所接收的旋转后窄数据文字1811B(也就是由数据随机存取存储器122所接收的窄数据文字1023)与权重随机存取单元124的列2窄文字1的乘积;依此类推,直到窄神经处理单元511-B将累加器202B数值217B加上由窄神经处理单元511-A的多任务缓存器208A输出209A所接收的旋转后窄数据文字1811B(也就是由数据随机存取存储器122所接收的窄数据文字1021)与权重随机存取单元124的列2窄文字1023的乘积。如图21所示,此运算会在后续1021个时频周期持续进行,直到以下所述的时频周期1024。在时频周期1024,这1024个窄神经处理单元的每一个都会执行图20中位于地址2的乘法累加旋转指令的第1023次迭代。如图中所示,窄神经处理单元0-A将累加器202A数值217A加上由窄神经处理单元511-B的多任务缓存器208B输出209B所接收的旋转后窄数据文字1811A(也就是由数据随机存取存储器122所接收的窄数据文字1)与权重随机存取单元124的列1023窄文字0的乘积;窄神经处理单元0-B将累加器202B数值217B加上由窄神经处理单元0-A的多任务缓存器208A输出209A所接收的旋转后窄数据文字1811B(也就是由数据随机存取存储器122所接收的窄数据文字2)与权重随机存取单元124的列1023窄文字1的乘积;依此类推,直到窄神经处理单元511-B将累加器202B数值217B加上由窄神经处理单元511-A的多任务缓存器208A输出209A所接收的旋转后窄数据文字1811B(也就是由数据随机存取存储器122所接收的窄数据文字0)与权重随机存取单元124的列1023窄文字1023的乘积。在时频周期1025,这1024个窄神经处理单元中的每一个的启动函数单元212A/212B会执行图20中位于地址3的启动函数指令。最后,在时频周期1026,这1024个窄神经处理单元中的每一个会将其窄结果133A/133B写回数据随机存取存储器122的列16中的相对应窄文字,以执行图20中位于地址4的写入启动函数单元指令。也即,神经处理单元0-A的窄结果133A会被写入数据随机存取存储器122的窄文字0,神经处理单元0-B的窄结果133B会被写入数据随机存取存储器122的窄文字1,依此类推,直到神经处理单元511-B的窄结果133B会被写入数据随机存取存储器122的窄文字1023。图22以方块图显示前述对应于图21的运算。图22为显示图1的神经网络单元121的方块示意图,此神经网络单元121具有如图18所示的神经处理单元126以执行图20的程序。此神经网络单元121包括512个神经处理单元126,即1024个窄神经处理单元,数据随机存取存储器122,以及权重随机存取存储器124,数据随机存取存储器122接收其地址输入123,权重随机存取存储器124接收其地址输入125。虽然图中并未显示,不过,在时频周期0,这1024个窄神经处理单元都会执行图20的初始化指令。如图中所示,在时频周期1,列17的1024个8位数据文字会从数据随机存取存储器122读出并提供至这1024个窄神经处理单元。在时频周期1至1024,列0至1023的1024个8位权重文字会分别从权重随机存取存储器124读出并提供至这1024个窄神经处理单元。虽然图中并未显示,不过,在时频周期1,这1024个窄神经处理单元会对加载的数据文字与权重文字执行其相对应的乘法累加运算。在时频周期2至1024,这1024个窄神经处理单元的多任务缓存器208A/208B的运作如同一个1024个8位文字的旋转器,会将先前加载数据随机存取存储器122的列17的数据文字旋转至邻近的窄神经处理单元,而这些窄神经处理单元会对相对应的旋转后数据文字以及由权重随机存取存储器124加载的相对应窄权重文字执行乘法累加运算。虽然图中并未显示,在时频周期1025,这1024个窄启动函数单元212A/212B会执行启动指令。在时频周期1026,这1024个窄神经处理单元会将其相对应的1024个8位结果133A/133B写回数据随机存取存储器122的列16。由此可以发现,相较于图2的实施例,图18的实施例让程序设计者具有弹性可以选择使用宽数据与权重文字(如16位)以及窄数据与权重文字(如8位)执行计算,以因应特定应用下对于准确度的需求。从一个面向来看,对于窄数据的应用而言,图18的实施例相较于图2的实施例可提供两倍的效能,但必须增加额外的窄组件(例如多任务缓存器208B、缓存器205B、窄算术逻辑单元204B、窄累加器202B、窄启动函数单元212B)作为代价,这些额外的窄组件会使神经处理单元126增加约50%的面积。三模神经处理单元图23为显示图1的可动态配置的神经处理单元126的另一实施例的方块示意图。图23的神经处理单元126不但可用于宽配置与窄配置,还可用以第三种配置,在此称为“漏斗(funnel)”配置。图23的神经处理单元126类似于图18的神经处理单元126。不过,图18中的宽加法器244A在图23的神经处理单元126中由一个三输入宽加法器2344A所取代,此三输入宽加法器2344A接收一第三加数2399,其为窄多工器1896B的输出的一延伸版本。具有图23的神经处理单元的神经网络单元所执行的程序类似于图20的程序。不过,其中位于地址0的初始化神经处理单元指令会将这些神经处理单元126初始化为漏斗配置,而非窄配置。此外,位于地址2的乘法累加旋转指令的计数值为511而非1023。处于漏斗配置时,神经处理单元126的运作类似于处于窄配置,当执行如图20中地址1的乘法累加指令时,神经处理单元126会接收两个窄数据文字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的启动函数指令时,宽启动函数单元212A会对结果总数215A执行启动函数以产生一窄结果133A,而窄启动函数单元212B则是不启动。如此,只有标示为A的窄神经处理单元会产生窄结果133A,标示为B的窄神经处理单元所产生的窄结果133B则是无效。因此,写回结果的列(如图20中地址4的指令所指示的列16)会包含空洞,这是因为只有窄结果133A有效,窄结果133B则是无效。因此,在概念上,每个时频周期内,每个神经元(图23的神经处理单元)会执行两个连结数据输入,即将两个窄数据文字乘上其相对应的权重并将这两个乘积相加,相较之下,图2与图18的实施例在每个时频周期内只执行一个连结数据输入。在图23的实施例中可以发现,产生并写回数据随机存取存储器122或权重随机存取存储器124的结果文字(神经元输出)的数量是所接收数据输入(连结)数量的平方根的一半,而结果的写回列具有空洞,即每隔一个窄文字结果就是无效,更精确来说,标示为B的窄神经处理单元结果不具意义。因此,图23的实施例对于具有连续两层的神经网络特别有效率,举例来说,第一层具有的神经元数量为第二层的两倍(例如第一层具有1024个神经元充分连接至第二层的512个神经元)。此外,其它的执行单元122(例如媒体单元,如x86高级向量扩展单元)在必要时,可对一分散结果列(即具有空洞)执行合并运算(packoperation)以使其紧密(即不具空洞)。后续当神经处理单元121在执行其它关联于数据随机存取存储器122和/或权重随机存取存储器124的其它列的计算时,即可将此处理后的数据列用于计算。混合神经网络单元运算:卷积与共源运算能力本发明实施例所述的神经网络单元121的优点在于,此神经网络单元121能够同时以类似于一个协处理器执行自己内部程序的方式运作以及以类似于一个处理器的处理单元执行所发布的架构指令(或是由架构指令转译出的微指令)。架构指令是包含在具有神经网络单元121的处理器所执行的架构程序内。如此,神经网络单元121即可以混合方式运作,而能维持神经处理单元121的高利用率。举例来说,图24至图26显示神经网络单元121执行卷积运算的运作,其中,神经网络单元被充分利用,图27至图28显示神经网络单元121执行共源运算的运作。卷积层、共源层以及其它数字数据计算的应用,例如影像处理(如边缘侦测、锐利化、模糊化、辨识/分类)需要使用到这些运算。不过,神经处理单元121的混合运算并不限于执行卷积或共源运算,此混合特征也可用于执行其它运算,例如图4至图13所述的传统神经网络乘法累加运算与启动函数运算。也就是说,处理器100(更精确地说,保留站108)会发布MTNN指令1400与MFNN指令1500至神经网络单元121,因应此发布的指令,神经网络单元121会将数据写入存储器122/124/129并将结果从被神经网络单元121写入的存储器122/124中读出,在此同时,为了执行处理器100(透过MTNN1400指令)写入程序存储器129的程序,神经网络单元121会读取并写入存储器122/124/129。图24为一方块示意图,显示由图1的神经网络单元121使用以执行卷积运算的数据结构的一范例。此方块图包括卷积核2402、数据阵列2404、以及图1的数据随机存取存储器122与权重随机存取存储器124。就一较佳实施例而言,数据阵列2404(例如对应于影像像素)装载于连接至处理器100的系统存储器(未图示)并由处理器100透过执行MTNN指令1400加载神经网络单元121的权重随机存取存储器124。卷积运算将第一阵列与第二阵列进行卷积,此第二阵列即为本文所述的卷积核。如本文所述,卷积核为一系数矩阵,这些系数也可称为权重、参数、元素或数值。就一较佳实施例而言,此卷积核2042为处理器100所执行的架构程序的静态数据。此数据阵列2404为一个数据值的二维阵列,而每个数据值(例如影像像素值)的大小是数据随机存取存储器122或权重随机存取存储器124的文字的尺寸(例如16位或8位)。在此范例中,数据值为16位文字,神经网络单元121为配置有512个宽配置的神经处理单元126。此外,在此实施例中,神经处理单元126包括多任务缓存器以接收来自权重随机存取存储器124的权重文字206,例如图7的多任务缓存器705,藉以对由权重随机存取存储器124接收的一列数据值执行集体旋转器运算,这部分在后续章节会有更详细的说明。在此范例中,数据阵列2404为一个2560行X1600列的像素阵列。如图中所示,当架构程序将数据阵列2404与卷积核2402进行卷积计算时,数据阵列2402会被分为20个数据块,而每个数据块分别是512x400的数据阵列2406。在此范例中,卷积核2402为一个由系数、权重、参数、或元素,构成的3x3阵列。这些系数的第一列标示为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的系数写入数据随机存取存储器122。就一较佳实施例而言,数据随机存取存储器122的连续九列(卷积核2402内的元素数量)的每列上的所有文字,会利用卷积核2402的不同元素以列为其主要顺序加以写入。也就是说,如图中所示,在同一列的每个文字以第一系数C0,0写入;下一列则是以第二系数C0,1写入;下一列则是以第三系数C0,2写入;再下一列则是以第四系数C1,0写入;依此类推,直到第九列的每个文字都以第九系数C2,2写入。为了对数据阵列2404分割出的数据块的数据矩阵2406进行卷积运算,神经处理单元126会依据顺序重复读取数据随机存取存储器122中装载卷积核2042系数的九列,这部分在后续章节,特别是对应于图26A的部分,会有更详细的说明。请参照图24以及详述其中细节的图25,架构程序将数据矩阵2406的数值写入权重随机存取存储器124。神经网络单元程序执行卷积运算时,会将结果阵列写回权重随机存取存储器124。就一较佳实施例而言,架构程序会将第一数据矩阵2406写入权重随机存取存储器124并使神经网络单元121开始运作,当神经网络单元121在对第一数据矩阵2406与卷积核2402执行卷积运算时,架构程序会将第二数据矩阵2406写入权重随机存取存储器124,如此,神经网络单元121完成第一数据矩阵2406的卷积运算后,即可开始执行第二数据矩阵2406的卷积运算,这部分在后续对应于图25处有更详细的说明。以此方式,架构程序会往返于权重随机存取存储器124的两个区域,以确保神经网络单元121被充分使用。因此,图24的范例显示有第一数据矩阵2406A与第二数据矩阵2406B,第一数据矩阵2406A为对应于占据权重随机存取存储器124中列0至399的第一数据块,而第二数据矩阵2406B为对应于占据权重随机存取存储器124中列500至899的第二数据块。此外,如图中所示,神经网络单元121会将卷积运算的结果写回权重随机存取存储器124的列900-1299以及列1300-1699,随后架构程序会从权重随机存取存储器124读取这些结果。装载于权重随机存取存储器124的数据矩阵2406的数据值标示为“Dx,y”,其中“x”是权重随机存取存储器124列数,“y”是权重随机存取存储器的文字、或称行数。举例来说,位于列399的数据文字511在图24中标示为D399,511,此数据文字由神经处理单元511的多任务缓存器705接收。图25为一流程图,显示图1的处理器100执行架构程序以利用神经网络单元121对图24的数据阵列2404执行卷积核2042的卷积运算。此流程始于步骤2502。在步骤2502中,处理器100,即执行有架构程序的处理器100,会将图24的卷积核2402以图24所显示描述的方式写入数据随机存取存储器122。此外,架构程序会将变量N初始化为数值1。变量N标示数据阵列2404中神经网络单元121正在处理的数据块。此外,架构程序会将变量NUM_CHUNKS初始化为数值20。接下来流程前进至步骤2504。在步骤2504中,如图24所示,处理器100会将数据块1的数据矩阵2406写入权重随机存取存储器124(如数据块1的数据矩阵2406A)。接下来流程前进至步骤2506。在步骤2506中,处理器100会使用一个指定函数1432以写入程序存储器129的MTNN指令1400,将卷积程序写入神经网络单元121程序存储器129。处理器100随后会使用一个指定函数1432以开始执行程序的MTNN指令1400,以启动神经网络单元卷积程序。神经网络单元卷积程序的一范例在对应于图26A处会有更详细的说明。接下来流程前进至步骤2508。在决策步骤2508,架构程序确认变量N的数值是否小于NUM_CHUNKS。若是,流程会前进至步骤2512;否则就前进至步骤2514。在步骤2512,如图24所示,处理器100将数据块N+1的数据矩阵2406写入权重随机存取存储器124(如数据块2的数据矩阵2406B)。因此,当神经网络单元121正在对当前数据块执行卷积运算的时候,架构程序可将下一个数据块的数据矩阵2406写入权重随机存取存储器124,如此,在完成当前数据块的卷积运算后,即写入权重随机存取存储器124后,神经网络单元121可以立即开始对下一个数据块执行卷积运算。在步骤2514,处理器100确认正在执行的神经网络单元程序(对于数据块1而是从步骤2506开始执行,对于数据块2-20而言则是从步骤2518开始执行)是否已经完成执行。就一较佳实施例而言,处理器100透过执行MFNN指令1500读取神经网络单元121状态缓存器127以确认是否已经完成执行。在另一实施例中,神经网络单元121会产生中断,表示已经完成卷积程序。接下来流程前进至决策步骤2516。在决策步骤2516中,架构程序确认变量N的数值是否小于NUM_CHUNKS。若是,流程前进至步骤2518;否则就前进至步骤2522。在步骤2518中,处理器100会更新卷积程序以便执行于数据块N+1。更精确地说,处理器100会将权重随机存取存储器124中对应于地址0的初始化神经处理单元指令的列值更新为数据矩阵2406的第一列(例如,更新为数据矩阵2406A的列0或是数据矩阵2406B的列500),并且会更新输出列(例如更新为列900或1300)。随后处理器100会开始执行此更新后的神经网络单元卷积程序。接下来流程前进至步骤2522。在步骤2522中,处理器100从权重随机存取存储器124读取数据块N的神经网络单元卷积程序的执行结果。接下来流程前进至决策步骤2524。在决策步骤2524中,架构程序确认变量N的数值是否小于NUM_CHUNKS。若是,流程前进至步骤2526;否则就终止。在步骤2526中,架构程序会将N的数值增加一。接下来流程回到决策步骤2508。图26A为神经网络单元程序的程序列表,此神经网络单元程序利用图24的卷积核2402执行数据矩阵2406的卷积运算并将其写回权重随机存取存储器124。此程序将地址1至9的指令所构成的指令循环循环一定次数。位于地址0的初始化神经处理单元指令指定每个神经处理单元126执行此指令循环的次数,在图26A的范例所具有的循环计数值为400,对应于图24的数据矩阵2406内的列数,而位于循环终端的循环指令(位于地址10)会使当前循环计数值递减,若是结果为非零值,就使其回到指令循环的顶端(即回到地址1的指令)。初始化神经处理单元指令也会将累加器202清除为零。就一较佳实施例而言,位于地址10的循环指令也会将累加器202清除为零。另外,如前述位于地址1的乘法累加指令也可将累加器202清除为零。对于程序内指令循环的每一次执行,这512个神经处理单元126会同时执行512个3x3卷积核以及数据矩阵2406的512个相对应的3x3子矩阵的卷积运算。卷积运算是由卷积核2042的元素与相对应子矩阵内的相对应元素计算出来的九个乘积的加总。在图26A的实施例中,这512个相对应3x3子矩阵的每一个的原点(中央元素)是图24中的数据文字Dx+1,y+1,其中y(行编号)是神经处理单元126编号,而x(列编号)是当前权重随机存取存储器124中由图26A的程序中地址1的乘法累加指令所读取的列编号(此列编号也会由地址0的初始化神经处理单元指令进行初始化处理,也会在执行位于地址3与5的乘法累加指令时递增,也会被位于地址9的递减指令更新)。如此,在此程序的每一个循环中,这512个神经处理单元126会计算512个卷积运算并将这512个卷积运算的结果写回权重随机存取存储器124的指令列。在本文中省略边缘处理(edgehandling)以简化说明,不过需要注意的是,利用这些神经处理单元126的集体旋转特征会造成数据矩阵2406(对于影像处理器而言即影像的数据矩阵)的多行数据中有两行从其一侧的垂直边缘到另一个垂直边缘间(例如从左侧边缘到右侧边缘,反之亦然)产生环绕(wrapping)。现在针对指令循环进行说明。地址1是乘法累加指令,此指令会指定数据随机存取存储器122的列0并暗中利用当前权重随机存取存储器124的列,这列最好是装载在定序器128内(并由位于地址0的指令将其初始化为零以执行第一次指令循环传递的运算)。也就是说,位于地址1的指令会使每个神经处理单元126从数据随机存取存储器122的列0读取其相对应文字,从当前权重随机存取存储器124列读取其相对应文字,并对此二个文字执行一乘法累加运算。如此,举例来说,神经处理单元5将C0,0与Dx,5相乘(其中“x”是当前权重随机存取存储器124列),将结果加上累加器202数值217,并将总数写回累加器202。地址2是一个乘法累加指令,此指令会指定数据随机存取存储器122的列递增(即增加至1),随后再从数据随机存取存储器122的递增后地址读取这列。此指令并会指定将每个神经处理单元126的多任务缓存器705内的数值旋转至邻近的神经处理单元126,在此范例中即为因应地址1的指令而从权重随机存取存储器124读取的数据矩阵2406值的列。在图24至图26的实施例中,这些神经处理单元126用以将多任务缓存器705的数值向左旋转,也即从神经处理单元J旋转至神经处理单元J-1,而非如前述图3、图7与图19从神经处理单元J旋转至神经处理单元J+1。值得注意的是,神经处理单元126向右旋转的实施例中,架构程序会将卷积核2042为数值以不同顺序写入数据随机存取存储器122(例如绕着其中心行旋转)以达到相似卷积结果的目的。此外,在需要时,架构程序可执行额外的卷积核预处理(例如移动(transposition))。此外,指令指定的计数值为2。因此,位于地址2的指令会使每个神经处理单元126从数据随机存取存储器122的列1读取其相对应文字,将旋转后文字接收至多任务缓存器705,并对这两个文字执行乘法累加运算。因为计数值为2,此指令也会使每个神经处理单元126重复前述运作。也就是说,定序器128会使数据随机存取存储器122列地址123递增(即增加至2),而每个神经处理单元126会从数据随机存取存储器122的列2读取其相对应文字以及将旋转后文字接收至多任务缓存器705,并且对这两个文字执行乘法累加运算。如此,举例来说,假定当前权重随机存取存储器124列为27,在执行地址2的指令后,神经处理单元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的指令,利用权重随机存取存储器124列递增指针的功效,这些指令会对权重随机存取存储器124的下一列进行运算,并且这些指令会对数据随机存取存储器122的后续三列,即列3至5,进行运算。也就是说,以神经处理单元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的指令,这些指令会对权重随机存取存储器124的下一列,以及数据随机存取存储器122的后续三列,即列6至8,进行运算。也就是说,以神经处理单元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的指令后,假定指令循环开始时,权重随机存取存储器124列为27,以神经处理单元5为例,将会利用卷积核2042对以下3x3子矩阵进行卷积运算:一般而言,完成地址1到6的指令后,这512个神经处理单元126都已经使用卷积核2042对下列3x3子矩阵进行卷积运算:其中r是指令循环开始时,权重随机存取存储器124的列地址值,而n是神经处理单元126的编号。地址7的指令会透过启动函数单元121传递累加器202数值217。此传递功能会传递一个文字,其尺寸大小(以位计)等同于由数据随机存取存储器122与权重随机存取存储器124读取的文字(在此范例中即16位)。就一较佳实施例而言,使用者可指定输出格式,例如输出位中有多少位是小数(fractional)位,这部分在后续章节会有更详细的说明。另外,此指定可指定一个除法启动函数,而非指定一个传递启动函数,此除法启动函数会将累加器202数值217除以一个除数,如本文对应于图29A与图30所述,例如利用图30的“除法器”3014/3016的其中之一。举例来说,就一个具有系数的卷积核2042而言,如前述具有十六分之一的系数的高斯模糊核,地址7的指令会指定一除法启动函数(例如除以16),而非指定一传递函数。另外,架构程序可以在将卷积核系数写入数据随机存取存储器122前,对卷积核2042系数执行此除以16的运算,并据以调整卷积核2042数值的二进制小数点的位置,例如使用如下所述图29的数据二进制小数点2922。地址8的指令会将启动函数单元212的输出写入权重随机存取存储器124中由输出列缓存器的当前值所指定的列。此当前值会被地址0的指令初始化,并且由指令内的递增指针在每传递经过一次循环就递增此数值。如图24至图26具有一3x3卷积核2402的范例所述,神经处理单元126大约每三个时频周期会读取权重随机存取存储器124以读取数据矩阵2406的一列,并且大约每十二个时频周期会将卷积核结果矩阵写入权重随机存取存储器124。此外,假定在一实施例中,具有如图17的缓冲器1704的写入与读取缓冲器,在神经处理单元126进行读取与写入的同时,处理器100可以对权重随机存取存储器124进行读取与写入,缓冲器1704大约每十六个时频周期会对权重随机存取存储器执行一次读取与写入动作,以分别读取数据矩阵以及写入卷积核结果矩阵。因此,权重随机存取存储器124的大约一半的频宽会由神经网络单元121以混合方式执行的卷积核运算所消耗。本范例包含一个3x3卷积核2042,不过,本发明并不限于此,其它大小的卷积核,如2x2、4x4、5x5、6x6、7x7、8x8等,也可适用于不同的神经网络单元程序。在使用较大卷积核的情况下,因为乘法累加指令的旋转版本(如图26A的地址2、4与6的指令,较大的卷积核会需要使用这些指令)具有较大的计数值,神经处理单元126读取权重随机存取存储器124的时间占比会降低,因此,权重随机存取存储器124的频宽使用比也会降低。另外,架构程序可使神经网络单元程序对输入数据矩阵2406中不再需要使用的列进行覆写,而非将卷积运算结果写回权重随机存取存储器124的不同列(如列900-1299与1300-1699)。举例来说,就一个3x3的卷积核而言,架构程序可以将数据矩阵2406写入权重随机存取存储器124的列2-401,而非写入列0-399,而神经处理单元程序则会从权重随机存取存储器124的列0开始将卷积运算结果写入,而每传递经过一次指令循环就递增列数。如此,神经网络单元程序只会将不再需要使用的列进行覆写。举例来说,在第一次传递经过指令循环之后(或更精确地说,在执行地址1的指令之后其加载权重随机存取存储器124的列0),列0的数据可以被覆写,不过,列1-3的数据需要留给第二次传递经过指令循环的运算而不能被覆写;同样地,在第二次传递经过指令循环之后,列1的数据可以被覆写,不过,列2-4的数据需要留给第三次传递经过指令循环的运算而不能被覆写;依此类推。在此实施例中,可以增大各个数据矩阵2406(数据块)的高度(如800列),因而可以使用较少的数据块。另外,架构程序可以使神经网络单元程序将卷积运算的结果写回卷积核2402上方的数据随机存取存储器122列(例如在列8上方),而非将卷积运算结果写回权重随机存取存储器124,当神经网络单元121写入结果时,架构程序可以从数据随机存取存储器122读取结果(例如使用图26中数据随机存取存储器122的最近写入列2606地址)。此配置适用于具有单端口权重随机存取存储器124与双端口数据随机存取存储器的实施例。依据图24至图26A的实施例中神经网络单元121的运算可以发现,图26A的程序的每次执行会需要大约5000个时频周期,如此,图24中整个2560x1600的数据阵列2404的卷积运算需要大约100,000个时频周期,明显少于以传统方式执行相同任务所需要的时频周期数。图26B为显示图1的神经网络单元121的控制缓存器127的某些字段的一实施例的方块示意图。此状态缓存器127包括一个字段2602,指出权重随机存取存储器124中最近被神经处理单元126写入的列的地址;一个字段2606,指出数据随机存取存储器122中最近被神经处理单元126写入的列的地址;一个字段2604,指出权重随机存取存储器124中最近被神经处理单元126读取的列的地址;以及一个字段2608,指出数据随机存取存储器122中最近被神经处理单元126读取的列的地址。如此,执行于处理器100的架构程序就可以确认神经网络单元121的处理进度,当对数据随机存取存储器122和/或权重随机存取存储器124进行数据的读取和/或写入时。利用此能力,加上如前述选择对输入数据矩阵进行覆写(或是如前述将结果写入数据随机存取存储器122),如以下的范例所述,图24的数据阵列2404就可以视为5个512x1600的数据块来执行,而非20个512x400的数据块。处理器100从权重随机存取存储器124的列2开始写入第一个512x1600的数据块,并使神经网络单元程序启动(此程序具有一数值为1600的循环计数,并且将权重随机存取存储器124输出列初始化为0)。当神经网络单元121执行神经网络单元程序时,处理器100会监测权重随机存取存储器124的输出位置/地址,藉以(1)(使用MFNN指令1500)读取权重随机存取存储器124中具有由神经网络单元121(由列0开始)写入的有效卷积运算结果的列;以及(2)将第二个512x1600数据矩阵2406(始于列2)覆写于已经被读取过的有效卷积运算结果,如此当神经网络单元121对于第一个512x1600数据块完成神经网络单元程序,处理器100在必要时可以立即更新神经网络单元程序并再次启动神经网络单元程序以执行于第二个512x1600数据块。此程序会再重复三次执行剩下三个512x1600数据块,以使神经网络单元121可以被充分使用。在一实施例中,启动函数单元212具有能够对累加器202数值217有效执行一有效除法运算的能力,这部分在后续章节尤其是对应于图29A、图29B与图30处会有更详细的说明。举例来说,对累加器202数值进行除以16的除法运算的启动函数神经网络单元指令可用于以下所述的高斯模糊矩阵。图24的范例中所使用的卷积核2402为一个应用于整个数据矩阵2404的小型静态卷积核,不过,本发明并不限于此,此卷积核也可为一大型矩阵,具有特定的权重对应于数据阵列2404的不同数据值,例如常见于卷积神经网络的卷积核。当神经网络单元121以此方式被使用时,架构程序会将数据矩阵与卷积核的位置互换,也即将数据矩阵放置于数据随机存取存储器122内而将卷积核放置于权重随机存取存储器124内,而执行神经网络单元程序所需处理的列数也会相对较少。图27为一方块示意图,显示图1中填入输入数据的权重随机存取存储器124的一范例,此输入数据由图1的神经网络单元121执行共源运算(poolingoperation)。共源运算是由人工神经网络的共源层执行,透过取得输入矩阵的子区域或子矩阵并计算子矩阵的最大值或平均值以作为结果矩阵即共源矩阵,以缩减输入数据矩阵(如影像或是卷积后影像)的大小(dimension)。在图27与图28的范例中,共源运算计算各个子矩阵的最大值。共源运算对于如执行对象分类或侦测的人工神经网络特别有用。一般而言,共源运算实际上可以使输入矩阵缩减的因子为所检测的子矩阵的元素数,特别是可以将输入矩阵的各个维度方向都缩减子矩阵的相对应维度方向的元素数。在图27的范例中,输入数据是一个宽文字(如16位)的512x1600矩阵,储存于权重随机存取存储器124的列0至1599。在图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的输入数据矩阵的共源运算并将其写回权重随机存取存储器124。在图28的范例中,共源运算会计算输入数据矩阵中各个4x4子矩阵的最大值。此程序会多次执行由指令1至10构成的指令循环。位于地址0的初始化神经处理单元指令会指定每个神经处理单元126执行指令循环的次数,在图28的范例中的循环计数值为400,而在循环末端(在地址11)的循环指令会使当前循环计数值递减,而若是所产生的结果是非零值,就使其回到指令循环的顶端(即回到地址1的指令)。权重随机存取存储器124内的输入数据矩阵实质上会被神经网络单元程序视为400个由四个相邻列构成的互斥群组,即列0-3、列4-7、列8-11、依此类推,直到列1596-1599。每一个由四个相邻列构成的群组包括128个4x4子矩阵,这些子矩阵由此群组的四列与四个相邻行的交叉处元素所形成的4x4子矩阵,这些相邻行即行0-3、行4-7、行8-11、依此类推直到行508-511。这512个神经处理单元126中,每四个为一组计算的第四个神经处理单元126(一共即128个)会对一相对应4x4子矩阵执行共源运算,而其它三个神经处理单元126则不被使用。更精确地说,神经处理单元0、4、8、依此类推直到神经处理单元508,会对其相对应的4x4子矩阵执行共源运算,而此4x4子矩阵的最左侧行编号对应于神经处理单元编号,而下方列对应于当前权重随机存取存储器124的列值,此数值会被地址0的初始化指令初始化为零并且在重复每次指令循环后会增加4,这部分在后续章节会有更详细的说明。这400次指令循环的重复动作对应至图27的输入数据矩阵中的4x4子矩阵群组数(即输入数据矩阵具有的1600列除以4)。初始化神经处理单元指令也会清除累加器202使其归零。就一较佳实施例而言,地址11的循环指令也会清除累加器202使其归零。另外,地址1的maxwacc指令会指定清除累加器202使其归零。每次在执行程序的指令循环时,这128个被使用的神经处理单元126会对输入数据矩阵的当前四列群组中的128个个别的4x4子矩阵,同时执行128个共源运算。进一步来说,此共源运算会确认这4x4子矩阵的16个元素中的最大值元素。在图28的实施例中,对于这128个被使用的神经处理单元126中的每个神经处理单元y而言,4x4子矩阵的下方左侧元素为图27内的元素Dx,y,其中x是指令循环开始时当前权重随机存取存储器124的列数,而此列数据由图28的程序中地址1的maxwacc指令读取(此列数也会由地址0的初始化神经处理单元指令加以初始化,并在每次执行地址3、5与7的maxwacc指令时递增)。因此,对于此程序的每一个循环而言,这128个被使用的神经处理单元126会将当前列群组的相对应128个4x4子矩阵的最大值元素,写回权重随机存取记忆124的指定列。以下针对此指令循环进行描述。地址1的maxwacc指令会暗中使用当前权重随机存取存储器124列,这列最好是装载在定序器128内(并由位于地址0的指令将其初始化为零以执行第一次传递经过指令循环的运算)。地址1的指令会使每个神经处理单元126从权重随机存取存储器124的当前列读取其相对应文字,将此文字与累加器202数值217相比,并将这两个数值的最大者储存于累加器202。因此,举例来说,神经处理单元8会确认累加器202数值217与数据文字Dx,8(其中“x”是当前权重随机存取存储器124列)中的最大值并将其写回累加器202。地址2是一个maxwacc指令,此指令会指定将每个神经处理单元126的多任务缓存器705内的数值旋转至邻近至神经处理单元126,在此即为因应地址1的指令刚从权重随机存取存储器124读取的一列输入数据阵列值。在图27至图28的实施例中,神经处理单元126用以将多工器705数值向左旋转,也即从神经处理单元J旋转至神经处理单元J-1,如前文对应于图24至图26的章节所述。此外,此指令会指定一计数值为3。如此,地址2的指令会使每个神经处理单元126将旋转后文字接收至多任务缓存器705并确认此旋转后文字与累加器202数值中的最大值,然后将这个运算再重复两次。也就是说,每个神经处理单元126会执行三次将旋转后文字接收至多任务缓存器705并确认旋转后文字与累加器202数值中最大值的运算。如此,举例来说,假定开始此指令循环时,当前权重随机存取存储器124列为36,以神经处理单元8为例,在执行地址1与2的指令后,神经处理单元8将会在其累加器202中储存循环开始时累加器202以及四个权重随机存取存储器124文字D36,8、D36,9、D36,10与D36,11中的最大值。地址3与4的maxwacc指令所执行的运算类似于地址1的指令,利用权重随机存取存储器124列递增指针具有的功效,地址3与4的指令会对权重随机存取存储器124的下一列执行。也就是说,假定指令循环开始时当前权重随机存取存储器124列是36,以神经处理单元8为例,在完成地址1到4的指令后,神经处理单元8将会在其累加器202中储存循环开始时累加器202以及八个权重随机存取存储器124文字D36,8、D36,9、D36,10、D36,11、D37,8、D37,9、D37,10与D37,11中的最大值。地址5至8的maxwacc指令所执行的运算类似于地址1至4的指令,地址5至8的指令会对权重随机存取存储器124的下两列执行。也就是说,假定指令循环开始时当前权重随机存取存储器124列是36,以神经处理单元8为例,在完成地址1到8的指令后,神经处理单元8将会在其累加器202中储存循环开始时累加器202以及十六个权重随机存取存储器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中的最大值。也就是说,假定指令循环开始时当前权重随机存取存储器124列是36,以神经处理单元8为例,在完成地址1到8的指令后,神经处理单元8将会完成确认下列4x4子矩阵的最大值:基本上,在完成地址1至8的指令后,这128个被使用的神经处理单元126中的每一个神经处理单元126就会完成确认下列4x4子矩阵的最大值:其中r是指令循环开始时当前权重随机存取存储器124的列地址值,n是神经处理单元126编号。地址9的指令会透过启动函数单元212传递累加器202数值217。此传递功能会传递一个文字,其尺寸大小(以位计)等同于由权重随机存取存储器124读取的文字(在此范例中即16位)。就一较佳实施例而言,使用者可指定输出格式,例如输出位中有多少位是小数(fractional)位,这部分在后续章节会有更详细的说明。地址10的指令会将累加器202数值217写入权重随机存取存储器124中由输出列缓存器的当前值所指定的列,此当前值会被地址0的指令予以初始化,并利用指令内的递增指针在每次传递经过循环后将此数值递增。进一步来说,地址10的指令会将累加器202的一宽文字(如16位)写入权重随机存取存储器124。就一较佳实施例而言,此指令会将这16个位依照输出二进制小数点2916来进行写入,这部分在下列对应于图29A与图29B处会有更详细的说明。如前述,迭代一次指令循环写入权重随机存取存储器124的列会包含具有无效值的空洞。也就是说,结果133的宽文字1至3、5至7、9至11、依此类推,直到宽文字509至511都是无效或未使用的。在一实施例中,启动函数单元212包括多工器使能将结果合并至列缓冲器的相邻文字,例如图11的列缓冲器1104,以写回输出权重随机存取存储器124列。就一较佳实施例而言,启动函数指令会指定每个空洞中的文字数,而此空洞内的文字数控制多工器合并结果。在一实施例中,空洞数可指定为数值2至6,以合并共源的3x3、4x4、5x5、6x6或7x7子矩阵的输出。另外,执行于处理器100的架构程序会从权重随机存取存储器124读取所产生的稀疏(即具有空洞)结果列,并利用其它执行单元112,例如使用架构合并指令的媒体单元,如x86单指令多数据流扩展(SSE)指令,执行合并功能。以类似于前述同时进行的方式并利用神经网络单元121的混合本质,执行于处理器100的架构程序可以读取状态缓存器127以监测权重随机存取存储器124的最近写入列(例如图26B的字段2602)以读取所产生的一稀疏结果列,将其合并并写回权重随机存取存储器124的同一列,如此就完成准备而能作为一输入数据矩阵,提供给神经网络的下一层使用,例如卷积层或是传统神经网络层(也即乘法累加层)。此外,本文所述的实施例以4x4子矩阵执行共源运算,不过本发明并不限于此,图28的神经网络单元程序可经调整,而以其它尺寸的子矩阵,如3x3、5x5、6x6或7x7,执行共源运算。如前述可以发现,写入权重随机存取存储器124的结果列的数量是输入数据矩阵的列数的四分之一。最后,在此范例中并未使用数据随机存取存储器122。不过,也可利用数据随机存取存储器122,而非权重随机存取存储器124,来执行共源运算。在图27与图28的实施例中,共源运算会计算子区域的最大值。不过,图28的程序可经调整以计算子区域的平均值,利入透过将maxwacc指令以sumwacc指令取代(将权重文字与累加器202数值217加总)并将地址9的启动函数指令修改为将累加结果除以各个子区域的元素数(较佳者透过如下所述的倒数乘法运算),在此范例中为十六。由神经网络单元121依据图27与图28的运算中可以发现,每一次执行图28的程序需要使用大约6000个时频周期来对图27所示的整个512x1600数据矩阵执行一次共源运算,此运算所使用的时频周期数明显少于传统方式执行相类似任务所需的时频周期数。另外,架构程序可使神经网络单元程序将共源运算的结果写回数据随机存取存储器122列,而非将结果写回权重随机存取存储器124,当神经网络单元121将结果写入数据随机存取存储器122时(例如使用图26B的数据随机存取存储器122最近写入列2606的地址),架构程序会从数据随机存取存储器122读取结果。此配置适用具有单端口权重随机存取存储器124与双端口数据随机存取存储器122的实施例。定点算术运算,具有使用者提供二进制小数点,全精度定点累加,使用者指定倒数值,累加器数值的随机舍入,以及可选择启动/输出函数一般而言,在数字计算装置内执行算术运算的硬件单元依据其执行算术运算的对象为整数或浮点数,通常可分为“整数”单元与“浮点”单元。浮点数具有数值(magnitude)(或尾数)与指数,通常还有符号。指数是基数(radix)点(通常为二进制小数点)相对于数值的位置的指针。相较之下,整数不具有指数,而只具有数值,通常还有符号。浮点单元可以让程序设计者可以从一个非常大范围的不同数值中取得其工作所要使用的数字,而硬件则是在需要时负责调整此数字的指数值,而不需程序设计者处理。举例来说,假定两个浮点数0.111x1029与0.81x1031相乘。(虽然浮点单元通常工作于2为基础的浮点数,此范例中所使用的是十进制小数,或以10为基础的浮点数。)浮点单元会自动负责尾数相乘,指数相加,随后再将结果标准化至数值.8911x1059。在另一个范例中,假定同样的两个浮点数相加。浮点单元会在相加前自动负责将尾数的二进制小数点对齐以产生数值为.81111x1031的总数。不过,众所周知,这样复杂的运算而会导致浮点单元的尺寸增加,耗能增加、每指令所需时频周期数增加、以及/或周期时间拉长。因为这个原因,许多装置(如嵌入式处理器、微控制器与相对低成本和/或低功率的微处理器)并不具有浮点单元。由前述范例可以发现,浮点单元的复杂结构包含执行关联于浮点加法与乘法/除法的指数计算的逻辑(即对操作数的指数执行加/减运算以产生浮点乘法/除法的指数数值的加法器,将操作数指数相减以确认浮点加法的二进制小数点对准偏移量的减法器),包含为了达成浮点加法中尾数的二进制小数点对准的偏移器,包含对浮点结果进行标准化处理的偏移器。此外,流程的进行通常还需要执行浮点结果的舍入运算的逻辑、执行整数格式与浮点格式间以及不同浮点格式(例如扩增精度、双精度、单精度、半精度)间的转换的逻辑、前导零与前导一的侦测器、以及处理特殊浮点数的逻辑,例如反常值、非数值与无穷值。此外,关于浮点单元的正确度验证会因为设计上需要被验证的数值空间增加而大幅增加其复杂度,而会延长产品开发周期与上市时间。此外,如前述,浮点算术运算需要对用于计算的每个浮点数的尾数字段与指数字段分别储存与使用,而会增加所需的储存空间和/或在给定储存空间以储存整数的情况下降低精确度。其中许多缺点都可以透过整数单元执行算术运算来避免。程序设计者通常需要撰写处理小数的程序,小数即为非完整数的数值。这种程序可能需要在不具有浮点单元的处理器上执行,或是处理器虽然具有浮点单元,不过由处理器的整数单元执行整数指令会比较快。为了利用整数处理器在效能上的优势,程序设计者会对定点数值(fixed-pointnumbers)使用习知的定点算术运算。这样的程序会包括执行于整数单元以处理整数或整数数据的指令。软件知道数据是小数,这个软件并包含指令对整数数据执行运算而处理这个数据实际上是小数的问题,例如对准偏移器。基本上,定点软件可手动执行某些或全部浮点单元所能执行的功能。在本文中,一个“定点”数(或值或操作数或输入或输出)是一个数字,其储存位被理解为包含位以表示此定点数的一小数部分,此位在此称为“小数位”。定点数的储存位包含于存储器或缓存器内,例如存储器或缓存器内的一个8位或16位文字。此外,定点数的储存位全部都用来表达一个数值,而在某些情况下,其中一个位会用来表达符号,不过,没有一个定点数的储存位会用来表达这个数的指数。此外,此定点数的小数位数量或称二进制小数点位置指定于一个不同于定点数储存位的储存空间内,并且是以共享或通用的方式指出小数位的数量或称二进制小数点位置,分享给一个包含此定点数的定点数集合,例如输入操作数、累加数值或是处理单元阵列的输出结果的集合。在此描述的实施例中,算术逻辑单元是整数单元,不过,启动函数单元则是包含浮点算术硬件辅助或加速。如此可以使算术逻辑单元部分变得更小且更为快速,以利于在给定的芯片空间上使用更多的算术逻辑单元。这也表示在单位芯片空间上可以设置更多的神经元,而特别有利于神经网络单元。此外,相较于每个浮点数都需要指数储存位,本文所述的实施例中的定点数以一个指针表达全部的数字集合中属于小数位的储存位的数量,不过,此指针位于一个单一、共享的储存空间而广泛地指出整个集合的所有数字,例如一系列运算的输入集合、一系列运算的累加数的集合、输出的集合,其中小数位的数量。就一较佳实施例而言,神经网络单元的使用者可对此数字集合指定小数储存位的数量。因此,可以理解的是,虽然在许多情况下(如一般数学),“整数”的用语是指一个带符号完整数,也就是一个不具有小数部分的数字,不过,在本文的脉络中,“整数”的用语可表示具有小数部分的数字。此外,在本文的脉络中,“整数”的用语是为了与浮点数进行区分,对于浮点数而言,其各自储存空间内的部分位会用来表达浮点数的指数。类似地,整数算术运算,如整数单元执行的整数乘法或加法或比较运算,假设操作数中不具有指数,因此,整数单元的整阵列件,如整数乘法器、整数加法器、整数比较器,就不需要包含逻辑来处理指数,例如不需要为了加法或比较运算而移动尾数来对准二进制小数点,不需要为了乘法运算而将指数相加。此外,本文所述的实施例包括一个大型的硬件整数累加器以对一个大型系列的整数运算进行累加(如1000个乘法累加运算)而不会丧失精确度。如此可避免神经网络单元处理浮点数,同时又能使累加数维持全精度,而不会使其饱和或因为溢位而产生不准确的结果。一旦这系列整数运算加总出一结果输入此全精度累加器,此定点硬件辅助会执行必要的缩放与饱和运算,藉以利用使用者指定的累加值小数位数量指针以及输出值所需要的小数位数量,将此全精度累加值转换为一输出值,这部分在后续章节会有更详细的说明。当需要将累加值从全精度形式进行压缩以便用于启动函数的一输入或是用于传递,就一较佳实施例而言,启动函数单元可以选择性地对累加值执行随机舍入运算,这部分在后续章节会有更详细的说明。最后,依据神经网络的给定层的不同需求,神经处理单元可以选择性地接受指示以使用不同的启动函数以及/或输出许多不同形式的累加值。图29A为显示图1的控制缓存器127的一实施例的方块示意图。此控制缓存器127可包括多个控制缓存器127。如图中所示,此控制缓存器127包括下列字段:配置2902、带符号数据2912、带符号权重2914、数据二进制小数点2922、权重二进制小数点2924、算术逻辑单元函数2926、舍入控制2932、启动函数2934、倒数2942、偏移量2944、输出随机存取存储器2952、输出二进制小数点2954、以及输出命令2956。控制缓存器127值可以利用MTNN指令1400与NNU程序的指令,如启动指令,进行写入动作。配置2902值指定神经网络单元121是属于窄配置、宽配置或是漏斗配置,如前所述。配置2902也设定了由数据随机存取存储器122与权重随机存取存储器124接收的输入文字的大小。在窄配置与漏斗配置中,输入文字的大小是窄的(例如8位或9位),不过,在宽配置中,输入文字的大小则是宽的(例如12位或16位)。此外,配置2902也设定了与输入文字大小相同的输出结果133的大小。带符号数据值2912为真的时候,即表示由数据随机存取存储器122接收的数据文字为带符号值,若为假,则表示这些数据文字为不带符号值。带符号权重值2914为真的时候,即表示由权重随机存取存储器122接收的权重文字为带符号值,若为假,则表示这些权重文字为不带符号值。数据二进制小数点2922值表示由数据随机存取存储器122接收的数据文字的二进制小数点位置。就一较佳实施例而言,对于二进制小数点的位置而言,数据二进制小数点2922值即表示二进制小数点从右侧计算的位位置数量。换言之,数据二进制小数点2922表示数据文字的最低有效位中属于小数位的数量,即位于二进制小数点右侧的位数。类似地,权重二进制小数点2924值表示由权重随机存取存储器124接收的权重文字的二进制小数点位置。就一较佳实施例而言,当算术逻辑单元函数2926是一个乘法与累加或输出累加,神经处理单元126将装载于累加器202的数值的二进制小数点右侧的位数确定为数据二进制小数点2922与权重二进制小数点2924的加总。因此,举例来说,若是数据二进制小数点2922的值为5而权重二进制小数点2924的值为3,累加器202内的值就会在二进制小数点右侧有8个位。当算术逻辑单元函数2926是一个总数/最大值累加器与数据/权重文字或是传递数据/权重文字,神经处理单元126会将装载于累加器202的数值的二进制小数点右侧的位数分别确定为数据/权重二进制小数点2922/2924。在另一实施例中,则是指定单一个累加器二进制小数点2923,而不去指定个别的数据二进制小数点2922与权重二进制小数点2924。这部分在后续对应于图29B处会有更详细的说明。算术逻辑单元函数2926指定由神经处理单元126的算术逻辑单元204执行的函数。如前述,算术逻辑单元函数2926可包括以下运算但不限于:将数据文字209与权重文字203相乘并将此乘积与累加器202相加;将累加器202与权重文字203相加;将累加器202与数据文字209相加;累加器202与数据文字209中的最大值;累加器202与权重文字209中的最大值;输出累加器202;传递数据文字209;传递权重文字209;输出零值。在一实施例中,此算术逻辑单元函数2926由神经网络单元初始化指令予以指定,并且由算术逻辑单元204使用以因应一执行指令(未图示)。在一实施例中,此算术逻辑单元函数2926由个别的神经网络单元指令予以指定,如前述乘法累加以及maxwacc指令。舍入控制2932指定(图30中)舍入器3004所使用的舍入运算的形式。在一实施例中,可指定的舍入模式包括但不限于:不舍入、舍入至最近值、以及随机舍入。就一较佳实施例而言,处理器100包括随机位来源3003(请参照图30)以产生随机位3005,这些随机位3005经取样用以执行随机舍入以降低产生舍入偏差的可能性。在一实施例中,当舍入位3005为一而黏(sticky)位为零,若是取样的随机位3005为真,神经处理单元126就会向上舍入,若是取样的随机位3005为假,神经处理单元126就不会向上舍入。在一实施例中,随机位来源3003基于处理器100具有的随机电子特性进行取样以产生随机位3005,这些随机电子特性如半导体二极管或电阻的热噪声,不过本发明并不限于此。启动函数2934指定用于累加器202数值217的函数以产生神经处理单元126的输出133。如本文所述,启动函数2934包括但不限于:S型函数;双曲正切函数;软加函数;校正函数;除以二的指定幂次方;乘上一个使用者指定的倒数值以达成等效除法;传递整个累加器;以及将累加器以标准尺寸传递,这部分在以下章节会有更详细的说明。在一实施例中,启动函数由神经网络单元启动函数指令所指定。另外,启动函数也可由初始化指令所指定,并因应输出指令而使用,例如图4中地址4的启动函数单元输出指令,在此实施例中,位于图4中地址3的启动函数指令会包含于输出指令内。倒数2942值指定一个与累加器202数值217相乘以达成对累加器202数值217进行除法运算的数值。也就是说,使用者所指定的倒数2942值会是实际上想要执行的除数的倒数。这有利于搭配如本文所述的卷积或共源运算。就一较佳实施例而言,使用者会将倒数2942值指定为两个部分,这在后续对应于图29C处会有更详细的说明。在一实施例中,控制缓存器127包括一字段(未图示)让使用者可以在多个内建除数值中指定一个进行除法,这些内建除数值的大小相当于常用的卷积核的大小,如9、25、36或49。在此实施例中,启动函数单元212会储存这些内建除数的倒数,用以与累加器202数值217相乘。偏移量2944指定启动函数单元212的移位器会将累加器202数值217右移的位数,以达成将其除以二的幂次方的运算。这有利于搭配尺寸为二的幂次方的卷积核进行运算。输出随机存取存储器2952值会在数据随机存取存储器122与权重随机存取存储器124中指定一个来接收输出结果133。输出二进制小数点2954值表示输出结果133的二进制小数点的位置。就一较佳实施例而言,对于输出结果133的二进制小数点的位置而言,输出二进制小数点2954值即表示从右侧计算的位位置数量。换言之,输出二进制小数点2954表示输出结果133的最低有效位中属于小数位的数量,即位于二进制小数点右侧的位数。启动函数单元212会基于输出二进制小数点2954的数值(在大部分的情况下,也会基于数据二进制小数点2922、权重二进制小数点2924、启动函数2934和/或配置2902的数值)执行舍入、压缩、饱和与尺寸转换的运算。输出命令2956会从许多面向控制输出结果133。在一实施例中,启动函数单元121会利用标准尺寸的概念,标准尺寸为配置2902指定的宽度大小(以位计)的两倍。如此,举例来说,若是配置2902设定由数据随机存取存储器122与权重随机存取存储器124接收的输入文字的大小为8位,标准尺寸就会是16位;在另一个范例中,若是配置2902设定由数据随机存取存储器122与权重随机存取存储器124接收的输入文字的大小为16位,标准尺寸就会是32位。如本文所述,累加器202的尺寸较大(举例来说,窄的累加器202B为28位,而宽的累加器202A则是41位)以维持中间计算,如1024与512个神经网络单元乘法累加指令,的全精度。如此,累加器202数值217就会大于(以位计)标准尺寸,而对于启动函数2934的大部分数值(除了传递整个累加器),启动函数单元212(例如以下对应于图30的段落所述的标准尺寸压缩器3008)就会将累加器202数值217压缩至标准尺寸的大小。输出命令2956的第一默认值会指示启动函数单元212执行指定的启动函数2934以产生内部结果并将此内部结果作为输出结果133输出,此内部结果的大小等于原始输入文字的大小,即标准尺寸的一半。输出命令2956的第二默认值会指示启动函数单元212执行指定的启动函数2934以产生内部结果并将此内部结果的下半部作为输出结果133输出,此内部结果的大小等于原始输入文字的大小的两倍,即标准尺寸;而输出命令2956的第三默认值会指示启动函数单元212将标准尺寸的内部结果的上半部作为输出结果133输出。输出命令2956的第四默认值会指示启动函数单元212将累加器202的未经处理的最低有效文字作为输出结果133输出;而输出命令2956的第五默认值会指示启动函数单元212将累加器202的未经处理的中间有效文字作为输出结果133输出;输出命令2956的第六默认值会指示启动函数单元212将累加器202的未经处理的最高有效文字(其宽度由配置2902所指定)作为输出结果133输出,这在前文对应于图8至图10的章节有更详细的说明。如前述,输出整个累加器202尺寸或是标准尺寸的内部结果有助于让处理器100的其它执行单元112可以执行启动函数,如软极大启动函数。图29A(以及图29B与图29C)所描述的字段位于控制缓存器127内部,不过,本发明并不限于此,其中一个或多个字段也可位于神经网络单元121的其它部分。就一较佳实施例而言,其中许多字段可以包含在神经网络单元指令内部,并由定序器128予以译码以产生微指令3416(请参照图34)控制算术逻辑单元204以及/或启动函数单元212。此外,这些字段也可以包含在储存于媒体缓存器118的微运算3414内(请参照图34),以控制算术逻辑单元204以及/或启动函数单元212。此实施例可以降低初始化神经网络单元指令的使用,而在其它实施例中则可去除此初始化神经网络单元指令。如前述,神经网络单元指令可以指定对存储器操作数(如来自数据随机存取存储器122和/或权重随机存取存储器123的文字)或一个旋转后操作数(如来自多任务缓存器208/705)执行算术逻辑指令运算。在一实施例中,神经网络单元指令还可以将一个操作数指定为启动函数的缓存器输出(如图30的缓存器3038的输出)。此外,如前述,神经网络单元指令可以指定来使数据随机存取存储器122或权重随机存取存储器124的当前列地址递增。在一实施例中,神经网络单元指令可指定立即带符号整数差值加入当前列以达成递增或递减一以外数值的目的。图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是前导零抑制倒数值,也就是将所有前导零移除后的真实倒数值。在一实施例中,被抑制前导零数量2962以4位储存,而前导零抑制倒数值2964则是以8位不带符号值储存。举例来说,假设使用者想要将累加器202数值217乘上数值49的倒数值。数值49的倒数值以二维呈现并设定13个小数位就会是0.0000010100111,其中有五个前导零。如此,使用者会将被抑制前导零数量2962填入数值5,将前导零抑制倒数值2964填入数值10100111。在倒数乘法器“除法器A”3014(请参照图30)将累加器202数值217与前导零抑制倒数值2964相乘后,所产生的乘积会依据被抑制前导零数量2962右移。这样的实施例有助于利用相对较少的位来表达倒数2942值达成高精确度的要求。图30为显示图2的启动函数单元212的一实施例的方块示意图。此启动函数单元212包含图1的控制逻辑127、一个正类型转换器(PFC)与输出二进制小数点对准器(OBPA)3002以接收累加器202数值217、一个舍入器3004以接收累加器202数值217与输出二进制小数点对准器3002移出的位数量的指针、一个如前述的随机位来源3003以产生随机位3005、一个第一多工器3006以接收正类型转换器与输出二进制小数点对准器3002的输出以及舍入器3004的输出、一个标准尺寸压缩器(CCS)与饱和器3008以接收第一多工器3006的输出、一个位选择器与饱和器3012以接收标准尺寸压缩器与饱和器3008的输出、一个校正器3018以接收标准尺寸压缩器与饱和器3008的输出、一个倒数乘法器3014以接收标准尺寸压缩器与饱和器3008的输出、一个向右移位器3016以接收标准尺寸压缩器与饱和器3008的输出、一个双曲正切(tanh)模块3022以接收位选择器与饱和器3012的输出、一个S型模块3024以接收位选择器与饱和器3012的输出、一个软加模块3026以接收位选择器与饱和器3012的输出、一个第二多工器3032以接收双曲正切模块3022、S型模块3024、软加模块3026、校正器3018、倒数乘法器3014与向右移位器3016的输出以及标准尺寸压缩器与饱和器3008所传递的标准尺寸输出3028、一个符号恢复器3034以接收第二多工器3032的输出、一个尺寸转换器与饱和器3036以接收符号恢复器3034的输出、一第三多工器3037以接收尺寸转换器与饱和器3036的输出与累加器输出217、以及一个输出缓存器3038以接收多工器3037的输出,而其输出即为图1中的结果133。正类型转换器与输出二进制小数点对准器3002接收累加器202值217。就一较佳实施例而言,如前述,累加器202值217是一个全精度值。也就是说,累加器202具有足够的储存位数以装载累加数,此累加数是由整数加法器244将一系列由整数乘法器242产生的乘积相加所产生的总数,而此运算不舍弃乘法器242的个别乘积或加法器的各个总数中的任何一个位以维持精确度。就一较佳实施例而言,累加器202至少具有足够的位数来装载神经网络单元121可被程序化执行产生的乘积累加的最大数量。举例来说,请参照图4的程序,在宽配置下,神经网络单元121可被程序化执行产生的乘积累加的最大数量为512,而累加数202位宽度为41。在另一范例中,请参照图20的程序,在窄配置下,神经网络单元121可被程序化执行产生的乘积累加的最大数量为1024,而累加数202位宽度为28。基本上,全精度累加器202具有至少Q个位,其中Q是M与log2P的加总,其中M是乘法器242的整数乘积的位宽度(举例来说,对于窄乘法器242而言是16位,对于宽乘法器242而言是32位),而P是累加器202所能累加的乘积的最大容许数量。就一较佳实施例而言,乘积累加的最大数量是依据神经网络单元121的程序设计者的程序规格所指定。在一实施例中,假定一个先前乘法累加指令用以从数据/权重随机存取存储器122/124加载数据/权重文字206/207列(如图4中地址1的指令)的基础上,定序器128会执行乘法累加神经网络单元指令(如图4中地址2的指令)的计数的最大值是例如511。利用一个具有足够位宽度而能对所容许累加的最大数量的全精度值执行累加运算的累加器202,即可简化神经处理单元126的算术逻辑单元204的设计。特别是,这样处理可以缓和需要使用逻辑来对整数加法器244产生的总数执行饱和运算的需求,因为整数加法器244会使一个小型累加器产生溢位,而需要持续追踪累加器的二进制小数点位置以确认是否产生溢位以确认是否需要执行饱和运算。举例来说,对于具有非全精度累加器但具有饱和逻辑以处理非全精度累加器的溢位的设计而言,假定存在以下情况。(1)数据文字值的范围是介于0与1之间而所有储存位都用以储存小数位。权重文字值的范围是介于-8与+8之间而除了三个以外的所有储存位都用以储存小数位。做为一个双曲正切启动函数的输入的累加值的范围是介于-8与8之间,而除了三个以外的所有储存位都用以储存小数位。(2)累加器的位宽度为非全精度(如只有乘积的位宽度)。(3)假定累加器为全精度,最终累加值也大约会介于-8与8之间(如+4.2);不过,在此序列中“点A”前的乘积会较频繁地产生正值,而在点A后的乘积则会较频繁地产生负值。在此情况下,就可能取得不正确的结果(如+4.2以外的结果)。这是因为在点A前方的某些点,当需要使累加器达到一个超过其饱和最大值+8的数值,如+8.2,就会损失多出的0.2。累加器甚至会使剩下的乘积累加结果维持在饱和值,而会损失更多正值。因此,累加器的最终值可能会小于使用具有全精度位宽度的累加器所计算的数值(即小于+4.2)。正类型转换器3004会在累加器202数值217为负时,将其转换为正类型,并产生额外位指出原本数值的正负,这个位会随同此数值向下传递至启动函数单元212管线。将负数转换为正类型可以简化后续启动函数单元121的运算。举例来说,经此处理后,只有正值会输入双曲正切模块3022与S型模块3024,因而可以简化这些模块的设计。此外,也可以简化舍入器3004与饱和器3008。输出二进制小数点对准器3002会向右移动或缩放此正类型值,使其对准于控制缓存器127内指定的输出二进制小数点2954。就一较佳实施例而言,输出二进制小数点对准器3002会计算累加器202数值217的小数位数(例如由累加器二进制小数点2923所指定或是数据二进制小数点2922与权重二进制小数点2924的加总)减去输出的小数位数(例如由输出二进制小数点2954所指定)的差值作为偏移量。如此,举例来说,若是累加器202二进制小数点2923为8(即上述实施例)而输出二进制小数点2954为3,输出二进制小数点对准器3002就会将此正类型数值右移5个位以产生提供至多工器3006与舍入器3004的结果。舍入器3004会对累加器202数值217执行舍入运算。就一较佳实施例而言,舍入器3004会对正类型转换器与输出二进制小数点对准器3002产生的正类型数值产生一个舍入后版本,并将此舍入后版本提供至多工器3006。舍入器3004会依据前述舍入控制2932执行舍入运算,如本文所述,前述舍入控制会包括使用随机位3005的随机舍入。多工器3006会依据舍入控制2932(如本文所述,可包含随机舍入),在其多个输入中选择其一,也就是来自正类型转换器与输出二进制小数点对准器3002的正类型数值或是来自舍入器3004的舍入后版本,并且将选择后的数值提供给标准尺寸压缩器与饱和器3008。就一较佳实施例而言,若是舍入控制指定不进行舍入,多工器3006就会选择正类型转换器与输出二进制小数点对准器3002的输出,否则就会选择舍入器3004的输出。在其它实施例中,也可由启动函数单元212执行额外的舍入运算。举例来说,在一实施例中,当位选择器3012对标准尺寸压缩器与饱和器3008的输出(如后述)位进行压缩时,位选择器3012会基于遗失的低顺位位进行舍入运算。在另一个范例中,倒数乘法器3014(如后述)的乘积会被施以舍入运算。在又一个范例中,尺寸转换器3036需要转换出适当的输出尺寸(如后述),此转换可能涉及丢去某些用于决定舍入的低顺位位,就会执行舍入运算。标准尺寸压缩器3008会将多工器3006输出值压缩至标准尺寸。因此,举例来说,若是神经处理单元126是处于窄配置或漏斗配置2902,标准尺寸压缩器3008可将28位的多工器3006输出值压缩至16位;而若是神经处理单元126是处于宽配置2902,标准尺寸压缩器3008可将41位的多工器3006输出值压缩至32位。不过,在压缩至标准尺寸前,若是压缩前值大于标准型式所能表达的最大值,饱和器3008就会使此压缩前值填满至标准型式所能表达的最大值。举例来说,若是压缩前值中位于最高有效压缩前值位左侧的任何位都是数值1,饱和器3008就会填满至最大值(如填满为全部1)。就一较佳实施例而言,双曲正切模块3022、S型模块3024、以及软加模块3026都包含查找表,如可程序化逻辑阵列(PLA)、只读存储器(ROM)、组合逻辑闸等等。在一实施例中,为了简化并缩小这些模块3022/3024/3026的尺寸,提供至这些模块的输入值具有3.4的型式,即三个整数字元与四个小数位,也即输入值具有四个位位于二进制小数点右侧并且具有三个位位于二进制小数点左侧。因为在3.4型式的输入值范围(-8,+8)的极端处,输出值会渐近地靠近其最小/最大值,因此选择这些数值。不过,本发明并不限于此,本发明也可应用于其它将二进制小数点放置在不同位置的实施例,如以4.3型式或2.5型式。位选择器3012会在标准尺寸压缩器与饱和器3008输出的位中选择选择满足3.4型式规范的位,此涉及压缩处理,也就是会丧失某些位,因为标准型式则具有较多的位数。不过,在选择/压缩标准尺寸压缩器与饱和器3008输出值之前,若是压缩前值大于3.4型式所能表达的最大值,饱和器3012就会使压缩前值填满至3.4型式所能表达的最大值。举例来说,若是压缩前值中位于最高有效3.4型式位左侧的任何位都是数值1,饱和器3012就会填满至最大值(如填满至全部1)。双曲正切模块3022、S型模块3024与软加模块3026会对标准尺寸压缩器与饱和器3008输出的3.4型式数值执行相对应的启动函数(如前述)以产生一结果。就一较佳实施例而言,双曲正切模块3022与S型模块3024所产生的是一个0.7型式的7位结果,即零个整数字元与七个小数位,也即输入值具有七个位位于二进制小数点右侧。就一较佳实施例而言,软加模块3026产生的是一个3.4型式的7位结果,即其型式与此模块3026的输入型式相同。就一较佳实施例而言,双曲正切模块3022、S型模块3024与软加模块3026的输出会被延展至标准型式(例如在必要时加上前导零)并对准而使二进制小数点由输出二进制小数点2954数值所指定。校正器3018会产生标准尺寸压缩器与饱和器3008的输出值的校正后版本。也就是说,若是标准尺寸压缩器与饱和器3008的输出值(如前述其符号以管线下移)为负,校正器3018会输出零值;否则,校正器3018就会将其输入值输出。就一较佳实施例而言,校正器3018的输出为标准型式并具有由输出二进制小数点2954数值所指定的二进制小数点。倒数乘法器3014会将标准尺寸压缩器与饱和器3008的输出与指定于倒数值2942的使用者指定倒数值相乘,以产生标准尺寸的乘积,此乘积实际上即为标准尺寸压缩器与饱和器3008的输出值,以倒数值2942的倒数作为除数计算出来的商数。就一较佳实施例而言,倒数乘法器3014的输出为标准型式并具有由输出二进制小数点2954数值指定的二进制小数点。向右移位器3016会将标准尺寸压缩器与饱和器3008的输出,以指定于偏移量值2944的使用者指定位数进行移动,以产生标准尺寸的商数。就一较佳实施例而言,向右移位器3016的输出为标准型式并具有由输出二进制小数点2954数值指定的二进制小数点。多工器3032选择启动函数2934值所指定的适当输入,并将其选择提供至符号恢复器3034,若是原本的累加器202数值217为负值,符号恢复器3034就会将多工器3032输出的正类型数值转换为负类型,例如转换为二补码类型。尺寸转换器3036会依据如图29A所述的输出命令2956的数值,将符号恢复器3034的输出转换至适当的尺寸。就一较佳实施例而言,符号恢复器3034的输出具有一个由输出二进制小数点2954数值指定的二进制小数点。就一较佳实施例而言,对于输出命令的第一默认值而言,尺寸转换器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的上方文字。如前述,就一较佳实施例而言,启动函数单元212会在未经处理的累加器202数值217的上方文字加上零值上方位。图31为显示图30的启动函数单元212的运作的一范例。如图中所示,神经处理单元126的配置2902设定为窄配置。此外,带符号数据2912与带符号权重2914值为真。此外,数据二进制小数点2922值表示对于数据随机存取存储器122文字而言,其二进制小数点位置右侧有7个位,神经处理单元126所接收的第一数据文字的一范例值呈现为0.1001110。此外,权重二进制小数点2924值表示对于权重随机存取存储器124文字而言,其二进制小数点位置右侧有3个位,神经处理单元126所接收的第一权重文字的范例值呈现为00001.010。第一数据与权重文字的16位乘积(此乘积会与累加器202的初始零值相加)呈现为000000.1100001100。因为数据二进制小数点2912是7而权重二进制小数点2914是3,对于所隐含的累加器202二进制小数点而言,其右侧会有10个位。在窄配置的情况下,如本实施例所示,累加器202具有28个位宽。举例来说,完成所有算术逻辑运算后(例如图20全部1024个乘法累加运算),累加器202的数值217会是000000000000000001.1101010100。输出二进制小数点2954值表示输出的二进制小数点右侧有7个位。因此,在传递输出二进制小数点对准器3002与标准尺寸压缩器3008之后,累加器202数值217会被缩放、舍入与压缩至标准型式的数值,即000000001.1101011。在此范例中,输出二进制小数点地址表示7个小数位,而累加器202二进制小数点位置表示10个小数位。因此,输出二进制小数点对准器3002会计算出差值3,并透过将累加器202数值217右移3个位以对其进行缩放。在图31中即显示累加器202数值217会丧失3个最低有效位(二进制数100)。此外,在此范例中,舍入控制2932值表示使用随机舍入,并且在此范例中假定取样随机位3005为真。如此,如前述,最低有效位就会被向上舍入,这是因为累加器202数值217的舍入位(这3个因为累加器202数值217的缩放运算而被移出的位中的最高有效位)为一,而黏位(这3个因为累加器202数值217的缩放运算而被移出的位中,2个最低有效位的布尔或运算结果)为零。在本范例中,启动函数2934表示所使用的是S型函数。如此,位选择器3012就会选择标准型式值的位而使S型模块3024的输入具有三个整数字元与四个小数位,如前述,即所示的数值001.1101。S型模块3024的输出数值会放入标准型式中,即所示的数值000000000.1101110。此范例的输出命令2956指定第一默认值,即输出配置2902表示的文字尺寸,在此情况下即窄文字(8位)。如此,尺寸转换器3036会将标准S型输出值转换为一个8位量,其具有一个隐含的二进制小数点,即在此二进制小数点右侧有7个位,而产生一个输出值01101110,如图中所示。图32为显示图30的启动函数单元212的运作的第二个范例。图32的范例描述当启动函数2934表示以标准尺寸传递累加器202数值217时,启动函数单元212的运算。如图中所示,此配置2902设定为神经处理单元216的窄配置。在此范例中,累加器202的宽度为28个位,累加器202二进制小数点的位置右侧有10个位(这是因为在一实施例中数据二进制小数点2912与权重二进制小数点2914的加总为10,或者在另一实施例中累加器二进制小数点2923明确被指定为具有数值10)。举例来说,在执行所有算术逻辑运算后,图32所示的累加器202数值217为000001100000011011.1101111010。在此范例中,输出二进制小数点2954值表示对于输出而言,二进制小数点右侧有4个位。因此,在传递输出二进制小数点对准器3002与标准尺寸压缩器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的启动函数单元212的运作的第三个范例。图33的范例揭示当启动函数2934表示要传递整个未经处理的累加器202数值217时启动函数单元212的运作。如图中所示,此配置2902设定为神经处理单元126的宽配置(例如16位的输入文字)。在此范例中,累加器202的宽度为41个位,累加器202二进制小数点位置的右侧有8个位(这是因为在一实施例中数据二进制小数点2912与权重二进制小数点2914的加总为8,或者在另一实施例中累加器二进制小数点2923明确被指定为具有数值8)。举例来说,在执行所有算术逻辑运算后,图33所示的累加器202数值217为001000000000000000001100000011011.11011110。此范例中显示三个输出命令2956。第一个输出命令指定第四默认值,即输出未经处理的累加器202数值的下方文字;第二个输出命令指定第五默认值,即输出未经处理的累加器202数值的中间文字;而第三个输出命令指定第六默认值,即输出未经处理的累加器202数值的上方文字。因为配置2902所指示的尺寸为宽文字(16位),如图33所示,因应第一输出命令2956,多工器3037会选择16位值0001101111011110;因应第二输出命令2956,多工器3037会选择16位值0000000000011000;而因应第三输出命令2956,多工器3037会选择16位值0000000001000000。如前述,神经网络单元121即可执行于整数数据而非浮点数据。如此,即有助于简化个个神经处理单元126,或至少其中的算术逻辑单元204部分。举例来说,这个算术逻辑单元204就不需要为了乘法器242而纳入在浮点运算中需用来将乘数的指数相加的加法器。类似地,这个算术逻辑单元204就不需要为了加法器234而纳入在浮点运算中需用来对准加数的二进制小数点的移位器。所属
技术领域:
:具有通常知识者当能理解,浮点单元往往非常复杂;因此,本文所述的范例仅针对算术逻辑单元204进行简化,利用所述具有硬件定点辅助而让使用者可指定相关二进制小数点的整数实施例也可用于对其他部分进行简化。相较于浮点的实施例,使用整数单元作为算术逻辑单元204可以产生一个较小(且较快)的神经处理单元126,而有利于将一个大型的神经处理单元126阵列整合进神经网络单元121内。启动函数单元212的部分可以基于使用者指定、累加数需要的小数位数量以及输出值需要的小数位数量,来处理累加器202数值217的缩放与饱和运算,而较佳者基于使用者指定。任何额外复杂度与伴随的尺寸增加,以及启动函数单元212的定点硬件辅助内的能源和/或时间耗损,都可以透过在算术逻辑单元204间共享启动函数单元212的方式来进行分摊,这是因为如图11的实施例所示,采用共享方式的实施例可以减少启动函数单元1112的数量。本文所述的实施例可以享有许多利用整数算数单元以降低硬件复杂度的优点(相较于使用浮点算术单元),而同时还能用于小数的算术运算,即具有二进制小数点的数字。浮点算术的优点在于它可以提供数据算术运算给数据的个别数值落在一个非常广的数值范围内(实际上只受限于指数范围的大小,因此会是一个非常大的范围)。也就是说,每个浮点数具有其潜在独一无二的指数值。不过,本文所述的实施例理解到并利用某些应用中具有输入数据高度平行且落于一相对较窄的范围内而使所有平行数据具有相同“指数”的特性。如此,这些实施例让使用者将二进制小数点位置一次指定给所有的输入值和/或累加值。类似地,透过理解并利用平行输出具有类似范围的特性,这些实施例让使用者将二进制小数点位置一次指定给所有的输出值。人工神经网络是此种应用的一范例,不过本发明的实施例也可应用于执行其它应用的计算。透过将二进制小数点位置一次指定给多个输入而非给对个别的输入数,相较于使用浮点运算,本发明的实施例可以更有效率地利用记忆空间(如需要较少的存储器)以及/或在使用类似数量的存储器的情况下提升精度,这是因为用于浮点运算的指数的位可用来提升数值精度。此外,本发明的实施例理解到在对一个大型系列的整数运算(如溢位或丧失较不重要的小数位)执行累加时可能丧失精度,因此提供一个解决方法,主要是利用一个足够大的累加器来避免精度丧失。神经网络单元微运算的直接执行图34为显示图1的处理器100以及神经网络单元121的部分细节的方块示意图。神经网络单元121包括神经处理单元126的管线级3401。各个管线级3401以级缓存器区分,并包括组合逻辑以达成本文的神经处理单元126的运算,如布尔逻辑闸、多工器、加法器、乘法器、比较器等等。管线级3401从多工器3402接收微运算3418。微运算3418会向下流动至管线级3401并控制其组合逻辑。微运算3418是一个位集合。就一较佳实施例而言,微运算3418包括数据随机存取存储器122存储器地址123的位、权重随机存取存储器124存储器地址125的位、程序存储器129存储器地址131的位、多任务缓存器208/705控制信号213/713、还有许多控制缓存器217的字段(例如图29A至图29C的控制缓存器)。在一实施例中,微运算3418包括大约120个位。多工器3402从三个不同的来源接收微运算,并选择其中一个作为提供给管线级3401的微运算3418。多工器3402的一个微运算来源为图1的定序器128。定序器128会将由程序存储器129接收的神经网络单元指令译码并据以产生一个微运算3416提供至多工器3402的第一输入。多工器3402的第二个微运算来源为从图1的保留站108接收微指令105以及从通用缓存器116与媒体缓存器118接收操作数的译码器3404。就一较佳实施例而言,如前述,微指令105由指令转译器104因应MTNN指令1400与MFNN指令1500的转译所产生。微指令105可包括一个立即字段以指定一特定函数(由一个MTNN指令1400或一个MFNN指令1500所指定),例如程序存储器129内程序的开始与停止执行、直接从媒体缓存器118执行一微运算、或是如前述读取/写入神经网络单元的存储器。译码器3404会将微指令105译码并据以产生一个微运算3412提供至多工器的第二输入。就一较佳实施例而言,对于MTNN指令1400/MFNN指令1500的某些函数1432/1532而言,译码器3404不需要产生一个微运算3412向下传送至管线3401,例如写入控制缓存器127、开始执行程序存储器129内的程序、暂停执行程序存储器129内的程序、等待程序存储器129内的程序完成执行、从状态缓存器127读取以及重设神经网络单元121。多工器3402的第三个微运算来源为媒体缓存器118本身。就一较佳实施例而言,如前文对应于图14所述,MTNN指令1400可指定一函数以指示神经网络单元121直接执行一个由媒体缓存器118提供至多工器3402的第三输入的微运算3414。直接执行由架构媒体缓存器118提供的微运算3414有利于对神经网络单元121进行测试,如内建自我测试(BIST),或除错的动作。就一较佳实施例而言,译码器3404会产生一个模式指针3422控制多工器3402的选择。当MTNN指令1400指定一个函数开始执行一个来自程序存储器129的程序,译码器3404会产生一模式指针3422值使多工器3402选择来自定序器128的微运算3416,直到发生错误或直到译码器3404碰到一个MTNN指令1400指定一个函数停止执行来自程序存储器129的程序。当MTNN指令1400指定一个函数指示神经网络单元121直接执行由媒体缓存器118提供的一微运算3414,译码器3404会产生一个模式指针3422值使多工器3402选择来自所指定的媒体缓存器118的微运算3414。否则,译码器3404就会产生一个模式指针3422值使多工器3402选择来自译码器3404的微运算3412。可变率神经网络单元在许多情况下,神经网络单元121执行程序后就会进入待机状态(idle)等待处理器100处理一些需要在执行下一个程序前处理的事情。举例来说,假设处在一个类似于图3至图6A所述的情况,神经网络单元121会对一乘法累加启动函数程序(也可称为前授神经网络层程序(feedforwardneuralnetworklayerprogram))连续执行两次或更多次。相较于神经网络单元121执行程序所花费的时间,处理器100明显需要花费较长的时间来将512KB的权重值写入权重随机存取存储器124以供下一次神经网络单元程序使用。换言之,神经网络单元121会在短时间内执行程序,随后就进入待机状态,直到处理器100将接下来的权重值写入权重随机存取存储器124供下一次程序执行使用。此情况可参照图36A,详如后述。在此情况下,神经网络单元121可采用较低时频率运行以延长执行程序的时间,藉以使执行程序所需的能源消耗分散至较长的时间范围,而使神经网络单元121,乃至于整个处理器100,维持在较低温度。此情况称为缓和模式,可参照图36B,详如后述。图35为一方块图,显示具有可变率神经网络单元121的处理器100。此处理器100类似于图1的处理器100,并且图中具有相同标号的组件也相类似。图35的处理器100并具有时频产生逻辑3502耦接至处理器100的功能单元,这些功能单元即指令撷取单元101,指令快取102,指令转译器104,重命名单元106,保留站108,神经网络单元121,其它执行单元112,存储器子系统114,通用缓存器116与媒体缓存器118。时频产生逻辑3502包括时频产生器,例如锁相回路(PLL),以产生一个具有主要时频率或称时频频率的时频信号。举例来说,此主要时频率可以是1GHz,1.5GHz,2GHz等等。时频率即表示每秒的周期数,如时频信号在高低状态间的震荡次数。较佳地,此时频信号具有平衡周期(dutycycle),即此周期的一半为高状态而另一半为低状态;另外,此时频信号也可具有非平衡周期,也就是时频信号处在高状态的时间长于其处在低状态的时间,反之亦然。较佳地,锁相回路用以产生多个时频率的主要时频信号。较佳地,处理器100包括电源管理模块,依据多种因素自动调整主要时频率,这些因素包括处理器100的动态侦测操作温度,利用率(utilization),以及来自系统软件(如操作系统,基本输入输出系统(BIOS))指示所需效能和/或节能指标的命令。在一实施例中,电源管理模块包括处理器100的微码。时频产生逻辑3502并包括时频散布网络,或时频树(clocktree)。时频树会将主要时频信号散布至处理器100的功能单元,如图35所示,此散布动作就是将时频信号3506-1传送至指令撷取单元101,将时频信号3506-2传送至指令快取102,将时频信号3506-10传送至指令转译器104,将时频信号3506-9传送至重命名单元106,将时频信号3506-8传送至保留站108,将时频信号3506-7传送至神经网络单元121,将时频信号3506-4传送至其它执行单元112,将时频信号3506-3传送至存储器子系统114,将时频信号3506-5传送至通用缓存器116,以及将时频信号3506-6传送至媒体缓存器118,这些信号集体称为时频信号3506。此时频树具有节点或线,以传送主要时频信号3506至其相对应的功能单元。此外,较佳地,时频产生逻辑3502可包括时频缓冲器,在需要提供较干净的时频信号和/或需要提升主要时频信号的电压准位时,特别是对于较远的节点,时频缓冲器可重新产生主要时频信号。此外,各个功能单元并具有其自身的子时频树,在需要时重新产生和/或提升所接收的相对应主要时频信号3506的电压准位。神经网络单元121包括时频降低逻辑3504,时频降低逻辑3504接收缓和指针3512与主要时频信号3506-7,以产生第二时频信号。第二时频信号具有时频率。此时频率若非相同于主要时频率,就是处于缓和模式从主要时频率降低数值以减少热能产生,此数值程序化至缓和指针3512。时频降低逻辑3504类似于时频产生逻辑3502,其具有时频散布网络,或时频树,以散布第二时频信号至神经网络单元121的多种功能方块,此散布动作就是将时频信号3508-1传送至神经处理单元阵列126,将时频信号3508-2传送至定序器128以即将时频信号3508-3传送至接口逻辑3514,这些信号集体称为第二时频信号3508。较佳地,这些神经处理单元126包括多个管线级3401,如图34所示,管线级3401包括管线分级缓存器,用以从时频降低逻辑3504接收第二时频信号3508-1。神经网络单元121还具有接口逻辑3514以接收主要时频信号3506-7与第二时频信号3508-3。接口逻辑3514耦接于处理器100前端的下部分(例如保留站108,媒体缓存器118与通用缓存器116)与神经网络单元121的多种功能方块间,这些功能方块实时频降低逻辑3504,数据随机存取存储器122,权重随机存取存储器124,程序存储器129与定序器128。接口逻辑3514包括数据随机存取存储器缓冲3522,权重随机存取存储器缓冲3524,图34的译码器3404,以及缓和指针3512。缓和指针3512装载一数值,此数值指定神经处理单元阵列126会以多慢的速度执行神经网络单元程序指令。较佳地,缓和指针3512指定一除数值N,时频降低逻辑3504将主要时频信号3506-7除以此除数值以产生第二时频信号3508,如此,第二时频信号的时频率就会是1/N。较佳地,N的数值可程序化为多个不同默认值中的任何一个,这些默认值可使时频降低逻辑3504对应产生多个具有不同时频率的第二时频信号3508,这些时频率小于主要时频率。在一实施例中,时频降低逻辑3504包括时频除法器电路,用以将主要时频信号3506-7除以缓和指针3512数值。在一实施例中,时频降低逻辑3504包括时频闸(如AND闸),时频闸可透过一启动信号来门控主要时频信号3506-7,启动信号在主要时频信号的每N个周期中只会产生一次真值。以一个包含计数器以产生启动信号的电路为例,此计数器可向上计数至N。当伴随的逻辑电路侦测到计数器的输出与N匹配,逻辑电路就会在第二时频信号3508产生一真值脉冲并重设计数器。较佳地,缓和指针3512数值可由架构指令予以程序化,例如图14的MTNN指令1400。较佳地,在架构程序指示神经网络单元121开始执行神经网络单元程序前,运作于处理器100的架构程序会将缓和值程序化至缓和指针3512,这部分在后续对应于图37处会有更详细的说明。权重随机存取存储器缓冲3524耦接于权重随机存取存储器124与媒体缓存器118之间作为其间数据传输的缓冲。较佳地,权重随机存取存储器缓冲3524类似于图17的缓冲器1704的一个或多个实施例。较佳地,权重随机存取存储器缓冲3524从媒体缓存器118接收数据的部分以具有主要时频率的主要时频信号3506-7作为时频,而权重随机存取存储器缓冲3524从权重随机存取存储器124接收数据的部分以具有第二时频率的第二时频信号3508-3作为时频,第二时频率可依据程序化于缓和指针3512的数值从主要时频率调降或否,也即依据神经网络单元121执行于缓和或正常模式来进行调降或否。在一实施例中,权重随机存取存储器124为单端口,如前文图17所述,权重随机存取存储器124还可由媒体缓存器118透过权重随机存取存储器缓冲3524,以及由神经处理单元126或图11的列缓冲1104,以仲裁方式(arbitratedfashion)存取。在另一实施例中,权重随机存取存储器124为双端口,如前文图16所述,各个端口可由媒体缓存器118透过权重随机存取存储器缓冲3524以及由神经处理单元126或列缓冲器1104以并行方式存取。类似于权重随机存取存储器缓冲3524,数据随机存取存储器缓冲3522耦接于数据随机存取存储器122与媒体缓存器118之间作为其间数据传送的缓冲。较佳地,数据随机存取存储器缓冲3522类似于图17的缓冲器1704的一个或多个实施例。较佳地,数据随机存取存储器缓冲3522从媒体缓存器118接收数据的部分以具有主要时频率的主要时频信号3506-7作为时频,而数据随机存取存储器缓冲3522从数据随机存取存储器122接收数据的部分以具有第二时频率的第二时频信号3508-3作为时频,第二时频率可依据程序化于缓和指针3512的数值从主要时频率调降或否,也即依据神经网络单元121执行于缓和或正常模式来进行调降或否。在一实施例中,数据随机存取存储器122为单端口,如前文图17所述,数据随机存取存储器122还可由媒体缓存器118透过数据随机存取存储器缓冲3522,以及由神经处理单元126或图11的列缓冲1104,以仲裁方式存取。在另一实施例中,数据随机存取存储器122为双端口,如前文图16所述,各个端口可由媒体缓存器118透过数据随机存取存储器缓冲3522以及由神经处理单元126或列缓冲器1104以并行方式存取。较佳地,不论数据随机存取存储器122和/或权重随机存取存储器124为单端口或双端口,接口逻辑3514会包括数据随机存取存储器缓冲3522与权重随机存取存储器缓冲3524以同步主要时频域与第二时频域。较佳地,数据随机存取存储器122,权重随机存取存储器124与程序存储器129都具有静态随机存取存储器(SRAM),其中包含个别的读取使能信号,写入使能信号与存储器选择使能信号。如前述,神经网络单元121是处理器100的执行单元。执行单元是处理器中执行架构指令转译出的微指令或是执行架构指令本身的功能单元,例如执行图1中架构指令103转译出的微指令105或是架构指令103本身。执行单元从处理器的通用缓存器接收操作数,例如从通用缓存器116与媒体缓存器118。执行单元执行微指令或架构指令后会产生一结果,此结果会被写入通用缓存器。图14与图15所述的MTNN指令1400与MFNN指令1500为架构指令103的范例。微指令用以实现架构指令。更精确来说,执行单元对于架构指令转译出的一个或多个微指令的集体执行,就会是对于架构指令所指定的输入执行架构指令所指定的运算,以产生架构指令定义的结果。图36A为一时序图,显示处理器100具有神经网络单元121运作于一般模式的一运作范例,此一般模式即以主要时频率运作。在时序图中,时间的进程是由左而右。处理器100以主要时频率执行架构程序。更精确来说,处理器100的前端(例如指令撷取单元101,指令快取102,指令转译器104,重命名单元106与保留站108)以主要时频率攫取,译码且发布架构指令至神经网络单元121与其它执行单元112。起初,架构程序执行架构指令(如MTNN指令1400),处理器前端100将此架构指令发布至神经网络单元121以指示神经网络单元121开始执行其程序存储器129内的神经网络单元程序。在之前,架构程序会执行架构指令将指定主要时频率的数值写入缓和指针3512,也即使神经网络单元处于一般模式。更精确地说,程序化至缓和指针3512的数值会使时频降低逻辑3504以主要时频信号3506的主要时频率产生第二时频信号3508。较佳地,在此范例中,时频降低逻辑3504的时频缓冲器单纯提升主要时频信号3506的电压准位。另外在之前,架构程序会执行架构指令以写入数据随机存取存储器122,权重随机存取存储器124并将神经网络单元程序写入程序存储器129。因应神经网络单元程序MTNN指令1400,神经网络单元121会开始以主要时频率执行神经网络单元程序,这是因为缓和指针3512是以主要时频率值予以程序化。神经网络单元121开始执行后,架构程序会持续以主要时频率执行架构指令,包括主要是以MTNN指令1400写入和/或读取数据随机存取存储器122与权重随机存取存储器124,以完成对于神经网络单元程序的下一次范例(instance),或称调用(invocation)或执行(run)的准备。在图36A的范例中,相较于架构程序完成对于数据随机存取存储器122与权重随机存取存储器124写入/读取所花费的时间,神经网络单元121能够以明显较少的时间(例如四分之一的时间)完成神经网络单元程序的执行。举例来说,以主要时频率运作的情况下,神经网络单元121花费大约1000个时频周期来执行神经网络单元程序,不过,架构程序会花费大约4000个时频周期。如此,神经网络单元121在剩下的时间内就会处于待机状态,在此范例中,这是一个相当长的时间,如大约3000个主要时频率周期。如图36A的范例所示,依据神经网络的大小与配置的不同,会再次执行前述模式,并可能持续执行许多次。因为神经网络单元121是处理器100中一个相当大且晶体管密集的功能单元,神经网络单元121的运作将会产生大量的热能,尤其是以主要时频率运作的时候。图36B为一时序图,显示处理器100具有神经网络单元121运作于缓和模式的一运作范例,缓和模式的运作时频率低于主要时频率。图36B的时序图类似于图36A,在图36A中,处理器100以主要时频率执行架构程序。此范例假定图36B中的架构程序与神经网络单元程序相同于图36A的架构程序与神经网络单元程序。不过,在启动神经网络单元程序之前,架构程序会执行MTNN指令1400以一数值程序化缓和指针3512,此数值会使时频降低逻辑3504以小于主要时频率的第二时频率产生第二时频信号3508。也就是说,架构程序会使神经网络单元121处于图36B的缓和模式,而非图36A的一般模式。如此,神经处理单元126就会以第二时频率执行神经网络单元程序,在缓和模式下,第二时频率小于主要时频率。此范例中假定缓和指针3512是以一个将第二时频率指定为四分之一主要时频率的数值予以程序化。如此,神经网络单元121在缓和模式下执行神经网络单元程序所花费的时间会是其于一般模式下花费时间的四倍,如图36A与图36B所示,透过比较此二图可发现神经网络单元121处于待机状态的时间长度会明显地缩短。如此,图36B中神经网络单元121执行神经网络单元程序消耗能量的持续时间大约会是图36A中神经网络单元121在一般模式下执行程序的四倍。因此,图36B中神经网络单元121执行神经网络单元程序在单位时间内产生的热能大约会是图36A的四分之一,而具有本文所述的优点。图37为一流程图,显示图35的处理器100的运作。此流程图描述的运作类似于前文对应于图35,图36A与图36B图的运作。此流程始于步骤3702。在步骤3702中,处理器100执行MTNN指令1400而将权重写入权重随机存取存储器124并且将数据写入数据随机存取存储器122。接下来流程前进至步骤3704。在步骤3704中,处理器100执行MTNN指令1400而以一个数值程序化缓和指针3512,此数值指定一个低于主要时频率的时频率,也即使神经网络单元121处于缓和模式。接下来流程前进至步骤3706。在步骤3706中,处理器100执行MTNN指令1400指示神经网络单元121开始执行神经网络单元程序,即类似图36B所呈现的方式。接下来流程前进至步骤3708。在步骤3708中,神经网络单元121开始执行此神经网络单元程序。同时,处理器100会执行MTNN指令1400而将新的权重写入权重随机存取存储器124(可能也会将新的数据写入数据随机存取存储器122),以及/或执行MFNN指令1500而从数据随机存取存储器122读取结果(可能也会从权重随机存取存储器124读取结果)。接下来流程前进至步骤3712。在步骤3712中,处理器100执行MFNN指令1500(例如读取状态缓存器127),以侦测神经网络单元121已结束程序执行。假设架构程序选择一个好的缓和指针3512数值,神经网络单元121执行神经网络单元程序所花费的时间就会相同于处理器100执行部分架构程序以存取权重随机存取存储器124和/或数据随机存取存储器122所花费的时间,如图36B所示。接下来流程前进至步骤3714。在步骤3714,处理器100执行MTNN指令1400而利用一数值程序化缓和指针3512,此数值指定主要时频率,也即使神经网络单元121处于一般模式。接下来前进至步骤3716。在步骤3716中,处理器100执行MTNN指令1400指示神经网络单元121开始执行神经网络单元程序,即类似图36A所呈现的方式。接下来流程前进至步骤3718。在步骤3718中,神经网络单元121开始以一般模式执行神经网络单元程序。此流程终止于步骤3718。如前述,相较于在一般模式下执行神经网络单元程序(即以处理器的主要时频率执行),在缓和模式下执行可以分散执行时间而能避免产生高温。进一步来说,当神经网络单元在缓和模式执行程序时,神经网络单元是以较低的时频率产生热能,这些热能可以顺利地经由神经网络单元(例如半导体装置,金属层与下方的基材)与周围的封装体以及冷却机构(如散热片,风扇)排出,也因此,神经网络单元内的装置(如晶体管,电容,导线)就比较可能在较低的温度下运作。整体来看,在缓和模式下运作也有助于降低处理器晶粒的其它部分内的装置温度。较低的运作温度,特别是对于这些装置的接面温度而言,可以减轻漏电流的产生。此外,因为单位时间内流入的电流量降低,电感噪声与IR压降噪声也会降低。此外,温度降低对于处理器内的金氧半场效晶体管(MOSFET)的负偏压温度不稳定性(NBTI)与正偏压不稳定性(PBSI)也有正面影响,而能提升可靠度和/或装置以及处理器部分的寿命。温度降低并可减轻处理器的金属层内的焦耳热与电迁移效应。关于神经网络单元共享资源的架构程序与非架构程序间的沟通机制如前述,在图24至图28与图35至图37的范例中,数据随机存取存储器122与权重随机存取存储器124的资源是共享的。神经处理单元126与处理器100的前端共享数据随机存取存储器122与权重随机存取存储器124。更精确地说,神经处理单元126与处理器100的前端,如媒体缓存器118,都会对数据随机存取存储器122与权重随机存取存储器124进行读取与写入。换句话说,执行于处理器100的架构程序与执行于神经网络单元121的神经网络单元程序会共享数据随机存取存储器122与权重随机存取存储器124,而在某些情况下,如前所述,需要对于架构程序与神经网络单元程序间的流程进行控制。程序存储器129的资源在一定程度下也是共享的,这是因为架构程序会对其进行写入,而定序器128会对其进行读取。本文所述的实施例提供一高效能的解决方案,以控制架构程序与神经网络单元程序间存取共享资源的流程。在本文所述的实施例中,神经网络单元程序也称为非架构程序,神经网络单元指令也称为非架构指令,而神经网络单元指令集(如前所述也称为神经处理单元指令集)也称为非架构指令集。非架构指令集不同于架构指令集。在处理器100内包含指令转译器104将架构指令转译出微指令的实施例中,非架构指令集也不同于微指令集。图38为一方块图,详细显示神经网络单元121的序列器128。序列器128提供存储器地址至程序存储器129,以选择提供给序列器128的非架构指令,如前所述。如图38所示,存储器地址装载于定序器128的程序计数器3802内。定序器128通常会以程序存储器129的地址顺序循序递增,除非定序器128遭遇到非架构指令,例如循环或分支指令,而在此情况下,定序器128会将程序计数器3802更新为控制指令的目标地址,即更新为位于控制指令的目标的非架构指令的地址。因此,装载于程序计数器3802的地址131会指定当前被攫取以供神经处理单元126执行的非架构程序的非架构指令在程序存储器129中的地址。程序计数器3802的数值可由架构程序透过状态缓存器127的神经网络单元程序计数器字段3912而取得,如后续图39所述。如此可使架构程序依据非架构程序的进度,决定对于数据随机存存储器122和/或权重随机存取存储器124读取/写入数据的位置。定序器128还包括循环计数器3804,此循环计数器3804会搭配非架构循环指令进行运作,例如图26A中地址10的循环至1指令与图28中地址11的循环至1指令。在图26A与图28的范例中,循环计数器3804内加载地址0的非架构初始化指令所指定的数值,例如加载数值400。每一次定序器128遭遇到循环指令而跳跃至目标指令(如图26A中位于地址1的乘法累加指令或是图28中位于地址1的maxwacc指令),定序器128就会使循环计数器3804递减。一旦循环计数器3804减少到零,定序器128就转向排序在下一个的非架构指令。在另一实施例中,首次遭遇到循环指令时会在循环计数器内加载一个循环指令中指定的循环计数值,以省去利用非架构初始化指令初始化循环计数器3804的需求。因此,循环计数器3804的数值会指出非架构程序的循环组尚待执行的次数。循环计数器3804的数值可由架构程序透过状态缓存器127的循环计数字段3914取得,如后续图39所示。如此可使架构程序依据非架构程序的进度,决定对于数据随机存存储器122和/或权重随机存取存储器124读取/写入数据的位置。在一实施例中,定序器包括三个额外的循环计数器以搭配非架构程序内的巢套循环,这三个循环计数器的数值也可透过状态缓存器127读取。循环指令中具有一位以指示这四个循环计数器中哪一个是提供给当前的循环指令使用。定序器128还包括迭代次数计数器3806。迭代次数计数器3806搭配非架构指令,例如图4,图9,图20与图26A中地址2的乘法累加指令,以及图28中地址2的maxwacc指令,这些指令在此后将会被称为“执行”指令。在前述范例中,各个执行指令分别指定执行计数511,511,1023,2与3。当定序器128遭遇到一个指定一非零迭代计数的执行指令时,定序器128会以此指定值加载迭代次数计数器3806。此外,定序器128会产生适当的微运算3418以控制图34中神经处理单元126管线级3401内的逻辑执行,并且使迭代次数计数器3806递减。若是迭代次数计数器3806大于零,定序器128会再次产生适当的微运算3418控制神经处理单元126内的逻辑并使迭代次数计数器3806递减。定序器128会持续以此方式运作,直到迭代次数计数器3806的数值归零。因此,迭代次数计数器3806的数值即为非架构执行指令内指定尚待执行的运算次数(这些运算如对于累加值与数据/权重文字进行乘法累加,取最大值,加总运算等)。迭代次数计数器3806的数值可利用架构程序透过状态缓存器127的迭代次数计数字段3916取得,如后续图39所述。如此可使架构程序依据非架构程序的进度,决定对于数据随机存存储器122和/或权重随机存取存储器124读取/写入数据的位置。图39为一方块图,显示神经网络单元121的控制与状态缓存器127的若干字段。这些字段包括包括神经处理单元126执行非架构程序最近写入的权重随机存取存储器列的地址2602,神经处理单元126执行非架构程序最近读取的权重随机存取存储器列的地址2604,神经处理单元126执行非架构程序最近写入的数据随机存取存储器列的地址2606,以及神经处理单元126执行非架构程序最近读取的数据随机存取存储器列的地址2608,如前述图26B所示。此外,这些字段还包括神经网络单元程序计数器3912字段,循环计数器3914字段,与迭代次数计数器3916字段。如前述,架构程序可将状态缓存器127内的数据读取至媒体缓存器118和/或通用缓存器116,例如透过MFNN指令1500读取包括神经网络单元程序计数器3912,循环计数器3914与迭代次数计数器3916字段的数值。程序计数器字段3912的数值反映图38中程序计数器3802的数值。循环计数器字段3914的数值反映循环计数器3804的数值。迭代次数计数器字段3916的数值反映迭代次数计数器3806的数值。在一实施例中,定序器128在每次需要调整程序计数器3802,循环计数器3804,或迭代次数计数器3806时,都会更新程序计数器字段3912,循环计数器字段3914与迭代次数计数器字段3916的数值,如此,当架构程序读取时这些字段的数值就会是当下的数值。在另一实施例中,当神经网络单元121执行架构指令以读取状态缓存器127时,神经网络单元121仅仅取得程序计数器3802,循环计数器3804与迭代次数计数器3806的数值并将其提供回架构指令(例如提供至媒体缓存器118或通用缓存器116)。由此可以发现,图39的状态缓存器127的字段的数值可以理解为非架构指令由神经网络单元执行的过程中,其执行进度的信息。关于非架构程序执行进度的某些特定面向,如程序计数器3802数值,循环计数器3804数值,迭代次数计数器3806数值,最近读取/写入的权重随机存取存储器124地址125的字段2602/2604,以及最近读取/写入的数据随机存取存储器122地址123的字段2606/2608,已于先前的章节进行描述。执行于处理器100的架构程序可以从状态缓存器127读取图39的非架构程序进度值并利用这些信息来做决策,例如透过如比较与分支指令等架构指令来进行。举例来说,架构程序会决定对于数据随机存取存储器122和/或权重随机存取存储器124进行数据/权重的读取/写入的列,以控制数据随机存取存储器122或权重随机存取存储器124的数据的流入与流出,尤其是针对大型数据组和/或不同非架构指令的重迭执行。这些利用架构程序进行决策的范例可参照本文前后章节的描述。举例来说,如前文图26A所述,架构程序设定非架构程序将卷积运算的结果写回数据随机存取存储器122中卷积核2402上方的列(如列8上方),而当神经网络单元121利用最近写入数据随机存取存储器122列2606的地址写入结果时,架构程序会从数据随机存取存储器122读取此结果。在另一范例中,如前文图26B所述,架构程序利用来自图38的状态缓存器127字段的信息确认非架构程序将图24的数据阵列2404分成5个512x1600的数据块以执行卷积运算的进度。架构程序将此2560x1600数据阵列的第一个512x1600数据块写入权重随机存取存储器124并启动非架构程序,其循环计数为1600而权重随机存取存储器124初始化的输出列为0。神经网络单元121执行非架构程序时,架构程序会读取状态缓存器127以确认权重随机存取存储器124的最近写入列2602,如此架构程序就可读取由非架构程序写入的有效卷积运算结果,并且在读取后利用下一个512x1600数据块覆写此有效卷积运算结果,如此,在神经网络单元121完成非架构程序对于第一个512x1600数据块的执行后,处理器100在必要时就可立即更新非架构程序并再次启动非架构程序以执行下一个512x1600数据块。在另一范例中,假定架构程序使神经网络单元121执行一系列典型的神经网络乘法累加启动函数,其中,权重被储存于权重随机存取存储器124而结果会被写回数据随机存取存储器122。在此情况下,架构程序读取权重随机存取存储器124的一列后就不会再对其进行读取。如此,在当前的权重已经被非架构程序读取/使用后,就可以利用架构程序开始将新的权重复写权重随机存取存储器124上的权重,以提供非架构程序的下一次范例(例如下一个神经网络层)使用。在此情况下,架构程序会读取状态缓存器127以取得权重随机存取存储器的最近读取列2604的地址以决定其于权重随机存取存储器124中写入新权重组的位置。在另一个范例中,假定架构程序知道非架构程序内包括一个具有大迭代次数计数的执行指令,如图20中地址2的非架构乘法累加指令。在此情况下,架构程序需要知道迭代次数计数3916,方能知道大致上还需要多少个时频周期才能完成此非架构指令以决定架构程序接下来所要采取两个或多个动作之一的何者。举例来说,若是需要很长的时间才能完成执行,架构程序就会放弃控制给另一个架构程序,例如操作系统。类似地,假定架构程序知道非架构程序包括一个具有相当大的循环计数的循环组,例如图28的非架构程序。在此情况下,架构程序会需要知道循环计数3914,方能知道大致上还需要多少个时频周期才能完成此非架构指令以决定接下来所要采取两个或多个动作之一的何者。在另一范例中,假定架构程序使神经网络单元121执行类似于图27与图28所述的共源运算,其中所要共源的数据是储存在权重随机存取存储器124而结果会被写回权重随机存取存储器124。不过,不同于图27与图28的范例,假定此范例的结果会被写回权重随机存取存储器124的最上方400列,例如列1600至1999。在此情况下,非架构程序完成读取四列其所要共源的权重随机存取存储器124数据后,非架构程序就不会再次进行读取。因此,一旦当前四列数据都已被非架构程序读取/使用后,即可利用架构程序开始将新数据(如非架构程序的下一次范例的权重,举例来说,例如对取得数据执行典型乘法累加启动函数运算的非架构程序)覆写权重随机存取存储器124的数据。在此情况下,架构程序会读取状态缓存器127以取得权重随机存取存储器的最近读取列2604的地址,以决定新的权重组写入权重随机存取存储器124的位置。时间递归(recurrent)神经网络加速传统前馈神经网络不具有储存网络先前输入的存储器。前馈神经网络通常被用于执行在任务中随时间输入网络的多个输入是各自独立,且多个输出也是如此的任务。相较之下,时间递归神经网络通常有助于执行在任务中随时间输入至神经网络的输入顺序具有重要性的任务。(此处的顺序通常被称为时间步骤。)因此,时间递归神经网络包括一个概念上的存储器或称内部状态,以装载网络因应序列中的先前输入所执行的计算而产生的信息,时间递归神经网络的输出关联于此内部状态与下一个时间步骤的输入。下列任务,如语音辨识,语言模型,文字产生,语言翻译,影像描述产生以及某些形式的手写辨识,是时间递归神经网络可以执行良好的例子。三种习知的时间递归神经网络的范例为Elman时间递归神经网络,Jordan时间递归神经网络与长短期记忆(LSTM)神经网络。Elman时间递归神经网络包含内容节点以记忆当前时间步骤中时间递归神经网络的隐藏层状态,此状态在下一个时间步骤中会作为对于隐藏层的输入。Jordan时间递归神经网络类似于Elman时间递归神经网络,除了其中的内容节点会记忆时间递归神经网络的输出层状态而非隐藏层状态。长短期记忆神经网络包括由长短期记忆胞构成的一长短期记忆层。每个长短期记忆胞具有当前时间步骤的当前状态与当前输出,以及一个新的或后续时间步骤的新的状态与新的输出。长短期记忆胞包括输入闸与输出闸,以及遗忘闸,遗忘闸可以使神经元失去其所记忆的状态。这三种时间递归神经网络在后续章节会有更详细的描述。如本文所述,对于时间递归神经网络而言,如Elman或Jordan时间递归神经网络,神经网络单元每次执行都会使用时间步骤,取得一组输入层节点值,并执行必要计算使其透过时间递归神经网络进行传播,以产生输出层节点值以及隐藏层与内容层节点值。因此,输入层节点值会关联于计算隐藏,输出与内容层节点值的时间步骤;而隐藏,输出与内容层节点值会关联于产生这些节点值的时间步骤。输入层节点值是时间递归神经网络所仿真的系统的取样值,如影像,语音取样,商业市场数据的快照。对于长短期记忆神经网络而言,神经网络单元的每次执行都会使用一时间步骤,取得一组记忆胞输入值并执行必要计算以产生记忆胞输出值(以及记忆胞状态与输入闸,遗忘闸以及输出闸数值),这也可以理解为是透过长短期记忆层记忆胞传播记忆胞输入值。因此,记忆胞输入值会关联于计算记忆胞状态以及输入闸,遗忘闸与输出闸数值的时间步骤;而记忆胞状态以及输入闸,遗忘闸与输出闸数值会关联于产生这些节点值的时间步骤。内容层节点值,也称为状态节点,是神经网络的状态值,此状态值基于关联于先前时间步骤的输入层节点值,而不仅只关联于当前时间步骤的输入层节点值。神经网络单元对于时间步骤所执行的计算(例如对于Elman或Jordan时间递归神经网络的隐藏层节点值计算)是先前时间步骤产生的内容层节点值的一函数。因此,时间步骤开始时的网络状态值(内容节点值)会影响此时间步骤的过程中产生的输出层节点值。此外,时间步骤结束时的网络状态值会受到此时间步骤的输入节点值与时间步骤开始时的网络状态值影响。类似地,对于长短期记忆胞而言,记忆胞状态值关联于先前时间步骤的记忆胞输入值,而非仅只关联于当前时间步骤的记忆胞输入值。因为神经网络单元对于时间步骤执行的计算(例如下一个记忆胞状态的计算)是先前时间步骤产生的记忆胞状态值的函数,时间步骤开始时的网络状态值(记忆胞状态值)会影响此时间步骤中产生的记忆胞输出值,而此时间步骤结束时的网络状态值会受到此时间步骤的记忆胞输入值与先前网络状态值影响。图40为一方块图,显示Elman时间递归神经网络的一范例。图40的Elman时间递归神经网络包括输入层节点,或神经元,标示为D0,D1至Dn,集体称为多个输入层节点D而个别通称为输入层节点D;隐藏层节点/神经元,标示为Z0,Z1至Zn,集体称为多个隐藏层节点Z而个别通称为隐藏层节点Z;输出层节点/神经元,标示为Y0,Y1至Yn,集体称为多个输出层节点Y而个别通称为输出层节点Y;以及内容层节点/神经元,标示为C0,C1至Cn,集体称为多个内容层节点C而个别通称为内容层节点C。在图40的Elman时间递归神经网络的范例中,各个隐藏层节点Z具有一输入连结至各个输入层节点D的输出,并具有一输入连结至各个内容层节点C的输出;各个输出层节点Y具有一输入连结至各个隐藏层节点Z的输出;而各个内容层节点C具有一输入连结至相对应隐藏层节点Z的输出。在许多方面,Elman时间递归神经网络的运作类似于传统的前馈人工神经网络。也就是说,对于给定节点而言,此节点的各个输入连结都会有一个相关联的权重;节点在一输入连结收到的数值会和关联的权重相乘以产生一乘积;此节点会将关联于所有输入连结的乘积相加以产生一总数(此总数内可能还会包含一偏移项);一般而言,对此总数还会执行启动函数以产生节点的输出值,此输出值有时称为此节点的启动值。对于传统的前馈网络而言,数据总是沿着输入层至输出层的方向流动。也就是说,输入层提供一数值至隐藏层(通常会有多个隐藏层),而隐藏层会产生其输出值提供至输出层,而输出层会产生可被取用的输出。不过,不同于传统的前馈网络,Elman时间递归神经网络还包括一些反馈连结,也就是图40中从隐藏层节点Z至内容层节点C的连结。Elman时间递归神经网络的运作如下,当输入层节点D在一个新的时间步骤提供一输入值至隐藏层节点Z,内容节点C会提供一数值至隐藏层Z,此数值为隐藏层节点Z因应先前输入,也就是当前时间步骤,的输出值。从这个意义上来说,Elman时间递归神经网络的内容节点C是一个基于先前时间步骤的输入值的存储器。图41与图42将会对执行关联于图40的Elman时间递归神经网络的计算的神经网络单元121的运作实施例进行说明。为了说明本发明,Elman时间递归神经网络是一个包含至少一个输入节点层,一个隐藏节点层,一个输出节点层与一个内容节点层的时间递归神经网络。对于一给定时间步骤,内容节点层会储存隐藏节点层于前一个时间步骤产生且反馈至内容节点层的结果。此反馈至内容层的结果可以是启动函数的执行结果或是隐藏节点层执行累加运算而未执行启动函数的结果。图41为一方块图,显示当神经网络单元121执行关联于图40的Elman时间递归神经网络的计算时,神经网络单元121的数据随机存取存储器122与权重随机存取存储器124内的数据配置的一范例。在图41的范例中假定图40的Elman时间递归神经网络具有512个输入节点D,512个隐藏节点Z,512个内容节点C,与512个输出节点Y。此外,也假定此Elman时间递归神经网络为完全连结,即全部512个输入节点D均连结各个隐藏节点Z作为输入,全部512个内容节点C均连结各个隐藏节点Z作为输入,而全部512个隐藏节点Z均连结各个输出节点Y作为输入。此外,此神经网络单元121配置为512个神经处理单元126或神经元,例如采宽配置。最后,此范例假定关联于内容节点C至隐藏节点Z的连结的权重均为数值1,因而不需储存这些为一的权重值。如图中所示,权重随机存取存储器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,列511装载关联于由输入节点D511至隐藏节点Z的输入连结的权重,也即,文字0会装载关联于输入节点D511与隐藏节点Z0间的连结的权重,文字1会装载关联于输入节点D511与隐藏节点Z1间的连结的权重,文字2会装载关联于输入节点D511与隐藏节点Z2间的连结的权重,依此类推,文字511会装载关联于输入节点D511与隐藏节点Z511间的连结的权重。此配置与用途类似于前文对应于图4至图6A所述的实施例。如图中所示,权重随机存取存储器124的后续512列(列512至1023)是以类似的方式装载关联于隐藏节点Z与输出节点Y间的连结的权重。数据随机存取存储器122装载Elman时间递归神经网络节点值供一系列时间步骤使用。进一步来说,数据随机存取存储器122以三列为组装载提供给定时间步骤的节点值。如图中所示,以一个具有64列的数据随机存取存储器122为例,此数据随机存取存储器122可装载供20个不同时间步骤使用的节点值。在图41的范例中,列0至2装载供时间步骤0使用的节点值,列3至5装载供时间步骤1使用的节点值,依此类推,列57至59装载供时间步骤19使用的节点值。各组中的第一列装载此时间步骤的输入节点D的数值。各组中的第二列装载此时间步骤的隐藏节点Z的数值。各组中的第三列装载此时间步骤的输出节点Y的数值。如图中所示,数据随机存取存储器122的各行装载其相对应的神经元或神经处理单元126的节点值。也就是说,行0装载关联于节点D0,Z0与Y0的节点值,其计算是由神经处理单元0所执行;行1装载关联于节点D1,Z1与Y1的节点值,其计算是由神经处理单元1所执行;依此类推,行511装载关联于节点D511,Z511与Y511的节点值,其计算是由神经处理单元511所执行,这部分在后续对应于图42处会有更详细的说明。如图41所指出,对于一给定时间步骤而言,位于各组三列存储器的第二列的隐藏节点Z的数值会是下一个时间步骤的内容节点C的数值。也就是说,神经处理单元126在一时间步骤内计算并写入的节点Z的数值,会成为此神经处理单元126在下一个时间步骤内用于计算节点Z的数值所使用的节点C的数值(连同此下一个时间步骤的输入节点D的数值)。内容节点C的初始值(在时间步骤0用以计算列1中的节点Z的数值所使用的节点C的数值)假定为零。这在后续对应于图42的非架构程序的相关章节会有更详细的说明。较佳地,输入节点D的数值(图41的范例中的列0,3,依此类推至列57的数值)由执行于处理器100的架构程序透过MTNN指令1400写入/填入数据随机存取存储器122,并且是由执行于神经网络单元121的非架构程序读取/使用,例如图42的非架构程序。相反地,隐藏/输出节点Z/Y的数值(图41的范例中的列1与2,4与5,依此类推至列58与59的数值)则是由执行于神经网络单元121的非架构程序写入/填入数据随机存取存储器122,并且是由执行于处理器100的架构程序透过MFNN指令1500读取/使用。图41的范例假定此架构程序会执行以下步骤:(1)对于20个不同的时间步骤,将输入节点D的数值填入数据随机存取存储器122(列0,3,依此类推至列57);(2)启动图42的非架构程序;(3)侦测非架构程序是否执行完毕;(4)从数据随机存取存储器122读出输出节点Y的数值(列2,5,依此类推至列59);以及(5)重复步骤(1)至(4)若干次直到完成任务,例如对手机使用者的话语进行辨识所需的计算。在另一种执行方式中,架构程序会执行以下步骤:(1)对单一个时间步骤,以输入节点D的数值填入数据随机存取存储器122(如列0);(2)启动非架构程序(图42非架构程序的修正后版本,不需循环,并且只存取数据随机存取存储器122的单一组三列);(3)侦测非架构程序是否执行完毕;(4)从数据随机存取存储器122读出输出节点Y的数值(如列2);以及(5)重复步骤(1)至(4)若干次直到完成任务。此二种方式何者为优可依据时间递归神经网络的输入值的取样方式而定。举例来说,若是此任务容许在多个时间步骤对输入进行取样(例如大约20个时间步骤)并执行计算,第一种方式就较为理想,因为此方式可能带来更多计算资源效率和/或较佳的效能,不过,若是此任务只容许在单一个时间步骤执行取样,就需要使用第二种方式。第三实施例类似于前述第二种方式,不过,不同于第二种方式使用单一组三列数据随机存取存储器122,此方式的非架构程序使用多组三列存储器,也就是在各个时间步骤使用不同组三列存储器,此部分类似于第一种方式。在此第三实施例中,较佳地,架构程序在步骤(2)前包含一步骤,此步骤中,架构程序会在非架构程序启动前对其进行更新,例如将地址1的指令内的数据随机存取存储器122列更新为指向下一组三列存储器。图42为一表格,显示储存于神经网络单元121的程序存储器129的一程序,此程序由神经网络单元121执行,并依据图41的配置使用数据与权重以达成Elman时间递归神经网络。图42(以及图45,图48,图51,图54与图57)的非架构程序中的若干指令详如前述(例如乘法累加(MULT-ACCUM),循环(LOOP),初始化(INITIALIZE)指令),以下段落假定这些指令与前述说明内容一致,除非有不同的说明。图42的范例程序包含13个非架构指令,分别位于地址0至12。地址0的指令(INITIALIZENPU,LOOPCNT=20)清除累加器202并且将循环计数器3804初始化至数值20,以执行20次循环组(地址4至11的指令)。较佳地,此初始化指令也会使神经网络单元121处于宽配置,如此,神经网络单元121就会配置为512个神经处理单元126。如同后续章节所述,在地址1至3以及地址7至11的指令执行过程中,这512个神经处理单元126作为512个相对应的隐藏层节点Z进行运作,而在地址4至6的指令执行过程中,这512个神经处理单元126作为512个相对应的输出层节点Y进行运作。地址1至3的指令不属于程序的循环组而只会执行一次。这些指令计算隐藏层节点Z的初始值并将其写入数据随机存取存储器122的列1供地址4至6的指令的第一次执行使用,以计算出第一时间步骤(时间步骤0)的输出层节点Y。此外,这些由地址1至3的指令计算并写入数据随机存取存储器122的列1的隐藏层节点Z的数值会变成内容层节点C的数值供地址7与8的指令的第一次执行使用,以计算出隐藏层节点Z的数值供第二时间步骤(时间步骤1)使用。在地址1与2的指令的执行过程中,这512个神经处理单元126中的各个神经处理单元126会执行512个乘法运算,将位于数据随机存取存储器122列0的512个输入节点D数值乘上权重随机存取存储器124的列0至511中相对应此神经处理单元126的行的权重,以产生512个乘积累加于相对应神经处理单元126的累加器202。在地址3的指令的执行过程中,这512个神经处理单元的512个累加器202的数值会被传递并写入数据随机存取存储器122的列1。也就是说,地址3的输出指令会将512个神经处理单元中的各个神经处理单元512的累加器202数值写入数据随机存取存储器122的列1,此数值即为初始的隐藏层Z数值,随后,此指令会清除累加器202。图42的非架构程序的地址1至2的指令所执行的运算类似于图4的非架构指令的地址1至2的指令所执行的运算。进一步来说,地址1的指令(MULT_ACCUMDRROW0)会指示这512个神经处理单元126中的各个神经处理单元126将数据随机存取存储器122的列0的相对应文字读入其多任务缓存器208,将权重随机存取存储器124的列0的相对应文字读入其多任务缓存器705,将数据文字与权重文字相乘产生乘积并将此乘积加入累加器202。地址2的指令(MULT-ACCUMROTATE,WRROW+1,COUNT=511)指示这512个神经处理单元中的各个神经处理单元126将来自相邻神经处理单元126的文字转入其多任务缓存器208(利用由神经网络单元121的512个多任务缓存器208集体运作构成的512个文字的旋转器,这些缓存器即为地址1的指令指示将数据随机存取存储器122的列读入的缓存器),将权重随机存取存储器124的下一列的相对应文字读入其多任务缓存器705,将数据文字与权重文字相乘产生乘积并将此乘积加入累加器202,并且执行前述运算511次。此外,图42中地址3的单一非架构输出指令(OUTPUTPASSTHRU,DROUTROW1,CLRACC)会将启动函数指令的运算与图4中地址3与4的写入输出指令合并(虽然图42的程序传递累加器202数值,而图4的程序则是对累加器202数值执行启动函数)。也就是说,在图42的程序中,执行于累加器202数值的启动函数,如果有的话,输出指令中指定(也在地址6与11的输出指令中指定),而非如图4的程序所示于一个不同的非架构启动函数指令中指定。图4(以及图20,图26A与图28)的非架构程序的另一实施例,也即将启动函数指令的运算与写入输出指令(如图4的地址3与4)合并为如图42所示的单一非架构输出指令也属于本发明的范畴。图42的范例假定隐藏层(Z)的节点不会对累加器数值执行启动函数。不过,隐藏层(Z)对累加器数值执行启动函数的实施例也属本发明的范畴,这些实施例可利用地址3与11的指令进行运算,如S型,双曲正切,校正函数等。相较于地址1至3的指令只会执行一次,地址4至11的指令则是位于程序循环内而会被执行若干次数,此次数由循环计数所指定(例如20)。地址7至11的指令的前十九次执行计算隐藏层节点Z的数值并将其写入数据随机存取存储器122供地址4至6的指令的第二至二十次执行使用以计算剩余时间步骤的输出层节点Y(时间步骤1至19)。(地址7至11的指令的最后/第二十次执行计算隐藏层节点Z的数值并将其写入数据随机存取存储器122的列61,不过,这些数值并未被使用。)在地址4与5的指令(MULT-ACCUMDRROW+1,WRROW512andMULT-ACCUMROTATE,WRROW+1,COUNT=511)的第一次执行中(对应于时间步骤0),这512个神经处理单元126中的各个神经处理单元126会执行512个乘法运算,将数据随机存取存储器122的列1的512个隐藏节点Z的数值(这些数值由地址1至3的指令的单一次执行而产生与写入)乘上权重随机存取存储器124的列512至1023中对应此神经处理单元126的行的权重,以产生512个乘积累加于相对应神经处理单元126的累加器202。在地址6的指令(OUTPUTACTIVATIONFUNCTION,DROUTROW+1,CLRACC)的第一次执行中,会对于这512个累加数值执行启动函数(例如S型,双曲正切,校正函数)以计算输出层节点Y的数值,执行结果会写入数据随机存取存储器122的列2。在地址4与5的指令的第二次执行中(对应于时间步骤1),这512个神经处理单元126中的各个神经处理单元126会执行512个乘法运算,将数据随机存取存储器122的列4的512个隐藏节点Z的数值(这些数值由地址7至11的指令的第一次执行而产生与写入)乘上权重随机存取存储器124的列512至1023中对应此神经处理单元126的行的权重,以产生512个乘积累加于相对应神经处理单元126的累加器202,而在地址6的指令的第二次执行中,会对于这512个累加数值执行启动函数以计算输出层节点Y的数值,此结果写入数据随机存取存储器122的列5;在地址4与5的指令的第三次执行中(对应于时间步骤2),这512个神经处理单元126中的各个神经处理单元126会执行512个乘法运算,将数据随机存取存储器122的列7的512个隐藏节点Z的数值(这些数值由地址7至11的指令的第二次执行而产生与写入)乘上权重随机存取存储器124的列512至1023中对应此神经处理单元126的行的权重,以产生512个乘积累加于相对应神经处理单元126的累加器202,而在地址6的指令的第三次执行中,会对于这512个累加数值执行启动函数以计算输出层节点Y的数值,此结果写入数据随机存取存储器122的列8;依此类推,在地址4与5的指令的第二十次执行中(对应于时间步骤19),这512个神经处理单元126中的各个神经处理单元126会执行512个乘法运算,将数据随机存取存储器122的列58的512个隐藏节点Z的数值(这些数值由地址7至11的指令的第十九次执行而产生与写入)乘上权重随机存取存储器124的列512至1023中对应此神经处理单元126的行的权重,以产生512个乘积累加于相对应神经处理单元126的累加器202,而在地址6的指令的第二十次执行中,会对于这512个累加数值执行启动函数以计算输出层节点Y的数值,执行结果写入数据随机存取存储器122的列59。在地址7与8的指令的第一次执行中,这512个神经处理单元126中的各个神经处理单元126将数据随机存取存储器122的列1的512个内容节点C的数值累加至其累加器202,这些数值由地址1至3的指令的单一次执行所产生。进一步来说,地址7的指令(ADD_D_ACCDRROW+0)会指示这512个神经处理单元126中的各个神经处理单元126将数据随机存取存储器122当前列(在第一次执行的过程中即为列0)的相对应文字读入其多任务缓存器208,并将此文字加入累加器202。地址8的指令(ADD_D_ACCROTATE,COUNT=511)指示这512个神经处理单元126中的各个神经处理单元126将来自相邻神经处理单元126的文字转入其多任务缓存器208(利用由神经网络单元121的512个多任务缓存器208集体运作构成的512个文字的旋转器,这些多任务缓存器即为地址7的指令指示读入数据随机存取存储器122的列的缓存器),将此文字加入累加器202,并且执行前述运算511次。在地址7与8的指令的第二次执行中,这512个神经处理单元126中的各个神经处理单元126会将将数据随机存取存储器122的列4的512个内容节点C的数值累加至其累加器202,这些数值由地址9至11的指令的第一次执行所产生并写入;在地址7与8的指令的第三次执行中,这512个神经处理单元126中的各个神经处理单元126会将将数据随机存取存储器122的列7的512个内容节点C的数值累加至其累加器202,这些数值由地址9至11的指令的第二次执行所产生并写入;依此类推,在地址7与8的指令的第二十次执行中,这512个神经处理单元126中的各个神经处理单元126会将将数据随机存取存储器122的列58的512个内容节点C的数值累加至其累加器202,这些数值由地址9至11的指令的第十九次执行所产生并写入。如前述,图42的范例假定关联于内容节点C至隐藏层节点Z的连结的权重具有为一的值。不过,在另一实施例中,这些位于Elman时间递归神经网络内的连结则是具有非零权重值,这些权重在图42的程序执行前放置于权重随机存取存储器124(例如列1024至1535),地址7的程序指令为MULT-ACCUMDRROW+0,WRROW1024,而地址8的程序指令为MULT-ACCUMROTATE,WRROW+1,COUNT=511。较佳地,地址8的指令并不存取权重随机存取存储器124,而是旋转地址7的指令从权重随机存取存储器124读入多任务缓存器705的数值。在511个执行地址8指令的时频周期内不对权重随机存取存储器124进行存取即可保留更多频宽供架构程序存取权重随机存取存储器124使用。在地址9与10的指令(MULT-ACCUMDRROW+2,WRROW0andMULT-ACCUMROTATE,WRROW+1,COUNT=511)的第一次执行中(对应于时间步骤1),这512个神经处理单元126中的各个神经处理单元126会执行512个乘法运算,将数据随机存取存储器122的列3的512个输入节点D的数值乘上权重随机存取存储器124的列0至511中对应此神经处理单元126的行的权重以产生512个乘积,连同地址7与8的指令对于512个内容节点C数值所执行的累加运算,累加于相对应神经处理单元126的累加器202以计算隐藏层节点Z的数值,在地址11的指令(OUTPUTPASSTHRU,DROUTROW+2,CLRACC)的第一次执行中,这512个神经处理单元126的512个累加器202数值被传递并写入数据随机存取存储器122的列4,而累加器202会被清除;在地址9与10的指令的第二次执行中(对应于时间步骤2),这512个神经处理单元126中的各个神经处理单元126会执行512个乘法运算,将数据随机存取存储器122的列6的512个输入节点D的数值乘上权重随机存取存储器124的列0至511中对应此神经处理单元126的行的权重,以产生512个乘积,连同地址7与8的指令对于512个内容节点C数值所执行的累加运算,累加于相对应神经处理单元126的累加器202以计算隐藏层节点Z的数值,在地址11的指令的第二次执行中,这512个神经处理单元126的512个累加器202数值被传递并写入数据随机存取存储器122的列7,而累加器202则会被清除;依此类推,在地址9与10的指令的第十九次执行中(对应于时间步骤19),这512个神经处理单元126中的各个神经处理单元126会执行512个乘法运算,将数据随机存取存储器122的列57的512个输入节点D的数值乘上权重随机存取存储器124的列0至511中对应此神经处理单元126的行的权重,以产生512个乘积,连同地址7与8的指令对于512个内容节点C数值所执行的累加运算,累加于相对应神经处理单元126的累加器202以计算隐藏层节点Z的数值,而在地址11的指令的第十九次执行中,这512个神经处理单元126的512个累加器202数值被传递并写入数据随机存取存储器122的列58,而累加器202则会被清除。如前所述,在地址9与10的指令的第二十次执行中所产生并写入的隐藏层节点Z的数值并不会被使用。地址12的指令(LOOP4)会使循环计数器3804递减并且在新的循环计数器3804数值大于零的情况下回到地址4的指令。图43为一方块图显示Jordan时间递归神经网络的一范例。图43的Jordan时间递归神经网络类似于图40的Elman时间递归神经网络,具有输入层节点/神经元D,隐藏层节点/神经元Z,输出层节点/神经元Y,与内容层节点/神经元C。不过,在图43的Jordan时间递归神经网络中,内容层节点C以来自其相对应输出层节点Y的输出回馈作为其输入连结,而非如图40的Elman时间递归神经网络中来自隐藏层节点Z的输出作为其输入连结。为了说明本发明,Jordan时间递归神经网络是一个包含至少一个输入节点层,一个隐藏节点层,一个输出节点层与一个内容节点层的时间递归神经网络。在一给定时间步骤的开始,内容节点层会储存输出节点层于前一个时间步骤产生且回馈至内容节点层的结果。此回馈至内容层的结果可以是启动函数的结果或是输出节点层执行累加运算而未执行启动函数的结果。图44为一方块图,显示当神经网络单元121执行关联于图43的Jordan时间递归神经网络的计算时,神经网络单元121的数据随机存取存储器122与权重随机存取存储器124内的数据配置的一范例。在图44的范例中假定图43的Jordan时间递归神经网络具有512个输入节点D,512个隐藏节点Z,512个内容节点C,与512个输出节点Y。此外,也假定此Jordan时间递归神经网络为完全连结,即全部512个输入节点D均连结各个隐藏节点Z作为输入,全部512个内容节点C均连结各个隐藏节点Z作为输入,而全部512个隐藏节点Z均连结各个输出节点Y作为输入。图44的Jordan时间递归神经网络的范例虽然会对累加器202数值施以启动函数以产生输出层节点Y的数值,不过,此范例假定会将施以启动函数前的累加器202数值传递至内容层节点C,而非真正的输出层节点Y数值。此外,神经网络单元121设置有512个神经处理单元126,或神经元,例如采取宽配置。最后,此范例假定关联于由内容节点C至隐藏节点Z的连结的权重均具有数值1;因而不需储存这些为一的权重值。如同图41的范例,如图中所示,权重随机存取存储器124的下方512列(列0至511)会装载关联于输入节点D与隐藏节点Z间的连结的权重值,而权重随机存取存储器124的后续512列(列512至1023)会装载关联于隐藏节点Z与输出节点Y间的连结的权重值。数据随机存取存储器122装载Jordan时间递归神经网络节点值供一系列类似于图41的范例中的时间步骤使用;不过,图44的范例中以一组四列的存储器装载提供给定时间步骤的节点值。如图中所示,在具有64列的数据随机存取存储器122的实施例中,数据随机存取存储器122可以装载15个不同时间步骤所需的节点值。在图44的范例中,列0至3装载供时间步骤0使用的节点值,列4至7装载供时间步骤1使用的节点值,依此类推,列60至63装载供时间步骤15使用的节点值。此四列一组存储器的第一列装载此时间步骤的输入节点D的数值。此四列一组存储器的第二列装载此时间步骤的隐藏节点Z的数值。此四列一组存储器的第三列装载此时间步骤的内容节点C的数值。此四列一组存储器的第四列则是装载此时间步骤的输出节点Y的数值。如图中所示,数据随机存取存储器122的各行装载其相对应的神经元或神经处理单元126的节点值。也就是说,行0装载关联于节点D0,Z0,C0与Y0的节点值,其计算是由神经处理单元0执行;行1装载关联于节点D1,Z1,C1与Y1的节点值,其计算是由神经处理单元1执行;依此类推,行511装载关联于节点D511,Z511,C511与Y511的节点值,其计算是由神经处理单元511执行。这部分在后续对应于图44处会有更详细的说明。图44中给定时间步骤的内容节点C的数值于此时间步骤内产生并作为下一个时间步骤的输入。也就是说,神经处理单元126在此时间步骤内计算并写入的节点C的数值,会成为此神经处理单元126在下一个时间步骤内用于计算节点Z的数值所使用的节点C的数值(连同此下一个时间步骤的输入节点D的数值)。内容节点C的初始值(即时间步骤0计算列1节点Z的数值所使用的节点C的数值)假定为零。这部分在后续对应于图45的非架构程序的章节会有更详细的说明。如前文图41所述,较佳地,输入节点D的数值(图44的范例中的列0,4,依此类推至列60的数值)由执行于处理器100的架构程序透过MTNN指令1400写入/填入数据随机存取存储器122,并且是由执行于神经网络单元121的非架构程序读取/使用,例如图45的非架构程序。相反地,隐藏节点Z/内容节点C/输出节点Y的数值(图44的范例中分别为列1/2/3,5/6/7,依此类推至列61/62/63的数值)由执行于神经网络单元121的非架构程序写入/填入数据随机存取存储器122,并且是由执行于处理器100的架构程序透过MFNN指令1500读取/使用。图44的范例假定此架构程序会执行以下步骤:(1)对于15个不同的时间步骤,将输入节点D的数值填入数据随机存取存储器122(列0,4,依此类推至列60);(2)启动图45的非架构程序;(3)侦测非架构程序是否执行完毕;(4)从数据随机存取存储器122读出输出节点Y的数值(列3,7,依此类推至列63);以及(5)重复步骤(1)至(4)若干次直到完成任务,例如对手机使用者的话语进行辨识所需的计算。在另一种执行方式中,架构程序会执行以下步骤:(1)对单一个时间步骤,以输入节点D的数值填入数据随机存取存储器122(如列0);(2)启动非架构程序(图45非架构程序的修正后版本,不需循环,并且只存取数据随机存存储器122的单一组四列);(3)侦测非架构程序是否执行完毕;(4)从数据随机存取存储器122读出输出节点Y的数值(如列3);以及(5)重复步骤(1)至(4)若干次直到完成任务。此二种方式何者为优可依据时间递归神经网络的输入值的取样方式而定。举例来说,若是此任务容许在多个时间步骤内对输入进行取样(例如大约15个时间步骤)并执行计算,第一种方式就较为理想,因为此方式可带来更多计算资源效率和/或较佳的效能,不过,若是此任务只容许在单一个时间步骤内执行取样,就需要使用第二种方式。第三实施例类似于前述第二种方式,不过,不同于第二种方式使用单一组四个数据随机存取存储器122列,此方式的非架构程序使用多组四列存储器,也就是在各个时间步骤使用不同组四列存储器,此部分类似于第一种方式。在此第三实施例中,较佳地,架构程序在步骤(2)前包含一步骤,在此步骤中,架构程序会在非架构程序启动前对其进行更新,例如将地址1的指令内的数据随机存取存储器122列更新为指向下一组四列存储器。图45为一表格,显示储存于神经网络单元121的程序存储器129的程序,此程序由神经网络单元121执行,并依据图44的配置使用数据与权重,以达成Jordan时间递归神经网络。图45的非架构程序类似于图42的非架构程序,二者的差异可参照本文相关章节的说明。图45的范例程序包括14个非架构指令,分别位于地址0至13。地址0的指令是一个初始化指令,用以清除累加器202并将循环计数器3804初始化至数值15,以执行15次循环组(地址4至12的指令)。较佳地,此初始化指令并会使神经网络单元121处于宽配置而配置为512个神经处理单元126。如本文所述,在地址1至3以及地址8至12的指令执行过程中,这512个神经处理单元126对应并作为512个隐藏层节点Z进行运作,而在地址4,5与7的指令执行过程中,这512个神经处理单元126对应并作为512个输出层节点Y进行运作。地址1至5与地址7的指令与图42中地址1至6的指令相同并具有相同功能。地址1至3的指令计算隐藏层节点Z的初始值并将其写入数据随机存取存储器122的列1供地址4,5与7的指令的第一次执行使用,以计算出第一时间步骤(时间步骤0)的输出层节点Y。在地址6的输出指令的第一次执行的过程中,这512个由地址4与5的指令累加产生的累加器202数值(接下来这些数值会被地址7的输出指令使用以计算并写入输出层节点Y的数值)会被传递并写入数据随机存取存储器122的列2,这些数值即为第一时间步骤(时间步骤0)中产生的内容层节点C数值并于第二时间步骤(时间步骤1)中使用;在地址6的输出指令的第二次执行的过程中,这512个由地址4与5的指令累加产生的累加器202数值(接下来,这些数值会被地址7的输出指令使用以计算并写入输出层节点Y的数值)会被传递并写入数据随机存取存储器122的列6,这些数值即为第二时间步骤(时间步骤1)中产生的内容层节点C数值并于第三时间步骤(时间步骤2)中使用;依此类推,在地址6的输出指令的第十五次执行的过程中,这512个由地址4与5的指令累加产生的累加器202数值(接下来这些数值会被地址7的输出指令使用以计算并写入输出层节点Y的数值)会被传递并写入数据随机存取存储器122的列58,这些数值即为第十五时间步骤(时间步骤14)中产生的内容层节点C数值(并由地址8的指令读取,但不会被使用)。地址8至12的指令与图42中地址7至11的指令大致相同并具有相同功能,二者仅具有一差异点。此差异点即,图45中地址8的指令(ADD_D_ACCDRROW+1)会使数据随机存取存储器122的列数增加一,而图42中地址7的指令(ADD_D_ACCDRROW+0)会使数据随机存取存储器122的列数增加零。此差异导因于数据随机存取存储器122内的数据配置的不同,特别是,图44中四列一组的配置包括一独立列供内容层节点C数值使用(如列2,6,10等),而图41中三列一组的配置则不具有此独立列,而是让内容层节点C的数值与隐藏层节点Z的数值共享同一列(如列1,4,7等)。地址8至12的指令的十五次执行会计算出隐藏层节点Z的数值并将其写入数据随机存取存储器122(写入列5,9,13,依此类推直到列57)供地址4,5与7的指令的第二至十六次执行使用以计算第二至十五时间步骤的输出层节点Y(时间步骤1至14)。(地址8至12的指令的最后/第十五次执行计算隐藏层节点Z的数值并将其写入数据随机存取存储器122的列61,不过这些数值并未被使用。)地址13的循环指令会使循环计数器3804递减并且在新的循环计数器3804数值大于零的情况下回到地址4的指令。在另一实施例中,Jordan时间递归神经网络的设计利用内容节点C装载输出节点Y的启动函数值,此启动函数值即启动函数执行后的累加值。在此实施例中,因为输出节点Y的数值与内容节点C的数值相同,地址6的非架构指令并不包含于非架构程序内。因而可以减少数据随机存取存储器122内使用的列数。更精确的说,图44中的各个装载内容节点C数值的列(例如列2,6,59)都不存在于本实施例。此外,此实施例的各个时间步骤仅需要数据随机存取存储器122的三列,而会搭配20个时间步骤,而非15个,图45中非架构程序的指令的地址也会进行适当的调整。长短期记忆胞长短期记忆胞用于时间递归神经网络是本
技术领域:
:所习知的概念。举例来说,LongShort-TermMemory,SeppHochreiterandJürgenSchmidhuber,NeuralComputation,November15,1997,Vol.9,No.8,Pages1735-1780;LearningtoForget:ContinualPredictionwithLSTM,FelixA.Gers,JürgenSchmidhuber,andFredCummins,NeuralComputation,October2000,Vol.12,No.10,Pages2451-2471;这些文献都可以从麻省理工出版社期刊(MITPressJournals)取得。长短期记忆胞可以建构为多种不同型式。以下所述图46的长短期记忆胞4600以网址http://deeplearning.net/tutorial/lstm.html标题为用于情绪分析的长短期记忆网络(LSTMNetworksforSentimentAnalysis)的教程所描述的长短期记忆胞为模型,此教程的副本于2015年10月19日下载(以下称为“长短期记忆教程”)并提供于本案的美国申请案数据揭露陈报书内。此长短期记忆胞4600可用于一般性地描述本文所述的神经网络单元121实施例能够有效执行关联于长短期记忆的计算的能力。值得注意的是,这些神经网络单元121的实施例,包括图49所述的实施例,都可以有效执行关联于图46所述的长短期记忆胞以外的其它长短期记忆胞的计算。较佳地,神经网络单元121可用以针对一个具有长短期记忆胞层连结其它层级的时间递归神经网络执行计算。举例来说,在此长短期记忆教程中,网络包含均值共源层以接收长短期记忆层的长短期记忆胞的输出(H),以及逻辑回归层以接收均值共源层的输出。图46为一方块图,显示长短期记忆胞4600的一实施例。如图中所示,此长短期记忆胞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)即当前时间步骤的记忆胞状态(C)。等式(6)计算记忆胞输出(H)。不过本发明并不限于此。使用他种方式计算输入闸,遗忘闸,输出闸,候选记忆胞状态,记忆胞状态与记忆胞输出的长短期记忆胞的实施例也为本发明所涵盖。为了说明本发明,长短期记忆胞包括记忆胞输入,记忆胞输出,记忆胞状态,候选记忆胞状态,输入闸,输出闸与遗忘闸。对各个时间步骤而言,输入闸,输出闸,遗忘闸与候选记忆胞状态为当前时间步骤的存储器记忆胞输入与先前时间步骤的记忆胞输出与相关权重的函数。此时间步骤的记忆胞状态为先前时间步骤的记忆胞状态,候选记忆胞状态,输入闸与输出闸的函数。从这个意义上说,记忆胞状态会反馈用于计算下一个时间步骤的记忆胞状态。此时间步骤的记忆胞输出是此时间步骤计算出的记忆胞状态与输出闸的函数。长短期记忆神经网络是一个具有一个长短期记忆胞层的神经网络。图47为一方块图,显示当神经网络单元121执行关联于图46的长短期记忆神经网络的长短期记忆胞4600层的计算时,神经网络单元121的数据随机存取存储器122与权重随机存取存储器124内的数据配置的一范例。在图47的范例中,神经网络单元121配置为512个神经处理单元126或神经元,例如采宽配置,不过,只有128个神经处理单元126(如神经处理单元0至127)所产生的数值会被使用,这是因为在此范例的长短期记忆层只有128个长短期记忆胞4600。如图中所示,权重随机存取存储器124会装载神经网络单元121的相对应神经处理单元0至127的权重值,偏移值与居间值。权重随机存取存储器124的行0至127装载神经网络单元121的相对应神经处理单元0至127的权重值,偏移值与居间值。列0至14中的各列则是装载128个下列对应于前述等式(1)至(6)的数值以提供给神经处理单元0至127,这些数值为: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写入/填入权重随机存取存储器124,并由执行于神经网络单元121的非架构程序读取/使用,如图48的非架构程序。较佳地,居间值-C’,TANH(C),C(位于列9至11)-由执行于神经网络单元121的非架构程序写入/填入权重随机存取存储器124并进行读取/使用,详如后述。如图中所示,数据随机存取存储器122装载输入(X),输出(H),输入闸(I),遗忘闸(F)与输出闸(O)数值供一系列时间步骤使用。进一步来说,此存储器五列一组装载X,H,I,F与O的数值供一给定时间步骤使用。以一个具有64列的数据随机存取存储器122为例,如图中所示,此数据随机存取存储器122可装载供12个不同时间步骤使用的记忆胞数值。在图47的范例中,列0至4装载供时间步骤0使用的记忆胞数值,列5至9装载供时间步骤1使用的记忆胞数值,依此类推,列55至59装载供时间步骤11使用的记忆胞数值。此五列一组存储器中的第一列装载此时间步骤的X数值。此五列一组存储器中的第二列装载此时间步骤的H数值。此五列一组存储器中的第三列装载此时间步骤的I数值。此五列一组存储器中的第四列装载此时间步骤的F数值。此五列一组存储器中的第五列装载此时间步骤的O数值。如图中所示,数据随机存取存储器122内的各行装载供相对应神经元或神经处理单元126使用的数值。也就是说,行0装载关联于长短期记忆胞0的数值,而其计算是由神经处理单元0所执行;行1装载关联于长短期记忆胞1的数值,而其计算是由神经处理单元1所执行;依此类推,行127装载关联于长短期记忆胞127的数值,而其计算是由神经处理单元127所执行,详如后续图48所述。较佳地,X数值(位于列0,5,9,依此类推至列55)由执行于处理器100的架构程序透过MTNN指令1400写入/填入数据随机存取存储器122,并由执行于神经网络单元121的非架构程序进行读取/使用,如图48所示的非架构程序。较佳地,I数值,F数值与O数值(位于列2/3/4,7/8/9,12/13/14,依此类推至列57/58/59)由执行于神经处理单元121的非架构程序写入/填入数据随机存取存储器122,详如后述。较佳地,H数值(位于列1,6,10,依此类推至列56)由执行于神经处理单元121的非架构程序写入/填入数据随机存取存储器122并进行读取/使用,并且由执行于处理器100的架构程序透过MFNN指令1500进行读取。图47的范例假定此架构程序会执行以下步骤:(1)对于12个不同的时间步骤,将输入X的数值填入数据随机存取存储器122(列0,5,依此类推至列55);(2)启动图48的非架构程序;(3)侦测非架构程序是否执行完毕;(4)从数据随机存取存储器122读出输出H的数值(列1,6,依此类推至列59);以及(5)重复步骤(1)至(4)若干次直到完成任务,例如对手机使用者的话语进行辨识所需的计算。在另一种执行方式中,架构程序会执行以下步骤:(1)对单一个时间步骤,以输入X的数值填入数据随机存取存储器122(如列0);(2)启动非架构程序(图48非架构程序的修正后版本,不需循环,并且只存取数据随机存取存储器122的单一组五列);(3)侦测非架构程序是否执行完毕;(4)从数据随机存取存储器122读出输出H的数值(如列1);以及(5)重复步骤(1)至(4)若干次直到完成任务。此二种方式何者为优可依据长短期记忆层的输入X数值的取样方式而定。举例来说,若是此任务容许在多个时间步骤对输入进行取样(例如大约12个时间步骤)并执行计算,第一种方式就较为理想,因为此方式可能带来更多计算资源效率和/或较佳的效能,不过,若是此任务只容许在单一个时间步骤执行取样,就需要使用第二种方式。第三实施例类似于前述第二种方式,不过,不同于第二种方式使用单一组五列数据随机存取存储器122,此方式的非架构程序使用多组五列存储器,也就是在各个时间步骤使用不同的五列一组存储器,此部分类似于第一种方式。在此第三实施例中,较佳地,架构程序在步骤(2)前包含一步骤,此步骤中,架构程序会在非架构程序启动前对其进行更新,例如将地址0的指令内的数据随机存取存储器122列更新为指向下一组五列存储器。图48为一表格,显示储存于神经网络单元121的程序存储器129的程序,此程序由神经网络单元121执行并依据图47的配置使用数据与权重,以达成关联于长短期记忆胞层的计算。图48的范例程序包括24个非架构指令分别位于地址0至23。地址0的指令(INITIALIZENPU,CLRACC,LOOPCNT=12,DRINROW=-1,DROUTROW=2)会清除累加器202并将循环计数器3804初始化至数值12,以执行12次循环组(地址1至22的指令)。此初始化指令并会将数据随机存取存储器122的待读取列初始化为数值-1,而在地址1的指令的第一次执行后,此数值会增加为零。此初始化指令并会将数据随机存取存储器122的待写入列(例如图26与图39的缓存器2606)初始化为列2。较佳地,此初始化指令并会使神经网络单元121处于宽配置,如此,神经网络单元121就会配置有512个神经处理单元126。如同后续章节所述,在地址0至23的指令执行过程中,这512个神经处理单元126其中的128个神经处理单元126对应并作为128个长短期记忆胞4600进行运作。在地址1至4的指令的第一次执行中,这128个神经处理单元126(即神经处理单元0至127)中的各个神经处理单元126会针对相对应长短期记忆胞4600的第一时间步骤(时间步骤0)计算输入闸(I)数值并将I数值写入数据随机存取存储器122的列2的相对应文字;在地址1至4的指令的第二次执行中,这128个神经处理单元126中的各个神经处理单元126会针对相对应长短期记忆胞4600的第二时间步骤(时间步骤1)计算I数值并将I数值写入数据随机存取存储器122的列7的相对应文字;依此类推,在地址1至4的指令的第十二次执行中,这128个神经处理单元126中的各个神经处理单元126会针对相对应长短期记忆胞4600的第十二时间步骤(时间步骤11)计算I数值并将I数值写入数据随机存取存储器122的列57的相对应文字,如图47所示。进一步来说,地址1的乘法累加指令会读取数据随机存取存储器122当前列后方的下一列(在第一执行即为列0,在第二执行即为列5,依此类推,在第十二执行即为列55),此列包含关联于当前时间步骤的记忆胞输入(X)值,此指令并会读取权重随机存取存储器124中包含Wi数值的列0,并且将前述读取数值相乘以产生第一乘积累加至刚刚由地址0的初始化指令或地址22的指令清除的累加器202。随后,地址2的乘法累加指令会读取下一个数据随机存取存储器122列(在第一执行即为列1,在第二执行即为列6,依此类推,在第十二执行即为列56),此列包含关联于当前时间步骤的记忆胞输出(H)值,此指令并会读取权重随机存取存储器124中包含Ui数值的列1,并且将前述数值相乘以产生第二乘积累加至累加器202。关联于当前时间步骤的H数值由地址2的指令(以及地址6,10与18的指令)由数据随机存取存储器122读取,在先前时间步骤产生,并由地址22的输出指令写入数据随机存取存储器122;不过,在第一次执行中,地址2的指令会以一初始值写入数据随机存取存储器的列1作为H数值。较佳地,架构程序会在启动图48的非架构程序前将初始H数值写入数据随机存取存储器122的列1(例如使用MTNN指令1400);不过,本发明并不限于此,非架构程序内包含有初始化指令将初始H数值写入数据随机存取存储器122的列1的其它实施例也属于本发明的范畴。在一实施例中,此初始H数值为零。接下来,地址3的将权重文字加入累加器的指令(ADD_W_ACCWRROW2)会读取权重随机存取存储器124中包含Bi数值的列2并将其加入累加器202。最后,地址4的输出指令(OUTPUTSIGMOID,DROUTROW+0,CLRACC)会对累加器202数值执行一S型启动函数并将执行结果写入数据随机存取存储器122的当前输出列(在第一执行即为列2,在第二执行即为列7,依此类推,在第十二执行即为列57)并且清除累加器202。在地址5至8的指令的第一次执行中,这128个神经处理单元126中的各个神经处理单元126会针对相对应长短期记忆胞4600的第一时间步骤(时间步骤0)计算其遗忘闸(F)数值并将F数值写入数据随机存取存储器122的列3的相对应文字;在地址5至8的指令的第二次执行中,这128个神经处理单元126中的各个神经处理单元126会针对相对应长短期记忆胞4600的第二时间步骤(时间步骤1)计算其遗忘闸(F)数值并将F数值写入数据随机存取存储器122的列8的相对应文字;依此类推,在地址5至8的指令的第十二次执行中,这128个神经处理单元126中的各个神经处理单元126会针对相对应长短期记忆胞4600的第十二时间步骤(时间步骤11)计算其遗忘闸(F)数值并将F数值写入数据随机存取存储器122的列58的相对应文字,如图47所示。地址5至8的指令计算F数值的方式类似于前述地址1至4的指令,不过,地址5至7的指令会分别从权重随机存取存储器124的列3,列4与列5读取Wf,Uf与Bf数值以执行乘法和/或加法运算。在地址9至12的指令的十二次执行中,这128个神经处理单元126中的各个神经处理单元126会针对相对应长短期记忆胞4600的相对应时间步骤计算其候选记忆胞状态(C’)数值并将C’数值写入权重随机存取存储器124的列9的相对应文字。地址9至12的指令计算C’数值的方式类似于前述地址1至4的指令,不过,地址9至11的指令会分别从权重随机存取存储器124的列6,列7与列8读取Wc,Uc与Bc数值以执行乘法和/或加法运算。此外,地址12的输出指令会执行双曲正切启动函数而非(如地址4的输出指令执行)S型启动函数。进一步来说,地址9的乘法累加指令会读取数据随机存取存储器122的当前列(在第一次执行即为列0,在第二次执行即为列5,依此类推,在第十二次执行即为列55),此当前列包含关联于当前时间步骤的记忆胞输入(X)值,此指令并会读取权重随机存取存储器124中包含Wc数值的列6,并且将前述数值相乘以产生第一乘积累加至刚刚由地址8的指令清除的累加器202。接下来,地址10的乘法累加指令会读取数据随机存取存储器122的次一列(在第一次执行即为列1,在第二次执行即为列6,依此类推,在第十二次执行即为列56),此列包含关联于当前时间步骤的记忆胞输出(H)值,此指令并会读取权重随机存取存储器124中包含Uc数值的列7,并且将前述数值相乘以产生第二乘积累加至累加器202。接下来,地址11的将权重文字加入累加器的指令会读取权重随机存取存储器124中包含Bc数值的列8并将其加入累加器202。最后,地址12的输出指令(OUTPUTTANH,WROUTROW9,CLRACC)会对累加器202数值执行双曲正切启动函数并将执行结果写入权重随机存取存储器124的列9,并且清除累加器202。在地址13至16的指令的十二次执行中,这128个神经处理单元126中的各个神经处理单元126会针对相对应长短期记忆胞4600的相对应时间步骤计算新的记忆胞状态(C)数值并将此新的C数值写入权重随机存取存储器122的列11的相对应文字,各个神经处理单元126还会计算tanh(C)并将其写入权重随机存取存储器124的列10的相对应文字。进一步来说,地址13的乘法累加指令会读取数据随机存取存储器122当前列后方的下一列(在第一次执行即为列2,在第二次执行即为列7,依此类推,在第十二次执行即为列57),此列包含关联于当前时间步骤的输入闸(I)数值,此指令并读取权重随机存取存储器124中包含候选记忆胞状态(C’)数值的列9(刚刚由地址12的指令写入),并且将前述数值相乘以产生第一乘积累加至刚刚由地址12的指令清除的累加器202。接下来,地址14的乘法累加指令会读取数据随机存取存储器122的下一列(在第一次执行即为列3,在第二次执行即为列8,依此类推,在第十二次执行即为列58),此列包含关联于当前时间步骤的遗忘闸(F)数值,此指令并读取权重随机存取存储器124中包含于先前时间步骤中计算的当前记忆胞状态(C)数值(由地址15的指令的最近一次执行进行写入)的列11,并且将前述数值相乘以产生第二乘积加入累加器202。接下来,地址15的输出指令(OUTPUTPASSTHRU,WROUTROW11)会传递此累加器202数值并将其写入权重随机存取存储器124的列11。需要理解的是,地址14的指令由数据随机存取存储器122的列11读取的C数值即为地址13至15的指令于最近一次执行中产生并写入的C数值。地址15的输出指令并不会清除累加器202,如此,其数值即可由地址16的指令使用。最后,地址16的输出指令(OUTPUTTANH,WROUTROW10,CLRACC)会对累加器202数值执行双曲正切启动函数并将其执行结果写入权重随机存取存储器124的列10供地址21的指令使用以计算记忆胞输出(H)值。地址16的指令会清除累加器202。在地址17至20的指令的第一次执行中,这128个神经处理单元126中的各个神经处理单元126会针对相对应长短期记忆胞4600的第一时间步骤(时间步骤0)计算其输出闸(O)数值并将O数值写入数据随机存取存储器122的列4的相对应文字;在地址17至20的指令的第二次执行中,这128个神经处理单元126中的各个神经处理单元126会针对相对应长短期记忆胞4600的第二时间步骤(时间步骤1)计算其输出闸(O)数值并将O数值写入数据随机存取存储器122的列9的相对应文字;依此类推,在地址17至20的指令的第十二次执行中,这128个神经处理单元126中的各个神经处理单元126会针对相对应长短期记忆胞4600的第十二时间步骤(时间步骤11)计算其输出闸(O)数值并将O数值写入数据随机存取存储器122的列58的相对应文字,如图47所示。地址17至20的指令计算O数值的方式类似于前述地址1至4的指令,不过,地址17至19的指令会分别从权重随机存取存储器124的列12,列13与列14读取Wo,Uo与Bo数值以执行乘法和/或加法运算。在地址21至22的指令的第一次执行中,这128个神经处理单元126中的各个神经处理单元126会针对相对应长短期记忆胞4600的第一时间步骤(时间步骤0)计算其记忆胞输出(H)值并将H数值写入数据随机存取存储器122的列6的相对应文字;在地址21至22的指令的第二次执行中,这128个神经处理单元126中的各个神经处理单元126会针对相对应长短期记忆胞4600的第二时间步骤(时间步骤1)计算其记忆胞输出(H)值并将H数值写入数据随机存取存储器122的列11的相对应文字;依此类推,在地址21至22的指令的第十二次执行中,这128个神经处理单元126中的各个神经处理单元126会针对相对应长短期记忆胞4600的第十二时间步骤(时间步骤11)计算其记忆胞输出(H)值并将H数值写入数据随机存取存储器122的列60的相对应文字,如图47所示。进一步来说,地址21的乘法累加指令会读取数据随机存取存储器122当前列后方的第三列(在第一次执行即为列4,在第二次执行即为列9,依此类推,在第十二次执行即为列59),此列包含关联于当前时间步骤的输出闸(O)数值,此指令并读取权重随机存取存储器124中包含tanh(C)数值的列10(由地址16的指令写入),并且将前述数值相乘以产生一乘积累加至刚刚由地址20的指令清除的累加器202。随后,地址22的输出指令会传递累加器202数值并将其写入数据随机存取存储器122的接下来第二个输出列11(在第一次执行即为列6,在第二次执行即为列11,依此类推,在第十二次执行即为列61),并且清除累加器202。需要理解的是,由地址22的指令写入数据随机存取存储器122列的H数值(在第一次执行即为列6,在第二次执行即为列11,依此类推,在第十二次执行即为列61)即为地址2,6,10与18的指令的后续执行中所消耗/读取的H数值。不过,第十二次执行中写入列61的H数值并不会被地址2,6,10与18的指令的执行所消耗/读取;就一较佳实施例而言,此数值会是由架构程序所消耗/读取。地址23的指令(LOOP1)会使循环计数器3804递减并且在新的循环计数器3804数值大于零的情况下回到地址1的指令。图49为一方块图,显示神经网络单元121的实施例,此实施例的神经处理单元群组内具有输出缓冲遮蔽与反馈能力。图49显示单一个由四个神经处理单元126构成的神经处理单元群组4901。虽然图49仅显示单一个神经处理单元群组4901,不过需要理解的是,神经网络单元121中的各个神经处理单元126都会包含于一个神经处理单元群组4901内,因此,一共会有N/J个神经处理单元群组4901,其中N是神经处理单元126的数量(举例来说,就宽配置而言为512,就窄配置而言为1024)而J是单一个群组4901内的神经处理单元126的数量(举例来说,就图49的实施例而言即为四)。图49中将神经处理单元群组4901内的四个神经处理单元126称为神经处理单元0,神经处理单元1,神经处理单元2与神经处理单元3。图49的实施例中的各个神经处理单元类似于前述图7的神经处理单元126,并且图中具有相同标号的组件也相类似。不过,多任务缓存器208经调整以包含四个额外的输入4905,多任务缓存器705经调整以包含四个额外的输入4907,选择输入213经调整而能从原本的输入211与207以及额外输入4905中进行选择提供至输出209,并且,选择输入713经调整而能从原本的输入711与206以及额外输入4907中进行选择提供至输出203。如图中所示,图11的列缓冲器1104在图49中即为输出缓冲器1104。进一步来说,图中所示的输出缓冲器1104的文字0,1,2与3接收关联于神经处理单元0,1,2与3的四个启动函数单元212的相对应输出。此部分的输出缓冲器1104包含N个文字对应于神经处理单元群组4901,这些文字称为一个输出缓冲文字群组。在图49的实施例中,N为四。输出缓冲器1104的这四个文字反馈至多任务缓存器208与705,并作为四个额外输入4905由多任务缓存器208所接收以及作为四个额外输入4907由多任务缓存器705所接收。输出缓冲文字群组反馈至其相对应神经处理单元群组4901的反馈动作,使非架构程序的算术指令能够从关联于神经处理单元群组4901的输出缓冲器1104的文字(即输出缓冲文字群组)中选择一个或两个文字作为其输入,其范例请参照后续图51的非架构程序,如图中地址4,8,11,12与15的指令。也就是说,指定于非架构指令内的输出缓冲器1104文字会确认选择输入213/713产生的数值。这个能力实际上使输出缓冲器1104可以作为一个类别草稿存储器(scratchpadmemory),能够让非架构程序减少写入数据随机存取存储器122和/或权重随机存取存储器124以及后续从中读取的次数,例如减少过程中居间产生与使用的数值。较佳地,输出缓冲器1104,或称列缓冲器1104,包括一个一维的缓存器阵列,用以储存1024个窄文字或是512个宽文字。较佳地,对于输出缓冲器1104的读取可以在单一个时频周期内执行,而对于输出缓冲器1104的写入也可以在单一个时频周期内执行。不同于数据随机存取存储器122与权重随机存取存储器124,可由架构程序与非架构程序进行存取,输出缓冲器1104无法由架构程序进行存取,而只能由非架构程序进行存取。输出缓冲器1104将经调整以接收屏蔽输入(maskinput)4903。较佳地,屏蔽输入4903包括四个位对应至输出缓冲器1104的四个文字,此四个文字关联于神经处理单元群组4901的四个神经处理单元126。较佳地,若是此对应至输出缓冲器1104的文字的屏蔽输入4903位为真,此输出缓冲器1104的文字就会维持其当前值;否则,此输出缓冲器1104的文字就会被启动函数单元212的输出所更新。也就是说,若是此对应至输出缓冲器1104的文字的屏蔽输入4903位为假,启动函数单元212的输出就会被写入输出缓冲器1104的文字。如此,非架构程序的输出指令即可选择性地将启动函数单元212的输出写入输出缓冲器1104的某些文字并使输出缓冲器1104的其它文字的当前数值维持不变,其范例请参照后续图51的非架构程序的指令,如图中地址6,10,13与14的指令。也就是说,指定于非架构程序内的输出缓冲器1104的文字即决产生于屏蔽输入4903的数值。为了简化说明,图49中并未显示多任务缓存器208/705的输入1811(如图18,图19与图23所示)。不过,同时支持可动态配置神经处理单元126与输出缓冲器1104的反馈/屏蔽的实施例亦属本发明的范畴。较佳地,在此等实施例中,输出缓冲文字群组为可相对应地动态配置。需要理解的是,虽然此实施例的神经处理单元群组4901内的神经处理单元126的数量为四,不过,本发明并不限于此,群组内神经处理单元126数量较多或较少的实施例均属于本发明的范畴。此外,就一个具有共享启动函数单元1112的实施例而言,如图52所示,一个神经处理单元群组4901内的神经处理单元126数量与一个启动函数单元212群组内的神经处理单元126数量会有协同影响。神经处理单元群组内输出缓冲器1104的遮蔽与反馈能力特别有助于提升关联于长短期记忆胞4600的计算效率,详如后续图50与图51所述。图50为一方块图,显示当神经网络单元121执行关联于图46中由128个长短期记忆胞4600构成的一层级的计算时,图49的神经网络单元121的数据随机存取存储器122,权重随机存取存储器124与输出缓冲器1104内的数据配置的一范例。在图50的范例中,神经网络单元121配置为512个神经处理单元126或神经元,例如采取宽配置。如同图47与图48的范例,在图50与图51的范例中的长短期记忆层中只具有128个长短期记忆胞4600。不过,在图50的范例中,全部512个神经处理单元126(如神经处理单元0至127)产生的数值都会被使用。在执行图51的非架构程序的时候,各个神经处理单元群组4901会集体做为一个长短期记忆胞4600进行运作。如图中所示,数据随机存存储器122装载记忆胞输入(X)与输出(H)值供一系列时间步骤使用。进一步来说,对于一给定时间步骤,会有一对两列存储器分别装载X数值与H数值。以一个具有64列的数据随机存取存储器122为例,如图中所示,此数据随机存取存储器122所装载的记忆胞数值可供31个不同时间步骤使用。在图50的范例中,列2与3装载供时间步骤0使用的数值,列4与5装载供时间步骤1使用的数值,依此类推,列62与63装载供时间步骤30使用的数值。这对两列存储器中的第一列装载此时间步骤的X数值,而第二列则是装载此时间步骤的H数值。如图中所示,数据随机存取存储器122中各组四行对应至神经处理单元群组4901的存储器装载供其对应长短期记忆胞4600使用的数值。也就是说,行0至3装载关联于长短期记忆胞0的数值,其计算是由神经处理单元0-3执行,即神经处理单元群组0执行;行4至7装载关联于长短期记忆胞1的数值,其计算是由神经处理单元4-7执行,即神经处理单元群组1执行;依此类推,行508至511装载关联于长短期记忆胞127的数值,其计算是由神经处理单元508-511执行,即神经处理单元群组127执行,详如后续图51所示。如图中所示,列1并未被使用,列0装载初始的记忆胞输出(H)值,就一较佳实施例而言,可由架构程序填入零值,不过,本发明并不限于此,利用非架构程序指令填入列0的初始记忆胞输出(H)数值也属于本发明的范畴。较佳地,X数值(位于列2,4,6依此类推至列62)由执行于处理器100的架构程序透过MTNN指令1400写入/填入数据随机存取存储器122,并由执行于神经网络单元121的非架构程序进行读取/使用,例如图50所示的非架构程序。较佳地,H数值(位于列3,5,7依此类推至列63)由执行于神经网络单元121的非架构程序写入/填入数据随机存取存储器122并进行读取/使用,详如后述。较佳地,H数值并由执行于处理器100的架构程序透过MFNN指令1500进行读取。需要注意的是,图51的非架构程序假定对应至神经处理单元群组4901的各组四行存储器(如行0-3,行4-7,行5-8,依此类推至行508-511)中,在一给定列的四个X数值填入相同的数值(例如由架构程序填入)。类似地,图51的非架构程序会在对应至神经处理单元群组4901的各组四行存储器中,计算并对一给定列的四个H数值写入相同数值。如图中所示,权重随机存取存储器124装载神经网络单元121的神经处理单元所需的权重,偏移与记忆胞状态(C)值。在对应至神经处理单元群组121的各组四行存储器中(例如行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的余数等于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写入/填入权重随机存取存储器124,并由执行于神经网络单元121的非架构程序进行读取/使用,如图51的非架构程序。较佳地,居间的C值由执行于神经网络单元121的非架构程序写入/填入权重随机存取存储器124并进行读取/使用,详如后述。图50的范例假定架构程序会执行以下步骤:(1)对于31个不同的时间步骤,将输入X的数值填入数据随机存取存储器122(列2,4,依此类推至列62);(2)启动图51的非架构程序;(3)侦测非架构程序是否执行完毕;(4)从数据随机存取存储器122读出输出H的数值(列3,5,依此类推至列63);以及(5)重复步骤(1)至(4)若干次直到完成任务,例如对手机使用者的话语进行辨识所需的计算。在另一种执行方式中,架构程序会执行以下步骤:(1)对单一个时间步骤,以输入X的数值填入数据随机存取存储器122(如列2);(2)启动非架构程序(图51非架构程序的修正后版本,不需循环,并且只存取数据随机存取存储器122的单一对两列);(3)侦测非架构程序是否执行完毕;(4)从数据随机存取存储器122读出输出H的数值(如列3);以及(5)重复步骤(1)至(4)若干次直到完成任务。此二种方式何者为优可依据长短期记忆层的输入X数值的取样方式而定。举例来说,若是此任务容许在多个时间步骤对输入进行取样(例如大约31个时间步骤)并执行计算,第一种方式就较为理想,因为此方式可能带来更多计算资源效率和/或较佳的效能,不过,若是此任务只容许在单一个时间步骤执行取样,就需要使用第二种方式。第三实施例类似于前述第二种方式,不过,不同于第二种方式使用单一对两列数据随机存取存储器122,此方式的非架构程序使用多对存储器列,也就是在各个时间步骤使用不同对存储器列,此部分类似于第一种方式。较佳地,此第三实施例的架构程序在步骤(2)前包含一步骤,在此步骤中,架构程序会在非架构程序启动前对其进行更新,例如将地址1的指令内的数据随机存取存储器122列更新为指向下一对两列存储器。如图中所示,对于神经网络单元121的神经处理单元0至511,在图51的非架构程序中不同地址的指令执行后,输出缓冲器1104装载记忆胞输出(H),候选记忆胞状态(C’),输入闸(I),遗忘闸(F),输出闸(O),记忆胞状态(C)与tanh(C)的居间值,每一个输出缓冲文字群组中(例如输出缓冲器1104对应至神经处理单元群组4901的四个文字的群组,如文字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的指令执行后,对于各个神经处理单元群组4901而言,输出缓冲器1104的全部四个文字都会写入相对应长短期记忆胞4600的初始记忆胞输出(H)值。在地址6的指令执行后,对于各个神经处理单元群组4901而言,输出缓冲器1104的OUTBUF[3]文字会写入相对应长短期记忆胞4600的候选记忆胞状态(C’)值,而输出缓冲器1104的其它三个文字则会维持其先前数值。在地址10的指令执行后,对于各个神经处理单元群组4901而言,输出缓冲器1104的OUTBUF[0]文字会写入相对应长短期记忆胞4600的输入闸(I)数值,OUTBUF[1]文字会写入相对应长短期记忆胞4600的遗忘闸(F)数值,OUTBUF[2]文字会写入相对应长短期记忆胞4600的输出闸(O)数值,而OUTBUF[3]文字则是维持其先前数值。在地址13的指令执行后,对于各个神经处理单元群组4901而言,输出缓冲器1104的OUTBUF[3]文字会写入相对应长短期记忆胞4600的新的记忆胞状态(C)值(对于输出缓冲器1104而言,包含槽(slot)3的C数值,写入权重随机存取存储器124的列6,详如后续图51所述),而输出缓冲器1104的其它三个文字则是维持其先前数值。在地址14的指令执行后,对于各个神经处理单元群组4901而言,输出缓冲器1104的OUTBUF[3]文字会写入相对应长短期记忆胞4600的tanh(C)数值,而输出缓冲器1104的其它三个文字则是维持其先前数值。在地址16的指令执行后,对于各个神经处理单元群组4901而言,输出缓冲器1104的全部四个文字都会写入相对应长短期记忆胞4600的新的记忆胞输出(H)值。前述地址6至16的执行流程(也就是排除地址2的执行,这是因为地址2不属于程序循环的一部分)会再重复三十次,作为地址17回到地址3的程序循环。图51为一表格,显示储存于神经网络单元121的程序存储器129的程序,此程序由图49的神经网络单元121执行并依据图50的配置使用数据与权重,以达成关联于长短期记忆胞层的计算。图51的范例程序包含18个非架构指令分别位于地址0至17。地址0的指令是一个初始化指令,用以清除累加器202并将循环计数器3804初始化至数值31,以执行31次循环组(地址1至17的指令)。此初始化指令并会将数据随机存取存储器122的待写入列(例如图26/图39的缓存器2606)初始化为数值1,而在地址16的指令的第一次执行后,此数值会增加至3。较佳地,此初始化指令并会使神经网络单元121处于宽配置,如此,神经网络单元121就会配置有512个神经处理单元126。如后续章节所述,在地址0至17的指令执行过程中,这512个神经处理单元126构成的128个神经处理单元群组4901作为128个相对应的长短期记忆胞4600进行运作。地址1与2的指令不属于程序的循环组而只会执行一次。这些指令会产生初始记忆胞输出(H)值(例如0)并将其写入输出缓冲器1104的所有文字。地址1的指令会从数据随机存取存储器122的列0读取初始H数值并将其放置于由地址0的指令清除的累加器202。地址2的指令(OUTPUTPASSTHRU,NOP,CLRACC)会将累加器202数值传递至输出缓冲器1104,如图50所示。地址2的输出指令(以及图51的其它输出指令)中的“NOP”标示表示输出值只会被写入输出缓冲器1104,而不会被写入存储器,也就是不会被写入数据随机存取存储器122或权重随机存取存储器124。地址2的指令并会清除累加器202。地址3至17的指令位于循环组内,其执行次数为循环计数的数值(如31)。地址3至6的指令的每一次执行会计算当前时间步骤的tanh(C’)数值并将其写入文字OUTBUF[3],此文字将会被地址11的指令使用。更精确地说,地址3的乘法累加指令会从数据随机存取存储器122的当前读取列(如列2,4,6依此类推至列62)读取关联于此时间步骤的记忆胞输入(X)值,从权重随机存取存储器124的列0读取Wc数值,并将前述数值相乘以产生一乘积加入由地址2的指令清除的累加器202。地址4的乘法累加指令(MULT-ACCUMOUTBUF[0],WRROW1)会从文字OUTBUF[0]读取H数值(即神经处理单元群组4901的全部四个神经处理单元126),从权重随机存取存储器124的列1读取Uc数值,并将前述数值相乘以产生一第二乘积加入累加器202。地址5的将权重文字加入累加器指令(ADD_W_ACCWRROW2)会从权重随机存取存储器124的列2读取Bc数值并将其加入累加器202。地址6的输出指令(OUTPUTTANH,NOP,MASK[0:2],CLRACC)会对累加器202数值执行双曲正切启动函数,并且只将执行结果写入文字OUTBUF[3](也即,只有神经处理单元群组4901中编号除4的余数为3的神经处理单元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的乘法累加指令会从数据随机存取存储器122的当前读取列(如列2,4,6依此类推至列62)读取关联于此时间步骤的记忆胞输入(X)值,从权重随机存取存储器124的列3读取Wi,Wf与Wo数值,并将前述数值相乘以产生一乘积加入由地址6的指令清除的累加器202。更精确地说,在神经处理单元群组4901中,编号除4的余数为0的神经处理单元126会计算X与Wi的乘积,编号除4的余数为1的神经处理单元126会计算X与Wf的乘积,而编号除4的余数为2的神经处理单元126会计算X与Wo的乘积。地址8的乘法累加指令会从文字OUTBUF[0]读取H数值(即神经处理单元群组4901的全部四个神经处理单元126),从权重随机存取存储器124的列4读取Ui,Uf与Uo数值,并将前述数值相乘以产生一第二乘积加入累加器202。更精确地说,在神经处理单元群组4901中,编号除4的余数为0的神经处理单元126会计算H与Ui的乘积,编号除4的余数为1的神经处理单元126会计算H与Uf的乘积,而编号除4的余数为2的神经处理单元126会计算H与Uo的乘积。地址9的将权重文字加入累加器指令(ADD_W_ACCWRROW2)会从权重随机存取存储器124的列5读取Bi,Bf与Bo数值并将其加入累加器202。更精确地说,,在神经处理单元群组4901中,编号除4的余数为0的神经处理单元126会执行Bi数值的加法计算,编号除4的余数为1的神经处理单元126会执行Bf数值的加法计算,而编号除4的余数为2的神经处理单元126会执行Bo数值的加法计算。地址10的输出指令(OUTPUTSIGMOID,NOP,MASK[3],CLRACC)会对累加器202数值执行S型启动函数并将计算出来的I,F与O数值分别写入文字OUTBUF[0],OUTBUF[1]与OUTBUF[2],此指令并会清除累加器202,而不写入存储器。也就是说,地址10的输出指令会遮蔽文字OUTBUF[3](如指令术语MASK[3]所表示)而维持此文字的当前数值(也就是C’),如图50所示。地址11至13的指令的每一次执行会计算当前时间步骤产生的新的记忆胞状态(C)值并将其写入权重随机存取存储器124的列6供下一个时间步骤使用(也就是供地址12的指令在下一次循环执行时使用),更精确的说,此数值写入列6对应于神经处理单元群组4901的四行文字中标号除4的余数为3的文字。此外,地址14的指令的每一次执行都会将tanh(C)数值写入OUTBUF[3]供地址15的指令使用。更精确地说,地址11的乘法累加指令(MULT-ACCUMOUTBUF[0],OUTBUF[3])会从文字OUTBUF[0]读取输入闸(I)数值,从文字OUTBUF[3]读取候选记忆胞状态(C’)值,并将前述数值相乘以产生一第一乘积加入由地址10的指令清除的累加器202。更精确地说,神经处理单元群组4901的四个神经处理单元126中的各个神经处理单元126都会计算I数值与C’数值的第一乘积。地址12的乘法累加指令(MULT-ACCUMOUTBUF[1],WRROW6)会指示神经处理单元126从文字OUTBUF[1]读取遗忘闸(F)数值,从权重随机存取存储器124的列6读取其相对应文字,并将其相乘以产生第二乘积与地址11的指令产生于累加器202内的第一乘积相加。更精确地说,对于神经处理单元群组4901内标号除4的余数为3的神经处理单元126而言,从列6读取的文字是先前时间步骤计算出的当前记忆胞状态(C)值,第一乘积与第二乘积的加总即为此新的记忆胞状态(C)。不过,对于神经处理单元群组4901的其它三个神经处理单元126而言,从列6读取的文字是不需理会的数值,这是因为这些数值所产生的累加值将不被使用,也即不会被地址13与14的指令放入输出缓冲器1104而会被地址14的指令所清除。也就是说,只有神经处理单元群组4901中标号除4的余数为3的神经处理单元126所产生的新的记忆胞状态(C)值将会被使用,即被地址13与14的指令使用。就地址12的指令的第二至三十一次执行而言,从权重随机存取存储器124的列6读取的C数值是循环组的前次执行中由地址13的指令写入的数值。不过,对于地址12的指令的第一次执行而言,列6的C数值则是由架构程序在启动图51的非架构程序前或是由非架构程序的一调整后版本写入的初始值。地址13的输出指令(OUTPUTPASSTHRU,WRROW6,MASK[0:2])只会传递累加器202数值,即计算出的C数值,至文字OUTBUF[3](也就是说,只有神经处理单元群组4901中标号除4的余数为3的神经处理单元126会将其计算出的C数值写入输出缓冲器1104),而权重随机存取存储器124的列6则是以更新后的输出缓冲器1104写入,如图50所示。也就是说,地址13的输出指令会遮蔽文字OUTBUF[0],OUTBUF[1]与OUTBUF[2]而维持其当前数值(即I,F与O数值)。如前述,只有列6对应于神经处理单元群组4901的四行文字中标号除4的余数为3的文字内的C数值会被使用,也就是由地址12的指令使用;因此,非架构程序不会理会权重随机存取存储器124的列6中位于行0-2,行4-6,依此类推至行508-510的数值,如图50所示(即I,F与O数值)。地址14的输出指令(OUTPUTTANH,NOP,MASK[0:2],CLRACC)会对累加器202数值执行双曲正切启动函数,并将计算出来的tanh(C)数值写入文字OUTBUF[3],此指令并会清除累加器202,而不写入存储器。地址14的输出指令,如同地址13的输出指令,会遮蔽文字OUTBUF[0],OUTBUF[1]与OUTBUF[2]而维持其原本数值,如图50所示。地址15至16的指令的每一次执行会计算当前时间步骤产生的记忆胞输出(H)值并将其写入数据随机存取存储器122的当前输出列后方第二列,其数值将会由架构程序读取并用于下一次时间步骤(也即在下一次循环执行中由地址3及7的指令使用)。更精确地说,地址15的乘法累加指令会从文字OUTBUF[2]读取输出闸(O)数值,从文字OUTBUF[3]读取tanh(C)数值,并将其相乘以产生一乘积加入由地址14的指令清除的累加器202。更精确地说,神经处理单元群组4901的四个神经处理单元126中的各个神经处理单元126都会计算数值O与tanh(C)的乘积。地址16的输出指令会传递累加器202数值并在第一次执行中将计算出的H数值写入列3,在第二次执行中将计算出的H数值写入列5,依此类推在第三十一次执行中将计算出的H数值写入列63,如图50所示,接下来这些数值会由地址4与8的指令使用。此外,如图50所示,这些计算出来的H数值会被放入输出缓冲器1104供地址4与8的指令后续使用。地址16的输出指令并会清除累加器202。在一实施例中,长短期记忆胞4600的设计使地址16的输出指令(以及/或图48中地址22的输出指令)具有一启动函数,如S型或双曲正切函数,而非传递累加器202数值。地址17的循环指令会使循环计数器3804递减并且在新的循环计数器3804数值大于零的情况下回到地址3的指令。由此可发现,因为图49的神经网络单元121实施例中的输出缓冲器1104的反馈与屏蔽能力,图51的非架构程序的循环组内的指令数相较于图48的非架构指令大致减少34%。此外,因为图49的神经网络单元121实施例中的输出缓冲器1104的反馈与屏蔽能力,图51非架构程序的数据随机存取存储器122中的存储器配置所搭配的时间步骤数大致为图48的三倍。前述改善有助于某些利用神经网络单元121执行长短期记忆胞层计算的架构程序应用,特别是针对长短期记忆胞层中的长短期记忆胞4600数量少于或等于128的应用。图47至图51的实施例假定各个时间步骤中的权重与偏移值维持不变。不过,本发明并不限于此,其它权重与偏移值随时间步骤改变的实施例也属本发明的范畴,其中,权重随机存取存储器124并非如图47至图50所示填入单一组权重与偏移值,而是在各个时间步骤填入不同组权重与偏移值而图48至图51的非架构程序的权重随机存取存储器124地址会随之调整。基本上,在前述图47至图51的实施例中,权重,偏移与居间值(如C,C’数值)储存于权重随机存取存储器124,而输入与输出值(如X,H数值)则是储存于数据随机存取存储器122。此特征有利于数据随机存取存储器122为双端口而权重随机存取存储器124为单端口的实施例,这是因为从非架构程序与架构程序至数据随机存取存储器122会有更多的流量。不过,因为权重随机存取存储器124较大,在本发明的另一实施例中则是互换储存非架构与架构程序写入数值的存储器(即互换数据随机存取存储器122与权重随机存取存储器124)。也就是说,W,U,B,C’,tanh(C)与C数值储存于数据随机存取存储器122而X,H,I,F与O数值则是储存于权重随机存取存储器124(图47的调整后实施例);以及W,U,B,与C数值储存于数据随机存取存储器122而X与H数值则是储存于权重随机存取存储器124(图50的调整后实施例)。因为权重随机存取存储器124较大,这些实施例在一个批次中可处理较多时间步骤。对于利用神经网络单元121执行计算的架构程序的应用而言,此特征有利于某些能从较多的时间步骤得利的应用并且可以为单端口设计的存储器(如权重随机存取存储器124)提供足够频宽。图52为一方块图,显示神经网络单元121的实施例,此实施例的神经处理单元群组内具有输出缓冲遮蔽与反馈能力,并且共享启动函数单元1112。图52的神经网络单元121类似于图47的神经网络单元121,并且图中具有相同标号的组件也相类似。不过,图49的四个启动函数单元212在本实施例中则是由单一个共享启动函数单元1112所取代,此单一个启动函数单元会接收四个来自四个累加器202的输出217并产生四个输出至文字OUTBUF[0],OUTBUF[1],OUTBUF[2]与OUTBUF[3]。图52的神经网络单元212的运作方式类似于前文图49至图51所述的实施例,并且其运作共享启动函数单元1112的方式类似于前文图11至图13所述的实施例。图53为一方块图,显示当神经网络单元121执行关联于图46中一个具有128个长短期记忆胞4600的层级的计算时,图49的神经网络单元121的数据随机存取存储器122,权重随机存取存储器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)。另外,图53的输出缓冲器1104的内容类似于图50,不过,因为图54与图51的非架构程序的差异,第三列的内容(即I,F,O与C’数值)是在地址7的指令执行后出现在输出缓冲器1104(而非如图50是地址10的指令);第四列的内容(即I,F,O与C数值)是在地址10的指令执行后出现在输出缓冲器1104(而非如图50是地址13的指令);第五列的内容(即I,F,O与tanh(C)数值)是在地址11的指令执行后出现在输出缓冲器1104(而非如图50是地址14的指令);并且第六列的内容(即H数值)是在地址13的指令执行后出现在输出缓冲器1104(而非如图50是地址16的指令),详如后述。图54为一表格,显示储存于神经网络单元121的程序存储器129的程序,此程序由图49的神经网络单元121执行并依据图53的配置使用数据与权重,以达成关联于长短期记忆胞层的计算。图54的范例程序类似于图51的程序。更精确地说,图54与图51中,地址0至5的指令相同;图54中地址7与8的指令相同于图51中地址10与11的指令;并且图54中地址10到14的指令相同于图51中地址13到17的指令。不过,图54中地址6的指令并不会清除累加器202(相较之下,图51中地址6的指令则会清除累加器202)。此外,图51中地址7至9的指令并不出现在图54的非架构程序内。最后,就图54中地址9的指令与图51中地址12的指令而言,除了图54中地址9的指令读取权重随机存取存储器124的列3而图51中地址12的指令则是读取权重随机存取存储器的列6外,其它部分均相同。因为图54的非架构程序与图51的非架构程序的差异,图53的配置使用的权重随机存取存储器124的列数会减少三个,而程序循环内的指令数也会减少三个。图54的非架构程序内的循环组尺寸实质上只有图48的非架构程序内的循环组尺寸的一半,并且大致只有图51的非架构程序内的循环组尺寸的80%。图55为一方块图,显示本发明另一实施例的神经处理单元126的部分。更精确地说,对于图49的多个神经处理单元126中的单一个神经处理单元126而言,图中显示多任务缓存器208与其相关联输入207,211与4905,以及多任务缓存器705与其相关联输入206,711与4907。除了图49的输入外,神经处理单元126的多任务缓存器208与多任务缓存器705个别接收一群组内编号(index_within_group)输入5599。群组内编号输入5599指出特定神经处理单元126在其神经处理单元群组4901内的编号。因此,举例来说,以各个神经处理单元群组4901具有四个神经处理单元126的实施例为例,在各个神经处理单元群组4901内,其中一个神经处理单元126在其群组内编号输入5599中接收数值零,其中一个神经处理单元126在其群组内编号输入5599中接收数值一,其中一个神经处理单元126在其群组内编号输入5599中接收数值二,而其中一个神经处理单元126在其群组内编号输入5599中接收数值三。换句话说,神经处理单元126所接收的群组内编号输入5599数值就是此神经处理单元126在神经网络单元121内的编号除以J的余数,其中J是神经处理单元群组4901内的神经处理单元126的数量。因此,举例来说,神经处理单元73在其群组内编号输入5599接收数值一,神经处理单元353在其群组内编号输入5599接收数值三,而神经处理单元6在其群组内编号输入5599接收数值二。此外,当控制输入213指定一默认值,在此表示为“SELF”,多任务缓存器208会选择对应于群组内编号输入5599数值的输出缓冲器1104输出4905。因此,当非架构指令以SELF的数值指定接收来自输出缓冲器1104的数据(在图57地址2与7的指令中标示为OUTBUF[SELF]),各个神经处理单元126的多任务缓存器208会从输出缓冲器1104接收其相对应文字。因此,举例来说,当神经网络单元121执行图57中地址2与7的非架构指令,神经处理单元73的多任务缓存器208会在四个输入4905中选择第二个(编号1)输入以接收来自输出缓冲器1104的文字73,神经处理单元353的多任务缓存器208会在四个输入4905中选择第四个(编号3)输入以接收来自输出缓冲器1104的文字353,而神经处理单元6的多任务缓存器208会在四个输入4905中选择第三个(编号2)输入以接收来自输出缓冲器1104的文字6。虽然并未使用于图57的非架构程序,不过,非架构指令也可利用SELF数值(OUTBUF[SELF])指定接收来自输出缓冲器1104的数据而使控制输入713指定默认值使各个神经处理单元126的多任务缓存器705从输出缓冲器1104接收其相对应文字。图56为一方块图,显示当神经网络单元执行关联于图43的Jordan时间递归神经网络的计算并利用图55的实施例时,神经网络单元121的数据随机存取存储器122与权重随机存取存储器124内的数据配置的一范例。图中权重随机存取存储器124内的权重配置相同于图44的范例。图中数据随机存取存储器122内的数值的配置相似于图44的范例,除了在本范例中,各个时间步骤具有相对应的一对两列存储器以装载输入层节点D值与输出层节点Y值,而非如图44的范例使用一组四列的存储器。也就是说,在本范例中,隐藏层Z数值与内容层C数值并不写入数据随机存取存储器122。而是将输出缓冲器1104作为隐藏层Z数值与内容层C数值的类别草稿存储器,详如图57的非架构程序所述。前述OUTBUF[SELF]输出缓冲器1104的反馈特征,可以使非架构程序的运作更为快速(这是将对于数据随机存取存储器122执行的两次写入与两次读取动作,以对于输出缓冲器1104执行的两次写入与两次读取动作来取代)并减少各个时间步骤使用的数据随机存取存储器122的空间,而使本实施例的数据随机存取存储器122所装载的数据可用于大约两倍于图44与图45的实施例所具有的时间步骤,如图中所示,即32个时间步骤。图57为一表格,显示储存于神经网络单元121的程序存储器129的程序,此程序由神经网络单元121执行并依据图56的配置使用数据与权重,以达成Jordan时间递归神经网络。图57的非架构程序类似于图45的非架构程序,其差异处如下所述。图57的范例程序具有12个非架构指令分别位于地址0至11。地址0的初始化指令会清除累加器202并将循环计数器3804的数值初始化为32,使循环组(地址2至11的指令)执行32次。地址1的输出指令会将累加器202(由地址0的指令所清除)的零值放入输出缓冲器1104。由此可观察到,在地址2至6的指令的执行过程中,这512个神经处理单元126对应并作为512个隐藏层节点Z进行运作,而在地址7至10的指令的执行过程中,对应并作为512个输出层节点Y进行运作。也就是说,地址2至6的指令的32次执行会计算32个相对应时间步骤的隐藏层节点Z数值,并将其放入输出缓冲器1104供地址7至9的指令的相对应32次执行使用,以计算这32个相对应时间步骤的输出层节点Y并将其写入数据随机存取存储器122,并提供地址10的指令的相对应32次执行使用,以将这32个相对应时间步骤的内容层节点C放入输出缓冲器1104。(放入输出缓冲器1104中第32个时间步骤的内容层节点C并不会被使用。)在地址2与3的指令(ADD_D_ACCOUTBUF[SELF]与ADD_D_ACCROTATE,COUNT=511)的第一次执行中,512个神经处理单元126中的各个神经处理单元126会将输出缓冲器1104的512个内容节点C值累加至其累加器202,这些内容节点C值由地址0至1的指令执行所产生与写入。在地址2与3的指令的第二次执行中,这512个神经处理单元126中的各个神经处理单元126会将输出缓冲器1104的512个内容节点C值累加至其累加器202,这些内容节点C值由地址7至8与10的指令执行所产生与写入。更精确地说,地址2的指令会指示各个神经处理单元126的多任务缓存器208选择其相对应输出缓冲器1104文字,如前所述,并将其加入累加器202;地址3的指令会指示神经处理单元126在512个文字的旋转器内旋转内容节点C值,此512个文字的旋转器由这512个神经处理单元中相连接的多任务缓存器208的集体运作所构成,而使各个神经处理单元126可以将这512个内容节点C值累加至其累加器202。地址3的指令并不会清除累加器202,如此地址4与5的指令即可将输入层节点D值(乘上其相对应权重)加上由地址2与3的指令累加出的内容层节点C值。在地址4与5的指令(MULT-ACCUMDRROW+2,WRROW0与MULT-ACCUMROTATE,WRROW+1,COUNT=511)的各次执行中,这512个神经处理单元126中的各个神经处理单元126会执行512次乘法运算,将数据随机存取存储器122中关联于当前时间步骤的列(例如:对于时间步骤0而言即为列0,对于时间步骤1而言即为列2,依此类推,对于对于时间步骤31而言即为列62)的512个输入节点D值,乘上权重随机存取存储器124的列0至511中对应于此神经处理单元126的行的权重,以产生512个乘积,而连同这地址2与3的指令对于这512个内容节点C值执行的累加结果,一并累加至相对应神经处理单元126的累加器202以计算隐藏节点Z层数值。在地址6的指令(OUTPUTPASSTHRU,NOP,CLRACC)的各次执行中,这512个神经处理单元126的512个累加器202数值传递并写入输出缓冲器1104的相对应文字,并且累加器202会被清除。在地址7与8的指令(MULT-ACCUMOUTBUF[SELF],WRROW512与MULT-ACCUMROTATE,WRROW+1,COUNT=511)的执行过程中,这512个神经处理单元126中的各个神经处理单元126会执行512次乘法运算,将输出缓冲器1104中的512个隐藏节点Z值(由地址2至6的指令的相对应次执行所产生并写入),乘上权重随机存取存储器124的列512至1023中对应于此神经处理单元126的行的权重,以产生512个乘积累加至相对应神经处理单元126的累加器202。在地址9的指令(OUTPUTACTIVATIONFUNCTION,DROUTROW+2)的各次执行中,会对于这512个累加值执行启动函数(如双曲正切函数,S型函数,校正函数)以计算输出节点Y值,此输出节点Y值会被写入数据随机存取存储器122中对应于当前时间步骤的列(例如:对于时间步骤0而言即为列1,对于时间步骤1而言即为列3,依此类推,对于时间步骤31而言即为列63)。地址9的指令并不会清除累加器202。在地址10的指令(OUTPUTPASSTHRU,NOP,CLRACC)的各次执行中,地址7与8的指令累加出的512个数值会被放入输出缓冲器1104供地址2与3的指令的下一次执行使用,并且累加器202会被清除。地址11的循环指令会使循环计数器3804的数值递减,而若是新的循环计数器3804数值仍然大于零,就指示回到地址2的指令。如同对应于图44的章节所述,在利用图57的非架构程序执行Jordan时间递归神经网络的范例中,虽然会对于累加器202数值施以启动函数以产生输出层节点Y值,不过,此范例假定在施以启动函数前,累加器202数值就传递至内容层节点C,而非传递真正的输出层节点Y值。不过,对于将启动函数施加于累加器202数值以产生内容层节点C的Jordan时间递归神经网络而言,地址10的指令将会从图57的非架构程序中移除。在本文所述的实施例中,Elman或Jordan时间递归神经网络具有单一个隐藏节点层(如图40与图42),不过,需要理解的是,这些处理器100与神经网络单元121的实施例可以使用类似于本文所述的方式,有效地执行关联于具有多个隐藏层的时间递归神经网络的计算。如前文对应于图2的章节所述,各个神经处理单元126作为一个人工神经网络内的神经元进行运作,而神经网络单元121内所有的神经处理单元126会以大规模平行处理的方式有效地计算此网络的一层级的神经元输出值。此神经网络单元的平行处理方式,特别是使用神经处理单元多任务缓存器集体构成的旋转器,并非传统上计算神经元层输出的方式所能直觉想到。进一步来说,传统方式通常涉及关联于单一个神经元或是一个非常小的神经元子集合的计算(例如,使用平行算术单元执行乘法与加法计算),然后就继续执行关联于同一层级的下一个神经元的计算,依此类推以序列方式继续执行,直到完成对于此层级中所有的神经元的计算。相较之下,本发明在各个时频周期内,神经网络单元121的所有神经处理单元126(神经元)会平行执行关联于产生所有神经元输出所需计算中的一个小集合(例如单一个乘法与累加计算)。在大约M个时频周期结束后-M是当前层级内连结的节点数-神经网络单元121就会计算出所有神经元的输出。在许多人工神经网络配置中,因为存在大量神经处理单元126,神经网络单元121就可以在M个时频周期结束时对于整层级的所有神经元计算其神经元输出值。如本文所述,此计算对于所有类型的人工神经网络计算而言都具效率,这些人工神经网络包含但不限于前馈与时间递归神经网络,如Elman,Jordan与长短期记忆网络。最后,虽然本文的实施例中,神经网络单元121配置为512个神经处理单元126(例如采取宽文字配置)以执行时间递归神经网络的计算,不过,本发明并不限于此,将神经网络单元121配置为1024个神经处理单元126(例如采取窄文字配置)以执行时间递归神经网络单元的计算的实施例,以及如前述具有512与1024以外其它数量的神经处理单元126的神经网络单元121,也属本发明的范畴。惟以上所述者,仅为本发明的较佳实施例而已,当不能以此限定本发明实施的范围,即大凡依本发明申请专利范围及发明说明内容所作的简单的等效变化与修饰,皆仍属本发明专利涵盖的范围内。举例来说,软件可以执行本发明所述的装置与方法的功能、制造、形塑、仿真、描述以及/或测试等。这可由一般的程序语言(如C、C++)、硬件描述语言(HDL)包含VerilogHDL,VHDL等,或是其它既有程序来达成。此软件可以设置于任何已知的计算机可利用媒介,如磁带、半导体、磁盘、光盘(如CD-ROM、DVD-ROM等)、网络接线、无线或是其它通讯媒介。此处描述的装置与方法的实施例可被包含于半导体智财核心,例如微处理核心(如以硬件描述语言的实施方式)并且透过集成电路的制作转换为硬件。此外,本文所描述的装置与方法也可包含硬件与软件的结合。因此,本文所述的任何实施例,并非用以限定本发明的范围。此外,本发明可应用于一般通用计算机的微处理器装置。最后,所属
技术领域:
:具有通常知识者利用本发明所揭露的观念与实施例作为基础,来设计并调整出不同的结构已达成相同的目的,也不超出本发明的范围。当前第1页1 2 3 当前第1页1 2 3