CN108133269A - 具有可作为高速缓存存储器或神经网络单元存储器操作的存储器阵列的处理器 - Google Patents
具有可作为高速缓存存储器或神经网络单元存储器操作的存储器阵列的处理器 Download PDFInfo
- Publication number
- CN108133269A CN108133269A CN201710947168.7A CN201710947168A CN108133269A CN 108133269 A CN108133269 A CN 108133269A CN 201710947168 A CN201710947168 A CN 201710947168A CN 108133269 A CN108133269 A CN 108133269A
- Authority
- CN
- China
- Prior art keywords
- npu
- nnu
- data
- ram
- word
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F13/00—Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
- G06F13/14—Handling requests for interconnection or transfer
- G06F13/16—Handling requests for interconnection or transfer for access to memory bus
- G06F13/1668—Details of memory controller
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
- G06F12/0806—Multiuser, multiprocessor or multiprocessing cache systems
- G06F12/0811—Multiuser, multiprocessor or multiprocessing cache systems with multilevel cache hierarchies
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
- G06F12/0806—Multiuser, multiprocessor or multiprocessing cache systems
- G06F12/0813—Multiuser, multiprocessor or multiprocessing cache systems with a network or matrix configuration
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
- G06F12/0806—Multiuser, multiprocessor or multiprocessing cache systems
- G06F12/084—Multiuser, multiprocessor or multiprocessing cache systems with a shared cache
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
- G06F12/0844—Multiple simultaneous or quasi-simultaneous cache accessing
- G06F12/0846—Cache with multiple tag or data arrays being simultaneously accessible
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
- G06F12/0893—Caches characterised by their organisation or structure
- G06F12/0897—Caches characterised by their organisation or structure with two or more cache hierarchy levels
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0602—Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
- G06F3/0604—Improving or facilitating administration, e.g. storage management
- G06F3/0607—Improving or facilitating administration, e.g. storage management by facilitating the process of upgrading existing storage systems, e.g. for improving compatibility between host and storage device
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0629—Configuration or reconfiguration of storage systems
- G06F3/0634—Configuration or reconfiguration of storage systems by changing the state or mode of one or more devices
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0655—Vertical data movement, i.e. input-output transfer; data movement between one or more hosts and one or more storage devices
- G06F3/0656—Data buffering arrangements
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0655—Vertical data movement, i.e. input-output transfer; data movement between one or more hosts and one or more storage devices
- G06F3/0658—Controller construction arrangements
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0668—Interfaces specially adapted for storage systems adopting a particular infrastructure
- G06F3/0671—In-line storage system
- G06F3/0683—Plurality of storage devices
- G06F3/0689—Disk arrays, e.g. RAID, JBOD
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
- G06N3/045—Combinations of networks
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/06—Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons
- G06N3/063—Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons using electronic means
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/10—Providing a specific technical effect
- G06F2212/1016—Performance improvement
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/25—Using a specific main memory architecture
- G06F2212/251—Local memory within processor subsystem
- G06F2212/2515—Local memory within processor subsystem being configurable for different purposes, e.g. as cache or non-cache memory
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Health & Medical Sciences (AREA)
- Life Sciences & Earth Sciences (AREA)
- Biomedical Technology (AREA)
- Biophysics (AREA)
- Mathematical Physics (AREA)
- Software Systems (AREA)
- Molecular Biology (AREA)
- Computing Systems (AREA)
- Evolutionary Computation (AREA)
- Data Mining & Analysis (AREA)
- Computational Linguistics (AREA)
- General Health & Medical Sciences (AREA)
- Artificial Intelligence (AREA)
- Human Computer Interaction (AREA)
- Neurology (AREA)
- Memory System (AREA)
- Advance Control (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
一种处理器,包括模式指示器、多个处理核心及神经网络单元(NNU),所述神经网络单元包括存储器阵列、神经处理单元(NPU)的阵列、高速缓存控制逻辑电路及选择逻辑电路,所述选择逻辑电路被配置为选择性地将多个NPU和所述高速缓存控制逻辑电路耦合到所述存储器阵列。当模式指示器指示第一模式时,所述选择逻辑电路使得所述多个NPU能够从所述存储器阵列读取神经网络权重,以使用所述权重来执行计算。当模式指示器指示第二模式时,选择逻辑电路使得所述多个处理核心能够通过所述高速缓存控制逻辑电路访问作为高速缓存存储器的所述存储器阵列。
Description
相关申请的交叉引用
本申请涉及以下美国非临时申请,通过引用将其每一个的全部内容结合在此。
上述非临时申请中的每一个要求基于以下美国临时申请的优先权,通过引用将其每一个的全部内容结合在此。
本申请还涉及以下同时提交的美国非临时申请,通过引用将其每一个的全部内容结合在此。
技术领域
本申请涉及一种处理器,更具体的,涉及具有可作为高速缓存存储器或神经网络单元存储器操作的存储器阵列的处理器。
背景技术
最近,已经重新出现对人工神经网络(ANN)的兴趣,这种研究通常被称为深度学习、计算机学习和类似术语。通用处理器计算能力的提高引起了几十年前衰退的兴趣的复苏。ANN的最近应用包括语音和图像识别以及其他的。对于与ANN相关联的计算的改进的性能和效率的需求呈现出增长。
发明内容
根据本发明的一个方面,提供了一种处理器,包括:模式指示器;多个处理核心;及神经网络单元(NNU)。神经网络单元包括:存储器阵列;神经处理单元(NPU)的阵列;高速缓存控制逻辑电路;及选择逻辑电路,所述选择逻辑电路被配置为选择性地将多个NPU和所述高速缓存控制逻辑电路耦合到所述存储器阵列。其中当所述模式指示器指示第一模式时,所述选择逻辑电路使得所述多个NPU能够从所述存储器阵列读取神经网络权重,以使用所述权重来执行计算;及其中当所述模式指示器指示第二模式时,所述选择逻辑电路使得所述多个处理核心能够通过所述高速缓存控制逻辑电路访问作为高速缓存存储器的所述存储器阵列。
根据本发明的另一个方面,提供了一种用于操作处理器的方法。所述处理器具有模式指示器、多个处理核心及神经网络单元(NNU)。所述神经网络单元包括存储器阵列、神经处理单元(NPU)的阵列、高速缓存控制逻辑电路及选择逻辑电路,所述选择逻辑电路被配置为选择性地将多个NPU和所述高速缓存控制逻辑电路耦合到所述存储器阵列。所述方法包括:响应于将所述模式指示器设置为指示第一模式,所述选择逻辑电路使得所述多个NPU能够从所述存储器阵列读取神经网络权重,以使用所述权重来执行计算;及响应于将所述模式指示器设置为指示第二模式,所述选择逻辑电路使得所述多个处理核心能够通过所述高速缓存控制逻辑电路访问作为高速缓存存储器的所述存储器阵列。
根据本发明的再一个方面,提供了一种计算机程序产品,其编码在至少一个非暂时性计算机可用介质中,用于与计算设备一起使用,所述计算机程序产品包括体现在所述介质中的用于指定处理器的计算机可用程序代码。所述计算机可用程序代码包括:第一程序代码,用于指定模式指示器;第二程序代码,用于指定多个处理核心;及第三程序代码,用于指定神经网络单元(NNU)。所述神经网络单元包括:存储器阵列;神经处理单元(NPU)的阵列;高速缓存控制逻辑电路;及选择逻辑电路,所述选择逻辑电路被配置为选择性地将多个NPU和所述高速缓存控制逻辑电路耦合到所述存储器阵列。其中当所述模式指示器指示第一模式时,所述选择逻辑电路使得所述多个NPU能够从所述存储器阵列读取神经网络权重,以使用所述权重来执行计算;及其中当所述模式指示器指示第二模式时,所述选择逻辑电路使得所述多个处理核心能够通过所述高速缓存控制逻辑电路访问作为高速缓存存储器的所述存储器阵列。
附图说明
图1是示出包括神经网络单元(NNU)的处理器的框图。
图2是示出图1的NPU的框图。
图3是示出图1的NNU的N个NPU的N个多路复用寄存器的布置的实施例的框图,以说明它们作为N字旋转器或循环移位器用于从图1的数据RAM接收的一行数据字的操作。
图4是示出用于储存在图1的NNU的程序存储器中并由其执行的程序的表。
图5是示出NNU执行图4的程序的时序图。
图6A是示出用于执行图4的程序的图1的NNU的框图。
图6B是示出图1的处理器执行架构程序的操作(例如由图4的程序执行的操作)的流程图,该架构程序使用NNU来执行典型地与人工神经网络的隐藏层的神经元相关联的乘法累加激活函数计算。
图7是示出根据可替换实施例的图1的NPU的框图。
图8是示出根据可替换实施例的图1的NPU的框图。
图9是示出用于储存在图1的NNU的程序存储器中并由其执行的程序的表。
图10是示出NNU执行图9的程序的时序图。
图11是示出了显示图1的NNU的实施例的框图。在图11的实施例中,神经元被分成两部分,即激活函数单元部分和ALU部分(其还包括移位寄存器部分),每个激活函数单元部分由多个ALU部分共享。
图12是示出图11的NNU执行图4的程序的时序图。
图13是示出图11的NNU执行图4的程序的时序图。
图14是示出移动到神经网络(MTNN)架构指令及其相对于图1的NNU的各部分的操作的框图。
图15是示出从神经网络移动(MFNN)架构指令的及其相对于图1的NNU的各部分的操作的框图。
图16是示出图1的数据RAM的实施例的框图。
图17是示出图1的权重RAM和缓冲器的实施例的框图。
图18是示出图1的动态可配置NPU的框图。
图19是示出根据图18的实施例的图1的NNU的N个NPU的2N个多路复用寄存器的布置的实施例的框图,以说明它们作为旋转器用于从图1的数据RAM接收的一行数据字的操作。
图20是示出用于储存在具有根据图18的实施例的NPU的图1的NNU的程序存储器中并由其执行的程序的表。
图21是示出由包括以窄配置操作的图18的NPU的NNU执行图20的程序的时序图。
图22是示出包括用以执行图20的程序的图18的NPU的图1的NNU框图。
图23是示出根据可替换实施例的图1的动态可配置NPU的框图。
图24是示出由图1的NNU执行卷积运算所使用的数据结构的示例的框图。
图25是示出图1的处理器执行使用NNU来执行卷积核与图24的数据阵列的卷积的架构程序的操作的流程图。
图26A是执行数据矩阵与图24的卷积核的卷积并将其回写到权重RAM的NNU程序的程序列表。
图26B是示出根据一个实施例的图1的NNU的控制寄存器的某些字段的框图。
图27是示出用输入数据填充的图1的权重RAM的示例的框图,由图1的NNU在该输入数据上执行池化操作。
图28是执行图27的输入数据矩阵的池化操作并将其回写到权重RAM的NNU程序的程序列表。
图29A是示出图1的控制寄存器的实施例的框图。
图29B是示出根据可替换实施例的图1的控制寄存器的实施例的框图。
图29C是示出根据一个实施例的作为两个部分存储的图29A的倒数的实施例的框图。
图30是更详细地图示图2的AFU的实施例的框图。
图31是图30的AFU的操作的示例。
图32是图30的AFU的操作的第二示例。
图33是图30的AFU的操作的第三示例。
图34是示出图1的处理器和图1的NNU的更详细部分的框图。
图35是示出包括可变速率NNU的处理器的框图。
图36A是示出具有在正常模式下(即,以主时钟速率)操作的NNU的处理器的操作的示例的时序图。
图36B是示出具有在松弛模式下(即,以小于主时钟速率的速率)操作的NNU的处理器的操作的示例的时序图。
图37是示出图35的处理器的操作的流程图。
图38是更详细地示出NNU的序列的框图。
图39是示出NNU的控制和状态寄存器的某些字段的框图。
图40是示出处理器的框图。
图41是更详细地示出图40的NNU和图40的环停止的框图。
图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的处理器的操作的流程图。
具体实施方式
具有架构神经网络单元的处理器
现在参考图1,示出了例示包括神经网络单元(NNU)121的处理器100的框图。处理器100包括指令提取单元101、指令高速缓存102、指令转换器104、重命名单元106、保留站108、媒体寄存器118、通用寄存器(GPR)116、除NNU 121之外的执行单元112和存储器子系统114。
处理器100是用作集成电路上的中央处理单元(CPU)的电子设备。处理器100接收数字数据作为输入,根据从存储器获取的指令处理数据,并且生成由指令规定的操作的结果作为输出。处理器100可以用于台式、移动或平板计算机中,并且用于诸如计算、文本编辑、多媒体显示和互联网浏览之类的用途。处理器100还可以设置在嵌入式系统中以控制各种各样的设备,包括家用电器、移动电话、智能电话、汽车和工业控制设备。CPU是通过对数据执行包括算术运算、逻辑电路运算和输入/输出运算的运算来执行计算机程序(也称为“计算机应用”或“应用”)的指令的电子电路(即“硬件”)。集成电路(IC)是在小片半导体材料(通常是硅)上制造的一组电子电路。IC也称为芯片、微芯片或管芯。
指令提取单元101控制从系统存储器(未示出)将架构指令103提取到指令高速缓存102中。指令提取单元101向指令高速缓存102提供提取地址,其指定处理器100将架构指令字节的高速缓存行提取到指令高速缓存102中的存储器地址。提取地址基于处理器100的指令指针(未示出)或程序计数器的当前值。通常,程序计数器按指令的大小顺序递增,除非在指令流中遇到控制指令,例如分支、调用或返回指令,或发生异常状况,例如中断、陷阱、异常或故障,在此情况下,程序计数器用非顺序地址(例如分支目标地址、返回地址或异常向量)更新。一般来说,响应于执行单元112/121对指令的执行,更新程序计数器。还可以响应于检测到异常状况来更新程序计数器,所述异常状况诸如指令转换器104遇到未由处理器100的指令集架构定义的指令103。
指令高速缓存102高速缓存从耦合到处理器100的系统存储器提取的架构指令103。架构指令103包括移动到神经网络(MTNN)指令和从神经网络移动(MFNN)指令,这将在下面更详细地描述。在一个实施例中,架构指令103是x86指令集架构(ISA)的指令,添加了MTNN和MFNN指令。在本公开内容的语境中,x86ISA处理器是在指令集架构级生成与处理器执行相同机器语言指令时所生成的相同结果的处理器。然而,其他实施例考虑其他指令集架构,诸如高级RISC机器Sun 或指令高速缓存102将架构指令103提供给指令转换器104,指令转换器104将架构指令103转换成微指令105。
微指令105被提供给重命名单元106,并且最终由执行单元112/121执行。微指令105实施架构指令。优选地,指令转换器104包括将频繁执行的和/或相对不太复杂的架构指令103转换为微指令105的第一部分。指令转换器104还包括包括微代码单元(未示出)的第二部分。微代码单元包括保存实施架构指令集的复杂和/或不频繁使用的指令的微代码指令的微代码存储器。微代码单元还包括向微代码存储器提供非架构微程序计数器(微PC)的微序列发生器。优选地,微代码指令由微转换器(未示出)转换成微指令105。选择器根据微代码单元当前是否具有控制而从第一部分或第二部分中选择微指令105,用于提供给重命名单元106。
重命名单元106将架构指令103中指定的架构寄存器重命名为处理器100的物理寄存器。优选地,处理器100包括重排序缓冲器(未示出)。重命名单元106以程序顺序为每个微指令105在重排序缓冲器中分配条目。这使得处理器100能够以程序顺序退回微指令105及其相应的结构指令103。在一个实施例中,媒体寄存器118是256位宽,GPR 116是64位宽。在一个实施例中,媒体寄存器118是x86媒体寄存器,例如高级向量扩展(AVX)寄存器。
在一个实施例中,重排序缓冲器中的每个条目包括用于微指令105的结果的存储;另外,处理器100包括架构寄存器文件,其包括用于每个架构寄存器(例如,媒体寄存器118和GPR 116以及其他架构寄存器)的物理寄存器。(例如,优选地,存在用于媒体寄存器118和GPR 116的单独的寄存器文件,因为它们大小不同。)对于指定架构寄存器的微指令105的每个源操作数,重命名单元以写入架构寄存器的最新的旧微指令105的重排序缓冲器索引填充微指令105中的源操作数字段。当执行单元112/121完成微指令105的执行时,它将结果写入微指令105的重排序缓冲器条目。当微指令105退回时,退回单元(未示出)将来自微指令的重排序缓冲器条目的结果写入与由退回微指令105指定的架构目的地寄存器相关联的物理寄存器文件的寄存器。
在另一实施例中,处理器100包括物理寄存器文件,物理寄存器文件包括比架构寄存器的数量更多的物理寄存器,但是不包括架构寄存器文件,并且重排序缓冲器条目不包括结果储存。(例如,优选地,存在用于媒体寄存器118和GPR 116的单独的物理寄存器文件,因为它们大小不同。)处理器100还包括具有用于每个架构寄存器的相关指针的指针表。对于指定架构寄存器的微指令105的操作数,重命名单元用指向物理寄存器文件中的空闲寄存器的指针填充微指令105中的目的地操作数字段。如果物理寄存器文件中没有寄存器空闲,则重命名单元106停止流水线。对于指定架构寄存器的微指令105的每个源操作数,重命名单元用指向分配给写入架构寄存器的最新的旧微指令105的物理寄存器文件中的寄存器的指针填充微指令105中的源操作数字段。当执行单元112/121完成微指令105的执行时,它将结果写入微指令105的目的地操作数字段指向的物理寄存器文件的寄存器。当微指令105退回时,退回单元将微指令105的目的地操作数字段值复制到与由退回微指令105指定的架构目的地寄存器相关联的指针表中的指针。
保留站108保存微指令105,直到它们准备好被发出到执行单元112/121用于执行。当所有其源操作数可用并且执行单元112/121可用于执行微指令105时,微指令105准备好被发出。执行单元112/121从上述第一实施例中的重排序缓冲器或架构寄存器文件或从上述第二实施例中的物理寄存器文件接收寄存器源操作数。另外,执行单元112/121可以经由结果转发总线(未示出)直接从执行单元112/121接收寄存器源操作数。另外,执行单元112/121可以从保留站108接收由微指令105指定的立即操作数。如下文更详细论述的,MTNN和MFNN架构指令103包括立即操作数,其指定要由NNU 121执行的在MTNN和MFNN架构指令103被转换成的一个或多个微指令105之一中提供的函数。
执行单元112包括从存储器子系统114加载数据并将数据存储到存储器子系统114的一个或多个加载/存储单元(未示出)。优选地,存储器子系统114包括存储器管理单元(未示出),其可以包括例如转换后备缓冲器和表行(tablewalk)单元、一级数据高速缓存(和指令高速缓存102)、二级统一高速缓存和总线接口单元,总线接口单元将处理器100接口连接到系统存储器。在一个实施例中,图1的处理器100表示处理内核,其是共享最后级高速缓存存储器的多核处理器中的多个处理内核中的一个。执行单元112还可以包括整数单元、媒体单元、浮点单元和分支单元。
NNU 121包括权重随机存取存储器(RAM)124、数据RAM 122、N个神经处理单元(NPU)126、程序存储器129、序列发生器128以及控制和状态寄存器127。NPU 126概念上用作神经网络中的神经元。权重RAM 124、数据RAM 122和程序存储器129分别是借助MTNN和MFNN架构指令103可写并且可读的。权重RAM 124被布置为W行N个权重字,数据RAM 122被布置为D行N个数据字。每个数据字和每个权重字是多个位,优选为8位、9位、12位或16位。每个数据字用作网络中的前一层的神经元的输出值(有时也称为激活),每个权重字用作与进入到网络的当前层的神经元中的连接相关联的权重。虽然在NNU 121的许多使用中,保存在权重RAM 124中的字或操作数实际上是与进入神经元中的连接相关联的权重,但是应当理解,在NNU 121的其他使用中,保存在权重RAM 124中的字不是权重,但也被称为“权重字”,因为它们被存储在权重RAM 124中。例如,在NNU 121的一些使用中,例如图24至26A的卷积示例或图27至28的池化示例中,权重RAM 124可以保存非权重,诸如数据矩阵的元素,例如图像像素数据。类似地,尽管在NNU 121的许多使用中,保存在数据RAM 122中的字或操作数实际上是神经元的输出值或激活,但应当理解,在NNU 121的其它使用中,保存在数据RAM 122中的数据不是这样的,但也被称为“数据字”,因为它们被存储在数据RAM 122中。例如,在NNU121的一些使用中,例如图24至26A的卷积示例,数据RAM 122可以保存非神经元输出,诸如卷积核的元素。
在一个实施例中,NPU 126和序列发生器128包括组合逻辑、顺序逻辑、状态机或其组合。架构指令(例如,MFNN指令1500)将状态寄存器127的内容加载到GPR 116之一中以确定NNU 121的状态,例如,NNU 121已经完成了命令或完成了NNU 121运行的来自程序存储器129的程序,或者NNU 121可以自由地接收新命令或开始新的NNU程序。
有利地,NPU 126的数量可以根据需要增加,权重RAM 124和数据RAM 122的大小可以相应地在宽度和深度两者上扩展。优选地,权重RAM 124较大,因为在典型的神经网络层中存在与每个神经元相关联的许多连接,因而存在多个权重。本文说明了关于数据字和权重字的大小以及权重RAM 124和数据RAM 122的大小以及NPU 126的数量的各种实施例。在一个实施例中,具有64KB(8192位×64行)数据RAM 122、2MB(8192位×2048行)权重RAM 124和512个NPU 126的NNU 121以台湾半导体制造有限公司(TSMC)16nm工艺来实施,并且占据大约3.3mm2的面积。
序列发生器128从程序存储器129提取指令并执行它们,其中包括生成用于提供给数据RAM 122、权重RAM 124和NPU 126的地址和控制信号。序列发生器128生成存储器地址123和读取命令,用于提供给数据RAM 122,以选择D行N个数据字中的一行以提供给N个NPU126。序列发生器128还生成存储器地址125和读取命令,用于提供给权重RAM 124,以选择W行N个权重字中的一行以提供给N个NPU 126。由序列发生器128生成的提供给NPU 126的地址123和125的序列确定神经元之间的“连接”。序列发生器128还生成存储器地址123和写入命令,用于提供给数据RAM 122,以选择D行N个数据字中的一行以从N个NPU 126写入。序列发生器128还生成存储器地址125和写命令,用于提供给权重RAM 124以选择W行N个权重字中的一行以从N个NPU 126写入。序列发生器128还生成到程序存储器129的存储器地址131,以选择提供给序列发生器128的NNU指令,如下所述。存储器地址131对应于序列发生器128通常通过程序存储器129的顺序位置递增的程序计数器(未示出),除非序列发生器128遇到控制指令,例如循环指令(例如参见图26A),在这种情况下,序列发生器128将程序计数器更新为控制指令的目标地址。序列发生器128还生成到NPU 126的控制信号,以指示它们执行各种操作或功能,诸如初始化、算术/逻辑运算、旋转和移位操作、激活功能和回写操作,其示例在下面被更详细地描述(参见例如图34的微操作3418)。
N个NPU 126生成N个结果字133,其可被回写到权重RAM 124或数据RAM 122的行。优选地,权重RAM 124和数据RAM 122直接耦合到N个NPU 126。更具体地,权重RAM 124和数据RAM 122专用于NPU 126,并且不被处理器100的其他执行单元112共享,NPU 126能够每个时钟周期以持续不变的方式(优选地以流水线方式)使用完来自权重RAM 124和数据RAM122之一或二者的行。在一个实施例中,数据RAM 122和权重RAM 124中的每一个能够在每个时钟周期向NPU 126提供8192位。8192位可以作为512个16位字或1024个8位字来使用,如下面更详细地描述的。
有利地,可由NNU 121处理的数据集的大小不限于权重RAM 124和数据RAM 122的大小,而是仅由系统存储器的大小限制,因为数据和权重可以使用MTNN和MFNN指令(例如,通过媒体寄存器118)在系统存储器与权重RAM 124和数据RAM 122之间移动。在一个实施例中,数据RAM 122是双端口的,以使得数据字能够被写入数据RAM 122,同时数据字被同时从数据RAM 122读取或写入数据RAM 122。此外,存储器子系统114的大存储器层级,包括高速缓存存储器,为系统存储器和NNU 121之间的传输提供了非常高的数据带宽。此外,优选地,存储器子系统114包括跟踪存储器访问模式(诸如神经数据和权重从系统存储器的加载)的硬件数据预取器,并且执行到高速缓存层级中的数据预取以便于到权重RAM 124和数据RAM122的高带宽和低等待时间传输。
尽管描述了其中提供给每个NPU 126的操作数之一从权重存储器提供并且被表示为通常在神经网络中使用的权重的实施例,但是应当理解,操作数可以是与其速度可以通过所描述的装置改进的计算相关联的其他类型的数据。
现在参考图2,示出了例示图1的NPU 126的框图。NPU 126操作以执行许多功能或操作。特别地,有利地,NPU 126被配置为作为人工神经网络中的神经元或节点操作,以执行典型的乘法-累积功能或操作。即,一般来说,NPU 126(神经元)被配置为:(1)从连接到它的每个神经元接收输入值,通常但不一定来自人工神经网络的前一层;(2)将每个输入值乘以与连接相关联的对应权重值,以生成乘积;(3)将所有乘积相加以生成总和;及(4)对总和执行激活函数以生成神经元的输出。然而,不是像常规方式那样执行与所有连接输入相关联的所有乘法然后将所有乘积相加在一起,而是有利地每个神经元被配置为在给定时钟周期中执行与连接输入之一相关联的权重乘法运算,然后将该乘积与直到该点的在前时钟周期中处理的连接输入相关联的乘积的累加值相加(累加)。假设存在到神经元的M个连接,在已经累加所有M个乘积(其花费大约M个时钟周期)之后,神经元对累加值执行激活函数以生成输出或结果。这与需要将与所有连接输入相关联的乘积的全部或甚至子集相加的加法器相比,具有在神经元中需要更少的乘法器和更小、更简单和更快的加法器电路(例如,2-输入加法器)的优点。这又具有有利于NNU 121中的非常大数量(N)的神经元(NPU 126)的优点,使得在大约M个时钟周期之后,NNU 121已经生成用于全部大数量(N)的神经元的输出。最后,由这样的神经元构成的NNU 121具有有效地作为用于大量不同连接输入的人工神经网络层执行的优点。即,随着M对于不同层增加或减少,生成神经元输出所需的时钟周期的数量相应地增加或减少,充分利用资源(例如,乘法器和累加器);而在更常规的设计中,一些乘法器和一部分加法器可能不用于较小的M值。因此,本文所述的实施例具有到NNU 121的神经元的连接输入的数量灵活且高效的益处,并提供极高的性能。
NPU 126包括寄存器205、2-输入多路复用寄存器(mux-reg)208、算术逻辑单元(ALU)204、累加器202和激活函数单元(AFU)212。寄存器205从权重RAM 124接收权重字206,并在随后的时钟周期提供其输出203。多路复用寄存器208选择其输入端207或211中的一个以存储在其寄存器中,然后在随后的时钟周期上提供在其输出端209上。一个输入端207从数据RAM 122接收数据字。另一输入端211接收相邻NPU 126的输出209。图2所示的NPU 126被表示为来自图1的N个NPU 126中的NPU J。即,NPU J是N个NPU 126的代表性实例。优选地,NPU J的多路复用寄存器208输入端211接收NPU 126实例J-1的多路复用寄存器208输出端209,NPU J的多路复用寄存器208输出端209被提供给NPU 126实例J+1的多路复用寄存器208输入端211。以此方式,N个NPU 126的多路复用寄存器208共同地作为N字旋转器或循环移位器操作,如下文关于图3更详细地描述。控制输入213控制多路复用寄存器208选择两个输入中的哪一个存储在其寄存器中并且随后提供在输出端209上。
ALU 204具有三个输入端。一个输入端从寄存器205接收权重字203。另一个输入端接收多路复用寄存器208的输出端209。再另一个输入端接收累加器202的输出端217。ALU204对其输入执行算术和/或逻辑运算以生成在其输出端上提供的结果。优选地,由ALU 204执行的算术和/或逻辑运算由存储在程序存储器129中的指令指定。例如,图4的乘法-累加指令指定乘法-累加运算,即,结果215是累加器202的值217加上权重字203和多路复用寄存器208输出端209的数据字的乘积的总和。可以指定的其他运算包括但不限于:结果215是多路复用寄存器输出209的通过值;结果215是权重字203的通过值;结果215为零;结果215是权重字203的通过值;结果215是累加器202的值217和权重字203的和;结果215是累加器202的值217和多路复用寄存器输出209的和;结果215是累加器202的值217和权重字203的最大值;结果215是累加器202的值217和多路复用寄存器输出209的最大值。
ALU 204将其输出215提供给累加器202以在其中储存。ALU 204包括乘法器242,乘法器242将权重字203和多路复用寄存器208输出端209的数据字相乘以生成乘积246。在一个实施例中,乘法器242将两个16位操作数相乘以生成32位结果。ALU 204还包括加法器244,其将乘积246与累加器202输出217相加以生成总和,它是在累加器202中累加用以存储在累加器202中的结果215。在一个实施例中,加法器244将乘法器242的32位结果加上累加器202的41位值217以生成41位结果。以此方式,在多个时钟周期的过程中使用多路复用寄存器208的旋转器方案,NPU 126完成了神经网络所需的神经元的乘积的总和。ALU 204还可以包括其他电路组件以执行诸如上述的其它算术/逻辑运算。在一个实施例中,第二加法器从多路复用寄存器208输出端209的数据字中减去权重字203以生成差,加法器244然后将这个差加到累加器202的输出217以生成和215,和215是在累加器202中累加的结果。以此方式,在多个时钟周期的过程中,NPU 126可以完成差的总和。优选地,尽管权重字203和数据字209具有相同的大小(以位为单位),但是它们可以具有不同的二进制小数点位置,如下面更详细描述的。优选地,乘法器242和加法器244是整数乘法器和加法器,如下面更详细地描述的,以有利地实现比浮点对等方案更简单、更小、更快和更低功耗的ALU 204。然而,应当理解,在其他实施例中,ALU 204执行浮点运算。
虽然图2仅示出ALU 204中的乘法器242和加法器244,但是优选地,ALU 204包括用于执行上述其他操作的其他组件。例如,优选地,ALU 204包括用于将累加器202与数据/权重字比较的比较器(未示出)和选择由比较器指示的用于储存在累加器202中的两个值中的较大(最大)值的多路复用器(未示出)。对于另一示例,优选地,ALU 204包括用数据/权重字旁通乘法器242的选择逻辑(未示出),以使加法器244能够将数据/权重字加到累加器202的值217,以生成用于存储在累加器202中的和。这些附加操作在下面例如关于图18至图29A更详细地描述,并且例如可以用于执行卷积和池化操作。
AFU 212接收累加器202的输出217。AFU 212对累加器202输出217执行激活函数,以生成图1的结果133。一般来说,人工神经网络的中间层的神经元中的激活函数可以用于优化地以非线性方式对积累的乘积总和进行归一化。为了“归一化”累加总和,当前神经元的激活函数产生在连接到当前神经元的神经元期望作为输入接收的值的范围内的结果值。(归一化结果有时被称为“激活”,如本文所述,是接收节点以与输出节点和接收节点之间的连接相关联的权重相乘的当前节点的输出,用以生成同与到接收节点的其它输入连接相关联的其它乘积累加的乘积)。例如,接收/连接的神经元可以预期接收0和1之间的值作为输入,在这种情况下,输出神经元可能需要将在0到1范围之外的累加总和非线性挤压和/或调整(例如,向上移动以将负值转换为正值)为在预期范围内的值。因此,AFU 212对累加器202的值217执行运算以使结果133处于已知范围内。所有N个NPU 126的结果133可以被同时回写到数据RAM 122或权重RAM 124。优选地,AFU 212被配置为执行多个激活函数,并且例如来自控制器寄存器127的输入选择激活函数之一以在累加器202的输出217上执行。激活函数可以包括但不限于阶梯函数、校正函数、S形函数、双曲正切(tanh)函数和softplus函数(也称为平滑校正)。softplus函数是分析函数f(x)=ln(1+ex),即一和ex的和的自然对数,其中,“e”是欧拉数,x是到函数的输入217。优选地,激活函数还可以包括使累加器202的值217或其一部分通过的通过函数,如下面更详细描述的。在一个实施例中,AFU 212的电路在单个时钟周期中执行激活函数。在一个实施例中,AFU 212包括表,该表接收累加值并输出接近真实激活函数对于一些激活函数(例如S形、双曲正切、softplus)将提供的值的值。
优选地,累加器202的宽度(以位为单位)大于AFU 212输出133的宽度。例如,在一个实施例中,累加器为41位宽,以避免高达512个32位乘积(如下面例如关于图30更详细地描述的)的累加中精度的损失,结果133是16位宽。在一个实施例中,下面关于图8更详细地描述其示例,在连续的时钟周期期间,“原始”累加器202输出217的值的不同部分通过AFU212并回写到数据RAM 122或权重RAM 124。这使得原始累加器202值能够借助MFNN指令加载回媒体寄存器118,使得在处理器100的其它执行单元112上执行的指令可执行AFU 212不能够执行的复杂激活函数,例如众所周知的softmax激活函数,也称为归一化指数函数。在一个实施例中,处理器100指令集架构包括执行通常被称为ex或exp(x)的指数函数的指令,其可以用于加速处理器100的其他执行单元112对softmax激活函数的执行。
在一个实施例中,NPU 126是流水线型的。例如,NPU 126可以包括ALU 204的寄存器,诸如在乘法器和加法器和/或ALU 204的其他电路之间的寄存器,以及保存AFU 212的输出的寄存器。以下说明NPU 126的其他实施例。
现在参考图3,示出了例示图1的NNU 121的N个NPU 126的N个多路复用寄存器208的布置的实施例的框图,用以说明它们作为N字旋转器或循环移位器对于从图1的数据RAM122接收的一行数据字207的操作。在图3的实施例中,N是512,从而NNU 121具有512个多路复用寄存器208,表示为0到511,对应于512个NPU 126,如图所示。每个多路复用寄存器208接收数据RAM 122的D行中的一行的其对应的数据字207。即,多路复用寄存器0接收数据RAM122行的数据字0,多路复用寄存器1接收数据RAM 122行的数据字1,多路复用寄存器2接收数据RAM 122行的数据字2,依此类推,直至多路复用寄存器511接收数据RAM 122行的数据字511。另外,多路复用寄存器1在其另一输入端211上接收多路复用寄存器0的输出209,多路复用寄存器2在其另一输入端211上接收多路复用寄存器1的输出209,多路复用寄存器3在其另一输入端211上接收多路复用寄存器2的输出209,依此类推,直至多路复用寄存器511,它在其另一输入端211上接收多路复用寄存器511的输出209,多路复用寄存器0在其另一输入端211上接收多路复用寄存器510的输出209。多路复用寄存器208中的每一个都接收控制输入213,其控制是选择数据字207还是旋转输入211。如下面更详细描述的,在一种操作模式中,在第一时钟周期,控制输入213控制多路复用寄存器208中的每一个以选择数据字207用于存储在寄存器中并且随后提供给ALU 204;在随后的时钟周期(例如,如上所述的M-1个时钟周期)期间,控制输入213控制多路复用寄存器208中的每一个选择旋转的输入211用于存储在寄存器中,并且随后提供给ALU 204。
尽管图3(以及下面的图7和19)说明了一个实施例,其中,NPU 126被配置为将多路复用寄存器208/705的值向右旋转,即从NPU J到NPU J+1,但考虑实施例(诸如关于图24至26的实施例),其中,NPU 126被配置为将多路复用寄存器208/705的值向左旋转,即从NPU J到NPU J-1。此外,考虑实施例,其中,NPU 126被配置为将多路复用寄存器208/705的值选择性地向左或向右旋转,例如,如NNU指令所指定的。
现在参考图4,示出了例示用于存储在图1的NNU 121的程序存储器129中并由该NNU 121执行的程序的表。示例性程序执行与如上所述的人工神经网络的层相关联的计算。在图4的表中,示出了四行和三列。每行对应于在第一列中表示的程序存储器129的地址。第二列指定指令,第三列指示与指令相关联的时钟周期的数量。优选地,时钟周期的数量指示流水线实施例中每指令时钟类型值的时钟的有效数量,而不是指令的等待时间。如图所示,由于NNU 121的流水线性质,每个指令具有关联的一个时钟周期,但需要511个时钟的地址2处的指令除外,因为它有效地重复自身511次,如下面更详细地说明的。
对于程序的每个指令,所有NPU 126并行执行指令。即,所有N个NPU 126在相同的时钟周期中执行第一行中的指令,所有N个NPU 126在相同的时钟周期中执行第二行中的指令,依此类推,。然而,下面说明了其他实施例,其中,以部分并行和部分顺序的方式执行一些指令,例如在NPU 126共享激活函数单元的实施例(例如关于图11的实施例)中,在地址3和4的激活函数和输出指令。图4的示例假设512个神经元(NPU 126)的一层,每个具有来自512个神经元的先前层的512个连接输入,用于总共256K个连接。每个神经元从每个连接输入接收16位数据值,并将16位数据值乘以适当的16位权重值。
在地址0(尽管可以指定其他地址),第一行指定初始化NPU指令。初始化指令将累加器202的值清零。在一个实施例中,初始化指令还可以指定向累加器202加载由指令指定其地址的数据RAM 122或权重RAM 124的行的相应字。初始化指令还将配置值加载到控制寄存器127中,如下面关于图29A和29B更详细地描述的。例如,可以加载数据字207和权重字209的宽度,其可以由ALU 204用来确定由电路执行的运算的大小,并且可以影响存储在累加器202中的结果215。在一个实施例中,NPU 126包括在存储在累加器202中之前使ALU 204输出215饱和的电路,初始化指令将配置值加载到电路中以影响饱和。在一个实施例中,通过在ALU函数指令(例如,在地址1处的乘法-累加指令)或输出指令(例如地址4处的写AFU输出指令)中如此指定,累加器202也可被清为零值。
在地址1,第二行指定乘法-累加指令,其指示512个NPU 126从数据RAM 122的一行加载相应的数据字,并从权重RAM 124的一行加载相应的权重字,对数据字输入207和权重字输入206执行第一乘法-累加运算,其与初始化的累加器202零值累加。更具体地,指令指示序列发生器128在控制输入端213上生成值以选择数据字输入207。在图4的示例中,指定的数据RAM 122行是行17,指定的权重RAM 124行是行0,其指示序列发生器128输出数据RAM地址123的值17并输出权重RAM地址125的值0。因此,来自数据RAM 122的行17的512个数据字被提供给512个NPU 126的相应数据输入端207,来自权重RAM 124的行0的512个权重字被提供给512个NPU 126的相应权重输入端206。
在地址2,第三行指定具有计数511的乘法-累加旋转指令,其指示512个NPU 126中的每一个执行511次乘法-累加运算。该指令指示512个NPU 126,对于511次乘法-累加运算中的每一个,输入到ALU 204的数据字209是来自相邻NPU 126的旋转值211。即,指令指示序列发生器128在控制输入端213上生成选择旋转值211的值。另外,指令指示512个NPU 126从权重RAM 124的“下一”行加载用于511次乘法-累加运算中的每一个的相应权重字。即,指令指示序列发生器128将权重RAM地址125相对于其在先前时钟周期中的值递增1,在该示例中,将是指令的第一时钟周期上的行1,下一时钟周期上的行2,下一时钟周期上的行3,依此类推,直至第511个时钟周期上的行511。对于511次乘法-累加运算中的每一个,旋转输入211和权重字输入206的乘积与累加器202中的先前值累加。512个NPU 126在511个时钟周期中执行511次乘法-累加运算,其中,每个NPU 126对来自数据RAM 122的行17的不同数据字(即,在前一周期中由相邻NPU 126操作的数据字)和与该数据字相关联的不同权重字(其在概念上是到神经元的不同连接输入)执行乘法-累加运算。在该示例中,假设到每个NPU 126(神经元)的连接输入的数量是512,因此涉及512个数据字和512个权重字。一旦执行了行2的乘法-累加旋转指令的最后一次迭代,累加器202就包含所有512个连接输入的乘积之和。在一个实施例中,NPU 126指令集不具有用于每种类型的ALU运算(例如,如上所述的乘法-累加、累加器和权重字的最大值等)的单独指令,而是包括指示ALU 204执行由初始化NPU指令指定的(诸如在图29A的ALU函数2926中指定的)ALU运算的“执行”指令。
在地址3,第四行指定激活函数指令。激活函数指令指示AFU 212对累加器202的值217执行指定的激活函数以生成结果133。下面更详细地描述根据一个实施例的激活函数。
在地址4,第五行指定写AFU输出指令,其指示512个NPU 126将其AFU 212输出作为结果133回写到数据RAM 122的一行,在该示例中为行16。即,指令指示序列发生器128输出数据RAM地址123的值16和写命令(与在地址1的乘法-累加指令的情况下的读命令相反)。优选地,在流水线特性中,写AFU输出指令的执行可以与其他指令的执行重叠,使得写AFU输出指令在单个时钟周期中有效地执行。
优选地,每个NPU 126被配置为包括各种功能组件的流水线,例如多路复用寄存器208(和图7的多路复用寄存器705)、ALU 204、累加器202、AFU 212、(图8的)多路复用器802、行缓冲器1104和(图11的)AFU 1112等,其中一些本身可以是流水线的。除了数据字207和权重字206之外,流水线从程序存储器129接收指令。指令沿着流水线向下流动并控制各个功能单元。在可替换的实施例中,激活函数指令不包括在程序中。相反,初始化NPU指令指定要对累加器202的值217执行的激活函数,一旦已经生成最终累加器202值217,即一旦在地址2的乘法-累加旋转指令的最后一次迭代完成,就将指示所指定的激活函数的值保存在配置寄存器中,以供以后由流水线的AFU 212部分使用。优选地,为了省电的目的,流水线的AFU212部分不运行,直到写AFU输出指令到达它,此时AFU 212被加电并且在由初始化指令指定的累加器202输出217上执行激活函数。
现在参考图5,示出了例示由NNU 121执行图4的程序的时序图。时序图的每一行对应于第一列中指示的连续时钟周期。每个其他列对应于512个NPU 126中的不同一个并指示其操作。为了说明的简单和清楚,仅示出了用于NPU 0、1和511的操作。
在时钟0,512个NPU 126中的每一个执行图4的初始化指令,其在图5中通过向累加器202分配零值来示出。
在时钟1,512个NPU 126中的每一个执行在图4的地址1的乘法-累加指令。NPU 0用数据RAM 122行17字0和权重RAM 124行0字0的乘积累加累加器202值(其为零);NPU 1用数据RAM 122行17字1和权重RAM 124行0字1的乘积累加累加器202的值(其为零),依此类推,直至NPU 511用数据RAM 122行17字511和权重RAM 124行0字511的乘积累加累加器202的值(其为零),如图所示。
在时钟2,512个NPU 126中的每一个执行在图4的地址2的乘法-累加旋转指令的第一次迭代。NPU 0用从NPU 511的多路复用寄存器208输出端209接收的旋转数据字211(它是从数据RAM 122接收的数据字511)和权重RAM 124行1字0的乘积累加累加器202的值;NPU 1用从NPU 0的多路复用寄存器208输出端209接收的旋转数据字211(它是从数据RAM 122接收的数据字0)和权重RAM 124行1字1的乘积累加累加器202的值;依此类推,直至NPU 511用从NPU 510的多路复用寄存器208输出端209接收的旋转数据字211(它是从数据RAM 122接收的数据字510)和权重RAM 124行1字511的乘积累加累加器202的值,如图所示。
在时钟3,512个NPU 126中的每一个执行在图4的地址2的乘法-累加旋转指令的第二次迭代。NPU 0用从NPU 511的多路复用寄存器208输出端209接收的旋转数据字211(它是从数据RAM 122接收的数据字510)和权重RAM 124行2字0的乘积累加累加器202的值;NPU 1用从NPU 0的多路复用寄存器208输出端209接收的旋转数据字211(它是从数据RAM 122接收的数据字511)和权重RAM 124行2字1的乘积累加累加器202的值;依此类推,直至NPU 511用从NPU 510的多路复用寄存器208输出端209接收的旋转数据字211(它是从数据RAM 122接收的数据字509)和权重RAM 124行2字511的乘积累加累加器202的值,如图所示。如图5的省略号所示,这对于随后的509个时钟周期中的每一个继续进行,直至……
在时钟512,512个NPU 126中的每一个执行在图4的地址2的乘法-累加旋转指令的第511次迭代。NPU 0用从NPU 511的多路复用寄存器208输出端209接收的旋转数据字211(它是从数据RAM 122接收的数据字1)和权重RAM 124行511字0的乘积累加累加器202的值;NPU 1用从NPU 0的多路复用寄存器208输出端209接收的旋转数据字211(它是从数据RAM122接收的数据字2)和权重RAM 124行511字1的乘积累加累加器202的值;依此类推,直至NPU 511用从NPU 510的多路复用寄存器208输出端209接收的旋转数据字211(它是从数据RAM 122接收的数据字0)和权重RAM 124行511字511的乘积累加累加器202的值,如图所示。在一个实施例中,需要多个时钟周期来从数据RAM 122和权重RAM 124读取数据字和权重字以在图4的地址1执行乘法-累加指令;然而,数据RAM 122和权重RAM 124及NPU 126是流水线的,从而一旦开始第一乘法-累加运算(例如,如图5的时钟1所示),则随后的乘法累加运算(例如,时钟2-512期间所示)就在连续的时钟周期中开始。优选地,响应于通过架构指令(例如,MTNN或MFNN指令(下面参考图14和15描述))或架构指令被转换为的微指令访问数据RAM 122和/或权重RAM 124,NPU 126可以暂时停止。
在时钟513,512个NPU 126中的每一个的AFU 212执行在图4的地址3的激活函数指令。最后,在时钟514,512个NPU 126中的每一个通过将其结果133回写到数据RAM 122的行16的其相应字,即NPU 0的结果133被写入数据RAM 122的字0,NPU 1的结果133被写入数据RAM 122的字1,依此类推,直至NPU 511的结果133被写入数据RAM 122的字511,而执行在图4的地址4的写AFU输出指令。上面关于图5说明的操作也在图6A中以框图形式示出。
现在参考图6A,示出了例示用于执行图4的程序的图1的NNU 121的框图。NNU 121包括512个NPU 126、接收其地址输入123的数据RAM 122和接收其地址输入125的权重RAM124。虽然未示出,但在时钟0,512个NPU 126执行初始化指令。如图所示,在时钟1上,将行17的512个16位数据字从数据RAM 122中读出并提供给512个NPU 126。在时钟1至512上,将行0至511的512个16位权重字分别从权重RAM 124读出并提供给512个NPU 126。虽然未示出,但在时钟1上,512个NPU 126对加载的数据字和权重字执行它们各自的乘法-累加运算。在时钟2至512上,512个NPU 126的多路复用寄存器208作为512个16位字旋转器操作,以将数据RAM 122的行17的先前加载的数据字旋转到相邻NPU 126,并且NPU 126对相应的旋转数据字和从权重RAM 124加载的相应权重字执行乘法-累加运算。虽然未示出,但在时钟513上,512个AFU 212执行激活指令。在时钟514上,512个NPU 126将它们各自的512个16位结果133回写到数据RAM 122的行16。
可以观察到,生成产生并回写到数据RAM 122或权重RAM 124的结果字(神经元输出)所需的时钟数大约是神经网络的当前层接收的数据输入(连接)的数量的平方根。例如,如果当前层具有512个神经元,每个神经元具有来自前一层的512个连接,则连接的总数为256K,并且生成用于当前层的结果所需的时钟数略多于512。因此,NNU 121为神经网络计算提供了极高的性能。
现在参考图6B,示出了例示图1的处理器100执行架构程序的操作的流程图,该架构程序使用NNU 121来执行典型地与人工神经网络的隐藏层的神经元相关联的乘法-累加激活函数计算,例如由图4的程序执行的。图6B的示例假定对于4个隐藏层(通过框602处的NUM_LAYERS变量的初始化来表示)的计算,每个隐藏层具有512个神经元,每个神经元都完全连接到前一层的512个神经元(通过使用图4的程序)。然而,应当理解,为了说明的目的选择这些层和神经元的数量,并且NNU 121可以用于对于不同数量的隐藏层和每层的不同数量的神经元以及对于非完全连接的神经元执行类似的计算。在一个实施例中,对于层中不存在的神经元或对于到神经元的不存在的连接,可以将权重值设置为零。优选地,架构程序将第一权重集合写入权重RAM 124并启动NNU 121,并且当NNU 121执行与第一层相关联的计算时,架构程序将第二权重集合写入权重RAM 124,使得一旦NNU 121完成对于第一隐藏层的计算,NNU 121就可以开始对于第二层的计算。以此方式,架构程序在权重RAM 124的两个区域之间来回往复,以便保持NNU 121被充分利用。流程在框602处开始。
在框602处,处理器100(即,在处理器100上运行的架构程序)将到神经元的当前隐藏层的输入值写入数据RAM 122,例如写入数据RAM 122的行17,如关于图6A所示和所述的。可替换地,作为NNU 121对于在前层(例如,卷积、池化或输入层)的运算的结果133,值可能已经在数据RAM 122的行17中。另外,架构程序将变量N初始化为值1。变量N表示由NNU 121处理的隐藏层的当前层。此外,架构程序将变量NUM_LAYERS初始化为值4,因为在该示例中有4个隐藏层。流程进行到框604。
在框604处,处理器100将层1的权重字写入权重RAM 124,例如写入行0到511,如图6A所示。流程进行到框606。
在框606处,处理器100使用指定写入程序存储器129的函数1432的MTNN 1400指令将乘法-累加-激活函数程序(例如,图4的)写入NNU 121程序存储器129。然后,处理器100使用指定开始执行程序的函数1432的MTNN 1400指令来启动NNU程序。流程进行到判定框608。
在判定框608处,架构程序确定变量N的值是否小于NUM_LAYERS。如果是,则流程进行到框612;否则,流程进行到框614。
在框612处,处理器100将用于层N+1的权重字写入权重RAM 124,例如写入行512到1023。因此,有利地,在NNU 121正在对当前层执行隐藏层计算时,架构程序将用于下一层的权重字写入权重RAM 124,使得一旦对于当前层的计算完成,即写入数据RAM 122,NNU 121就可立即开始执行对于下一层的隐藏层计算。流程进行到框614。
在框614处,处理器100确定当前运行的NNU程序(在层1的情况下在框606处开始,在层2至4的情况下在框618处开始)已经完成。优选地,处理器100通过执行读取NNU 121状态寄存器127的MFNN 1500指令来确定这一点。在替代实施例中,NNU 121生成中断以指示其已完成乘法-累加-激活函数层程序。流程进行到判定框616。
在判定框616处,架构程序确定变量N的值是否小于NUM_LAYERS。如果是,则流程进行到框618;否则,流程进行到框622。
在框618处,处理器100更新乘法-累加-激活函数程序,使得其可以执行对于层N+1的隐藏层计算。更具体地,处理器100将图4的地址1处的乘法-累加指令的数据RAM 122行值更新为前一层将其结果写入其中的数据RAM 122的行(例如,更新为行16),并且更新输出行(例如,更新为行15)。然后,处理器100启动更新的NNU程序。可替换地,图4的程序指定地址4的输出指令中的相同行作为在地址1的乘法-累加指令中指定的行(即,从数据RAM 122中读取的行)。在该实施例中,输入数据字的当前行被重写(这是可以接受的,只要数据字的行不需要用于某些其它目的,因为数据字的行已经被读入多路复用寄存器208并通过N字旋转器在NPU 126中旋转)。在此情况下,在框618处不需要更新NNU程序,而是仅需要重新开始它。流程进行到框622。
在框622处,处理器100从层N的数据RAM 122读取NNU程序的结果。然而,如果结果简单地由下一层使用,则架构程序可能不需要从数据RAM 122读取结果,而是将它们留在数据RAM 122中用于下一隐藏层计算。流程进行到判定框624。
在判定框624处,架构程序确定变量N的值是否小于NUM_LAYERS。如果是,则流程进行到框626;否则,流程结束。
在框626处,架构程序将N递增1。流程返回到判定框608。
如从图6B的示例可以确定的,大约每512个时钟周期,NPU 126从数据RAM 122读取一次和写入一次(借助于图4的NNU程序的操作)。此外,NPU 126大约在每个时钟周期读取权重RAM 124以读取权重字的行。因此,以NNU 121执行隐藏层运算的混合方式消耗权重RAM124的整个带宽。另外,假设包括诸如图17的缓冲器1704的写入和读取缓冲器的实施例与NPU 126同时读取,处理器100写入权重RAM 124,使得缓冲器1704大约每16个时钟周期执行一次对权重RAM 124的写入以写入权重字。因此,在权重RAM 124的单端口实施例(例如参照图17所描述的)中,大约每16个时钟周期,NPU 126必须停止从权重RAM 124读取,以使缓冲器1704能够写入权重RAM 124。然而,在权重RAM 124是双端口的实施例中,NPU 126不需要停止。
现在参考图7,示出了例示根据替代实施例的图1的NPU 126的框图。图7的NPU 126在许多方面与图2的NPU 126类似。然而,图7的NPU 126还包括第二2-输入多路复用寄存器705。多路复用寄存器705选择其输入端206或711中的一个以存储在其寄存器中,然后在随后的时钟周期上在其输出端203上提供。输入端206从权重RAM 124接收权重字。另一个输入端711接收相邻NPU 126的第二多路复用寄存器705的输出203。优选地,NPU J的多路复用寄存器705输入端711接收NPU 126实例J-1的多路复用寄存器705输出203,并将NPU J的输出提供给NPU 126实例J+1的多路复用寄存器705输入端711。以此方式,N个NPU 126的多路复用寄存器705共同作为N字旋转器操作,类似于上面关于图3所述的方式,但是对于权重字而不是数据字。控制输入713控制多路复用寄存器705选择两个输入中的哪个来存储在其寄存器中并随后在输出端203上提供。
包括多路复用寄存器208和/或多路复用寄存器705(以及诸如图18和23的其它实施例的多路复用寄存器)以有效地形成旋转从数据RAM 122和/或权重RAM 124接收的行的数据/权重的大旋转器具有的优点是NNU 121不需要极大的多路复用器,否则在数据RAM122和/或权重RAM 124之间就需要极大的多路复用器,以便向适当的NNU 121提供必要的数据/重量字。
除激活函数结果外,回写累加器值
在一些应用中,处理器100接收回(例如,经由图15的MFNN指令到媒体寄存器118)原始累加器202值217(在其它执行单元112上执行的指令可以对其执行计算)是有用的。例如,在一个实施例中,为了降低AFU 212的复杂性,它不被配置为执行softmax激活函数。因此,NNU 121可以将原始累加器202值217或其子集输出到数据RAM 122或权重RAM 124,架构程序随后从数据RAM 122或权重RAM 124读取它,并对原始值执行计算。然而,原始累加器202的值217的使用不限于softmax的执行,可以设想其他用途。
现在参考图8,示出了例示根据替代实施例的图1的NPU 126的框图。图8的NPU 126在许多方面类似于图2的NPU 126。然而,图8的NPU 126包括具有控制输入803的AFU 212中的多路复用器(mux)802。累加器202的宽度(以位为单位)大于数据字的宽度。多路复用器802具有接收累加器202输出217的数据字宽度的部分的多个输入。在一个实施例中,累加器202的宽度为41位,NPU 126被配置为输出16位的结果字133;因此,例如,多路复用器802(或图30的多路复用器3032和/或多路复用器3037)包括分别接收累加器202输出217的位[15:0]、位[31:16]和位[47:32]的三个输入端。优选地,将累加器202没有提供的输出位(例如,位[47:41])强制为零值位。
序列发生器128在控制输入端803上生成值,以控制多路复用器802响应于写ACC指令(例如下述图9的地址3至5处的写ACC指令)选择累加器202的字(例如,16位)中的一个字。优选地,多路复用器802还具有一个或多个输入端,其接收生成数据字的宽度的输出的激活函数电路(例如,图30的组件3022、3024、3026、3018、3014和3016)的输出。序列发生器128在控制输入端803上生成值,以响应于诸如在图4的地址4处的写AFU输出指令之类的指令而控制多路复用器802选择激活函数电路输出中的一个,而不是累加器202的字中的一个。
现在参考图9,示出了例示用于存储在图1的NNU 121的程序存储器129中并由该NNU 121执行的程序的表。图9的示例性程序在许多方面与图4的程序类似。具体地,在地址0至2的指令是相同的。然而,在图4的地址3和4的指令在图9中由写ACC指令代替,其指示512个NPU 126将它们的累加器202输出217作为结果133回写到数据RAM 122的三行,在该示例中是行16到18。即,写ACC指令指示序列发生器128在第一时钟周期中输出数据RAM地址123的值16和写命令,在第二时钟周期中输出数据RAM地址123的值17和写命令,并且在第三时钟周期中输出数据RAM地址123的值18和写命令。优选地,写ACC指令的执行可以与其它指令的执行重叠,使得写ACC指令在三个时钟周期中有效地执行,一个时钟周期用于写入数据RAM 122中的一行。在一个实施例中,用户指定控制寄存器127(图29A的)中激活函数2934和输出命令2956字段的值,以完成将累加器202的所期望部分写入数据RAM 122或权重RAM124。可替换地,不是回写累加器202的全部内容,写ACC指令可以可任选地回写累加器202的子集。在一个实施例中,可以回写累加器202的规范形式,如下面关于图29至31更详细地描述的。
现在参考图10,示出了例示由NNU 121执行图9的程序的时序图。图10的时序图类似于图5的时序图,时钟0至512是相同的。然而,在时钟513-515,512个NPU 126中的每一个的AFU 212执行图9的地址3至5处的写ACC指令中的一个。具体地,在时钟513,512个NPU 126中的每一个将累加器202输出217的位[15:0]作为其结果133回写到数据RAM 122的行16的其相应字;在时钟514,512个NPU 126中的每一个将累加器202输出217的位[31:16]作为其结果133回写到数据RAM 122的行17的其相应字;在时钟515,512个NPU 126中的每一个将累加器202输出217的位[40:32]作为其结果133回写到数据RAM 122的行18的其相应字。优选地,位[47:41]被强制为零值。
共享AFU
现在参考图11,示出了例示图1的NNU 121的实施例的框图。在图11的实施例中,神经元被分成两部分,即激活函数单元部分和ALU部分(其还包括移位寄存器部分),每个激活函数单元部分由多个ALU部分共享。在图11中,ALU部分被称为NPU 126,共享的激活函数单元部分被称为AFU 1112。这与例如图2的实施例相反,其中,每个神经元包括其自己的AFU212。因此,例如,在一个实施例中,图11的实施例的NPU126(ALU部分)包括图2的累加器202、ALU 204、多路复用寄存器208和寄存器205,但不包括AFU 212。在图11的实施例中,NNU121包括512个NPU 126作为示例;然而,可以设想具有其他数量的NPU 126的其他实施例。在图11的示例中,512个NPU 126被分组为64组,每组有8个NPU 126,在图11中被称为组0至组63。
NNU 121还包括行缓冲器1104和耦合在NPU 126和行缓冲器1104之间的多个共享AFU 1112。行缓冲器1104具有与数据RAM 122或权重RAM 124的行相同的宽度(以位为单位),例如512个字。每个NPU 126组有一个AFU 1112,即,每个AFU 1112都具有对应的NPU126组;因此,在图11的实施例中,存在对应于64个NPU 126组的64个AFU 1112。组中的八个NPU 126中的每一个共享对应的AFU 1112。可以设想每组具有不同数量的AFU 1112和NPU126的其它实施例。例如,考虑组中的两个或四个或十六个NPU 126共享AFU 1112的其它实施例。
共享AFU 1112的动机是减小NNU 121的尺寸。以性能降低为代价获得尺寸减小。即,取决于共享率,可能需要几个时钟来生成用于整个NPU 126阵列的结果133,如下面的图12所示,例如,其中,由于8:1共享率,需要七个额外时钟周期。然而,一般来说,与生成累加和所需的时钟数量(例如,对于每个神经元具有512个连接的层,512个时钟)相比,额外的时钟数量(例如,7)相对较小。因此,相对较小的性能影响(例如,计算时间增加百分之一)可以是NNU 121尺寸减小的值得的折衷。
在一个实施例中,NPU 126中的每一个包括执行相对简单的激活函数的AFU 212,从而能够使简单AFU 212相对较小并从而包括在每个NPU 126中;而共享的或复杂的AFU1112执行相对复杂的激活函数,因此相对显着地大于简单AFU 212。在这个实施例中,仅当指定需要共享复杂AFU 1112的复杂激活函数时,而不是当指定了简单AFU 212被配置为执行的激活函数时,才需要额外的时钟周期。
现在参考图12和13,示出了例示图11的NNU 121执行图4的程序的两个时序图。图12的时序图类似于图5的时序图,时钟0至512相同。然而,在时钟513,操作与图5的时序图中所描述的不同,因为图11的NPU 126共享AFU 1112;即,一组的NPU 126共享与该组相关联的AFU 1112,图11示出了共享。
图13的时序图的每一行对应于在第一列中指示的连续时钟周期。其他列中的每一列对应于64个AFU 1112中的不同的一个并指示其操作。为了说明的简单和清楚,仅示出了用于AFU 0、1和63的操作。图13的时钟周期对应于图12的时钟周期,但示出了NPU 126以不同方式共享AFU 1112。在时钟0-512,64个AFU 1112中的每一个不运行,如图13所示,而NPU126执行初始化NPU和乘法-累加及乘法-累加旋转指令。
如图12和13所示,在时钟513,AFU 0(与组0相关联的AFU 1112)开始对作为组0中第一个NPU 126的NPU 0的累加器202值217执行指定的激活函数,并且AFU 0的输出将被存储到行缓冲器1104字0。同样在时钟513,AFU 1112中的每个开始在其相应NPU 126组中的第一个NPU 126的累加器202上执行指定的激活函数。因此,在时钟513中,如图13所示,AFU 0开始在NPU 0的累加器202上执行指定的激活函数,以生成将被存储到行缓冲器1104字0的结果;AFU 1开始在NPU 8的累加器202上执行指定的激活函数,以生成将被存储到行缓冲器1104字8的结果;依此类推,直至AFU 63开始在NPU 504的累加器202上执行指定的激活函数,以生成将被存储到行缓冲器1104字504的结果。
在时钟514,AFU 0(与组0相关联的AFU 1112)开始对作为组0中的第二个NPU 126的NPU 1的累加器202值217执行指定的激活函数,并且AFU的输出0将被存储到行缓冲器1104字1,如图所示。同样在时钟514,AFU 1112中的每个开始在其相应NPU 126组中的第二个NPU 126的累加器202上执行指定的激活函数。因此,在时钟514中,如图13所示,AFU 0开始在NPU 1的累加器202上执行指定的激活函数,以生成将被存储到行缓冲器1104字1的结果;AFU 1开始在NPU 9的累加器202上执行指定的激活函数,以生成将被存储到行缓冲器1104字9的结果;依此类推,直至AFU 63开始在NPU 505的累加器202上执行指定的激活函数,以生成将被存储到行缓冲器1104字505的结果。该模式继续,直到在时钟周期520,AFU 0(与组0相关联的AFU 1112)开始对作为组0中的第八个(最后一个)NPU 126的NPU 7的累加器202值217执行指定的激活函数,AFU 0的输出将被存储到行缓冲器1104字7,如图所示。同样在时钟520,AFU 1112的每个开始在其相应NPU 126组中的第八个NPU 126的累加器202上执行指定的激活函数。因此,在时钟520中,如图13所示,AFU 0开始在NPU 7的累加器202上执行指定的激活函数,以生成将被存储到行缓冲器1104字7的结果;AFU 1开始在NPU 15的累加器202上执行指定的激活函数,以生成将被存储到行缓冲器1104字15的结果;依此类推,直至AFU 63开始在NPU 511的累加器202上执行指定的激活函数,以生成将被存储到行缓冲器1104字511的结果。
在时钟521,一旦已经生成了与512个NPU 126相关联的所有512个结果并将其写入行缓冲器1104,行缓冲器1104就开始将其内容写入数据RAM 122或权重RAM 124。以此方式,64组NPU 126中的每一个的AFU 1112执行图4的地址3处的激活函数指令的一部分。
诸如图11的在ALU 204的组中共享AFU 1112的实施例结合整数ALU 204是特别有利的,如下面例如关于图29A至33更多地描述的。
MTNN和MFNN架构指令
现在参考图14,示出了例示移动到神经网络(MTNN)架构指令1400及其相对于图1的NNU 121的各部分的操作的框图。MTNN指令1400包括操作码字段1402、src1字段1404、src2字段1406、gpr字段1408和立即字段1412。MTNN指令1400是架构指令,即它被包括在处理器100的指令集架构中。优选地,指令集架构将操作码字段1402的预定值与MTNN指令1400相关联,以将其与指令集架构中的其他指令区分开。MTNN指令1400操作码1402可以包括或可以不包括诸如在x86架构中是常见的前缀。
立即字段1412向NNU 121的控制逻辑1434提供指定功能1432的值。优选地,功能1432作为图1的微指令105的立即操作数提供。可以由NNU 121执行的功能1432包括但不限于写入数据RAM 122,写入权重RAM 124,写入程序存储器129,写入控制寄存器127,开始执行程序存储器129中的程序,暂停执行程序存储器129中的程序,完成程序存储器129中的程序的执行的请求通知(例如,中断),以及重置NNU 121。优选地,NNU指令集包括其结果指示NNU程序完成的指令。可替换地,NNU指令集包括显式生成中断指令。优选地,除了数据RAM122、权重RAM 124、程序存储器129的内容保持原样之外,重置NNU 121包括有效地迫使NNU121返回到复位状态(例如,内部状态机被清除并设置为空闲状态)。另外,诸如累加器202的内部寄存器不受重置功能的影响,并且必须例如通过图4的地址0处的初始化NPU指令来明确地清除。在一个实施例中,功能1432可以包括直接执行功能,其中,第一源寄存器包含微操作(参见例如图34的微操作3418)。直接执行功能指示NNU 121直接执行指定的微操作。以此方式,架构程序可以直接控制NNU 121执行操作,而不是将指令写入程序存储器129,然后指示NNU 121执行程序存储器中的指令,或者通过执行MTNN指令1400(或图15的MFNN指令1500)。图14示出了写入数据RAM 122的功能1432的示例。
gpr字段1408指定通用寄存器文件116中的GPR中的一个。在一个实施例中,每个GPR是64位。通用寄存器文件116将值从所选择的GPR提供给NNU 121,如图所示,NNU 121使用该值作为地址1422。地址1422选择在功能1432中指定的存储器的行。在数据RAM 122或权重RAM 124的情况下,地址1422另外选择位于所选择的行内且大小为媒体寄存器的大小(例如512位)的两倍的块。优选地,该位置在512位的边界上。在一个实施例中,多路复用器选择地址1422(或在下面描述的MFNN指令1400的情况下的地址1422)或来自序列发生器128的地址123/125/131,以提供给数据RAM 122/权重RAM 124/程序存储器129。在一个实施例中,如下面更详细描述的,数据RAM 122是双端口的,以允许NPU 126与媒体寄存器118读/写数据RAM 122同时读/写数据RAM 122。在一个实施例中,出于类似的目的,权重RAM 124也是双端口的。
src1字段1404和src2字段1406各自指定媒体寄存器文件118中的媒体寄存器。在一个实施例中,每个媒体寄存器118是256位。媒体寄存器文件118将来自所选择的媒体寄存器的连续数据(例如,512位)提供给数据RAM 122(或权重RAM 124或程序存储器129),用于写入由地址1422指定的所选行1428和所选行1428内由地址1422指定的位置,如图所示。有利地,通过执行一系列MTNN指令1400(以及下面描述的MFNN指令1400),在处理器100上执行的架构程序可以填充数据RAM 122的行和权重RAM 124的行,并将程序写入程序存储器129,例如本文所描述的(例如,图4和图9的)程序,以使NNU 121以极高的速度对数据和权重执行运算,以完成人工神经网络。在一个实施例中,架构程序直接控制NNU 121,而不是将程序写入程序存储器129。
在一个实施例中,MTNN指令1400不指定两个源寄存器(例如,1404和1406),而是指定起始源寄存器和多个源寄存器Q。这种形式的MTNN指令1400指示处理器100将指定为开始源寄存器的媒体寄存器118以及接下来的Q-1个顺序媒体寄存器118写入NNU 121,即写入指定的数据RAM 122或权重RAM 124。优选地,指令转换器104将MTNN指令1400转换成与写入所有Q个指定的媒体寄存器118所需的一样多的微指令。例如,在一个实施例中,当MTNN指令1400将开始源寄存器指定为MR4并且Q为8时,则指令转换器104将MTNN指令1400转换为四个微指令,其中第一个微指令写MR4和MR5,其中第二个微指令写MR6和MR7,其中第三个微指令写MR8和MR9,其中第四个微指令写MR10和MR11。在从媒体寄存器118到NNU 121的数据路径是1024位而不是512位的替代实施例中,指令转换译器104将MTNN指令1400转换为两个微指令,其中第一个微指令写MR4到MR7,其中第二个微指令写MR8到MR11。考虑类似的实施例,其中,MFNN指令1500指定起始目的地寄存器和多个目的地寄存器,以使得与单个媒体寄存器118相比能够每MFNN指令1500读取数据RAM 122或权重RAM 124的行的更大的块。
现在参考图15,示出了例示从神经网络移动(MFNN)架构指令1500及其相对于图1的NNU 121的各部分的操作的框图。MFNN指令1500包括操作码字段1502、dst字段1504、gpr字段1508和立即字段1512。MFNN指令1500是架构指令,即,其被包括在处理器100的指令集架构中。优选地,指令集架构将操作码字段1502的预定值与MFNN指令1500相关联,以将其与指令集架构中的其他指令区分开。MFNN指令1500操作码1502可以包括或可以不包括诸如在x86架构中是常见的前缀。
立即字段1512向NNU 121的控制逻辑1434提供指定功能1532的值。优选地,功能1532作为图1的微指令105的立即操作数提供。可以由NNU 121执行的功能1532包括但不限于从数据RAM 122读取,从权重RAM 124读取,从程序存储器129读取以及从状态寄存器127读取。图15示出了从数据RAM 122读取的功能1532的示例。
gpr字段1508指定通用寄存器文件116中的GPR中的一个。通用寄存器文件116将值从所选择的GPR提供给NNU 121,如图所示,其使用该值作为地址1522,地址1522以类似于图14的地址1422的方式操作,以选择在功能1532中指定的存储器的行,在数据RAM 122或权重RAM 124的情况下,地址1522另外选择位于在所选择的行内且大小为媒体寄存器的大小(例如256位)的块。优选地,该位置在256位的边界上。
dst字段1504指定媒体寄存器文件118中的媒体寄存器。媒体寄存器文件118从数据RAM 122(或权重RAM 124或程序存储器129)接收到所选择的媒体寄存器中的数据(例如,256位),该数据从由地址1522指定的所选行1528和从所选行1528内由地址1522指定的位置读取,如图所示。
NNU内部RAM端口配置
现在参考图16,示出了例示图1的数据RAM 122的实施例的框图。数据RAM 122包括存储器阵列1606、读端口1602和写端口1604。存储器阵列1606保存数据字,并且优选地被布置为如上所述的N个字的D行。在一个实施例中,存储器阵列1606包括64个水平排列的静态RAM单元的阵列,其中每个单元是128位宽和64高以提供8192位宽且具有64行的64KB数据RAM 122,数据RAM 122占据大约0.2平方毫米的管芯面积。然而,可以设想其它实施例。
读端口1602优选地以多路复用方式耦合到NPU 126和媒体寄存器118(更确切地说,媒体寄存器118可以通过结果总线耦合到读端口1602,结果总线还可以向重排序缓冲器和/或到其他执行单元112的结果转发总线提供数据)。NPU 126和媒体寄存器118共享读端口1602以读取数据RAM 122。写端口1604也优选地以多路复用方式耦合到NPU 126和媒体寄存器118。NPU 126和媒体寄存器118共享写端口1604以写入数据RAM 122。因此,有利地,在NPU 126从数据RAM 122读取时,媒体寄存器118可以同时写入数据RAM 122,或者在媒体寄存器118从数据RAM 122读取时,NPU 126可以同时写入数据RAM 122。这可以有利地提供改进的性能。例如,当媒体寄存器118向数据RAM 122写入更多数据字时,NPU 126可以读取数据RAM 122(例如,继续执行计算)。对于另一示例,在媒体寄存器118从数据RAM 122读取计算结果的同时,NPU 126可以将计算结果写入数据RAM 122。在一个实施例中,NPU 126可以向数据RAM 122写入一行计算结果,同时NPU 126也从数据RAM 122读取一行数据字。在一个实施例中,存储器阵列1606被配置在存储体(bank)中。当NPU 126访问数据RAM 122时,所有存储体被激活以访问存储器阵列1606的整个行;而当媒体寄存器118访问数据RAM 122时,仅激活指定的存储体。在一个实施例中,每个存储体是128位宽,媒体寄存器118是256位宽,因此例如每个媒体寄存器118访问激活两个存储体。在一个实施例中,端口1602/1604中的一个是读/写端口。在一个实施例中,端口1602和1604二者都是读/写端口。
如本文所述的NPU 126的旋转器能力的优点是其有助于数据RAM 122的存储器阵列1606具有显着更少的行的能力,且因此比其它情况下为了确保高度利用NPU 126所需的相对小得多,高度利用NPU 126要求架构程序(经由媒体寄存器118)在NPU 126执行计算时能够不断地向数据RAM 122提供数据并且从其取回结果。
内部RAM缓冲区
现在参考图17,示出了例示图1的权重RAM 124和缓冲器1704的实施例的框图。权重RAM 124包括存储器阵列1706和端口1702。存储器阵列1706保存权重字,并且优选地被布置为如上所述的N个字的W行。在一个实施例中,存储器阵列1706包括128个水平排列的静态RAM单元的阵列,其中每个单元是64位宽和2048高以提供8192位宽且具有2048行的2MB权重RAM 124,RAM 124占据大约2.4平方毫米的管芯面积。然而,可以设想其它实施例。
端口1702优选地以多路复用方式耦合到NPU 126和缓冲器1704。NPU 126和缓冲器1704经由端口1702读取和写入权重RAM 124。缓冲器1704还耦合到图1的媒体寄存器118,使得媒体寄存器118通过缓冲器1704读取和写入权重RAM 124。因此,有利地,在NPU 126从权重RAM 124读取或向权重RAM 124写入时,媒体寄存器118可以同时向缓冲器1704写入或从缓冲器1704读取(尽管优选地,如果它们同时执行,则NPU 126停止,以避免在缓冲器1704访问权重RAM 124时访问权重RAM 124)。这可以有利地提供改进的性能,特别是由于媒体寄存器118对权重RAM 124的读/写比NPU 126对权重RAM 124的读/写相对小得多。例如,在一个实施例中,NPU 126一次读/写8192位(一行),而媒体寄存器118是256位宽,并且每个MTNN指令1400写入两个媒体寄存器118,即512位。因此,在架构程序执行十六个MTNN指令1400以填充缓冲器1704的情况下,仅少于大约百分之六的时间对于访问权重RAM 124在NPU 126和架构程序之间发生冲突。在替代实施例中,指令转换器104将MTNN指令1400转换为两个微指令105,每个微指令将单个媒体寄存器118写入缓冲器1704,在这种情况下,对于访问权重RAM124甚至更少地在NPU 126和架构程序之间发生冲突。
在包括缓冲器1704的一个实施例中,由架构程序写入权重RAM 124需要多个MTNN指令1400。一个或多个MTNN指令1400指定功能1432以写入缓冲器1704的指定块,随后是一个MTNN指令1400,其指定指示NNU 121将缓冲器1704的内容写入权重RAM 124的指定行的功能1432,其中,块的大小是媒体寄存器118的位数的两倍,块在缓冲器1704内自然地对准。在一个实施例中,在指定写入缓冲器1704的指定块的功能1432的每个MTNN指令1400中,包括具有对应于缓冲器1704的每个块的位的位掩码。将来自两个指定源寄存器118的数据写入缓冲器1704的其位掩码中的相应位被置位的每个块。这对于权重RAM 124的行内的重复数据值是有用的。例如,为了使缓冲器1704(以及随后的权重RAM 124的行)为零,编程器可以用零加载源寄存器并置位位掩码的所有位。另外,位掩码使得编程器仅向缓冲器1704的所选块写入,从而将先前的数据保留在其他块中。
在包括缓冲器1704的一个实施例中,由架构程序从权重RAM 124读取需要多个MFNN指令1500。初始MFNN指令1500指定功能1532以从权重RAM124的指定行加载缓冲器1704,随后是一个或多个MFNN指令1500,其指定将缓冲器1704的指定块读取到目的地寄存器中的功能1532,其中,块的大小是媒体寄存器118的位数,块在缓冲器1704内自然地对准。考虑其他实施例,其中,权重RAM 124包括多个缓冲器1704以进一步减少NPU 126和架构程序之间对于访问权重RAM 124的竞争,其借助于在NPU 126执行的同时增加可以由架构程序进行的访问的数量,这可以增大在NPU 126不需要访问权重RAM 124的时钟周期期间可以由缓冲器1704执行访问的可能性。
虽然图16说明了双端口数据RAM 122,但是可以设想权重RAM 124也是双端口的其他实施例。此外,虽然图17说明了与权重RAM 124一起使用的缓冲器,但是可以设想数据RAM122还具有类似于缓冲器1704的相关缓冲器的其他实施例。
动态可配置NPU
现在参考图18,示出了例示图1的动态可配置NPU 126的框图。图18的NPU 126在许多方面类似于图2的NPU 126。然而,图18的NPU 126可动态配置为以两种不同配置中的一种操作。在第一配置中,图18的NPU 126类似于图2的NPU 126操作。即,在本文称为“宽”配置或“单”配置的第一配置中,NPU 126的ALU 204对单个宽数据字和单个宽权重字(例如,16位)执行运算以生成单个宽结果。相比之下,在本文称为“窄”配置或“双”配置的第二配置中,NPU 126对两个窄数据字和两个相应窄权重字(例如,8位)执行运算以生成两个相应的窄结果。在一个实施例中,NPU 126的配置(宽或窄)由初始化NPU指令(例如,在下面描述的图20的地址0)进行。可替换地,配置通过MTNN指令进行,其功能1432指定将NPU 126配置为该配置(宽或窄)。优选地,配置寄存器由确定配置(宽或窄)的程序存储器129指令或MTNN指令填充。例如,将配置寄存器输出提供给ALU 204、AFU 212和生成多路复用寄存器控制信号213的逻辑。一般来说,图18的NPU 126的组件执行与图2的其类似编号的组件相似的功能,为了理解图18,应参考图2。然而,现在将描述图18的实施例,包括与图2的不同之处。
图18的NPU 126包括两个寄存器205A和205B、两个3-输入多路复用寄存器208A和208B、ALU 204、两个累加器202A和202B、以及两个AFU 212A和212B。寄存器205A/205B中的每一个分别是图2的寄存器205的宽度(例如,8位)的一半。寄存器205A/205B中的每一个从权重RAM 124接收相应的窄权重字206A/206B(例如,8位),在随后的时钟周期上将其输出203A/203B提供给ALU 204的操作数选择逻辑电路1898。当NPU 126处于宽配置时,寄存器205A/205B有效地一起运行以从权重RAM 124接收宽权重字206A/206B(例如,16位),类似于图2的实施例的寄存器205的方式;当NPU 126处于窄配置时,寄存器205A/205B有效地单独地运行,每一个从权重RAM 124接收窄权重字206A/206B(例如,8位),使得NPU 126实际上是两个单独的窄NPU。然而,权重RAM 124的相同输出位耦合到并提供给寄存器205A/205B,而不管NPU 126的配置如何。例如,NPU 0的寄存器205A接收字节0,NPU的寄存器205B 0接收字节1,NPU 1的寄存器205A接收字节2,NPU 1的寄存器205A接收字节3,依此类推,直至NPU511的寄存器205B接收字节1023。
多路复用寄存器208A/208B中的每一个分别是图2的寄存器208的宽度(例如,8位)的一半。多路复用寄存器208A选择其输入端207A或211A或1811A中的一个以存储在其寄存器中,然后在随后的时钟周期上在其输出端209A上提供,多路复用寄存器208B选择其输入端207B或211B或1811B中的一个以存储在其寄存器中,然后在随后的时钟周期上在其输出端209B上提供给操作数选择逻辑电路1898。输入端207A从数据RAM 122接收窄数据字(例如,8位),输入端207B从数据RAM 122接收窄数据字。当NPU 126处于宽配置时,多路复用寄存器208A/208B有效地一起运行以从数据RAM 122接收宽数据字207A/207B(例如,16位),类似于图2的实施例的多路复用器208的方式;当NPU 126处于窄配置时,多路复用器寄存器208A/208B有效地单独运行,每一个从数据RAM 122接收窄数据字207A/207B(例如,8位),使得NPU 126实际上是两个单独的窄NPU。然而,无论NPU 126的配置如何,数据RAM 122的相同输出位耦合到并提供给多路复用寄存器208A/208B。例如,NPU 0的多路复用寄存器208A接收字节0,NPU 0的多路复用寄存器208B接收字节1,NPU 1的多路复用寄存器208A接收字节2,NPU 1的多路复用寄存器208A接收字节3,依此类推,直至NPU 511的多路复用寄存器208B接收字节1023。
输入端211A接收相邻NPU 126的多路复用寄存器208A的输出209A,输入端211B接收相邻NPU 126的多路复用寄存器208B的输出209B。输入端1811A接收相邻NPU 126的多路复用寄存器208B的输出209B,输入端1811B接收当前NPU 126的多路复用器208A的输出209A,如图所示。图18所示的NPU 126被表示为图1的N个NPU 126中的NPU J。即,NPU J是N个NPU 126的代表性实例。优选地,NPU J的多路复用寄存器208A输入端211A接收NPU 126实例J-1的多路复用寄存器208A输出209A,NPU J的多路复用寄存器208A输入端1811A接收NPU126实例J-1的多路复用寄存器208B输出209B,NPU J的多路复用寄存器208A输出209A被提供给NPU 126实例J+1的多路复用寄存器208A输入端211A和NPU 126实例J的多路复用寄存器208B输入端211B;NPU J的多路复用寄存器208B输入端211B接收NPU 126实例J-1的多路复用寄存器208B输出209B,NPU J的多路复用寄存器208B输入端1811B接收NPU 126实例J的多路复用寄存器208A输出209A,NPU J的多路复用寄存器208B输出209B被提供给NPU 126实例J+1的多路复用寄存器208A输入端1811A和NPU 126实例J+1的多路复用寄存器208B输入端211B。
控制输入213控制多路复用寄存器208A/208B中的每一个选择三个输入中的哪一个存储在其相应寄存器中并随后在相应的输出端209A/209B上提供。当指示NPU 126从数据RAM 122加载行时(例如,通过图20的地址1处的乘法-累加指令,如下所述),不管NPU 126是处于宽配置还是窄配置,控制输入213控制多路复用寄存器208A/208B中的每一个从数据RAM 122的所选择的行的相应窄字中选择各自的窄数据字207A/207B(例如,8位)。
当指示NPU 126旋转先前接收到的数据行值(例如,通过图20的地址2处的乘法-累加旋转指令,如下所述)时,如果NPU 126处于窄配置,则控制输入213控制多路复用寄存器208A/208B中的每一个选择相应的输入1811A/1811B。在此情况下,多路复用寄存器208A/208B有效地单独运行,使得NPU 126实际上是两个单独的窄NPU。以此方式,N个NPU 126的多路复用寄存器208A和208B作为2N窄字旋转器共同操作,如下面关于图19更详细描述的。
当指示NPU 126旋转先前接收到的数据行值时,如果NPU 126处于宽配置,则控制输入213控制多路复用寄存器208A/208B中的每一个选择相应的输入211A/211B。在此情况下,多路复用寄存器208A/208B有效地一起运行,就好像NPU 126是单个宽NPU 126。以此方式,N个NPU 126的多路复用寄存器208A和208B作为N宽字旋转器共同操作,类似于关于图3所描述的方式。
ALU 204包括操作数选择逻辑电路1898、宽乘法器242A、窄乘法器242B、宽两输入多路复用器1896A、窄两输入多路复用器1896B、宽加法器244A和窄加法器244B。有效地,ALU204包括操作数选择逻辑电路1898、宽ALU 204A(包括宽乘法器242A、宽多路复用器1896A和宽加法器244A)和窄ALU 204B(包括窄乘法器242B、窄多路复用器1896B和窄加法器244B)。优选地,宽乘法器242A乘以两个宽字,类似于图2的乘法器242,例如16位乘16位乘法器。窄乘法器242B乘以两个窄字,例如生成16位结果的8位乘8位乘法器。当NPU 126处于窄配置时,宽乘法器242A在操作数选择逻辑电路1898的帮助下被有效地用作窄乘法器以乘以两个窄字,使得NPU126有效地用作两个窄NPU。优选地,宽加法器244A将宽多路复用器1896A的输出和宽累加器202A输出217A相加,以生成用于提供给宽累加器202A的和215A,类似于图2的加法器244。窄加法器244B将窄多路复用器1896B的输出和窄累加器202B输出217B相加,以生成用于提供给窄累加器202B的和215B。在一个实施例中,窄累加器202B是28位宽,以避免高达1024个16位乘积的累加中的精度损失。当NPU 126处于宽配置时,窄乘法器242B、窄多路复用器1896B、窄加法器244B,窄累加器202B和窄AFU 212B优选地不运行,以减少功耗。
操作数选择逻辑电路1898从209A、209B、203A和203B选择操作数以提供给ALU 204的其它组件,如下面更详细描述的。优选地,操作数选择逻辑电路1898还执行其他功能,例如执行有符号值数据字和权重字的符号扩展。例如,如果NPU 126处于窄配置,则操作数选择逻辑电路1898在将窄数据字和权重字提供给宽乘法器242A之前将其符号扩展到宽字的宽度。类似地,如果指示ALU 204让窄数据/权重字(通过宽多路复用器1896A旁路宽乘法器242A)通过,则操作数选择逻辑电路1898在将窄数据字和权重字提供给宽加法器244A之前将其符号扩展到宽字的宽度。优选地,逻辑电路还存在于图2的NPU 126的ALU 204中,以执行符号扩展功能。
宽多路复用器1896A接收宽乘法器242A的输出和来自操作数选择逻辑电路1898的操作数,并选择输入中的一个以提供给宽加法器244A,窄多路复用器1896B接收窄乘法器242B的输出和来自操作数选择逻辑电路1898的操作数,并选择输入中的一个以提供给窄加法器244B。
由操作数选择逻辑电路1898提供的操作数取决于NPU 126的配置以及在由ALU204基于由正由NPU 126执行的指令指定的功能而执行的算术和/或逻辑运算。例如,如果指令指示ALU 204执行乘法-累加并且NPU 126处于宽配置,则操作数选择逻辑电路1898在一个输入端上向宽乘法器242A提供是输出209A和209B的串联的宽字,并且在另一个输入端上提供是输出203A和203B的串联的宽字,窄乘法器242B不运行,使得NPU 126用作类似于图2的NPU 126的单个宽NPU 126。然而,如果指令指示ALU 204执行乘法-累加且NPU 126处于窄配置,则操作数选择逻辑电路1898在一个输入端上向宽乘法器242A提供窄数据字209A的扩展或加宽的形式,另一个输入端上提供窄权重字203A的扩展形式;另外,操作数选择逻辑电路1898在一个输入端上向窄乘法器242B提供窄数据字209B,在另一个输入端上提供窄权重字203B。为了扩展或加宽窄字,如果窄字是有符号的,则操作数选择逻辑电路1898对窄字进行符号扩展,而如果窄字是无符号的,则操作数选择逻辑电路1898用零值高位填充窄字。
对于另一示例,如果NPU 126处于宽配置并且指令指示ALU 204执行权重字的累加,则宽乘法器242A被旁路,并且操作数选择逻辑电路1898将输出203A和203B的串联提供给宽多路复用器1896A,以提供给宽加法器244A。然而,如果NPU126处于窄配置并且指令指示ALU 204执行权重字的累加,则宽乘法器242A被旁路,并且操作数选择逻辑电路1898将输出203A的扩展形式提供给宽多路复用器1896A,用于提供给宽加法器244A;窄乘法器242B被旁路,并且操作数选择逻辑电路1898将输出203B的扩展形式提供给窄多路复用器1896B,以提供给窄加法器244B。
对于另一示例,如果NPU 126处于宽配置并且指令指示ALU 204执行数据字的累加,则宽乘法器242A被旁路,并且操作数选择逻辑电路1898将输出209A和209B的串联提供给宽多路复用器1896A,以提供给宽加法器244A。然而,如果NPU 126处于窄配置并且指令指示ALU 204执行数据字的累加,则宽乘法器242A被旁路,并且操作数选择逻辑电路1898将输出209A的扩展形式提供给宽多路复用器1896A,以提供给宽加法器244A;窄乘法器242B被旁路,并且操作数选择逻辑电路1898将输出209B的扩展形式提供给窄多路复用器1896B,以提供给窄加法器244B。权重/数据字的累加可用于执行在一些人工神经网络应用(例如图像处理)的池化层中使用的求均值运算。
优选地,NPU 126还包括用于旁路宽加法器244A的第二宽多路复用器(未示出),以便于在宽配置中以宽数据/权重字加载宽累加器202A或者在窄配置中以扩展窄数据/权重字加载宽累加器202A,还包括用于旁路窄加法器244B的第二窄多路复用器(未示出),以便于在窄配置中以窄数据/权重字加载窄累加器202B。优选地,ALU 204还包括接收相应累加器值217A/217B和相应多路复用器1896A/1896B输出的宽和窄比较器/多路复用器组合(未示出),以选择累加器值217A/217B与数据/权重字209A/B/203A/B中的最大值,这是在一些人工神经网络应用的池化层中使用的操作,如下面例如关于图27和28更详细描述的。另外,操作数选择逻辑电路1898被配置为提供零值操作数(用于与零相加或用于清零累加器)并且提供一值操作数(用于乘以1)。
窄AFU 212B接收窄累加器202B的输出217B并对其执行激活函数以生成窄结果133B,宽AFU 212A接收宽累加器202A的输出217A并对其执行激活函数以生成宽结果133A。当NPU 126处于窄配置时,宽AFU 212A相应地考虑宽累加器202A的输出217A,并对其执行激活函数以生成窄结果,例如8位,例如如下面关于图29A至30更详细描述的。
从上述说明可以观察到,有利地,当处于窄配置时,单个NPU 126有效地作为两个窄NPU操作,因此对于较小的字,提供大约高达两倍于当处于宽配置时的吞吐量。例如,假设具有1024个神经元的神经网络层,每个神经元从前一层接收1024个窄输入(并且具有窄权重字),导致1兆连接。与具有宽配置中的512个NPU 126的NNU 121相比,具有窄配置中的512个NPU 126的NNU 121(1024窄NPU)能够在大约一半的时间(大约1026个时钟对514个时钟)中处理四倍的连接数量(1兆连接对256K连接),尽管是窄字而不是宽字。
在一个实施例中,图18的动态可配置NPU 126包括类似于多路复用寄存器208A和208B的3-输入多路复用寄存器,替代寄存器205A和205B,以实现用于从权重RAM 124接收的权重字行的旋转器,有点类似于关于图7的实施例所描述的方式,但是以如关于图18所描述的动态可配置方式。
现在参考图19,示出了例示根据图18的实施例的图1的NNU 121的N个NPU 126的2N个多路复用寄存器208A/208B的布置的实施例的框图,以说明它们作为用于从图1的数据RAM 122接收的一行数据字207的旋转器的操作。在图19的实施例中,N是512,使得NNU 121具有1024个多路复用寄存器208A/208B,表示为0至511,对应于512个NPU 126和实际上1024个窄NPU,如图所示。NPU126内的两个窄NPU表示为A和B,并且在每个多路复用寄存器208内,示出了对应的窄NPU的指定。更具体地,NPU 126 0的多路复用寄存器208A被指定为0-A,NPU126 0的多路复用寄存器208B被指定为0-B,NPU 126 1的多路复用寄存器208A被指定为1-A,NPU 126 1的多路复用寄存器208B被指定为1-B,NPU 126 511的多路复用寄存器208A被指定为511-A,并且NPU 126 511的多路复用寄存器208B被指定为0-B,它们的值也对应于下面描述的图21的窄NPU。
每个多路复用寄存器208A接收数据RAM 122的D行中的一行的其对应的窄数据字207A,每个多路复用寄存器208B接收数据RAM 122的D行中的一行的其对应的窄数据字207B。即,多路复用寄存器0A接收数据RAM 122行的窄数据字0,多路复用寄存器0B接收数据RAM 122行的窄数据字1,多路复用寄存器1A接收数据RAM 122的窄数据字2,多路复用寄存器1B接收数据RAM 122行的窄数据字3,依此类推,直至多路复用寄存器511A接收数据RAM122行的窄数据字1022,多路复用寄存器511B接收数据RAM 122行的窄数据字1023。另外,多路复用寄存器1A在其输入端211A上接收多路复用寄存器0A的输出209A,多路复用寄存器1B在其输入端211B上接收多路复用寄存器0B的输出209B,依此类推,直至多路复用寄存器511A,它在其输入端211A上接收多路复用寄存器510A的输出209A,和多路复用寄存器511B,它在其输入端211B上接收多路复用寄存器510B的输出209B,多路复用寄存器0A在其输入端211A上接收多路复用寄存器511A的输出209A,多路复用寄存器0B在其输入端211B上接收多路复用寄存器511B的输出209B。多路复用器208A/208B中的每一个接收控制输入213,其控制是选择数据字207A/207B还是旋转输入211A/211B或旋转输入1811A/1811B。最后,多路复用寄存器1A在其输入端1811A上接收多路复用寄存器0B的输出209B,多路复用寄存器1B在其输入端1811B上接收多路复用寄存器1A的输出209A,依此类推,直至多路复用寄存器511A,它在其输入端1811A上接收多路复用寄存器510B的输出209B,和多路复用寄存器511B,它在其输入端1811B上接收多路复用寄存器511A的输出209A,多路复用寄存器0A在其输入端1811A上接收多路复用寄存器511B的输出209B,多路复用寄存器0B在其输入端1811B上接收多路复用寄存器0A的输出209A。多路复用寄存器208A/208B中的每一个接收控制输入213,其控制是选择数据字207A/207B还是旋转输入211A/211B或旋转输入1811A/1811B。如下面更详细地描述的,在一种操作模式中,在第一时钟周期上,控制输入213控制多路复用寄存器208A/208B中的每一个选择数据字207A/207B用于存储在寄存器中并用于随后提供给ALU 204;在随后的时钟周期(例如,如上所述的M-1个时钟周期)期间,控制输入213控制多路复用寄存器208A/208B中的每一个以选择旋转输入1811A/1811B用于存储在寄存器中并用于随后提供给ALU 204。
现在参考图20,示出了例示用于存储在根据图18的实施例的具有NPU 126的图1的NNU 121的程序存储器129中并由NNU 121执行的程序的表。图20的示例性程序在许多方面类似于图4的程序。但现在将说明区别。在地址0的初始化NPU指令指定NPU 126将处于窄配置。另外,地址2处的乘法-累加旋转指令指定1023的计数,并且需要1023个时钟周期,如图所示。这是因为图20的示例有效地假设一层的1024个窄(例如,8位)神经元(NPU),每个神经元具有来自前一层的1024个神经元的1024个连接输入,总共1024K个连接。每个神经元从每个连接输入接收8位数据值,并将8位数据值乘以适当的8位权重值。
现在参考图21,示出了例示由包括以窄配置操作的图18的NPU 126的NNU 121执行图20的程序的时序图。图21的时序图在许多方面类似于图5的时序图;但现在将说明区别。
在图21的时序图中,NPU 126处于窄配置,因为在地址0处的初始化NPU指令将它们初始化为窄配置。因此,512个NPU 126有效地作为1024个窄NPU(或神经元)操作,其在列中指定为NPU 0-A和NPU 0-B(NPU 126 0的两个窄NPU)、NPU 1-A和NPU 1-B(NPU126 1的两个窄NPU),依此类推,直至NPU511-A和NPU511-B(NPU126 511的两个窄NPU)。为了说明的简单和清楚,仅示出了用于窄NPU 0-A、0-B和511-B的操作。由于地址2处的乘法-累加旋转指定需要1023个时钟的1023计数的事实,图21的时序图的行包括直到时钟周期1026。
在时钟0,1024个NPU中的每一个执行图4的初始化指令,其在图5中通过向累加器202分配零值来示出。
在时钟1,1024个窄NPU中的每一个执行图20的地址1处的乘法-累加指令。窄NPU0-A用数据RAM 122行17窄字0和权重RAM 124行0窄字0的乘积累加累加器202A值(其为零);窄NPU 0-B用数据RAM 122行17窄字1和权重RAM 124行0窄字1的乘积累加累加器202B值(其为零);依此类推,直至窄NPU 511-B用数据RAM 122行17窄字1023和权重RAM 124行0窄字1023的乘积累加累加器202B值(其为零),如图所示。
在时钟2,1024个窄NPU中的每一个执行图20的地址2处的乘法-累加旋转指令的第一次迭代。窄NPU 0-A用从窄NPU 511-B的多路复用寄存器208B输出端209B接收的旋转窄数据字1811A(其是从数据RAM 122接收的窄数据字1023)和权重RAM 124行1窄字0的乘积累加累加器202A值217A;窄NPU0-B用从窄NPU 0-A的多路复用寄存器208A输出端209A接收的旋转窄数据字1811B(其是从数据RAM 122接收的窄数据字0)和权重RAM 124行1窄字1的乘积累加累加器202B值217B;依此类推,直至窄NPU 511-B用从窄NPU 511-A的多路复用寄存器208A输出端209A接收的旋转窄数据字1811B(其是从数据RAM 122接收的窄数据字1022)和权重RAM 124行1窄字1023的乘积累加累加器202B值217B,如图所示。
在时钟3,1024个窄NPU中的每一个执行图20的地址2处的乘法-累加旋转指令的第二次迭代。窄NPU 0-A用从窄NPU 511-B的多路复用寄存器208B输出端209B接收的旋转窄数据字1811A(其是从数据RAM 122接收的窄数据字1022)和权重RAM 124行2窄字0的乘积累加累加器202A值217A;窄NPU 0-B用从窄NPU 0-A的多路复用寄存器208A输出端209A接收的旋转窄数据字1811B(其是从数据RAM 122接收的窄数据字1023)和权重RAM 124行2窄字1的乘积累加累加器202B值217B;依此类推,直至窄NPU 511-B用从窄NPU 511-A的多路复用寄存器208A输出端209A接收的旋转窄数据字1811B(其是从数据RAM 122接收的窄数据字1021)和权重RAM 124行2窄字1023的乘积累加累加器202B值217B,如图所示。如图21的省略号所示,这对于随后的1021个时钟周期中的每一个继续,直到……
在时钟1024,1024个窄NPU中的每一个执行图20的地址2处的乘法-累加旋转指令的第1023次迭代。窄NPU 0-A用从窄NPU 511-B的多路复用寄存器208B输出端209B接收的旋转窄数据字1811A(其是从数据RAM 122接收的窄数据字1)和权重RAM 124行1023窄字0的乘积累加累加器202A值217A;NPU 0-B用从NPU 0-A的多路复用寄存器208A输出端209A接收的旋转窄数据字1811B(其是从数据RAM 122接收的窄数据字2)和权重RAM 124行1023窄字1的乘积累加累加器202B值217B;依此类推,直至NPU 511-B用从NPU 511-A的多路复用寄存器208A输出端209A接收的旋转窄数据字1811B(其是从数据RAM 122接收的窄数据字0)和权重RAM 124行1023窄字1023的乘积累加累加器202B值,如图所示。
在时钟1025,1024个窄NPU中的每一个的AFU 212A/212B执行图20的地址3处的激活函数指令。最后,在时钟1026,1024个窄NPU中的每一个执行图20的地址4处的写AFU输出指令,通过将其窄结果133A/133B回写到数据RAM 122的行16的相应窄字,即,NPU 0-A的窄结果133A被写入数据RAM 122的窄字0,NPU 0-B的窄结果133B被写入数据RAM 122的窄字1,依此类推,直至NPU 511-B的窄结果133被写入数据RAM 122的窄字1023。以上相对于图21说明的操作也在图22中以框图形式示出。
现在参考图22,示出了例示包括用以执行图20的程序的图18的NPU 126的图1的NNU 121的框图。NNU 121包括512个NPU 126,即1024个窄NPU,接收其地址输入123的数据RAM 122和接收其地址输入125的权重RAM 124。尽管未示出,但在时钟0上,1024个窄NPU执行图20的初始化指令。如图所示,在时钟1上,将行17的1024个8位数据字从数据RAM 122中读出并提供给1024个窄的NPU。在时钟1至1024,将行0至1023的1024个8位权重字分别从权重RAM 124中读出并提供给1024个窄的NPU。尽管未示出,但在时钟1上,1024个窄NPU对加载的数据字和权重字执行它们各自的乘法累加运算。在时钟2至1024上,1024个窄NPU的多路复用寄存器208A/208B作为1024个8位字旋转器操作以将数据RAM 122的行17的先前加载的数据字旋转到相邻的窄NPU,窄NPU对相应的旋转数据窄字和从权重RAM 124加载的相应窄权重字执行乘法-累加运算。尽管未示出,但是在时钟1025上,1024个窄AFU 212A/212B执行激活指令。在时钟1026上,1024个窄NPU将它们各自的1024个8位结果133A/133B回写到数据RAM 122的行16。
如可以观察到的,图18的实施例可能优于图2的实施例,例如,因为它为程序员提供了执行计算的灵活性,即,当要被建模的特定应用需要较大精度量时使用宽数据和权重字(例如,16位),以及当应用需要较小精度量时使用窄数据和权重字(例如,8位)。从一个角度来看,图18的实施例以额外的窄组件(例如,多路复用寄存器208B、寄存器205B、窄ALU204B、窄累加器202B、窄AFU 212B)的代价(这是NPU 126的面积增加大约50%)提供了对于窄数据应用的图2的实施例的两倍吞吐量。
三模式NPU
现在参考图23,示出了例示根据替代实施例的图1的动态可配置NPU 126的框图。图23的NPU 126不仅可配置为宽配置和窄配置,而且可配置为本文中称为“漏斗”配置的第三配置。图23的NPU 126在许多方面类似于图18的NPU 126。然而,图18的宽加法器244A在图23的NPU 126中被替换为接收第三加数2399的3-输入宽加法器2344A,第三加数2399是窄多路复用器1896B的输出的扩展形式。用于操作具有图23的NPU 126的NNU 121的程序在大多数方面与图20的程序类似。然而,地址0处的初始化NPU指令将NPU 126初始化为漏斗配置,而不是窄配置。另外,地址2处的乘法-累加旋转指令的计数为511而不是1023。
当在漏斗配置中时,NPU 126当在执行诸如图20的地址1处的乘法-累加指令时类似于处于窄配置时操作,因为其接收两个窄数据字207A/207B和两个窄权重字206A/206B;宽乘法器242A将数据字209A和权重字203A相乘以生成宽多路复用器1896A选择的乘积246A;窄乘法器242B将数据字209B和权重字203B相乘以生成窄多路复用器1896B选择的乘积246B。然而,宽加法器2344A将乘积246A(由宽多路复用器1896A选择)和乘积246B/2399(由宽多路复用器1896B选择)加到宽累加器202A值217A,窄加法器244B和窄累加器202B不运行。此外,当在漏斗配置中时,当执行诸如图20的地址2的乘法-累加旋转指令时,控制输入213使得多路复用寄存器208A/208B旋转两个窄字(例如,16位),即多路复用寄存器208A/208B选择它们各自的211A/211B输入,就好像它们处于宽配置中。然而,宽乘法器242A将数据字209A和权重字203A相乘以生成宽多路复用器1896A选择的乘积246A;窄乘法器242B将数据字209B和权重字203B相乘以生成窄多路复用器1896B选择的乘积246B;宽加法器2344A将乘积246A(由宽多路复用器1896A选择)和乘积246B/2399(由宽多路复用器1896B选择)加到宽累加器202A值217A,窄加法器244B和窄累加器202B不运行,如上所述。最后,当在漏斗配置中时,当执行诸如图20的地址3的激活函数指令时,宽AFU 212A对所得到的和215A执行激活函数以生成窄结果133A,并且窄AFU 212B不运行。因此,只有A个窄NPU生成窄结果133A,而由B个窄NPU生成的窄结果133B无效。因此,回写的结果行(例如,到行16,如在图20的地址4的指令)包括空洞,因为只有窄结果133A有效,而窄结果133B无效。因此,在概念上,每个时钟周期每个神经元(图23的NPU 126)处理两个连接数据输入,即,通过用它们各自的权重乘以两个窄数据字,并且累加两个乘积,这与图2和18的实施例相反,图2和18的实施例每一个在每个时钟周期处理单个连接数据输入。
如相对于图23的实施例可以观察到的,产生并回写到数据RAM 122或权重RAM 124的结果字(神经元输出)的数量是接收的数据输入(连接)数量的平方根的一半,并且回写的结果行具有空洞,即,每隔一个窄字结果是无效的,更具体地,B个窄NPU结果是无意义的。因此,图23的实施例在具有两个连续层的神经网络中可能特别有效,其中,例如第一层具有两倍于第二层的神经元(例如,第一层具有完全连接到第二层512个神经元的1024个神经元)。此外,如果必要的话,在NNU 121执行与数据RAM 122和/或权重RAM 124的其它行相关联的其他计算时,其他执行单元112(例如,媒体单元,例如x86AVX单元)可以对分散的结果行(即,具有空洞)执行压缩(pack)操作以使其紧凑(即,没有空洞)以用于随后的计算中。
混合NNU操作;卷积和池化能力
根据本文描述的实施例的NNU 121的优点在于,NNU 121能够以类似于协处理器的方式同时操作,因为它执行其自己的内部程序,并以类似于处理器的执行单元的方式操作,因为它执行发布给它的架构指令(或从其转换的微指令)。架构指令是由包括NNU 121的处理器执行的架构程序。以此方式,NNU 121以混合方式操作,这是有利的,因为它提供了维持NNU 121的高利用率的能力。例如图24至26示出了NNU 121执行卷积运算的操作,其中NNU121被高度利用,图27至28示出了NNU 121执行池化操作的操作,这些是卷积层和池化层以及其他数字数据计算应用例如图像处理(例如,边缘检测、锐化、模糊化、识别/分类)所需要的。然而,NNU 121的混合操作不限于执行卷积或池化操作,而是混合特征可以用于执行其他操作,例如如上关于图4至13所述的经典神经网络乘法-累加和激活函数操作。也就是说,处理器100(更具体地,保留站108)向NNU 121发出MTNN 1400和MFNN 1500指令,作为响应,NNU 121将数据写入存储器122/124/129,并且从存储器122/124读取由NNU 121写入那里的结果,同时NNU 121响应于由处理器100(经由MTNN 1400指令)写入程序存储器129的执行程序来读取和写入存储器122/124/129。
现在参考图24,示出了例示由图1的NNU 121用来执行卷积运算的数据结构的示例的框图。框图包括卷积核2402、数据阵列2404以及图1的数据RAM 122和权重RAM 124。优选地,数据阵列2404(例如,图像像素的)保存在附接到处理器100的系统存储器(未示出),并由执行MTNN指令1400的处理器100加载到NNU 121的权重RAM 124中。卷积运算是将第一矩阵与第二矩阵卷积的运算,第二矩阵在本文中被称为卷积核。如在本公开内容的语境中所理解的,卷积核是系数的矩阵,其也可以被称为权重、参数、元素或值。优选地,卷积核2042是由处理器100执行的架构程序的静态数据。
数据阵列2404是数据值的二维阵列,每个数据值(例如,图像像素值)是数据RAM122或权重RAM 124的字的大小(例如,16位或8位)。在该示例中,数据值是16位字,NNU 121被配置为512个宽配置NPU 126。另外,在该实施例中,NPU 126包括用于从权重RAM 124接收权重字206的多路复用寄存器,例如图7的多路复用寄存器705,以便执行从权重RAM 124接收的数据值行的集体旋转器操作,如下面更详细描述的。在该示例中,数据阵列2404是2560列×1600行像素阵列。当架构程序将数据阵列2404与卷积核2402卷积时,其将数据阵列2404分成20个块,每个块是512×400数据矩阵2406,如图所示。
在该示例中,卷积核2042是系数或权重或参数或元素的3×3矩阵。第一行系数表示为C0,0;C0,1和C0,2;第二行系数表示为C1,0;C1,1和C1,2;第三行系数表示为C2,0;C2,1和C2,2。例如,可以用于执行边缘检测的卷积核具有以下系数:0、1、0、1、-4、1、0、1、0。对于另一个示例,可以用于高斯模糊图像的卷积核具有以下系数:1、2、1、2、4、2、1、2、1。在此情况下,通常对最终累加值执行除法,其中,除数是卷积核2042的元素的绝对值的和,在该示例中为16。对于另一个示例,除数是卷积核2042的元素的数量。对于另一个示例,除数是将卷积压缩回期望的值范围内的值,除数是从卷积核2042的元素的值、期望的范围以及被卷积的矩阵的输入值的范围确定的。
如图24所示并且相关于图25更详细地描述的,架构程序用卷积核2042的系数写入数据RAM 122。优选地,以行优先顺序用卷积核2402的不同元素写入数据RAM 122的九个(卷积核2402中元素的数量)连续行中的每一个的所有字。即,用第一系数C0,0写入一行的每个字;用第二系数C0,1写入下一行;用第三系数C0,2写入下一行;用第四系数C1,0写入下一行;依此类推,直到用第九系数C2,2写入第九行的每个字,如图所示。为了卷积数据阵列2404的块的数据矩阵2406,NPU 126按顺序重复读取保存卷积核2042系数的数据RAM 122的九行,如下面特别是相关于图26A更详细地描述的。
如图24所示并且相关于图25更详细地描述的,架构程序用数据矩阵2406的值写入权重RAM 124。当NNU程序执行卷积时,它将所得到的矩阵回写到权重RAM 124。优选地,架构程序将第一数据矩阵2406写入权重RAM 124并启动NNU 121,并且当NNU 121利用卷积核2042卷积第一数据矩阵2406时,架构程序将第二数据矩阵2406写入权重RAM 124,使得一旦NNU 121完成第一数据矩阵2406的卷积,NNU 121就可以开始卷积第二数据矩阵2406,如关于图25更详细地描述的。以此方式,架构程序在权重RAM 124的两个区域之间来回往复,以便保持充分利用NNU 121。因此,图24的示例示出了对应于占据权重RAM 124的行0到399的第一块的第一数据矩阵2406A,以及对应于占据权重RAM 124的行500到899的第二块的第二数据矩阵2406B。此外,如图所示,NNU 121将卷积的结果回写到权重RAM 124的行900-1299和1300-1699,架构程序随后从权重RAM 124读出它。保存在权重RAM 124中的数据矩阵2406的数据值被表示为“Dx,y”,其中,“x”是权重RAM 124的行号,“y”是权重RAM 124的字或列号。因此,例如行399中的数据字511在图24中表示为D399,511,其由NPU 511的多路复用寄存器705接收。
现在参考图25,示出了图1的处理器100执行架构程序的操作的流程图,该架构程序使用NNU 121来执行卷积核2042与图24的数据阵列2404的卷积。流程在框2502开始。
在框2502处,处理器100(即,在处理器100上运行的架构程序)以关于图24所示和所述的方式将图24的卷积核2042写入数据RAM 122。另外,架构程序将变量N初始化为值1。变量N表示由NNU 121处理的数据阵列2404的当前块。另外,架构程序将变量NUM_CHUNKS初始化为值20。流程进行到框2504。
在框2504处,处理器100将用于块1的数据矩阵2406写入权重RAM 124,如图24所示(例如,块1的数据矩阵2406A)。流程进行到框2506。
在框2506处,处理器100使用MTNN 1400指令来将卷积程序写入NNU 121程序存储器129,所述MTNN 1400指令指定用于写入程序存储器129的功能1432。然后,处理器100使用指定用于开始执行程序的功能1432的MTNN 1400指令启动NNU卷积程序。相关于图26A更详细地描述NNU卷积程序的示例。流程进行到判定框2508。
在判定框2508处,架构程序确定变量N的值是否小于NUM_CHUNKS。如果是,则流程进行到框2512;否则,流程进行到框2514。
在框2512处,处理器100将用于块N+1的数据矩阵2406写入权重RAM 124,如图24所示(例如,块2的数据矩阵2406B)。因此,有利地,在NNU 121对当前块执行卷积的同时,架构程序将用于下一个块的数据矩阵2406写入权重RAM 124,使得一旦当前块的卷积完成,即,写入权重RAM 124,NNU 121就可以立即开始对下一个块执行卷积。流程前进到框2514。
在框2514处,处理器100确定当前运行的NNU程序(在块1的情况下在框2506处开始,在块2-20的情况下在框2518处开始)已经完成。优选地,处理器100通过执行用于读取NNU 121状态寄存器127的MFNN 1500指令来来确定这一点。在替代实施例中,NNU 121生成中断以指示其已经完成卷积程序。流程进行到判定框2516。
在判定框2516处,架构程序确定变量N的值是否小于NUM_CHUNKS。如果是,则流程进行到框2518;否则,流程进行至步骤2522。
在框2518处,处理器100更新卷积程序,使得其可以卷积块N+1。更具体地,处理器100将地址0处的初始化NPU指令的权重RAM 124行值更新为数据矩阵2406的第一行(例如,对于数据矩阵2406A为行0或对于数据矩阵2406B为行500)并更新输出行(例如,为900或1300)。然后,处理器100启动更新的NNU卷积程序。流程进行到框2522。
在框2522处,处理器100从用于块N的权重RAM 124读取NNU卷积程序的结果。流程进行到判定框2524。
在判定框2524处,架构程序确定变量N的值是否小于NUM_CHUNKS。如果是,则流程进行到框2526;否则,流程结束。
在框2526处,架构程序将N增加1。流程返回到判定框2508。
现在参考图26A,示出了执行数据矩阵2406与图24的卷积核2042的卷积并将其回写到权重RAM 124的NNU程序的程序列表。程序通过地址1到9的指令的循环体循环多次。在地址0的初始化NPU指令指定每个NPU 126执行循环体的次数,在图26A的例子中该次数具有循环计数值400,对应于图24的数据矩阵2406中的行数,并且在循环结束处(在地址10)的循环指令递减当前循环计数值,如果结果非零,则导致控制以返回到循环体的顶部(即,到地址1处的指令)。初始化NPU指令还将累加器202清零。优选地,地址10处的循环指令也将累加器202清零。可替换地,如上所述,地址1处的乘法-累加指令可以指定将累加器202清零。
对于程序的循环体的每次执行,512个NPU 126同时执行3×3卷积核2402与数据矩阵2406的512个相应的3×3子矩阵的512个卷积。卷积是卷积核2042的元素及其各自子矩阵的相应元素的九个乘积的和。在图26A的实施例中,512个相应3×3子矩阵中的每一个的原点(中心元素)是图24的数据字Dx+1,y+1,其中,y(列号)是NPU 126的号,x(行号)是由图26A的程序的地址1处的乘法-累加指令读取的当前权重RAM 124行号(同样,行号由地址0处的初始化NPU指令初始化,在地址3和5的每个乘法-累加指令处递增,并由地址9处的递减指令更新)。因此,对于程序的每个循环,512个NPU 126计算512个卷积,并将512个卷积结果回写到权重RAM 124的指定行。在本说明书中,为简单起见,忽略边缘处理,但应注意,NPU 126的集体旋转特征的使用将导致两个列从数据矩阵2406的一个垂直边缘(例如,在图像处理的情况下的图像的垂直边缘)环绕到另一个垂直边缘(例如,从左边缘到右边缘,或反之亦然)。现在将说明循环体。
在地址1处是指定数据RAM 122的行0并隐含地使用当前权重RAM 124行的乘法-累加指令,其优选地保存在序列发生器128中(并且对于第一次通过循环体,其由地址0处的指令初始化为0)。即,地址1处的指令使每个NPU126从数据RAM 122的行0读取其相应的字,并从当前权重RAM 124行读取其相应的字,并对这两个字执行乘法-累加运算。因此,例如,NPU5将C0,0和Dx,5相乘(其中,“x”是当前权重RAM 124行),将结果加到累加器202的值217,并将总和写回到累加器202。
在地址2处是乘法-累加指令,其指定递增数据RAM 122行(即,到行1),然后在递增的地址处从数据RAM 122读取行。该指令还指定将每个NPU 126的多路复用寄存器705中的值旋转到相邻的NPU 126,在此情况下,该值是响应于地址1处的指令,刚刚从权重RAM 124读取的数据矩阵2406值的行。在图24至图26的实施例中,NPU 126被配置为将多路复用寄存器705的值向左旋转,即从NPU J向NPU J-1旋转,而不是如上相关于图3、7和19所述的从NPUJ向NPU J+1旋转。应当理解,在NPU 126被配置为向右旋转的实施例中,架构程序可以以不同的顺序(例如,围绕其中心列旋转)将卷积核2042的系数值写入数据RAM 122中,以便实现类似的卷积结果。此外,架构程序可以根据需要执行卷积核2042的附加预处理(例如,转置)。另外,指令指定计数值2。因此,地址2处的指令导致NPU 126的每个从数据RAM 122的行1读取其对应的字,并将旋转的字接收到多路复用寄存器705中,对两个字执行乘法-累加运算。由于计数值为2,所以指令还使NPU 126的每个重复刚刚说明的操作。即,序列发生器128使数据RAM 122行地址123递增(即,为行2),并且每个NPU 126从数据RAM 122的行2读取其相应的字,并将旋转的字接收到多路复用寄存器705中,对两个字执行乘法-累加运算。因此,例如,假设当前权重RAM 124的行是27,在执行地址2处的指令之后,NPU 5将C0,1和D27,6的乘积以及C0,2和D27,7的乘积累加到其累加器202中。因此,在地址1和2处的指令完成之后,C0,0和D27,5的乘积、C0,1和D27,6的乘积以及C0,2和D27,7的乘积将与来自先前通过循环体的所有其它累加值一起累加到累加器202中。
地址3和4处的指令执行与地址1和2处的指令类似的操作,但借助于权重RAM 124行递增指示符而用于权重RAM 124的下一行,及用于数据RAM 122接下来的三行,即,行3至5。即,对于NPU 5,例如,在地址1到4处的指令完成之后,C0,0和D27,5的乘积、C0,1和D27,6的乘积、C0,2和D27,7的乘积、C1,0和D28,5的乘积、C1,1和D28,6的乘积以及C1,2和D28,7的乘积将与来自先前通过循环体的所有其它累加值一起累加到累加器202中。
地址5和6处的指令执行与地址3和4处的指令类似的操作,但用于权重RAM 124的下一行以及用于数据RAM 122接下来的三行,即行6至8。即,对于NPU 5,例如,在地址1至6的指令完成之后,C0,0和D27,5的乘积、C0,1和D27,6的乘积、C0,2和D27,7的乘积、C1,0和D28,5的乘积、C1,1和D28,6的乘积、C1,2和D28,7的乘积、C2,0和D29,5的乘积、C2,1和D29,6的乘积以及C2,2和D29,7的乘积将与来自先前通过循环体的所有其它累加值一起累加到累加器202中。即,在地址1至6处的指令完成之后,并且假设在循环体的开始处的权重RAM 124行是27,NPU 5例如将使用卷积核2042卷积以下3×3子矩阵:
更一般地,在地址1至6处的指令完成之后,512个NPU 126中的每一个将使用卷积核2042来卷积以下3×3子矩阵:
其中,r是循环体开始处的权重RAM 124行地址值,n是NPU 126的号。
地址7处的指令使累加器202的值217通过AFU 212。通过功能使是从数据RAM 122和权重RAM 124读取的字的大小(以位为单位)(即,在该示例中,16位)的字通过。优选地,用户可以指定输出的格式,例如,多少输出位是小数位,如下面更详细描述的。可替换地,不是指定通过激活函数,而是指定除法激活函数,其例如本文关于图29A和30所述的,例如使用图30的“除法器”3014/3016之一来将累加器202的值217除以除数。例如,在具有诸如上述高斯模糊核的第十六个系数的系数而不是通过函数的卷积核2042的情况下,在地址7处的激活函数指令可以指定除法(例如,除以16)激活函数。可替换地,架构程序可在将卷积核2042系数写入数据RAM 122之前对它们执行除以16,并相应地为卷积核2402值调整二进制小数点的位置,例如使用图29的数据二进制小数点2922,如下所述。
地址8处的指令将AFU 212的输出写入由输出行寄存器的当前值指定的权重RAM124的行,所述当前值由地址0处的指令初始化并且每次通过循环就借助指令中的递增指示符而递增。
如可从具有3×3卷积核2402的图24到26的示例中确定,NPU 126大约每三个时钟周期读取权重RAM 124以读取数据矩阵2406的一行,大约每12个时钟周期写入权重RAM 124以写入卷积结果矩阵。另外,假定包括诸如图17的缓冲器1704的写入和读取缓冲器的实施例同时与NPU 126读取和写入,处理器100读取和写入权重RAM 124,使得缓冲器1704大约每16个时钟周期执行权重RAM 124的一个写入和一个读取,以分别写入数据矩阵2406并读取卷积结果矩阵。因此,权重RAM 124的大约一半带宽由NNU 121执行卷积运算的混合方式消耗。虽然该示例包括3×3卷积核2042,但是可以采用其他大小的卷积核,例如2x2、4x4、5x5、6x6、7x7、8x8等矩阵,在此情况下,NNU程序将变化。在较大卷积核的情况下,消耗较小百分比的权重RAM 124带宽,因为NPU 126由于乘法-累加指令的旋转形式中的计数较大而以较小百分比的时间读取权重RAM 124(例如,在图26A的程序的地址2、4和6处以及更大的卷积核所需的额外的这种指令)。
可替换地,不是将卷积的结果回写到权重RAM 124的不同行(例如,900-1299和1300-1699),而是架构程序将NNU程序配置为在不再需要行之后,重写输入数据矩阵2406的行。例如,在3×3卷积核的情况下,不是将数据矩阵2406写入权重RAM 124的行0-399,而是架构程序将数据矩阵2406写入行2-401,并且NNU程序被配置为将卷积结果写入从行0开始并随每次通过循环体递增的权重RAM 124。以此方式,NNU程序仅重写不再需要的行。例如,在第一次通过循环体之后(或者更具体地在执行加载到权重RAM 124的行0中的地址1处的指令之后),现在可以重写行0中的数据,但在通过循环体的第二次通过中需要行1-3中的数据,因此不被通过循环体的第一次通过重写;类似地,在第二次通过循环体之后,现在可以重写行1中的数据,但在通过循环体的第二次通过中需要行2-4中的数据,因此不被通过循环体的第二次通过重写;依此类推。在这个实施例中,每个数据矩阵2406(块)的高度可以更大(例如,800行),导致更少的块。
可替换地,不是将卷积的结果回写到权重RAM 124,而是架构程序将NNU程序配置为将卷积的结果回写到卷积核2402上方的数据RAM 122的行(例如,行8上方),并且当NNU121写入结果时(例如,下面描述的使用图26B的最近写入的数据RAM 122的行2606的地址),架构程序从数据RAM 122读取结果。在权重RAM 124是单端口且数据RAM 122是双端口的实施例中,该替代方案可能是有利的。
从根据图24至26A的实施例的NNU 121的操作可以观察到,图26A的程序的每次执行花费大约5000个时钟周期,因此,图24的整个2560×1600数据阵列2404的卷积花费大约100,000个时钟周期,这显着小于通过常规方法执行类似任务所需的时钟周期的数量。
现在参考图26B,示出了例示根据一个实施例的图1的NNU 121的控制寄存器127的某些字段的框图。状态寄存器127包括:字段2602,其指示由NPU 126最近写入的权重RAM124的行的地址;字段2606,其指示由NPU 126最近写入的数据RAM 122的行的地址;字段2604,其指示由NPU 126最近读取的权重RAM 124的行的地址;以及字段2608,其指示由NPU126最近读取的数据RAM 122的行的地址。这使得在处理器100上执行的架构程序能够确定NNU 121在其通过读取和/或写入数据RAM 122和/或权重RAM 124推进时的进度。采用该能力以及如上所述重写输入数据矩阵(或将结果写入数据RAM 122,如上所述)的选择,图24的数据阵列2404可以被处理为512×1600的5个块而不是512×400的20个块,如下所述。处理器100从行2开始将第一512×1600块写入权重RAM 124,并且启动NNU程序(其循环计数为1600,初始化的权重RAM 124输出行为0)。当NNU 121执行NNU程序时,处理器100监视权重RAM 124输出的位置/地址,以便(1)读取(使用MFNN 1500指令)权重RAM 124的具有由NNU121写入的有效卷积结果的行(从行0开始),以及(2)一旦已经读取有效卷积结果,就将它们写入第二512×1600数据矩阵2406(从行2开始),使得当NNU 121在第一512×1600块上完成NNU程序时,处理器100可以根据需要立即更新NNU程序,并再次启动它以处理第二512×1600块。对于剩余的三个512×1600块,该过程重复三次以实现NNU 121的高利用率。
有利地,在一个实施例中,AFU 212包括有效地执行累加器202值217的有效除法的能力,如下面特别关于图29A和29B和30更详细地描述的。例如,将累加器202值217除以16的激活函数NNU指令可以用于上述高斯模糊矩阵。
虽然在图24的示例中使用的卷积核2402是应用于整个数据阵列2404的小型静态卷积核,但是在其他实施例中,卷积核可以是具有与数据阵列2404的不同数据值相关联的唯一权重的大矩阵,例如在卷积神经网络中常见的。当以这种方式使用NNU 121时,架构程序可以交换数据矩阵和卷积核的位置,即,将数据矩阵设置在数据RAM 122并将卷积核设置在权重RAM 124中,并且可以由NNU程序的给定执行所处理的行的数量可以相对较小。
现在参考图27,示出了例示用输入数据填充的图1的权重RAM 124的示例的框图,由图1的NNU 121在该输入数据上执行池化操作。由人工神经网络的池化层执行的池化操作通过获取输入矩阵的子区域或子矩阵并计算子矩阵的最大值或平均值来降低输入数据(例如,图像或卷积图像)的矩阵的维度,最大值或平均值变为结果矩阵或池化矩阵。在图27和28的示例中,池化操作计算每个子矩阵的最大值。池化操作在例如执行对象分类或检测的人工神经网络中特别有用。通常,池化操作有效地将其输入矩阵的大小减小了所检查的子矩阵中的元素数量的因子,特别地,在每个维度中将输入矩阵减少了子矩阵的相应维度中的元素的数量。在图27的示例中,输入数据是存储在权重RAM 124的行0到1599中的宽字(例如,16位)的512×1600矩阵。在图27中,字由它们的行、列位置表示,例如,行0和列0中的字被表示为D0,0;行0和列1中的字被表示为D0,1;行0和列2中的字被表示为D0,2;依此类推,直至行0和列511中的字被表示为D0,511。类似地,行1和列0中的字被表示为D1,0;行1和列1中的字被表示为D1,1;行1和列2中的字被表示为D1,2;依此类推,直至行1和列511中的字被表示为D1,511;依此类推,直至行1599和列0中的字被表示为D1599,0;行1599和列1中的字被表示为D1599,1;行1599和列2中的字被表示为D1599,2;依此类推,直至行1599和列511中的字被表示为D1599,511。
现在参考图28,示出了执行图27的输入数据矩阵的池化操作并将其回写到权重RAM 124的NNU程序的程序列表。在图28的示例中,池化操作计算输入数据矩阵的各个4×4子矩阵的最大值。程序通过地址1到10的指令的循环体循环多次。在地址0的初始化NPU指令指定每个NPU 126执行循环体的次数,在图28的例子中该次数具有循环计数值400,在循环结束处(在地址11处)的循环指令递减当前循环计数值,如果结果为非零,则使控制返回循环体的顶部(即,返回到指令在地址1)。权重RAM 124中的输入数据矩阵被NNU程序有效地处理为四个相邻行(即,行0-3、行4-7、行8-11,依此类推,直至行1596-1599)的400个互斥组。每组四个相邻行包括128个4×4子矩阵,即,由一组的四行和四个相邻列(即列0-3、4-7、8-11,依此类推,直至列508-511)的交叉形成的元素的4×4子矩阵。在512个NPU 126中,512个NPU 126中的每一第四个NPU 126(即,128个)对相应的4×4子矩阵执行池化操作,NPU 126的其他四分之三未使用。更具体地,NPU 0、4、8,依此类推,直至NPU 508对它们各自的4×4子矩阵执行池化操作,4×4子矩阵的最左列号对应于NPU号,其下行对应于当前权重RAM124行值,它由地址0处的初始化指令初始化为零,并且在循环体的每次迭代时递增4,如下文更详细地描述。循环体的400次迭代对应于图27的输入数据矩阵的4×4子矩阵的组的数量(输入数据矩阵的1600行除以4)。初始化NPU指令还将累加器202清零。优选地,地址11处的循环指令也将累加器202清零。可替换地,地址1处的maxwacc指令指定将累加器202清零。
对于程序的循环体的每次迭代,128个使用的NPU 126同时执行输入数据矩阵的当前4行组的128个各自的4×4子矩阵的128个池化操作。更具体地,池化操作确定4×4子矩阵的十六个元素的最大值元素。在图28的实施例中,对于所使用的128个NPU 126的每个NPUy,4×4子矩阵的左下元素是图27的元素Dx,y,其中,x是循环体开始时当前权重RAM 124行号,它由图28的程序的地址1处的maxwacc指令读取(同样,行号由地址0处的初始化NPU指令初始化,并在地址3、5和7的每个maxwacc指令处递增)。因此,对于程序的每个循环,所使用的128个NPU 126将当前行组的各自128个4×4子矩阵的相应最大值元素回写到权重RAM124的指定行。现在将说明循环体。
在地址1处是隐含地使用当前权重RAM 124行的maxwacc指令,其优选地保存在序列发生器128中(并且对于第一次通过循环体,其由地址0处的指令初始化为零)。地址1处的指令使每个NPU126从权重RAM124的当前行读取其相应的字,将该字与累加器202的值217进行比较,并在累加器202中存储两个值中的最大值。因此,例如,NPU 8确定累加器202值217和数据字Dx,8的最大值(其中“x”是当前权重RAM 124行),并将最大值回写到累加器202。
在地址2处是指定将每个NPU 126的多路复用寄存器705中的值旋转到相邻NPU126的maxwacc指令,在此情况下,该值是响应于地址1处的指令,刚刚从权重RAM 124读取的输入数据矩阵值的行。在图27至图28的实施例中,NPU 126被配置为将多路复用寄存器705的值向左旋转,即从NPU J到NPU J-1,如上相关于图24至26所述的。此外,指令指定计数值3。因此,地址2处的指令导致每个NPU 126将旋转字接收到多路复用寄存器705中,并确定旋转字和累加器202值217中的最大值,然后再重复该操作两次。即,每个NPU 126三次将旋转字接收到多路复用寄存器705中,并且确定旋转字和累加器202值217中的最大值。因此,例如,假设循环体开始处的当前权重RAM 124行是36,则在执行地址1和2处的指令之后,NPU 8例如将在循环体开始处的累加器202及四个权重RAM 124字D36,8和D36,9和D36,10和D36,11中的最大值存储在其累加器202中。
在地址3和4处的maxwacc指令执行与地址1和2处的指令类似的操作,但借助权重RAM 124行递增指示符而用于权重RAM 124的下一行。即,假设循环体开始处的当前权重RAM124行是36,在地址1到4处的指令完成之后,NPU 8例如将循环体的开始处的累加器202及八个权重RAM 124字D36,8和D36,9和D36,10和D36,11和D37,8和D37,9和D37,10和D37,11中的最大值存储在其累加器202中。
在地址5至8处的maxwacc指令执行与地址3和4处的指令类似的操作,但用于权重RAM 124的接下来的两行。即,假设循环体开始处的当前权重RAM 124行是36,在地址1至8的指令完成之后,例如,NPU 8将循环体开始处的累加器202及16个权重RAM 124字D36,8和D36,9和D36,10和D36,11和D37,8和D37,9和D37,10和D37,11和D38,8和D38,9和D38,10和D38,11和D39,8和D39,9和D39,10和D39,11中的最大值存储在其累加器202中。即,在地址1至8处的指令完成之后,并且假设循环体开始处的权重RAM 124行是36,则NPU 8例如将已经确定以下4×4子矩阵的最大值:
更一般地,在地址1至8处的指令完成之后,所使用的128个NPU 126中的每一个将已经确定以下4×4子矩阵的最大值:
其中,r是循环体开始处的权重RAM 124行地址值,n是NPU 126的号。
地址9处的指令使累加器202值217通过AFU 212。通过功能使是从权重RAM 124读取的字的大小(以位为单位)(即,在该示例中,16位)的字通过。优选地,用户可以指定输出的格式,例如,多少输出位是小数位,如下面更详细描述的。
地址10处的指令将累加器202值217写入由输出行寄存器的当前值指定的权重RAM124的行,输出行寄存器的当前值由地址0处的指令初始化并借助于指令中的递增指示符而每次通过循环则递增。更具体地,地址10处的指令将累加器202的宽字(例如,16位)写入权重RAM 124。优选地,指令写入由输出二进制小数点2916指定的16位,如下面关于图29A和29B更详细地描述的。
可以观察到,通过循环体的迭代写入权重RAM 124的每一行包括具有无效数据的空洞。即,所得到的133个宽字1到3、5到7、9到11,依此类推,直至宽字509到511是无效的或未使用的。在一个实施例中,AFU 212包括多路复用器,其能够将结果压缩到行缓冲器(例如图11的行缓冲器1104)的相邻字中,用于回写到输出权重RAM 124行。优选地,激活函数指令指定每个空洞中的字的数量,空洞中的字的数量用于控制多路复用器以压缩结果。在一个实施例中,空洞的数量可以被指定为从2到6的值,以便压缩池化3×3、4×4、5×5、6×6或7×7子矩阵的输出。可替换地,在处理器100上执行的架构程序从权重RAM 124读取所得到的稀疏(即,包括空洞)结果行,并使用其它执行单元112(例如使用例如x86SSE指令的架构压缩指令的媒体单元)执行压缩功能。有利地,以类似于上述的及利用NNU 121的混合特性的那些的并发方式,在处理器100上执行的架构程序可以读取状态寄存器127,以监视权重RAM124的最近写入的行(例如,图26的字段2602)以读取所得到的稀疏行,将其压缩,并将其回写到权重RAM 124的相同行,使得其准备好用作神经网络的下一层的输入数据矩阵,例如卷积层或典型神经网络层(即,乘法-累加层)。此外,虽然说明了对4×4子矩阵执行池化操作的实施例,但是可以修改图28的NNU程序以对其它大小的子矩阵(诸如3×3、5×5、6×6或7×7子矩阵)执行池化操作。
还可以观察到,写入权重RAM 124的结果行的数量是输入数据矩阵的行数的四分之一。最后,在该示例中,不使用数据RAM 122。然而,可替换地,可以使用数据RAM 122而不是权重RAM 124来执行池化操作。
在图27和图28的示例中,池化操作计算子区域的最大值。然而,可以修改图28的程序以通过例如用sumwacc指令(将权重字与累加器202值217求和)替换maxwacc指令并改变在地址9处的激活函数指令以将累加结果除以(优选地通过倒数乘法,如下所述)每个子区域的元素数量(在该示例中为16),来计算子区域的平均值。
从根据图27和28的实施例的NNU 121的操作可以观察到,图28的程序的每次执行花费大约6000个时钟周期来执行图27的整个512×1600数据矩阵的池化操作,这显着小于通过常规方法执行类似任务所需的时钟周期的数量。
可替换地,不是将池化操作的结果回写到权重RAM 124,而是架构程序将NNU程序配置为将结果回写到数据RAM 122的行,并且架构程序在NNU 121写入结果(例如,使用图26B的最近写入的数据RAM 122行2606的地址)时从数据RAM 122读取结果。在权重RAM 124是单端口且数据RAM 122是双端口的实施例中,该替代方案是有利的。
具有用户提供的二进制小数点的定点算法,全精度定点累加,用户指定的倒数值,
累加器值的随机舍入和可选择的激活/输出函数
一般来说,在数字计算设备中执行算术的硬件单元可以被划分为通常所称的“整数”单元和“浮点”单元,因为它们分别对整数和浮点数执行算术运算。浮点数具有量值(或尾数)和指数,通常具有符号。指数是相对于量值的小数点(通常为二进制小数点)的位置的指示。相比之下,整数没有指数,而只有一个量值,通常具有符号。浮点单元的优点在于,它使得程序员能够使用可以在非常大的范围内取不同值的数字,硬件负责根据需要调整数字的指数值,程序员不必这样做。例如,假设两个浮点数0.111x1029和0.81x1031相乘。(在这里使用十进制或者基数为10的示例,虽然浮点数单位最常使用基数为2的浮点数)。浮点单元自动负责乘以尾数,添加指数,然后将结果归一化回为值.8991x1059。对于另一个示例,假设相同的两个浮点数相加。浮点单元自动负责在尾数的二进制小数点相加之前对准它们,以生成值为.81111x1031的结果和。
然而,与浮点单元相关联的复杂性和随之而来的大小、功率消耗和每指令的时钟和/或延长的循环时间的增加是众所周知的。实际上,由于这个原因,许多设备(例如,嵌入式处理器、微控制器和相对低成本和/或低功率微处理器)不包括浮点单元。从上面的示例可以观察到,浮点单元的一些复杂性包括:执行与浮点加法和乘法/除法相关联的指数计算的逻辑(加法器用于加/减操作数的指数以产生用于浮点乘法/除法的结果指数值,减法器用于确定操作数的减法指数以确定用于浮点加法的二进制小数点对准移位量)、完成用于浮点加法的尾数的二进制小数点对准的移位器、归一化浮点结果的移位器。另外,流程进行到块单元通常需要:执行浮点结果的舍入的逻辑、在整数和浮点格式之间或在不同浮点精度格式之间转换的逻辑(例如,扩展精度、双精度、单精度、半精度)、前导零和前导一检测器、以及处理特殊浮点数(如非正规数、NAN和无穷大)的逻辑。
此外,存在的缺点是浮点单元正确性验证的显着复杂性,主要是由于必须验证的设计的数量空间增大,这可能延长产品开发周期和上市时间。此外,如上所述,浮点算术意味着对于计算中涉及的每个浮点数的存储和使用单独的尾数字段和指数字段,这可以增加所需的储存量和/或在给定存储整数的相等储存量的情况下降低精度。通过使用对整数执行算术运算的整数单元来避免这些缺点中的许多缺点。
通常,程序员编写处理小数(即,不是整数的数)的程序。程序可以在不具有浮点单元的处理器上运行,或者如果它们具有,则由处理器的整数单元执行的整数指令可以更快。为了利用与整数单元相关的潜在性能优点,程序员采用通常所说的对定点数的定点算法。这种程序包括在整数单元上执行以处理整数数字或整数数据的指令。软件知道数据是小数的,并且包括对整数数据执行运算以处理数据实际上是小数的事实(例如,对准移位)的指令。基本上,定点软件手动执行浮点单元执行的一些或全部功能。
如本公开内容中所使用的,“定点”数(或值或操作数或输入或输出)是其存储位被理解为包括表示定点数的小数部分的位(本文中称为“小数位”)的数。定点数的存储位包括在存储器或寄存器中,例如存储器或寄存器中的8位或16位字。此外,定点数的存储位全部用于表示量值,在一些情况下,位用于表示符号,但是定点数的存储位都不用于表示数的指数。此外,定点数的小数位的数量或二进制小数点位置指定于与定点数的存储位不同的存储器中,并且对于定点数所属的定点数集合,例如处理单元阵列的输入操作数、累加值或输出结果的集合,以共享或全局方式指示小数位的数量或二进制小数点位置。
有利地,本文说明了其中ALU是整数单元,但激活函数单元包括定点算术硬件辅助或加速的实施例。这使得ALU部分能够更小和更快,这有助于在管芯上的给定空间内具有更多的ALU。这意味着每个管芯空间有更多的神经元,这在神经网络单元中是特别有利的。
此外,有利地,与对于每个浮点数需要指数存储位的浮点数相比,说明了定点数以存储位的数目的指示来表示的实施例,其中,存储位是用于整个数字集合的小数位,但该指示位于单个共享存储器中,其全局地指示用于整个集合(例如,一系列操作的输入集合,该系列的累加值的集合,输出集合)的所有数字的小数位的数目。优选地,NNU的用户能够指定该数字集合的小数存储位的数量。因此,应当理解,尽管在许多语境(例如,公共数学)中,术语“整数”是指有符号整数,即,不具有小数部分的数字,但是本语境中的术语“整数”可以指代具有小数部分的数字。此外,本语境中的术语“整数”旨在区别于其各自存储的位的一部分用于表示浮点数的指数的浮点数。类似地,整数算术运算(诸如由整数单元执行的整数乘法或加法或比较)假定操作数不具有指数,因此整数单元的整数组件(例如整数乘法器、整数加法器、整数比较器)不包括处理指数的逻辑,例如,不为了加法或比较运算而移动尾数以对准二进制小数点,不为乘法运算添加指数。
另外,本文描述了包括大硬件整数累加器的实施例,用以在不损失精度的情况下累加大系列的整数运算(例如,大约1000个乘法-累加数量级)。这使得NNU能够避免处理浮点数,而同时保持累加值中的完全精度,而不必由于溢出而使其饱和或导致不准确的结果。一旦该系列整数运算已经将结果累加到全精度累加器中,定点硬件辅助执行必要的缩放和饱和,以使用用户指定的累加值的小数位数量的指示和输出值中小数位的期望数量,将全精度累加值转换为输出值,如下面更详细描述的。
如下面更详细地描述的,优选地,激活函数单元可以在将累加器值从其全精度形式压缩以用作激活函数的输入或者被传递时,对累加器值选择性地执行随机舍入。最后,可以选择性地指示NPU应用不同的激活函数和/或输出由神经网络的给定层的不同需求所规定的累加器值的各种不同形式。
现在参考图29A,示出了例示图1的控制寄存器127的实施例的框图。控制寄存器127可以包括多个控制寄存器127。如图所示,控制寄存器127包括以下字段:配置2902、带符号数据2912、带符号权重2914、数据二进制小数点2922、权重二进制小数点2924、ALU函数2926、舍入控制2932、激活函数2934、倒数2942、移位量2944、输出RAM 2952、输出二进制小数点2954和输出命令2956。控制寄存器127值可以由MTNN指令1400和NNU程序的指令(例如启动指令)写入。
配置2902值指定NNU 121是处于窄配置、宽配置还是漏斗配置中,如上所述。配置2902意味着从数据RAM 122和权重RAM 124接收的输入字的大小。在窄配置和漏斗配置中,输入字的大小为窄(例如,8位或9位),而在宽配置,输入字的大小为宽(例如,12位或16位)。此外,配置2902意味着输出结果133的大小,其与输入字大小相同。
有符号数据值2912如果为真,则指示从数据RAM 122接收的数据字是有符号值,如果为假,则指示它们是无符号值。有符号权重值2914如果为真,则指示从权重RAM 124接收的权重字是有符号值,如果为假,则指示它们是无符号值。
数据二进制小数点2922值指示从数据RAM 122接收的数据字的二进制小数点的位置。优选地,数据二进制小数点2922值指示自二进制小数点的位置的右侧起的位位置的数量。也就是说,数据二进制小数点2922指示数据字的多少个最低有效位是小数位,即,在二进制小数点的右侧。类似地,权重二进制小数点2924值指示从权重RAM 124接收的权重字的二进制小数点的位置。优选地,当ALU函数2926是乘法和累加或输出累加器时,则NPU 126将保存在累加器202中的值的二进制小数点的右侧的位数确定为数据二进制小数点2922和权重二进制小数点2924的和。因此,例如,如果数据二进制小数点2922的值为5,权重二进制小数点2924的值为3,则累加器202中的值具有该二进制小数点右侧的8位。当ALU函数2926是和/最大值累加器和数据/权重字或通过数据/权重字时,NPU 126将保存在累加器202中的值的二进制小数点右侧的位数分别确定为数据/权重二进制小数点2922/2924。在下面关于图29B描述的替换实施例中,不是指定各个数据二进制小数点2922和权重二进制小数点2924,而是指定单个累加器二进制小数点2923。
ALU函数2926指定由NPU 126的ALU 204执行的函数。如上所述,ALU函数2926可以包括但不限于:将数据字209和权重字203相乘并与累加器202累加乘积;累加器202和权重字203求和;累加器202和数据字209求和;累加器202和数据字209的最大值;累加器202和权重字203的最大值;输出累加器202;使数据字209通过;使权重字203通过;输出零。在一个实施例中,ALU函数2926由NNU启动指令指定并且由ALU 204响应于执行指令(未示出)而使用。在一个实施例中,ALU函数2926由单独的NNU指令指定,例如上述乘法-累加和maxwacc指令。
舍入控制2932指定(图30的)舍入器3004使用哪种舍入形式。在一个实施例中,可以指定的舍入模式包括但不限于:不舍入、舍入到最接近和随机舍入。优选地,处理器100包括(图30的)随机位源3003,其生成随机位3005,随机位3005被采样并用于执行随机舍入以减少舍入偏差的可能性。在一个实施例中,当舍入位3005为1并且粘着位为0时,如果采样的随机位3005为真,则NPU 126上舍入(round up),如果随机位3005为假则不上舍入。在一个实施例中,随机位源3003基于处理器100的随机电特性的采样(例如半导体二极管或电阻器上的热噪声)生成随机位3005,但是可以设想其他实施例。
激活函数2934指定应用于累加器202值217的函数,以生成NPU 126的输出133。如上面和下面更详细地描述的,激活函数2934包括但不限于:S形;双曲正切;softplus;校正;除2的以指定幂;乘以用户指定的倒数值以完成有效的除法;通过全累加器;及作为规范大小通过累加器,这将在下面更详细地描述。在一个实施例中,激活函数由NNU激活函数指令指定。可替换地,激活函数由启动指令指定并响应于输出指令(例如,图4的地址4处的写AFU输出指令)而应用,在该实施例中,图4的地址3处的激活函数指令被归入输出指令。
倒数2942值指定与累加器202值217相乘以完成累加器202值217的除法的值。即,用户指定倒数2942值作为实际期望除数的倒数。这例如结合卷积和池化操作是有用的,如本文所述。优选地,用户以两部分指定倒数2942值,如下面关于图29C更详细地描述的。在一个实施例中,控制寄存器127包括使得用户能够指定借助多个内置除数值中的一个的除法的字段(未示出),所述多个内置除数值是常用卷积核的大小,例如9、25、36或49。在这个实施例中,AFU 212可以存储内置除数的倒数,用于乘以累加器202值217。
移位量2944指定AFU 212的移位器将累加器202值217向右移位以完成除以2的幂的位数。这同样结合大小为2的幂的卷积核是有用的。
输出RAM 2952值指定数据RAM 122和权重RAM 124中的哪一个接收输出结果133。
输出二进制小数点2954值指示输出结果133的二进制小数点的位置。优选地,输出二进制小数点2954指示自输出结果133的二进制小数点的位置的右侧起的位位置的数量。也就是说,输出二进制小数点2954指示输出结果133的多少个最低有效位是小数位,即,在二进制小数点的右侧。AFU 212基于输出二进制小数点2954的值(在大多数情况下还基于数据二进制小数点2922、权重二进制小数点2924、激活函数2934和/或配置2902的值)执行舍入、压缩、饱和和大小转换。
输出命令2956控制输出结果133的多个方面。在一个实施例中,AFU 212采用规范大小的概念,其是由配置2902指定的宽度的大小(以位为单位)的两倍。因此例如,如果配置2902意指从数据RAM 122和权重RAM 124接收的输入字的大小是8位,则规范大小是16位;对于另一示例,如果配置2902意指从数据RAM 122和权重RAM 124接收的输入字的大小是16位,则规范大小是32位。如本文所描述的,为了保持中间计算(例如分别1024和512个NNU乘法-累加指令)的全精度,累加器202的大小是大的(例如,窄累加器202B是28位,宽累加器202A是41位)。因此,对于激活函数2934的大多数值(除了通过全累加器以外),累加器202值217比规范大小和AFU 212(例如,下面关于图30描述的CCS 3008)更大(以位为单位),将累加器202的值217压缩到规范大小的值。输出命令2956的第一预定值指示AFU 212执行指定的激活函数2934以生成与原始输入字相同大小(即,一半的规范大小)的内部结果,并将内部结果输出作为输出结果133。输出命令2956的第二预定值指示AFU 212执行指定的激活函数2934以生成大小为原始输入字(即,规范大小)的两倍的内部结果,并且输出内部结果的下半部分作为输出结果133;输出命令2956的第三预定值指示AFU 212输出规范大小内部结果的上半部分作为输出结果133。输出命令2956的第四预定值指示AFU 212输出累加器202的原始最低有效字(其宽度由配置2902指定)作为输出结果133;第五预定值指示AFU 212输出累加器202的原始中等有效字作为输出结果133;第六预定值指示AFU 212输出累加器202的原始最高有效字作为输出结果133,如上面关于图8至10所述的。如上所述,输出全累加器202大小或规范大小的内部结果可能是有利的,例如,用于使处理器100的其他执行单元112能够执行激活函数,例如softmax激活函数。
虽然将图29A(以及图29B和29C)的字段描述为存在于控制寄存器127中,但是在其它实施例中,字段中的一个或多个可以存在于NNU 121的其他部分中。优选地,许多字段包括在NNU指令自身中并由序列发生器128解码以生成控制ALU 204和/或AFU 212的微操作3416(图34的)。另外,字段可以被包括在媒体寄存器118中存储的控制ALU 204和/或AFU212的微操作3414(图34的)中。在这种实施例中,最低限度地使用初始化NNU指令,在其他实施例中消除了初始化NNU指令。
如上所述,NNU指令能够指定对存储器操作数(例如,来自数据RAM 122和/或权重RAM 124的字)或旋转的操作数(例如,来自多路复用寄存器208/705)执行ALU运算。在一个实施例中,NNU指令还可以将操作数指定为激活函数的寄存输出(例如,图30的寄存器3038的输出)。另外,如上所述,NNU指令能够指定递增数据RAM 122或权重RAM 124的当前行地址。在一个实施例中,NNU指令可以指定一最接近的有符号整数增量值,其被添加到当前行来实现递增或递减一个非一的值。
现在参考图29B,示出了例示根据替代实施例的图1的控制寄存器127的实施例的框图。图29B的控制寄存器127类似于图29A的控制寄存器127;但图29B的控制寄存器127包括累加器二进制小数点2923。累加器二进制位2923指示用于累加器202的二进制小数点的位置。优选地,累加器二进制小数点2923值指示自二进制小数点的位置的右边起的位位置的数量。换句话说,累加器二进制小数点2923指示累加器202的多少个最低有效位是小数位,即,在二进制小数点的右边。在该实施例中,明确地指定累加器二进制小数点2923,而不是如上面关于图29A的实施例所描述的那样隐含地确定。
现在参考图29C,示出了例示根据一个实施例的存储为两个部分的图29A的倒数2942的实施例的框图。第一部分2962是移位值,其指示在用户期望乘以累加器202值217的真倒数值中的消除的前导零2962的数量。前导零的数量是紧接着二进制小数点右边的连续零的数量。第二部分2694是前导零消除倒数2964值,即,除去所有前导零的真倒数值。在一个实施例中,消除的前导零2962的数量被存储为四位,前导零消除的倒数2964值被存储为8位无符号值。
为了通过示例来说明,假定用户期望累加器202值217乘以49的倒数。用13个小数位表示的49的倒数的二进制表示是0.0000010100111,其具有五个前导零。在这种情况下,用户用值5填充消除的前导零2962的数量,并用值10100111填充前导零消除倒数2964。在(图30的)倒数乘法器“除法器A”3014将累加器202值217和前导零消除倒数2964值相乘后,它将所得到的乘积右移了消除前导零2962的数量。这个实施例可以有利地以相对少量的位实现高精度代表倒数2942值。
现在参考图30,示出了更详细地例示图2的AFU 212的实施例的框图。AFU 212包括:图1的控制寄存器127;接收累加器202值217的正型转换器(PFC)及输出二进制小数点对准器(OBPA)3002;舍入器3004,其接收累加器202值217和由OBPA 3002移出的位的数量的指示;生成随机位3005的随机位源3003,如上所述;接收PFC及OBPA 3002的输出和舍入器3004的输出的第一多路复用器3006;接收第一多路复用器3006的输出的到规范尺寸压缩器(CCS)及饱和器3008;接收CCS及饱和器3008的输出的位选择器及饱和器3012;接收CCS及饱和器3008的输出的校正器3018;接收CCS及饱和器3008的输出的倒数乘法器3014;接收CCS及饱和器3008的输出的右移位器3016;接收位选择器及饱和器3012的输出的双曲正切(tanh)模块3022;接收位选择器及饱和器3012的输出的S形模块3024;接收位选择器及饱和器3012的输出的softplus模块3026;第二多路复用器3032,其接收tanh模块3022、S形模块3024、softplus模块3026、校正器3108、倒数乘法器3014、右移位器3016的输出及CSS及饱和器3008的通过规范大小输出3028;接收第二多路复用器3032的输出的符号恢复器3034;接收符号恢复器3034的输出的尺寸转换器及饱和器3036;接收尺寸转换器及饱和器3036的输出以及累加器输出217的第三多路复用器3037;及接收多路复用器3037的输出且其输出是图1的结果133的输出寄存器3038。
PFC及OBPA 3002接收累加器202值217。优选地,累加器202值217是如上所述的全精度值。即,累加器202具有足够数量的存储位以保存累加值,该累加值是由整数加法器244生成的由整数乘法器242生成的一系列乘积的和,不丢弃乘法器242的各个乘积或加法器244的和的任何位,使得不存在精度损失。优选地,累加器202至少具有足够数量的位以保存NNU 121可编程执行的乘积累加的最大数量。例如,参考图4的程序来说明,当处于宽配置中时,NNU 121可编程以执行的乘积累加的最大数量是512,累加器202位宽度是41。对于另一示例,参考图20的程序来说明,当处于窄配置中时,NNU 121可编程以执行的乘积累加的最大数量是1024,累加器202位宽度是28。概括地说,全精度累加器202包括至少Q位,其中,Q是M和log2P的和,其中,M是乘法器242的整数乘积的位宽度(例如,对于窄乘法器242为16位,或对于宽乘法器242为32位),P为可以被累加到累加器202中的整数乘积的最大可允许数量。优选地,借助对NNU 121的编程器的编程规范来指定乘积累加的最大数量。在一个实施例中,在假设从数据/权重RAM 122/124加载数据/权重字206/207的行的一个在前乘法-累加指令(例如,图4的地址1处的指令)的情况下,序列发生器128迫使乘法-累加NNU指令(例如,图4的地址2处的指令)的计数的最大值例如为511。
有利地,通过包括具有足够大的位宽度的累加器202来累加用于最大数量的可允许累加的全精度值,这简化了NPU 126的ALU 204部分的设计。特别地,其减轻了对使由整数加法器244生成的和饱和的逻辑的需要,该逻辑会使较小累加器溢出并且需要跟踪累加器的二进制小数点位置以确定是否发生溢出以获知是否需要饱和。为了通过示例说明包括非全精度累加器并且替代地包括饱和逻辑以处理非全精度累加器的溢出的设计的问题,假设如下。
(1)数据字值的范围在0和1之间,存储的所有位用于存储小数位。权重字的范围在-8和+8之间,除了三个存储位之外的所有位用于存储小数位。并且,用于输入到双曲正切激活函数的累加值的范围在-8和+8之间,除了三个存储位之外的所有位用于存储小数位。
(2)累加器的位宽度是非全精度(例如,仅乘积的位宽度)。
(3)假定累加器是全精度,则最终累加值将大致在-8和+8之间(例如,+4.2);然而,在系列中的“点A”之前的乘积往往更经常为正,而在点A之后的乘积往往更经常为负。
在这种情况下,可能获得不准确的结果(即,除+4.2之外的结果)。这是因为在点A之前的某点处,当应该是更大的值(例如+8.2)时,累加器可以饱和到最大值+8,导致剩余的+0.2的丢失。对于更多的乘积累加,累加器甚至可以保持在饱和值,导致损失更多的正值。因此,如果累加器具有全精度位宽度,则累加器的最终值可以是一个比它将会具有的更小的数(即,小于+4.2)。
如果累加器202值217为负,则PFC 3002将该值转换为正形式,并且生成指示原始值是正还是负的附加位,该附加位与该值一起沿着AFU 212传递。转换为正形式简化了AFU212的后续操作。例如,其实现了仅正值输入到tanh 3022和S形3024模块,从而简化它们。另外,这简化了舍入器3004和饱和器3008。
OBPA 3002向右移位或缩放正形式值,以使其与在控制寄存器127中指定的输出二进制小数点2954对准。优选地,OBPA 3002将移位量计算为差值,该差值是从累加器202值217的小数位的数量(例如,由累加器二进制小数点2923指定或由数据二进制小数点2922和权重二进制小数点2924的和指定)减去输出的小数位的数量(例如,由输出二进制小数点2954指定)。因此,例如,如果累加器202二进制小数点2923是8(如上例所示),并且输出二进制小数点2954是3,则OBPA 3002将正形式值右移5位以生成提供给多路复用器3006和舍入器3004的结果。
舍入器3004舍入累加器202值217。优选地,舍入器3004生成由PFC及OBPA 3002生成的正形式值的舍入形式,并且将舍入形式提供给多路复用器3006。舍入器3004根据上述舍入控制2932来舍入,这可以包括使用随机位3005的随机舍入,如下文所述。多路复用器3006基于舍入控制2932(其可以包括随机舍入,如本文所述)选择其输入中的一个,即,来自PFC及OBPA 3002的正形式值或来自舍入器3004的其舍入形式,并且将所选择的值提供给CCS及饱和器3008。优选地,如果舍入控制2932指定不舍入,则多路复用器3006选择PFC及OBPA 3002的输出,否则选择舍入器3004的输出。考虑其他实施例,其中,AFU 212执行额外的舍入。例如,在一个实施例中,比特选择器3012基于当其压缩CCS及饱和器3008输出的位(如下所述)时丢失的低阶位来舍入。对于另一个示例,在一个实施例中,舍入倒数乘法器3014的乘积(如下所述)。对于又一示例,在一个实施例中,当尺寸转换器3036转换到适当的输出大小(如下所述)时,尺寸转换器3036舍入,这可能涉及丢失在舍入确定中使用的低阶位。
CCS 3008将多路复用器3006输出值压缩为规范大小。因此,例如,如果NPU 126在窄或漏斗配置2902中,则CCS 3008将28位多路复用器3006输出值压缩为16位;如果NPU 126在宽配置2902中,则CCS 3008将41位多路复用器3006输出值压缩为32位。然而,在压缩到规范大小之前,如果预压缩值大于在规范形式中可表达的最大值,则饱和器3008将预压缩值饱和为规范形式中可表达的最大值。例如,如果最高有效规范形式位左侧的预压缩值的任何位具有1值,则饱和器3008饱和到最大值(例如,全部1)。
优选地,tanh 3022、S形3024和softplus 3026模块包括查找表,例如可编程逻辑阵列(PLA)、只读存储器(ROM)、组合逻辑门等等。在一个实施例中,为了简化和减小模块3022/3024/3026的大小,为它们提供了具有3.4形式的输入值,即,三个整数位和四个小数位,即,输入值在二进制小数点的右边具有四位和在二进制小数点的左边具有三位。选择这些值是因为在3.4形式的输入值范围(-8,+8)的极值处,输出值渐近地接近其最小/最大值。然而,可以设想将二进制小数点设置在不同位置的其它实施例,例如以4.3形式或2.5形式。比特选择器3012选择满足3.4形式准则的CCS及饱和器3008输出的位,其涉及压缩,即一些位丢失,因为规范形式具有更大数量的位。然而,在选择/压缩CCS及饱和器3008输出值之前,如果预压缩值大于以3.4形式可表达的最大值,则饱和器3012将预压缩值饱和为在3.4形式中可表达的最大值。例如,如果最高有效3.4形式位左侧的预压缩值的任何位具有1值,则饱和器3012饱和到最大值(例如,全部1)。
tanh 3022、S形3024和softplus 3026模块对由CCS及饱和器3008输出的3.4形式值执行它们各自的激活函数(如上所述)以生成结果。优选地,tanh 3022和S形3024模块的结果是0.7形式的7位结果,即零个整数位和七个小数位,即输入值在二进制小数的右边有七位。优选地,softplus模块3026的结果是3.4形式的7位结果,例如,与模块3026的输入相同的形式。优选地,将tanh 3022、S形3024和softplus 3026模块的输出扩展到规范形式(例如,根据需要添加的前导零)并且对准,以具有由输出二进制小数点2954值指定的二进制小数点。
校正器3018生成CCS及饱和器3008的输出值的校正形式。即,如果CCS及饱和器3008的输出值(其符号如上所述被管线传递)为负,则校正器3018输出零值;否则,校正器3018输出其输入值。优选地,校正器3018的输出是规范形式并且具有由输出二进制小数点2954值指定的二进制小数点。
倒数乘法器3014将CCS及饱和器3008的输出乘以在倒数值2942中指定的用户指定的倒数值,以生成其规范大小乘积,它实际上是CCS及饱和器3008的输出与作为倒数2942值的倒数的除数的商。优选地,倒数乘法器3014的输出是规范形式并且具有由输出二进制小数点2954值指定的二进制小数点。
右移位器3016将CCS及饱和器3008的输出移位由移位量值2944中指定的用户指定的位数,以生成其规范大小商。优选地,右移位器3016的输出是规范形式并且具有由输出二进制小数点2954值指定的二进制小数点。
多路复用器3032选择由激活函数2934值指定的适当输入,并将该选择提供给符号恢复器3034,如果初始累加器202值217是负值,则符号恢复器3034将多路复用器3032的正形式输出转换为负形式,例如,转换为二的补码形式。
尺寸转换器3036基于输出命令2956的值将符号恢复器3034的输出转换为适当的大小,这些值在上面相关于图29A进行了说明。优选地,符号恢复器3034的输出具有由输出二进制小数点2954值指定的二进制小数点。优选地,对于输出命令2956的第一预定值,尺寸转换器3036丢弃符号恢复器3034输出的上半部分的位。此外,如果符号恢复器3034的输出是正的并且超过由配置2902指定的字大小可表达的最大值、或者是负的并且小于字大小可表达的最小值,则饱和器3036将其输出饱和到字大小可表达的相应最大/最小值。对于第二和第三预定值,尺寸转换器3036使符号恢复器3034输出通过。
多路复用器3037基于输出命令2956选择尺寸转换器及饱和器3036输出或累加器202输出217,以提供给输出寄存器3038。更具体地,对于输出命令2956的第一和第二预定值,多路复用器3037选择尺寸转换器及饱和器3036的输出的低位字(其大小由配置2902指定)。对于第三预定值,多路复用器3037选择尺寸转换器及饱和器3036输出的高位字。对于第四预定值,多路复用器3037选择原始累加器202值217的低位字;对于第五预定值,多路复用器3037选择原始累加器202值217的中间字;对于第六预定值,多路复用器3037选择原始累加器202值217的高位字。如上所述,优选地,AFU 212将原始累加器202值217的高位字的高位填充为零。
现在参考图31,示出了图30的AFU 212的操作的示例。如图所示,配置2902被设置为NPU 126的窄配置。另外,带符号数据2912和带符号权重2914的值为真。另外,数据二进制小数点2922值指示将数据RAM 122字的二进制小数点定位为使得在二进制小数点右侧有7位,由NPU 126中的一个接收的第一数据字的示例值显示为0.1001110。此外,权重二进制小数点2924值指示将权重RAM 124字的二进制小数点定位为使得在二进制小数点右侧有3位,由NPU 126中的一个接收的第一数据字的示例值显示为00001.010。
第一数据和权重字的16位乘积(其与累加器202的初始零值累加)显示为000000.1100001100。因为数据二进制小数点2912是7并且权重二进制小数点2914是3,所以隐含的累加器202二进制小数点被定位为使得在二进制小数点右侧有10位。在窄配置的情况下,在示例实施例中,累加器202是28位宽。在该示例中,示出了在执行所有ALU运算(例如,图20的所有1024个乘法-累加)之后累加器202的000000000000000001.1101010100的值217。
输出二进制小数点2954值指示将用于输出的二进制小数点定位为使得在二进制小数点右侧有7位。因此,在通过OBPA 3002和CCS 3008之后,累加器202值217被缩放、舍入和压缩为规范形式值000000001.1101011。在该示例中,输出二进制小数点位置指示7个小数位,并且累加器202二进制小数点位置指示10个小数位。因此,OBPA 3002计算差值3,并且通过将累加器202值217右移3位来缩放累加器202值217。这在图31中由累加器202值217的3个最低有效位(二进制100)的丢失来指示。此外,在该示例中,舍入控制2932值指示使用随机舍入,并且在该示例中,假设采样随机位3005为真。因此,最低有效位向上舍入,因为根据上述描述,累加器202值217的舍入位(通过累加器202值217的缩放移出的3位的最高有效位)为1,并且粘着位(通过累加器202值217的缩放移出的3位的2个最低有效位的布尔运算OR)为零。
在该示例中,激活函数2934指示使用S形函数。因此,位选择器3012选择规范形式值的位,使得到S形模块3024的输入具有如上所述的三个整数位和四个小数位,即如图所示的值001.1101。S形模块3024输出置于规范形式中显示为000000000.1101110的值。
在示例中的输出命令2956指定第一预定值,即,输出由配置2902指示的字大小,在这种情况下其是窄字(8位)。因此,尺寸转换器3036将规范S形输出值转换为8位量,其隐含二进制小数点被定位为使得在该二进制小数点右侧有7位,得到输出值01101110,如图所示。
现在参考图32,示出了图30的AFU 212的操作的第二示例。图32的示例示出了当激活函数2934指示使规范大小的累加器202值217通过时AFU 212的操作。如图所示,将配置2902设置为NPU 126的窄配置。
在该示例中,累加器202是28位宽,并且将累加器202二进制小数点定位为使得在二进制小数点右侧有10位(如上所述,或者因为根据一个实施例的数据二进制位2912和权重二进制小数点2914的和是10,或者因为根据替代实施例,累加器二进制小数点2923被明确地指定为具有值10)。在该示例中,图32示出在执行所有ALU运算之后累加器202的值217为000001100000011011.1101111010。
在该示例中,输出二进制小数点2954值指示将用于输出的二进制小数点定位为使得在二进制小数点右侧有4位。因此,在通过OBPA 3002和CCS 3008之后,累加器202值217被饱和并压缩到规范形式值111111111111.1111,如图所示,其由多路复用器3032接收作为规范大小通过值3028。
在该示例中,示出了两个输出命令2956。第一输出命令2956指定第二预定值,即,输出规范形式大小的低位字。由于由配置2902指示的大小是窄字(8位),这意味着16位的规范大小,所以尺寸转换器3036选择规范大小通过值3028的低8位以产生8位值11111111,如图所示。第二输出命令2956指定第三预定值,即,输出规范形式大小的高位字。因此,尺寸转换器3036选择规范大小通过值3028的高8位以产生8位值11111111,如图所示。
现在参考图33,示出了图30的AFU 212的操作的第三示例。图33的示例示出了当激活函数2934指示使完整原始累加器202的值217通过时AFU 212的操作。如图所示,将配置2902设置为NPU 126的宽配置(例如,16-位输入字)。
在该示例中,累加器202是41位宽,并且将累加器202二进制小数点定位为使得在二进制小数点右侧有8位(如上所述,或者因为根据一个实施例,数据二进制小数点2912和权重二进制小数点2914的和是8,或者因为根据替代实施例,累加器二进制小数点2923被明确地指定为具有值8)。在该示例中,图33示出在执行所有ALU运算之后累加器202的值217为001000000000000000001100000011011.11011110。
在该示例中,示出了三个输出命令2956。第一输出命令2956指定第四预定值,即输出原始累加器202值的低位字;第二输出命令2956指定第五预定值,即输出原始累加器202值的中间字;第三输出命令2956指定第六预定值,即输出原始累加器202的值的高位字。由于由配置2902指示的大小是宽字(16位),因此图33示出响应于第一输出命令2956,多路复用器3037选择16位值0001101111011110;响应于第二输出命令2956,多路复用器3037选择16位值0000000000011000;响应于第三输出命令2956,多路复用器3037选择16位值0000000001000000。
如上所述,有利地,NNU 121对整数数据而不是浮点数据进行操作。这具有简化每个NPU 126或至少ALU 204部分的优点。例如,ALU 204不需要包括在浮点实施方式中将乘法器242的被乘数的指数相加所需的加法器。类似地,ALU 204不需要包括在浮点实施方式中将用于加法器234的加数的二进制小数点对准所需的移位器。如本领域技术人员将理解的,浮点单元通常是非常复杂的;因此,这些仅是对ALU 204的简化的示例,借助具有使用户能够指定相关二进制小数点的硬件定点辅助的当前整数实施例享有其他简化。ALU 204是整数单元的事实可有利地得到比浮点实施例更小(和更快)的NPU 126,这进一步有利地促进了将大的NPU 126阵列包含在NNU 121中。AFU 212部分基于在累加值中期望的小数位的优选地用户指定的数量和在输出值中期望的小数位的数量来处理累加器202值217的缩放和饱和。有利地,可以通过在ALU 204部分中共享AFU 212来平摊AFU 212的定点硬件辅助中的任何额外复杂性和随之而来的尺寸、功耗和/或时间的增加,例如如关于图11的实施例所述的,因为在共享的实施方式中可以减少AFU 1112的数量。
有利地,本文描述的实施例享有与优于浮点算术单元的硬件整数算术单元的复杂性降低相关联的许多益处,同时仍提供对小数(即,具有二进制小数点的数字)的算术运算。浮点运算的优点在于其适应对其各自值可能在非常宽的值范围(其实际上仅由可以非常大的指数范围的大小限制)内的任何地方的数据的算术运算。即,每个浮点数具有其自己的潜在唯一指数值。然而,这里描述的实施例认识到并利用以下的事实,即存在输入数据高度并行化并且其值在相对窄的范围内使得所有并行化值的“指数”可以是相同的某些应用。因此,实施例使得用户能够一次为所有输入值和/或累加值指定二进制小数点位置。类似地,实施例使得用户能够一次针对所有输出值指定二进制小数点位置,认识到并利用并行化输出的类似范围特性。人工神经网络是这种应用的示例,但是实施例可以用于执行其他应用的计算。通过一次为多个输入指定二进制小数点位置,而不是为每个单独的输入数指定二进制小数点位置,实施例提供了比浮点实施方式更有效地存储器空间使用(例如,需要更少的存储器)和/或提供对于类似存储量的精度增加,因为在浮点实施方式中将用于指数的位可以用于指定量值中的更高精度。
进一步有利地,实施例认识到在大系列整数运算的累加期间可能经历的潜在精度损失(例如,较不重要的小数位的溢出或丢失),并且提供解决方案,主要以足够大的累加器的形式,以避免精度损失。
NNU微操作的直接执行
现在参考图34,示出了例示图1的处理器100以及图1的NNU 121的更详细部分的框图。NNU 121包括NPU 126的流水线级3401。由分级寄存器分离的流水线级3401包括完成如本文所述的NPU 126的操作的组合逻辑,诸如布尔逻辑门、多路复用器、加法器、乘法器、比较器等等。流水线级3401从多路复用器3402接收微操作3418。微操作3418沿着流水线级3401向下流动并控制其组合逻辑。微操作3418是位的集合。优选地,微操作3418包括数据RAM 122存储器地址123、权重RAM 124存储器地址125、程序存储器129存储器地址131、多路复用寄存器208/705控制信号213/713、多路复用器802控制信号803和控制寄存器127的许多字段(例如,图29A至29C的)等等的位。在一个实施例中,微操作3418包括大约120位。多路复用器3402从三个不同源接收微操作,并且选择它们中的一个作为用于提供给流水线级3401的微操作3418。
到多路复用器3402的一个微操作源是图1的序列发生器128。序列发生器128对从程序存储器129接收的NNU指令进行解码,并且作为响应生成提供给多路复用器3402的第一输入的微操作3416。
到多路复用器3402的第二微操作源是解码器3404,其接收来自图1的保留站108的微指令105以及来自GPR 116和媒体寄存器118的操作数。优选地,微指令105由指令转换器104响应于转换MTNN指令1400和MFNN指令1500而生成,如上所述。微指令105可以包括指定特定功能(其由MTNN指令1400或MFNN指令1500指定)的立即字段,诸如开始和停止执行程序存储器129中的程序、直接执行来自媒体寄存器118的微操作、或读/写NNU 121的存储器,如上所述。解码器3404解码微指令105,并且作为响应生成提供给多路复用器3402的第二输入端的微操作3412。优选地,响应于MTNN/MFNN 1400/1500指令的一些功能1432/1532,不需要解码器3404生成微操作3412以沿流水线3401向下发送,例如,写入控制寄存器127、开始执行程序存储器129中的程序、暂停执行程序存储器129中的程序、等待程序存储器129中的程序的执行完成,从状态寄存器127读取及重置NNU 121。
到多路复用器3402的第三微操作源是媒体寄存器118自身。优选地,如上相关于图14所述的,MTNN指令1400可以指定指示NNU 121直接执行从媒体寄存器118提供到多路复用器3402的第三输入端的微操作3414的功能。直接执行由架构媒体寄存器118提供的微操作3414对于NNU 121的测试(例如内置自测试(BIST))和调试(debug)特别有用。
优选地,解码器3404生成控制多路复用器3402选择的模式指示符3422。当MTNN指令1400指定开始运行来自程序存储器129的程序的功能时,解码器3404生成模式指示符3422值,该值使得多路复用器3402从序列发生器128选择微操作3416,直到发生错误或直到解码器3404遇到指定停止运行来自程序存储器129的程序的功能的MTNN指令1400。当MTNN指令1400指定指示NNU 121直接执行从媒体寄存器118提供的微操作3414的功能时,解码器3404生成模式指示符3422值,该值使得多路复用器3402选择来自媒体寄存器118的微操作3414。否则,解码器3404生成模式指示符3422值,该值使得多路复用器3402选择来自解码器3404的微操作3412。
可变速率神经网络单元
可能存在NNU 121运行程序然后在它可以运行其下一个程序之前空闲等待处理器100进行它所需要的事情的情况。例如,假定类似于关于图3至图6A描述的情况,其中,NNU121运行乘法-累加-激活函数程序(其也可以被称为前馈神经网络层程序)的两个或多个连续实例。与NNU 121运行该程序所花费的相比,处理器100可能花费明显更长的时间,将512KB的权重值写入权重RAM 124,该权重值将由NNU程序的下一次运行使用。换句话说,NNU121可以在相对少量的时间内运行程序,然后在处理器100完成将下一权重值写入权重RAM124以用于程序的下一运行时闲置。这种情况在图36A中可视地示出,其在下面更详细地描述。在这种情况下,可能有利的是以较慢的速率运行NNU 121并且花费更长的时间来执行程序,由此在更长的时间内展开NNU 121运行程序所需的能量消耗,一般来说,这可以往往保持NNU 121并且或许处理器100的温度较低。这种情况被称为松弛模式并且在图36B中可视地示出,其在下面更详细地描述。
现在参考图35,示出了例示包括可变速率NNU 121的处理器100的框图。处理器100在许多方面类似于图1的处理器100,并且相同编号的组件是类似的。图35的处理器100还包括耦合到处理器100的功能单元(即,指令提取单元101、指令高速缓存102、指令转换器104、重命名单元106、保留站108、NNU 121、其他执行单元112、存储器子系统114、通用寄存器116和媒体寄存器118)的时钟生成逻辑电路3502。时钟生成逻辑电路3502包括诸如锁相环(PLL)这样的时钟发生器,其生成具有主时钟速率或时钟频率的时钟信号。例如,主时钟速率可以是1GHz、1.5GHz、2GHz等。时钟速率表示每秒时钟信号的周期数,例如高和低状态之间的振荡数。优选地,时钟信号具有平衡的占空比,即高半部分周期和另一低半部分周期;可替换地,时钟信号具有不平衡占空比,其中,时钟信号处于高状态比其处于低状态时长,反之亦然。优选地,PLL可配置为以多个时钟速率生成主时钟信号。优选地,处理器100包括电源管理模块,其基于各种因素自动调整主时钟速率,因素包括动态检测的处理器100的操作温度、利用率以及来自指示期望性能的系统软件(例如,操作系统、BIOS)的命令和/或功率节省指示符。在一个实施例中,电源管理模块包括处理器100的微代码。
时钟生成逻辑电路3502还包括时钟分配网络或时钟树。时钟树将主时钟信号分配到处理器100的功能单元,其在图35中被指示为到指令提取单元101的时钟信号3506-1,到指令高速缓存102的时钟信号3506-2,到指令转换器104的时钟信号3506-10,到重命名单元106的时钟信号3506-9,到保留站108的时钟信号3506-8,到NNU 121的时钟信号3506-7,到其它执行单元112的时钟信号3506-4,到存储器子系统114的时钟信号3506-3,到通用寄存器116的时钟信号3506-5和到媒体寄存器118的时钟信号3506-6,它们被统称为时钟信号3506。时钟树包括将主时钟信号3506发送到它们各自的功能单元的节点或线。另外,优选地,时钟生成逻辑电路3502包括时钟缓冲器,其根据需要重新生成主时钟信号,以提供更干净的时钟信号和/或提高主时钟信号的电压电平,特别是对于长节点。另外,每个功能单元还可以根据需要包括其自己的子时钟树,其重新生成和/或提升其接收的相应主时钟信号3506。
NNU 121包括时钟降低逻辑电路3504,其接收松弛指示器3512并且接收主时钟信号3506-7,并且作为响应,生成辅助时钟信号。辅助时钟信号具有的时钟速率与主时钟速率的时钟速率相同,或者在松弛模式下,相对于主时钟速率降低编程到松弛指示器3512中的量,其可能提供热效益。时钟降低逻辑电路3504在许多方面类似于时钟生成逻辑电路3502,因为它包括时钟分配网络或时钟树,其将辅助时钟信号分配到NNU 121的各个块,其被指示为到NPU 126的阵列的时钟信号3508-1,到序列发生器128的时钟信号3508-2,到接口逻辑电路3514的时钟信号3508-3,它们被统称为或者单独地称为辅助时钟信号3508。优选地,NPU 126包括多个流水线级3401,如关于图34所描述的,多个流水线级3401包括从时钟降低逻辑电路3504接收辅助时钟信号3508-1的流水线分级寄存器。
NNU 121还包括接收主时钟信号3506-7和辅助时钟信号3508-3的接口逻辑电路3514。接口逻辑电路3514耦合在处理器100的前端的较低部分(例如,保留站108、媒体寄存器118和通用寄存器116)和NNU 121的各种块(即,时钟降低逻辑电路3504、数据RAM 122、权重RAM 124、程序存储器129和序列发生器128)之间。接口逻辑电路3514包括数据RAM缓冲器3522、权重RAM缓冲器3524、图34的解码器3404和松弛指示器3512。松弛指示器3512保存指定NPU 126的阵列执行NNU程序指令将慢多少(如果有的话)的值。优选地,松弛指示器3512指定除数值N,借助该除数值N,时钟降低逻辑电路3504将主时钟信号3506-7进行分频以生成辅助时钟信号3508,使得辅助时钟信号3508具有1/N的速率。优选地,N的值可以被编程为多个不同的预定值中的任一个,以使得时钟降低逻辑电路3504以小于主时钟速率的相应的多个不同速率生成辅助时钟信号3508。
在一个实施例中,时钟降低逻辑电路3504包括时钟分频器电路,用于将主时钟信号3506-7除以松弛指示器3512的值。在一个实施例中,时钟降低逻辑电路3504包括时钟门(例如,与门),其使用仅在主时钟信号3506-7的每N个周期才为真一次的使能信号来对主时钟信号3506-7进行门控。例如,包括计数到N的计数器的电路可以用于生成使能信号。当伴随的逻辑电路检测到计数器的输出匹配N时,逻辑电路在辅助时钟信号3508上生成真脉冲,并且重置计数器。优选地,松弛指示器3512值可由诸如图14的MTNN 1400指令的架构指令编程。优选地,在处理器100上运行的架构程序恰好在指示NNU 121开始运行NNU程序之前将松弛值编程到松弛指示器3512中,如相关于图37更详细地描述的。
权重RAM缓冲器3524耦合在权重RAM 124和媒体寄存器118之间,用于缓冲它们之间的数据传输。优选地,权重RAM缓冲器3524类似于图17的缓冲器1704的一个或多个实施例。优选地,权重RAM缓冲器3524的从媒体寄存器118接收数据的部分由主时钟信号3506-7以主时钟速率进行时钟控制,权重RAM缓冲器3524的从权重RAM 124接收数据的部分由辅助时钟信号3508-3以辅助时钟速率进行时钟控制,辅助时钟速率可以相对于主时钟速率降低或不降低,这取决于编程到松弛指示器3512中的值,即取决于NNU 121是以松弛模式还是正常模式操作。在一个实施例中,权重RAM 124是单端口的,如上文关于图17所描述的,并且可由媒体寄存器118经由权重RAM缓冲器3524以及由图11的NPU 126或行缓冲器1104以仲裁的方式访问。在替代实施例中,权重RAM 124是双端口的,如上文关于图16所描述的,每个端口可由媒体寄存器118经由权重RAM缓冲器3524且由NPU 126或行缓冲器1104以并发方式访问。
类似地,数据RAM缓冲器3522耦合在数据RAM 122和媒体寄存器118之间,用于缓冲它们之间的数据传输。优选地,数据RAM缓冲器3522类似于图17的缓冲器1704的一个或多个实施例。优选地,从媒体寄存器118接收数据的数据RAM缓冲器3522的部分由主时钟信号3506-7以主时钟速率进行时钟控制,从数据RAM 122接收数据的数据RAM缓冲器3522的部分由辅助时钟信号3508-3以辅助时钟速率进行时钟控制,辅助时钟速率可以或可以不相对于主时钟速率降低,这取决于编程到松弛指示器3512中的值,即取决于NNU 121是以松弛模式还是正常模式操作。在一个实施例中,数据RAM 122是单端口的,如上文关于图17所描述的,并且可由媒体寄存器118经由数据RAM缓冲器3522以及由图11的NPU 126或行缓冲器1104以仲裁的方式访问。在替代实施例中,数据RAM 122是双端口的,如上文关于图16所描述的,每个端口可由媒体寄存器118经由数据RAM缓冲器3522且由NPU 126或行缓冲器1104以并发方式访问。
优选地,不管数据RAM 122和/或权重RAM 124是单端口还是双端口的,接口逻辑电路3514都包括数据RAM缓冲器3522和权重RAM缓冲器3524,以便提供主时钟域和辅助时钟域之间的同步。优选地,数据RAM 122、权重RAM 124和程序存储器129中的每一个包括静态RAM(SRAM),其包括相应的读使能、写使能和存储器选择信号。
如上所述,NNU 121是处理器100的执行单元。执行单元是执行架构指令被转换为的微指令的处理器的功能单元,诸如图1的架构指令103被转换为的微指令105,或者执行架构指令103本身的处理器的功能单元。执行单元从处理器的通用寄存器(例如GPR 116和媒体寄存器118)接收操作数。执行单元响应于执行可被写入通用寄存器的微指令或架构指令而生成结果。架构指令103的示例是分别关于图14和图15说明的MTNN指令1400和MFNN指令1500。微指令实施架构指令。更具体地,执行单元对架构指令被转换为的一个或多个微指令的集体执行对由架构指令指定的输入执行架构指令所指定的操作,以产生由架构指令规定的结果。
现在参考图36A,示出了例示具有在正常模式下(即,以主时钟速率)操作的NNU121的处理器100的操作的示例的时序图。时间在时序图中从左到右前进。处理器100以主时钟速率运行架构程序。更具体地,处理器100前端(例如,指令提取单元101、指令高速缓存102、指令转换器104、重命名单元106、保留站108)以主时钟速率提取、解码并向NNU 121和其他执行单元112发出架构指令。
最初,架构程序执行前端100向NNU 121发出的指示NNU 121开始运行其程序存储器129中的NNU程序的架构指令(例如,MTNN指令1400)。之前,架构程序执行架构指令以用指定主时钟速率的值写入松弛指示器3512,即,将NNU 121置于正常模式中。更具体地,编程到松弛指示器3512中的值使得时钟降低逻辑电路3504以主时钟信号3506的主时钟速率生成辅助时钟信号3508。优选地,在此情况下,时钟降低逻辑电路3504的时钟缓冲器简单地升高主时钟信号3506。此外之前,架构程序执行架构指令以写入数据RAM 122和权重RAM 124,并将NNU程序写入程序存储器129。响应于开始NNU程序MTNN指令1400,NNU 121以主时钟速率开始运行NNU程序,因为松弛指示器3512被编程有主速率值。在开始NNU 121运行之后,架构程序继续以主时钟速率执行架构指令,包括和主要是MTNN指令1400,以写入和/或读取数据RAM 122和权重RAM 124,为NNU程序的下一个实例或调用或运行做准备。
如图36A中的示例所示,NNU 121以比架构程序所花费的显着更少的时间(例如,四分之一的时间)完成运行NNU程序以完成写入/读取数据RAM 122和权重RAM 124。例如,NNU121可以花费大约1000个时钟周期来运行NNU程序,而架构程序花费大约4000个时钟周期来运行,两者都以主时钟速率运行。因此,NNU 121在明显长的时间(该示例中是例如大约3000个主时钟速率周期)的剩余时间闲置。如图36A中的示例所示,该模式继续另一次,并且可以继续几次,这取决于神经网络的大小和配置。因为NNU 121可以是处理器100的较大且晶体管密集的功能单元,所以它可以生成相当大量的热,特别是在以主时钟速率运行时。
现在参考图36B,示出了例示具有在松弛模式下(即,以小于主时钟速率的速率)操作的NNU 121的处理器100的操作的示例的时序图。图36B的时序图在许多方面类似于图36A的时序图,因为处理器100以主时钟速率运行架构程序。并且在该示例中假设图36B的架构程序和NNU程序与图36A的架构程序和NNU程序相同。然而,在开始NNU程序之前,架构程序执行MTNN指令1400,MTNN指令1400用使得时钟降低逻辑电路3504以小于主时钟速率的辅助时钟速率生成辅助时钟信号3508的值编程松弛指示器3512。即,架构程序将NNU 121置于在图36B中的松弛模式中,而不是如图36A中的正常模式中。因此,NPU 126以辅助时钟速率执行NNU程序,其在松弛模式下小于主时钟速率。在该示例中,假设松弛指示器3512被编程有指定辅助时钟速率是主时钟速率的四分之一的值。结果,通过比较图36A和36B可以看出,与在正常模式下运行NNU程序相比,NNU 121在松弛模式下运行NNU程序花费大约四倍的时间,使得NNU 121空闲的时间量相对较短。因此,用于运行NNU程序的能量由图36B中的NNU 121在大约比图36A中NNU 121在正常模式下运行程序时长四倍的时间段上消耗。因此,NNU 121生成用以在图36B中以图36A中的大约四分之一的速率运行NNU程序的热量,这可以具有如本文所述的热效益。
现在参考图37,示出了例示图35的处理器100的操作的流程图。该流程图示出的操作在许多方面类似于上面关于图35、36A和36B所描述的操作。流程开始于框3702。
在框3702处,处理器100执行MTNN指令1400,以用权重写入权重RAM 124并用数据写入数据RAM 122。流程进行到框3704。
在框3704处,处理器100执行MTNN指令1400,以用指定比主时钟速率更低的速率的值来编程松弛指示器3512,即,将NNU 121置于松弛模式中。流程进行到框3706。
在框3706处,处理器100执行MTNN指令1400,以指示NNU 121开始运行NNU程序,类似于图36B中可见到的方式。流程进行到框3708。
在框3708处,NNU 121开始运行NNU程序。并行地,处理器100执行MTNN指令1400以用新权重写入权重RAM 124(并且有可能用新数据写入数据RAM 122)和/或执行MFNN指令1500以从数据RAM 122读取结果(并且有可能从权重RAM 124读取结果)。流程进行到框3712。
在框3712处,处理器100执行MFNN指令1500(例如,读取状态寄存器127),以检测NNU 121是否完成运行其程序。假设架构程序选择了松弛指示器3512的良好值,则NNU 121运行NNU程序所花费的时间量与处理器100执行访问权重RAM 124和/或数据RAM 122的架构程序的部分所花费的大约相同,如图36B可见的。流程进行到框3714。
在框3714处,处理器100执行MTNN指令1400,以用指定主时钟速率的值来编程松弛指示器3512,即,将NNU 121置于正常模式中。流程进行到框3716。
在框3716处,处理器100执行MTNN指令1400,以指示NNU 121开始运行NNU程序,类似于图36A中可见到的方式。流程进行到框3718。
在框3718处,NNU 121开始以正常模式运行NNU程序。流程在框3718处结束。
如上所述,相对于NNU在正常模式下(即,在处理器的主时钟速率下)运行程序的时间,在松弛模式下运行NNU程序将NNU运行程序的时间扩展开,这可以提供热效益。更具体地,当NNU在松弛模式下运行程序的同时,器件(例如,晶体管、电容器、导线)将可能在较低的温度下操作,因为NNU以较慢的速率生成由NNU(例如,半导体器件、金属层、下面的衬底)和周围的封装及冷却解决方案(例如,散热器、风扇)耗散的热。总体上这还可以降低处理器管芯的其它部分中的器件的温度。器件的较低工作温度,特别是它们的结(junction)温度,可以具有漏电流较少的益处。此外,由于每单位时间汲取的电流量较少,所以可以减小感应噪声和电阻压降噪声。此外,较低的温度可对处理器的MOSFET的负偏置温度不稳定性(NBTI)和正偏置温度不稳定性(PBTI)具有积极的影响,从而增加器件及因而增加处理器部分的可靠性和/或寿命。较低的温度还可以减少处理器的金属层中的焦耳加热和电迁移。
架构程序与非架构程序关于NNU的共享资源的通信机制
如上所述,例如关于图24至图28以及图35至图37,数据RAM 122和权重RAM 124是共享资源。NPU 126和处理器100的前端都共享数据RAM 122和权重RAM 124。更具体地,NPU126和处理器100的前端(例如,媒体寄存器118)写和读数据RAM 122和权重RAM 124。换句话说,在处理器100上运行的架构程序与在NNU 121上运行的NNU程序共享数据RAM 122和权重RAM 124,在一些情况下,这需要在架构程序和NNU程序之间流程的控制,如上所述。在某种程度上,这种资源共享也适用于程序存储器129,因为架构程序写入它并且序列发生器128读取它。以上和以下说明的实施例提供了用于控制对架构程序和NNU程序之间的共享资源的访问流程的高性能解决方案。
在所说明的实施例中,NNU程序也被称为非架构程序,NNU指令也被称为非架构指令,NNU指令集(以上也称为NPU指令集)也称为非架构指令集。非架构指令集与架构指令集不同。在处理器100包括将架构指令转换为微指令的指令转换器104的实施例中,非架构指令集也与微指令集不同。
现在参考图38,示出了更详细地例示NNU 121的序列发生器128的框图。如上所述,序列发生器128将存储器地址131提供给程序存储器129,以选择提供给序列发生器128的非架构指令。存储器地址131保存在序列发生器128的程序计数器3802中,如图38所示。序列发生器128通常通过程序存储器129的顺序地址递增,除非序列发生器128遇到非架构控制指令,例如循环或分支指令,在此情况下,序列发生器128将程序计数器3802更新为控制指令的目标地址,即,更新为在控制指令的目标处的非架构指令的地址。因此,保存在程序计数器3802中的地址131指定当前被提取以由NPU126执行的非架构程序的非架构指令的程序存储器129中的地址。有利地,程序计数器3802的值可以由架构程序经由状态寄存器127的NNU程序计数器字段3912获得,如下面相关于图39所述的。这使得架构程序能够基于非架构程序的进展做出关于在何处从/向数据RAM 122和/或权重RAM 124读/写数据的决定。
序列发生器128还包括与非架构循环指令(例如图26A的地址10处的循环到1指令和图28的地址11处的循环到1指令)结合使用的循环计数器3804。在图26A和28的示例中,以在地址0处的非架构初始化指令中指定的值(例如值400)加载循环计数器3804。每次序列发生器128遇到循环指令并跳转到目标指令(例如,图26A的地址1处的乘法-累加指令或图28的地址1处的maxwacc指令),序列发生器128就递减循环计数器3804。一旦循环计数器3804达到零,序列发生器128就进行到下一个顺序非架构指令。在替代实施例中,当首次遇到循环指令时,以在循环指令中指定的循环计数值加载循环计数器3804,从而消除对经由非架构初始化指令初始化循环计数器3804的需求。因此,循环计数器3804的值指示将执行非架构程序的循环体多少次。有利地,循环计数器3804的值可以由架构程序经由状态寄存器127的循环计数3914字段来获得,如下面关于图39所描述的。这使得架构程序能够基于非架构程序的进展做出关于在何处从/向数据RAM 122和/或权重RAM 124读/写数据的决定。在一个实施例中,序列发生器128包括三个附加的循环计数器以适应非架构程序中的嵌套循环,其它三个循环计数器的值也可经由状态寄存器127读取。循环指令中的位指示四个循环计数器中的哪一个用于当前循环指令。
序列发生器128还包括迭代计数器3806。迭代计数器3806结合非架构指令(例如图4、9、20和26A的地址2处的乘法-累加指令,及图28的地址2处的maxwacc指令(例如其将在下文中称为“执行”指令))一起使用。在上述示例中,每个执行指令分别指定511、511、1023、2和3的迭代计数。当序列发生器128遇到指定非零迭代计数的执行指令时,序列发生器128用指定的值加载迭代计数器3806。另外,序列发生器128生成适当的微操作3418以控制图34的NPU 126流水线级3401中的逻辑电路用于执行并递减迭代计数器3806。如果迭代计数器3806大于零,则序列发生器128再次生成适当的微操作3418以控制NPU 126中的逻辑电路并递减迭代计数器3806。序列发生器128以这种方式继续,直到迭代计数器3806达到零。因此,迭代计数器3806的值指示将执行在非架构执行指令中指定的操作(例如,乘法-累加、最大值、累加器与数据/权重字的和)多少次。有利地,迭代计数器3806的值可以由架构程序经由状态寄存器127的迭代计数3916字段来获得,如下面关于图39所描述的。这使得架构程序能够基于非架构性程序的进展做出关于在何处从/向数据RAM 122和/或权重RAM 124读/写数据的决定。
现在参考图39,示出了例示NNU 121的控制和状态寄存器127的某些字段的框图。这些字段包括由执行非架构程序的NPU 126最近写入的权重RAM行2602的地址、由执行非架构程序的NPU 126最近读取权重RAM行2604的地址、由执行非架构程序的NPU 126最近写入的数据RAM行2606的地址以及由执行非架构程序的NPU 126最近读取的数据RAM行2604的地址,这在以上相关于图26B进行了说明。另外,字段包括NNU程序计数器3912、循环计数3914和迭代计数3916。如上所述,状态寄存器127可由架构程序读取到媒体寄存器118和/或通用寄存器116中,例如,通过MFNN指令1500,包括NNU程序计数器3912、循环计数3914和迭代计数3916字段值。程序计数器3912的值反映图38的程序计数器3802的值。循环计数3914的值反映循环计数器3804的值。迭代计数3916的值反映迭代计数器3806的值。在一个实施例中,序列发生器128在每次修改程序计数器3802、循环计数器3804或迭代计数器3806时更新程序计数器3912、循环计数3914和迭代计数3916字段值,使得当架构程序读取它们时字段值是当前的。在另一实施例中,当NNU 121执行读取状态寄存器127的架构指令时,NNU 121简单地获得程序计数器3802、循环计数器3804和迭代计数器3806的值,并将它们提供回架构指令(例如,到媒体寄存器118或通用寄存器116中)。
从前面可以观察到,图39的状态寄存器127的字段的值可以被表征为指示非架构程序在其由NNU 121执行期间所做进展的信息。上面已经描述了非架构程序的进展的具体方面,诸如程序计数器3802值、循环计数器3804值、迭代计数器3806值、最近写入/读取2602/2604的权重RAM 124地址125以及最近写入/读取2606/2608的数据RAM 122地址123。在处理器100上执行的架构程序可以从状态寄存器127读取图39的非架构程序进度值,并且使用该信息例如通过诸如比较和分支指令的架构指令来做出决定。例如,架构程序决定哪些行向/从数据RAM 122和/或权重RAM 124写入/读取数据/权重,以控制进和出数据RAM122或权重RAM 124的数据流,特别是用于大数据集和/或用于不同非架构程序的重叠执行实例。上面和下面描述了由架构程序做出的决定的示例。
例如,如上文关于图26A所述的,架构程序配置非架构程序以将卷积的结果回写到卷积核2402上方的数据RAM 122的行(例如,在行8上方),并且当NNU 121通过使用最近写入的数据RAM 122行2606的地址来写入结果时,架构程序从数据RAM 122读取结果。
对于另一实例,如上文关于图26B所述的,架构程序使用来自图38的状态寄存器127字段的信息来确定非架构程序执行512×1600的5个块中的图24的数据阵列2404的卷积的进展。架构程序将2560×1600数据阵列2404的第一512×1600块写入权重RAM 124中,并开始具有循环计数为1600且初始化的权重RAM 124输出行为0的非架构程序。当NNU 121执行非架构程序时,架构程序读取状态寄存器127以确定最近写入的权重RAM行2602,使得其可以读取由非架构程序写入的有效卷积结果并且在架构程序已经读取它们之后写入有效卷积结果之上的下一个512x1600块,使得当NNU 121在第一512×1600块上完成非架构程序时,处理器100可以根据需要立即更新非架构程序并再次开始它来处理下一个512x1600块。
对于另一示例,假设架构程序使NNU 121执行一系列典型神经网络乘法-累加-激活函数运算,其中,权重被存储在权重RAM 124中并且结果被回写到数据RAM 122。在此情况下,一旦非架构程序读取了权重RAM 124的一行,它将不再读取它。因此,架构程序可以被配置为一旦当前权重已经被非架构程序读取/使用,就开始用用于非架构程序的下一个执行实例(例如,用于下一个神经网络层)的新权重来重写权重RAM 124中的权重。在此情况下,架构程序读取状态寄存器127以获得最近读取的权重RAM行2604的地址,以决定在何处它可以将新的权重集合写入到权重RAM 124中。
对于另一示例,假设架构程序知道非架构程序包括具有大迭代计数的执行指令,例如图20的地址2处的非架构乘法-累加指令。在此情况下,架构程序可能需要知道迭代计数3916,以便大致知道完成非架构指令将需要多少时钟周期,使得架构程序可以决定采取两个或多个动作中的哪一个。例如,如果时间较长,则架构程序可以放弃对另一架构程序(例如操作系统)的控制。类似地,假设架构程序知道非架构程序包括具有相对大的循环计数的循环体,例如图28的非架构程序。在此情况下,架构程序可能需要知道循环计数3914以便大致知道完成非架构程序将需要多少时钟周期,从而架构程序可以决定采取两个或多个动作中的哪一个。
对于另一示例,假设架构程序使NNU 121执行类似于关于图27和28描述的池化操作,其中,要池化的数据被存储在权重RAM 124中并且结果被回写到权重RAM 124中。然而,不同于图27和28的示例,假设将结果回写到权重RAM 124的前400行,例如行1600到1999。在此情况下,一旦非架构程序已经读取其池化的权重RAM 124的四行,它将不再读取它。因此,架构程序可以被配置为一旦当前的四行已经被非架构程序读取/使用,就开始用新数据(例如,用于非架构程序的下一执行实例的权重,例如用以对池化数据执行典型的乘法-累加-激活函数运算)来重写权重RAM 124中的数据。在此情况下,架构程序读取状态寄存器127以获得最近读取的权重RAM行2604的地址,以决定在何处它可以将新的权重集合写入到权重RAM 124中。
作为NNU存储器和高速缓存存储器的存储器阵列的双重使用
现在参考图40,示出了例示处理器4000的框图。处理器4000包括以双向方式彼此连接的多个环停止4004,以形成环总线4024。图40的实施例包括表示为4004-0、4004-1、4004-2、4004-3、4004-M和4004-U的六个环停止。处理器4000包括四个核心复合体4012,分别称为核心复合体0 4012-0、核心复合体1 4012-1、核心复合体24 012-2和核心复合体34012-3,它们分别包括四个环停止4004-0、4004-1、4004-2和4004-3,其将核心复合体4012耦合到环总线4024。处理器4000还包括非核心部分4016,其包括环停止4004-U,环停止4004-U将非核心4016耦合到环总线4024。最后,处理器4000包括通过环停止4004-M耦合到环总线4024的动态随机存取存储器(DRAM)控制器4018和NNU 121。NNU 121包括存储器阵列4152(参见图41),其可以用作由NNU 121的NPU 126阵列使用的存储器(例如,图1的权重RAM124)或用作由核心复合体4012共享的高速缓存存储器,例如,作为牺牲高速缓存或作为最后一级高速缓存(LLC)的片,如下面更详细描述的。尽管图40的示例包括四个核心复合体4012,但也可以设想具有不同数量的核心复合体4012的其他实施例。
非核心4016包括总线控制器4014,总线控制器4014控制处理器4000对外围设备可以耦合的系统总线4022的访问,例如视频控制器、磁盘控制器、外围总线控制器(例如PCI-E)等。在一个实施例中,系统总线4022是公知的V4总线。非核心4016还可以包括诸如电源管理单元和专用RAM(例如,核4002的微代码使用的非架构存储器)的其他功能单元。
DRAM控制器控制作为系统存储器的DRAM(例如,异步DRAM或同步DRAM(SDRAM),例如双数据速率同步DRAM,直接Rambus DRAM或降低等待时间DRAM)。核心复合体4012、非核心4016和NNU 121经由环总线4024访问系统存储器。更具体地,经由环总线4024,NNU 121将神经网络权重和数据从系统存储器读入存储器阵列4152中,并将神经网络结果从存储器阵列4152写入系统存储器。另外,当作为牺牲高速缓存(参见图41的4006-4)操作时,在高速缓存控制逻辑电路4108(参见图41)的控制下的存储器阵列4152将缓存行逐出到系统存储器。此外,当作为LLC片(参见图41的4006-4)操作时,存储器阵列4152和高速缓存控制逻辑电路4108从系统存储器填充高速缓存行,并将高速缓存行回写并逐出到系统存储器。
四个核心复合体4012包括各自的LLC片4012-0、4012-1、4012-2和4012-3,每个LLC片4012-0、4012-1、4012-2和4012-3分别耦合到环停止4004,它们被分别通称为LLC片4006并且一起统称多个LLC片4006。每个核心4002包括高速缓存存储器,例如耦合到环停止4004的二级(L2)高速缓存4008。每个核心4002还可以包括一级高速缓存(未示出)。在一个实施例中,核心4002是x86指令集架构(ISA)核心,尽管设想了核心4002是另一ISA(例如ARM、SPARC、MIPS)的其他实施例。
LLC片4006-0、4006-1、4006-2和4006-3共同形成由核心复合体4012共享的处理器4000的LLC 4005,如图40所示。每个LLC片4006包括存储器阵列和高速缓存控制逻辑电路,类似于图41的存储器阵列4152和高速缓存控制逻辑电路4108。可以设置模式指示符(例如,图41的模式输入4199),使得NNU 121的存储器阵列4152作为LLC 4005的附加(例如,第五或第九)片4006-4操作,如下面更详细描述的。选择性地构成附加LLC片4006-4的存储器阵列4152(和图41的高速缓存控制逻辑电路4108)也被称为NNU LLC片4006-4。在一个实施例中,存储器阵列4152和每个LLC片4006包括2MB存储器阵列,尽管其他实施例被设想为具有不同的大小。此外,可以设想存储器阵列4152和LLC片4006的大小不同的实施例。优选地,LLC4005包括L2高速缓存4008和高速缓存层级中的任何其他高速缓存(例如,L1高速缓存)。
环总线4024或环4024是有助于在包括DRAM控制器4018、非核心4016和LLC片4006的相关组件之间的通信的可缩放的双向互连。环4024包括两个单向环,每个进一步包括五个子环:请求,用于传输包括负载的大多数类型的请求分组(request packets);监听,用于传输监听请求数据分组;确认,用于传输响应分组;数据,用于传输数据分组和包括写入的某些请求项;及信用,用于在远程队列中发放和获得信用。附接到环4024的每个节点经由环停止4004连接,该环停止4004包含用于在环4024上发送和接收分组的队列。队列是代表将在远程队列中被接收的附接组件在环4024上发起请求的出口队列,或者从环4024接收要转发到附接组件的请求的入口队列。在出口队列在环上发起请求之前,它首先从远程目的地入口队列获得信用环上的信用。这确保了远程入口队列具有可用于在请求到达时处理该请求的资源。当出口队列希望在环4024上发送事务分组时,只有当它不会抢占最终发往远程节点的输入分组时,才能这样做。当输入分组从任一方向到达环停止4004时,询问分组的目的地ID以确定该环停止4004是否是分组的最终目的地。如果目的地ID不等于环停止4004的节点ID,则该分组在随后的时钟中继续到下一个环停止4004。否则,分组在相同的时钟中离开环4024,以被分组的事务类型所涉及的任何入口队列所消耗。
通常,LLC 4005包括N个LLC片4006,其中,N个片4006中的每一个负责缓存由散列算法或哈希算法(或简称哈希)确定的处理器的4000个物理地址空间的不同的约1/N个。哈希是将物理地址作为输入,并选择负责缓存物理地址的适当LLC片的函数。当必须从核心4002或监听代理向LLC 4005发出请求时,必须将请求发送到适当的LLC片4006,该LLC片4006负责缓存请求的物理地址。通过将哈希应用于请求的物理地址来确定适当的LLC片4006。
哈希算法是一种满射函数,其域是物理地址集合或其子集,其范围是当前包括的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]}的三个位。
在任何LLC 4005缓存完成之前,LLC 4005的所有请求者必须具有相同的哈希算法。因为哈希规定缓存地址的位置以及在操作期间发送监听的位置,所以仅通过所有核心4002、LLC片4006和监听代理之间的协调改变哈希。如下面相关于图42和43更详细地描述的,更新哈希算法基本上包括:(1)使所有核心4002同步以防止新的可缓存访问;(2)执行LLC 4005中当前包括的所有LLC片4006的回写无效,这使得将修改的高速缓存行回写到系统存储器,并且所有高速缓存行将被无效(回写无效可以是下面描述的选择性回写无效,其中,只有新哈希算法将其地址哈希到与旧哈希算法不同的片的那些高速缓存行被逐出,即无效,如果被修改,则在被无效之前被回写);(3)向每个核心4002和监听源广播哈希更新消息,其命令它们改变为新的哈希(从包含哈希(inclusive hash)到独占哈希(exclusivehash),反之亦然,如下所述);(4)将模式输入4199更新为控制对存储器阵列4152的访问的选择逻辑电路4158(参见图41);及(5)用新的哈希算法恢复执行。
当LLC片4006的数量N为8(其为2的幂)时,上述哈希算法是有用的,并且这些算法可以被修改为易于适应2的其他幂,例如4片的PA[9:8]为或16片的PA[11:8]。然而,取决于NNU LLC片4006-4是否包括在LLC 4005中(以及核心复合体4012的数量),N可以是或不是2的幂。因此,使用至少两个不同的哈希,如下面相关于图42和43描述的,这取决于LLC片4006的数量。即,当NUN LLC片4006-4包括在LLC 4005中时,使用被称为包含哈希的第一哈希,当将NNU LLC片4006-4从LLC 4005中排除时,使用称为独占哈希的第二哈希。
一个哈希算法输出PA[45:6]mod N(除以N的余数)。这个哈希的优点是,即使当N的值不是2的幂时,也能够以基本均衡的方式在N个LLC片4006上分配物理地址(假设物理地址相对均匀分布)。当N是2的幂时,可以通过简单地输出PA[45:6]的较低N-1位来执行mod运算。然而,当N不是2的幂时,mod运算可能不利地需要整数除法。
定义了近似于PA mod N哈希的另一哈希,但是用于物理地址的较小子集,其在N不是2的幂时,在硬件中可以更有效地实施,在这种情况下,当N=9时为:
使用calc_hash(),PA[11:8]用于哈希,但是如果PA[11:8]>8,则使用PA[10:8],保证其在范围[0,7]中。如可以观察到的,与PA[45:6]mod N相比,calc_hash()可以以相对不太均衡的方式在LLC片4006中分配物理地址(再次假设物理地址的相对均匀的分布),即片0到6具有约八分之一的概率,而片7和8具有约十六分之一概率。然而应当注意的是,即使PA[45:6]mod N哈希算法也不会生成完全均衡的分布,因为PA[45:6]表示具有是2的幂的多个元素的域,但N不是2的幂。
通常,当N不是2的幂时,哈希算法首先将物理地址哈希到2^P个可能结果的范围,其中P=ceiling(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),其映射到九个不同的片。在一个实施例中,两个哈希算法可以有利地被设计为支持作为优化的选择性的回写无效,即仅逐出(即,回写无效)包含哈希算法和独占哈希算法将哈希到不同的片的高速缓存行。在一些实施例中,在从包含哈希到独占哈希的转换中,仅需要使NNU LLC片4006-4被回写无效(即,非NNU LLC片4006无需被回写无效);在从独占哈希到包含哈希的转换中,只有包含哈希算法和独占哈希算法会将其地址哈希到不同的片的非NNU LLC片4006的高速缓存行需要被逐出,如以下相关于图42和43更详细地描述的。独占哈希是PA[10:8]或类似的以及包含哈希是calc_hash_2或类似的实施例是这样的实施例。
现在参考图41,示出了更详细地例示图40的NNU 121和图40的环停止4004-M的框图。图41的NNU 121在许多方面与上述NNU 121的实施例类似,但还包括高速缓存控制逻辑电路4108、选择逻辑电路4158和存储器阵列4152,它们可以由NNU 121的权重RAM 124或数据RAM 122包括。尽管在图41中未示出,但是NNU 121还包括图1的程序存储器129、序列发生器128、数据RAM 122和权重RAM 124。NNU 121还包括图1的NPU阵列126和控制/状态寄存器127,如图41所示。如上所述,例如,关于图34,阵列中的每个NPU 126包括处理指令和数据的级的流水线,如上面详细描述的。NPU流水线126的第一级向选择逻辑电路4158提供要写入存储器阵列4152的数据,第二级从存储器阵列4152接收数据。在一个实施例中,流水线126包括十级,第六级从存储器阵列4152接收数据,第九级将数据提供给选择逻辑电路4158以写入存储器阵列4152。
存储器阵列4152耦合到NPU阵列流水线126。选择逻辑电路4158向存储器阵列4152提供输入。选择逻辑电路4158由指定模式的模式输入4199控制。优选地,模式4199输入是控制/状态寄存器127中被写入以将模式4199从高速缓存存储器模式改变为NNU模式的位的输出。该模式指示存储器阵列4152以NNU模式或高速缓存存储器模式操作。当以NNU模式操作时,存储器阵列4152作为NNU 121的权重RAM 124操作。(尽管参考始终是针对存储器阵列4152用作权重RAM 124的,但可替换地存储器阵列4152可以作为数据RAM 122操作)。然而,当以高速缓存存储器模式操作时,存储器阵列4152作为高速缓存存储器操作。描述了高速缓存存储器模式的两个实施例:第一个,存储器阵列4152作为由核心复合体4012共享的LLC4005的片4006操作,第二个,存储器阵列4152作为由核心复合体4012共享的牺牲高速缓存操作。当模式控制4199指示NNU模式时,选择逻辑电路4158选择由NPU阵列流水线126提供的数据,并且存储器阵列4152将数据写入NPU阵列流水线126,使得存储器阵列4152用作NNU121的权重RAM 124。
相反,当模式控制4199指示高速缓存存储器模式时,选择逻辑电路4158选择由高速缓存控制逻辑电路4108的数据流水线4146提供的数据,并且存储器阵列4152将数据写入高速缓存控制逻辑电路4108的数据流水线4146。以这种方式,存储器阵列4152用作由核心4002共享的高速缓存存储器,例如作为牺牲高速缓存或LLC片4006-4。优选地,两个RAM122/124中较大者的存储器阵列用于高速缓存存储器模式中。此外,可以设想将权重RAM124和数据RAM 122两者的存储器阵列都用作由核心4002共享的高速缓存存储器的实施例。
优选地,从数据流水线4146向存储器阵列4152提供数据的数据总线是64字节宽(例如,高速缓存行的大小),并且从存储器阵列4152向NPU阵列流水线126提供数据的数据总线是等于阵列的NPU 126的字数,例如1024个字。相反,从NPU阵列流水线126向存储器阵列4152提供数据的数据总线是等于阵列的NPU 126的字数。优选地,选择逻辑电路4158和存储器阵列4152之间的总线包括地址总线、写数据总线、RD/WR控制和高速缓存行使能(CLE),其指示访问16个高速缓存行中的哪个高速缓存行(例如,假设1024字节宽的存储器阵列和64字节高速缓存行)。在从NPU阵列流水线126写入存储器阵列4152的情况下,通常所有的CLE都将为真,因为通常所有的NPU126都写入权重RAM 124的一行。当数据被写入存储器阵列4152以选择存储器阵列4152的正确的存储体或多个存储体以使能读或写时,选择逻辑电路(未示出)使用CLE。
在图41的实施例中,当以NNU模式操作时,优选地,在核心4002上执行的架构程序通过环总线4024访问作为外围设备的NNU 121,而不是作为核心的执行单元的NNU 121(例如上面关于图1至图35描述的实施例)。优选地,图35的接口逻辑电路3514(图41中未示出)和控制/状态寄存器127耦合到环停止4004-M,这使得核心4002能够通过使用架构加载/存储指令(而不是图14和15的MTNN 1400和MFNN 1500指令),经由接口逻辑电路3514读取和写入控制/状态寄存器127,并且读取和写入数据RAM 122、权重RAM 124和程序存储器129。此外,数据/权重字可以经由直接存储器访问(DMA)的传送在系统存储器和数据RAM 122/权重RAM 124之间传送。最后,可以设想NNU 121本身执行加载/存储指令以在系统存储器和数据RAM 122/权重RAM 124之间传送数据/权重的实施例。优选地,操作系统将NNU 121管理为由在不同核心4002上运行的系统的各种进程共享的全局资源,操作系统需要在使用NNU 121之前获得NNU 121的所有权的过程。优选地,操作系统控制NNU 121操作的模式4199,具体而言是存储器阵列4152的运行方式,如下面相关于图42至45所详细描述的。在一个实施例中,存储器阵列4152是2MB静态RAM阵列,尽管设想了尺寸更大或更小的其它实施例。
高速缓存控制逻辑电路4108耦合到环停止4004-M并耦合到选择逻辑电路4158和存储器阵列4152。高速缓存控制逻辑电路4108包括耦合到环停止4004-M的标签流水线4144、耦合到环停止4004-M的数据流水线4146、以及耦合到标签流水线4144的标签/MESI/LRU阵列4142。高速缓存控制逻辑电路4108还包括外部接口4147,其包括填充队列4122、监听队列4124和仲裁器4136,仲裁器4136针对访问标签流水线4144和数据流水线4146在填充队列4122和监听队列4124之间进行仲裁。高速缓存控制逻辑电路4108还包括核心接口4148,其包括负载队列4112、逐出队列4114、查询队列4116和仲裁器4138,仲裁器4132针对访问标签流水线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处理来自核心4002L2高速缓存4008(以及来自其他高速缓存,例如,L1数据和L1指令,在L2高速缓存4008不包括它们的实施例中)的负载。负载队列4112请求对标签流水线4144的访问以确定存储器阵列4152中是否存在指定的高速缓存行,并且请求对数据流水线4146的访问以从存储器阵列4152读出指定的数据以经由环总线4024写入请求的核心4002。逐出队列4114处理从核心的L2高速缓存4008的逐出。当作为牺牲高速缓存5806-4操作时,逐出队列4114请求对标签流水线4144的访问以将从低级高速缓存存储器逐出的高速缓存行的地址写入标签阵列4142,并且设置MESI阵列4142中的初始MESI状态。当作为LLC 5805的片操作时,逐出队列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时的高速缓存存储器模式转换到当用作NNU 121的权重/数据RAM 124/122时的NNU模式时,图40的处理器4000的操作的流程图。如上所述,NNU 121具有大量的存储器,例如,在一个实施例中,权重RAM 124是2MB。图42和图43说明了使得存储器阵列4152能够作为额外的LLC片4006操作的实施例,从而有利地使得当系统上运行的任何进程不使用NNU 121作为神经网络单元时,LLC 4005的大小能够显着增加(例如,增加25%)。更具体地,图42说明了一种用于将存储器阵列4152从作为LLC片4006操作转换为作为NNU 121的权重RAM 124操作的方法。有利地,在将模式4199设置为高速缓存存储器模式时,图41的高速缓存控制逻辑电路4108和存储器阵列4152及选择逻辑电路4158共同作为图42和图43的实施例中的LLC片4006操作。流程在框4202处开始。
在框4202处,做出从将存储器阵列4152用作LLC 4005的片4006转换为将存储器阵列4152用作NNU 121的权重RAM 124的请求。优选地,转换由在处理器4000上运行的操作系统控制。例如,在处理器4000上运行的应用程序请求操作系统使用NNU 121,并且操作系统检测到存储器阵列4152当前被用作LLC片4006,因此需要从高速缓存存储器模式转换到NNU模式。流程进行到框4204。
在框4204处,响应于框4202处的转换请求,操作系统使得所有核心4002自身同步。即,操作系统使得核心4002停止提取架构指令并停止访问存储器。更具体地说,这暂停了对目前包括存储器阵列4152的LLC 4005的访问。在一个实施例中,操作系统执行在每个核心4002上指示核心4002同步的架构指令(例如,x86WRMSR)。在替代实施例中,操作系统在核心4002中的一个上执行指令,并且作为响应,例如通过微代码该一个核心4002发信号通知每个其他核4002进行同步。流程进行到框4206。
在框4206处,在LLC 4005上执行回写无效。在一个实施例中,核心4002微代码优选地响应于操作系统的架构指令的执行而请求回写无效。回写无效回写修改后的高速缓存行(如果有的话),并使所有LLC片段4006的所有高速缓存行(包括NNU LLC片4006-4)无效。在替代实施例中,回写无效是选择性的。通常,选择性回写无效意味着根据以下伪代码进行操作:
当然,当片是NNU片时(例如,在八个非NNU片4006加上一个NNU LLC片4006-4的情况下,片=8),如果被修改且无效了,因为独占哈希永远不会返回NNU LLC片4006-4的索引,exclusive_hash(cacheline_address)将不等于片,所以NNU LLC片4006-4中的所有高速缓存行都将被逐出,即回写。需要从非NNU LLC片4006逐出的高速缓存行的数量取决于所使用的包含哈希和独占哈希而变化。例如,假设独占哈希和包含哈希都是PA[45:6]%N,但是N对于每个是不同的,即,独占哈希的N比包含哈希少一个,假设对于包含哈希N是9,对于独占哈希N是8。在这种情况下,非NNU LLC片4006中的高速缓存行的绝大部分需要逐出,例如大约88%。在这种情况下,简单地回写无效所有LLC片4006的所有高速缓存行可能同样或者更有效。相反,对于另一示例,假设独占哈希是PA[10:8],包含哈希是上述的calc_hash_2。在这种情况下,非NNU LLC片4006中的高速缓存行中的任何一行都不需要在从包含哈希转换到独占哈希(这是图42中执行的转换)上的逐出。流程进行到框4208。
在框4208处,更新用于将高速缓存行的物理地址哈希到LLC片4006的哈希算法,以排除存储器阵列4152作为LLC 4005的片4006,如上所述。优选地,将哈希更新消息广播到每个核心4002和监听源,以将其哈希算法改变为独占哈希,即排除NNU LLC片4006-4的哈希。流程进行到框4212。
在框4212处,更新模式4199以指示NNU模式,以使得选择逻辑电路4158使得存储器阵列4152可用作权重RAM 124,以便由NPU 126流水线124和在核心4002上执行的架构程序访问。在一个实施例中,操作系统(例如,设备驱动器)在核心4002中的一个上执行架构指令,其写入NNU 121控制/状态寄存器127,以更新控制模式4199的位以将模式4199从高速缓存模式改变为NNU模式。架构指令可以是写入I/O空间或存储器存储指令,其执行到控制/状态寄存器127的存储器映射I/O写入。流程进行到框4214。
在框4214处,核心4002恢复操作,即它们不再同步,而是代之以开始提取和执行架构指令,这可以包括访问存储器。在一个实施例中,操作系统在每个核心4002上执行指示核心4002恢复操作的架构指令。在替代实施例中,操作系统在核心4002中的一个上执行指令,并且作为响应,例如通过微代码,该一个核心4002发信号通知每个其他核心4002恢复操作。流程在框4214处结束。
现在参考图43,示出了例示在将图41的存储器阵列4152从当用作NNU 121的权重/数据RAM 124/122时的NNU模式转换到当用作LLC片4006时的高速缓存存储器模式时,图40的处理器4000的操作的流程图。流程在框4302处开始。
在框4302处,做出从将存储器阵列4152用作NNU 121的权重RAM 124转换为将存储器阵列4152用作LLC 4005的片4006的请求。优选地,转换由在处理器4000上运行的操作系统控制。例如,在处理器4000上运行的应用程序通知操作系统它不再使用NNU 121,并且没有其他应用程序正在请求使用NNU 121,操作系统检测到存储器阵列4152当前正被用作权重RAM 124,从而需要从NNU模式转换到高速缓存存储器模式。流程进行到框4304。
在框4304处,响应于框4302处的转换请求,操作系统使得所有核心4002自身同步,如关于框4204描述的方式。更具体地,这暂停了对目前排除了存储器阵列4152的LLC 4005的访问。流程进行到框4306。
在框4306处,在LLC 4005上执行回写无效。回写无效回写修改的高速缓存行(如果有的话)并使所有LLC片段4006的所有高速缓存行无效(排除了NNU LLC片4006-4,因为它目前不包括在LLC 4005中)。在替代实施例中,回写无效是选择性的。通常,选择性回写无效意味着根据以下伪代码进行操作:
for each cacheline in slice:
if inclusive_hash(cacheline address)!=slice:
evict cacheline
在图43的从独占哈希到包含哈希的转换中,片始终不是NNU片,因此将不逐出NNULLC片4006-4中的高速缓存行。取决于所使用的包含哈希和独占哈希,需要从非NNU LLC片4006逐出的高速缓存行的数量是变化的。例如,假设独占哈希和包含哈希都是PA[45:6]%N,但是N对于每个是不同的,即,独占哈希的N比包含哈希的少一个,假设对于包含哈希N是9,对于独占哈希是8。在这种情况下,非NNU LLC片4006中的高速缓存行的大部分需要逐出,例如大约88%。在这种情况下,简单地回写无效所有LLC片4006的所有高速缓存行可能同样或者更有效。相反,假设独占哈希是PA[10:8],包含哈希是上面所述的calc_hash_2。在这种情况下,非NNU LLC片4006中较小部分的高速缓存行需要逐出,例如大约12%。流程进行到框4308。
在框4308处,更新用于将高速缓存行的物理地址哈希到LLC片4006的哈希算法,以包括存储器阵列4152作为LLC 4005的片4006,如上所述。即,将哈希更新消息广播到每个核心4002和监听源,以将其哈希算法改变为包含哈希,即包括NNU LLC片4006-4的哈希。流程进行到框4311。
在框4311处,如上所述,高速缓存控制逻辑电路4108通过将MESI阵列4142中的状态更新为对于所有高速缓存行为无效来对存储器阵列4152执行无效操作。优选地,高速缓存控制逻辑电路4108还重置LRU阵列4142中的替换信息。在一个实施例中,核心4002微代码请求NNU LLC片4006-4执行高速缓存控制逻辑电路4108响应地执行的无效请求。流程进行到框4312。
在框4312处,更新模式4199以指示高速缓存存储器模式,以使得选择逻辑电路4158使存储器阵列4152可用作LLC片4006。流程进行到框4314。
在框4314处,核心4002恢复操作,即,它们不再同步,而是代之以开始提取和执行架构指令,这可以包括访问存储器,如关于框4214所述的方式。流程在框4314处结束。
现在参考图44,示出了例示在将图41的存储器阵列4152从当用作NNU121的权重/数据RAM 124/122时的NNU模式转换到当用作牺牲高速缓存4006-4时的高速缓存存储器模式时,图40的处理器4000的操作的流程图。牺牲高速缓存是高速缓存存储器,其仅缓存由处理器4000的高速缓存层级中较低的高速缓存存储器逐出的高速缓存行。例如,L2高速缓存4008和/或L1数据/指令高速缓存是较低级别的高速缓存。此外,在存储器阵列4152可以作为牺牲高速缓存4006-4操作的实施例中,LLC 4005被认为是3级(L3)高速缓存,并且被认为是相对于牺牲高速缓存4006-4的较低级别高速缓存,L3高速缓存4005将高速缓存行逐出到牺牲缓存4006-4。当地址在牺牲高速缓存中命中时,牺牲高速缓存提供数据,例如响应于加载请求或监听请求。在一个实施例中,L3高速缓存4005包括L2高速缓存4008和核心复合体4012的较低级别高速缓存,牺牲高速缓存提供命中数据以分配到L3高速缓存4005,L3高速缓存4005又将数据提供给L2缓存4008,L2缓存4008又将数据提供给较低级别的高速缓存。在另一个实施例中,L3高速缓存4005、L2高速缓存4008和核心复合体4012的较低级别高速缓存不是包含的,牺牲高速缓存提供命中数据以直接分配高速缓存的每一级。有利地,当模式4199设置为NNU模式时,图41的高速缓存控制逻辑电路4108和存储器阵列4152及选择逻辑电路4158共同地作为图44和45的实施例中的牺牲高速缓存4006-4进行操作。在一个实施例中,牺牲高速缓存4006-4可以作为回写高速缓存来操作,其缓存被逐出到它的修改的高速缓存行,并且还可以作为直写高速缓存来操作,其不缓存被逐出到它的修改的高速缓存行,而是将修改高速缓存行转发到系统存储器。直写牺牲高速缓存4006-4的优点在于,更快地转换到在NNU模式中使用存储器阵列4152作为权重RAM 124,如从图45的说明(更具体地说,框4506、4508和4512)可以观察到的,而回写牺牲高速缓存4006-4可以具有处理器4000的更高的总高速缓存效率的优点。优选地,牺牲高速缓存4006-4可配置为回写或直写模式。流程在框4402处开始。
在框4402处,做出从将存储器阵列4152用作NNU 121的权重RAM 124转换为将存储器阵列4152用作由核心复合体4012共享的牺牲高速缓存4006-4的请求。优选地,转换由在处理器4000上运行的操作系统控制,类似于上面关于方框4302描述的方式。流程进行到框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的实施例中,监听队列4124和负载队列4112接收请求。更具体地,监听牺牲高速缓存4006-4以回写无效另一高速缓存代理正在读取的高速缓存行。此外,牺牲高速缓存4006-4从低级别高速缓存接收对低级别高速缓存中丢失的负载的加载请求。如果请求在牺牲高速缓存4006-4中命中,则牺牲高速缓存4006-4将命中数据提供给请求者。流程在框4412处结束。
现在参考图45,示出了例示在将图41的存储器阵列4152从当用作牺牲高速缓存4006-4时的高速缓存存储器模式转换到当用作NNU 121的权重/数据RAM 124/122时的NNU模式时图40的处理器4000的操作的流程图。如上所述,牺牲高速缓存4006-4可以作为直写型高速缓存或回写型高速缓存操作。流程在框4502处开始。
在框4502处,作出从将存储器阵列4152用作牺牲高速缓存4006-4转换为将存储器阵列4152用作NNU 121的权重RAM 124的请求。优选地,转换由在处理器4000上运行的操作系统控制。例如,在处理器4000上运行的应用程序向操作系统请求使用NNU 121,操作系统检测到存储器阵列4152当前正被用作牺牲高速缓存4006-4,因此需要从高速缓存存储器模式转换到NNU模式。流程进行到框4504。
在框4504处,告知总线控制器4014停止将监听引导到牺牲高速缓存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作为直写型高速缓存操作,则转换到将存储器阵列4152用作权重RAM 124可以有利地比当牺牲高速缓存4006-4作为回写型高速缓存操作时更快,因为不需要执行在框4508处的回写修改的高速缓存行(即,在此仅需执行在框4512处的无效),这在牺牲高速缓存4006-4相对较大时可以是相当大的节省。流程进行到框4514。
在框4514处,告知低级别高速缓存停止将加载请求引导到牺牲高速缓存4006-4,并且告知总线控制器4014停止将监听引导到牺牲高速缓存4006-4。流程进行到框4516。
在框4516处,更新模式4199以指示NNU模式,以使得选择逻辑电路4158使存储器阵列4152可用作由NPU 126流水线124和在核心4002上执行的架构程序访问的权重RAM 124,类似于关于框4212所述的方式。流程进行到框4518。
在框4518处,高速缓存控制逻辑电路4108停止缓存牺牲数据(它在框4408处开始缓存)。此外,高速缓存控制逻辑电路4108向总线控制器4014转发其接收的任何后续负载、逐出或监听请求。最后,在核心4002上执行的架构程序可以使用作为由NPU 126流水线124访问的权重RAM 124。流程在框4518处结束。
虽然本文已经说明了本发明的各种实施例,但是应当理解,它们是作为示例而非限制而提出的。对于相关计算机领域的技术人员显而易见的是,在不脱离本发明的范围的情况下,可以在形式和细节上进行各种改变。例如,软件可以实现例如本文所述的装置和方法的功能、制造、建模、模拟、描述和/或测试。这可以通过使用通用编程语言(例如,C、C++),包括Verilog HDL、VHDL等的硬件描述语言(HDL)或其他可用程序来实现。这种软件可以设置在诸如磁带、半导体、磁盘或光盘(例如,CD-ROM、DVD-ROM等)、网络、有线线路或其它通信介质的任何已知的计算机可用介质中。本文所述的装置和方法的实施例可以包括在半导体知识产权核心中,诸如处理器核心(例如,在HDL中体现或指定),并且在集成电路的生产中被转换为硬件。另外,本文所说明的装置和方法可以体现为硬件和软件的组合。因此,本发明不应受到本文所说明的任何示例性实施例的限制,而应仅根据所附权利要求及其等同物来限定。具体地,本发明可以在可以在通用计算机中使用的处理器设备内实施。最后,本领域技术人员应当理解,他们可以容易地使用所公开的概念和具体实施例作为设计或修改用于实现本发明的相同目的的其它结构的基础,而不脱离由所附权利要求限定的本发明的范围。
Claims (20)
1.一种处理器,包括:
模式指示器;
多个处理核心;及
神经网络单元(NNU),所述神经网络单元包括:
存储器阵列;
神经处理单元(NPU)的阵列;
高速缓存控制逻辑电路;及
选择逻辑电路,所述选择逻辑电路被配置为选择性地将多个NPU和所述高速缓存控制逻辑电路耦合到所述存储器阵列;
其中当所述模式指示器指示第一模式时,所述选择逻辑电路使得所述多个NPU能够从所述存储器阵列读取神经网络权重,以使用所述权重来执行计算;及
其中当所述模式指示器指示第二模式时,所述选择逻辑电路使得所述多个处理核心能够通过所述高速缓存控制逻辑电路访问作为高速缓存存储器的所述存储器阵列。
2.根据权利要求1所述的处理器,还包括:
其中当所述模式指示器指示所述第二模式时,所述多个处理核心通过所述高速缓存控制逻辑电路访问作为牺牲高速缓存存储器的所述存储器阵列。
3.根据权利要求1所述的处理器,还包括:
其中当所述模式指示器指示所述第二模式时,所述多个处理核心通过所述高速缓存控制逻辑电路访问作为所述处理器的最后级高速缓存存储器的片的所述存储器阵列。
4.根据权利要求3所述的处理器,还包括:
多个最后级高速缓存片;及
其中当所述模式指示器指示所述第二模式时,所述存储器阵列和高速缓存控制逻辑电路与所述多个最后级高速缓存片一起操作,作为所述多个处理核心访问的最后级高速缓存存储器。
5.根据权利要求1所述的处理器,还包括:
其中所述NNU耦合到所述多个处理核心;及
其中当所述模式指示器指示所述第一模式时,所述NNU由所述多个处理核心控制以加速所述多个处理核心的神经网络计算。
6.根据权利要求5所述的处理器,还包括:
环总线,所述环总线耦合所述NNU和所述多个处理核心。
7.根据权利要求6所述的处理器,还包括:
多个最后级高速缓存片,所述多个最后级高速缓存片耦合到所述环总线;及
其中当所述模式指示器指示所述第二模式时,所述存储器阵列和高速缓存控制逻辑电路与所述多个最后级高速缓存片一起操作,作为所述多个处理核心经由所述环总线访问的最后级高速缓存存储器。
8.根据权利要求1所述的处理器,还包括:
其中为了从所述第二模式转换到所述第一模式,所述高速缓存控制逻辑电路对所述存储器阵列进行回写无效。
9.根据权利要求1所述的处理器,还包括:
其中所述多个处理核心是x86指令集架构处理核心。
10.一种用于操作处理器的方法,所述处理器具有模式指示器、多个处理核心及神经网络单元(NNU),所述神经网络单元包括存储器阵列、神经处理单元(NPU)的阵列、高速缓存控制逻辑电路及选择逻辑电路,所述选择逻辑电路被配置为选择性地将多个NPU和所述高速缓存控制逻辑电路耦合到所述存储器阵列,所述方法包括:
响应于将所述模式指示器设置为指示第一模式,所述选择逻辑电路使得所述多个NPU能够从所述存储器阵列读取神经网络权重,以使用所述权重来执行计算;及
响应于将所述模式指示器设置为指示第二模式,所述选择逻辑电路使得所述多个处理核心能够通过所述高速缓存控制逻辑电路访问作为高速缓存存储器的所述存储器阵列。
11.根据权利要求10所述的方法,还包括:
当所述模式指示器指示所述第二模式时,所述多个处理核心通过所述高速缓存控制逻辑电路访问作为牺牲高速缓存存储器的所述存储器阵列。
12.根据权利要求10所述的方法,还包括:
当所述模式指示器指示所述第二模式时,所述多个处理核心通过所述高速缓存控制逻辑电路访问作为所述处理器的最后级高速缓存存储器的片的所述存储器阵列。
13.根据权利要求12所述的方法,还包括:
其中所述处理器还包括多个最后级高速缓存片;及
当所述模式指示器指示所述第二模式时,所述存储器阵列和高速缓存控制逻辑电路与所述多个最后级高速缓存片一起操作,作为所述多个处理核心访问的最后级高速缓存存储器。
14.根据权利要求10所述的方法,还包括:
其中所述NNU耦合到所述多个处理核心;及
当所述模式指示器指示所述第一模式时,所述NNU由所述多个处理核心控制以加速所述多个处理核心的神经网络计算。
15.根据权利要求14所述的方法,还包括:
其中所述处理器还包括环总线,所述环总线耦合所述NNU和所述多个处理核心。
16.根据权利要求15所述的方法,还包括:
其中所述处理器还包括多个最后级高速缓存片,所述多个最后级高速缓存片耦合到所述环总线;及
当所述模式指示器指示所述第二模式时,所述存储器阵列和高速缓存控制逻辑电路与所述多个最后级高速缓存片一起操作,作为所述多个处理核心经由所述环总线访问的最后级高速缓存存储器。
17.根据权利要求10所述的方法,还包括:
所述高速缓存控制逻辑电路对所述存储器阵列进行回写无效,以从所述第二模式转换到所述第一模式。
18.根据权利要求10所述的方法,还包括:
其中所述多个处理核心是x86指令集架构处理核心。
19.一种计算机程序产品,其编码在至少一个非暂时性计算机可用介质中,用于与计算设备一起使用,所述计算机程序产品包括:
体现在所述介质中的用于指定处理器的计算机可用程序代码,所述计算机可用程序代码包括:
第一程序代码,用于指定模式指示器;
第二程序代码,用于指定多个处理核心;及
第三程序代码,用于指定神经网络单元(NNU),所述神经网络单元包括:
存储器阵列;
神经处理单元(NPU)的阵列;
高速缓存控制逻辑电路;及
选择逻辑电路,所述选择逻辑电路被配置为选择性地将多个NPU和所述高速缓存控制逻辑电路耦合到所述存储器阵列;
其中当所述模式指示器指示第一模式时,所述选择逻辑电路使得所述多个NPU能够从所述存储器阵列读取神经网络权重,以使用所述权重来执行计算;及
其中当所述模式指示器指示第二模式时,所述选择逻辑电路使得所述多个处理核心能够通过所述高速缓存控制逻辑电路访问作为高速缓存存储器的所述存储器阵列。
20.根据权利要求19所述的计算机程序产品,其中所述至少一个非暂时性计算机可用介质选自于磁盘、磁带或其它磁性、光学或电子储存介质的组中。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US15/366,027 US10664751B2 (en) | 2016-12-01 | 2016-12-01 | Processor with memory array operable as either cache memory or neural network unit memory |
US15/366,027 | 2016-12-01 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108133269A true CN108133269A (zh) | 2018-06-08 |
CN108133269B CN108133269B (zh) | 2020-08-25 |
Family
ID=57570827
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710947168.7A Active CN108133269B (zh) | 2016-12-01 | 2017-10-12 | 具有可作为高速缓存存储器或神经网络单元存储器操作的存储器阵列的处理器 |
Country Status (5)
Country | Link |
---|---|
US (1) | US10664751B2 (zh) |
EP (1) | EP3330862B1 (zh) |
JP (1) | JP6250780B1 (zh) |
KR (1) | KR101902658B1 (zh) |
CN (1) | CN108133269B (zh) |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110210605A (zh) * | 2019-05-31 | 2019-09-06 | Oppo广东移动通信有限公司 | 硬件算子匹配方法及相关产品 |
CN110322979A (zh) * | 2019-07-25 | 2019-10-11 | 美核电气(济南)股份有限公司 | 基于fpga的核电站数字控制计算机系统核心处理单元 |
CN110851380A (zh) * | 2018-08-20 | 2020-02-28 | 旺宏电子股份有限公司 | 基于人工智能应用程序的数据储存的装置、系统和方法 |
CN110888824A (zh) * | 2018-09-07 | 2020-03-17 | 黑芝麻智能科技(上海)有限公司 | 多级存储器层级结构 |
WO2020062263A1 (zh) * | 2018-09-30 | 2020-04-02 | 北京比特大陆科技有限公司 | 用于图像识别的盒体装置、方法、系统和存储介质 |
CN111045958A (zh) * | 2018-10-11 | 2020-04-21 | 展讯通信(上海)有限公司 | 加速引擎及处理器 |
CN112368687A (zh) * | 2018-06-29 | 2021-02-12 | 索尼公司 | 信息处理设备、信息处理方法和程序 |
CN112906877A (zh) * | 2019-11-19 | 2021-06-04 | 阿里巴巴集团控股有限公司 | 用于执行神经网络模型的存储器架构中的数据布局有意识处理 |
CN113065647A (zh) * | 2021-03-30 | 2021-07-02 | 西安电子科技大学 | 加速神经网络的计算-存储通信系统及通信方法 |
CN113946538A (zh) * | 2021-09-23 | 2022-01-18 | 南京大学 | 一种基于行缓存机制的卷积层融合存储装置及方法 |
CN114341981A (zh) * | 2019-08-28 | 2022-04-12 | 美光科技公司 | 具有人工智能模式的存储器 |
WO2022233195A1 (zh) * | 2021-05-07 | 2022-11-10 | 珠海市芯动力科技有限公司 | 神经网络权值存储方法、读取方法及相关设备 |
Families Citing this family (28)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20180341862A1 (en) * | 2016-07-17 | 2018-11-29 | Gsi Technology Inc. | Integrating a memory layer in a neural network for one-shot learning |
US10417364B2 (en) | 2017-01-04 | 2019-09-17 | Stmicroelectronics International N.V. | Tool to create a reconfigurable interconnect framework |
WO2018160341A1 (en) * | 2017-03-03 | 2018-09-07 | Google Llc | Secure code jump and execution gating |
US10866899B2 (en) * | 2017-10-02 | 2020-12-15 | Arm Ltd | Method and apparatus for control of a tiered memory system |
US11436143B2 (en) * | 2017-12-22 | 2022-09-06 | Alibaba Group Holding Limited | Unified memory organization for neural network processors |
EP3729289A4 (en) * | 2017-12-22 | 2021-03-03 | Alibaba Group Holding Limited | MEMORY DEVICE AND ASSOCIATED CONTROL PROCEDURE |
CN108509723B (zh) * | 2018-04-02 | 2022-05-03 | 东南大学 | 基于人工神经网络的LRU Cache预取机制性能收益评估方法 |
US20190340490A1 (en) * | 2018-05-04 | 2019-11-07 | Apple Inc. | Systems and methods for assigning tasks in a neural network processor |
DE102018209901A1 (de) * | 2018-06-19 | 2019-12-19 | Robert Bosch Gmbh | Recheneinheit, Verfahren und Computerprogramm zum Multiplizieren zumindest zweier Multiplikanden |
US20190392287A1 (en) | 2018-06-22 | 2019-12-26 | Samsung Electronics Co., Ltd. | Neural processor |
CN108681984B (zh) * | 2018-07-26 | 2023-08-15 | 珠海一微半导体股份有限公司 | 一种3*3卷积算法的加速电路 |
CN109376905A (zh) * | 2018-09-20 | 2019-02-22 | 广东亿迅科技有限公司 | 磁盘空间预测方法、装置、计算机设备和存储介质 |
US11138499B2 (en) | 2018-09-28 | 2021-10-05 | Intel Corporation | Applications of back-end-of-line (BEOL) capacitors in compute-in-memory (CIM) circuits |
KR20200057814A (ko) | 2018-11-13 | 2020-05-27 | 삼성전자주식회사 | 뉴럴 네트워크를 이용한 데이터 처리 방법 및 이를 지원하는 전자 장치 |
US20220171829A1 (en) | 2019-03-11 | 2022-06-02 | Untether Ai Corporation | Computational memory |
US11256503B2 (en) | 2019-03-11 | 2022-02-22 | Untether Ai Corporation | Computational memory |
US11880760B2 (en) | 2019-05-01 | 2024-01-23 | Samsung Electronics Co., Ltd. | Mixed-precision NPU tile with depth-wise convolution |
US20200410319A1 (en) * | 2019-06-26 | 2020-12-31 | Micron Technology, Inc. | Stacked artificial neural networks |
US11342944B2 (en) | 2019-09-23 | 2022-05-24 | Untether Ai Corporation | Computational memory with zero disable and error detection |
KR20210060024A (ko) * | 2019-11-18 | 2021-05-26 | 에스케이하이닉스 주식회사 | 신경망 처리 회로를 포함하는 메모리 장치 |
US11593609B2 (en) | 2020-02-18 | 2023-02-28 | Stmicroelectronics S.R.L. | Vector quantization decoding hardware unit for real-time dynamic decompression for parameters of neural networks |
US11507831B2 (en) | 2020-02-24 | 2022-11-22 | Stmicroelectronics International N.V. | Pooling unit for deep learning acceleration |
US11468002B2 (en) | 2020-02-28 | 2022-10-11 | Untether Ai Corporation | Computational memory with cooperation among rows of processing elements and memory thereof |
JP2021152703A (ja) * | 2020-03-24 | 2021-09-30 | 株式会社東芝 | ニューラルネットワーク装置およびニューラルネットワークシステム |
US11531873B2 (en) | 2020-06-23 | 2022-12-20 | Stmicroelectronics S.R.L. | Convolution acceleration with embedded vector decompression |
US20220223201A1 (en) * | 2021-01-11 | 2022-07-14 | Micron Technology, Inc. | Caching Techniques for Deep Learning Accelerator |
US20230236977A1 (en) * | 2022-01-21 | 2023-07-27 | Nvidia Corporation | Selectable cache policy |
WO2024058615A1 (ko) * | 2022-09-16 | 2024-03-21 | 삼성전자 주식회사 | 신경 처리부를 포함하는 전자 장치 및 그 동작 방법 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20030056075A1 (en) * | 2001-09-14 | 2003-03-20 | Schmisseur Mark A. | Shared memory array |
CN105306520A (zh) * | 2014-06-05 | 2016-02-03 | 汤姆逊许可公司 | 操作高速缓存器的方法及相应高速缓存器 |
US20160239344A1 (en) * | 2015-02-17 | 2016-08-18 | Qualcomm Incorporated | Process Scheduling to Improve Victim Cache Mode |
Family Cites Families (36)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4873656A (en) * | 1987-06-26 | 1989-10-10 | Daisy Systems Corporation | Multiple processor accelerator for logic simulation |
US5204938A (en) | 1989-05-30 | 1993-04-20 | Loral Aerospace Corp. | Method of implementing a neural network on a digital computer |
JPH045774A (ja) * | 1990-04-24 | 1992-01-09 | Seiko Epson Corp | 神経網計算機 |
FR2686175B1 (fr) | 1992-01-14 | 1996-12-20 | Andre Thepaut | Systeme de traitement de donnees multiprocesseur. |
US5623628A (en) | 1994-03-02 | 1997-04-22 | Intel Corporation | Computer system and method for maintaining memory consistency in a pipelined, non-blocking caching bus request queue |
US5752274A (en) | 1994-11-08 | 1998-05-12 | Cyrix Corporation | Address translation unit employing a victim TLB |
JPH08180034A (ja) * | 1994-12-20 | 1996-07-12 | Hitachi Microcomput Syst Ltd | 情報処理装置 |
US5956703A (en) | 1995-07-28 | 1999-09-21 | Delco Electronics Corporation | Configurable neural network integrated circuit |
DE19625569A1 (de) | 1996-06-26 | 1998-01-02 | Philips Patentverwaltung | Signalprozessor |
US7689641B2 (en) | 2003-06-30 | 2010-03-30 | Intel Corporation | SIMD integer multiply high with round and shift |
AT413895B (de) | 2003-09-08 | 2006-07-15 | On Demand Informationstechnolo | Digitale signalverarbeitungseinrichtung |
CN1658153B (zh) | 2004-02-18 | 2010-04-28 | 联发科技股份有限公司 | 复合式动态定点数表示法与运算法及其处理器结构 |
US7676637B2 (en) * | 2004-04-27 | 2010-03-09 | International Business Machines Corporation | Location-aware cache-to-cache transfers |
US7571285B2 (en) * | 2006-07-21 | 2009-08-04 | Intel Corporation | Data classification in shared cache of multiple-core processor |
US7962786B2 (en) | 2006-11-17 | 2011-06-14 | Nokia Corporation | Security features in interconnect centric architectures |
JP5368687B2 (ja) * | 2007-09-26 | 2013-12-18 | キヤノン株式会社 | 演算処理装置および方法 |
CN101452400B (zh) | 2007-11-29 | 2011-12-28 | 国际商业机器公司 | 处理多处理器系统中事务缓冲器溢出的方法和系统 |
CN101571744A (zh) | 2008-04-30 | 2009-11-04 | 扬智科技股份有限公司 | 应用于计算机系统中的功率控制装置以及功率控制方法 |
US8250332B2 (en) | 2009-06-11 | 2012-08-21 | Qualcomm Incorporated | Partitioned replacement for cache memory |
US8244982B2 (en) | 2009-08-21 | 2012-08-14 | Empire Technology Development Llc | Allocating processor cores with cache memory associativity |
US8676734B2 (en) | 2010-07-07 | 2014-03-18 | Qualcomm, Incorporated | Methods and systems for replaceable synaptic weight storage in neuro-processors |
US8965819B2 (en) | 2010-08-16 | 2015-02-24 | Oracle International Corporation | System and method for effective caching using neural networks |
US8937622B2 (en) | 2010-09-20 | 2015-01-20 | Qualcomm Incorporated | Inter-processor communication techniques in a multiple-processor computing platform |
JP2012252490A (ja) * | 2011-06-02 | 2012-12-20 | Renesas Electronics Corp | マルチプロセッサおよびそれを用いた画像処理システム |
US9159020B2 (en) | 2012-09-14 | 2015-10-13 | International Business Machines Corporation | Multiplexing physical neurons to optimize power and area |
JP6135392B2 (ja) * | 2013-08-16 | 2017-05-31 | 富士通株式会社 | キャッシュメモリ制御プログラム,キャッシュメモリを内蔵するプロセッサ及びキャッシュメモリ制御方法 |
EP3063637A4 (en) * | 2013-10-31 | 2017-07-19 | Intel Corporation | A method, apparatus and system for dynamically controlling an addressing mode for a cache memory |
US9418009B2 (en) * | 2013-12-27 | 2016-08-16 | Intel Corporation | Inclusive and non-inclusive tracking of local cache lines to avoid near memory reads on cache line memory writes into a two level system memory |
US10817425B2 (en) * | 2014-12-26 | 2020-10-27 | Intel Corporation | Hardware/software co-optimization to improve performance and energy for inter-VM communication for NFVs and other producer-consumer workloads |
US20160210044A1 (en) | 2015-01-15 | 2016-07-21 | Commvault Systems, Inc. | Intelligent hybrid drive caching |
US20160328644A1 (en) | 2015-05-08 | 2016-11-10 | Qualcomm Incorporated | Adaptive selection of artificial neural networks |
US10380064B2 (en) | 2015-10-08 | 2019-08-13 | Via Alliance Semiconductor Co., Ltd. | Neural network unit employing user-supplied reciprocal for normalizing an accumulated value |
US10776690B2 (en) | 2015-10-08 | 2020-09-15 | Via Alliance Semiconductor Co., Ltd. | Neural network unit with plurality of selectable output functions |
US10380481B2 (en) | 2015-10-08 | 2019-08-13 | Via Alliance Semiconductor Co., Ltd. | Neural network unit that performs concurrent LSTM cell calculations |
US10228911B2 (en) | 2015-10-08 | 2019-03-12 | Via Alliance Semiconductor Co., Ltd. | Apparatus employing user-specified binary point fixed point arithmetic |
US20170153892A1 (en) | 2015-11-30 | 2017-06-01 | Intel Corporation | Instruction And Logic For Programmable Fabric Hierarchy And Cache |
-
2016
- 2016-12-01 US US15/366,027 patent/US10664751B2/en active Active
- 2016-12-20 EP EP16205391.2A patent/EP3330862B1/en active Active
- 2016-12-27 JP JP2016253120A patent/JP6250780B1/ja active Active
- 2016-12-30 KR KR1020160183876A patent/KR101902658B1/ko active IP Right Grant
-
2017
- 2017-10-12 CN CN201710947168.7A patent/CN108133269B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20030056075A1 (en) * | 2001-09-14 | 2003-03-20 | Schmisseur Mark A. | Shared memory array |
CN105306520A (zh) * | 2014-06-05 | 2016-02-03 | 汤姆逊许可公司 | 操作高速缓存器的方法及相应高速缓存器 |
US20160239344A1 (en) * | 2015-02-17 | 2016-08-18 | Qualcomm Incorporated | Process Scheduling to Improve Victim Cache Mode |
Non-Patent Citations (1)
Title |
---|
MAURICE PEEMEN, ET AL.: "Memory-centric accelerator design for Convolutional Neural Networks", 《2013 IEEE 31ST INTERNATIONAL CONFERENCE ON COMPUTER DESIGN(ICCD)》 * |
Cited By (20)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112368687A (zh) * | 2018-06-29 | 2021-02-12 | 索尼公司 | 信息处理设备、信息处理方法和程序 |
CN110851380A (zh) * | 2018-08-20 | 2020-02-28 | 旺宏电子股份有限公司 | 基于人工智能应用程序的数据储存的装置、系统和方法 |
CN110888824A (zh) * | 2018-09-07 | 2020-03-17 | 黑芝麻智能科技(上海)有限公司 | 多级存储器层级结构 |
CN110888824B (zh) * | 2018-09-07 | 2022-04-22 | 黑芝麻智能科技(上海)有限公司 | 多级存储器层级结构 |
WO2020062263A1 (zh) * | 2018-09-30 | 2020-04-02 | 北京比特大陆科技有限公司 | 用于图像识别的盒体装置、方法、系统和存储介质 |
CN111045958A (zh) * | 2018-10-11 | 2020-04-21 | 展讯通信(上海)有限公司 | 加速引擎及处理器 |
CN110210605A (zh) * | 2019-05-31 | 2019-09-06 | Oppo广东移动通信有限公司 | 硬件算子匹配方法及相关产品 |
CN110210605B (zh) * | 2019-05-31 | 2023-04-07 | Oppo广东移动通信有限公司 | 硬件算子匹配方法及相关产品 |
CN110322979A (zh) * | 2019-07-25 | 2019-10-11 | 美核电气(济南)股份有限公司 | 基于fpga的核电站数字控制计算机系统核心处理单元 |
CN110322979B (zh) * | 2019-07-25 | 2024-01-30 | 美核电气(济南)股份有限公司 | 基于fpga的核电站数字控制计算机系统核心处理单元 |
CN114341981A (zh) * | 2019-08-28 | 2022-04-12 | 美光科技公司 | 具有人工智能模式的存储器 |
US11605420B2 (en) | 2019-08-28 | 2023-03-14 | Micron Technology, Inc. | Memory with artificial intelligence mode |
CN114341981B (zh) * | 2019-08-28 | 2023-05-26 | 美光科技公司 | 具有人工智能模式的存储器 |
US11922995B2 (en) | 2019-08-28 | 2024-03-05 | Lodestar Licensing Group Llc | Memory with artificial intelligence mode |
CN112906877A (zh) * | 2019-11-19 | 2021-06-04 | 阿里巴巴集团控股有限公司 | 用于执行神经网络模型的存储器架构中的数据布局有意识处理 |
CN113065647A (zh) * | 2021-03-30 | 2021-07-02 | 西安电子科技大学 | 加速神经网络的计算-存储通信系统及通信方法 |
CN113065647B (zh) * | 2021-03-30 | 2023-04-25 | 西安电子科技大学 | 加速神经网络的计算-存储通信系统及通信方法 |
WO2022233195A1 (zh) * | 2021-05-07 | 2022-11-10 | 珠海市芯动力科技有限公司 | 神经网络权值存储方法、读取方法及相关设备 |
CN113946538A (zh) * | 2021-09-23 | 2022-01-18 | 南京大学 | 一种基于行缓存机制的卷积层融合存储装置及方法 |
CN113946538B (zh) * | 2021-09-23 | 2024-04-12 | 南京大学 | 一种基于行缓存机制的卷积层融合存储装置及方法 |
Also Published As
Publication number | Publication date |
---|---|
US10664751B2 (en) | 2020-05-26 |
KR101902658B1 (ko) | 2018-09-28 |
CN108133269B (zh) | 2020-08-25 |
EP3330862B1 (en) | 2022-08-10 |
KR20180062912A (ko) | 2018-06-11 |
JP2018092561A (ja) | 2018-06-14 |
JP6250780B1 (ja) | 2017-12-20 |
EP3330862A1 (en) | 2018-06-06 |
US20180157970A1 (en) | 2018-06-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108133269A (zh) | 具有可作为高速缓存存储器或神经网络单元存储器操作的存储器阵列的处理器 | |
CN108133267A (zh) | 具有可作为最后级高速缓存片或神经网络单元存储器操作的存储器阵列的处理器 | |
CN108133268A (zh) | 具有可作为牺牲高速缓存或神经网络单元存储器操作的存储器阵列的处理器 | |
CN108133262A (zh) | 具有用于执行高效3维卷积的存储器布局的神经网络单元 | |
CN106485323B (zh) | 具有输出缓冲器反馈以执行时间递归神经网络计算的神经网络单元 | |
CN108133263A (zh) | 神经网络单元 | |
JP6357525B2 (ja) | 効率的な3次元畳み込みを行うニューラルネットワークユニット | |
CN106599990B (zh) | 具有神经存储器的神经网络单元和集体将来自神经存储器的数据列移位的神经处理单元阵列 | |
CN111680789B (zh) | 神经网络单元 | |
CN108804139A (zh) | 可编程设备及其操作方法和计算机可用介质 | |
CN110443360B (zh) | 用于操作处理器的方法 | |
CN108805275A (zh) | 可编程设备及其操作方法和计算机可用介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CP03 | Change of name, title or address | ||
CP03 | Change of name, title or address |
Address after: Room 301, 2537 Jinke Road, Zhangjiang High Tech Park, Pudong New Area, Shanghai 201203 Patentee after: Shanghai Zhaoxin Semiconductor Co.,Ltd. Address before: Room 301, 2537 Jinke Road, Zhangjiang hi tech park, Shanghai 201203 Patentee before: VIA ALLIANCE SEMICONDUCTOR Co.,Ltd. |