处理器、用于操作处理器的方法和计算机可用介质与流程

文档序号:15934227发布日期:2018-11-14 02:07阅读:154来源:国知局
本发明涉及一种处理器、用于操作处理器的方法和计算机可用介质,尤其涉及具有可操作为牺牲高速缓存器(victimcache)数据存储或加速存储器并且在低级高速缓存器中具有牺牲高速缓存器标记的选择性数据存储的处理器。
背景技术
:最近,人工神经网络(artificialneuralnetwork,ann)重新吸引了人们的兴趣,并且这种研究通常被称为深度学习、计算机学习和类似的术语。通用处理器计算能力的提高使得重新提起数十年前所消退的兴趣。ann的最新应用包括语音识别和图像识别等。对于改进与ann相关联的计算的性能和效率的需求正在增大。技术实现要素:一种处理器,包括:处理核心;第一数据存储,其耦接至所述处理核心,加速器,包括:第二数据存储,其用于选择性地保持:从所述第一数据存储驱逐的高速缓存器行,以及所述加速器所处理的加速器数据;标记目录,其耦接至所述处理核心,所述标记目录用于保持针对所述第一数据存储和所述第二数据存储这两者中所储存的高速缓存器行的标记;模式指示符,其用于指示所述第二数据存储是正在第一模式下操作还是正在第二模式下操作,其中在所述第一模式中所述第二数据存储保持从所述第一数据存储驱逐的高速缓存器行,在所述第二模式中所述第二数据存储保持所述加速器所处理的加速器数据;以及控制逻辑,其被配置为响应于从所述第一数据存储驱逐高速缓存器行的请求而进行以下操作:在所述模式指示符指示所述第二数据存储正在所述第一模式下操作的情况下,将高速缓存器行写入所述第二数据存储并且更新所述标记目录中的标记以指示高速缓存器行存在于所述第二数据存储中;以及在所述模式指示符指示所述第二数据存储正在所述第二模式下操作的情况下,将高速缓存器行写入系统存储器而非写入所述第二数据存储。一种用于操作处理器的方法,所述处理器具有:处理核心;第一数据存储,其用于保持所述处理核心所处理的高速缓存器行;加速器,其具有用于选择性地保持从所述第一数据存储驱逐的高速缓存器行和所述加速器所处理的加速器数据的第二数据存储;以及标记目录,其用于保持针对所述第一数据存储和所述第二数据存储这两者中所储存的高速缓存器行的标记,所述方法包括以下步骤:响应于从所述第一数据存储驱逐高速缓存器行的请求而进行以下操作:在所述第二数据存储正在第一模式下操作的情况下,将高速缓存器行写入所述第二数据存储并且更新所述标记目录中的标记以指示高速缓存器行存在于所述第二数据存储中,其中在所述第一模式中所述第二数据存储保持从所述第一数据存储驱逐的高速缓存器行;以及在所述第二数据存储正在第二模式下操作的情况下,将高速缓存器行写入系统存储器而非写入所述第二数据存储,其中在所述第二模式中所述第二数据存储保持所述加速器所处理的加速器数据。一种非暂时性计算机可用介质,其包括计算机可用程序,所述计算机可用程序使得计算机用作根据本申请所述的处理器中的各部件。附图说明图1是示出包括神经网络单元(neuralnetworkunit,nnu)的处理器的框图。图2是示出图1的npu的框图。图3是示出图1的nnu的n个npu的n个复用寄存器(mux-reg)的布置的实施例的框图,以说明n个复用寄存器作为针对从图1的数据ram接收到的一行数据字的n字轮转器(n-wordrotater)或循环移位器的操作。图4是示出用于储存在图1的nnu的程序存储器中并由该nnu执行的程序的表格。图5是示出nnu执行图4的程序的时序图。图6a是示出图1的nnu执行图4的程序的框图。图6b是示出图1的处理器进行架构程序的操作的流程图,所述架构程序使用nnu来执行典型地与人工神经网络的隐藏层的神经元相关联的(诸如图4的程序所执行的)乘法累加激活函数计算。图7是示出根据备选实施例的图1的npu的框图。图8是示出根据备选实施例的图1的npu的框图。图9是示出用于储存在图1的nnu的程序存储器中并由该nnu执行的程序的表格。图10是示出nnu执行图9的程序的时序图。图11是示出图1的nnu的实施例的框图。在图11的实施例中,神经元分成两部分即激活函数单元部分和alu部分(此部分还包括移位寄存器部分),并且各激活函数单元部分由多个alu部分共享。图12是示出图11的nnu执行图4的程序的时序图。图13是示出图11的nnu执行图4的程序的时序图。图14是示出向神经网络移动(mtnn)架构指令以及该架构指令相对于图1的nnu的部分的操作的框图。图15是示出从神经网络移动(mfnn)架构指令以及该架构指令相对于图1的nnu的部分的操作的框图。图16是示出图1的数据ram的实施例的框图。图17是示出图1的权重ram和缓存器的实施例的框图。图18是示出图1的可动态配置的npu的框图。图19是示出根据图18的实施例的图1的nnu的n个npu的2n个复用寄存器的布置的实施例的框图,以说明2n个复用寄存器作为针对从图1的数据ram接收到的一行数据字的轮转器的操作。图20是示出用于储存在图1的nnu的程序存储器中并由该nnu执行的程序的表格,其中所述nnu具有根据图18的实施例的npu。图21是示出nnu执行图20的程序的时序图,其中该nnu包括图18的在窄配置中操作的npu。图22是示出图1的nnu的框图,其中该nnu包括图18的npu以执行图20的程序。图23是示出根据备选实施例的图1的可动态配置的npu的框图。图24是示出图1的nnu执行卷积运算所使用的数据结构的示例的框图。图25是示出图1的处理器执行架构程序的操作的流程图,所述架构程序将对卷积核执行卷积的nnu用于图24的数据阵列。图26a是nnu程序的程序列表,其中该nnu程序利用图24的卷积核对数据矩阵执行卷积并将其写回权重ram。图26b是示出根据一个实施例的图1的nnu的控制寄存器的特定字段的框图。图27是示出填有输入数据的图1的权重ram的示例的框图,其中图1的nnu对所述输入数据进行池化(pooling)运算。图28是nnu程序的程序列表,其中该nnu程序对图27的输入数据矩阵进行池化运算并将其写回权重ram。图29a是示出图1的控制寄存器的实施例的框图。图29b是示出根据备选实施例的图1的控制寄存器的实施例的框图。图29c是示出根据一个实施例的存储为两个部分的图29a的倒数的实施例的框图。图30是更详细示出图2的afu的实施例的框图。图31是图30的afu的操作的示例。图32是图30的afu的操作的第二示例。图33是图30的afu的操作的第三示例。图34是示出图1的处理器以及图1的nnu的更详细的部分的框图。图35是示出包括可变速率nnu的处理器的框图。图36a是示出具有在一般模式中操作即以主时钟速率操作的nnu的处理器的操作示例的时序图。图36b是示出具有在缓和模式中操作即以比主时钟速率小的速率操作的nnu的处理器的操作示例的时序图。图37是示出图35的处理器的操作的流程图。图38是更详细示出nnu的序列的框图。图39是示出nnu的控制和状态寄存器的特定字段的框图。图40是示出处理器的框图。图41是更详细示出图40的nnu、以及图40的环站(ringstop)的框图。图42是示出在图41的存储器阵列正从用作llc片时的高速缓存存储器模式转换为用作nnu的权重/数据ram时的nnu模式的情况下的图40的处理器的操作的流程图。图43是示出在图41的存储器阵列正从用作nnu的权重/数据ram时的nnu模式转换为用作llc片时的高速缓存存储器模式的情况下的图40的处理器的操作的流程图。图44是示出在图41的存储器阵列正从用作nnu的权重/数据ram时的nnu模式转换为用作牺牲高速缓存器时的高速缓存存储器模式的情况下的图40的处理器的操作的流程图。图45是示出在图41的存储器阵列正从用作牺牲高速缓存器时的高速缓存存储器模式转换为用作nnu的权重/数据ram时的nnu模式的情况下的图40的处理器的操作的流程图。图46是示出根据备选实施例的处理器的框图。图47是示出图46的标记目录中的集合的框图。图48是示出图46的处理器进行从l3高速缓存器至牺牲高速缓存器的高速缓存器行的驱逐的操作的流程图。图49是示出图46的处理器进行从牺牲高速缓存器至核心的高速缓存器行的加载请求的操作的流程图。图50是示出在图46的选择性数据存储正从用作nnu的权重/数据ram时的nnu模式转换为用作牺牲高速缓存器时的牺牲高速缓存器模式的情况下的图46的处理器的操作的流程图。图51是示出在图46的选择性数据存储正从用作牺牲高速缓存器时的牺牲高速缓存器模式转换为用作nnu的权重/数据ram时的nnu模式的情况下的图46的处理器的操作的流程图。图52是示出nnu的部分的实施例的框图。图53是更详细示出图46的环站的框图。图54是更详细示出图53的从接口的框图。图55是更详细示出图53的主接口0的框图。图56是示出图53的环站以及nnu的环形总线耦接实施例的部分的框图。图57是示出nnu的环形总线耦接实施例的框图。具体实施方式具有架构神经网络单元的处理器现参考图1,示出一框图,该框图示出包括神经网络单元(nnu)121的处理器100。处理器100包括指令拾取单元101、指令高速缓存器102、指令转译器104、重命名单元106、保留站108、媒体寄存器118、通用寄存器(gpr)116、nnu121以外的执行单元112、以及存储器子系统114。处理器100是用作集成电路上的中央处理单元(cpu)的电子装置。处理器100接收数字数据作为输入,根据从存储器拾取的指令处理数据,并生成指令所规定的运算的结果作为输出。处理器100可用于台式计算机、移动计算机或平板计算机,并用于诸如计算、字编辑、多媒体显示和互联网浏览等的用途。处理器100还可设置于嵌入式系统内,以控制包括家用电器、移动电话、智能电话、车辆和工业控制装置等的各种各样的装置。cpu是通过对数据执行包括算术运算、逻辑运算和输入/输出运算的运算来执行计算机程序(也称为“计算机应用”或“应用”)指令的电子电路(即“硬件”)。集成电路(ic)是制作于小块半导体材料(通常为硅)上的一组电子电路。ic也称为芯片、微芯片或晶粒(die)。指令拾取单元101控制将架构指令103从系统存储器(未示出)拾取至指令高速缓存器102。指令拾取单元101向指令高速缓存器102提供指定存储器地址的拾取地址,其中处理器100在所述存储器地址处将架构指令字节的高速缓存器行拾取至指令高速缓存器102中。拾取地址是基于处理器100的指令指针(未示出)或程序计数器的当前值。通常,程序计数器依照指令大小循序递增,除非在指令串流中遇到诸如分支、调用或返回指令等的控制指令或者发生诸如中断、陷阱(trap)、例外或错误等的例外条件,在上述情况下,利用诸如分支目标地址、返回地址或例外向量等的非循序地址来更新程序计数器。一般来说,程序计数器响应于执行单元112/121执行指令而进行更新。程序计数器也可响应于检测到例外条件(诸如指令转译器104遇到处理器100的指令集架构未定义的指令103等)而进行更新。指令高速缓存器102对从耦接至处理器100的系统存储器拾取到的架构指令103进行高速缓存。架构指令103包括以下将更详细说明的向神经网络移动(mtnn)指令和从神经网络移动(mfnn)指令。在一个实施例中,架构指令103是x86指令集架构(isa)的指令,并附加上mtnn指令与mfnn指令。在本发明的上下文中,x86isa处理器作为在处理器执行相同的机器语言指令时在指令集架构层生成与处理器所生成的相同的结果的处理器。然而,其它实施例设想了其它指令集架构,诸如进阶精简指令集机器或指令高速缓存器102向指令转译器104提供架构指令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能够依照程序顺序引退(retire)微指令105及其相应的架构指令103。在一个实施例中,媒体寄存器118具有256位宽度,并且gpr116具有64位宽度。在一个实施例中,媒体寄存器118是诸如高级向量扩充(avx)寄存器等的x86媒体寄存器。在一个实施例中,重排序缓存器的各条目包括用于微指令105的结果的存储空间;此外,处理器100包括架构寄存器文件,其包括针对各架构寄存器(例如,媒体寄存器118、gpr116以及其它架构寄存器)的物理寄存器。(优选地,例如,由于媒体寄存器118与gpr116的大小不同,因此针对这两者,存在单独的寄存器文件。)对于微指令105中指定架构寄存器的各源操作数,重命名单元利用写入架构寄存器的旧有微指令105中的最新微指令的重排序缓存器索引来填充微指令105的源操作数字段。当执行单元112/121完成微指令105的执行时,执行单元112/121将结果写入微指令105的重排序缓存器条目。当微指令105引退时,引退单元(未示出)将所述结果从微指令的重排序缓存器条目写入与引退的微指令105所指定的架构目的地寄存器相关联的物理寄存器文件的寄存器。在另一实施例中,处理器100包括物理寄存器文件而不包括架构寄存器文件,其中该物理寄存器文件包括的物理寄存器的数量多于架构寄存器的数量,而且重排序缓存器条目不包括结果存储空间。(优选地,例如,由于媒体寄存器118与gpr116的大小不同,因此针对这两者,存在单独的物理寄存器文件。)处理器100还包括指针表,其具有针对各架构寄存器的关联指针。对于微指令105中的指定架构寄存器的操作数,重命名单元利用指向物理寄存器文件中的空闲寄存器的指针来填充微指令105的目的地操作数字段。如果物理寄存器文件内不存在空闲寄存器,则重命名单元106暂时搁置流水线(pipeline)。对于微指令105的指定架构寄存器的各源操作数,重命名单元利用指向物理寄存器文件中被指派给写入架构寄存器的旧有微指令105中的最新微指令的寄存器的指针,来填充微指令105的源操作数字段。当执行单元112/121完成微指令105的执行时,执行单元112/121将结果写入物理寄存器文件中由微指令105的目的地操作数字段所指向的寄存器。当微指令105引退时,引退单元将微指令105的目的地操作数字段值复制到指针表中与该引退的微指令105所指定的架构目的地寄存器相关联的指针。保留站108保持微指令105,直到微指令准备好被发布至执行单元112/121以供执行为止。当微指令105的所有源操作数都可用并且执行单元112/121可用于执行微指令105时,准备好发布微指令105。执行单元112/121从重排序缓存器或前述第一实施例中的架构寄存器文件、或者从前述第二实施例中的物理寄存器文件接收寄存器源操作数。此外,执行单元112/121可经由结果转发总线(未示出)而直接从执行单元112/121接收寄存器源操作数。此外,执行单元112/121可以从保留站108接收微指令105所指定的即时操作数。如以下更详细所述,mtnn与mfnn架构指令103包括用于指定nnu121所要执行的功能的即时操作数,其中该功能设置在mtnn与mfnn架构指令103转译成的一个或多个微指令105之一中。执行单元112包括一个或多个加载/储存单元(未示出),其从存储器子系统114加载数据并且将数据储存至存储器子系统114。优选地,存储器子系统114包括存储器管理单元(未示出),其可例如包括转译查找(lookaside)缓存器和表移动(tablewalk)单元、1级数据高速缓存器(和指令高速缓存器102)、2级统一高速缓存器、以及用于将处理器100与系统存储器接合的总线接口单元。在一个实施例中,图1的处理器100是作为多核处理器中的共享末级高速缓存存储器的多个处理核心之一的处理核心的代表。执行单元112还可包括整数单元、媒体单元、浮点单元和分支单元。nnu121包括权重随机存取存储器(ram)124、数据ram122、n个神经处理单元(npu)126、程序存储器129、定序器128、以及控制和状态寄存器(csrs)127。npu126在概念上用作神经网络中的神经元。权重ram124、数据ram122与程序存储器129均可经由mtnn与mfnn架构指令103分别写入与读取。权重ram124排列为w行,每行n个权重字,并且数据ram122排列为d行,每行n个数据字。各个数据字与各个权重字均具有多个位,优选地为8位、9位、12位或16位。各个数据字用作网络中先前层的神经元的输出值(有时也称为激活值(activation)),并且各个权重字用作与进入网络当前层的神经元的连接相关联的权重。尽管在nnu121的许多应用中、保持在权重ram124中的字或操作数实际上是与进入神经元的连接相关联的权重,但是应当理解,在nnu121的其它应用中,保持在权重ram124中的字并非权重,但是因为这些字储存于权重ram124中,因此仍被称为“权重字”。例如,在nnu121的某些应用中,例如图24至图26a的卷积示例或图27至图28的池化示例中,权重ram124可以保持非权重,诸如数据矩阵(例如图像像素数据)的元素等。同样地,尽管在nnu121的许多应用中,保持在数据ram122中的字或操作数实际上是神经元的输出值或激活值,但是应当理解,在nnu121的其它应用中,保持在数据ram122中的字并非如此,但是因为这些字储存于数据ram122中,因此仍然被称为“数据字”。例如,在nnu121的某些应用中,例如图24至图26a的卷积示例中,数据ram122可以保持非神经元输出,诸如卷积核的元素等。在一个实施例中,npu126和定序器128包括组合逻辑、定序逻辑、状态机、或其组合。架构指令(例如,mfnn指令1500)将状态寄存器127的内容加载至gpr116之一,以确定nnu121的状态,例如确定为nnu121已经完成了命令或已经完成了nnu121从程序存储器129运行的程序的状态,或者确定为nnu121自由接收新的命令或开始新的nnu程序的状态。有利地,npu126的数量可根据需要增加,并且权重ram124和数据ram122的大小可以相应地在宽度与深度上扩展。优选地,权重ram124较大,这是因为在典型的神经网络层中,存在与各个神经元相关联的许多连接因而存在许多权重。本文描述了与数据字和权重字的大小、权重ram124和数据ram122的大小、以及npu126的数量有关的各个实施例。在一个实施例中,具有64kb(8192位×64行)数据ram122、2mb(8192位×2048行)权重ram124以及512个npu126的nnu121实现于台湾半导体制造有限公司(tsmc)的16纳米工艺中,占用面积约为3.3平方毫米。定序器128从程序存储器129拾取指令并执行,还包括产生地址和控制信号以提供给数据ram122、权重ram124和npu126。定序器128产生存储器地址123和读取命令以提供给数据ram122,从而在每行具有n个数据字的d行中选择其中之一并提供给n个npu126。定序器128还产生存储器地址125和读取命令以提供给权重ram124,从而在每行具有n个权重字的w行中选择其中之一以提供给n个npu126。定序器128产生以提供给npu126的地址123和125的顺序确定神经元之间的“连接”。定序器128还产生存储器地址123和写入命令以提供给数据ram122,从而在每行具有n个数据字的d行中选择其中之一以从n个npu126进行写入。定序器128还产生存储器地址125和写入命令以提供给权重ram124,从而在每行具有n个权重字的w行中选择其中之一以从n个npu126进行写入。定序器128还产生针对程序存储器129的存储器地址131以选择提供给定序器128的如以下所述等的nnu指令。存储器地址131与程序计数器(未示出)相对应,其中定序器128通常通过程序存储器129的顺序位置使该程序计数器递增,除非定序器128遇到诸如循环指令(例如见图26a)等的控制指令,在遇到控制指令的这种情况下,定序器128将程序计数器更新为该控制指令的目标地址。定序器128还产生针对npu126的控制信号,以指示npu126执行诸如初始化、算术/逻辑运算、转动和移位运算、激活函数、以及写回运算等的各种运算或功能,以下更详细地说明这样的范例(例如见图34的微操作3418)。n个npu126产生n个结果字133,其中结果字133可被写回权重ram124的行或写回数据ram122。优选地,权重ram124与数据ram122直接耦接至n个npu126。更具体地,权重ram124与数据ram122专用于npu126,而不由处理器100的其它执行单元112分享,并且这些npu126能够以持续方式(优选地,以流水线方式)在各时钟周期消耗来自权重ram124和数据ram122其中之一或两者的一行。在一个实施例中,数据ram122与权重ram124各自能够在各时钟周期向npu126提供8192位。如以下更详细所述,这8192位可以作为512个16位字或1024个8位字来消耗。有利地,可由nnu121处理的数据集的大小不受限于权重ram124与数据ram122的大小,而仅受限于系统存储器的大小,这是因为可以使用mtnn与mfnn指令(例如,通过媒体寄存器118)将数据与权重在系统存储器与权重ram124以及数据ram122间移动。在一个实施例中,数据ram122是双端口的,使得能够在并行地从数据ram122读取或向数据ram122写入数据字时,将数据字写入至数据ram122。另外,包括高速缓存存储器的存储器子系统114的大型存储器阶层结构提供非常大的数据带宽以供系统存储器与nnu121之间的传递。此外,优选地,存储器子系统114包括硬件数据预拾取器,其追踪存储器访问模式(诸如从系统存储器对神经数据和权重的加载等),并对高速缓存器阶层结构执行数据预拾取以促进向权重ram124与数据ram122的高带宽且低延迟的传递。虽然说明了被提供给各npu126的操作数其中之一是从权重存储器提供的并且被表示为权重(此用语常用于神经网络)的实施例,但应当理解,操作数可以是与能够通过所述设备提高速度的计算相关联的其它类型的数据。现参考图2,示出一框图,该框图示出图1的npu126。npu126操作以执行许多功能或运算。尤其是,有利地,npu126被配置为作为神经元或节点而在人工神经网络中操作以执行经典的乘法累加函数或运算。亦即一般而言,npu126(神经元)被配置为:(1)从与该npu126具有连接的各神经元(通常但没有必要一定从人工神经网络中的紧挨在前的一层)接收输入值;(2)将各输入值乘以与该连接相关联的相应权重值以产生乘积;(3)将所有乘积相加以产生总和;并且(4)对该总和执行激活函数以产生神经元的输出。然而,与如传统方式那样执行与所有连接输入相关联的所有乘法并接着将所有乘积相加在一起不同,有利地,各个神经元被配置为在给定的时钟周期内执行与连接输入其中之一相关联的权重乘法运算、然后将该乘积与同直到该点为止的在先时钟周期内所处理的连接输入相关联的乘积的累加值相加(累加)。假定存在至神经元的m个连接,则在对所有m个乘积进行累加后(耗费约m个时钟周期),该神经元对累加值执行激活函数以产生输出或结果。这具有如下的优点:与将关联于所有连接输入的所有乘积或者甚至乘积的子集相加的加法器相比,在神经元内需要更少的乘法器并且需要更小、更简单且更为快速的加法器电路(例如,2输入加法器)。因而这具有如下的优点:有利于在nnu121内实现极大量(n个)的神经元(npu126),使得在约m个时钟周期后,nnu121已产生所有这些大量(n个)神经元的输出。最后,由这样的神经元构成的nnu121具备有效地针对大量不同的连接输入作为人工神经网络层而执行的优点。也就是说,随着m针对不同层增加或减少,产生神经元输出所需的时钟周期数相应地增加或减少,并且资源(例如,乘法器与累加器)得到充分利用;而在更传统的设计中,对于较小的m值,某些乘法器和部分加法器没有被利用。因此,本文所述的实施例关于至nnu121的神经元的连接输入数具有灵活与高效的益处,并且提供极高的性能。npu126包括寄存器205、2输入复用寄存器(mux-reg)208、算术逻辑单元(alu)204、累加器202、以及激活函数单元(afu)212。寄存器205从权重ram124接收权重字206并在后续时钟周期中提供其输出203。复用寄存器208选择输入207或211其中之一,以储存在其寄存器中然后在后续时钟周期中提供于输出209上。一个输入207接收来自数据ram122的数据字。另一输入211接收相邻npu126的输出209。图2所示的npu126在图1的n个npu126中被标示为npuj。也就是说,npuj是n个npu126的代表性实例。优选地,npuj的复用寄存器208的输入211接收npu126的实例j-1的复用寄存器208的输出209,并且npuj的复用寄存器208的输出209被提供给npu126的实例j+1的复用寄存器208的输入211。如此,如以下针对图3更详细所述,n个npu126的复用寄存器208作为n字轮转器或循环移位器整体操作。控制输入213控制这两个输入中的哪一个被复用寄存器208选择以储存于寄存器中并后续提供于输出209上。alu204具有三个输入。一个输入从寄存器205接收权重字203。另一输入接收复用寄存器208的输出209。再一个输入接收累加器202的输出217。alu204对其输入执行算术和/或逻辑运算以产生提供于其输出上的结果。优选地,alu204所执行的算术和/或逻辑运算由储存于程序存储器129的指令指定。例如,图4的乘法累加指令指定乘法累加运算,即,结果215是权重字203以及复用寄存器208的输出209的数据字的乘积与累加器202的值217的总和。可以指定的其它运算包括但不限于:结果215是复用寄存器输出209的通过值;结果215是权重字203的通过值;结果215是零;结果215是权重字203的通过值;结果215是累加器202的值217与权重字203的总和;结果215是累加器202的值217与复用寄存器的输出209的总和;结果215是累加器202的值217与权重字203的最大值;结果215是累加器202的值217与复用寄存器的输出209的最大值。alu204将输出215提供至累加器202以储存在该累加器202中。alu204包括乘法器242,其用于将权重字203与复用寄存器208的输出209的数据字相乘以产生一乘积246。在一个实施例中,乘法器242将两个16位操作数相乘以产生32位结果。alu204还包括加法器244,其用于将乘积246与累加器202的输出217相加以产生一总和,该总和为在累加器202中累加以供储存于累加器202中的结果215。在一个实施例中,加法器244将乘法器242的32位结果与累加器202的41位值217相加以产生41位结果。如此,通过在多个时钟周期的过程中使用复用寄存器208的轮转器方面,npu126完成神经网络所需的针对神经元的乘积的相加。alu204还可以包括其它电路元件来执行如前所述的其它算术/逻辑运算。在一个实施例中,第二加法器从复用寄存器208的输出209的数据字中减去权重字203以产生一差值,然后加法器244将该差值与累加器202的输出217相加以产生总和215,该结果即为累加器202内累加的结果。如此,在多个时钟周期的过程中,npu126可以完成差值的相加。优选地,如以下更详细所述,虽然权重字203与数据字209的大小相同(以位为单位),但也可具有不同的二进制小数点位置。优选地,如以下更详细所述,乘法器242与加法器244为整数乘法器与加法器,以有利地实现与浮点乘法器和加法器相比复杂度更低、更小、更快速且耗能更低的alu204。然而,应当理解,在其它实施例中,alu204执行浮点运算。虽然图2仅示出alu204内的乘法器242和加法器244,但是优选地,该alu204包括其它元件来执行上述的其它运算。例如,alu204优选包括用于将累加器202与数据/权重字进行比较的比较器(未示出)以及用于选择比较器所指示的两个值中较大者(最大值)以储存于累加器202中的复用器(未示出)。再例如,alu204优选包括选择逻辑(未示出),其用于使数据/权重字跳过乘法器242以使得加法器244能够将数据/权重字与累加器202的值217相加以产生用于储存于累加器202中的总和。这些附加运算在以下(例如针对图18至图29a)更详细地说明,并且可以用于执行例如卷积运算和池化运算。afu212接收累加器202的输出217。afu212对累加器202的输出217执行激活函数以产生图1的结果133。一般而言,人工神经网络的中间层的神经元内的激活函数可用来优选地采用非线性的方式使乘积的累加和标准化。为了使累加和“标准化”,当前神经元的激活函数在连接至当前神经元的其它神经元预期作为输入而接收到的值的范围内产生结果值。(标准化结果有时称为“激活值”,如本文所述,激活值是当前节点的输出,而接收节点将该输出乘以与输出节点和接收节点之间的连接相关联的权重以产生一乘积,而该乘积与关联于至所述接收节点的其它输入连接的其它乘积累加。)例如,接收/所连接神经元预期接收0与1之间的值作为输入,在这种情况下,输出神经元可能需要将在0~1范围之外的累加和非线性地挤压和/或调整(例如向上移位以将负值转换为正值)为预期范围内的值。因此,afu212对累加器202的值217执行运算以使结果133进入已知范围内。所有n个npu126的结果133可被并行地写回数据ram122或权重ram124。优选地,afu212被配置为执行多个激活函数,并且例如来自控制寄存器127的输入选择这些激活函数之一以对累加器202的输出217执行。激活函数可以包括但不限于接跃函数(stepfunction)、校正函数(rectifyfunction)、s型函数(sigmoidfunction)、双曲正切(tanh)函数(hyperbolictangentfunction)以及软加函数(softplusfunction)(也称为平滑校正函数)。软加函数是解析函数f(x)=f(x)=ln(1+ex),即1与ex的总和的自然对数,其中“e”是欧拉(euler)数,并且x是函数的输入217。优选地,如以下更详细所述,激活函数还可以包括通过累加器202的值217或其一部分的通过(pass-through)函数。在一个实施例中,afu212的电路在单个时钟周期内执行激活函数。在一个实施例中,afu212包括表格,所述表格接收累加值并针对某些激活函数(例如s型函数、双曲正切函数、软加函数等)输出与真正的激活函数将提供的值相近似的值。优选地,累加器202的宽度(以位为单位)大于afu212的输出133的宽度。例如,在一个实施例中,累加器的宽度为41位,以避免对(如以下例如针对图30更详细所述的)多达512个32位乘积的累加的精度损失,并且结果133的宽度为16位。在以下针对图8更详细地描述了其示例的一个实施例中,在后续时钟周期期间,“原始”累加器202的输出217值的不同部分通过afu212,并且被写回数据ram122或权重ram124。这样使得能够经由mfnn指令将原始累加器202的值加载回媒体寄存器118,如此处理器100的其它执行单元112上执行的指令可以执行afu212无法执行的诸如众所周知的软极大(softmax)激活函数等的复杂激活函数(也称为标准化指数函数)。在一个实施例中,处理器100的指令集架构包括执行指数函数的指令,通常称为ex或exp(x),该指令可以用来加快处理器100的其它执行单元112对软极大激活函数的执行。在一个实施例中,npu126为流水线设计。例如,npu126可包括alu204的寄存器(诸如位于乘法器与加法器和/或alu204的其它电路之间的寄存器)以及保持afu212的输出的寄存器等。以下描述了npu126的其它实施例。现参考图3,示出一框图,该框图示出图1的nnu121的n个npu126的n个复用寄存器208的布置的实施例,从而说明n个复用寄存器作为针对从图1的数据ram122接收到的一行数据字207的n字轮转器或循环移位器的操作。在图3的实施例中,n是512,使得nnu121具有如图所示与512个npu126相对应的标示为0至511的512个复用寄存器208。每个复用寄存器208接收数据ram122的d行中的一行上的相应的数据字207。也就是说,复用寄存器0接收数据ram122的行中的数据字0,复用寄存器1接收数据ram122的行中的数据字1,复用寄存器2接收数据ram122的行中的数据字2,依此类推,复用寄存器511接收数据ram122的行中的数据字511。此外,复用寄存器1在另一输入211上接收复用寄存器0的输出209,复用寄存器2在另一输入211上接收复用寄存器1的输出209,复用寄存器3在另一输入211上接收复用寄存器2的输出209,依此类推,复用寄存器511在另一输入211上接收复用寄存器510的输出209,而复用寄存器0在另一输入211上接收复用寄存器511的输出209。每个复用寄存器208接收控制输入213,其用于控制是选择数据字207还是选择轮转输入211。如以下更详细所述,在一个操作模式中,在第一时钟周期内,控制输入213控制各复用寄存器208选择数据字207以储存在寄存器中并后续提供给alu204;以及在后续的时钟周期(例如,如上所述的m-1个时钟周期)期间,控制输入213控制各复用寄存器208选择轮转输入211以储存在寄存器中并后续提供给alu204。尽管在图3(以及以下的图7和图19)所描述的实施例中,npu126被配置为将复用寄存器208/705的值向右轮转、即从npuj到npuj+1,但是设想了如下的实施例(诸如针对图24至图26的实施例等),其中npu126被配置为将复用寄存器208/705的值向左轮转,即从npuj到npuj-1。此外,设想了如下的实施例,其中npu126被配置为选择性地将复用寄存器208/705的值向左或向右轮转,例如由nnu指令指定。现参考图4,示出一表格,该表格示出用于储存在图1的nnu121的程序存储器129中并由该nnu121执行的程序。如上所述,示例性程序执行与人工神经网络的层相关联的计算。在图4的表格中,示出五行与三列。每一行对应于程序存储器129中的标示于第一行的地址。第二列指定指令,并且第三列表示与该指令相关联的时钟周期数。优选地,时钟周期数表示在流水线实施例中每指令时钟类型值中有效的时钟数,而非指令的延迟。如图所示,因为nnu121的流水线的本质,因此各指令均有相关联的一个时钟周期,其中位于地址2的指令是一个例外,如以下更详细所述,由于该指令实际上自己重复511次,因而需要511个时钟。针对程序的各指令,所有的npu126并行处理该指令。也就是说,所有的n个npu126都在同一个(或多个)时钟周期中执行第一行中的指令,所有的n个npu126都在同一个(或多个)时钟周期中执行第二行中的指令,依此类推。然而,以下描述了其它实施例,其中有些指令是以部分并行且部分循序的方式执行的,例如,在例如针对图11的实施例那样npu126共享激活函数单元的实施例中,分别位于地址3与4的激活函数和输出指令即是以此方式执行。图4的示例假定一层具有512个神经元(npu126),而每个神经元具有来自先前层的512个神经元的512个连接输入,总共有256k个连接。每个神经元从各连接输入接收16位数据值,并将该16位数据值乘以适当的16位权重值。位于地址0(尽管也可指定其它地址)的第一行指定初始化npu指令。该初始化指令将累加器202的值清零。在一个实施例中,初始化指令也可指定向累加器202加载数据ram122或权重ram124的一行中由该指令指定地址的相应字。如以下针对图29a和图29b更详细所述,该初始化指令还将配置值加载到控制寄存器127中。例如,可以加载数据字207与权重字209的宽度,其中所述宽度可由alu204使用以确定电路所执行的运算的大小、并且可以影响储存于累加器202中的结果215。在一个实施例中,npu126包括用于在alu204的输出215储存于累加器202之前使该输出215饱和的电路,并且初始化指令将配置值加载到该电路中以影响饱和。在一个实施例中,还可以通过在alu函数指令(例如,地址1处的乘法累加指令)或输出指令(诸如地址4处的写入afu输出指令)中如此指定,来将累加器202清除为零值。位于地址1的第二行指定乘法累加指令,其中该乘法累加指令指示512个npu126从数据ram122的一行加载相应的数据字并从权重ram124的一行加载相应的权重字,并且对数据字输入207与权重字输入206执行第一乘法累加运算,该第一乘法累加运算是在以初始化累加器202为零值的状态下进行累加的。更具体地,该指令指示定序器128在控制输入213上产生值以选择数据字输入207。在图4的示例中,所指定的数据ram122的行是行17,并且所指定的权重ram124的行是行0,从而指示定序器128输出数据ram地址123的值17并且输出权重ram地址125的值0。因此,来自数据ram122的行17的512个数据字被提供至512个npu126的相应数据输入207,并且来自权重ram124的行0的512个权重字被提供至512个npu126的相应权重输入206。位于地址2的第三行指定计数为511的乘法累加轮转指令,该指令指示这512个npu126中的各npu126执行511次乘法累加运算。该指令向这512个npu126指示在511次乘法累加运算的每一次运算中输入alu204的数据字209是来自相邻npu126的轮转值211。也就是说,该指令指示定序器128在控制输入213上产生值以选择轮转值211。此外,该指令指示这512个npu126从权重ram124的“下一”行加载针对511次乘法累加运算的每一次运算的相应权重值。也就是说,该指令指示定序器128使权重ram地址125相对于其在前一时钟周期中的值加1,在该示例中,指令的第一时钟周期是行1,下一个时钟周期是行2,再下一个时钟周期是行3,依此类推,第511个时钟周期是行511。针对这511个乘法累加运算中的每一个运算,将轮转输入211和权重字输入206的乘积与累加器202的先前值累加。这512个npu126在511个时钟周期内执行511次乘法累加运算,其中各npu126对来自数据ram122的行17的不同数据字即相邻npu126在先前周期执行运算的数据字以及在概念上为神经元的不同连接输入的与该数据字相关联的不同权重字执行乘法累加运算。在该示例中,假设各个npu126(神经元)的连接输入的数量为512,因此涉及512个数据字与512个权重字。一旦执行了对行2的乘法累加轮转指令的最后一次迭代,累加器202就包含全部512个连接输入的乘积的总和。在一个实施例中,npu126的指令集包括用于指示alu204执行由初始化npu指令指定(诸如在图29a的alu函数2926中指定)的alu运算的“执行”指令,而非对于各类型的alu运算(例如,如上所述的乘法累加、累加器与权重字的求最大等)具有单独的指令。位于地址3的第四行指定激活函数指令。激活函数指令指示afu212对于累加器202的值217执行指定的激活函数以产生结果133。以下更详细说明了根据一个实施例的激活函数。位于地址4的第五行指定写入afu输出指令,其用于指示512个npu126将afu212的输出作为结果133写回至数据ram122的一行(在该示例中为行16)。也就是说,该指令指示定序器128输出值为16的数据ram地址123以及写入命令(与在地址1处的乘法累加指令的情况下的读取命令相对)。优选地,在流水线的本质下,写入afu输出指令的执行可与其它指令的执行重叠,使得写入afu输出指令实际上在单个时钟周期内执行。优选地,每个npu126被配置为流水线,其中该流水线包括各种功能元件,例如复用寄存器208(以及图7的复用寄存器705)、alu204、累加器202、afu212、(图8的)复用器802、行缓存器1104以及(图11的)afu1112等,其中这些功能元件中的一些本身即可以是流水线式的。除了数据字207与权重字206外,流水线还从程序存储器129接收指令。这些指令沿着流水线流动并控制各种功能单元。在备选实施例中,程序内不包含激活函数指令。相反,初始化npu指令指定要对累加器202的值217执行的激活函数,并且指出所指定的激活函数的值被保存在配置寄存器中,从而稍后在已经产生最后的累加器202值217后,也就是在地址2处的乘法累加轮转指令的最后一次迭代完成后,由流水线的afu212部分使用。优选地,为了节能目的,流水线的afu212部分是不活动的,直到写入afu输出指令到达该afu212部分为止,此时afu212启动并对初始化指令所指定的累加器202的输出217执行激活函数。现参考图5,示出一时序图,该时序图示出nnu121对图4的程序的执行。该时序图的每一行对应于第一行指出的连续时钟周期。其它各列对应于512个npu126中的不同的一个npu126并指示其运算。为了使说明简单且清楚,仅示出npu0、1和511的运算。在时钟0处,512个npu126中的每一个npu126执行图4的初始化指令,其中该初始化指令在图5中是通过将零值指派给累加器202来示出的。在时钟1处,512个npu126中的每一个npu126执行图4中地址1处的乘法累加指令。如图所示,npu0将数据ram122的行17的字0与权重ram124的行0的字0的乘积与累加器202的值(即零)累加;npu1将数据ram122的行17的字1与权重ram124的行0的字1的乘积与累加器202的值(即零)累加;依此类推,npu511将数据ram122的行17的字511与权重ram124的行0的字511的乘积与累加器202的值(即零)累加。在时钟2处,512个npu126中的每一个npu126执行图4中地址2处的乘法累加轮转指令的第一次迭代。如图所示,npu0将从npu511的复用寄存器208的输出209接收到的轮转数据字211(即从数据ram122接收到的数据字511)与权重ram124的行1的字0的乘积与累加器202的值累加;npu1将从npu0的复用寄存器208的输出209接收到的轮转数据字211(即从数据ram122接收到的数据字0)与权重ram124的行1的字1的乘积与累加器202的值累加;依此类推,npu511将从npu510的复用寄存器208的输出209接收到的轮转数据字211(即从数据ram122接收到的数据字510)与权重ram124的行1的字511的乘积与累加器202的值累加。在时钟3处,512个npu126中的每一个npu126执行图4中地址2处的乘法累加轮转指令的第二次迭代。如图所示,npu0将从npu511的复用寄存器208的输出209接收到的轮转数据字211(即从数据ram122接收到的数据字510)与权重ram124的行2的字0的乘积与累加器202的值累加;npu1将从npu0的复用寄存器208的输出209接收到的轮转数据字211(即从数据ram122接收到的数据字511)与权重ram124的行2的字1的乘积与累加器202的值累加;依此类推,npu511将从npu510的复用寄存器208的输出209接收到的轮转数据字211(即从数据ram122接收到的数据字509)与权重ram124的行2的字511的乘积与累加器202的值累加。如图5的省略号所示,接下来的509个时钟周期各自依此持续进行,直到时钟512。在时钟512处,512个npu126中的每一个npu126执行图4中地址2处的乘法累加轮转指令的第511次迭代。如图所示,npu0将从npu511的复用寄存器208的输出209接收到的轮转数据字211(即从数据ram122接收到的数据字1)与权重ram124的行511的字0的乘积与累加器202的值累加;npu1将从npu0的复用寄存器208的输出209接收到的轮转数据字211(即从数据ram122接收到的数据字2)与权重ram124的行511的字1的乘积与累加器202的值累加;依此类推,npu511将从npu510的复用寄存器208的输出209接收到的轮转数据字211(即从数据ram122接收到的数据字0)与权重ram124的行511的字511的乘积与累加器202的值累加。在一个实施例中,需要多个时钟周期从数据ram122与权重ram124读取数据字与权重字以执行图4中地址1处的乘法累加指令;然而,数据ram122、权重ram124和npu126是流水线式的,使得一旦第一乘法累加运算开始(例如,如图5的时钟1期间所示),就在连续的的时钟周期内开始后续的乘法累加运算(例如,如时钟2-512期间所示)。优选地,响应于利用架构指令(例如mtnn或mfnn指令,在后续针对图14和图15进行说明)或架构指令转译成的微指令对于数据ram122和/或权重ram124的访问,npu126可以暂时搁置。在时钟513处,512个npu126中的每一个npu126的afu212执行图4中地址3处的激活函数指令。最后,在时钟514处,这512个npu126中的每一个npu126通过将结果133写回数据ram122的行16中的相应字,即将npu0的结果133写入数据ram122的字0,将npu1的结果133写入数据ram122的字1,依此类推,直到将npu511的结果133写入数据ram122的字511,来执行图4的地址4处的写入afu输出指令。以上针对图5所述的运算也在图6a中以框图的形式示出。现参考图6a,示出一框图,该框图示出图1的nnu121对图4的程序的执行。nnu121包括512个npu126、接收地址输入123的数据ram122、以及接收地址输入125的权重ram124。尽管未示出,但在时钟0处,512个npu126执行初始化指令。如图所示,在时钟1处,行17的512个16位数据字被从数据ram122读出并提供至512个npu126。在时钟1至512处,行0至511的512个16位权重字分别被从权重ram124读出并提供至512个npu126。尽管未示出,但在时钟1处,512个npu126对加载的数据字和权重字执行相应的乘法累加运算。在时钟2至512处,512个npu126的复用寄存器208作为512个16位字的轮转器操作以将先前加载的数据ram122的行17的数据字轮转至相邻的npu126,并且npu126对轮转后的各数据字以及从权重ram124加载的各权重字执行乘法累加运算。尽管未示出,但在时钟513处,512个afu212执行激活指令。在时钟514处,512个npu126将相应的512个16位结果133写回数据ram122的行16。可以发现,产生结果字(神经元输出)并写回数据ram122或权重ram124所需的时钟数大致为神经网络的当前层所接收到的数据输入(连接)数量的平方根。例如,如果当前层包括各自具有来自先前层的512个连接的512个神经元,则这些连接的总和是256k,并且产生当前层的结果所需的时钟数略超过512。因此,nnu121为神经网络计算提供了极高的性能。现参考图6b,示出一流程图,该流程图示出图1的处理器100执行架构程序的操作,所述架构程序使用nnu121来执行典型地与人工神经网络的隐藏层的神经元相关联的乘法累加激活函数计算(诸如图4的程序所执行的运算等)。图6b的示例假定四个隐藏层(通过方框602的num_layers变量的初始化来标示)的计算,各个隐藏层具有512个神经元,各个神经元连接先前层全部的512个神经元(通过图4的程序)。然而,应当理解,这些层和神经元的数量是为了说明目的而选择的,并且nnu121可用于针对不同数量的隐藏层、每一层中不同数量的神经元以及未全部连接的神经元执行相同的计算。在一个实施例中,对于这一层中不存在的神经元或者至神经元的不存在的连接,权重值可被设置为零。优选地,架构程序将第一组权重写入权重ram124并启动nnu121,并且在nnu121正执行与第一层相关联的计算时,此架构程序将第二组权重写入权重ram124,使得一旦nnu121完成第一隐藏层的计算,nnu121就可以开始第二层的计算。如此,架构程序往返于权重ram124的两个区域之间,以确保nnu121被充分利用。流程始于方框602。在方框602处,如针对图6a所示和所述,处理器100(即运行在处理器100上的架构程序)将输入值写入数据ram122的当前神经元隐藏层,例如写入数据ram122的行17。可选地,这些值也可能已经在数据ram122的行17中作为nnu121针对先前层(例如,卷积、池化或输入层)的运算结果133。此外,架构程序将变量n初始化为值1。变量n标示隐藏层中正由nnu121处理的当前层。此外,架构程序将变量num_layers初始化为值4,这是因为在本示例中存在四个隐藏层。流程进入方框604。在方框604处,如图6a所示,处理器100将层1的权重字写入权重ram124,例如写入行0至511。流程进入方框606。在方框606处,处理器100使用指定对程序存储器129进行写入的函数1432的mtnn指令1400,将(例如,图4的)乘法累加激活函数程序写入nnu121的程序存储器129。处理器100随后利用指定开始执行程序的函数1432的mtnn指令1400来启动nnu程序。流程进入决策方框608。在决策方框608处,架构程序确定变量n的值是否小于num_layers。如果是,则流程进入方框612;否则进入方框614。在方框612处,处理器100将层n+1的权重字写入权重ram124,例如写入行512至1023。因此,有利地,架构程序在nnu121正执行当前层的隐藏层计算时将下一层的权重字写入权重ram124,使得一旦完成当前层的计算,即写入数据ram122后,nnu121就可以立刻开始执行下一层的隐藏层计算。流程进入方框614。在方框614处,处理器100确定为(在层1的情况下,在方框606处开始的,在层2至4的情况下,则是在方框处618开始的)当前运行的nnu程序已经完成。优选地,处理器100通过执行mfnn指令1500读取nnu121的状态寄存器127来对此进行确定。在备选实施例中,nnu121产生一中断以表示其已经完成乘法累加激活函数层程序。流程进入决策方框616。在决策方框616处,架构程序确定变量n的值是否小于num_layers。如果是,流程进入方框618;否则流程进入方框622。在方框618处,处理器100更新乘法累加激活函数程序,使得该处理器可以执行层n+1的隐藏层计算。更具体地,处理器100将图4的地址1处的乘法累加指令的数据ram122的行值更新为先前层的结果所写入的数据ram122行(例如,更新为行16),并且还更新输出行(例如,更新为行15)。处理器100随后开始更新后的nnu程序。可选地,图4的程序在地址4的输出指令中指定与地址1处的乘法累加指令所指定的行(即,从数据ram122读取的行)相同的行。在该实施例中,输入数据字的当前行被覆写(由于此行数据字已经被读入复用寄存器208并经由n字轮转器在这些npu126间进行轮转,因此只要这行数据字无需用于其它目的,这样的处理方式就是可接受的)。在这种情况下,在方框618处,无需更新nnu程序,而只需要重新开始nnu程序。流程进入方框622。在方框622处,处理器100从数据ram122读取层n的nnu程序的结果。然而,如果这些结果仅被用于下一层,则架构程序就无需从数据ram122读取这些结果,作为代替可将其保留在数据ram122中以用于下一个隐藏层计算。流程进入决策方框624。在决策方框624处,架构程序确定变量n的值是否小于num_layers。如果是,则流程进入方框626;否则流程结束。在方框626处,架构程序使n加一。流程返回决策方框608。如可以从图6b的示例中确定,大致上每512个时钟周期,npu126(借助于图4的nnu程序的操作)对数据ram122执行一次读取和一次写入。此外,npu126大致每时钟周期对权重ram124进行读取以读取一行权重字。因此,权重ram124的全部带宽都被nnu121执行隐藏层运算所用的混合方式消耗。此外,假定实施例包括写入和读取缓存器(诸如图17的缓存器1704等),与npu126进行读取并行地,处理器100写入权重ram124,使得缓存器1704大致每16个时钟周期对权重ram124执行一次写入以写入权重字。因此,在权重ram124的单一端口的实施例中(诸如针对图17所述的实施例等),大致每16个时钟周期,npu126就必须暂时搁置对权重ram124的读取,从而使得缓存器1704能够对权重ram124进行写入。然而,在权重ram124为双端口的实施例中,npu126无需搁置。现参考图7,示出一框图,该框图示出根据备选实施例的图1的npu126。图7的npu126在许多方面与图2的npu126类似。然而,图7的npu126另外包括第二2输入复用寄存器705。该复用寄存器705选择输入206或711其中之一,以储存在寄存器中然后在后续时钟周期提供于输出203上。输入206从权重ram124接收权重字。另一输入711接收相邻npu126的第二复用寄存器705的输出203。优选地,npuj的复用寄存器705的输入711接收npu126实例j-1的复用寄存器705的输出203,并且npuj的输出被提供至npu126实例j+1的复用寄存器705的输入711。如此,与以上针对图3所述的方式相同,n个npu126的复用寄存器705整体操作为n字轮转器,但是针对的是权重字而非数据字。控制输入713控制这两个输入中的哪一个被复用寄存器705选择,以储存于寄存器中并在后续提供于输出203上。包括复用寄存器208和/或复用寄存器705(以及诸如图18和图23所示等的其它实施例中的复用寄存器)以实际上形成用于将从数据ram122和/或权重ram124接收到的一行数据/权重进行轮转的大型轮转器具有如下的优点:nnu121不需要其他方面所需的在数据ram122和/或权重ram124之间的极大复用器来向适当的nnu121提供必要的数据字/权重字。除激活函数结果外还写回累加器值在一些应用中,处理器100接收回(例如经由图15的mfnn指令接收至媒体寄存器118)原始的累加器202的值217是有用的,其中在其它执行单元112上执行的指令可以对这些累加器202的值217执行计算。例如,在一个实施例中,为了降低afu212的复杂度,afu212不被配置为执行软极大激活函数。因此,nnu121可以将原始的累加器202的值217或其子集输出至数据ram122或权重ram124,而架构程序随后从数据ram122或权重ram124读取该原始的累加器202的值217或其子集并对原始值进行计算。然而,对原始的累加器202的值217的应用不限于软极大运算的执行,还可以设想其它应用。现参考图8,示出一框图,该框图示出根据备选实施例的图1的npu126。图8的npu126在许多方面与图2的npu126类似。然而,图8的npu126在afu212内包括复用器(mux)802,其中afu212具有控制输入803。累加器202的宽度(以位为单位)大于数据字的宽度。复用器802具有用于接收累加器202的输出217的数据字宽度部分的多个输入。在一个实施例中,累加器202的宽度为41位,而npu126被配置为输出16位的结果字133;因此,例如,复用器802(或图30的复用器3032和/或复用器3037)具有分别用于接收累加器202的输出217的位[15:0]、位[31:16]与位[47:32]的三个输入。优选地,并非由累加器202提供的输出位(例如位[47:41])被强制设定为零值位。响应于写入acc指令(例如下述的图9的地址3至5处的写入acc指令等),定序器128在控制输入803上产生值以控制复用器802选择累加器202的字(例如,16位)其中之一。优选地,复用器802还具有用于接收激活函数电路(例如,图30中的元件3022、3024、3026、3018、3014与3016)的输出的一个或多个输入,其中这些激活函数电路产生作为数据字的宽度的输出。响应于诸如图4的地址4处的写入afu输出指令等的指令,定序器128在控制输入803上产生一个值以控制复用器802选择这些激活函数电路输出其中之一,而非累加器202的字其中之一。现参考图9,示出一表格,该表格示出用于储存于图1的nnu121的程序存储器129中并由该nnu121执行的程序。图9的示例性程序在许多方面与图4的程序类似。具体地,地址0至2处的指令是相同的。然而,图4的地址3与4处的指令在图9中被替换为写入acc指令,其指示512个npu126将其累加器202的输出217作为结果133写回数据ram122的三行(在本示例中为行16至18)。也就是说,写入acc指令指示定序器128在第一时钟周期内输出值为16的数据ram地址123以及写入命令,在第二时钟周期内输出值为17的数据ram地址123以及写入命令,并且在第三时钟周期内输出值为18的数据ram地址123以及写入命令。优选地,写入acc指令的执行可能与其它指令的执行重叠,使得写入acc指令实际在三个时钟周期内执行,其中针对写入数据ram122的每一行为一个时钟周期。在一个实施例中,用户指定激活函数2934和(图29a的)控制寄存器127中的输出命令2956字段的值,以完成将累加器202的期望部分写入数据ram122或权重ram124。可选地,写入acc指令可以可选地将累加器202的子集写回,而非将累加器202的全部内容写回。在一个实施例中,如以下针对图29至图31更详细所述,可以将标准型累加器202写回。现参考图10,示出一时序图,该时序图示出nnu121对图9的程序的执行。图10的时序图与图5的时序图类似,并且时钟0至512是相同的。然而,在时钟513-515处,512个npu126中的每个npu126的afu212执行图9的地址3至5处的写入acc指令其中之一。具体地,在时钟513处,512个npu126中的每一个npu126将累加器202的输出217的位[15:0]作为结果133写回数据ram122的行16中的相应字;在时钟514处,512个npu126中的每一个npu126将累加器202的输出217的位[31:16]作为结果133写回数据ram122的行17中的相应字;而在时钟515处,512个npu126中的每一个npu126将累加器202的输出217的位[40:32]作为结果133写回数据ram122的行18中的相应字。优选地,位[47:41]被强制设定为零值。共享afu现参考图11,示出一框图,该框图示出图1的nnu121的实施例。在图11的实施例中,神经元分成两部分,即激活函数单元部分与alu部分(alu部分还包含移位寄存器部分),并且各个激活函数单元部分由多个alu部分共享。在图11中,alu部分是指npu126,而共享的激活函数单元部分是指afu1112。这与图2的实施例形成对比,例如,在图2的实施例中,各个神经元包含其自身的afu212。因此,例如,在一个实施例中,图11的实施例的npu126(alu部分)包括图2的累加器202、alu204、复用寄存器208与寄存器205,但不包括afu212。在图11的实施例中,nnu121作为示例而包括512个npu126;然而,设想了具有其它数量的npu126的其它实施例。在图11的示例中,这512个npu126被分组成64个组(在图11中被称为组0至63),并且每个组具有8个npu126。nnu121还包括行缓存器1104以及耦接在npu126和行缓存器1104之间的多个共享afu1112。行缓存器1104的宽度(以位为单位)与数据ram122或权重ram124的行相同,例如为512个字。针对每一个npu126组存在一个afu1112,即,每个afu1112具有相应的npu126组;因此,在图11的实施例中,存在与64个npu126组相对应的64个afu1112。组内的8个npu126中的各npu126共享相应的afu1112。设想了具有不同数量的afu1112以及每组中具有不同数量的npu126的其他实施例。例如,设想了组中的两个、四个或十六个npu126共享afu1112的其它实施例。共享afu1112的动机是为了缩减nnu121的大小。大小缩减是以性能降低为代价而获得的。也就是说,例如,如下图12所展示那样,根据共享率可能需要更长的若干时钟来产生整个npu126阵列的结果133,在这种情况下,由于8:1的共享率,因而需要七个额外的时钟周期。然而,一般而言,与产生累加和所需的时钟数(例如,对于每个神经元具有512个连接的层,需要512个时钟)相比,前述额外的时钟数(例如7个)相对较少。因此,相对较小的性能影响(例如,增加百分之一的计算时间)对于nnu121的大小缩减而言可以是一个合算的妥协。在一个实施例中,每一个npu126包括afu212,其中afu212用于执行相对简单的激活函数,从而使得这些简单的afu212能够相对较小并因此能被包含在每个npu126内;而共享的或复杂的afu1112执行相对复杂的激活函数,因此相对显著地大于简单的afu212。在这样的实施例中,只有在指定需要共享复杂afu1112的复杂激活函数的情况下才需要额外的时钟周期,而在指定由简单afu212配置执行的激活函数的情况下则不需要。现参考图12与图13,示出两个时序图,这些时序图示出图11的nnu121对图4的程序的执行。图12的时序图与图5的时序图类似,并且时钟0至512相同。然而,在时钟513处,运算与图5的时序图中所述的运算不同,这是因为图11的npu126共享afu1112;即,组中的npu126共享与该组相关联的afu1112,并且图11示出共享。图13的时序图的每一行与第一列中所指示的连续时钟周期相对应。其它各列与64个afu1112中不同的afu1112相对应并指示其运算。为了简单清楚地进行图示,仅示出afu0、1和63的运算。图13的时钟周期与图12的时钟周期相对应,但以不同的方式示出npu126对afu1112的共享。如图13所示,在时钟0~512处,64个afu1112中的每一个afu1112都是处于不活动状态,而npu126执行初始化npu指令、乘法累加指令以及乘法累加轮转指令。如图12和图13这两者所示,在时钟513处,afu0(与组0相关联的afu1112)开始对npu0(即组0中的第一个npu126)的累加器202的值217执行指定的激活函数,而afu0的输出将被储存至行缓存器1104的字0。同样在时钟513处,各afu1112都开始对相应的npu126组中的第一个npu126的累加器202执行指定的激活函数。因此,如图13所示,在时钟513处,afu0开始对npu0的累加器202执行指定的激活函数以产生将被储存至行缓存器1104的字0的结果;afu1开始对npu8的累加器202执行指定的激活函数以产生将被储存至行缓存器1104的字8的结果;依此类推,afu63开始对npu504的累加器202执行指定的激活函数以产生将被储存至行缓存器1104的字504的结果。如图所示,在时钟514处,afu0(与组0相关联的afu1112)开始对npu1(即组0中的第二个npu126)的累加器202的值217执行指定的激活函数,并且afu0的输出将被储存至行缓存器1104的字1。同样在时钟514处,各afu1112都开始对相应的npu126组中的第二个npu126的累加器202执行指定的激活函数。因此,如图13所示,在时钟514处,afu0开始对npu1的累加器202执行指定的激活函数以产生将被储存至行缓存器1104的字1的结果;afu1开始对npu9的累加器202执行指定的激活函数以产生将被储存至行缓存器1104的字9的结果;依此类推,afu63开始对npu505的累加器202执行指定的激活函数以产生将被储存至行缓存器1104的字505的结果。如图所示,这种模式持续直到时钟周期520为止,afu0(与组0相关联的afu1112)开始对npu7(即组0中的第八个(最后一个)npu126)的累加器202的值217执行指定的激活函数,并且afu0的输出将被储存至行缓存器1104的字7。同样在时钟520处,各afu1112都开始对相应的npu126组中的第八个npu126的累加器202执行所指定的激活函数。因此,如图13所示,在时钟520处,afu0开始对npu7的累加器202执行指定的激活函数以产生将被储存至行缓存器1104的字7的结果;afu1开始对npu15的累加器202执行指定的激活函数以产生将被储存至行缓存器1104的字15的结果;依此类推,afu63开始对npu511的累加器202执行指定的激活函数以产生将被储存至行缓存器1104的字511的结果。在时钟521处,一旦与512个npu126相关联的全部512个结果都已经产生并写入行缓存器1104,行缓存器1104就开始将其内容写入数据ram122或权重ram124。如此,64个npu126组中的每一个组内的afu1112都执行图4的地址3处的激活函数指令的一部分。如以下例如针对图29a至图33更详细所述,在alu204组之间共享afu1112的实施例(诸如图11中的实施例等)与整数alu204结合可以是特别有利的。mtnn与mfnn架构指令现参考图14,示出一框图,该框图示出向神经网络移动(mtnn)架构指令1400以及该架构指令相对于图1的nnu121的部分的操作。mtnn指令1400包括操作码(opcode)字段1402、src1字段1404、src2字段1406、gpr字段1408以及即时字段1412。mtnn指令1400为架构指令,即,该指令包含在处理器100的指令集架构内。优选地,指令集架构将操作码字段1402的预定值与minn指令1400进行关联,来区分mtnn指令1400与指令集架构中的其它指令。mtnn指令1400的操作码1402可以包括或可以不包括诸如常见于x86架构中的前置码(prefix)。即时字段1412提供用于向nnu121的控制逻辑1434指定函数1432的值。优选地,函数1432被提供作为图1的微指令105的即时操作数。可以由nnu121执行的函数1432包括但不限于写入数据ram122、写入权重ram124、写入程序存储器129、写入控制寄存器127、开始执行程序存储器129内的程序、暂停执行程序存储器129内的程序、完成执行程序存储器129内的程序的请求通知(例如中断)、以及重设nnu121。优选地,nnu指令集包括其结果表示nnu程序已完成的指令。可选地,nnu指令集包括明确的产生中断的指令。优选地,对nnu121进行重设包括除了数据ram122、权重ram124、程序存储器129的内容维持完整不动外,有效地强制nnu121回到重设状态(例如,清空内部状态机并将其设定为空闲状态)。此外,诸如累加器202等的内部寄存器不会受到重设函数的影响,并且必须被明确地清空,例如使用图4的地址0处的初始化npu指令来清空。在一个实施例中,函数1432可包括直接执行函数,其中第一源寄存器包含微操作(例如见图34的微操作3418)。该直接执行函数指示nnu121直接执行指定的微操作。如此,架构程序可以直接控制nnu121来执行运算,而非将指令写入程序存储器129并于后续指示nnu121执行程序存储器129内的指令或者借助于mtnn指令1400(或图15的mfnn指令1500)的执行。图14示出写入数据ram122的函数1432的示例。gpr字段1408指定通用寄存器文件116内的一个gpr。在一个实施例中,每个gpr均为64位。如图所示,通用寄存器文件116将来自所选定的gpr的值提供至nnu121,nnu121将该值用作地址1422。地址1422选择函数1432中指定的存储器的行。在数据ram122或权重ram124的情况下,地址1422另外选择一数据块,该数据块的大小是选定行内的媒体寄存器(例如,512位)的位置的大小的两倍。优选地,该位置在512位边界上。在一个实施例中,复用器选择地址1422(或者在下述的mfnn指令1400的情况下的地址1422)或来自定序器128的地址123/125/131以提供至数据ram122/权重ram124/程序存储器129。在一个实施例中,如以下更详细所述,数据ram122为双端口的,从而使得npu126能够与媒体寄存器118读取/写入数据ram122并行地对数据ram122进行读取/写入。在一个实施例中,为了类似的目的,权重ram124也是双端口的。src1字段1404与src2字段1406各自指定媒体寄存器文件118中的媒体寄存器。在一个实施例中,每个媒体寄存器118均为256位。如图所示,媒体寄存器文件118将来自选定的媒体寄存器的串接数据(例如,512位)提供至数据ram122(或权重ram124或程序存储器129),以写入地址1422所指定的选定行1428并写入选定行1428中由地址1422指定的位置。有利地,通过执行一系列mtnn指令1400(以及下述的mfnn指令1500),处理器100上执行的架构程序可以填充数据ram122的行和权重ram124的行,并将诸如本文所述的(例如,图4和图9的)程序等的程序写入程序存储器129,以使nnu121以非常快的速度对数据和权重执行运算,从而实现人工神经网络。在一个实施例中,架构程序直接控制nnu121而非将程序写入程序存储器129。在一个实施例中,mtnn指令1400指定起始源寄存器和源寄存器的数量即q,而非指定两个源寄存器(例如,1404和1406)。这种形式的mtnn指令1400指示处理器100将指定为起始源寄存器的媒体寄存器118以及接下来的q-1个后续媒体寄存器118写入nnu121,即写入所指定的数据ram122或权重ram124。优选地,指令转译器104将mtnn指令1400转译为写入所有q个指定媒体寄存器118所需的数量的微指令。例如,在一个实施例中,当mtnn指令1400将起始源寄存器指定为mr4并且q为8的情况下,指令转译器104将mtnn指令1400转译为四个微指令,其中第一微指令写入mr4与mr5,第二微指令写入mr6与mr7,第三微指令写入mr8与mr9,而第四微指令写入mr10与mr11。在从媒体寄存器118至nnu121的数据路径是1024位而非512位的备选实施例中,指令转译器104将mtnn指令1400转译为两个微指令,其中第一微指令写入mr4至mr7,第二微指令写入mr8至mr11。设想了如下的类似实施例,其中mfnn指令1500指定起始目的地寄存器以及目的地寄存器的数量,以使得每一个mfnn指令1500能够读取数据ram122或权重ram124的行中的大于单个媒体寄存器118的数据块。现参考图15,示出一框图,该框图示出从神经网络移动(mtnn)架构指令1500以及该架构指令相对于图1的nnu121的部分的操作。mfnn指令1500包括操作码字段1502、dst字段1504、gpr字段1508以及即时字段1512。mfnn指令1500为架构指令,即该指令包含于处理器100的指令集架构内。优选地,该指令集架构将操作码字段1502的预定值与mfnn指令1500进行关联,以区分mfnn指令1500与指令集架构内的其它指令。mfnn指令1500的操作码1502可以包括或可以不包括诸如常见于x86架构中的前置码。即时字段1512提供用于向nnu121的控制逻辑1434指定函数1532的值。优选地,函数1532被提供作为图1的微指令105的即时操作数。可以由nnu121执行的函数1532包括但不限于读取数据ram122、读取权重ram124、读取程序存储器129、以及读取状态寄存器127。图15示出读取数据ram122的函数1532的示例。gpr字段1508指定通用寄存器文件116内的一个gpr。如图所示,通用寄存器文件116将来自所选定的gpr的值提供至nnu121,其中nnu121将该值用作地址1522并以类似于图14的地址1422的方式操作,以选择函数1532中指定的存储器的行,并且在数据ram122或权重ram124的情况下,地址1522另外选择一数据块,该数据块大小是选定行内的媒体寄存器(例如,256位)的位置的大小。优选地,该位置在256位边界上。dst字段1504指定媒体寄存器文件118中的媒体寄存器。如图所示,媒体寄存器文件118将数据(例如,256位)从数据ram122(或权重ram124或程序存储器129)接收至选定的媒体寄存器,此数据读取自地址1522所指定的选定行1528以及选定行1528中的地址1522所指定的位置。nnu内部ram端口配置现参考图16,示出一框图,该框图示出图1的数据ram122的实施例。数据ram122包括存储器阵列1606、读取端口1602以及写入端口1604。存储器阵列1606保持数据字,并且如上所述优选地布置成d行,每行n个字。在一个实施例中,存储器阵列1606包括64个水平布置的静态ram单元的阵列(其中每个单元具有128位的宽度和64位的高度)以提供宽度为8192位并且具有64行的64kb数据ram122,并且数据ram122所占用的晶粒面积大致为0.2平方毫米。然而,设想了其它实施例。读取端口1602优选采用复用方式耦接至npu126和媒体寄存器118。(更精确地,媒体寄存器118可以经由结果总线耦接至读取端口1602,其中结果总线也可以将数据提供至重排序缓存器和/或至其它执行单元112的结果转发总线。)npu126与媒体寄存器118共享读取端口1602,以对数据ram122进行读取。写入端口1604也优选采用复用方式耦接至npu126以及媒体寄存器118。npu126与媒体寄存器118共享写入端口1604,以写入数据ram122。因此,有利地,媒体寄存器118可以在npu126正从数据ram122进行读取的同时并行地写入数据ram122,或者npu126可以在媒体寄存器118正在从数据ram122进行读取的同时并行地写入数据ram122。这样可以有利地提供改进的性能。例如,npu126可以读取数据ram122(例如持续执行计算),同时媒体寄存器118可以将更多数据字写入数据ram122。再例如,npu126可以将计算结果写入数据ram122,同时媒体寄存器118从数据ram122读取计算结果。在一个实施例中,npu126可以将一行计算结果写入数据ram122,同时npu126还从数据ram122读取一行数据字。在一个实施例中,存储器阵列1606被配置成存储器区块(bank)。在npu126访问数据ram122时,所有的存储器区块都被激活以访问存储器阵列1606的整个行;而在媒体寄存器118访问数据ram122时,只有所指定的存储器区块会被激活。在一个实施例中,每个存储器区块的宽度为128位,而媒体寄存器118的宽度为256位,因此例如,每次媒体寄存器118访问时激活两个存储器区块。在一个实施例中,端口1602/1604其中之一为读取/写入端口。在一个实施例中,端口1602/1604两者都是读取/写入端口。如本文所述的npu126的轮转器能力的优点在于:与为了确保npu126被高度利用而要求在npu126执行计算的同时架构程序(经由媒体寄存器118)能够持续提供数据至数据ram122并且从数据ram122检索结果所需的存储器阵列相比,该轮转器能力有助于使数据ram122的存储器阵列1606的行显著减少,因而使该阵列相对小得多。内部ram缓存器现参考图17,示出一框图,该框图示出图1的权重ram124与缓存器1704的实施例。权重ram124包括存储器阵列1706与端口1702。存储器阵列1706保持权重字,并且如上所述优选地布置成w行,每行具有n个字。在一个实施例中,存储器阵列1706包括128个水平布置的静态ram单元的阵列(其中每个单元具有64位的宽度和2048位的高度)以提供宽度为8192位并且具有2048行的2mb权重ram124,并且权重ram124所占用的晶粒面积大致为2.4平方毫米。然而,设想了其它实施例。端口1702优选采用复用方式耦接至npu126和缓存器1704。npu126与缓存器1704经由该端口1702读取并写入权重ram124。缓存器1704还耦接至图1的媒体寄存器118,使得媒体寄存器118通过缓存器1704读取并写入权重ram124。因此,有利地,在npu126正在读取或写入权重ram124的同时,媒体寄存器118也可以并行地写入或读取缓存器1704(但是如果npu126当前正执行,优选地搁置npu126,以避免在缓存器1704访问权重ram124的同时访问该权重ram124)。这样可以有利地提升性能,特别是因为媒体寄存器118对于权重ram124的读取和写入相对于npu126对于权重ram124的读取和写入小得多。例如,在一个实施例中,npu126一次读取/写入8192位(一行),而媒体寄存器118的宽度为256位并且每个mtnn指令1400写入两个媒体寄存器118,即512位。因此,在架构程序执行十六个mtnn指令1400以填充缓存器1704的情况下,npu126和架构程序针对访问权重ram124而发生冲突的时间仅不到时间的约百分之六。在另一实施例中,指令转译器104将mtnn指令1400转译为两个微指令105,其中每个微指令105将单个数据寄存器118写入缓存器1704,在这种情况下,npu126和架构程序针对访问权重ram124而发生冲突的频率甚至更小。在包含缓存器1704的实施例中,利用架构程序写入权重ram124需要多个mtnn指令1400。一个或多个mtnn指令1400指定函数1432以写入缓存器1704中指定的数据块,随后mtnn指令1400指定函数1432以指示nnu121将缓存器1704的内容写入权重ram124的指定行,其中数据块的大小是媒体寄存器118的位数的两倍、并且这些数据块自然地在缓存器1704内对齐。在一个实施例中,在用于指定函数1432以对缓存器1704的指定数据块进行写入的各mtnn指令1400中,包含具有与缓存器1704的各数据块相对应的位的位掩码(bitmask)。来自两个指定源寄存器118的数据被写入缓存器1704中的设置了位掩码内的相应位的各数据块中。这对于权重ram124的行内的重复数据值而言可以是有用的。例如,为了将缓存器1704(以及后续的权重ram124的行)归零,程序设计者可以为源寄存器加载零值并且设置位掩码的所有位。此外,位掩码使得程序设计者能够仅写入缓存器1704中的选定数据块,从而保留其它数据块中的先前数据。在包含缓存器1704的一个实施例中,利用架构程序读取权重ram124需要多个mfnn指令1500。初始的mfnn指令1500指定函数1532以从权重ram124的指定行加载缓存器1704,随后一个或多个mfnn指令1500指定函数1532以将缓存器1704的指定数据块读取至目的地寄存器,其中数据块的大小是媒体寄存器118的位数,并且这些数据块自然地在缓存器1704内对齐。设想了如下的其它实施例,其中权重ram124包括多个缓存器1704,以通过增加npu126执行时架构程序的可访问数量来进一步减少npu126和架构程序间对访问权重ram124的竞争,这样可以增加在npu126无需访问权重ram124的时钟周期期间能够执行缓存器1704的访问的可能性。尽管图16描述了双端口数据ram122,但设想了权重ram124也是双端口的其它实施例。此外,尽管图17描述了缓存器用于权重ram124,但设想了数据ram122也具有与缓存器1704类似的关联缓存器的其它实施例。可动态配置的npu现参考图18,示出一框图,该框图示出图1的可动态配置的npu126。图18的npu126在许多方面与图2的npu126类似。然而,图18的npu126可动态配置以在两个不同配置其中之一中操作。在第一个配置中,图18的npu126的操作类似于图2的npu126。也就是说,在第一个配置(在本文中称为“宽”配置或“单个”配置)中,npu126的alu204对单个宽数据字和单个宽权重字(例如,16位)执行运算以产生单个宽结果。相比之下,在第二个配置(在本文中称为“窄”配置或“双”配置)中,npu126对两个窄数据字和两个相应的窄权重字(例如,8位)执行运算以产生两个相应的窄结果。在一个实施例中,npu126的配置(宽的或窄的)由初始化npu指令(例如,下述图20中的地址0的指令)进行。可选地,该配置也可以由mtnn指令实现,其中该mtnn指令的函数1432指定将npu126配置为所述配置(宽或窄)。优选地,由程序存储器129指令或确定配置(宽或窄)的mtnn指令填充配置寄存器。例如,配置寄存器的输出被提供给alu204、afu212以及产生复用寄存器控制信号213的逻辑。一般而言,图18的npu126的元件与图2中相同附图标记的元件执行类似的功能,并且为了理解图18,应当进行参照。然而,现将针对图18的实施例(包括与图2的不同处)进行说明。图18的npu126包括两个寄存器205a与205b、两个3输入复用寄存器208a与208b、alu204、两个累加器202a与202b、以及两个afu212a与212b。各寄存器205a/205b分别具有图2的寄存器205的宽度的一半(如8位)。各寄存器205a/205b从权重ram124接收相应的窄权重字206a/b206(例如8位)并在后续时钟周期内将其输出203a/203b提供至alu204的操作数选择逻辑1898。在npu126为宽配置的情况下,与图2的实施例的寄存器205的方式类似地,寄存器205a/205b实际上一起操作以接收来自权重ram124的宽权重字206a/206b(例如16位);以及在npu126为窄配置的情况下,寄存器205a/205b实际上独立地操作,从而各自接收来自权重ram124的窄权重字206a/206b(例如8位),以使得npu126实际上为两个单独的窄npu。然而,权重ram124的相同输出位都耦接并提供至寄存器205a/205b,而与npu126的配置无关。例如,npu0的寄存器205a接收字节0,npu0的寄存器205b接收字节1,npu1的寄存器205a接收字节2,npu1的寄存器205b接收字节3,依此类推npu511的寄存器205b接收字节1023。各复用寄存器208a/208b分别具有图2的寄存器208的宽度的一半(例如8位)。复用寄存器208a选择其输入207a、211a与1811a其中之一以储存在其寄存器中并在后续时钟周期内提供在输出209a上,并且复用寄存器208b选择其输入207b、211b与1811b其中之一以储存在其寄存器中并在后续时钟周期内在输出209b上提供至操作数选择逻辑1898。输入207a从数据ram122接收窄数据字(例如8位),并且输入207b从数据ram122接收窄数据字。在npu126为宽配置的情况下,与图2的实施例的复用寄存器208的方式类似地,复用寄存器208a/208b实际上一起操作以接收来自数据ram122的宽数据字207a/207b(例如16位);在npu126为窄配置的情况下,复用寄存器208a/208b实际上独立地操作,从而各自接收来自数据ram122的窄数据字207a/207b(例如8位),以使得npu126实际上为两个单独的窄npu。然而,数据ram122的相同输出位都耦接并提供至复用寄存器208a/208b,而与npu126的配置无关。例如,npu0的复用寄存器208a接收字节0,npu0的复用寄存器208b接收字节1,npu1的复用寄存器208a接收字节2,npu1的复用寄存器208b接收字节3,依此类推npu511的复用寄存器208b接收字节1023。输入211a接收相邻npu126的复用寄存器208a的输出209a,并且输入211b接收相邻npu126的复用寄存器208b的输出209b。如图所示,输入1811a接收相邻npu126的复用寄存器208b的输出209b,并且输入1811b接收当前npu126的复用寄存器208a的输出209a。在图1所示的n个npu126中,图18所示的npu126被标示为npuj。也就是说,npuj是n个npu的代表性实例。优选地,npuj的复用寄存器208a的输入211a接收npu126实例j-1的复用寄存器208a的输出209a,并且npuj的复用寄存器208a的输入1811a接收npu126实例j-1的复用寄存器208b的输出209b,并且npuj的复用寄存器208a的输出209a被提供至npu126实例j+1的复用寄存器208a的输入211a以及npu126实例j的复用寄存器208b的输入211b这两者;并且npuj的复用寄存器208b的输入211b接收npu126实例j-1的复用寄存器208b的输出209b,npuj的复用寄存器208b的输入1811b接收npu126实例j的复用寄存器208a的输出209a,并且npuj的复用寄存器208b的输出209b被提供至npu126实例j+1的复用寄存器208a的输入1811a以及npu126实例j+1的复用寄存器208b的输入211b这两者。控制输入213控制这三个输入中的哪一个输入被复用寄存器208a/208b选择以储存在各自的寄存器中并于后续提供在各自的输出209a/209b上。在npu126被(例如,如以下描述通过图20的地址1处的乘法累加指令)指示要从数据ram122加载一行的情况下,无论npu126是处于宽配置还是处于窄配置,控制输入213都控制各复用寄存器208a/208b从数据ram122的选定行的相应窄字中选择各自的窄数据字207a/207b(例如8位)。在npu126被(例如,如以下描述通过图20的地址2处的乘法累加轮转指令)指示为对先前接收的数据行的值进行轮转的情况下,如果npu126处于窄配置,则控制输入213控制各复用寄存器208a/208b选择相应的输入1811a/1811b。在这种情况下,复用寄存器208a/208b实际上独立操作,使得npu126实际上是两个单独的窄npu。如此,如以下针对图19更详细所述,n个npu126的复用寄存器208a和208b整体地作为2n个窄字的轮转器进行操作。在npu126被指示为对先前接收的数据行的值进行轮转的情况下,如果npu126处于宽配置,则控制输入213控制各复用寄存器208a/208b选择相应的输入211a/211b。在这种情况下,复用寄存器208a/208b实际上整体地仿佛该npu126是单个宽npu126那样进行操作。如此,与针对图3所述的方式类似地,n个npu126的复用寄存器208a和208b整体地作为n宽字的轮转器进行工作。alu204包括操作数选择逻辑1898、宽乘法器242a、窄乘法器242b、宽2输入复用器1896a,窄2输入复用器1896b,宽加法器244a以及窄加法器244b。实际上,alu204包括操作数选择逻辑1898、宽alu204a(包括宽乘法器242a、宽复用器1896a和宽加法器244a)以及窄alu204b(包括窄乘法器242b、窄复用器1896b和窄加法器244b)。优选地,宽乘法器242a将两个宽字相乘,并且与图2的乘法器242(例如16位×16位乘法器)类似。窄乘法器242b将两个窄字相乘(例如产生16位结果的8位×8位乘法器)。当npu126为窄配置时,借助于操作数选择逻辑1898,宽乘法器242a实际上用作窄乘法器以使两个窄字相乘,使得npu126实际上用作两个窄npu。优选地,宽加法器244a将宽复用器1896a的输出与宽累加器202a的输出217a相加以产生总和215a从而提供给宽累加器202a,其类似于图2的加法器244。窄加法器244b将窄复用器1896b的输出与窄累加器202b的输出217b相加以产生总和215b从而提供给窄累加器202b。在一个实施例中,窄累加器202b具有28位的宽度,以避免在对多达1024个16位乘积进行累加时损失精度。当npu126为宽配置时,窄乘法器242b、窄复用器1896b、窄加法器244b、窄累加器202b以及窄afu212b优选地不活动以降低能耗。如以下更详细所述,操作数选择逻辑1898从209a、209b、203a与203b中选择操作数以提供至alu204的其它元件。优选地,操作数选择逻辑1898还执行其它功能,例如执行带符号值的数据字和权重字的符号扩展。例如,如果npu126为窄配置,则操作数选择逻辑1898在将窄数据字和权重字提供给宽乘法器242a之前,将该窄数据字和权重字符号扩展至宽字的宽度。类似地,如果alu204被指示为使窄数据/权重字通过(经由宽复用器1896a而跳过宽乘法器242a),则操作数选择逻辑1898在将窄数据/权重字提供给宽加法器244a之前,将窄数据/权重字符号扩展至宽字的宽度。优选地,图2的npu126的alu204中也存在执行符号扩展功能的逻辑。宽复用器1896a接收宽乘法器242a的输出以及来自操作数选择逻辑1898的操作数,并从这些输入中选择其中之一以提供给宽加法器244a,并且窄复用器1896b接收窄乘法器242b的输出以及来自操作数选择逻辑1898的操作数,并选择这些输入其中之一以提供给窄加法器244b。操作数选择逻辑1898所提供的操作数取决于npu126的配置以及alu204基于npu126正执行的指令所指定的函数而执行的算术和/或逻辑运算。例如,如果指令指示alu204执行乘法累加并且npu126为宽配置,则操作数选择逻辑1898将作为输出209a和209b的串接的宽字提供至宽乘法器242a的一个输入、并将作为输出203a和203b的串接的宽字提供至另一输入,而窄乘法器242b不活动,使得npu126用作与图2的npu126类似的单个宽npu126。而如果指令指示alu204执行乘法累加并且npu126处于窄配置,则操作数选择逻辑1898将窄数据字209a的扩展后或扩宽后的版本提供至宽乘法器242a的一个输入、并将窄权重字203a的扩展后版本提供至另一输入;此外,操作数选择逻辑1898将窄数据字209b提供至窄乘法器242b的一个输入并将窄权重字203b提供至另一输入。为将窄字扩展或扩宽,如果窄字带符号,则操作数选择逻辑1898对该窄字进行符号扩展;而如果窄字不带符号,则操作数选择逻辑1898为窄字填入值为零的高位。再例如,如果npu126处于宽配置并且指令指示alu204执行权重字的累加,则宽乘法器242a被跳过,并且操作数选择逻辑1898将输出203a和203b的串接提供至宽复用器1896a,以提供给宽加法器244a。而如果npu126为窄配置并且指令指示alu204执行权重字的累加,则宽乘法器242a被跳过并且操作数选择逻辑1898将输出203a的扩展后版本提供至宽复用器1896a,以提供给宽加法器244a;并且窄乘法器242b被跳过并且操作数选择逻辑1898将输出203b的扩展后版本提供至窄复用器1896b,以提供给窄加法器244b。再例如,如果npu126为宽配置并且指令指示alu204执行数据字的累加,则宽乘法器242a被跳过并且操作数选择逻辑1898将输出209a和209b的串接提供至宽复用器1896a,以提供给宽加法器244a。而如果npu126为窄配置并且指令指示alu204执行数据字的累加,则宽乘法器242a被跳过、并且操作数选择逻辑1898将输出209a的扩展后版本提供至宽复用器1896a,以提供给宽加法器244a;并且窄乘法器242b被跳过、并且操作数选择逻辑1898将输出209b的扩展后版本提供至窄复用器1896b,以提供给窄加法器244b。权重/数据字的累加可以有助于执行平均运算,其中这些平均运算用于诸如图像处理等的某些人工神经网络应用的池化层。优选地,npu126还包括:第二宽复用器(未示出),用于跳过宽加法器244a以便于在宽配置下利用宽数据/权重字或在窄配置下利用扩展后的窄数据/权重字来加载宽累加器202a;以及第二窄复用器(未示出),用于跳过窄加法器244b,以便于在窄配置下利用窄数据/权重字加载窄累加器202b。优选地,alu204还包括宽和窄的比较器/复用器组合(未示出),其中该比较器/复用器组合接收相应的累加器值217a/217b和相应的复用器1896a/1896b输出,以在累加器值217a/217b与数据/权重字209a/b/203a/b之间选择最大值,如以下例如针对图27和28更详细所述,这样的运算用于某些人工神经网络应用的池化层中。此外,操作数选择逻辑1898被配置为提供值为零的操作数(用于加零或用于清除累加器)并提供值为一的操作数(用于乘一)。窄afu212b接收窄累加器202b的输出217b并对其执行激活函数以产生窄结果133b,而宽afu212a接收宽累加器202a的输出217a并对其执行激活函数以产生宽结果133a。当npu126为窄配置时,宽afu212a相应地考虑宽累加器202a的输出217a并对其执行激活函数以产生窄结果(例如8位),这如以下例如针对图29a至图30更详细所述。从以上说明可以发现,有利地,单个npu126在为窄配置时实际上作为两个窄npu而操作,因此对于较小的字提供大致为宽配置时的吞吐量的多达两倍的吞吐量。例如,假定神经网络层具有1024个神经元,而每个神经元从先前层接收1024个窄输入(并具有窄权重字),从而产生一百万个连接。与具有512个宽配置的npu126的nnu121相比,具有512个窄配置的npu126的nnu121能够在大致一半的时间内(约1026个时钟vs514个时钟)处理四倍的连接数(一百万个连接vs256k个连接),尽管处理的是窄字而非宽字。在一个实施例中,图18的可动态配置npu126包括与复用寄存器208a和208b类似的3输入复用寄存器以取代寄存器205a和205b,从而实现针对从权重ram124接收到的一行权重字的轮转器,这与针对图7的实施例所述的方式某种程度类似但采用针对图18所述的可动态配置方式。现参考图19,示出一框图,该框图示出根据图18的实施例的图1的nnu121的n个npu126的2n个复用寄存器208a/208b的布置的实施例、从而说明这2n个复用寄存器208a/208b作为针对从图1的数据ram122接收到的一行数据字207的轮转器的操作。在图19的实施例中,如图所示,n是512,使得nnu121具有被标示为0至511的1024个复用寄存器208a/208b,其对应至512个npu126(实际上为1024个窄npu)。npu126内的两个窄npu标示为a和b,并且在每个复用寄存器208中,示出相应的窄npu的指定。更具体地,为npu1260的复用寄存器208a指定0-a,为npu1260的复用寄存器208b指定0-b,为npu1261的复用寄存器208a指定1-a,为npu1261的复用寄存器208b指定1-b,为npu126511的复用寄存器208a指定511-a,并且为npu126511的复用寄存器208b指定511-b,这些值亦对应至以下所述的图21的窄npu。每个复用寄存器208a接收数据ram122的d行的其中一行中的相应窄数据字207a,并且每个复用寄存器208b接收数据ram122的d行的其中一行中的相应窄数据字207b。也就是说,复用寄存器0a接收数据ram122行的窄数据字0,复用寄存器0b接收数据ram122行的窄数据字1,复用寄存器1a接收数据ram122行的窄数据字2,复用寄存器1b接收数据ram122行的窄数据字3,依此类推,复用寄存器511a接收数据ram122行的窄数据字1022,以及复用寄存器511b接收数据ram122行的窄数据字1023。此外,复用寄存器1a在其输入211a上接收复用寄存器0a的输出209a,复用寄存器1b在其输入211b上接收复用寄存器0b的输出209b,依此类推,复用寄存器511a在其输入211a上接收复用寄存器510a的输出209a,复用寄存器511b在其输入211b上接收复用寄存器510b的输出209b,并且复用寄存器0a在其输入211a上接收复用寄存器511a的输出209a,复用寄存器0b在其输入211b上接收复用寄存器511b的输出209b。每个复用寄存器208a/208b接收控制输入213,其中该控制输入213控制是要选择数据字207a/207b、还是选择轮转后输入211a/211b、亦或是选择轮转后输入1811a/1811b。最后,复用寄存器1a在其输入1811a上接收复用寄存器0b的输出209b,复用寄存器1b在其输入1811b上接收复用寄存器1a的输出209a,依此类推,复用寄存器511a在其输入1811a上接收复用寄存器510b的输出209b,复用寄存器511b在其输入1811b上接收复用寄存器511a的输出209a,并且复用寄存器0a在其输入1811a上接收复用寄存器511b的输出209b,复用寄存器0b在其输入1811b上接收复用寄存器0a的输出209a。每个复用寄存器208a/208b接收控制输入213,其中该控制输入213控制是要选择数据字207a/207b、还是选择轮转后输入211a/211b、亦或是选择轮转后输入1811a/1811b。如以下更详细所述,在一运算模式中,在第一时钟周期中,控制输入213控制每个复用寄存器208a/208b选择数据字207a/207b以储存至寄存器并于后续提供至alu204;以及在后续时钟周期(例如上述的m-1时钟周期)中,控制输入213控制每个复用寄存器208a/208b选择轮转后输入1811a/1811b以储存至寄存器并于后续提供至alu204。现参考图20,示出一表格,该表格示出储存于图1的nnu121的程序存储器129中并由该nnu121执行的程序,其中该nnu121具有根据图18的实施例的npu126。图20的示例性程序在许多方面与图4的程序类似。然而,以下将说明差异。位于地址0的初始化npu指令指定npu126将为窄配置。此外,如图所示,位于地址2的乘法累加轮转指令将计数指定为1023,并需要1023个时钟周期。这是因为图20的示例假定一层实际上具有1024个窄(例如8位)神经元(npu),每个窄神经元具有来自先前层的1024个神经元的1024个连接输入,因此总共有1024k个连接。每个神经元从每个连接输入接收8位数据值,并将该8位数据值乘以适当的8位权重值。现参考图21,示出一时序图,该时序图示出nnu121执行图20的程序,其中该nnu121包括图18的在窄配置中操作的npu126。图21的时序图在许多方面与图5的时序图类似;然而,以下将说明差异。在图21的时序图中,npu126为窄配置,这是因为位于地址0的初始化npu指令将这些npu初始化为窄配置。因此,这512个npu126实际上作为1024个窄npu(或神经元)操作,其中这1024个窄npu在列内被指定为npu0-a和npu0-b(npu1260的两个窄npu)、npu1-a和npu1-b(npu1261的两个窄npu)、…、npu511-a与npu511-b(npu126511的两个窄npu)。为简单清楚地图示,仅示出窄npu0-a、0-b与511-b的操作。由于地址2处的乘法累加轮转将计数指定为1023(这需要1023个时钟周期)这一事实,因此图21的时序图的行包括多达1026个时钟周期。在时钟0处,1024个npu各自执行图4的初始化指令,即图5所示将零值指派至累加器202的初始化指令。在时钟1处,1024个窄npu各自执行图20的地址1处的乘法累加指令。如图所示,窄npu0-a将数据ram122的行17的窄字0和权重ram124的行0的窄字0的乘积与累加器202a的值(即零)累加;窄npu0-b将数据ram122的行17的窄字1和权重ram124的行0的窄字1的乘积与累加器202b的值(即零)累加;依此类推,窄npu511-b将数据ram122的行17的窄字1023与权重ram124的行0的窄字1023的乘积与累加器202b的值(即零)累加。在时钟2处,1024个窄npu各自执行图20的地址2的乘法累加轮转指令的第一次迭代。如图所示,窄npu0-a将从窄npu511-b的复用寄存器208b的输出209b所接收到的轮转后的窄数据字1811a(即从数据ram122所接收到的窄数据字1023)和权重ram124的行1的窄字0的乘积与累加器202a的值217a累加;窄npu0-b将从窄npu0-a的复用寄存器208a的输出209a所接收到的轮转后的窄数据字1811b(即从数据ram122所接收到的窄数据字0)和权重ram124的行1的窄字1的乘积与累加器202b的值217b累加;依此类推,窄npu511-b将从窄npu511-a的复用寄存器208a的输出209a所接收到的轮转后的窄数据字1811b(即从数据ram122所接收到的窄数据字1022)和权重ram124的行1的窄字1023的乘积与累加器202b的值217b累加。在时钟3处,1024个窄npu各自执行图20的地址2处的乘法累加轮转指令的第二次迭代。如图所示,窄npu0-a将从窄npu511-b的复用寄存器208b的输出209b所接收到的轮转后的窄数据字1811a(即从数据ram122所接收到的窄数据字1022)和权重ram124的行2的窄字0的乘积与累加器202a的值217a累加;窄npu0-b将从窄npu0-a的复用寄存器208a的输出209a所接收到的轮转后的窄数据字1811b(即从数据ram122所接收到的窄数据字1023)和权重ram124的行2的窄字1的乘积与累加器202b的值217b累加;依此类推,窄npu511-b将从窄npu511-a的复用寄存器208a的输出209a所接收到的轮转后的窄数据字1811b(即从数据ram122所接收到的窄数据字1021)和权重ram124的行2的窄字1023的乘积与累加器202b的值217b累加。如图21的省略号所示,在接下来的1021个时钟周期的每个时钟周期内依此持续进行,直到时钟1024。在时钟1024处,1024个窄npu各自执行图20的地址2处的乘法累加轮转指令的第1023次迭代。如图所示,窄npu0-a将从窄npu511-b的复用寄存器208b的输出209b所接收到的轮转后的窄数据字1811a(即从数据ram122所接收到的窄数据字1)和权重ram124的行1023的窄字0的乘积与累加器202a的值217a累加;窄npu0-b将从npu0-a的复用寄存器208a的输出209a所接收到的轮转后的窄数据字1811b(即从数据ram122所接收到的窄数据字2)和权重ram124的行1023的窄字1的乘积与累加器202b的值217b累加;依此类推,窄npu511-b将从npu511-a的复用寄存器208a的输出209a所接收到的轮转后的窄数据字1811b(即从数据ram122所接收到的窄数据字0)和权重ram124的行1023的窄字1023的乘积与累加器202b的值217b累加。在时钟1025处,1024个窄npu各自的afu212a/212b执行图20的地址3处的激活函数指令。最后,在时钟1026处,这1024个窄npu各自通过将其窄结果133a/133b写回数据ram122的行16的相应窄字,来执行图20的地址4处的写入afu输出指令,即npu0-a的窄结果133a被写入数据ram122的窄字0,npu0-b的窄结果133b被写入数据ram122的窄字1,依此类推,npu511-b的窄结果133被写入数据ram122的窄字1023。在图22中,还以框图的形式示出以上针对图21所述的操作。现参考图22,示出一框图,该框图示出图1的nnu121,其中该nnu121包括图18的npu126以执行图20的程序。nnu121包括512个npu126即1024个窄npu、接收其地址输入123的数据ram122、以及接收其地址输入125的权重ram124。尽管未示出,但在时钟0,这1024个窄npu执行图20的初始化指令。如图所示,在时钟1处,行17的1024个8位数据字被从数据ram122读出并提供至1024个窄npu。在时钟1至1024,行0至1023的1024个8位权重字分别被从权重ram124读出并提供至1024个窄npu。虽然未示出,但在时钟1,1024个窄npu对加载的数据字与权重字执行相应的乘法累加运算。在时钟2至1024,1024个窄npu的复用寄存器208a/208b作为1024个8位字轮转器操作以将先前加载的数据ram122的行17的数据字轮转至相邻的窄npu,并且窄npu对相应的轮转后的数据字以及从权重ram124加载的相应窄权重字执行乘法累加运算。尽管未示出,但在时钟1025,1024个窄afu212a/212b执行激活指令。在时钟1026,1024个窄npu将其相应的1024个8位结果133a/133b写回数据ram122的行16。可以发现,例如,图18的实施例相较于图2的实施例可具有优势,这是因为图18的实施例为程序设计者提供了灵活性,以在正被建模的特定应用需要一定精确度的情况下使用宽数据字和权重字(例如16位)进行计算,并且在该应用需要一定精确度的情况下使用窄数据字和权重字(例如8位)来进行计算。从一个角度来看,对于窄数据的应用而言,图18的实施例相较于图2的实施例,以额外的窄元件(例如复用寄存器208b、寄存器205b、窄alu204b、窄累加器202b、窄afu212b)作为代价,可提供两倍的吞吐量,这些额外的窄元件使npu126的面积增加约50%。三模式npu现参考图23,示出一框图,该框图示出根据备选实施例的可动态配置的图1的npu126。图23的npu126不但可配置为宽配置与窄配置,还可配置于第三配置(在本文中称为“漏斗(funnel)”配置)。图23的npu126在许多方面与图18的npu126类似。然而,图18中的宽加法器244a在图23的npu126中由3输入宽加法器2344a所取代,其中3输入宽加法器2344a接收作为窄复用器1896b的输出的扩展后版本的第三加数2399。用于操作具有图23的npu126的nnu121的程序在许多方面与图20的程序类似。然而,地址0处的初始化npu指令将这些npu126初始化为漏斗配置,而非窄配置。此外,地址2的乘法累加轮转指令的计数为511而非1023。在漏斗配置的情况下,npu126的操作与在以窄配置执行诸如图20的地址1处的乘法累加指令的情况下的操作在以下方面类似:npu126接收两个窄数据字207a/207b和两个窄权重字206a/206b;宽乘法器242a将数据字209a与权重字203a相乘以产生宽复用器1896a所选择的乘积246a;以及窄乘法器242b将数据字209b与权重字203b相乘以产生窄复用器1896b所选择的乘积246b。然而,宽加法器2344a将(宽复用器1896a所选择的)乘积246a和(宽复用器1896b所选择的)乘积246b/2399两者与宽累加器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将(宽复用器1896a所选择的)乘积246a和(宽复用器1896b所选择的)乘积246b/2399两者与宽累加器202a的值217a相加,而窄加法器244b与窄累加器202b如上所述不活动。最后,在以漏斗配置执行诸如图20的地址3处等的激活函数指令时,宽afu212a对所得到的总和215a执行激活函数以产生窄结果133a,而窄afu212b不活动。如此,只有标示为a的窄npu产生窄结果133a,而标示为b的窄npu所产生的窄结果133b是无效的。因此,写回的结果行(例如图20的地址4处的指令所指示的行16)包含空洞,这是因为只有窄结果133a是有效的,而窄结果133b是无效的。因此,与每个神经元在每个时钟周期内处理一个连接数据输入的图2和图18的实施例相对比,从概念上讲,每个时钟周期内,每个神经元(图23的npu126)处理两个连接数据输入,即将两个窄数据字乘以相应的权重并将这两个乘积累加。针对图23的实施例可以发现,所产生并写回数据ram122或权重ram124的结果字(神经元输出)的数量是所接收到的数据输入(连接)的数量的平方根的一半,并且写回的结果行具有空洞,即每隔一个窄字结果是无效的,更具体地,标示为b的窄npu结果不具意义。因此,图23的实施例对于具有连续两层的神经网络特别有效,例如,第一层所具有的神经元数量为第二层的两倍(例如第一层所具有的1024个神经元完全连接至第二层的512个神经元)。此外,其它执行单元122(例如媒体单元,诸如x86avx单元)在必要的情况下可对分散的(即具有空洞的)结果行执行压紧运算(packoperation)以使其紧密(即不具有空洞),以用于当nnu121正执行与数据ram122和/或权重ram124的其它行相关联的其它计算时的后续计算。混合nnu运算:卷积能力与池化能力根据本文所述实施例的nnu121的优点在于,该nnu121能够并行地以类似于协处理器执行自己内部程序的方式操作、以及以类似于处理器的执行单元执行被发布给该执行单元的架构指令(或从架构指令转译来的微指令)的方式操作。架构指令具有由包括nnu121的处理器所执行的架构程序。如此,nnu121以混合方式操作,这种操作方式是有利的,因为它提供了维持对nnu121的高利用率的能力。例如,图24至图26示出nnu121执行卷积运算的操作,在该操作中,nnu的利用率高,并且图27至图28示出nnu121执行池化运算的操作,其中这些卷积运算和池化运算是卷积层、池化层以及诸如图像处理(例如边缘检测、锐化、模糊、辨识/分类)等的其它数字数据计算应用所需的。然而,nnu121的混合运算不限于执行卷积或池化运算,而是混合特征也可用于执行其它运算,诸如以上针对图4至图13所述的传统神经网络乘法累加运算和激活函数运算等。也就是说,处理器100(更具体地,保留站108)向nnu121发布mtnn指令1400与mfnn指令1500,其中响应于这些指令,nnu121将数据写入存储器122/124/129并从由nnu121进行写入的存储器122/124中读取结果,与此同时,响应于执行由处理器100(经由mtnn1400指令)写入程序存储器129的程序,nnu121对存储器122/124/129进行读取和写入。现参考图24,示出一框图,该框图示出图1的nnu121使用以执行卷积运算的数据结构的示例。该框图包括卷积核2402、数据阵列2404、以及图1的数据ram122与权重ram124。优选地,(例如,图像像素的)数据阵列2404保持在附接至处理器100的系统存储器(未示出)中并通过处理器100执行mtnn指令1400而被加载至nnu121的权重ram124。卷积运算是将第一矩阵与第二矩阵进行卷积的运算,其中第二矩阵在本文中被称为卷积核。如在本发明的上下文中所述,卷积核是系数的矩阵,其中这些系数也可称为权重、参数、元素或值。优选地,卷积核2402是处理器100正执行的架构程序的静态数据。数据阵列2404是数据值的二维阵列,并且各数据值(例如图像像素值)是数据ram122或权重ram124的字的大小(例如16位或8位)。在该示例中,数据值为16位字,并且nnu121被配置为512个宽配置npu126。此外,在实施例中,如以下更详细所述,npu126包括用于从权重ram124接收权重字206的复用寄存器(诸如图7的复用寄存器705等),以对从权重ram124接收到的一行数据值执行整体轮转器运算。在该示例中,数据阵列2404是2560列×1600行的像素阵列。如图所示,当架构程序将数据阵列2404与卷积核2402进行卷积时,该架构程序将数据阵列2402分为20个数据块,其中各数据块是512×400的数据矩阵2406。在示例中,卷积核2402是由系数、权重、参数、或元素构成的3×3矩阵。第一行系数被标示为c0,0、c0,1和c0,2;第二行系数被标示为c1,0、c1,1和c1,2;并且第三行系数被标示为c2,0、c2,1、和c2,2。例如,可用于执行边缘检测的卷积核具有以下系数:0,1,0,1,-4,1,0,1,0。再例如,可用于对图像进行高斯模糊的卷积核具有以下系数:1,2,1,2,4,2,1,2,1。在这种情况下,通常对最终累加值执行除法,其中,除数为卷积核2402的各元素的绝对值的总和(在该示例中为16)。又例如,除数是卷积核2402的元素的数量。又例如,除数是将卷积压缩回至期望值范围内的值,并且该除数根据卷积核2402的元素值、期望范围以及正被执行卷积运算的矩阵的输入值的范围来确定。如图24所示并且针对图25更详细所述,架构程序将卷积核2402的系数写入数据ram122。优选地,数据ram122的连续九行(卷积核2402内的元素数量)的每行的所有字以行为主要顺序被写入卷积核2402的不同元素。也就是说,如图所示,一行的每个字被写入有第一系数c0,0;下一行被写入有第二系数c0,1;下一行被写入有第三系数c0,2;再下一行被写入有第四系数c1,0;依此类推,第九行的每个字被写入有第九系数c2,2。为了对数据阵列2404的数据块的数据矩阵2406进行卷积,如以下特别是针对图26更详细所述,npu126按顺序重复读取数据ram122中保持卷积核2402的系数的九行。如图24所示并且针对图25更详细所述,架构程序将数据矩阵2406的值写入权重ram124。在nnu程序执行卷积时,将结果矩阵写回权重ram124。优选地,如以下针对图25更详细所述,架构程序将第一数据矩阵2406写入权重ram124并启动nnu121,并且当nnu121在对第一数据矩阵2406与卷积核2402进行卷积时,架构程序将第二数据矩阵2406写入权重ram124,使得nnu121一旦完成对第一数据矩阵2406的卷积,其即可开始对第二数据矩阵2406执行卷积。如此,架构程序往返于权重ram124的两个区域之间,以确保nnu121被充分使用。因此,图24的示例示出第一数据矩阵2406a和第二数据矩阵2406b,其中第一数据矩阵2406a与占据权重ram124的行0至399行的第一数据块相对应,第二数据矩阵2406b与占据权重ram124的行500至899的第二数据块相对应。此外,如图所示,nnu121将卷积的结果写回权重ram124的行900~1299和1300~1699,随后架构程序从权重ram124读出这些结果。保持在权重ram124中的数据矩阵2406的数据值标示为“dx,y”,其中“x”是权重ram124的行数,“y”是权重ram124的字或列数。因此,例如,行399中的数据字511在图24中被标示为d399,511,该数据字由npu511的复用寄存器705接收。现参考图25,示出一流程图,该流程图示出图1的处理器100执行架构程序的操作,所述架构程序将用以对卷积核2402执行卷积的nnu121用于图24的数据阵列2404。流程始于方框2502。在方框2502处,处理器100(即运行在处理器100上的架构程序)将图24的卷积核2402以针对图24所示和所述的方式写入数据ram122。此外,架构程序将变量n初始化为值1。变量n表示数据阵列2404中正由nnu121处理的当前数据块。此外,架构程序将变量num_chunks初始化为值20。流程进入方框2504。在方框2504处,如图24所示,处理器100将数据块1的数据矩阵2406写入权重ram124(例如数据块1的数据矩阵2406a)。流程进入方框2506。在方框2506处,处理器100使用用于指定对程序存储器129进行写入的函数1432的mtnn指令1400,将卷积程序写入nnu121的程序存储器129。处理器100随后使用用于指定启动对程序的执行的函数1432的mtnn指令1400,来启动nnu卷积程序。以下针对图26a更详细地描述nnu卷积程序的示例。流程进入决策方框2508。在决策方框2508处,架构程序确定变量n的值是否小于num_chunks。如果是,流程进入方框2512;否则进入方框2514。在方框2512处,如图24所示,处理器100将数据块n+1的数据矩阵2406写入权重ram124(例如数据块2的数据矩阵2406b)。因此,有利地,当nnu121正在对当前数据块执行卷积时,架构程序将下一数据块的数据矩阵2406写入权重ram124,使得一旦完成当前数据块的卷积(即写入权重ram124),nnu121就可以立即开始执行对下一个数据块的卷积。流程进入方框2514。在方框2514处,处理器100确定为(在数据块1的情况下从方框2506开始的,在数据块2~20的情况下从方框2518开始的)当前正在运行的nnu程序已经完成。优选地,处理器100通过执行mfnn指令1500以读取nnu121的状态寄存器127来进行该确定。在备选实施例中,nnu121产生中断,从而表示其已经完成卷积程序。流程进入决策方框2516。在决策方框2516处,架构程序确定变量n的值是否小于num_chunks。如果是,流程进入方框2518;否则进入方框2522。在方框2518处,处理器100更新卷积程序使得该处理器可以对数据块n+1进行卷积。更具体地,处理器100将权重ram124中在地址0处的初始化npu指令的行值更新为数据矩阵2406的第一行(例如,更新为数据矩阵2406a的行0或数据矩阵2406b的行500),并且更新输出行(例如更新为行900或1300)。然后处理器100启动更新后的nnu卷积程序。流程进入方框2522。在方框2522处,处理器100从权重ram124读取数据块n的nnu卷积程序的结果。流程进入决策方框2524。在决策方框2524处,架构程序确定变量n的值是否小于num_chunks。如果是,流程进入方框2526;否则流程结束。在方框2526处,架构程序使n的增加1。流程返回决策方框2508。现参考图26a,示出nnu程序的程序列表,其中该nnu程序利用图24的卷积核2402对数据矩阵2406执行卷积并将其写回权重ram124。该程序将通过地址1至9处的指令循环体来循环一定次数。地址0处的初始化npu指令指定各npu126执行该循环体的次数,在图26a的示例中,与图24的数据矩阵2406内的行数相对应地,循环计数值为400,并且循环末端(地址10)处的循环指令使当前循环计数值递减,并且如果结果非零、则所述循环指令引起返回循环体的顶端(即返回地址1处的指令)的控制。初始化npu指令也将累加器202清零。优选地,地址10处的循环指令也将累加器202清零。可选地,如上所述,地址1处的乘法累加指令可以指定将累加器202清零。对于程序的循环体的每一次执行,512个npu126并行地对3×3卷积核2402和数据矩阵2406的512个相应3×3子矩阵执行512个卷积。卷积是卷积核2402的元素与相应子矩阵内的对应元素的九个乘积的总和。在图26a的实施例中,512个相应3×3子矩阵各自的原点(中央元素)是图24的数据字dx+1,y+1,其中y(列编号)是npu126的编号,而x(行编号)是当前权重ram124中由图26a的程序的地址1处的乘法累加指令所读取的行编号(同样,该行编号由地址0处的初始化npu指令进行初始化,在地址3与5的各乘法累加指令处递增,并且由地址9处的递减指令进行更新)。因此,针对程序的每一个循环,512个npu126计算512个卷积,并将512个卷积结果写回权重ram124的指定行。在本说明书中,为简单起见省略边缘处理(edgehandling),但是应当注意,使用这些npu126的整体轮转特征将造成列中的两列从(例如,图像处理情况下的图像的)数据矩阵2406的一个垂直边缘到另一垂直边缘(例如从左侧边缘到右侧边缘或者反之亦然)产生环绕(wrapping)。现在针对循环体进行说明。地址1是用于指定数据ram122的行0并隐式地使用当前权重ram124的行的乘法累加指令,其中当前权重ram124的行优选保持在定序器128内(并由位于地址0的指令初始化为零以第一次通过循环体)。也就是说,位于地址1的指令使每个npu126从数据ram122的行0读取其相应字、从当前权重ram124的行读取其相应字,并对这两个字执行乘法累加运算。因此,例如,npu5将c0,0与dx,5相乘(其中“x”是当前权重ram124的行),将结果与累加器202的值217相加,并将总和写回累加器202。地址2是用于指定使数据ram122的行递增(即递增至行1)并且随后从数据ram122的递增后地址读取行的乘法累加指令。该指令还指定将每个npu126的复用寄存器705内的值轮转至相邻npu126,在这种情况下所述值是响应于地址1的指令而刚刚从权重ram124读取的一行数据矩阵2406值。在图24至26的实施例中,npu126被配置为将复用寄存器705的值向左轮转,即从npuj轮转至npuj-1,而非如以上针对图3、7和19所述从npuj轮转至npuj+1。应当理解,在npu126被配置为向右轮转的实施例中,架构程序可以将卷积核2042的系数值按不同顺序写入数据ram122(例如绕着其中心列轮转)以实现相似卷积结果。此外,在需要时,架构程序可以对卷积核2402执行额外的预处理(例如转置(transposition))。此外,指令指定计数值2。因此,位于地址2的指令使每个npu126从数据ram122的行1读取其相应字,将轮转后的字接收至复用寄存器705,并对这两个字执行乘法累加运算。由于计数值为2,因此该指令还使每个npu126重复前述操作。也就是说,定序器128使数据ram122的行地址123增加(即增加至行2),并且每个npu126从数据ram122的行2读取其相应字,将轮转后的字接收至复用寄存器705,并且对这两个字执行乘法累加运算。因此,例如,假定当前权重ram124的行为27,在执行地址2处的指令后,npu5将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处的指令类似,然而借助于权重ram124的行递增指示符,这些指令对权重ram124的下一行执行运算,并且对数据ram122的接下来的三行(即行3至5)执行运算。也就是说,例如针对npu5,在完成地址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处的指令类似,然而这些指令对权重ram124的下一行以及数据ram122的接下来的三行(即行6至8)执行运算。也就是说,例如针对npu5,在完成地址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处的指令后、并且假定循环体开始时的权重ram124的行为27,则npu5例如将利用卷积核2402对以下3×3子矩阵进行卷积:更一般地,在完成地址1到6处的指令后,512个npu126中的每个npu126都使用卷积核2402对下列3×3子矩阵进行了卷积:其中r是循环体开始时权重ram124的行地址值,并且n是npu126的编号。地址7处的指令使累加器202的值217通过afu212。该通过函数使大小为从数据ram122和权重ram124读取的字的大小(以位为单位,在该示例中即16位)的字通过。优选地,如以下更详细所述,用户可指定输出格式,例如输出位中有多少位是小数位。可选地,指定除法激活函数,而非指定通过激活函数,其中诸如本文针对图29a和图30所述,所述除法激活函数例如使用图30的“除法器”3014/3016其中之一将累加器202的值217除以一个除数。例如,在具有系数(诸如上述的高斯模糊核的十六分之一系数等)的卷积核2402的情况下,地址7处的激活函数指令可以指定除法激活函数(例如除以16),而非指定通过函数。可选地,架构程序可以在将卷积核2402系数写入数据ram122之前,对这些系数执行除以16的运算,并例如使用如下所述图29a的数据二进制小数点2922针对卷积核2402的值相应地调整二进制小数点的位置。地址8处的指令将afu212的输出写入权重ram124中由输出行寄存器的当前值所指定的行,其中该当前值被地址0处的指令初始化并且借助于指令内的递增指示符在每次通过循环时递增。如根据图24至图26中具有3×3卷积核2402的示例可以确定,npu126大约每三个时钟周期读取权重ram124以读取数据矩阵2406的行,并且大约每12个时钟周期将卷积结果矩阵写入权重ram124。此外,假定包括诸如图17的缓存器1704等的写入和读取缓存器的实施例,与npu126进行读取与写入并行地,处理器100对权重ram124进行读取与写入,使得缓存器1704大约每16个时钟周期对权重ram124执行一次写入和一次读取,以分别写入数据矩阵2406以及读取卷积结果矩阵。因此,权重ram124的大约一半的带宽被nnu121执行卷积核运算所用的混合方式消耗。尽管本示例包含3×3卷积核2402,但可以采用其它大小的卷积核,诸如2×2、4×4、5×5、6×6、7×7、8×8等矩阵,在这种情况下,nnu程序将改变。在卷积核较大的情况下,因为乘法累加指令的轮转版本的计数较大(例如图26a的程序的地址2、4与6处、以及较大卷积核所需的附加指令),因而npu126读取权重ram124的时间的百分比较小,因此权重ram124的带宽被消耗的百分比也较小。可选地,架构程序将nnu程序配置为在不再需要输入数据矩阵2406的行之后对这些行进行覆写,而非将卷积结果写回权重ram124的不同行(例如行900~1299与1300~1699)。例如,在3×3卷积核的情况下,架构程序将数据矩阵2406写入权重ram124的行2~401,而非将数据矩阵2406写入行0~399,并且npu程序被配置为从权重ram124的行0开始并且每通过一次循环体就递增地,将卷积结果写入权重ram124。如此,nnu程序只对不再需要的行进行覆写。例如,在第一次通过循环体之后(或更具体地,在执行地址1处的加载权重ram124的行0的指令之后),行0的数据可被覆写,但是行1~3的数据需要用于第二次通过循环体因而不会因为第一次通过循环体而被覆写;同样地,在第二次通过循环体之后,行1的数据可被覆写,但是行2~4的数据需要用于第三次通过循环体因而不会因为第二次通过循环体而被覆写;依此类推。在这样的实施例中,各个数据矩阵2406(数据块)的高度可以较大(例如,800行),从而得到较少的数据块。可选地,架构程序将nnu程序配置为将卷积结果写回数据ram122的卷积核2402上方(例如,行8上方)的行,而非将卷积结果写回权重ram124,并且当nnu121(例如使用以下所述的图26b的数据ram122的最近写入的行2606的地址)写入结果时,架构程序从数据ram122读取这些结果。这种替代方案在权重ram124为单端口并且数据ram122为双端口的实施例中可以是有利的。从根据图24至图26a的实施例的nnu121的操作可以发现,图26a的程序的每次执行需要约5000个时钟周期,因此,图24的整个2560×1600的数据阵列2404的卷积需要大约100000个时钟周期,明显少于以传统方式执行相同任务所需要的时钟周期数。现参考图26b,示出一框图,该框图示出根据一个实施例的图1的nnu121的控制寄存器127的某些字段。状态寄存器127包括:字段2602,用于指示权重ram124中最近被npu126写入的行的地址;字段2606,用于指示数据ram122中最近被npu126写入的行的地址;字段2604,用于指示权重ram124中最近被npu126读取的行的地址;以及字段2608,用于指示数据ram122中最近被npu126读取的行的地址。这样使得执行于处理器100上的架构程序能够在其对数据ram122和/或权重ram124进行读取和/或写入时确定nnu121的进度。利用这种能力,连同如上所述对输入数据矩阵进行覆写(或者如上所述将结果写入数据ram122)的选择,图24的数据阵列2404可以例如如下所述被处理为5个512×1600的数据块,而非20个512×400的数据块。处理器100从行2开始将第一512×1600数据块写入权重ram124,并开启nnu程序(该程序具有1600的循环计数、以及值为0的初始化权重ram124输出行)。当nnu121执行nnu程序时,处理器100监测权重ram124的输出的位置/地址,从而(1)(使用mfnn指令1500)读取权重ram124中具有由nnu121(从行0开始)写入的有效卷积结果的行、(2)一旦已经读取了有效卷积结果就将第二个512×1600数据矩阵2406(从行2开始)覆写于这些有效卷积结果,使得当nnu121对于第一512×1600数据块完成nnu程序时,处理器100可以根据需要立即更新nnu程序并再次开启nnu程序以处理第二个512×1600数据块。该处理针对剩余的三个512×1600数据块再重复三次,以实现nnu121的高利用率。有利地,在一个实施例中,如以下针对图29a、29b与30更详细所述,afu212具有对累加器202的值217高效地执行有效除法的能力。例如,使累加器202的值217除以16的激活函数nnu指令可用于上述的高斯模糊矩阵。尽管图24的示例中所使用的卷积核2402是应用于整个数据阵列2404的小型静态卷积核,但在其它实施例中,该卷积核可以是诸如常见于卷积神经网络的具有与数据阵列2404的不同数据值相关联的唯一权重的大型矩阵。当nnu121以这种方式使用时,架构程序可以将数据矩阵与卷积核的位置互换,即将数据矩阵放置于数据ram122内并且将卷积核放置于权重ram124内,并且可通过对nnu程序的特定执行所处理的行数可以相对较少。现参考图27,示出一框图,该框图示出将图1中的权重ram124填充输入数据的示例,其中由图1的nnu121对所述输入数据执行池化运算。人工神经网络的池化层所执行的池化运算通过取得输入矩阵的子区域或子矩阵并计算这些子矩阵的最大值或平均值来缩减输入数据矩阵(例如,图像或卷积后图像)的维度,并且这些最大值或平均值变为结果矩阵或池化矩阵。在图27和图28的示例中,池化运算计算各个子矩阵的最大值。池化运算对于例如执行对象分类或检测的人工神经网络特别有用。一般而言,池化运算有效地以所检查的子矩阵的元素数的因子来缩减输入矩阵的大小,并且特别地以子矩阵的相应维度的元素数来使输入矩阵在各个维度方向上缩减。在图27的示例中,输入数据是储存于权重ram124的行0至1599中的宽字(例如16位)的512×1600矩阵。在图27中,字以其所在的行列位置标示,例如,位于行0列0的字标示为d0,0;位于行0列1的字标示为d0,1;位于行0列2的字标示为d0,2;依此类推,位于行0列511的字标示为d0,511。同样,位于行1列0的字标示为d1,0;位于行1列1的字标示为d1,1;位于行1列2字标示为d1,2;依此类推,位于行1列511的字标示为d1,511;依此类推,位于行1599列0的字标示为d1599,0;位于行1599列1的字标示为d1599,1;位于行1599列2的字标示为d1599,2;依此类推,位于行1599列511的字标示为d1599,511。现参考图28,示出nnu程序的程序列表,其中该nnu程序执行图27的输入数据矩阵的池化运算并将其写回权重ram124。在图28的示例中,池化运算计算输入数据矩阵中各个4×4子矩阵的最大值。该程序使地址1至10处的指令的循环体循环多次。地址0处的初始化npu指令指定每个npu126执行循环体的次数,例如在图28的示例中,循环体的循环计数值为400,并且循环末尾(地址11)处的循环指令使当前循环计数值递减,如果递减后的结果是非零值,则控制返回循环体的顶部(即返回地址1处的指令)。权重ram124内的输入数据矩阵实际上被nnu程序视为由四个相邻行构成的400个互斥组,即行0~3、行4~7、行8~11、依此类推,直到行1596~1599。由四个相邻行构成的每一个组包括128个4×4子矩阵,即由组的四行与四个相邻列行(即列0~3、列4~7、列8~11、依此类推直到列508~511)的交叉所形成的元素的4×4子矩阵。在512个npu126中,这512个npu126中每第四个npu126(即,128个npu126)对相应的4×4子矩阵执行池化运算,而其它四分之三的npu126则不使用。更具体地,npu0、4、8、依此类推直到npu508各自对其相应的4×4子矩阵执行池化运算,其中4×4子矩阵的最左侧列编号对应于npu编号,而下方的行对应于当前权重ram124的行值,如以下更详细所述,该值被地址0处的初始化指令初始化为零并且在每次重复循环体时增加4。循环体的400次迭代与图27的输入数据矩阵中的4x4子矩阵组数(即输入数据矩阵的1600行除以4)相对应。初始化npu指令也将累加器202清零。优选地,地址11处的循环指令也将累加器202清零。可选地,地址1的maxwacc指令指定将累加器202清零。对于程序的循环体的每次迭代,所使用的128个npu126并行地对输入数据矩阵的当前四行组中的128个相应的4×4子矩阵执行128个池化运算。更具体地,池化运算确定4×4子矩阵的16个元素中的最大值元素。在图28的实施例中,对于所使用的128个npu126中的每个npuy,4×4子矩阵的左下侧元素为图27的元素dx,y,其中x是循环体开始时当前权重ram124的行编号,由图28的程序的地址1处的maxwacc指令读取(此行编号也由地址0处的初始化npu指令初始化,并在每次执行地址3、5和7处的maxwacc指令时递增)。因此,对于程序的每次循环,所使用的128个npu126将当前行组的相应128个4×4子矩阵的相应最大值元素写回权重ram124的指定行。以下针对该循环体进行说明。地址1处是maxwacc指令,用于隐式地使用当前权重ram124的行,该行优选保持在定序器128内(并由位于地址0处的指令初始化为零以用于第一次通过循环体)。地址1处的指令使每个npu126从权重ram124的当前行读取其相应字,将该字与累加器202的值217进行比较,并将这两个值的最大者储存于累加器202中。因此,例如,npu8确定累加器202的值217和数据字dx,8(其中“x”是当前权重ram124的行)中的最大值,并将该最大值写回累加器202。地址2处是maxwacc指令,其用于指定将每个npu126的复用寄存器705内的值轮转至相邻npu126,所述值在这种情况下为响应于地址1处的指令而仅从权重ram124读取的一行输入数据矩阵值。在图27至图28的实施例中,如以上针对图24至26所述,npu126被配置为将复用器705的值向左轮转,即从npuj轮转至npuj-1。此外,指令指定计数值3。因此,地址2处的指令使每个npu126将轮转后的字接收至复用寄存器705并确定轮转后的字和累加器202的值217中的最大值,然后将该运算再重复两次。也就是说,每个npu126三次将轮转后的字接收至复用寄存器705中并确定轮转后的字和累加器202的值217中的最大值。因此,例如,假定循环体开始时的当前权重ram124的行为36,以npu8为例,在执行地址1与2处的指令后,npu8将在其累加器202中储存循环体开始时的累加器202以及四个权重ram124字d36,8、d36,9、d36,10和d36,11中的最大值。地址3与4处的maxwacc指令所执行的运算与地址1和2处的指令所执行的运算类似,然而利用权重ram124行递增指示符,地址3与4处的指令maxwacc对权重ram124的下一行执行运算。也就是说,假定循环体开始时的当前权重ram124的行是36,以npu8为例,在完成地址1至4处的指令之后,npu8将在其累加器202中储存循环体开始时的累加器202以及八个权重ram124的字d36,8、d36,9、d36,10、d36,11、d37,8、d37,9、d37,10与d37,11中的最大值。地址5至8处的maxwacc指令所执行的运算与地址3至4处的指令所执行的运算类似,然而地址5至8处的指令对权重ram124的接下来的两行执行运算。也就是说,假定循环体开始时的当前权重ram124列是36,以npu8为例,在完成地址1到8的指令后,npu8将在其累加器202中储存循环开始时的累加器202以及十六个权重ram124字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中的最大值。也就是说,假定循环体开始时的当前权重ram124的行是36,以npu8为例,在完成地址1到8处的指令后,npu8将确定以下4×4子矩阵的最大值:更具体地,在完成地址1至8处的指令后,所用的128个npu126中的各npu126将确定以下4×4子矩阵的最大值:其中r是循环体开始时的权重ram124的行地址值,n是npu126的编号。地址9处的指令使累加器202的值217通过afu212。这种通过函数使得大小为从权重ram124读取的字的大小(以位为单位,在该示例中即16位)的字通过。优选地,如以下更详细所述,用户可指定输出格式,例如输出位中有多少位是小数位。地址10处的指令将累加器202的值217写入权重ram124中由输出行寄存器的当前值所指定的行,其中该当前值被地址0处的指令初始化,并借助于指令内的递增指示符在每次通过循环体时递增。更具体地,地址10处的指令将累加器202的宽字(例如16位)写入权重ram124。优选地,如以下针对图29a和图29b更详细所述,指令将16个位按照输出二进制小数点2916所指定的那样进行写入。可以发现,通过对循环体进行迭代而写入权重ram124的行包含具有无效数据的空洞。也就是说,结果133的宽字1至3、5至7、9至11、依此类推,直到宽字509至511都是无效或未使用的。在一个实施例中,afu212包括复用器,其中该复用器使得能够将结果压紧至行缓存器(诸如图11的行缓存器1104等)的相邻字中,以写回输出权重ram124行。优选地,激活函数指令指定每个空洞中的字数,并且空洞内的字数用于控制复用器的压紧结果。在一个实施例中,空洞数可指定为2~6的值,以对池化的3×3、4×4、5×5、6×6或7×7子矩阵的输出进行压紧。可选地,执行于处理器100上的架构程序从权重ram124读取所产生的稀疏(即具有空洞)的结果行,并使用其它执行单元112(诸如使用例如x86sse指令等的架构压紧指令的媒体单元等)执行压紧功能。有利地,以类似于前述的并行方式并利用nnu121的混合本质,执行于处理器100上的架构程序可以读取状态寄存器127来监测权重ram124的最近写入行(例如图26b的字段2602)以读取所产生的稀疏行,将其压紧并写回权重ram124的同一行,使得准备好用作神经网络的下一层(诸如卷积层或传统神经网络层(即乘法累加层)等)的输入数据矩阵。此外,尽管本文所述的实施例对4×4子矩阵执行池化运算,但可以对图28的nnu程序进行修改,以对诸如3×3、5×5、6×6或7×7子矩阵等的其它大小的子矩阵执行池化运算。还可以发现,写入权重ram124的结果行数是输入数据矩阵的行数的四分之一。最后,在该示例中,并未使用数据ram122。然而,备选地,可以使用数据ram122,而不使用权重ram124,来执行池化运算。在图27和图28的示例中,池化运算计算子区域的最大值。然而,图28的程序可被修改为例如通过用sumwacc指令(将权重字与累加器202的值217相加)取代maxwacc指令并将地址9处的激活函数指令更改为将累加结果(优选经由如下所述的倒数相乘)除以各个子区域的元素数(在该示例中为16),来计算子区域的平均值。从根据图27和图28的实施例的nnu121的运算可以发现,每一次执行图28的程序用约6000个时钟周期来对图27的整个512×1600数据矩阵执行池化运算,该时钟周期数可明显少于传统方式执行类似任务所需的时钟周期数。可选地,架构程序将nnu程序配置为将池化运算的结果写回数据ram122的行,而非将结果写回权重ram124,并且当nnu121(例如使用图26b的数据ram122的最近写入的行2606的地址)将结果写入数据ram122时,架构程序从该数据ram122读取结果。这种替代方案在权重ram124为单端口并且数据ram122为双端口的实施例中可以是有利的。具有用户提供的二进制小数点的定点算术,全精度定点累加,用户指定的倒数值,累加器值的随机舍入,以及可选择激活/输出函数一般而言,由于在数字计算装置内执行算术运算的硬件单元对整数和浮点数分别执行算术运算、因而通常可分为“整数”单元与“浮点”单元。浮点数具有幅值(magnitude)(或尾数)和指数,通常还有符号。指数是基数(radix)点(通常为二进制小数点)相对于幅值的位置的指示。相较之下,整数不具有指数,而只具有幅值,通常还有符号。浮点单元的优点在于使程序设计者能够使用从非常大范围内的不同值中取得的数字来工作,而硬件则是在需要时负责调整数字的指数值,而不需程序设计者来进行调整。例如,假定两个浮点数0.111×1029与0.81×1031相乘。(虽然浮点单元通常工作于以2为基础的浮点数,但这里使用的是十进制小数或以10为基础的示例。)浮点单元自动负责将尾数相乘,将指数相加,随后将结果标准化回到值.8911×1059。再例如,假定同样的两个浮点数相加。浮点单元在相加前自动负责将尾数的二进制小数点对齐以产生值为.81111×1031的总和。然而,与浮点单元相关联的复杂性以及随之产生的大小、耗能、每指令的时钟周期的增加和/或周期时间的延长是众所周知的。实际上,出于这个原因,许多装置(例如,嵌入式处理器、微控制器以及相对低成本和/或低功率的微处理器)不包括浮点单元。从上述示例可以发现,一些复杂的浮点单元包括:用于执行与浮点加法和乘法/除法相关联的指数计算的逻辑(即用以对操作数的指数执行加法/减法运算以产生浮点乘法/除法的结果指数值的加法器、用于确定操作数的指数相减以确定浮点加法的二进制小数点对齐移位量的减法器)、用于实现浮点加法中尾数的二进制小数点对齐的移位器、以及用于对浮点结果进行标准化处理的移位器。此外,流程进入方框单元通常需要执行浮点结果的舍入运算的逻辑、在整数格式与浮点格式间以及不同浮点精确度格式(例如扩增精度、双精度、单精度、半精度)间转换的逻辑、前导零与前导一的检测器、以及处理特殊浮点数(例如反常值、非数值和无穷值等)的逻辑。此外,存在如下的缺点:因为设计上需要被验证的数值空间的增加,浮点单元的正确度验证显著变得极其复杂,从而可能延长产品开发周期与上市时间。此外,如上所述,浮点算术意味着对计算所涉及的各浮点数的单独尾数字段和指数字段的储存和使用,这可能增加所需的存储空间的量和/或在给定等量的存储空间来储存整数的情况下降低精确度。这些缺点中的许多都可以通过使用对整数执行算术运算的整数单元来避免。程序设计者经常编写处理小数即非整数的程序。这种程序可以在如下的处理器上执行,其中这些处理器不具有浮点单元,或者虽然具有浮点单元,但处理器的整数单元所执行的整数指令可以更快。为了利用与整数单元相关联的潜在性能优势,程序设计者对定点(fixed-point)数采用周知的定点算术。这样的程序包括执行于整数单元以处理整数或整数数据的指令。软件知道数据是小数,并且包含用于对整数数据执行运算以应对该数据实际上是小数这一事实的指令(例如,对齐移位)。基本上,定点软件手动执行浮点单元所执行的一些或全部功能。如本文中所使用的,“定点”数(或值或操作数或输入或输出)是一个数字,该数字的储存位被理解为包含表示该定点数的小数部分的位(这里被称为“小数位”)。定点数的储存位包含于存储器或寄存器内,例如存储器或寄存器内的8位或16位字。此外,定点数的储存位全部用来表示一个幅值,并且在某些情况下,其中一个位用来表示符号,但是定点数没有用来表示该数的指数的储存位。此外,在存储时指定该定点数的小数位的数量或二进制小数点位置,这与定点数的储存位不同,并且针对定点数所属的定点数集合(例如输入操作数的集合、累加值的集合或处理单元的阵列的输出结果的集合等)以共享或全局的方式指示小数位的数量或二进制小数点位置。有利地,在本文描述的实施例中,alu是整数单元,但是激活函数单元包含浮点算术硬件辅助或加速。这样使得alu部分变得更小且更快,从而利于在给定的晶粒空间内使用更多的alu。这意味着每单位晶粒空间有更多的神经元,从而在神经网络单元中特别有利。此外,有利地,与每个浮点数都需要指数储存位的浮点数相反,描述了如下的实施例,其中以针对全部数字集合的作为小数位的储存位的数量的指示来表示定点数,然而,该指示位于单个共享存储空间中,其全局地指示针对整个集合(例如一系列运算的输入的集合、一系列运算的累加值的集合、输出的集合)的所有数字中的小数位的数量。优选地,nnu的用户能够为数字集合指定小数储存位的数量。因此,应当理解,虽然在许多上下文中(例如一般数学中),术语“整数”是指带符号整数,即不具有小数部分的数字,但是在本上下文中,术语“整数”可以指具有小数部分的数字。此外,在本文的上下文中,术语“整数”旨在与浮点数进行区分,对于浮点数而言,其各自存储空间的位数的一部分用来表示浮点数的指数。类似地,整数算术运算(诸如整数单元执行的整数乘法或加法或比较等)假设操作数不具有指数,因此,整数单元的整数元件(诸如整数乘法器、整数加法器、整数比较器等)不包含用来处理指数的逻辑,例如不需要为了加法或比较运算而移位尾数来使二进制小数点对齐,不需要为了乘法运算而将指数相加。此外,本文所述的实施例包括大型硬件整数累加器以在不损失精确度的情况下对一系列的大整数运算进行累加(例如,1000量级的乘法累加)。这样使得nnu能够避免处理浮点数,同时又能使累加值维持全精度,而不使其饱和或因为溢位而产生不准确的结果。如以下更详细所述,一旦这系列整数运算将结果累加至全精度累加器,定点硬件辅助就执行必要的缩放和饱和运算,以利用用户指定的累加值小数位的数量和输出值的小数位的期望数量的指示来将全精度累加值转换为输出值。如以下更详细所述,在将累加器值从全精度形式进行压缩以便用作激活函数的输入或者用于通过时,优选地,激活函数单元可以选择性地对该累加器值执行随机舍入。最后,按照神经网络的给定层的不同需求,npu可以选择性地接受指示以应用不同的激活函数以及/或者输出许多不同形式的累加器值。现参考图29a,示出一框图,该框图示出图1的控制寄存器127的实施例。控制寄存器127可包括多个控制寄存器127。如图所示,控制寄存器127包括以下字段:配置2902、带符号数据2912、带符号权重2914、数据二进制小数点2922、权重二进制小数点2924、alu函数2926、舍入控制2932、激活函数2934、倒数2942、移位量2944、输出ram2952、输出二进制小数点2954、以及输出命令2956。控制寄存器127值可以利用mtnn指令1400和nnu程序的指令(诸如初始化指令等)两者来写入。配置2902的值指定nnu121是窄配置、宽配置还是漏斗配置,如上所述。配置2902意味着从数据ram122和权重ram124接收到的输入字的大小。在窄配置与漏斗配置中,输入字的大小是窄的(例如8位或9位),而在宽配置中,输入字的大小是宽的(例如12位或16位)。此外,配置2902意味着与输入字大小相同的输出结果133的大小。带符号数据值2912如果为真则表示从数据ram122接收到的数据字是带符号值,如果为假则表示这些数据字是不带符号值。带符号权重值2914如果为真则表从权重ram124接收到的权重字是带符号值,如果为假则表示这些权重字是不带符号值。数据二进制小数点2922的值指示从数据ram122接收到的数据字的二进制小数点的位置。优选地,数据二进制小数点2922的值指示从二进制小数点位置的右侧起的位位置的数量。换言之,数据二进制小数点2922指示数据字的最低有效位中的多少位是小数位,即位于二进制小数点右侧。类似地,权重二进制小数点2924的值指示从权重ram124接收到的权重字的二进制小数点的位置。优选地,在alu函数2926是乘法累加或输出累加器的情况下,npu126将保持在累加器202中的值的二进制小数点右侧的位数确定为数据二进制小数点2922和权重二进制小数点2924的总和。因此,例如,如果数据二进制小数点2922的值为5而权重二进制小数点2924的值为3,则累加器202内的值在二进制小数点右侧具有8个位。在alu函数2926是和/最大累加器与数据/权重字、或者通过数据/权重字的情况下,npu126将保持在累加器202的值的二进制小数点右侧的位数分别确定为数据二进制小数点2922/权重二进制小数点2924。在备选实施例中,如以下针对图29b所述,指定单个累加器二进制小数点2923,而非指定各自的数据二进制小数点2922和权重二进制小数点2924。alu函数2926指定由npu126的alu204执行的函数。如上所述,alu函数2926可以包括但不限于:将数据字209与权重字203相乘并将乘积与累加器202累加;将累加器202与权重字203相加;将累加器202与数据字209相加;累加器202与数据字209中的最大值;累加器202与权重字203中的最大值;输出累加器202;通过数据字209;通过权重字203;输出零值。在一个实施例中,alu函数2926由nnu初始化指令指定,并且由alu204响应于执行指令(未示出)而使用。在一个实施例中,alu函数2926由个别的nnu指令(诸如上述的乘法累加和maxwacc指令等)指定。舍入控制2932指定(图30中)舍入器3004所使用的舍入的形式。在一个实施例中,可指定的舍入模式包括但不限于:不舍入、舍入至最近值、以及随机舍入。优选地,处理器100包括用于生成随机位3005的(图30的)随机位源3003,其中这些随机位3005被取样并且用来执行随机舍入以降低产生舍入偏置的可能性。在一个实施例中,在舍入位3005为1并且粘滞(sticky)位为零的情况下,如果取样的随机位3005为真,则npu126向上舍入,如果随机位3005为假,则npu126不向上舍入。在一个实施例中,随机位源3003基于对处理器100的随机电子特性(诸如半导体二极管或电阻的热噪声等)的取样来产生随机位3005,但是还设想了其它实施例。激活函数2934指定适用于累加器202的值217的函数以产生npu126的输出133。如上所述并且以下更详细所述,激活函数2934包括但不限于:s型函数;双曲正切函数;软加函数;校正函数;除以二的指定幂次方;乘以用户指定的倒数值以实现等效除法;通过整个累加器;以及如以下更详细所述的作为标准大小通过累加器。在一个实施例中,激活函数由nnu激活函数指令指定。可选地,激活函数由初始化指令指定,并响应于输出指令(例如图4中地址4处的写入afu输出指令)而应用,在该实施例中,位于图4的地址3的激活函数指令归入输出指令。倒数2942值指定与累加器202的值217相乘以实现累加器202的值217的除法的值。也就是说,用户将倒数2942值指定为实际上期望的除数的倒数。这例如与如本文所述的卷积或池化运算相结合是有用的。优选地,如以下针对图29c更详细所述,用户将倒数2942值指定为两个部分。在一个实施例中,控制寄存器127包括一字段(未示出),其中该字段使得用户能够在多个内建除数值中指定一个进行除法,这些内建除数值的大小相当于常用的卷积核的大小,例如9、25、36或49。在这样的实施例中,afu212可以储存这些内建除数的倒数,以供与累加器202值217相乘。移位量2944指定afu212的移位器将累加器202的值217右移以实现除以二的幂次方的位数。这与大小为二的幂次方的卷积核的结合也可以是有用的。输出ram2952的值指定数据ram122和权重ram124中的哪一个要接收输出结果133。输出二进制小数点2954的值指示输出结果133的二进制小数点的位置。优选地,输出二进制小数点2954的值指示从输出结果133的二进制小数点位置的右侧起的位位置数量。换言之,输出二进制小数点2954指示输出结果133的最低有效位中的多少位是小数位,即位于二进制小数点右侧。afu212基于输出二进制小数点2954的值(在大部分的情况下,还基于数据二进制小数点2922的值、权重二进制小数点2924的值、激活函数2934的值和/或配置2902的值)来执行舍入、压缩、饱和与大小转换。输出命令2956控制输出结果133的各个方面。在一个实施例中,afu212利用标准大小的概念,其中标准大小是配置2902所指定的宽度大小(以位为单位)的两倍。因此,例如,如果配置2902意指从数据ram122和权重ram124接收到的输入字的大小是8位,则标准大小是16位;在另一个示例中,如果配置2902意指从数据ram122与权重ram124接收到的输入字的大小是16位,则标准大小是32位。如本文所述,累加器202的大小较大(例如,窄累加器202b是28位,而宽累加器202a是41位)以维持中间计算(例如分别为1024个和512个nnu乘法累加指令)的全精度。如此,累加器202的值217大于(以位为单位)标准大小,并且afu212(例如以下针对图30所述的ccs3008)针对激活函数2934(除了通过全累加器)的大部分值将累加器202的值217向下压缩至具有标准大小的值。输出命令2956的第一预定值指示afu212执行指定的激活函数2934以产生大小与原始输入字相同(即,标准大小的一半)的内部结果并将该内部结果作为输出结果133输出。输出命令2956的第二预定值指示afu212执行指定的激活函数2934以产生大小为原始输入字的两倍(即,标准大小)的内部结果并将该内部结果的下半部作为输出结果133输出;而输出命令2956的第三预定值指示afu212将标准大小的内部结果的上半部作为输出结果133输出。如以上针对图8至图10所述,输出命令2956的第四预定值指示afu212将累加器202的原始最低有效字(其宽度由配置2902指定)作为输出结果133输出;第五预定值指示afu212将累加器202的原始中间有效字作为输出结果133输出;以及第六预定值指示afu212将累加器202的原始最高有效字作为输出结果133输出。如上所述,输出全累加器202大小或标准大小的内部结果例如对于使处理器100的其它执行单元112能够执行诸如软极大激活函数等的激活函数而言可以是有利的。尽管图29a(以及图29b和图29c)的字段被描述为位于控制寄存器127中,但是在其它实施例中,一个或多个字段可以位于nnu121的其它部分。优选地,许多字段可以包含在nnu指令本身中,并由定序器128进行解码以产生(图34的)用于控制alu204和/或afu212的微操作3416。此外,这些字段可以包含在储存于媒体寄存器118中的(图34的)微操作3414内,微操作3414控制alu204和/或afu212。在这样的实施例中,可以使初始化nnu指令的使用减至最少,并且在其它实施例中,去除初始化nnu指令。如上所述,nnu指令能够指定对存储器操作数(例如来自数据ram122和/或权重ram124的字)或轮转后的操作数(例如来自复用寄存器208/705)执行alu运算。在一个实施例中,nnu指令还可以将操作数指定为激活函数的寄存器输出(例如图30的寄存器输出3038)。此外,如上所述,nnu指令能够指定使数据ram122或权重ram124的当前行地址递增。在一个实施例中,nnu指令可以指定被加入当前行的即时的带符号整数差值(deltavalue)以实现以除了一以外的值递增或递减。现参考图29b,示出一框图,该框图示出根据备选实施例的图1的控制寄存器127的实施例。图29b的控制寄存器127与图29a的控制寄存器127类似;然而,图29b的控制寄存器127包括累加器二进制小数点2923。累加器二进制小数点2923表示累加器202的二进制小数点位置。优选地,累加器二进制小数点2923的值表示从二进制小数点位置的右侧起的位位置数量。换言之,累加器二进制小数点2923表示累加器202的最低有效位中有多少位是小数位,即位于二进制小数点右侧。在该实施例中,累加器二进制小数点2923被明确指定,而非如以上针对图29a的实施例所述隐式地确定。现参考图29c,示出一框图,该框图示出根据一个实施例的以两个部分储存的图29a的倒数2942的实施例。第一部分2962是移位值,其表示用户想要与累加器202的值217相乘的真实倒数值中被抑制的前导零的数量2962。前导零的数量是紧接在二进制小数点右侧的连续零的数量。第二部分2694是前导零被抑制的倒数2964的值,即将所有前导零移除后的真实倒数值。在一个实施例中,被抑制前导零的数量2962被存储为4位,而前导零被抑制的倒数2964的值则被存储为8位不带符号值。为了通过示例进行说明,假设用户期望将累加器202的值217乘以为49的倒数。以13个小数位表示的49的倒数的二进制表示是0.0000010100111(具有五个前导零)。在这种情况下,用户将被抑制前导零的数量2962填入值5,将前导零被抑制的倒数2964填入值10100111。在(图30的)倒数乘法器“除法器a”3014将累加器202的值217与前导零被抑制的倒数2964的值相乘之后,将所产生的乘积按照被抑制前导零的数量2962进行右移。这样的实施例可以有利地通过利用相对较少的位来表示倒数2942的值来实现高精确度。现参考图30,示出一框图,该框图更详细地示出图2的afu212的实施例。afu212包含:图1的控制寄存器127;正型转换器(positiveformconverter,pfc)和输出二进制小数点对齐器(outputbinarypointaligner,obpa)3002,其用于接收累加器202的值217;舍入器3004,其用于接收累加器202的值217以及obpa3002所移出的位数的指示;随机位源3003,如上所述,其用于产生随机位3005;第一复用器3006,其用于接收pfc与obpa3002的输出以及舍入器3004的输出;标准大小压缩器(compressortocanonicalsize,ccs)和饱和器3008,其用于接收第一复用器3006的输出;位选择器和饱和器3012,其用于接收ccs和饱和器3008的输出;校正器3018,其用于接收ccs和饱和器3008的输出;倒数乘法器3014,其用于接收ccs和饱和器3008的输出;向右移位器3016,其用于接收ccs和饱和器3008的输出;双曲正切(tanh)模块3022,其用于接收位选择器和饱和器3012的输出;s型模块3024,其用于接收位选择器和饱和器3012的输出;软加模块3026,其用于接收位选择器和饱和器3012的输出;第二复用器3032,其用于接收双曲正切模块3022、s型模块3024、软加模块3026、校正器3018、倒数乘法器3014、向右移位器3016的输出以及ccs和饱和器3008的通过标准大小的输出3028;符号恢复器3034,其用于接收第二复用器3032的输出;大小转换器和饱和器3036,其用于接收符号恢复器3034的输出;第三复用器3037,其用于接收大小转换器和饱和器3036的输出以及累加器的输出217;以及输出寄存器3038,其用于接收复用器3037的输出并且其输出是图1的结果133。pfc和obpa3002接收累加器202的值217。优选地,如上所述,累加器202的值217是全精度值。也就是说,累加器202具有足够的储存位数来保持累加值,其中该累加值是由整数加法器244所生成的一系列由整数乘法器242产生的乘积的总和,而不舍弃乘法器242的各乘积或加法器的总和中的任何位,使得不会损失精度。优选地,累加器202至少具有足够的位数来保持nnu121可被编程执行的乘积累加的最大数量。例如,参考图4的程序来进行说明,在宽配置下nnu121可被编程执行的乘积累加的最大数量为512,而累加器202的位宽度为41。再例如,参考图20的程序来进行说明,在窄配置下nnu121可被编程执行的乘积累加的最大数量为1024,而累加器202的位宽度为28。一般地,全精度累加器202具有至少q个位,其中q是m与log2p的总和,其中m是乘法器242的整数乘积的位宽度(例如,对于窄乘法器242而言为16位,或者对于宽乘法器242而言为32位),而p是可以累加到累加器202的整数乘积的最大容许数量。优选地,乘积累加的最大数量是经由nnu121的程序设计者的编程规格所指定的。在一个实施例中,在假定从数据/权重ram122/124加载数据/权重字206/207的行的一个先前的乘法累加指令(例如图4的地址1处的指令)的情况下,定序器128将乘法累加nnu指令(例如图4的地址2处的指令)的计数的最大值例如强制设置为511。有利地,通过包括具有足够大的位宽度以对所容许累加的最大数量的全精度值执行累加的累加器202,可简化npu126的alu204部分的设计。特别是,这样可以缓解对使用逻辑来使整数加法器244产生的总和饱和的需求,其中该逻辑将使小型累加器产生溢位,并且将需要持续追踪累加器的二进制小数点位置以确定是否发生了溢位从而知晓是否需要饱和。为了通过示例对具有非全精度累加器但具有饱和逻辑以处理非全精度累加器的溢位的设计的问题进行说明,假定存在以下情况。(1)数据字的值的范围介于0与1之间,并且所有储存位都用来储存小数位。权重字值的范围介于-8与+8之间,并且除了三个位以外的所有储存位都用来储存小数位。用于双曲正切激活函数的输入的累加值的范围介于-8与8之间,并且除了三个位以外的所有储存位都用来储存小数位。(2)累加器的位宽度为非全精度(例如,只有乘积的位宽度)。(3)假定累加器为全精度,则最终累加值将介于-8与8之间(例如,+4.2);然而,在序列中“点a”前的乘积更常见地倾向为正,而在点a后的乘积更常更常见地倾向为负。在这种情况下,可能获得不准确的结果(即,+4.2以外的结果)。这是因为在点a前的某些点处,当累加器值本应当是更大的值(例如,+8.2)时,累加器可能饱和到最大值+8,导致损失剩余的+0.2。累加器甚至可以使更多的乘积累加维持在饱和值,从而导致损失更多正值。因此,累加器的最终值可能为比累加器具有全精度位宽度的情况下的最终值(即小于+4.2)更小的值。pfc3002在累加器202的值217为负的情况下将其转换为正型,并产生附加位以指示原始值是正还是负,该附加位与所述值一起向下通过afu212的流水线。转换为正型简化了afu212的后续运算。例如,该操作使得只有正值才能被输入至双曲正切模块3022和s型模块3024,因而可以简化这些模块。此外,简化了舍入器3004和饱和器3008。obpa3002向右移位或缩放正型值,以使其与控制寄存器127内指定的输出二进制小数点2954对齐。优选地,obpa3002将移位量计算为一差值,所述差值是从累加器202的值217的小数位数(例如,由累加器二进制小数点2923所指定、或是数据二进制小数点2922和权重二进制小数点2924的总和)减去的输出的小数位数(例如,由输出二进制小数点2954所指定)。因此,例如,如果累加器202的二进制小数点2923为8(如上述实施例一样)并且输出二进制小数点2954为3,则obpa3002将该正型值右移5位以产生被提供至复用器3006和舍入器3004的结果。舍入器3004对累加器202的值217执行舍入。优选地,舍入器3004产生pfc和obpa3002所产生的正型值的舍入后版本,并将该舍入后版本提供至复用器3006。舍入器3004根据上述的舍入控制2932执行舍入,如本文上下文所述,该舍入控制2932可以包括使用随机位3005的随机舍入。复用器3006基于舍入控制2932(如本文所述可包含随机舍入)在其多个输入中选择其一(即来自pfc和obpa3002的正型值或来自舍入器3004的舍入后版本),并且将选择的值提供给ccs和饱和器3008。优选地,如果舍入控制2932指定不进行舍入,则复用器3006选择pfc和obpa3002的输出,否则选择舍入器3004的输出。在所设想的其它实施例中,afu212执行额外的舍入。例如,在一个实施例中,当位选择器3012对ccs和饱和器3008的输出位进行压缩(如后述)时,位选择器3012基于丢失的低阶位进行舍入。又例如,在一个实施例中,对倒数乘法器3014的乘积(如后述)进行舍入。又例如,在一个实施例中,大小转换器3036在转换为适当的输出大小(如后述)时进行舍入,这可能涉及丢失舍入确定时的低阶位。ccs3008将复用器3006的输出值压缩至标准大小。因此,例如,如果npu126为窄配置或漏斗配置2902,则ccs3008将28位的复用器3006的输出值压缩至16位;而如果npu126为宽配置2902,则ccs3008将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在ccs和饱和器3008的输出中选择满足3.4形式标准的位,这涉及压缩处理,也就是会丢失某些位,这是因为标准形式具有较多的位数。然而,在选择/压缩ccs和饱和器3008的输出值之前,如果压缩前值大于3.4形式所能表达的最大值,则饱和器3012使压缩前值饱和至3.4形式所能表达的最大值。例如,如果压缩前值中位于3.4形式的最高有效位左侧的任意位具有值1,则饱和器3012饱和至最大值(例如,饱和至全部为1)。双曲正切模块3022、s型模块3024和软加模块3026对ccs和饱和器3008所输出的3.4形式值执行相应的激活函数(如上所述)以产生结果。优选地,双曲正切模块3022和s型模块3024的结果是0.7形式的7位结果,即零个整数位和七个小数位,也即输入值在二进制小数点右侧具有七个位。优选地,软加模块3026的结果是3.4形式的7位结果,即其形式与该模块3026的输入形式相同。优选地,双曲正切模块3022、s型模块3024和软加模块3026的输出被扩展至标准形式(例如在必要时加上前导零)并对齐以具有输出二进制小数点2954值所指定的二进制小数点。校正器3018产生ccs和饱和器3008的输出值的校正后版本。也就是说,如果ccs和饱和器3008的输出值(如前述其符号以流水线下移)为负,则校正器3018输出零值;否则,校正器3018将其输入值输出。优选地,校正器3018的输出为标准形式并具有输出二进制小数点2954值所指定的二进制小数点。倒数乘法器3014将ccs和饱和器3008的输出与倒数值2942中所指定的用户指定倒数值相乘,以产生其标准大小的乘积,其中该乘积实际上为ccs和饱和器3008的输出与作为倒数2942值的倒数的除数的商。优选地,倒数乘法器3014的输出为标准形式并具有由输出二进制小数点2954的值所指定的二进制小数点。向右移位器3016将ccs与饱和器3008的输出按移位量值2944中所指定的用户指定位数进行移位,以产生其标准大小的商。优选地,向右移位器3016的输出为标准形式并具有由输出二进制小数点2954的值所指定的二进制小数点。复用器3032选择激活函数2934的值所指定的适当输入,并将选择提供至符号恢复器3034,其中该符号恢复器3034在原始累加器202的值217为负值的情况下将复用器3032的正型输出转换为负型,例如转换为二补码形式。大小转换器3036基于以上针对图29a所述的输出命令2956的值,将符号恢复器3034的输出转换至适当的大小。优选地,符号恢复器3034的输出具有由输出二进制小数点2954的值指定的二进制小数点。优选地,对于输出命令2956的第一预定值而言,大小转换器3036舍弃符号恢复器3034输出的上半部分的位。此外,如果符号恢复器3034的输出为正并且超过配置2902指定的字大小所能表达的最大值、或者输出为负并且小于字大小所能表达的最小值,则饱和器3036将其输出分别饱和至该字大小所能表达的最大值/最小值。对于第二预定值和第三预定值,大小转换器3036使符号恢复器3034的输出通过。复用器3037基于输出命令2956选择大小转换器和饱和器3036的输出或累加器202的输出217以提供给输出寄存器3038。更具体地,对于输出命令2956的第一预定值和第二预定值,复用器3037选择大小转换器和饱和器3036的输出的低位字(其大小由配置2902指定)。对于第三预定值,复用器3037选择大小转换器与饱和器3036的输出的高位字。对于第四预定值,复用器3037选择原始的累加器202的值217的低位字;对于第五预定值,复用器3037选择原始的累加器202的值217的中间字;并且对于第六预定值,复用器3037选择原始的累加器202值217的高位字。如上所述,优选地,afu212在原始的累加器202的值217的高位字的高位填入零。现参考图31,示出图30的afu212的操作的示例。如图所示,配置2902被设置为npu126的窄配置。此外,带符号数据2912与带符号权重2914的值为真。此外,数据二进制小数点2922的值表示针对数据ram122的字的二进制小数点被定位为二进制小数点右侧有7位,并且npu126其中之一所接收的第一数据字的示例值被示为0.1001110。此外,权重二进制小数点2924的值表示针对权重ram124的字的二进制小数点被定位为二进制小数点右侧有3位,并且npu126其中之一所接收的第一权重字的示例值被示为00001.010。第一数据字和第一权重字的16位乘积(此乘积与累加器202的初始零值累加)被示为000000.1100001100。由于数据二进制小数点2912是7且权重二进制小数点2914是3,因此隐含的累加器202的二进制小数点被定为为二进制小数点右侧有10个位。在窄配置的情况下,在示例性实施例中,累加器202的宽度为28位。在示例中,示出在执行了所有alu运算(例如图20中的全部1024个乘法累加)之后累加器202的值217为000000000000000001.1101010100。输出二进制小数点2954的值表示输出的二进制小数点被定位为在二进制小数点的右侧有7个位。因此,在通过obpa3002和ccs3008之后,对累加器202的值217进行缩放、舍入并压缩至标准形式的值,即000000001.1101011。在该示例中,输出二进制小数点位置表示7个小数位,并且累加器202的二进制小数点位置表示10个小数位。因此,obpa3002计算出差值3,并通过将累加器202的值217右移3位来对其进行缩放。这在图31中表示为累加器202的值217丧失3个最低有效位(二进制数100)。此外,在该示例中,舍入控制2932的值表示使用随机舍入,并且在该示例中假定取样随机位3005为真。因此,根据以上说明,最低有效位被向上舍入,这是因为累加器202的值217的舍入位(通过累加器202的值217的缩放而被移出的3个位中的最高有效位)为1,而粘滞位(通过累加器202的值217的缩放而被移出的3个位中的2个最低有效位的布尔或运算结果)为0。在本示例中,激活函数2934表示要使用s型函数。因此,位选择器3012选择标准形式值的位以使得s型模块3024的输入具有三个整数位和四个小数位,如上所述,即如图所示的值001.1101。s型模块3024输出以标准形式设置的值,即所示的值000000000.1101110。该示例的输出命令2956指定第一预定值,即输出由配置2902所表示的字大小,在这种情况下为窄字(8位)。因此,大小转换器3036将标准s型输出值转换为具有隐含二进制小数点的8位量,所述二进制小数点被定位为在该二进制小数点右侧有7个位,从而如图所示产生输出值01101110。现参考图32,示出图30的afu212的操作的第二示例。图32的示例示出在激活函数2934表示使累加器202的值217以标准大小通过的情况下的afu212的操作。如图所示,配置2902被设置为npu126的窄配置。在该示例中,累加器202的宽度为28个位,并且累加器202的二进制小数点被定位为二进制小数点右侧有10个位(如上所述,这是因为根据一个实施例数据,二进制小数点2912和权重二进制小数点2914的总和为10,或者因为根据另一实施例,累加器二进制小数点2923明确被指定为具有值10)。在该示例中,图32示出在执行所有的alu运算之后累加器202的值217,即000001100000011011.1101111010。在该示例中,输出二进制小数点2954的值表示输出的二进制小数点被定位为二进制小数点的右侧有4个位。因此,在通过obpa3002和ccs3008之后,如图所示,累加器202的值217被饱和并压缩至标准形式值111111111111.1111,该值由复用器3032接收作为标准大小的通过值3028。在该示例中,示出两个输出命令2956。第一输出命令2956指定第二预定值,即输出标准形式大小的低位字。由于配置2902所指示的大小为窄字(8位)(意味着标准大小是16位),因此大小转换器3036选择标准大小通过值3028的低8位以产生如图所示的8位值11111111。第二输出命令2956指定第三预定值,即输出标准形式大小的高位字。因此,大小转换器3036选择标准大小通过值3028的高8位以产生如图所示的8位值11111111。现参考图33,示出图30的afu212的操作的第三示例。图33的示例示出在激活函数2934表示要使整个原始的累加器202的值217通过的情况下的afu212的操作。如图所示,配置2902被设置为npu126的宽配置(例如,16位输入字)。在该示例中,累加器202为41位宽,并且累加器202的二进制小数点被定位为在二进制小数点的右侧有8个位(如上所述,这是因为根据一个实施例,数据二进制小数点2912和权重二进制小数点2914的总和为8,或者因为根据另一实施例,累加器二进制小数点2923明确被指定为具有值8)。在该示例中,图33示出在执行了所有alu运算之后累加器202的值217即001000000000000000001100000011011.11011110。在该示例中,示出三个输出命令2956。第一输出命令2956指定第四预定值,即输出原始累加器202值的低位字;第二个输出命令2956指定第五预定值,即输出原始累加器202值的中间字;以及第三个输出命令2956指定第六预定值,即输出原始累加器202值的高位字。由于配置2902所指示的大小为宽字(16位),因此图33示出,响应于第一输出命令2956,复用器3037选择16位值0001101111011110;响应于第二输出命令2956,复用器3037选择16位值0000000000011000;而响应于第三输出命令2956,复用器3037选择16位值0000000001000000。如上所述,有利地,nnu121对整数数据而非浮点数据执行运算。这有利于简化各npu126或至少alu204部分。例如,alu204无需包括浮点实现中为了将乘法器242的乘数的指数相加所需的加法器。类似地,alu204无需包括浮点实现中为了将加法器234的加数的二进制小数点对齐所需的移位器。本领域技术人员应当理解,浮点单元一般非常复杂;因此,这些仅仅是针对alu204的简化的范例,并且利用使得用户能够指定相关二进制小数点的硬件定点辅助可以通过即时整数实施例来实现其它简化。相较于浮点的实施例,alu204是整数单元这一事实可以有利地产生更小(且更快)的npu126,这进一步有利于将大型的npu126阵列整合到nnu121内。afu212的部分可以基于(优选为用户指定的)累加值所需的小数位数量以及输出值所需的小数位数量,来处理累加器202的值217的缩放和饱和。有利地,如针对图11的实施例所述,任何额外复杂度以及伴随而来的大小的增加、afu212的定点硬件辅助内的功率和/或时间损耗,都可以通过在alu204部分间共享afu212的方式来进行分摊,例如这是因为采用共享的实施例可以减少afu1112的数量。有利地,本文所述的实施例享有许多与硬件整数算术单元的降低的复杂度相关联的益处(相较于使用浮点算术单元),同时仍提供针对小数(即具有二进制小数点的数)的算术运算。浮点算术的优点在于:针对单个值可能落在一个非常宽的值范围(该值范围实际上只受限于指数范围的大小,而该大小可能非常大)内的任意位置的数据,提供算术运算。也就是说,每个浮点数具有其潜在唯一的指数值。然而,本文所述的实施例认识到并利用如下的事实,即:存在某些应用,其中在这些应用中,输入数据高度平行,并且其值处于相对较窄的范围内,使得所有平行值的“指数”可以相同。因此,这些实施例使得用户能够一次针对所有的输入值和/或累加值指定二进制小数点位置。类似地,通过认识到并利用平行输出的类似范围特性,这些实施例使得用户能够一次针对所有的输出值指定二进制小数点位置。人工神经网络是这种应用的一个示例,但是本发明的实施例也可用于执行其它应用的计算。通过针对输入一次指定二进制小数点位置而非针对各单独的输入数进行该指定,相较于浮点实现,实施例可以更有效率地使用存储空间(例如,需要较少的存储器),以及/或者在使用类似数量的存储器的情况下提升精度,这是因为在浮点实现中用于指数的位可用来指定幅值的更大精度。此外有利地,这些实施例认识到在对大的一系列整数运算执行累加期间可能经历的潜在的精度丧失(例如,溢位或丧失较不重要的小数位),并且提供一个解决方法,主要是采用一个足够大的累加器来避免精度丧失的形式。nnu微操作的直接执行现参考图34,示出一框图,该框图示出图1的处理器100以及nnu121的部分细节。nnu121包括npu126的流水线阶段3401。以阶段寄存器分隔开的流水线阶段3401包括实现如本文所述的npu126的运算的组合逻辑,诸如布尔逻辑门、复用器、加法器、乘法器、比较器等。流水线阶段3401从复用器3402接收微操作3418。微操作3418向下流动至流水线阶段3401并控制其组合逻辑。微操作3418是位的集合。优选地,微操作3418包括数据ram122的存储器地址123的位、权重ram124的存储器地址125的位、程序存储器129的存储器地址131的位、复用寄存器208/705的控制信号213/713的位、复用器802的控制信号803的位、以及(例如图29a至图29c的)控制寄存器217的许多字段等。在一个实施例中,微操作3418包括约120个位。复用器3402从三个不同的源接收微操作,并选择其中一个作为提供给流水线阶段3401的微操作3418。复用器3402的一个微操作源是图1的定序器128。定序器128将从程序存储器129接收到的nnu指令解码,并且作为响应而产生提供至复用器3402的第一输入的微操作3416。复用器3402的第二个微操作源是从图1的保留站108接收微指令105以及从gpr116和媒体寄存器118接收操作数的解码器3404。优选地,如上所述,微指令105是指令转译器104响应于对mtnn指令1400和mfnn指令1500的转译而产生的。微指令105可包括立即字段,该立即字段指定特定函数(由mtnn指令1400或mfnn指令1500所指定),诸如开始和停止执行程序存储器129内的程序、直接从媒体寄存器118执行微操作、或者如上所述读取/写入nnu的存储器等。解码器3404对微指令105进行解码并作为响应而产生提供至复用器3402的第二输入的微操作3412。优选地,响应于mtnn指令1400/mfnn指令1500的某些函数1432/1532,解码器3404无需产生沿流水线3401向下发送的例如写入控制寄存器127、开始执行程序存储器129内的程序、暂停执行程序存储器129内的程序、等待程序存储器129内的程序完成执行、从状态寄存器127读取以及重设nnu121等的微操作3412。复用器3402的第三个微操作源是媒体寄存器118本身。优选地,如以上针对图14所述,mtnn指令1400可指定一函数以指示nnu121直接执行从媒体寄存器118提供至复用器3402的第三输入的微操作3414。直接执行由架构媒体寄存器118提供的微操作3414可以特别有助于对nnu121进行测试(例如内在自测试(bist))和调试。优选地,解码器3404产生用于控制复用器3402选择的模式指示符3422。当mtnn指令1400指定一函数开始运行来自程序存储器129的程序时,解码器3404产生使复用器3402从定序器128选择微操作3416的模式指示符3422值,直到发生错误为止或直到解码器3404遇到指定函数停止运行来自程序存储器129的程序的mtnn指令1400为止。当mtnn指令1400指定用于指示nnu121直接执行从媒体寄存器118提供的微操作3414的函数时,解码器3404产生使复用器3402从指定媒体寄存器118选择微操作3414的模式指示符3422值。否则,解码器3404产生使复用器3402选择从解码器3404选择微操作3412的模式指示符3422值。可变速率神经网络单元可能存在如下情形:nnu121运行程序,然后进入空闲状态等待处理器100处理一些在其可以执行下一个程序前需要处理的事情。例如,假设在与针对图3至图6a所述的类似的情形,nnu121对乘法累加激活函数程序(也可称为前馈神经网络层程序)连续运行两次或更多次。相较于nnu121运行程序所花费的时间,处理器100明显花费更长的时间来将nnu程序下一次运行所用的512kb大小的权重值写入权重ram124。换言之,nnu121可以在相对短的时间内运行程序,然后进入空闲状态,同时处理器100完成将接下来的权重值写入权重ram124以供下一次程序运行用。这种情形在以下更详细所述的图36a中可视地示出。在这种情形下,可以有利地使nnu121以较慢速率运行并且花更长的时间来执行程序,以使nnu121运行程序所需的能量消耗分散至较长的时间内,这可以倾向于使nnu121乃至于处理器100维持在较低温度。这种情形被称为缓和模式并且在以下更详细所述的图36b中可视地示出。现参考图35,示出一框图,该框图示出具有可变速率nnu121的处理器100。该处理器100在许多方面与图1的处理器100类似,并且具有相同附图标记的元件是相同的。图35的处理器100还包括耦接至处理器100的功能单元的时钟产生逻辑3502,这些功能单元即指令拾取单元101、指令高速缓存器102、指令转译器104、重命名单元106、保留站108、nnu121、其它执行单元112、存储器子系统114、通用寄存器116以及媒体寄存器118。时钟产生逻辑3502包括诸如锁相环(pll)等的时钟产生器,其产生具有主时钟速率或主时钟频率的时钟信号。例如,主时钟速率可以是1ghz、1.5ghz、2ghz等。时钟速率表示每秒的时钟信号的周期数,例如在高低状态之间的震荡数。优选地,时钟信号具有平衡的占空比,即周期的一半为高而另一半为低;可选地,时钟信号具有不平衡的占空比,其中时钟信号处在高状态的时间长于其处在低状态的时间,或者反之亦然。优选地,pll能够被配置为产生具有多个时钟速率的主时钟信号。优选地,处理器100包括电源管理模块,其基于多种因素自动调整主时钟速率,这些因素包括动态检测到的处理器100的操作温度、利用率、以及来自系统软件(例如操作系统、bios)的指示期望性能和/或节能指标的命令。在一个实施例中,电源管理模块包括处理器100的微码。时钟产生逻辑3502还包括时钟分配网络或时钟树。时钟树将主时钟信号分配至处理器100的功能单元,即如图35所示将时钟信号3506-1分配至指令拾取单元101,将时钟信号3506-2分配至指令高速缓存器102,将时钟信号3506-10分配至指令转译器104,将时钟信号3506-9分配至重命名单元106,将时钟信号3506-8分配至保留站108,将时钟信号3506-7分配至nnu121,将时钟信号3506-4分配至其它执行单元112,将时钟信号3506-3分配至存储器子系统114,将时钟信号3506-5分配至通用寄存器116,以及将时钟信号3506-6分配至媒体寄存器118,这些信号共同地称为时钟信号3506。时钟树包括节点或线,用于将主时钟信号3506传输至其相应的功能单元。此外,优选地,时钟产生逻辑3502包括时钟缓存器,时钟缓存器(特别是对于较远的节点)在需要提供较干净的时钟信号时重新产生主时钟信号、和/或提升主时钟信号的电压水平。此外,各个功能单元在需要时还可以包括其自身的子时钟树,子时钟树重新产生和/或提升其所接收到的相应主时钟信号3506。nnu121包括时钟降低逻辑3504,其接收缓和指示符3512、接收主时钟信号3506-7、并且作为响应而产生辅时钟信号。辅时钟信号具有如下的时钟速率,该时钟速率与主时钟速率相同,或者在缓和模式的情况下该时钟速率相对于主时钟速率降低了被编程到缓和指示符3512中的量,从而潜在地提供热量方面的益处。时钟降低逻辑3504在许多方面与时钟产生逻辑3502类似,时钟降低逻辑3504具有时钟分配网络或时钟树,所述时钟分配网络或时钟树将辅时钟信号分配至nnu121的各个方框,如表示为将时钟信号3508-1分配至npu126的阵列,将时钟信号3508-2分配至定序器128、以及将时钟信号3508-3分配至接口逻辑3514,这些信号共同地或单独地称为辅时钟信号3508。优选地,如针对图34所示,npu126包括多个流水线阶段3401,流水线阶段包括用于从时钟降低逻辑3504接收辅时钟信号3508-1的流水线阶段寄存器。nnu121还包括用于接收主时钟信号3506-7和辅时钟信号3508-3的接口逻辑3514。接口逻辑3514耦接于处理器100前端的下部分(例如,保留站108、媒体寄存器118和通用寄存器116)和nnu121的各个方框之间,这些方框为时钟降低逻辑3504、数据ram122、权重ram124、程序存储器129和定序器128。接口逻辑3514包括数据ram缓存器3522、权重ram缓存器3524、图34的解码器3404、以及缓和指示符3512。缓和指示符3512保持指定npu126的阵列将以多慢的速度执行nnu程序指令的值。优选地,缓和指示符3512指定除数值n,时钟降低逻辑3504将主时钟信号3506-7除以该除数值以产生辅时钟信号3508,使得辅时钟信号的速率为1/n。优选地,n的值可被编程为多个不同预定值中的任一个,以使时钟降低逻辑3504产生具有多个不同速率的辅时钟信号3508,其中所述多个不同速率都小于主时钟速率。在一个实施例中,时钟降低逻辑3504包括时钟除法器电路,用以将主时钟信号3506-7除以缓和指示符3512的值。在一个实施例中,时钟降低逻辑3504包括时钟门(例如,与门),该时钟门利用使能信号来对主时钟信号3506-7进行门控,其中主时钟信号3506-7的每n个周期仅使能信号一次为真。例如,可以使用包含用于计数多达n的计数器的电路来产生使能信号。当伴随的逻辑检测到计数器的输出与n匹配时,逻辑在辅时钟信号3508上产生真值脉冲并重设计数器。优选地,缓和指示符3512的值可通过架构指令(诸如图14的mtnn指令1400等)进行编程。优选地,如针对图37更详细所述,仅在指示nnu121开始运行nnu程序之前,运行于处理器100上的架构程序将缓和值编程到缓和指示符3512中。权重ram缓存器3524耦接于权重ram124和媒体寄存器118之间,用于缓存它们之间的数据传输。优选地,权重ram缓存器3524与图17的缓存器1704的一个或多个实施例类似。优选地,权重ram缓存器3524中的从媒体寄存器118接收数据的部分以具有主时钟速率的主时钟信号3506-7作为时钟,而权重ram缓存器3524中的从权重ram124接收数据的部分以具有辅时钟速率的辅时钟信号3508-3作为时钟,其中该辅时钟速率可以根据编程到缓和指示符3512中的值(即根据nnu121是在缓和模式还是一般模式下操作)而相对于主时钟速率降低或不降低。在一个实施例中,如以上针对图17所述,权重ram124为单端口,并且可由媒体寄存器118经由权重ram缓存器3524以及由图11的npu126或行缓存器1104两者以仲裁方式(arbitratedfashion)访问。在备选实施例中,如以上针对图16所述,权重ram124为双端口,并且各端口可由媒体寄存器118经由权重ram缓存器3524以及npu126或行缓存器1104两者以并行方式访问。同样,数据ram缓存器3522耦接于数据ram122和媒体寄存器118之间,用于缓存它们之间的数据传输。优选地,数据ram缓存器3522与图17的缓存器1704的一个或多个实施例类似。优选地,数据ram缓存器3522中的从媒体寄存器118接收数据的部分以具有主时钟速率的主时钟信号3506-7作为时钟,而数据ram缓存器3522中的从数据ram122接收数据的部分以具有辅时钟速率的辅时钟信号3508-3作为时钟,其中该辅时钟速率可以根据编程到缓和指示符3512中的值(即根据nnu121是在缓和模式还是一般模式下操作)而相对于主时钟速率降低或不降低。在一个实施例中,如以上针对图17所述,数据ram122为单端口,并且可由媒体寄存器118经由数据ram缓存器3522以及由图11的npu126或行缓存器1104两者以仲裁方式访问。在备选实施例中,如以上针对图16所述,数据ram122为双端口,并且各端口可由经由数据ram缓存器3522的媒体寄存器118以及npu126或行缓存器1104两者以并行方式访问。优选地,无论数据ram122和/或权重ram124是单端口还是双端口,接口逻辑3514都包括数据ram缓存器3522和权重ram缓存器3524以提供主时钟域和辅时钟域之间的同步。优选地,数据ram122、权重ram124和程序存储器129各自包括静态ram(sram),其中该静态ram包括相应的读取使能信号、写入使能信号和存储器选择信号。如上所述,nnu121是处理器100的执行单元。执行单元是处理器的执行架构指令被转译成的微指令(诸如图1中的架构指令103转移成的微指令105等)或执行架构指令103本身的功能单元。执行单元从处理器的通用寄存器(诸如gpr116和媒体寄存器118等)接收操作数。执行单元响应于执行微指令或架构指令而产生可被写入通用寄存器的结果。架构指令103的示例分别为针对图14和图15所述的mtnn指令1400和mfnn指令1500。微指令实现架构指令。更具体地,执行单元对于架构指令被转译成的一个或多个微指令的整体执行对架构指令所指定的输入执行架构指令所指定的运算,以产生架构指令所定义的结果。现参考图36a,示出一时序图,该时序图示出具有在一般模式中即以主时钟速率操作的nnu121的处理器100的操作示例。在时序图中,时间的进程是从左至右。处理器100正以主时钟速率运行架构程序。更具体地,处理器100的前端(例如,指令拾取单元101、指令高速缓存器102、指令转译器104、重命名单元106和保留站108)以主时钟速率拾取、解码且发布架构指令至nnu121和其它执行单元112。最初,架构程序执行架构指令(例如,mtnn指令1400),处理器前端100将该架构指令发布至nnu121以指示nnu121开始运行其程序存储器129内的nnu程序。此前,架构程序执行架构指令以将用于指定主时钟速率的值写入缓和指示符3512,即使nnu处于一般模式。更具体地,被编程到缓和指示符3512中的值使时钟降低逻辑3504产生具有主时钟信号3506的主时钟速率的辅时钟信号3508。优选地,在这种情况下,时钟降低逻辑3504的时钟缓存器单纯提升主时钟信号3506。另外在此之前,架构程序执行架构指令以写入数据ram122和权重ram124并将nnu程序写入程序存储器129中。响应于开始nnu程序的mtnn指令1400,nnu121开始以主时钟速率执行nnu程序,这是因为缓和指示符3512被编程为具有主速率值。在开始nnu121运行后,架构程序继续以主时钟速率执行架构指令,包括并且主要以mtnn指令1400写入和/或读取数据ram122和权重ram124,以为nnu程序的下一次实例或调用或运行做准备。如图36a中的示例所示,相较于架构程序完成对数据ram122和权重ram124的写入/读取所花费的时间,nnu121在明显更少的时间(例如四分之一的时间)内完成nnu程序的运行。例如,都以主时钟速率,nnu121可能花费大约1000个时钟周期来运行nnu程序,而架构程序花费大约4000个时钟周期来运行。因此,nnu121在剩下的时间(在本示例中为相当长的时间,例如,大约3000个主时钟速率周期)内处于空闲。如图36a中的示例所示,根据神经网络的大小和配置,该模式继续执行另一次,并可能继续多次。因为nnu121可以是处理器100中相对大且晶体管密集的功能单元,因此nnu121可能产生大量热,尤其是在以主时钟速率操作时。现参考图36b,示出一时序图,该时序图示出具有在缓和模式中即以比主时钟速率小的速率操作的nnu121的处理器100的操作示例。图36b的时序图在许多方面与图36a的时序图相同,即处理器100以主时钟速率运行架构程序。并且在该示例中,假定图36b的架构程序和nnu程序与图36a的架构程序和nnu程序相同。然而,在开始nnu程序之前,架构程序执行mtnn指令1400,其中该mtnn指令1400将缓和指示符3512编程有令时钟降低逻辑3504产生具有小于主时钟速率的辅时钟速率的辅时钟信号3508的值。也就是说,架构程序使nnu121处于图36b的缓和模式,而非图36a的一般模式。因此,npu126以辅时钟速率执行nnu程序,其中在缓和模式下,该辅时钟速率小于主时钟速率。在该示例中,假定缓和指示符3512被编程有用于将辅时钟速率指定为四分之一主时钟速率的值。作为结果,如比较图36a和图36b可以看出,nnu121在缓和模式下运行nnu程序所花费的时间是在一般模式下运行nnu程序所花费的时间的四倍长,使得nnu121处于空闲状态的时间量相对较短。因此,图36b中nnu121在大约是图36a中nnu121在一般模式下运行程序所需的时间的四倍的时间段内消耗用于运行nnu程序的能量。因此,图36b中nnu121运行nnu程序所产生的热量的速率大约是图36a中的四分之一,因而可具有本文所述的热量方面的益处。现参考图37,示出一流程图,该流程图示出图35的处理器100的操作。该流程图所示的操作在许多方面与以上针对图35、图36a和图36b所述的操作相同。流程始于方框3702。在方框3702处,处理器100执行mtnn指令1400以将权重写入权重ram124并且将数据写入数据ram122。流程进入方框3704。在方框3704处,处理器100执行mtnn指令1400以将指示符3512编程有指定低于主时钟速率的速率的值,即使nnu121处于缓和模式。流程进入方框3706。在方框3706处,与图36b所呈现的方式相同,处理器100执行mtnn指令1400以指示nnu121开始运行nnu程序。流程进入方框3708。在方框3708处,nnu121开始运行nnu程序。并行地,处理器100执行mtnn指令1400以将新的权重写入权重ram124(并且可能将新的数据写入数据ram122),以及/或者执行mfnn指令1500以从数据ram122读取结果(并且可能从权重ram124读取结果)。流程进入方框3712。在方框3712处,处理器100执行mfnn指令1500(例如读取状态寄存器127),以检测nnu121已结束运行其程序。假设架构程序选择良好的缓和指示符3512的值,则如图36b所示,nnu121运行nnu程序所花费的时间量与处理器100执行架构程序的访问权重ram124和/或数据ram122的部分所花费的时间大致相同。流程进入方框3714。在方框3714处,处理器100执行mtnn指令1400以将缓和指示符3512编程有指定主时钟速率的值,即使nnu121处于一般模式。流程进入方框3716。在方框3716处,与类似图36a所呈现的方式相同,处理器100执行mtnn指令1400以指示nnu121开始运行nnu程序。流程进入方框3718。在方框3718处,nnu121开始以一般模式运行nnu程序。流程结束于方框3718。如上所述,相对于nnu在一般模式下(即以处理器的主时钟速率)运行程序的时间,在缓和模式下运行nnu程序可以使nnu运行程序的时间分散,从而能够提供热量方面的益处。更具体地,当nnu在缓和模式下运行程序时,由于nnu以较慢的速率产生热量,而这些热量被nnu(例如半导体装置、金属层和底层基材)以及周围的封装体和冷却方案(例如,散热片、风扇)耗散,因此装置(例如晶体管、电容、导线)将有可能在较低的温度下工作。一般来说,这还降低了处理器晶粒的其它部分内的装置温度。装置的较低工作温度(特别是它们的接面温度)可以具有减少漏电流的益处。此外,由于单位时间内流过的电流量较少,因此电感噪声和ir压降噪声也可以降低。另外,较低温度对于处理器的mosfet的负偏压温度不稳定性(nbti)和正偏压温度不稳定性(pbsi)也有正面影响,从而提升装置以及处理器部分的可靠度和/或寿命。较低温度还可以减轻处理器的金属层内的焦耳热和电迁移。关于nnu共享资源的架构程序与非架构程序之间的通信机制如上所述,以图24至图28以及图35至图37为例,数据ram122和权重ram124是共享资源。npu126和处理器100的前端这两者共享数据ram122和权重ram124。更具体地,npu126与处理器100的前端(例如媒体寄存器118)对数据ram122和权重ram124进行读取与写入。换言之,运行于处理器100上的架构程序与运行于nnu121上的nnu程序共享数据ram122和权重ram124,并且如上所述,在某些情形下,这需要对架构程序和nnu程序间的流程进行控制。该资源共享在某种程度上也适用于程序存储器129,这是因为架构程序对程序存储器129进行写入,而定序器128对程序存储器129进行读取。本文上下文所述的实施例提供用以控制架构程序和nnu程序之间对共享资源的访问流程的高性能解决方案。在本文所述的实施例中,nnu程序也称为非架构程序,nnu指令也称为非架构指令,而nnu指令集(在上文中也称为npu指令集)也称为非架构指令集。非架构指令集不同于架构指令集。在处理器100包含用于将架构指令转译成微指令的指令转译器104的实施例中,非架构指令集也不同于微指令集。现参考图38,示出一框图,该框图更详细地示出nnu121的定序器128。如上所述,定序器128将存储器地址131提供至程序存储器129,以选择被提供给定序器128的非架构指令。如图38所示,存储器地址131保持在定序器128的程序计数器3802内。定序器128通常以程序存储器129的顺序地址递增,除非定序器128遇到诸如循环或分支指令等的非架构指令,在这种情况下,定序器128将程序计数器3802更新为控制指令的目标地址,即更新为位于控制指令的目标处的非架构指令的地址。因此,保持在程序计数器3802的地址131指定当前被拾取以供npu126执行的非架构程序的非架构指令的程序存储器129中的地址。有利地,如以下针对图39所述,程序计数器3802的值可以由架构程序经由状态寄存器127的nnu程序计数器字段3912而获得。这使得架构程序能够基于非架构程序的进度来决定相对于数据ram122和/或权重ram124在哪里进行数据读取/写入。定序器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的值指示出还要执行非架构程序的循环体的次数。有利地,如以下针对图39所述,可由架构程序经由状态寄存器127的循环计数3914字段来获得循环计数器3804的值。这使得架构程序能够基于非架构程序的进度来决定相对于数据ram122和/或权重ram124在哪里进行数据读取/写入。在一个实施例中,定序器128包括三个额外的循环计数器以适应非架构程序内的嵌套循环,并且另外三个循环计数器的值也可经由状态寄存器127读取。循环指令中具有一位表示这四个循环计数器中哪一个用于即时的循环指令。定序器128还包括迭代计数器3806。迭代计数器3806与非架构指令相结合地使用,其中这些非架构指令诸如为图4、图9、图20和图26a的地址2处的乘法累加指令以及图28中地址2处的maxwacc指令等,这些指令在下文中被称为“执行”指令。在以上示例中,各执行指令分别指定迭代计数511、511、1023、2以及3。当定序器128遇到指定非零迭代计数的执行指令时,定序器128将迭代计数器3806加载该指定值。此外,定序器128产生适当的微操作3418以控制图34的npu126的流水线阶段3401内的逻辑以用于执行,并且使迭代计数器3806递减。如果迭代计数器3806大于零,则定序器128再次产生适当的微操作3418以控制npu126内的逻辑并使迭代计数器3806递减。定序器128持续以这种方式操作,直到迭代计数器3806达到零为止。因此,迭代计数器3806的值表示还要执行非架构执行指令内所指定的运算(例如,累加器和数据/权重字的乘法累加、取最大值、求和)的次数。有利地,如以下针对图39所述,迭代计数器3806的值可以由架构程序经由状态寄存器127的迭代计数3916字段获得。这样使得架构程序能够基于非架构程序的进度来决定相对于数据ram122和/或权重ram124在哪里进行数据读取/写入。现参考图39,示出一框图,该框图示出nnu121的控制和状态寄存器127的某些字段。如以上针对图26b所示,这些字段包括npu126执行非架构程序而最近写入的权重ram行的地址2602、npu126执行非架构程序而最近读取的权重ram行的地址2604、npu126执行非架构程序而最近写入的数据ram行的地址2606、以及npu126执行非架构程序而最近读取的数据ram行的地址2608。此外,这些字段包括nnu程序计数器3912、循环计数3914、以及迭代计数3916。如上所述,架构程序可(例如通过mfnn指令1500)将状态寄存器127读取至媒体寄存器118和/或通用寄存器116,状态寄存器127包括nnu程序计数器3912字段值、循环计数3914字段值和迭代计数3916字段值。程序计数器3912的值反映图38的程序计数器3802的值。循环计数3914的值反映循环计数器3804的值。迭代计数3916的值反映迭代计数器3806的值。在一个实施例中,定序器128在每次修改程序计数器3802、循环计数器3804或迭代计数器3806时,都更新程序计数器3912字段值、循环计数3914字段值与迭代计数3916字段值,使得当架构程序读取这些字段值时,这些字段值是当前值。在另一实施例中,当nnu121执行用于读取状态寄存器127的架构指令时,nnu121单纯获得程序计数器3802的值、循环计数器3804的值以及迭代计数器3806的值并将这些值提供回架构指令(例如提供至媒体寄存器118或通用寄存器116)。从以上可以发现,图39的状态寄存器127的字段值可被表征为非架构程序在由nnu执行期间的进度的信息。以上已经描述了非架构程序进度的某些方面,诸如程序计数器3802的值、循环计数器3804的值、迭代计数器3806的值、最近写入/读取2602/2604的权重ram124地址125,以及最近写入/读取2606/2608的数据ram122地址123。执行于处理器100上的架构程序可以从状态寄存器127读取图39的非架构程序进度值,并例如通过诸如比较指令和分支指令等的架构指令使用这些信息来作出决策。例如,尤其是针对大型数据集和/或不同非架构指令的重叠执行实例,架构程序决定相对于数据ram122和/或权重ram124在哪些行进行数据/权重的写入/读取,以控制相对于数据ram122或权重ram124的数据流入和流出。本文上下文中描述了利用架构程序进行决策的示例。例如,如以上针对图26a所述,架构程序将非架构程序配置为将卷积的结果写回数据ram122中位于卷积核2402上方(例如行8上方)的行,而当nnu121通过使用最近写入的数据ram122行的地址2606来写入结果时,架构程序从数据ram122读取这些结果。再例如,如以上针对图26b所述,架构程序利用来自图38的状态寄存器127的字段的信息来确定非架构程序对图24的数据阵列2404以5个512×1600的数据块执行卷积的进度。架构程序将2560×1600数据阵列2404的第一个512×1600数据块写入权重ram124并开始非架构程序,其中该非架构程序的循环计数为1600且初始化的权重ram124的输出行为0。当nnu121执行非架构程序时,架构程序读取状态寄存器127以确定最近写入的权重ram124的行2602,使得该架构程序可以读取由非架构程序写入的有效卷积结果,并且在架构程序已经读取所述有效卷积结果后利用下一个512×1600数据块覆写上述有效卷积结果,使得在nnu121完成对第一个512×1600数据块的非架构程序时,处理器100可以按需要立即更新非架构程序并再次开始非架构程序以处理下一个512×1600数据块。又例如,假定架构程序使nnu121执行一系列传统神经网络乘法累加激活函数运算,其中,权重储存于权重ram124中并且结果被写回数据ram122。在这种情况下,非架构程序一旦读取了权重ram124的行,就不会再读取。因此,架构程序可被配置为一旦当前权重已被非架构程序读取/使用,就开始用针对非架构程序的下一次执行实例(例如下一个神经网络层)的新权重来覆写权重ram124中的权重。在这种情况下,架构程序读取状态寄存器127以获得最近读取的权重ram2604行的地址2604,从而决定新的权重集可以写入权重ram124中的位置。又例如,假定架构程序知道非架构程序包括具有大迭代计数的执行指令,诸如图20的地址2处的非架构乘法累加指令等。在这种情况下,架构程序可能需要知道迭代计数3916,以知道大致上还需要多少个时钟周期才能完成非架构指令,使得该架构程序可以决定接下来要采取两个或多个动作中的哪个。例如,如果时间很长,则架构程序可以将控制权让与另一个架构程序,诸如操作系统等。同样,假定架构程序知道非架构程序包括具有相当大循环计数的循环体,诸如图28的非架构程序等。在这种情况下,架构程序可能需要知道循环计数3914,以知道大致上还需要多少个时钟周期才能完成非架构程序,使得该架构程序可以决定接下来要采取两个或多个动作中的哪个。又例如,假定架构程序使nnu121执行与针对图27和图28所述的将要池化的数据储存在权重ram124中并且将结果写回权重ram124的池化运算类似的池化运算。然而,与图27和图28的示例不同,假设结果被写回权重ram124的顶部的400行,例如行1600~1999。在这种情况下,一旦非架构程序读取了权重ram124中进行池化的四行,其就不会再次读取。因此,架构程序可被配置为一旦当前四行数据都已被非架构程序读取/使用,就开始用新的数据覆写权重ram124中的数据(例如,利用针对非架构程序的下一次执行实例的权重进行覆写,以例如对池化后数据执行传统乘法累加激活函数运算)。在这种情况下,架构程序读取状态寄存器127以获得最近读取的权重ram行的地址2604,从而决定新的权重集可以写入权重ram124中的位置。存储器阵列作为nnu存储器和高速缓存存储器的双重使用现参考图40,示出一框图,该框图示出处理器4000。处理器4000包括多个环站4004,其中多个环站4004以双向方式彼此连接以形成环形总线4024。图40的实施例包括表示为4004-0、4004-1、4004-2、4004-3、4004-m和4004-u的六个环站。处理器4000包括分别被称为核心复合体04012-0、核心复合体14012-1、核心复合体24012-2和核心复合体34012-3的四个核心复合体4012,其中这四个核心复合体4012各自包括用于将核心复合体4012耦接至环形总线4024的四个环站4004-0、4004-1、4004-2和4004-3。处理器4000还包括非核心部分4016,非核心部分4016包括用于将非核心4016耦接至环形总线4024的环站4004-u。最后,处理器4000包括通过环站4004-m而耦接至环形总线4024的动态随机存取存储器(dram)控制器4018和nnu121。如以下更详细所述,nnu121包括存储器阵列4152(见图41),该存储器阵列4152可被用作nnu121的npu126的阵列所使用的存储器(例如,图1的权重ram124),或者用作核心复合体4012所共享的高速缓存存储器,例如用作牺牲高速缓存器或用作末级高速缓存器(llc)片。尽管图40的示例包括四个核心复合体4012,但还设想了具有不同数量的核心复合体4012的其它实施例。非核心4016包括用于控制处理器4000对外围装置可以耦接的系统总线4022的访问的总线控制器4014,诸如视频控制器、盘控制器、外围总线控制器(例如,pci-e)等。在一个实施例中,系统总线4022是众所周知的v4总线。非核心4016还可以包括其它功能单元,诸如电源管理单元和私有ram等(例如,核心4002的微码所使用的非架构存储器)。dram控制器4018控制作为系统存储器的dram(例如,异步dram或同步dram(sdram),诸如双倍数据速率同步dram、直接rambusdram或降低延迟的dram等)。核心复合体4012、非核心4016和nnu121经由环形总线4024来访问系统存储器。更具体地,nnu121从系统存储器将神经网络的权重和数据读取至存储器阵列4152中,并经由环形总线4024将来自存储器阵列4152的神经网络结果写入系统存储器。此外,在作为牺牲高速缓存器(见图41的4006-4)进行操作时,存储器阵列4152在高速缓存器控制逻辑4108(见图41)的控制下将高速缓存器行驱逐至系统存储器。此外,在作为llc片(见图41的4006-4)进行操作时,存储器阵列4152和高速缓存器控制逻辑4108从系统存储器填充高速缓存器行,并将高速缓存器行写回并驱逐至系统存储器。四个核心复合体4012包括各自的llc片4012-0、4012-1、4012-2和4012-3,其中各llc片耦接至环站4004并且一般地个别地称为llc片4006或者共同称为(多个)llc片4006。各核心4002包括高速缓存器存储器,诸如耦接至环站4004的2级(l2)高速缓存器4008等。各核心4002还可以包括1级高速缓存器(未示出)。在一个实施例中,核心4002是x86指令集架构(isa)核心,但是设想了核心4002是另一isa(例如,arm、sparc、mips等)核心的其它实施例。如图40所示,llc片4006-0、4006-1、4006-2和4006-3整体形成核心复合体4012所共享的处理器4000的llc4005。各llc片4006包括存储器阵列、与存储器阵列4152类似的高速缓存器控制逻辑、以及图41的高速缓存器控制逻辑4108。如以下更详细所述,模式指示符(例如,图41的模式输入4199)可以被设置为使得nnu121的存储器阵列4152作为llc4005的附加(例如,第五或第九)片4006-4进行操作。选择性地组成附加llc片4006-4的存储器阵列4152(和图41的高速缓存器控制逻辑4108)也被称为nnullc片4006-4。在一个实施例中,存储器阵列4152和各llc片4006包括2mb的存储器阵列,但是设想了具有不同大小的其它实施例。此外,设想了存储器阵列4152的大小和llc片4006的大小不同的实施例。优选地,llc4005包含l2高速缓存器4008以及高速缓存器阶层结构中的任何其它高速缓存器(例如,l1高速缓存器)。环形总线4024或环4024是促进包括dram控制器4018、非核心4016以及llc片4006在内的相干组件之间的通信的可扩展双向互连。环4024包括两个单向环,这两个单向环各自还包括五个子环:请求(request),用于传输包括加载的大多数类型的请求包;监听(snoop),用于传输监听请求包;确认(acknowledge),用于传输响应包;数据(data),用于传输数据包以及包括写入的特定请求项;以及信用(credit),用于在远程队列中发射并获得信用。附接至环4024的各节点经由环站4004而连接,其中该环站4004包含用于在环4024上发送和接收包的队列,例如如针对图62至图65更详细所述的队列。队列是代表远程队列中所要接收的附接组件在环4024上发起请求的出口队列、或从环4024接收要转发至附接组件的请求的入口队列。在出口队列在环上发起请求之前,其首先从远程目的地入口队列获得信用环上的信用。这确保了远程入口队列具有可用于在请求到达时处理该请求的资源。在出口队列希望在环4024上发送事务包时,该出口队列仅可以在没有预先占有最终以远程节点为目的地的传入包的情况下发送事务包。在传入包从任意方向到达环站4004时,询问包的目的地id以确定该环站4004是否是所述包的最终目的地。如果该目的地id不等于环站4004的节点id,则包在后续时钟内继续前进至下一环站4004。否则,包在同一时钟内离开环4024,以供包的事务类型所涉及的任一入口队列所消耗。一般而言,llc4005包括n个llc片4006,其中n个片4006中的各片4006负责对通过散列(hash)算法或简称为散列所确定的处理器100的物理地址空间的不同的约1/n进行高速缓存。散列是将物理地址作为输入、并选择负责对该物理地址进行高速缓存的适当llc片的函数。在必须从核心4002或监听代理向llc4005进行请求的情况下,该请求必须被发送至负责对该请求的物理地址进行高速缓存的适当llc片4006。适当llc片4006是通过对请求的物理地址应用散列而确定的。散列算法是满射函数(surjectivefunction),其中该满射函数的域是物理地址的集合或其子集,并且该满射函数的范围是当前包括的llc片4006的数量。更具体地,该范围是llc片4006的索引(例如,在八个llc片4006的情况下为0至7)的集合。该函数可以通过检查物理地址位的适当子集来进行计算。例如,在具有八个llc片4006的系统中,散列算法的输出可以简单地是pa[10:8],即物理地址位中的三个位,也即位8至位10。在llc片4006的数量为8的另一实施例中,散列的输出是其它地址位(例如,作为{pa[17]、pa[14]、pa[12]^pa[10]^pa[9]}所产生的三位)的逻辑函数。在任何llc4005高速缓存完成之前,该llc4005的所有请求器都必须具有相同的散列算法。由于散列规定了操作期间对地址进行高速缓存的位置以及将要发送监听的位置,因此散列仅通过所有核心4002、llc片4006和监听代理之间的协调来改变。如以下针对图42和图43更详细所述,更新散列算法基本上包括:(1)使所有核心4002同步以防止新的可高速缓存访问;(2)执行llc4005中当前所包括的所有llc片4006的回写无效,这导致修改后的高速缓存器行被写回到系统存储器并且所有的高速缓存器行都无效(如下所述,回写无效可以是选择性回写无效,其中只有地址被新散列算法散列至与旧散列算法不同的片的那些高速缓存器行被驱逐,即无效,并且如果被修改,则在无效之前被写回);(3)将散列更新消息广播给各个核心4002和监听源,这命令各个核心4002和监听源改变为新的散列(如下所述,从包含性(inclusive)散列变为独占散列,或者反之亦然);(4)对用于控制对存储器阵列4152的访问的选择逻辑4158(见图41)的模式输入4199进行更新;以及(5)用新的散列算法恢复执行。当llc片4006的数量n为8即2的幂次方时,上述的散列算法是有用的,并且这些算法可被修改为容易地适应2的其它幂次方,例如,针对4个片修改为pa[9:8]或者针对16个片修改为pa[11:8]。然而,根据llc4005中是否包含nnullc片4006-4(以及根据核心复合体4012的数量),n可以是或者可以不是2的幂次方。因此,如以下针对图42和图43所述,取决于llc片4006的数量使用至少两个不同的散列。即,在llc4005中包括nnullc片4006-4的情况下使用被称为包含性散列的第一散列,并且在llc4005中不包括nnullc片4006-4的情况下使用被称为独占散列的第二散列。一个散列算法输出pa[45:6]除以n的余数。该散列具有如下的优点:即使在n的值不是2的幂次方的情况下也以基本上平衡的方式在n个llc片4006之间分配物理地址(假定物理地址的相对均匀分配)。当n是2的幂次方时,可以通过简单地输出pa[45:6]的低n-1位来进行取余运算。然而,当n不是2的幂次方时,取余运算可能不利地需要整除。与pa除以n的余数的散列相近似但是用于物理地址的较小子集的另一散列被定义如下(其中当n不是2的幂次方时(在该情况下为当n=9时)该散列可以更高效地在硬件中实现):在calc_hash()的情况下,针对散列使用pa[11:8],但是如果pa[11:8]>8,则使用pa[10:8],其中pa[10:8]确保在范围[0,7]内。可以发现,calc_hash()能够以与pa[45:6]除以n的余数相比相对较不平衡的方式在llc片4006之间分配物理地址(再次假定物理地址的相对均匀分配),即片0~6具有约1/8的可能性,而片7和8具有约1/16的可能性。然而,应当注意,即使是pa[45:6]除以n的余数的散列算法也不产生完美均匀平衡的分配,这是因为pa[45:6]表示具有作为2的幂次方的多个元素的域、而n不是2的幂次方。一般来说,当n不是2的幂次方时,散列算法首先将物理地址散列至2^p个可能的结果的范围,其中p=ceiling(log2(n)),即log2(n)的取顶函数,然后将第一散列的大于或等于n的结果(即,不与现有片4006相对应的结果)映射至小于n的输出(即,映射至现有片4006)。硬件中相对高效地实现的另一散列算法被定义如下:calc_hash_2()能够以与calc_hash()相比相对更平衡的方式在llc片4006之间分配物理地址(再次假定物理地址的相对均匀分配),即片0~7具有约7/64的可能性,而片8具有约8/64或1/8的可能性。在其它实施例中,calc_hash()和calc_hash_2()算法可被修改为通过使用甚至更大数量的物理地址位来以甚至相对更平衡的方式分配物理地址。如这里所述,有利地,实施例采用两种不同的散列算法:一种不包括存储器阵列4152作为llc片4006,一种包括存储器阵列4152作为llc片4006。例如,在核心复合体4012及其相应llc片4006的数量为8的处理器4000中,不包括存储器阵列4152的散列可以是pa[10:8];以及包括存储器阵列4152的散列可以是上述的calc_hash_2(pa),其映射至9个不同的片。在一个实施例中,两个散列算法可被有利地设计为支持选择性的回写无效作为最优化方案,即仅对将被包含性散列算法和独占散列算法散列至不同片的高速缓存器行进行驱逐(即,回写无效)。在一些实施例中,如以下针对图42和图43的方框更详细所述,关于从包含性散列至独占散列的转换,这要求仅使nnullc片4006-4是回写无效的(即,非nnullc片4006无需是回写无效的);以及关于从独占散列至包含性散列的转换,仅需对非nnullc片4006中的其地址将被包含性散列算法和独占散列算法散列至不同片的高速缓存器行进行驱逐。独占散列是pa[10:8]或类似物、并且包含性散列是calc_hash_2或类似物的实施例就是这样的实施例。现参考图41,示出一框图,该框图更详细示出图40的nnu121、以及图40的环站4004-m。图41的nnu121在许多方面与上述的nnu121的实施例类似,但是还包括高速缓存器控制逻辑4108、选择逻辑4158和可以由nnu121的权重ram124或数据ram122构成的存储器阵列4152。尽管在图41中未示出,但是nnu121还包括图1中的程序存储器129、定序器128、数据ram122和权重ram124。nnu121还包括如图41所示的图1中的npu126的阵列和控制/状态寄存器127。如上所述,例如,如以上详细描述地,针对图34,阵列中的npu126各自包括用于处理指令和数据的多阶段的流水线。npu流水线126的第一阶段向选择逻辑4158提供数据以写入存储器阵列4152,并且第二阶段从存储器阵列4152接收数据。在一些实施例中,流水线126包括十个阶段,并且第六阶段从存储器阵列4152接收数据,并且第九阶段向选择逻辑4158提供数据以供写入存储器阵列4152。存储器阵列4152耦接至npu阵列流水线126。选择逻辑4158向存储器阵列4152提供输入。选择逻辑4158由用于指定模式的模式输入4199控制。优选地,模式4199输入是控制/状态寄存器127中的、被写入以将模式4199从高速缓存存储器模式改变为nnu模式的一个位的输出。模式指示存储器阵列4152正在nnu模式下或者在高速缓存存储器模式下工作。当在nnu模式下工作时,存储器阵列4152用作nnu121的权重ram124。(尽管在全文中是指存储器阵列4152用作权重ram124,但是可选地,存储器阵列4152可以用作数据ram122。)然而,当在高速缓存存储器模式下工作时,存储器阵列4152用作高速缓存存储器。描述了高速缓存存储器模式的两个实施例:在第一实施例中,存储器阵列4152用作核心复合体4012所共享的llc4005的片4006,以及在第二实施例中,存储器阵列4152用作核心复合体4012所共享的牺牲高速缓存器。在模式控制4199指示nnu模式的情况下,选择逻辑4158选择npu阵列流水线126所提供的数据,并且存储器阵列4152将数据写入npu阵列流水线126,使得存储器阵列4152用作nnu121的权重ram124。与此相对,在模式控制4199指示高速缓存存储器模式的情况下,选择逻辑4158选择高速缓存器控制逻辑4108的数据流水线4146所提供的数据,并且存储器阵列4152将数据写入高速缓存器控制逻辑4108的数据流水线4146。以这种方式,存储器阵列4152用作核心4002所共享的高速缓存存储器,例如,用作牺牲高速缓存器或llc片4006-4。优选地,在高速缓存存储器模式下使用两个ram122/124中较大者的存储器阵列。此外,设想了如下的实施例,其中权重ram124和数据ram122这两者的存储器阵列被用作核心4002所共享的高速缓存存储器。优选地,从数据流水线4146向存储器阵列4152提供数据的数据总线是64个字节宽(例如,高速缓存器行的大小),并且从存储器阵列4152向npu阵列流水线126提供数据的数据总线是等于阵列的npu126的数量的字数,例如1024个字。相反,从npu阵列流水线126向存储器阵列4152提供数据的数据总线是等于阵列的npu126的数量的字数。优选地,选择逻辑4158和存储器阵列4152之间的总线包括地址总线、写入数据总线、rd/wr控制以及用于指示16个高速缓存器行中的哪个高速缓存器行(假定例如1024个字节宽的存储器阵列和64个字节的高速缓存器行)正被访问的高速缓存器行启动(cle)。在从npu阵列流水线126向存储器阵列4152进行写入的情况下,通常所有的cle将为真,这是因为通常所有的npu126都对权重ram124的一行进行写入。选择逻辑(未示出)在数据正被写入存储器阵列4152时使用cle来选择存储器阵列4152的适当存储器区块以使得能够进行读取或写入。在图41的实施例中,当在nnu模式下操作时,优选地,在核心4002上执行的架构程序经由环形总线4024来访问作为外围装置的nnu121而非作为核心的执行单元的nnu121(例如以上针对图1~图35所述的实施例等)。优选地,图35的接口逻辑3514(图41中未示出)和控制/状态寄存器127耦接至环站4004-m,其中该环站4004-m使得核心4002能够读取和写入控制/状态寄存器127、并且能够使用架构加载/存储指令(而非图14和图15的mtnn1400和mfnn1500指令)经由接口逻辑3514来读取和写入数据ram122、权重ram124和程序存储器129。另外,可以经由直接存储器访问(dma)传递来在系统存储器和数据ram122/权重ram124之间传递数据/权重字。最后,设想了如下的实施例,其中nnu121本身执行加载/存储指令以在系统存储器和数据ram122/权重ram124之间传送数据/权重。优选地,操作系统将nnu121管理为由在不同核心4002上运行的系统的各种处理共享的全局资源,并且操作系统需要用以在使用nnu121之前获得该nnu121的所有权的处理。优选地,如以下针对图42~图45更详细所述,操作系统控制nnu121操作的模式4199,并且更具体地控制存储器阵列4152的运作方式。在一个实施例中,存储器阵列4152是2mb的静态ram阵列,但也可以设想具有更大或更小的大小的其它实施例。高速缓存器控制逻辑4108耦接至环站4004-m并且耦接至选择逻辑4158和存储器阵列4152。高速缓存器控制逻辑4108包括耦接至环站4004-m的标记流水线4144、耦接至环站4004-m的数据流水线4146以及耦接至标记流水线4144的标记/mesi/lru阵列4142。高速缓存器控制逻辑4108还包括外部接口4147,该外部接口4147包括填充队列4122、监听队列4124和仲裁器4136,其中仲裁器4136为了对标记流水线4144和数据流水线4146的访问而在填充队列4122和监听队列4124之间进行仲裁。高速缓存器控制逻辑4108还包括核心接口4148,该核心接口4148包括加载队列4112、驱逐队列4114、查询队列4116和仲裁器4138,其中仲裁器4138为了对标记流水线4144和数据流水线4146的访问而在加载队列4112、驱逐队列4114和查询队列4116之间进行仲裁。仲裁器4132为了对标记流水线4144的访问而在外部接口4147和核心接口4148之间进行仲裁,并且仲裁器4134为了对数据流水线4146的访问而在外部接口4147和核心接口4148之间进行仲裁。在一个实施例中,高速缓存器控制逻辑4108还包括状态机,其中该状态机响应于进行存储器阵列4152的回写无效操作的请求(例如,响应于来自核心4002的回写无效请求)而这样做。此外,状态机响应于进行存储器阵列4152的无效操作的请求(例如,响应于来自核心4002的无效请求)而这样做。为了进行无效操作,状态机将存储器阵列4152中的各高速缓存器行的标记/mesi阵列4142内的状态更新为无效状态,并针对存储器阵列4152的各集合而重设lru阵列4142内的替换信息。标记流水线4144从仲裁器4132接收请求和标记更新,并向环站4004-m以及外部接口4147和核心接口4148提供高速缓存器行状态和响应。数据流水线4146从仲裁器4134接收请求和数据并将数据提供给选择逻辑4158和环站4004-m。当处于高速缓存存储器模式下时,标记/mesi阵列4142对存储器阵列4152中所储存的高速缓存器行的标记和状态进行储存。优选地,当处于高速缓存存储器模式下时,存储器阵列4152用作集合关联存储器,并且lru阵列4142储存用于确定要替换所选集合中的哪路的高速缓存器行替换信息。填充队列4122处理向存储器阵列4152的新分配(再加载请求)以及从存储器阵列4152的驱逐(牺牲请求)。在牺牲请求的情况下,填充队列4122请求对标记流水线4144的访问以确定哪个高速缓存器行(如果有的话)需要被驱逐,并且请求对数据流水线4146的访问以从存储器阵列4152读出修改后的数据从而写出至系统存储器。在再加载请求的情况下,填充队列4122请求对标记流水线4144的访问以将新分配的高速缓存器行的地址写入标记阵列4142并设置mesi阵列4142中的初始mesi状态,并且请求对数据流水线4146的访问以将新数据写入存储器阵列4152。监听队列4124处理源自系统总线4022的监听。监听队列4124请求对标记流水线4144的访问以确定在监听请求中指定的高速缓存器行的状态,并且请求对数据流水线4146的访问以从存储器阵列4152读出修改后的数据(如果存在的话)以响应监听请求。在加载在所有的低级高速缓存器(如以下更详细所述,当存储器阵列4152和高速缓存器控制逻辑4108正用作牺牲高速缓存器4006-4的情况下包括l3高速缓存器4005)中都未命中的情况下,加载队列4112处理来自核心4002的l2高速缓存器4008的加载(以及在l2高速缓存器4008不包括其它高速缓存器的实施例中,处理来自其它高速缓存器的加载,例如l1数据和l1指令)。加载队列4112请求对标记流水线4144的访问以确定所指定的高速缓存器行是否存在于存储器阵列4152中,并且请求对数据流水线4146的访问以从存储器阵列4152读出指定数据以经由环形总线4024写入请求方核心4002。驱逐队列4114处理来自核心的l2高速缓存器4008的驱逐。当用作牺牲高速缓存器4006-4时,驱逐队列4114请求对标记流水线4144的访问,以将从低级高速缓存存储器驱逐的高速缓存器行的地址写入标记阵列4142,并设置mesi阵列4142中的初始mesi状态。当用作llc片4006时,如果被驱逐的高速缓存器行被修改,则驱逐队列4114请求对标记流水线4144的访问以更新mesi阵列4142中的mesi状态。驱逐队列4114还请求对数据流水线4146的访问以将被驱逐的高速缓存器行写入存储器阵列4152。查询队列4116处理对核心的l2高速缓存器4008的监听。查询队列4116请求对标记流水线4144的访问以在核心4002对监听响应为“已修改”之后将mesi状态更新为“已修改”,并且请求对数据流水线4146的访问以将来自监听响应的修改后的高速缓存器行写入存储器阵列4152。在一个实施例中,高速缓存器控制逻辑4108包括各核心4002所用的核心接口4148。在一个实施例中,各核心接口4148包括单独的数据/指令加载队列4112、驱逐队列4114和查询队列4116,以分别用于对核心4002的单独的数据/指令高速缓存器进行加载、驱逐和监听。现参考图42,示出一流程图,该流程图示出在图41的存储器阵列4152正从用作llc片4006时的高速缓存存储器模式转换为用作nnu121的权重ram124/数据ram122时的nnu模式的情况下的图40的处理器4000的操作。如上所述,nnu121具有大量的存储器,例如在一个实施例中,权重ram124是2mb。图42和图43描述了如下的实施例,其中该实施例使得存储器阵列4152能够用作附加的llc片4006,从而有利地使得在nnu121未被系统上运行的任何处理用作神经网络单元的情况下llc4005的大小能够显著地增加(例如,增加25%)。更具体地,图42描述了用于将存储器阵列4152从作为llc片4006操作转换为作为nnu121的权重ram124操作的方法。有利地,在模式4199被设置为高速缓存存储器模式的情况下,图41的高速缓存器控制逻辑4108和存储器阵列4152以及选择逻辑4158在图42和图43的实施例中共同地用作llc片4006。流程始于方框4202。在方框4202处,请求从使用存储器阵列4152作为llc4005的片4006转换为使用存储器阵列4152作为nnu121的权重ram124。优选地,该转换由处理器4000上运行的操作系统来控制。例如,处理器4000上运行的应用程序请求操作系统使用nnu121,并且操作系统检测为存储器阵列4152当前正用作llc片4006,因此需要从高速缓存存储器模式转换为nnu模式。流程进入方框4204。在方框4204处,响应于方框4202处的转换请求,操作系统使所有核心4002本身同步。也就是说,操作系统使核心4002停止拾取架构指令并停止访问存储器。更具体地,这使对当前包括存储器阵列4152的llc4005的访问暂停。在一个实施例中,操作系统在各核心4002上执行用于指示核心4002同步的架构指令(例如,x86wrmsr)。在备选实施例中,操作系统在核心4002其中之一上执行指令,并且作为响应,一个核心4002例如经由微码来以信号形式通知其它核心4002中的各核心进行同步。流程进入方框4206。在方框4206处,在llc4005上进行回写无效。在一个实施例中,核心4002微码优选地响应于操作系统的架构指令的执行而请求回写无效。回写无效写回修改后的高速缓存器行(如果有的话),并使所有llc片4006(包括nnullc片4006-4)的所有高速缓存器行无效。在备选实施例中,回写无效是选择性的。一般来说,选择性回写无效意味着根据以下伪码进行操作:foreachslice://0~n–1,其中n是片(包括nnu片)的当前数量foreachcachelineinslice:ifexclusive_hash(cachelineaddress)!=slice:evictcacheline当然,当片是nnu片时(例如,在8个非nnu片4006加上一个nnullc片4006-4的情况下,片=8),exclusive_hash(cachelineaddress)(即“独占散列(高速缓存器行地址)”)将不等于片,这是因为独占散列从不返回nnullc片4006-4的索引,因此nnullc片4006-4中的所有高速缓存器行将被驱逐,即如果被修改则写回,否则无效。根据所采用的包含性散列和独占散列,需要从非nnullc片4006驱逐的高速缓存器行的数量发生变化。例如,假定独占散列和包含性散列都是pa[45:6]%n,但是其中n针对各散列不同,即与针对包含性散列的n相比,针对独占散列的n较小,并且假定针对包含性散列,n为9,以及针对独占散列,n为8。在这种情况下,非nnullc片4006中的高速缓存器行的相当大一部分(例如,约88%)需要被驱逐。在这种情况下,简单地使所有llc片4006的所有高速缓存器行回写无效可能一样或者更高效。相反,再例如,假定独占散列是pa[10:8],并且包含性散列是上述的calc_hash_2。在这种情况下,非nnullc片4006中的高速缓存器行都不需要在从包含性散列向独占散列的转换(即图42中进行的转换)时被驱逐。流程进入方框4208。在方框4208处,如上所述,用于将高速缓存器行的物理地址散列至llc片4006的散列算法被更新为不包括作为llc4005的片4006的存储器阵列4152。优选地,散列更新消息被广播给各核心4002和监听源,以将其散列算法改变为独占散列,即不包括nnullc片4006-4的散列。流程进入方框4212。在方框4212处,模式4199被更新为指示nnu模式,以使得选择逻辑4158使存储器阵列4152可用作npu流水线126以及核心4002上执行的架构程序所要访问的权重ram124。在一个实施例中,操作系统(例如,装置驱动程序)在核心4002其中之一上执行架构指令,其中该架构指令写入nnu121控制/状态寄存器127以更新用于控制模式4199的位,从而将模式4199从高速缓存器模式改变为nnu模式。架构指令可以是对i/o空间的写入或用于进行对控制/状态寄存器127的存储器映射i/o写入的存储器存储指令。流程进入方框4214。在方框4214处,核心4002恢复操作,即它们不再同步,而是开始拾取并执行可以包括访问存储器的架构指令。在一个实施例中,操作系统在各核心4002上执行用于指示核心4002恢复操作的架构指令。在备选实施例中,操作系统在核心4002其中之一上执行指令,并且作为响应,该一个核心4002例如经由微码来以信号形式通知其它核心4002中的各核心恢复操作。流程结束于方框4214。现参考图43,示出一流程图,该流程图示出在图41的存储器阵列4152正从用作nnu121的权重ram124/数据ram122时的nnu模式转换为用作llc片4006时的高速缓存存储器模式的情况下的图40的处理器4000的操作。流程始于方框4302。在方框4302处,请求从使用存储器阵列4152作为nnu121的权重ram124转换为使用存储器阵列4152作为llc4005的片4006。优选地,该转换由处理器4000上运行的操作系统来控制。例如,处理器4000上运行的应用程序向操作系统通知该应用程序不再使用nnu121、并且没有其它应用程序正在请求使用nnu121,并且操作系统检测为存储器阵列4152当前正用作权重ram124,因此需要从nnu模式转换为高速缓存存储器模式。流程进入方框4304。在方框4304处,响应于方框4302处的转换请求,如同针对方框4204所述的方式,操作系统使所有核心4002本身同步。更具体地,这使对当前不包括存储器阵列4152的llc4005的访问暂停。流程进入方框4306。在方框4306处,在llc4005上进行回写无效。回写无效写回修改后的高速缓存器行(如果有的话),并使所有llc片4006(不包括nnullc片4006-4,这是因为其当前不包括在llc4005中)的所有高速缓存器行无效。在备选实施例中,回写无效是选择性的。一般来说,选择性回写无效意味着根据以下伪码进行操作:foreachslice://0~n–1,其中n是片(不包括nnu片)的当前数量foreachcachelineinslice:ifinclusive_hash(cachelineaddress)!=slice:evictcacheline在图43中的从独占散列向包含性散列的转换中,片决不会是nnu片,因此nnullc片4006-4中的高速缓存器行将不被驱逐。根据所采用的包含性散列和独占散列,需要从非nnullc片4006驱逐的高速缓存器行的数量发生变化。例如,假定独占散列和包含性散列都是pa[45:6]%n,但是其中n针对各散列不同,即与针对包含性散列的n相比,针对独占散列的n较小,并且假定针对包含性散列,n为9,以及针对独占散列,n为8。在这种情况下,非nnullc片4006中的高速缓存器行的相当大一部分(例如,约88%)需要被驱逐。在这种情况下,简单地使所有llc片4006的所有高速缓存器行回写无效可能一样或者更高效。相反,假定独占散列是pa[10:8],并且包含性散列是上述的calc_hash_2。在这种情况下,非nnullc片4006中的高速缓存器行的相对小的一部分(例如,约12%)需要被驱逐。流程进入方框4308。在方框4308处,如上所述,用于将高速缓存器行的物理地址散列至llc片4006的散列算法被更新为包括作为llc4005的片4006的存储器阵列4152。即,散列更新消息被广播给各核心4002和监听源,以将其散列算法改变为包含性散列,即包括nnullc片4006-4的散列。流程进入方框4311。在方框4311处,高速缓存器控制逻辑4108通过如上所述地针对所有高速缓存器行将mesi阵列4142中的状态更新为无效,来对存储器阵列4152进行无效操作。优选地,高速缓存器控制逻辑4108还对lru阵列4142中的替换信息进行重设。在一个实施例中,核心4002的微码请求nnullc片4006-4进行无效请求,其中高速缓存器控制逻辑4108作为响应而进行无效。流程进入方框4312。在方框4312处,模式4199被更新为指示高速缓存存储器模式以使得选择逻辑4158使存储器阵列4152可用作llc片4006。流程进入方框4314。在方框4314处,核心4002恢复操作,即如同针对方框4214所述的方式,它们不再同步,而是开始拾取并执行可以包括访问存储器的架构指令。流程结束于方框4314。现参考图44,示出一流程图,该流程图示出在图41的存储器阵列4152正从用作nnu121的权重ram124/数据ram122时的nnu模式转换为用作牺牲高速缓存器4006-4时的高速缓存存储器模式的情况下的图40的处理器4000的操作。牺牲高速缓存器是用于仅保持由处理器4000的高速缓存器阶层结构中较低的高速缓存存储器驱逐的高速缓存器行的高速缓存存储器。例如,l2高速缓存器4008和/或l1数据/指令高速缓存器是低级高速缓存器。另外,在存储器阵列4152可用作牺牲高速缓存器4006-4的实施例中,llc4005被认为是3级(l3)高速缓存器并且相对于牺牲高速缓存器4006-4而言被认为是低级高速缓存器,并且l3高速缓存器4005将高速缓存器行驱逐至牺牲高速缓存器4006-4。牺牲高速缓存器在地址命中牺牲高速缓存器时(例如,响应于加载请求或监听请求)提供数据。在一个实施例中,l3高速缓存器4005包括核心复合体4012的l2高速缓存器4008以及低级高速缓存器,并且牺牲高速缓存器提供命中数据以分配至l3高速缓存器4005中,该l3高速缓存器4005进而将数据提供给l2高速缓存器4008,该l2高速缓存器4008进而将数据提供给更低级的高速缓存器。在另一实施例中,核心复合体4012的l3高速缓存器4005、l2高速缓存器4008和更低级的高速缓存器不是包含性的,并且牺牲高速缓存器提供命中数据以直接分配各级的高速缓存器。有利地,当模式4199被设置为高速缓存存储器模式时,图41的高速缓存器控制逻辑4108和存储器阵列4152以及选择逻辑4158在图44和图45的实施例中共同用作牺牲高速缓存器4006-4。在一个实施例中,牺牲高速缓存器4006-4可以用作将被驱逐至该牺牲高速缓存器4006-4的修改后的高速缓存器行进行高速缓存的回写高速缓存器,并且还可以用作不对被驱逐至该牺牲高速缓存器4006-4的修改后的高速缓存器行进行高速缓存、而是将修改后的高速缓存器行转发至系统存储器的直写(write-through)高速缓存器。如根据图45(更具体地,方框4506、4508和4512)的说明可以发现,直写牺牲高速缓存器4006-4具有快速转换为在nnu模式下使用存储器阵列4152作为权重ram124的优点,而回写牺牲高速缓存器4006-4可以具有针对处理器4000的总体高速缓存效率较高的优点。优选地,牺牲高速缓存器4006-4可配置为回写模式或直写模式。流程始于方框4402。在方框4402处,请求从使用存储器阵列4152作为nnu121的权重ram124转换为使用存储器阵列4152作为核心复合体4012所共享的牺牲高速缓存器4006-4。优选地,与以上针对方框4302所述的方式类似,通过处理器4000上运行的操作系统来控制转换。流程进入方框4404。在方框4404处,模式4199被更新为指示高速缓存存储器模式以使得选择逻辑4158令存储器阵列4152可用作牺牲高速缓存器4006-4。流程进入方框4406。在方框4406处,总线控制器4014被告知开始将监听引导至牺牲高速缓存器4006-4,并且低级高速缓存器被告知开始将加载请求和逐出请求引导至牺牲高速缓存器4006-4。流程进入方框4408。在方框4408处,牺牲高速缓存器4006-4开始对牺牲数据进行高速缓存。在图41的实施例中,驱逐队列4114接收从低级高速缓存器(例如,l3高速缓存器4005、l2高速缓存器4008和/或l1d/l1i高速缓存器)驱逐高速缓存器行的请求(例如,逐出)。作为响应,牺牲高速缓存器4006-4将被驱逐的高速缓存器行分配至存储器阵列4152中。流程进入方框4412。在方框4412处,牺牲高速缓存器4006-4接收访问数据的请求,并且在请求的地址命中牺牲高速缓存器4006-4的情况下利用数据进行响应。在图41的实施例中,监听队列4214和加载队列4112接收请求。更具体地,监听牺牲高速缓存器4006-4以使另一高速缓存代理正读取的高速缓存器行回写无效。另外,牺牲高速缓存器4006-4从低级高速缓存器接收针对这些低级高速缓存器中未命中的加载的加载请求。如果请求命中牺牲高速缓存器4006-4,则该牺牲高速缓存器4006-4向请求器提供命中数据。流程结束于方框4412。现参考图45,示出一流程图,该流程图示出在图41的存储器阵列4152正从用作牺牲高速缓存器4006-4时的高速缓存存储器模式转换为用作nnu121的权重ram124/数据ram122时的nnu模式的情况下的图40的处理器4000的操作。如上所述,牺牲高速缓存器4006-4可以正用作直写型高速缓存器或者用作回写型高速缓存器。流程始于方框4502。在方框4502处,请求从使用存储器阵列4152作为牺牲高速缓存器4006-4转换为使用存储器阵列4152作为nnu121的权重ram124。优选地,该转换由处理器4000上运行的操作系统来控制。例如,处理器4000上运行的应用程序请求操作系统使用nnu121,并且操作系统检测为存储器阵列4152当前正用作牺牲高速缓存器4006-4,因此需要从高速缓存存储器模式转换为nnu模式。流程进入方框4504。在方框4504处,高速缓存器被告知停止将驱逐引导至牺牲高速缓存器4006-4。流程进入决策方框4506。在决策方框4506处,如果牺牲高速缓存器4006-4正用作直写型高速缓存器,则流程进入方框4512;否则,流程进入方框4508。在方框4508处,高速缓存器控制逻辑4108对牺牲高速缓存器4006-4进行回写无效。也就是说,牺牲高速缓存器4006-4将其所有修改后的高速缓存器行写回至系统存储器,然后(通过针对所有高速缓存器行将mesi阵列4142中的状态更新为无效;优选地,高速缓存器控制逻辑4108还对lru阵列4142中的替换信息进行重设)使其所有高速缓存器行无效。优选地,高速缓存器控制逻辑4108在进行回写无效的同时继续对加载请求和监听请求进行响应。流程进入方框4514。在方框4512处,高速缓存器控制逻辑4108对存储器阵列4152进行无效操作。也就是说,高速缓存器控制逻辑4108使存储器阵列4152的所有高速缓存器行无效。可以发现,如果牺牲高速缓存器4006-4正用作直写型高速缓存器,则由于无需进行方框4508处的对修改后的高速缓存器行的回写(即,仅需要进行方框4512这里的无效),因此转换为使用存储器阵列4152作为权重ram124可以有利地比牺牲高速缓存器4006-4正用作回写型高速缓存器的情况更快,这在牺牲高速缓存器4006-4相对大的情况下可以是一种相当大的节省。流程进入方框4514。在方框4514处,低级高速缓存器被告知停止将加载请求引导至牺牲高速缓存器4006-4,并且总线控制器4014被告知停止将监听引导至牺牲高速缓存器4006-4。流程进入方框4516。在方框4516处,如同针对方框4212所述的方式,模式4199被更新为指示nnu模式,以使得选择逻辑4158使存储器阵列4152可用作npu流水线126以及核心4002上执行的架构程序所要访问的权重ram124。流程进入方框4518。在方框4518处,高速缓存器控制逻辑4108停止(高速缓存器控制逻辑4108在方框4408处开始做的)对牺牲数据进行高速缓存。此外,高速缓存器控制逻辑4108向总线控制器4014转发该高速缓存器控制逻辑4108所接收的任何后续加载、驱逐或监听请求。最后,在核心4002上执行的架构程序可以用作npu流水线126所要访问的权重ram124。流程结束于方框4518。现将描述如下的实施例,其中nnu121的存储器阵列(例如,权重ram124或数据ram122)被用作存储器以保持由核心复合体4012处理的数据所用的牺牲高速缓存器的高速缓存器行(例如,为从l3高速缓存器4005的高速缓存器行驱逐提供服务),该实施例与以上针对图40~图41和图44~图45所述的实施例类似,除了在下述的实施例中,标记(以及高速缓存器行状态和替换信息)有利地储存在l3高速缓存器4005的标记目录中(而非储存在nnu121中的单独结构中,例如在图41的标记/mesi/lru阵列4142中),并且l3高速缓存器4005的控制逻辑增强以处理针对牺牲高速缓存器的请求(例如,加载、驱逐和监听)、并在nnu121存储器阵列(以下称为选择性数据存储4652)与l3高速缓存器4005和/或系统存储器之间进行必要的高速缓存器行传递。现参考图46,示出一框图,该框图示出根据备选实施例的处理器4000。处理器4000包括环形总线4024,其中核心4002和l3高速缓存器4005、nnu121以及dram控制器4018分别通过环站4004-0、4004-n和4004-m而耦接至该环形总线4024。系统存储器4618耦接至dram控制器4018。nnu121包括选择性数据存储4652。l3高速缓存器4005包括l3数据存储4606、标记目录4642、以及包括模式指示符4699的控制逻辑4644。逻辑上,当在牺牲高速缓存器模式下操作时,处理器4000包括牺牲高速缓存器4602,如下所述,牺牲高速缓存器4602包括选择性数据存储4652、以及l3高速缓存器4005的控制逻辑4644和标记目录4642的相关部分。优选地,选择性数据存储4652是nnu121的权重ram124和/或数据ram122。优选地,如在以下更详细所述,模式4699被操作系统(例如,装置驱动程序)更新为指示牺牲高速缓存器模式或nnu模式,这取决于核心4002是否已经请求使用nnu121作为神经网络单元。图46的处理器4000在许多方面与图40的处理器4000类似,并且附图标记相同的元件是类似的,其差异如下所述。更具体地,处理器4000可以被置于第一模式,在所述第一模式中nnu121的选择性数据存储4652被用于保持核心4002所处理的高速缓存器行以用作牺牲高速缓存器4602,或者处理器4000可以被置于第二模式以使用选择性数据存储4652来保持nnu121所处理的数据(例如,神经网络权重或数据)。如以下更详细所述,模式由模式指示符4699指示,其中控制逻辑4644检查该模式指示符4699以确定其应该采取哪些动作。牺牲高速缓存器4602以与图41、图44和图45的牺牲高速缓存器4006-4类似的许多方式来为核心4002提供服务,而差异如下所述。然而,有利地,牺牲高速缓存器4602的标记被保持在l3高速缓存器4005的标记目录4642中。这例如与图41的实施例形成对比,其中在图41的实施例中标记目录是nnu121的一部分,例如标记阵列4142。另外,l3高速缓存器4005的控制逻辑4644控制图46的牺牲高速缓存器4602的大部分操作。这例如与图41的实施例形成对比,在图41的实施例中nnu121的高速缓存器控制逻辑4108控制牺牲高速缓存器4006-4。优选地,如以下针对图47更详细所述,标记目录4642还保持牺牲高速缓存器4602的状态(例如,mesi状态)和替换信息(例如,lru信息)。尽管图46示出具有单个l3数据存储4606和单个标记目录4642的l3高速缓存器4005,但是l3数据存储4606可以包括多个l3数据存储4606(例如针对各l3片4006包括一个l3数据存储4606)、以及多个标记目录4642(例如,针对各l3片4006包括一个标记目录4642);此外,各l3片4006可以包括其自己的控制逻辑4644实例。如上所述,这样的实施例可以采用散列算法,该散列算法对高速缓存器行的地址进行散列以确定多个片4006中的哪个片4006将保持高速缓存器行。然而,设想了如下的实施例,其中处理器4000是单核处理器并且l3高速缓存器4005未被切片,使得l3数据存储4606、标记目录4642和控制逻辑4644也不被切片。如以下更详细所述,在切片实施例中,选择性数据存储4652逻辑上被切片成p个部分(其中p是l3高速缓存器4005的片4006的数量),使得选择性数据存储4652的各部分与l3高速缓存器4005的相应片4006相关联。l3高速缓存器4005是集合关联高速缓存存储器,其中l3数据存储4606具有被布置为s个集合和y个路的l个字节的数据存储。例如,假定各高速缓存器行是64字节,则l3高速缓存器4005可以具有l=8mb的数据存储并且具有s=8192个集合和y=16个路。选择性数据存储4652是具有m个字节的数据存储的存储器。控制逻辑4644在逻辑上访问作为被布置成s个集合和x个路的集合关联高速缓存存储器的选择性数据存储4652,其中x是m除以l的商与y的乘积。例如,假定l3高速缓存器4005具有以上的示例性值,则选择性数据存储4652可以具有m=4mb的数据存储并且具有x=16*(4mb/8mb)=8个路。因此,标记目录4642被布置为具有s个集合和z个路,其中z是x和y的总和。如以下针对图47的实施例所述,采用以上的示例性值,标记目录4642可以具有z=16+8=24个路。在具有p个l3数据存储片4606的切片实施例中,各l3数据存储片4606具有j个集合和y个路,其中j是s除以p的商。采用以上的示例性值(其中p=4),各l3数据存储片4606具有j=8192/4=2048个集合和y=16个路。在图46的实施例中,dram控制器4018以及由此的系统存储器通过与nnu121耦接至环形总线4024所经由的环站4004-n分开的环站4004-m而耦接至环形总线4024。然而,设想了其它实施例(诸如图41的实施例等),其中dram控制器4018和nnu121通过相同的环站4004而耦接至环形总线4024。虽然这里描述了nnu121包括可用作牺牲高速缓存器4602的选择性数据存储4652的实施例,但是选择性数据存储4652可以是附接至l3高速缓存器4005并且可由该l3高速缓存器4005访问的另一种加速器的一部分。例如,设想了如下的实施例,其中加速器是加密/解密单元、压缩/解压缩单元、多媒体编码器/解码器单元、或者数据库索引单元。优选地,控制逻辑4644包括标记流水线、数据流水线和队列(例如,填充队列、监听队列、加载队列、驱逐队列和查询队列等)。控制逻辑4644执行与l3高速缓存器4005相关联的常规功能,诸如从系统存储器将高速缓存器行填充到l3数据存储4606中、处理针对l3数据存储4606的监听请求、将数据从l3数据存储4606加载到核心复合体4012、从l3数据存储4606驱逐高速缓存器行、以及生成针对低级高速缓存器的查询请求等。另外,如以下更详细所述,增强控制逻辑4644以执行针对牺牲高速缓存器4602的类似的功能。许多增强功能与针对图41的高速缓存器控制逻辑4108所述的功能类似。例如,控制逻辑4644(例如,响应于加载请求而)使高速缓存器行从选择性数据存储4652提供至核心4002;另外,控制逻辑4644将高速缓存器行从l3数据存储4606驱逐至选择性数据存储4652、并相应地更新标记目录4642;此外,控制逻辑4644使高速缓存器行从选择性数据存储4652写入系统存储器4618、并相应地更新标记目录4642,以例如写回修改后的高速缓存器行;而且,控制逻辑4644处理涉及选择性数据存储4652中所保持的有效高速缓存器行的监听。现参考图47,示出一框图,该框图示出图46的标记目录4642中的集合4700。标记目录集合4700包括l3标记4702、牺牲高速缓存器标记4704和替换信息4706。标记目录4642中的集合的数量与l3数据存储4606中的集合的数量相对应,并且也与选择性数据存储4652中的逻辑集合的数量相对应。也就是说,标记目录4642包括与l3高速缓存器4005中的各集合相对应的各个标记目录集合4700,并且也与牺牲高速缓存器4602中的相应集合相对应。例如,在l3高速缓存器4005被布置为2048个集合且牺牲高速缓存器4602在逻辑上也被布置为2048个集合的实施例中,标记目录4642也具有2048个集合。l3标记4702的数量与l3高速缓存器4005中的路的数量相对应,例如,在l3高速缓存器4005具有16个路的实施例中为16个标记。牺牲高速缓存器标记4704的数量与牺牲高速缓存器4602中的路的数量相对应,例如,在牺牲高速缓存器4602逻辑上具有8个路的实施例中为8个标记。优选地,各l3标记4702所用的条目或存储不仅储存标记(即,相关地址位),而且还储存l3数据存储4606中的相应高速缓存器行的状态(例如,mesi状态);同样地,各牺牲高速缓存器标记4704所用的存储条目不仅储存标记,而且还储存选择性数据存储4652中的相应高速缓存器行的状态。控制逻辑4644读取替换信息4706以决定在需要替换l3高速缓存器4005或牺牲高速缓存器4602的高速缓存器行的情况下要替换哪个路。例如,替换信息4706可以是最近最少使用(lru)的信息,该信息使得控制逻辑4644能够跟踪集合内的lru路。当l3数据存储4606和选择性数据存储4652的高速缓存器行被访问时,控制逻辑4644更新替换信息4706。优选地,替换信息4706包括用于l3数据存储4606和选择性数据存储4652的分开的替换信息。在一个实施例中,替换信息4706被保持在与用于保持标记4702/4704的存储阵列分开的存储阵列中。可以发现,添加牺牲高速缓存器标记4704和附加替换信息4706以及控制逻辑4644增强以支持牺牲高速缓存器4602,这可以有利地表示l3高速缓存器4005的大小的相对适中的增加以换取nnu121中的相应硬件(例如,图41的高速缓存器控制逻辑4108)的移除,并且可以降低复杂度。现参考图48,示出一流程图,该流程图示出图46的处理器4000进行将高速缓存器行从l3高速缓存器4005驱逐至牺牲高速缓存器4602的操作。流程始于方框4802。在方框4802处,l3高速缓存器4005接收用以驱逐l3数据存储4606中所保持的高速缓存器行的请求。流程进入决策方框4804。在决策方框4804处,控制逻辑4644检查模式4699。如果模式4699指示牺牲高速缓存器模式,则流程进入方框4806;否则(即,模式4699指示nnu模式),流程进入方框4808。在方框4806处,控制逻辑4644从l3数据存储4606读取指定高速缓存器行并将其写入选择性数据存储4652。另外,控制逻辑4644将标记目录4642更新为指示高速缓存器行存在于选择性数据存储4652中(即存在于牺牲高速缓存器4602中),例如更新为共享的或修改后的mesi状态。优选地,为了将高速缓存器行写入选择性数据存储4652,控制逻辑4644产生针对其环站4004-0中的队列(例如,填充队列)的请求,该请求转而在环形总线4024上产生针对nnu121的环站4004-n中的从属存储队列的从属存储事务。事务包括用于使得nnu121能够确定其要将高速缓存器行写入的选择性数据存储4652内的位置的地址。在一个实施例中,从属存储事务中发送的地址是选择性数据存储4652映射至的系统地址空间的一部分内的存储器地址,例如pci地址空间。在另一实施例中,事务中发送的存储器地址可以是专用地址空间,即不是系统地址空间。例如,地址可以是选择性数据存储4652的本地地址,例如,0~选择性数据存储4652中所保持的高速缓存器行大小的块的数量-1。再例如,地址可以指定选择性数据存储4652的行、以及该行内的块索引。在任一实施例中,控制逻辑4644基于l3数据存储4606中的正从中驱逐高速缓存器行的集合以及标记目录4642中的正被更新为指示高速缓存器行存在于选择性数据存储4652的路的索引、并且在切片实施例的情况下基于正从中驱逐高速缓存器行的片4606的索引,来计算地址。在又一实施例中,地址是用于指定路索引和集合索引以及在切片实施例的情况下指定片索引的元组,并且nnu121基于地址元组来计算选择性数据存储4652的行以及该行内的块索引。在这样的实施例中,由于l3高速缓存器4005正利用选择性数据存储4652作为牺牲高速缓存器4602(即,处于牺牲高速缓存器模式),因此nnu121知道l3高速缓存器4005发送了包括地址元组的事务,并且nnu121知道nnu121需要基于地址元组来计算行和块索引。在一个实施例中,事务包括指示模式的标志;在另一实施例中,nnu121还包括l3高速缓存器4005模式指示符4699得到更新时被更新的模式指示符(例如,与图41的模式指示符4199类似)。在一个实施例中,nnu121使用(以上针对图41所述的)高速缓存器行启动来选择选择性数据存储4652的高速缓存器行或块,以使得能够进行对选择性数据存储4652的写入。在另一实施例中,nnu121执行读取-修改-写入操作以将被驱逐的高速缓存器行写入选择性数据存储4652中。流程结束于方框4806。在方框4808处,控制逻辑4644从l3数据存储4606读取指定的高速缓存器行并将其写入系统存储器4618。另外,控制逻辑4644将标记目录4642更新为指示高速缓存器行不再存在于l3高速缓存器4005中,例如,更新为无效的mesi状态。优选地,为了将高速缓存器行写入系统存储器4618,控制逻辑4644产生针对其环站4004-0中的队列(例如,填充队列)的请求,该请求转而在环形总线4024上产生针对dram控制器4018的环站4004-m中的从属存储队列的从属存储事务。流程结束于方框4808。现参考图49,示出一流程图,该流程图示出图46的处理器4000进行高速缓存器行从牺牲高速缓存器4602至核心4002的加载请求的操作。流程始于方框4902。在方框4902处,l3高速缓存器4005接收来自核心4002的用以从指定存储器地址加载数据的请求。流程进入方框4904。在方框4904处,控制逻辑4644从标记目录4642读取存储器地址所涉及的标记目录集合4700,并检查其l3标记4702和牺牲高速缓存器标记4704。流程进入决策方框4906。在决策方框4906处,如果控制逻辑4644根据l3标记4702确定为存储器地址命中l3高速缓存器4005,则流程进入方框4908,;否则,流程进入决策方框4912。在方框4908处,控制逻辑4644从l3数据存储4606读取指定的高速缓存器行并将其提供至核心4002。流程结束于方框4908。在决策方框4912处,如果控制逻辑4644根据牺牲高速缓存器标记4704确定为存储器地址命中牺牲高速缓存器4602,则流程进入方框4914,;否则,流程进入决策方框4916。在方框4914处,控制逻辑4644从选择性数据存储4652读取指定的高速缓存器行并将其提供至核心4002。优选地,为了从选择性数据存储4652读取高速缓存器行,控制逻辑4644产生针对其环站4004-0中的队列(例如,填充队列)的请求,该请求转而在环形总线4024上产生针对nnu121的环站4004-n中的从属加载队列的从属加载事务。事务包括用于使得nnu121能够确定其要从中读取高速缓存器行的选择性数据存储4652内的位置的地址。优选地,控制逻辑4644采用与以上针对方框4806所述的实施例其中之一类似的方式生成地址。另外,在一个实施例中,控制逻辑4644将从选择性数据存储4652读取的高速缓存器行(高速缓存器行a)与l3数据存储4606(即l3高速缓存器4005)中的另一高速缓存器行(高速缓存器行b)互换。互换可以是有利的,这是因为牺牲高速缓存器4602中的高速缓存器行的命中可以是如下的指示:高速缓存器行a可以比高速缓存器行b更早和/或更频繁地被访问、并且将高速缓存器行a移动至l3高速缓存器4005可以减少后续访问的延迟。将从选择性数据存储4652读取的高速缓存器行a与l3数据存储4606中所保持的高速缓存器行b进行互换意味着:(1)将行b的标记和状态(例如,mesi状态)写入标记目录4642中的、与行a占用的位置相对应的标记中;(2)将行a的标记和状态(例如,mesi状态)写入标记目录4642中的、与行b先前占用的位置相对应的标记中;(3)从l3数据存储4606读取行b;(4)从选择性数据存储4652读取行a并将其写入l3数据存储4606;以及(5)将行b写入选择性数据存储4652。互换高速缓存器行可以另外涉及更新标记目录集合4700中所保持的、与所涉及集合相对应的替换信息4706(例如,lru信息)。在备选实施例中,控制逻辑4644不互换高速缓存器行,而是仅将从选择性数据存储4652读取的高速缓存器行提供给核心4002。流程结束于方框4914。在方框4916处,控制逻辑4644从系统存储器4618读取指定的高速缓存器行并将其提供至核心4002。流程结束于方框4916。现参考图50,示出一流程图,该流程图示出在图46的选择性数据存储4652正从用作nnu121的权重ram124/数据ram122时的nnu模式转换为用作牺牲高速缓存器4602时的牺牲高速缓存器模式的情况下的图46的处理器4000的操作。牺牲高速缓存器是用于仅保持由处理器4000的高速缓存器阶层结构中较低的高速缓存存储器所驱逐的高速缓存器行的高速缓存存储器。例如,l2高速缓存器4008和/或l1数据/指令高速缓存器是低级高速缓存器。另外,在选择性数据存储4652可用作牺牲高速缓存器4602的实施例中,llc4005被认为是3级(l3)高速缓存器并且相对于牺牲高速缓存器4602而言被认为是低级高速缓存器,并且l3高速缓存器4005将高速缓存器行驱逐至牺牲高速缓存器4602。牺牲高速缓存器在地址命中牺牲高速缓存器时(例如,响应于加载请求或监听请求)提供数据。在一个实施例中,l3高速缓存器4005包括l2高速缓存器4008以及核心复合体4012的低级高速缓存器,并且牺牲高速缓存器4602提供命中数据以分配至l3高速缓存器4005中,该l3高速缓存器4005转而将数据提供给l2高速缓存器4008,该l2高速缓存器4008转而将数据提供给更低级的高速缓存器。在另一实施例中,核心复合体4012的l3高速缓存器4005、l2高速缓存器4008和更低级的高速缓存器不是包含性的,并且牺牲高速缓存器提供命中数据以直接分配各级高速缓存器。有利地,当模式4699被设置为牺牲高速缓存器模式时,图46的控制逻辑4644和选择性数据存储4652以及标记目录4642在图50和图51的实施例中共同用作牺牲高速缓存器4602。在一个实施例中,牺牲高速缓存器4602可以用作对被驱逐至该牺牲高速缓存器4602的修改后的高速缓存器行进行高速缓存的回写高速缓存器,并且还可以用作不对被驱逐至该牺牲高速缓存器4602的修改后的高速缓存器行进行高速缓存、而是将修改后的高速缓存器行转发至系统存储器4618的直写高速缓存器。如根据图51的说明(更具体地,方框5106、5108和5112)可以发现,直写牺牲高速缓存器4602具有快速转换为在nnu模式下使用选择性数据存储4652作为权重ram124的优点,而回写牺牲高速缓存器4602可以具有针对处理器4000的总体高速缓存效率更高的优点。优选地,牺牲高速缓存器4602可配置为回写模式或直写模式。流程始于方框5002。在方框5002处,请求从使用选择性数据存储4652作为nnu121的权重ram124转换为使用选择性数据存储4652作为核心复合体4012所共享的牺牲高速缓存器4602。优选地,与以上针对方框4302所述的方式类似,通过处理器4000上运行的操作系统来控制转换。流程进入方框5004。在方框5004处,模式4699被更新为指示牺牲高速缓存器模式以使得控制逻辑4644使用选择性数据存储4652作为牺牲高速缓存器4602。流程进入方框5006。在方框5006处,l3高速缓存器4005被告知开始将驱逐请求引导至牺牲高速缓存器4602。流程进入方框5008。在方框5008处,牺牲高速缓存器4602开始(例如采用以上针对图48所述的方式)对牺牲数据进行高速缓存。流程进入方框5012。在方框5012处,l3高速缓存器4005检测标记目录4642中的命中图47的牺牲高速缓存器标记4704的地址,并(例如,采用以上针对图49所述的方式)向nnu121发送针对来自选择性数据存储4652的所涉及的高速缓存器行的请求。流程结束于方框5012。现参考图51,示出一流程图,该流程图示出在图46的选择性数据存储4652正从用作牺牲高速缓存器4602时的牺牲高速缓存器模式转换为用作nnu121的权重ram124/数据ram122时的nnu模式的情况下的图46的处理器4000的操作。如上所述,牺牲高速缓存器4602可以正用作直写型高速缓存器或者作为回写型高速缓存器。流程始于方框5102。在方框5102处,请求从使用选择性数据存储4652作为牺牲高速缓存器4602转换为使用选择性数据存储4652作为nnu121的权重ram124。优选地,该转换由处理器4000上运行的操作系统来控制。例如,处理器4000上运行的应用程序请求操作系统使用nnu121,并且操作系统检测为选择性数据存储4652当前正用作牺牲高速缓存器4602,因此需要从牺牲高速缓存器模式转换为nnu模式。流程进入方框5104。在方框5104处,l3高速缓存器4005被告知停止将驱逐引导至牺牲高速缓存器4602。流程进入决策方框5106。在决策方框5106处,如果牺牲高速缓存器4602正用作直写型高速缓存器,则流程进入方框5112;否则,流程进入方框5108。在方框5108处,控制逻辑4644对牺牲高速缓存器4602进行回写无效。也就是说,牺牲高速缓存器4602将其所有修改后的高速缓存器行写回至系统存储器4618,然后(通过针对所有高速缓存器行将标记目录4642中的状态更新为无效;优选地,控制逻辑4644还对标记目录4642中的替换信息进行重设)使其所有高速缓存器行无效。在一个实施例中,控制逻辑4644从选择性数据存储4652读取修改后的高速缓存器行,然后将其写入系统存储器4618。可选地,控制逻辑4644向nnu121(例如,向csr127)发送命令,其中该命令指定选择性数据存储4652内的修改后的高速缓存器行的地址、指定系统存储器地址、并且指示nnu121将修改后的高速缓存器行直接写入系统存储器4618。优选地,控制逻辑4644在进行回写无效的同时继续对加载请求和监听请求进行响应。流程进入方框5116。在方框5112处,控制逻辑4644对选择性数据存储4652进行无效操作。也就是说,控制逻辑4644更新标记目录4642以使选择性数据存储4652的所有高速缓存器行无效。可以发现,如果牺牲高速缓存器4602正用作直写型高速缓存器,则由于无需进行方框5108处的对修改后的高速缓存器行的回写(即,仅需要进行方框5112这里的无效),因此转换为使用选择性数据存储4652作为权重ram124可以有利地比牺牲高速缓存器4602正用作回写型高速缓存器的情况更快,这在牺牲高速缓存器4602相对大的情况下可以是一种相当大的节省。流程进入方框5116。在方框5116处,如同针对方框4212所述的方式,模式4699被更新为指示nnu模式,以使得控制逻辑4644不将选择性数据存储4652用作牺牲高速缓存器,从而使得该选择性数据存储4652可以用作npu流水线126以及核心4002上执行的架构程序所要访问的权重ram124。流程进入方框5118。在方框5118处,核心4002上执行的架构程序可以用作npu流水线126所要访问的权重ram124。流程结束于方框5118。现参考图52,示出一框图,该框图示出nnu121的一部分的实施例。nnu121包括移动单元5802、移动寄存器5804、数据复用寄存器208、权重复用寄存器705、npu126、复用器5806、输出单元5808、以及输出寄存器1104。数据复用寄存器208和权重复用寄存器705与上述的相同,但是被修改为额外地接收来自移动寄存器5804以及来自额外的相邻npu126的输入。在一个实施例中,除如上所述来自j+1的输出209以外,数据复用寄存器208还在输入211上接收来自npuj-1和j-4的输出209;同样,除如上所述来自j+1的输出203以外,权重复用寄存器705还在输入711上接收来自npuj-1和j-4的输出203。输出寄存器1104与上述被称为行缓存器1104和输出缓存器1104的缓存器相同。输出单元5808在许多方面与上述的激活函数单元212/1112相同,相同之处在于其可以包括激活函数(例如,s型函数、双曲正切函数、校正函数、软加函数);然而,这些输出单元5808优选还包括用于对累加器202的值进行再量化的再量化单元。npu126在许多方面与上述相同。如上所述,设想了不同实施例,其中数据字宽度和权重字宽度可以具有各种大小(例如,8位、9位、12位或16位),并且多个字大小可以被给定实施例支持(例如,8位和16位)。然而,针对下图示出代表性实施例,其中保持在存储器122/124、移动寄存器5804、复用寄存器208/705以及输出寄存器1104中的数据字宽度和权重字宽度是8位字,即字节。图52示出nnu121的截面。例如,所示的npu126是(诸如上述等的)npu126的阵列的代表。代表性npu126指的是n个npu126中的npu[j]126,其中j在0和n-1之间。如上所述,n是较大的数,并且优选为2的幂次方。如上所述,n可以是512、1024或2048。在一个实施例中,n是4096。由于阵列中的大量npu126,因此有利的是,各npu126尽可能小,以将nnu121的大小保持在期望限度内和/或容纳更多npu126以增加nnu121所进行的神经网络相关计算的加速性。此外,尽管移动单元5802和移动寄存器5804各自的宽度为n个字节,但是仅示出移动寄存器5804的一部分。具体地,示出移动寄存器5804中的输出5824向npu[j]126的复用寄存器208/705提供字节的部分,该部分表示为移动寄存器[j]5804。此外,尽管移动单元5802的输出5822(向存储器122/124和移动寄存器5804)提供n个字节,但是仅字节j被提供用于加载到移动寄存器[j]5804中,该移动寄存器[j]5804随后在输出5824上将字节j提供至数据复用寄存器208和权重复用寄存器705。此外,尽管nnu121包括多个输出单元5808,但图52中仅示出单个输出单元5808,即对npu组内的npu[j]126以及多个npu126(诸如以上针对图11所述的npu126等)的累加器输出217执行运算的输出单元5808。输出单元5808被称为输出单元[j/4],这是因为,在图52的实施例中,各输出单元5808由四个一组的npu126所共享。同样,尽管nnu121包括多个复用器5806,但图52中仅示出单个复用器5806,即接收其npu组内的npu[j]126以及多个npu126的累加器输出217的复用器5806。同样,复用器5806指的是复用器[j/4],这是因为该复用器5806在四个累加器202输出217中选择其一以提供至输出单元[j/4]5808。最后,尽管输出寄存器1104的宽度为n个字节,但在图52中仅示出单个4字节段(表示为输出寄存器[j/4]1104),其中该4字节段从包括npu[j]126的npu组的四个npu126接收由输出单元[j/4]5808所产生的四个量化字节。输出寄存器1104的输出133中的所有n个字节被提供至移动单元5802,但是在图52中仅示出输出寄存器[j/4]1104的四字节段中的四个字节。此外,输出寄存器[j/4]1104的四字节段中的四个字节被作为输入提供至复用寄存器208/705。尽管在图52中复用寄存器208/705被示出为与npu126不同,但存在与各npu126相关联的一对相应的复用寄存器208/705,并且如以上针对图2和图7所述,这些复用寄存器208/705可被认为是npu126的一部分。移动单元5802的输出5822被耦接至移动寄存器5804、数据ram122和权重ram124,其各自可以被输出5822写入。移动单元5802的输出5822、移动寄存器5804、数据ram122和权重ram124的宽度都是n个字节(例如,n是4906)。移动单元5802从如下的五个不同源接收n个量化字节并且选择其中之一作为其输入:数据ram122、权重ram124、移动寄存器5804、输出寄存器1104以及即时值。优选地,移动单元5802包括互连以能够对其输入执行运算从而产生其输出5822的多个复用器,现将对这些运算进行说明。移动单元5802对其输入执行的运算包括:使输入通过至输出;使输入轮转指定量;以及提取并且压紧输入的指定字节。在从程序存储器129拾取的move指令中指定运算。在一个实施例中,可指定的轮转量为8、16、32和64字节。在一个实施例中,轮转方向向左,但是也设想了轮转方向向右或任意方向的其它实施例。在一个实施例中,提取和压紧运算是在预定大小的输入块内执行的。块大小由move指令所指定。在一个实施例中,预定块大小为16、32和64字节,并且这些块位于指定块大小的对齐边界上。因此,例如,当move指令指定块大小为32时,移动单元5802提取输入的n个字节的各32字节块(例如,如果n为4096,则存在128个块)内的指定字节,并且将其压紧在相应的32字节块内(优选在块的一端)。在一个实施例中,nnu121还包括与移动寄存器5804相关联的n位掩码寄存器(未示出)。指定加载掩码寄存器操作的move指令可以指定数据ram122或权重ram124的行作为其源。响应于move指令指定加载掩码寄存器的操作,移动单元5802从ram的行的n个字中的各字中提取位0,并将n个位储存到n位掩码寄存器的相应位中。在执行用于写入移动寄存器5804的后续move指令期间,位掩码中的位用作移动寄存器5804的相应字节的写入启用/禁用。在备选实施例中,64位掩码由initialize指令指定,该指令用于在执行用以指定提取和压紧功能的move指令之前加载到掩码寄存器中;响应于move指令,移动单元5802提取由储存在掩码寄存器中的64位掩码所指定的(例如,128个块中的)每个块内的字节。在备选实施例中,用于指定提取和压紧运算的move指令还指定步幅和偏移;响应于move指令,移动单元5802从由偏移指定的字节开始在各块内每n个字节进行一次提取,其中n是步幅,并且将所提取的字节压缩在一起。例如,如果move指令指定步幅为3且偏移为2,则移动单元5802在每个块内从字节2开始每三个字节进行一次提取。现参考图53,示出一框图,该框图更详细地示出图46的环站4004-n。环站4004-n包括从属接口6301、被称为主接口0的第一主接口6302-0、以及被称为主接口1的第二主接口6302-1。主接口06302-0和主接口16302-1一般地被个别地称为主接口6302或者共同称为(多个)主接口6302。环站4004-n还包括耦接至在环形总线4024的第一单向环4024-0上分别提供传出请求(req)、数据(data)和确认(ack)的各缓存器6352、6354和6356的三个仲裁器6362、6364和6366;这三个仲裁器6362、6364和6366在第一单向环4024-0上分别接收传入请求(req)、数据(data)和确认(ack)。环站4004-n包括耦接至在环形总线4024的第二单向环4024-1上分别提供传出请求(req)、数据(data)和确认(ack)的各附加缓存器6332、6334和6336的三个附加仲裁器6342、6344和6346;这三个仲裁器6342、6344和6346在第二单向环4024-1上分别接收传入请求(req)、数据(data)和确认(ack)。以上描述了环形总线4024的各单向环的请求子环、数据子环和确认子环。监听子环和信用子环未示出,但是从属接口6301和主接口6302也耦接至监听子环和信用子环。从属接口6301包括加载队列6312和储存队列6314;主接口06302-0包括加载队列6322和储存队列6324;以及主接口16302-1包括加载队列6332和储存队列6334。从属接口6301的加载队列6312接收来自环形总线4024的单向环4024-0和4024-1两者的请求并对这些请求进行排队,并且向环形总线4024的相应仲裁器6364和6344中的各仲裁器提供队列化的数据。从属接口6301的储存队列6314接收来自环形总线4024的两个方向的数据并对这些数据进行排队,并且向环形总线4024的相应仲裁器6366和6346中的各仲裁器提供确认。主接口06302-0的加载队列6322接收来自第二单向环4024-1的数据,并向第一单向环4024-0的仲裁器6362提供队列化的请求。主接口06302-0的储存队列6324接收来自第二单向环4024-1的确认,并向第一单向环4024-0的仲裁器6364提供队列化的数据。主接口16302-1加载队列6332接收来自第一单向环4024-0的数据,并向第二单向环4024-1的仲裁器6342提供队列化的请求。主接口16302-1的储存队列6334接收来自第一单向环4024-0的确认,并向第二单向环4024-1的仲裁器6344提供队列化的数据。从属接口6301的加载队列6312将队列化的请求提供至nnu121,并接收来自nnu121的数据。从属接口6301的储存队列6314将队列化的请求和数据提供至nnu121,并接收来自nnu121的确认。第一主接口06302-0的加载队列6322接收来自nnu121的请求并对这些请求进行排队,并且向nnu121提供数据。第一主接口06302-0的储存队列6324接收来自nnu121的请求和数据并对这些请求和数据进行排队,并且向nnu121提供确认。第二主接口16302-1的加载队列6332接收来自nnu121的请求并对这些请求进行排队,并且向nnu121提供数据。第二主接口16302-2的储存队列6334接收来自nnu121的请求和数据并对这些请求和数据进行排队,并且向nnu121提供确认。通常,从属接口6301接收核心4002所作出的从nnu121加载数据的请求(由加载队列6312接收)并且接收核心4002所作出的将数据储存至nnu121的请求(由储存队列6314接收),但是从属接口6301还可以从诸如l3高速缓存器4005等的其它环形总线4024代理接收这样的请求,其中该l3高速缓存器4005在如上所述在用作牺牲高速缓存器4602时相对于选择性数据存储4652(例如,权重ram124或数据ram122)读取/写入高速缓存器行。例如,经由从属接口6301,核心4002可以:相对于控制/状态寄存器127写入控制数据并且读取状态数据;将指令写入程序存储器129;相对于数据ram122和权重ram124写入/读取数据/权重;以及将控制字写入总线控制器存储器6636以对nnu121的dma控制器6602(见图56)进行编程。更具体地,在nnu121位于环形总线4024上而非作为核心4002的执行单元的实施例中,核心4002可以对控制/状态寄存器127进行写入以指示nnu121执行与针对图14的mtnn指令1400所述的类似的操作,并且可以从控制/状态寄存器127进行读取以指示nnu121执行与针对图15的mfnn指令1500所述的类似的操作。操作的列表包括但不限于:开始程序存储器129中的程序的执行、暂停程序存储器129中的程序的执行、对程序存储器129中的程序的执行完成的请求通知(例如,中断)、对nnu121进行重设、写入dma基址寄存器、以及写入选通(strobe)地址以使得相对于数据/权重ram122/124写入或读取行缓存器。此外,从属接口6301可以在nnu121的请求下向每个核心4002产生中断(例如,pci中断)。优选地,定序器128指示从属接口6301例如响应于对从程序存储器129拾取的指令进行解码而产生中断。可选地,dmac6602可指示从属接口6301例如响应于完成dma操作(例如,在将作为神经网络层计算结果的数据字从数据ram122写入系统存储器之后)而产生中断。在一个实施例中,中断包括向量,诸如8位x86中断向量等。优选地,由dmac6602从总线控制存储器6636读取的控制字中的标志指定dmac6602是否指示从属接口6301在dma操作完成时产生中断。通常,nnu121经由主接口6302产生将数据写入系统存储器的请求(由储存队列6324/6334接收),并且经由主接口6302产生(例如,经由dram控制器4018)从系统存储器读取数据的请求(由加载队列6322/6332接收),但主接口6302还可以接收来自nnu121的相对于其它环形总线4024代理读取/写入数据的请求。例如,经由主接口6302,nnu121可以将数据/权重从系统存储器传输到数据ram122和权重ram124,并且可以将数据从数据ram122和权重ram124传输到系统存储器。nnu121还可以经由主存储队列6324/6334而生成将高速缓存器行写入系统存储器4618(例如,针对图51中的各块5108写回修改后的高速存储器行)的请求。优选地,经由环形总线4024可访问的nnu121的各种实体(诸如数据ram122、权重ram124、程序存储器129、总线控制存储器6636和控制/状态寄存器127等)被存储器映射到系统存储器空间内。在一个实施例中,可访问的nnu121实体经由周知的外围组件互连(pci)配置协议的pci配置寄存器来进行存储器映射。具有针对环站4004-n的两个主接口6302的优点在于,其使得nnu121能够相对于系统存储器(经由dram控制器4018)和各种l3片4006两者同时进行发送和/或接收,或者备选地能够以具有单个主接口的实施例的两倍带宽相对于系统存储器并行地进行发送和/或接收。在一个实施例中,数据ram122是64kb,其被布置为每行4kb的16行,因此需要4个位来指定其行地址;权重ram124为8mb,其被布置为每行4kb的2k行,因此需要11个位来指定其行地址;程序存储器129为8kb,其被布置为每行64位的1k行,因此需要10个位来指定其行地址;总线控制存储器6636是1kb,其被布置为每行64位的128行,因此需要7个位来指定其行地址;队列6312/6314/6322/6324/6332/6334中的各队列包括16个条目,因此需要4个位来指定条目的索引。另外,环形总线4024的单向环4024的数据子环的宽度为64字节。因此,64字节的部分在本文中被称为块、数据块、数据的块等(“数据”一般可用于指代数据和权重这两者)。因此,数据ram122或权重ram124的行尽管根据一个实施例在块水平上不可寻址,但各自被细分为64个块;此外,(图56的)数据/权重写入缓存器6612/6622和(图56的)数据/权重读取缓存器6614/6624各自也被细分为各自具有64字节的64个块,并且在块水平上可寻址;因此,需要6个位来指定行/缓存器内的块的地址。以下描述为了便于说明而假定这些大小;然而,设想了各种大小不同的其它实施例。现参考图54,示出一框图,该框图更详细地示出图53的从属接口6301。从属接口6301包括耦接至图53的环形总线4024的加载队列6312、储存队列6314、仲裁器6342、6344、6346、6362、6364和6366、以及缓存器6332、6334、6336、6352、6354和6356。图54还包括产生对仲裁器6362的请求的其它请求器6472(例如,主接口06302-0)以及产生对仲裁器6342的请求的其它请求器6474(例如,主接口16302-1)。从属加载队列6312包括耦接至请求仲裁器6416和数据仲裁器6414的条目6412的队列。在所示的实施例中,队列包括16个条目6412。每个条目6412包括用于地址、源标识符、方向、事务标识符以及与请求相关联的数据块的存储。地址指定nnu121内的加载所请求的数据以返回到请求方环形总线4024代理(例如,核心4002)的位置。地址可以指定控制/状态寄存器127、或数据ram122或权重ram124内的块位置。在地址指定数据ram122/权重ram124内的块位置的情况下,在一个实施例中,高位指定数据ram122/权重ram124的行,而低位(例如,6个位)指定所指定的行内的块。优选地,低位用于控制数据/权重读取缓存复用器6615/6625(见图56)以选择数据/权重读取缓存器6614/6624内的适当块(见图56)。源标识符指定请求方环形总线4024代理。方向指定要在两个单向环4024-0或4024-1中的哪一个单向环上将数据发送回至请求方代理。事务标识符由请求方代理指定,并由环站4004-n连同所请求的数据一起返回给请求方代理。每个条目6412也具有相关联的状态。有限状态机(fsm)更新状态。在一个实施例中,fsm按照如下进行操作。当加载队列6312检测到环形总线4024上以其为目的地的加载请求时,该加载队列6312分配可用条目6412并填充所分配的条目6412,并且fsm将所分配的条目6412的状态更新为请求方nnu。请求仲裁器6416在请求方nuu条目6412之间进行仲裁。当所分配的条目6412赢得仲裁并作为请求发送至nnu121时,fsm将条目6412标记为待处理nnu数据。当nnu121利用该请求的数据进行响应时,加载队列6312将数据加载到条目6412中并将条目6412标记为请求方数据环。数据仲裁器6414在请求方数据环条目6412之间进行仲裁。当条目6412赢得仲裁并且数据在环形总线4024上被发送至请求数据的环形总线4024代理时,fsm将条目6412标记为可用并且在其信用环上发出信用。从属储存队列6314包括耦接至请求仲裁器6426和确认仲裁器6424的条目6422的队列。在所示的实施例中,队列包括16个条目6422。每个条目6422包括用于地址、源标识符、以及与请求相关联的数据的存储。地址指定nnu121内的由请求方环形总线4024代理(例如,核心4002)提供的数据要储存至的位置。地址可以指定控制/状态寄存器127、数据ram122或权重ram124内的块位置、程序存储器129内的位置、或者总线控制存储器6636内的位置。在地址指定数据ram122/权重ram124内的块位置的情况下,在一个实施例中,高位指定数据ram122/权重ram124的行,而低位(例如,6个位)指定所指定的行内的块。优选地,低位用于控制数据/权重解复用器6611/6621以选择数据/权重写入缓存器6612/6622内的适当块进行写入(见图56)。源标识符指定请求方环形总线4024代理。每个条目6422也具有相关联的状态。有限状态机(fsm)更新状态。在一个实施例中,fsm按照如下进行操作。当储存队列6314检测到环形总线4024上以其为目的地的储存请求时,该储存队列6314分配可用条目6422并填充所分配的条目6422,并且fsm将所分配的条目6422的状态更新为请求方nnu。请求仲裁器6426在请求方nuu条目6422之间进行仲裁。当条目6422赢得仲裁并与条目6422的数据一起被发送至nnu121时,fsm将条目6422标记为待处理nnu确认。当nnu121利用确认进行响应时,储存fsm将条目6422标记为请求方确认环。确认仲裁器6424在请求方确认环条目6422之间进行仲裁。当条目6422赢得仲裁并且在确认环上将确认被发送至请求储存数据的环形总线4024代理时,fsm将条目6422标记为可用并且在其信用环上发出信用。储存队列6314还从nnu121接收wr_busy信号,其中该wr_busy信号指示储存队列6314不从nnu121进行请求,直到wr_busy信号不再有效为止。现参考图55,示出一框图,该框图更详细地示出图53的主接口06302-0。尽管图55示出主接口06302-0,但该主接口06302-0还代表了图53的主接口16302-1的细节,因此将被一般地称为主接口6302。主接口6302包括耦接至图53的环形总线4024的加载队列6322、储存队列6324、仲裁器6362、6364和6366、以及缓存器6352、6354和6356。图55还示出产生针对仲裁器6366的确认请求的其它确认请求器6576(例如,从属接口6301)。主接口6302还包括仲裁器6534(图53中未示出),其中该仲裁器6534从加载队列6322以及从其它请求器6572(例如,nnu121和dram控制器4018共享环站4004-n的实施例中的dram控制器4018)接收请求,并将赢得仲裁请求呈现给图53的仲裁器6362。主接口6302还包括缓存器6544,其中该缓存器6544从环形总线4024接收与加载队列6312的条目6512相关联的数据,并将其提供给nnu121。主接口6302还包括仲裁器6554(图53中未示出),其中该仲裁器6554从储存队列6324以及从其它请求器6574(例如,nnu121和dram控制器4018共享环站4004-n的实施例中的dram控制器4018)接收数据,并将赢得仲裁数据呈现给图53的仲裁器6364。主接口6302还包括缓存器6564,其中该缓存器6564从环形总线4024接收与储存队列6314的条目6522相关联的确认,并将其提供给nnu121。加载队列6322包括耦接至仲裁器6514的条目6512的队列。在所示的实施例中,队列包括16个条目6512。每个条目6512包括用于地址和目的地标识符的存储。地址指定环形总线4024地址空间中(例如,系统存储器位置)的地址(在一个实施例中为46位)。目的地标识符指定将从中加载数据的环形总线4024代理(例如,系统存储器)。加载队列6322从nnu121(例如,从dmac6602)接收主加载请求,以将来自环形总线4024代理(例如,系统存储器)的数据加载到数据ram122或权重ram124中。主加载请求指定目的地标识符、环形总线地址以及要使用的加载队列6322条目6512的索引。当加载队列6322从nnu121接收到主加载请求时,加载队列6322填充索引后的条目6512,并且fsm将条目6512状态更新为请求方信用。当加载队列6322从信用环获得信用以向目的地环形总线4024代理(例如,系统存储器)发送对数据的请求时,fsm将状态更新为请求方请求环。仲裁器6514在请求方请求环条目6512之间进行仲裁(并且仲裁器6534在加载队列6322和其它请求器6572之间进行仲裁)。当条目6512被授予请求环时,在请求环上向目的地环形总线4024代理(例如,系统存储器)发送请求,并且fsm将状态更新为待处理数据环。当环形总线4024利用(例如来自系统存储器的)数据进行响应时,该数据被接收在缓存器6544中。并被提供给nnu121(例如,提供给数据ram122、权重ram124、程序存储器129或总线控制存储器6636),并且fsm将条目6512状态更新为可用。优选地,条目6512的索引被包括在数据包内,以使得加载队列6322能够确定与数据包相关联的条目6512。优选地,加载队列6322将条目6512索引连同数据一起提供给nnu121,以使得nnu121能够确定数据与哪个条目6512相关联并且使得nnu121能够重新使用条目6512。主储存队列6324包括耦接至仲裁器6524的条目6522的队列。在所示的实施例中,队列包括16个条目6522。每个条目6522包括用于地址、目的地标识符、用于保持要储存的数据所用的数据字段以及相干标志的存储。地址指定环形总线4024地址空间(例如,系统存储器位置)中的地址。目的地标识符指定数据将被储存至其中的环形总线4024代理(例如,系统存储器)。相干标志与数据一起被发送至目的地代理。如果设置了相干标志,则该相干标志指示dram控制器4018监听l3高速缓存器4005和牺牲高速缓存器4602并且使副本(如果其存在的话)无效。否则,dram控制器4018在不监听l3高速缓存器4005和牺牲高速缓存器4602的情况下将数据写入系统存储器。储存队列6324从nnu121(例如,从dmac6602)接收主储存请求,以将数据从数据ram122或权重ram124储存至环形总线4024代理(例如,系统存储器)。主储存请求指定目的地标识符、环形总线地址、要使用的储存队列6324条目6522的索引、以及要储存的数据。当储存队列6324从nnu121接收到主储存请求时,该储存队列6324填充所分配的条目6522,并且fsm将条目6522状态更新为请求方信用。当储存队列6324从信用环获得信用以向目的地环形总线4024代理(例如,系统存储器)发送数据时,fsm将状态更新为请求方数据环。仲裁器6524在请求方数据环条目6522之间进行仲裁(并且仲裁器6554在储存队列6324和其它请求器6574之间进行仲裁)。当条目6522被授予数据环时,在数据环上向目的地环形总线4024代理(例如,系统存储器)发送数据,并且fsm将状态更新为待处理确认环。当环形总线4024利用对数据的(例如,来自系统存储器的)确认进行响应时,在缓存器6564中接收到该确认。然后,储存队列6324向nnu121提供确认,以向该nnu121通知已经执行了储存,并且fsm将条目6522状态更新为可用。优选地,储存队列6324不必仲裁以向nnu121提供确认(例如,如图56的实施例中那样,对于每个储存队列6324存在dmac6602)。然而,在储存队列6324必须仲裁以提供确认的实施例中,当环形总线4024利用确认进行响应时,fsm将条目6522状态更新为请求方nnu完成,并且一旦条目6522赢得仲裁并且提供对nnu121的确认,fsm就将条目6522状态更新为可用。优选地,条目6522的索引被包括在从环形总线4024接收到的确认包内,这使得储存队列6324能够确定与确认包相关联的条目6522。储存队列6324将条目6522索引连同确认一起提供给nnu121,以使得nnu121能够确定数据与哪个条目6512相关联并且使得nnu121能够重新使用条目6522。现参考图56,示出一框图,该框图示出图53的环站4004-n以及nnu121的环形总线耦接实施例的一部分。示出环站4004-n的从属接口6301、主接口06302-0和主接口16302-1。图56的nnu121的环形总线耦接实施例包括上文中详细描述的数据ram122、权重ram124、程序存储器129、定序器128、控制/状态寄存器127的实施例。nnu121的环形总线耦接实施例在许多方面与上述的执行单元实施例类似,并且为了简洁起见,这些方面将不被重新描述。nnu121的环形总线耦接实施例还包括图52中所述的元件,例如,移动单元5802、移动寄存器5804、复用寄存器208/705、npu126、复用器5806,输出单元5808、以及输出寄存器1104。nnu121还包括第一直接存储器访问控制器(dmac0)6602-0、第二直接存储器访问控制器(dmac1)6602-1、总线控制存储器6636、数据解复用器6611、数据写入缓存器6612、数据ram复用器6613、数据读取缓存器6614、数据读取缓存复用器6615、权重解复用器6621、权重写入缓存器6622、权重ram复用器6623、权重读取缓存器6624、权重读取缓存复用器6625、从属复用器6691、主0复用器6693、以及主1复用器6692。在一个实施例中,数据解复用器6611、数据写入缓存器6612、数据读取缓存器6614、数据读取缓存复用器6615、权重解复用器6621、权重写入缓存器6622、权重读取缓存器6624和权重读取缓存复用器6625中的三个各自分别与环形总线4024的从属接口6301、主接口06302-0和主接口16302-1相关联。在一个实施例中,以数据解复用器6611、数据写入缓存器6612、数据读取缓存器6614、数据读取缓存复用器6615、权重解复用器6621、权重写入缓存器6622、权重读取缓存器6624和权重读取缓存复用器6625中的三个为一对,这三个各自分别与环形总线4024的从属接口6301、主接口06302-0和主接口16302-1相关联,从而支持双重缓存方式的数据传输。数据解复用器6611分别被耦接以接收来自从属接口6301、主接口06302-0和主接口16302-1的数据块。数据解复用器6611还分别耦接至数据写入缓存器6612,数据写入缓存器6612耦接至数据ram复用器6613,数据ram复用器6613耦接至数据ram122,数据ram122耦接至数据读取缓存器6614,数据读取缓存器6614分别耦接至数据读取缓存复用器6615,数据读取缓存复用器6615耦接至从属复用器6691、主0复用器6693和主1复用器6692。从属复用器6691耦接至从属接口6301,主0复用器6693耦接至主接口06302-0,并且主1复用器6692耦接至主接口16302-1。权重解复用器6621分别被耦接以接收来自从属接口6301、主接口06302-0和主接口16302-1的数据块。权重解复用器6621还分别耦接至权重写入缓存器6622,权重写入缓存器6622耦接至权重ram复用器6623,权重ram复用器6623耦接至权重ram124,权重ram124耦接至权重读取缓存器6624,权重读取缓存器6624分别耦接至权重读取缓存复用器6625,权重读取缓存复用器6625耦接至从属复用器6691、主0复用器6693和主1复用器6692。数据ram复用器6613和权重ram复用器6623还耦接至输出寄存器1104和移动寄存器5804。数据ram122和权重ram124还分别耦接至npu126的移动单元5802和数据复用寄存器208以及权重复用器寄存器705。控制/状态寄存器127耦接至从属接口6301。总线控制存储器6636耦接至从属接口6301、定序器128、dmac06602-0和dmac16602-1。程序存储器129耦接至从属接口6301和定序器128。定序器128耦接至程序存储器129、总线控制存储器6636、npu126、移动单元5802和输出单元5808。dmac06602-0还耦接至主接口06302-0,并且dmac16602-1还耦接至主接口16302-1。数据写入缓存器6612、数据读取缓存器6614、权重写入缓存器6622和权重读取缓存器6624是数据ram122和权重ram124的宽度,即npu126阵列的宽度,这里通常被称为n。因此,例如,在一个实施例中,存在4096个npu126,并且数据写入缓存器6612、数据读取缓存器6614、权重写入缓存器6622和权重读取缓存器6624的宽度为4096字节,但是设想了n是除4096以外的值的其它实施例。数据ram122和权重ram124一次被写入整个n字行。输出寄存器1104、移动寄存器5804和数据写入缓存器6612经由数据ram复用器6613写入数据ram122,其中该数据ram复用器6613选择其中之一以将一行字写入数据ram122。输出寄存器1104、移动寄存器5804和权重写入缓存器6622经由权重ram复用器6623写入权重ram124,其中该权重ram复用器6623选择其中之一以向权重ram124写入一行字。控制逻辑(未示出)控制数据ram复用器6613在数据写入缓存器6612、移动寄存器5804和输出寄存器1104之间进行仲裁以访问数据ram122,并且控制权重ram复用器6623在权重写入缓存器6622、移动寄存器5804和输出寄存器1104之间进行仲裁以访问权重ram124。数据ram122和权重ram124还一次读取整个n字行。npu126、移动单元5802和数据读取缓存器6614从数据ram122读取一行字。npu126、移动单元5802和权重读取缓存器6624从权重ram124读取一行字。控制逻辑还控制npu126(数据复用器寄存器208和权重复用器寄存器705)、移动单元5802和数据读取缓存器6614以确定它们中的哪一个(如果有的话)读取由数据ram122输出的一行字。在一个实施例中,针对图34或图57所述的微操作3418可以包括控制数据ram复用器6613、权重ram复用器662、npu126、移动单元5802、移动寄存器5804、输出寄存器1104、数据读取缓存器6614和权重读取缓存器6624的控制逻辑信号中的至少一些。数据写入缓存器6612、数据读取缓存器6614、权重写入缓存器6622和权重读取缓存器6624可在块大小对齐的块中寻址。优选地,数据写入缓存器6612、数据读取缓存器6614、权重写入缓存器6622和权重读取缓存器6624的块大小与环形总线4024数据子环的宽度相匹配。这使得环形总线4024适于对数据/权重ram122/124进行如下的读取/写入。通常,环形总线4024对数据写入缓存器6612的每个块执行块大小的写入,并且一旦数据写入缓存器6612的所有块都被填充,数据写入缓存器6612就将其n字内容写入数据ram122的整行。同样,环形总线4024对权重写入缓存器6622的每个块执行块大小的写入,并且一旦权重写入缓存器6622的所有块都被填充,权重写入缓存器6622就将其n字内容写入权重ram124的整行。相反,从数据ram122将n字行读取至数据读取缓存器6614中;然后环形总线4024从数据读取缓存器6614的每个块执行块大小的读取。同样,从权重ram124将n字行读取至权重读取缓存器6624中;然后环形总线4024从权重读取缓存器6624的每个块执行块大小的读取。尽管数据ram122和权重ram124在图56中表现为双端口存储器,但它们优选为单端口存储器,使得单个数据ram122端口被数据ram复用器6613和数据读取缓存器6614所共享,并且单个权重ram124端口被权重ram复用器6623和权重读取缓存器6624所共享。因此,整行读取/写入布置的优点在于,其通过具有单个端口使得数据ram122和权重ram124更小(在一个实施例中,权重ram124为8mb并且数据ram122为64kb),而环形总线4024相对于数据ram122和权重ram124的写入和读取消耗的带宽比写入单独块时消耗的带宽更少,因此为npu126、输出寄存器1104、移动寄存器5804和移动单元5802解放出更多的带宽,以进行n个字宽的行的访问。然而,设想了其它实施例,其中权重ram124和数据ram122的各个块可被写入/读取,以例如有助于它们用作牺牲高速缓存器4602的选择性数据存储4652,在该时间内,npu126、输出寄存器1104、移动寄存器5804和移动单元5802没有正在访问选择性数据存储4652。控制/状态寄存器127被提供至从属接口6301。从属复用器6691接收与从属接口6301相关联的数据读取缓存复用器6615的输出、以及与从属接口6301相关联的权重读取缓存复用器6625的输出,并选择其中之一以提供给从属接口6301。以这种方式,从属加载队列6312接收用于对由从属接口6301对控制/状态寄存器127、数据ram122或权重ram124作出的加载请求进行响应的数据。主0复用器6693接收与主接口06302-0相关联的数据读取缓存复用器6615的输出、以及与主接口06302-0相关联的权重读取缓存复用器6625的输出,并选择其中之一以提供给主接口06302-0。以这种方式,主接口06302-0接收用于对由主接口06302-0储存队列6324作出的储存请求进行响应的数据。主1复用器6692接收与主接口16302-1相关联的数据读取缓存复用器6615的输出、以及与主接口16302-1相关联的权重读取缓存复用器6625的输出,并选择其中之一以提供给主接口16302-1。以这种方式,主接口16302-1接收用于对由主接口16302-1储存队列6324作出的储存请求进行响应的数据。如果从属接口6301加载队列6312请求从数据ram122进行读取,则从属复用器6691选择与从属接口6301相关联的数据读取缓存复用器6615的输出;而如果从属接口6301加载队列6312请求从权重ram124进行读取,则从属复用器6691选择与从属接口6301相关联的权重读取缓存复用器6625的输出。同样,如果主接口06302-0储存队列请求从数据ram122读取数据,则主0复用器6693选择与主接口06302-0相关联的数据读取缓存复用器6615的输出;而如果主接口06302-0储存队列请求从权重ram124读取数据,则主0复用器6693选择与主接口06302-0相关联的权重读取缓存复用器6625的输出。最后,如果主接口16302-1储存队列请求从数据ram122读取数据,则主1复用器6692选择与主接口16302-1相关联的数据读取缓存复用器6615的输出;而如果主接口16302-1储存队列请求从权重ram124读取数据,则主1复用器6692选择与主接口16302-1相关联的权重读取缓存复用器6625的输出。因此,环形总线4024代理(例如,核心4002)可以经由从属接口6301加载队列6312从控制/状态寄存器127、数据ram122或权重ram124进行读取。此外,环形总线4024代理(例如,核心4002)可以经由从属接口6301储存队列6314向控制/状态寄存器127、数据ram122、权重ram124、程序存储器129或总线控制存储器6636进行写入。更具体地,核心4002可以将程序(例如,执行完全连接、卷积、池化、lstm或其它循环神经网络层计算的程序)写入程序存储器129,然后写入控制/状态寄存器127以开始程序。此外,核心4002可以将控制字写入总线控制存储器6636,以使dmac6602在数据ram122或权重ram124与环形总线4024代理(例如,系统存储器或l3高速缓存器4005)之间执行dma操作。定序器128还可以将控制字写入总线控制存储器6636,以使dmac6602在数据ram122或权重ram124与环形总线4024代理之间执行dma操作。最后,如以下更详细所述,dmac6602可以执行dma操作以执行环形总线4024代理(例如,系统存储器或l3高速缓存器4005)与数据/权重ram122/124之间的传输。从属接口6301、主接口06302-0和主接口16302-1彼此耦接以向其各自的数据解复用器6611和权重解复用器6621提供数据块。仲裁逻辑(未示出)在输出寄存器1104、移动寄存器5804和从属接口6301、主接口06302-0和主接口16302-1、数据写入缓存器6612之间为了对数据ram122的访问而进行仲裁,并且在输出寄存器1104、移动寄存器5804和从属接口6301、主接口06302-0和主接口16302-1、权重写入缓存器6622之间为了对权重ram124的访问而进行仲裁。在一个实施例中,写入缓存器6612/6622优先于输出寄存器1104和移动寄存器5804,并且从属接口6301优先于主接口6302。在一个实施例中,每个数据解复用器6611具有耦接至各自的数据写入缓存器6612的64个块的64个输出(每个输出优选为64字节)。数据解复用器6611在耦接至数据写入缓存器6612的适当块的输出上提供所接收到的块。同样,每个权重解复用器6611具有耦接至各自的权重写入缓存器6622的64个块的64个输出(每个输出优选为64字节)。权重解复用器6621在耦接至权重写入缓存器6622的适当块的输出上提供所接收到的块。当从属储存队列6314向其数据/权重解复用器6611/6621提供数据块时,该从属储存队列6314还向数据/权重解复用器6611/6621提供要进行写入的数据/权重写入缓存器6612/6622的适当块的地址作为控制输入。块地址是保持在条目6422中的地址的低六位,其由生成从属存储事务的环形总线4024代理(例如核心4002或控制逻辑4644)指定。相反,当加载储存队列6312从其数据/权重读取缓存复用器6615/6625请求数据块时,该加载储存队列6312还向数据/权重读取缓存复用器6615/6625提供要读取的数据/权重读取缓存器6614/6624的适当块的地址作为控制输入。块地址是保持于条目6412中的地址的低六位,其中该条目6412由产生从属加载事务的环形总线4024代理(例如,核心4002或控制逻辑4644)指定。优选地,核心4002可以经由(例如,到预定环形总线4024地址的)从属接口6301来执行从属储存事务,以使nnu121将数据/权重写入缓存器6612/6622的内容写入数据/重量ram122/124;相反,核心4002可以经由(例如,到预定环形总线4024地址的)从属接口6301来执行从属储存事务,以使nnu121将数据/权重ram122/124的行读取到数据/权重读取缓存器6614/6624中。当主接口6302加载队列6322/6332向其数据/权重解复用器6611/6621提供数据块时,该主接口6302加载队列6322/6332还将条目6512的索引提供至向加载队列6322/6332发出加载请求的相应dmac6602。为了将整个4kb的数据从系统存储器传输至数据/权重ram122/124的列,dmac6602必须产生64个主加载请求至加载队列6322/6332。dmac6602逻辑上将64个主加载请求分成四组,每组包含十六个请求。dmac6602将组内的16个请求传输至加载队列6322/6322的相应16个条目6512。dmac6602维持与每个条目6512索引相关联的状态。该状态指示四个组中的当前正使用条目来加载数据块的那一组。因此,当dmac6602从加载队列6322/6322接收条目6512索引时,dmac6602的逻辑通过将组号与索引串联来构造块地址,并将构造的块地址作为控制输入提供给数据/权重解复用器6611/6621。相反,当主接口6302储存队列6324/6334从其数据/权重缓存复用器6615/6625请求数据块时,该主接口6302加载队列6324/6334还将条目6522的索引提供至向储存队列6322/6332发出储存请求的相应dmac6602。为了将整个4kb的数据从数据/权重ram122/124的行传输至系统存储器,dmac6602必须产生64个主储存请求至储存队列6324/6334。dmac6602逻辑上将64个储存请求分成四组,每组包含十六个请求。dmac6602向储存队列6324/6334的相应16个条目6522进行组内的十六个请求。dmac6602维持与每个条目6522索引相关联的状态。该状态指示四个组中当前正使用条目来储存数据块的那一组。因此,当dmac6602从储存队列6324/6334接收条目6522索引时,dmac6602的逻辑通过将组号与索引串联来构造块地址,并将构造的块地址作为控制输入提供给数据/权重读取缓存复用器6615/6625。现参考图57,示出一框图,该框图示出nnu121的环形总线耦接实施例。图57在一些方面与图34相同,并且附图标记相同的元件是相同的。如同图34,图57示出nnu121从多个源接收微操作以提供给其流水线的能力。然而,在图57的实施例中,nnu121如图46中那样经由环形总线4024耦接至核心4002,现将描述差异。在图57的实施例中,复用器3402从五个不同的源接收微操作。复用器3402将选择的微操作3418提供给npu126流水线级3401、数据ram122和权重ram124、移动单元5802和输出单元5808,以对其进行控制,如上所述。如针对图34所述,第一个源是产生微操作3416的定序器128。第二个源是图34的解码器3404的修改后版本,用于从核心4002所储存的从属接口6301储存队列6314接收储存请求的数据块。如以上针对图34所述,数据块可以包括与从mtnn指令1400或mfnn指令1500转译来的微指令类似的信息。解码器3404对数据块进行解码并作为响应而产生微操作3412。一个示例是响应于从从属接口6301储存队列6314接收到的将数据写入数据/权重ram122/124的请求、或者响应于从从属接口6301加载队列6312接收到的从数据/权重ram122/124读取数据的请求而产生的微操作3412。第三个源是来自核心4002所储存的从属接口6301储存队列6314的储存请求的直接数据块,其中核心4002包括nnu121直接执行的微操作3414,如以上针对图34所述。优选地,核心4002储存至环形总线4024地址空间中的不同存储器映射地址,以使得解码器3404能够区分第二微操作源和第三微操作源。第四个源是由dmac6602产生的微操作7217。第五个源是空运算微操作7219,其中响应于该空运算微操作7219,nnu121保持其状态。在一个实施例中,五个源具有解码器3404所执行的优先方案,其中直接微操作3414具有最高优先级;由解码器3404响应于从属接口6301的从属储存操作而产生的微操作3412具有第二高优先级;由dmac6602产生的微操作7217具有次高优先级;由定序器128产生的微操作3416具有次高的优先级;并且空运算微操作是默认的(即最低优先级),复用器3402在没有其它源请求时所选择的源。根据一个实施例,当dmac6602或从属接口6301需要访问数据ram122或权重ram124时,其优先于运行在定序器128上的程序,并且解码器3404使定序器128暂停直到dmac6602和从属接口6301已完成其访问为止。尽管如上所述已经描述了在权重ram124和数据ram122中储存字节的实施例,但是设想了字大小可以是不同大小(例如,9位、12位或16位)的其它实施例。虽然这里描述了本发明的各种实施例,但这些实施例是通过示例而非限制的方式呈现。对于相关计算机领域的技术人员将是明显的,可以在不偏离本发明的范围的情况下进行形式和细节方面的各种改变。例如,软件可以例如支持本发明所述的设备和方法的功能、制造、建模、仿真、描述以及/或者测试等。这可以使用一般编程语言(例如,c、c++)、包含veriloghdl、vhdl等的硬件描述语言(hdl),或其它可用程序来实现。这样的软件可以设置于任何已知的计算机可用介质,诸如磁带、半导体、磁盘、光盘(例如,cd-rom、dvd-rom等)、网络、有线或其它通信介质等。这里描述的设备和方法的实施例可被包含于诸如处理器核心(例如,采用hdl体现或指定)等的半导体知识产权核心中,并且通过集成电路的制作而被转换为硬件。此外,这里描述的设备和方法还可体现为硬件和软件的组合。因此,本发明不应以这里描述的任何典型实施例来进行限制,而应仅根据以下权利要求和其等同项来进行限定。具体地,本发明可以实现在可用于通用计算机的处理器装置内。最后,本领域技术人员应当理解,他们可以容易地使用所公开的概念和具体实施例作为基础,来设计并修改其它结构以在不偏离所附权利要求所限定的本发明的范围的情况下实现本发明的相同目的。相关申请的交叉引用本申请涉及以下美国非临时申请,其各自通过引用而全文并入于此。以上非临时申请各自要求基于以下美国临时申请的优先权,所述美国临时申请各自通过引用而全文并入于此。本申请还涉及以下美国非临时申请,其各自通过引用而全文并入于此。本申请还涉及以下美国非临时申请,其各自通过引用而全文并入于此。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1