利用链接指令的神经网络处理的制作方法

文档序号:18902292发布日期:2019-10-18 22:06阅读:175来源:国知局
利用链接指令的神经网络处理的制作方法
神经网络技术被用来执行诸如阅读理解、语言转换或语音识别之类的复杂任务。虽然神经网络可以执行这样的任务,但是使用通用cpu或通用gpu来部署神经网络是很昂贵的。另外,虽然相对于cpu,gpu提供增加的吞吐量,但它们具有较差的延迟。技术实现要素:在一个示例中,本公开涉及一种在包括全局寄存器和流水线的硬件节点中用于处理指令的方法,该流水线包括:矩阵矢量单元,该矩阵矢量单元包括至少一个累加器寄存器;第一多功能单元,其中第一多功能单元被连接以接收来自矩阵矢量单元的输入;第二多功能单元,其中第二多功能单元被连接以接收来自第一多功能单元的输出;以及第三多功能单元,其中第三多功能单元被连接以接收来自第二多功能单元的输出。该方法可以包括经由全局寄存器从输入队列接收第一类型指令,其中第一类型指令只能由矩阵矢量单元执行,并且由矩阵矢量单元执行第一类型指令并将第一类型指令的第一结果存储在至少一个累加器寄存器中。该方法还可以包括经由全局寄存器从输入队列接收第二类型指令,其中第二类型指令只能由第一多功能单元、第二多功能单元或第三多功能单元中的至少一个执行,并且使用第一多功能单元执行第二类型指令,其中该执行包括对至少第一类型指令的第一结果执行操作并生成第二结果。该方法可以进一步包括在不将第一结果或第二结果存储在全局寄存器中的情况下,将第二结果传递给第二多功能单元,并且在那之后将第二结果传递给第三多功能单元。在另一示例中,本公开涉及一种硬件节点,包括全局寄存器和被配置为处理指令的流水线,该流水线包括:矩阵矢量单元,该矩阵矢量单元包括至少一个累加器寄存器;第一多功能单元,其中第一多功能单元被连接以接收来自矩阵矢量单元的输入;第二多功能单元,其中第二多功能单元被连接以接收来自第一多功能单元的输出;以及第三多功能单元,其中第三多功能单元被连接以接收第二多功能单元的输出。硬件还可以被配置为经由全局寄存器从输入队列接收第一类型指令,其中第一类型指令只能由矩阵矢量单元执行,并且由矩阵矢量单元执行第一类型指令并将第一类型指令的第一结果存储在至少一个累加器寄存器中,经由全局寄存器从输入队列接收第二类型指令,其中第二类型指令只能由第一多功能单元、第二多功能单元或第三多功能单元中的至少一个执行,并且使用第一多功能单元执行第二类型指令,其中该执行包括对至少第一类型指令的第一结果执行操作,并生成第二结果,并且在不将第一结果或第二结果存储在全局寄存器中的情况下,将第二结果传递给第二多功能单元并且在那之后将第二结果传递给第三多功能单元。在又一示例中,本公开涉及一种硬件节点,包括全局寄存器和被配置为处理指令的流水线,该流水线包括:矩阵矢量单元,该矩阵矢量单元包括至少一个累加器寄存器;第一多功能单元,其中第一多功能单元多功能单元被连接以接收来自矩阵矢量单元的输入;第二多功能单元,其中第二多功能单元被连接以接收来自第一多功能单元的输出;以及第三多功能单元,其中第三多功能单元被连接以接收来自第二多功能单元的输出,其中第一多功能单元、第二多功能单元和第三多功能单元中的每一个还包括逐点加法和无操作块中的至少一个。硬件还可以被配置为经由全局寄存器从输入队列接收第一类型指令,其中第一类型指令只能由矩阵矢量单元执行,并且由矩阵矢量单元执行第一类型指令并将第一类型指令的第一结果存储在至少一个累加器寄存器中,经由全局寄存器从输入队列接收第二类型指令,其中第二类型指令只能由第一多功能单元、第二多功能单元或第三多功能单元中的至少一个执行,并使用第一多功能单元执行第二类型指令,其中该执行包括对至少第一类型指令的第一结果执行操作,并生成第二结果,并且在不将第一结果或第二结果存储在全局寄存器中的情况下,将第二结果传递给第二多功能单元并且在那之后将第二结果传递给第三多功能单元。提供本
发明内容是为了以简化的形式介绍一些概念,这些概念将在下面的具体实施方式中进一步描述。本
发明内容不旨在标识所要求保护的主题内容的关键特征或必要特征,也不旨在用以限制所要求保护的主题内容的范围。附图说明通过示例说明了本公开,并且本公开不被附图所限制,其中相同的附图标记指示类似的元件。附图中的元件是为了简单和清楚起见而被图示,并且不一定被按比例绘制。图1是根据一个示例的包括经由数据中心网络互连的节点的系统的框图;图2是根据一个示例的包括分布式节点的系统的框图;图3是根据一个示例的硬件节点的框图;图4是根据一个示例的神经功能性单元的框图;图5a和图5b示出了根据另一示例的神经功能单元的框图;图6示出了根据一个示例的用于执行神经网络处理的硬件节点(例如,fpga)的框图;图7示出了根据一个示例的用于执行神经网络处理的区片(tile)布置的框图;图8示出了根据一个示例的处理元件的框图;图9示出了包括区片矩阵的节点的示例实现;图10示出了根据一个示例的多功能单元的框图;图11示出了根据一个示例的针对神经网络评估的数据流图形;图12示出了根据一个示例的由神经功能单元对指令链的示例处理;图13示出了根据一个示例的针对神经网络评估的数据流图形;图14示出了根据一个示例的可以如何使用硬件节点(例如,fpga)处理指令链的示意图;和图15示出了根据一个示例的用于处理指令的方法的流程图。具体实施方式本公开中所公开的示例涉及使用用于实现基于神经网络的处理的系统、方法和组件。某些示例涉及深度神经网络(dnn)。dnn可以是用于深度学习的任何合适的神经网络。本公开中的附加示例涉及作为被用来实现dnn或类似神经网络的节点的一部分而被包括的功能单元。可以使用现场可编程门阵列(fpga)、专用集成电路(asic)、可擦除和/或复杂可编程逻辑器件(pld)、可编程阵列逻辑(pal)器件和通用阵列逻辑(gal)器件的部分或组合来实现节点。图像文件可以被用来配置或重新配置诸如fpga之类的节点。可以经由网络链路或来自主机cpu的本地链路(例如,pcie)来递送图像文件或类似文件或程序。包括在图像文件中的信息可以被用来对节点的硬件块(例如,fpga的逻辑块和可重新配置的互连)进行编程以实现期望的功能性。可以实现期望的功能性以支持可以经由计算、联网和存储资源的组合来提供的任何服务,诸如经由数据中心或用于递送服务的其他基础设施。在一个示例中,本公开涉及dnn,其包括经由低延迟网络彼此耦合的多个节点(例如,fpga)或这样节点的群组。利用数百到数千个这样的节点(例如,fpga)的聚合平台可以有利地提供:(1)通过利用跨数十万个节点的并行性而显著地减少训练时间,(2)实现新的训练场景,诸如对实时数据的原位在线学习,以及(3)前所未有的规模的训练模型,同时在跨越数十万个服务器的超大规模数据中心内利用灵活且可互换的同类fpga资源。在一个示例中,可以通过利用非常规数据表示来获得这样的优点,该非常规数据表示可以利用诸如fpga之类的节点的架构。所描述的方面还可以在云计算环境中被实现。云计算可以是指用于实现对可配置计算资源的共享池的按需网络访问的模型。例如,可以在市场中使用云计算来提供对可配置计算资源的共享池的普遍且方便的按需访问。可配置计算资源的共享池可以经由虚拟化而被快速供应,并以低管理工作量或服务提供者交互而被发布,然后相应地被扩展。云计算模型可以由各种特性组成,诸如例如,按需自助服务、广泛的网络访问、资源池、快速弹性、测量的服务等。云计算模型可以被用来暴露各种服务模型,诸如例如,硬件即服务(“haas”)、软件即服务(“saas”)、平台即服务(“paas”)、以及基础架构即服务(“iaas”)。还可以使用不同的部署模型来部署云计算模型,诸如私有云、社区云、公共云、混合云等。可以使用本公开中描述的系统和节点来实现机器学习服务,诸如基于递归神经网络(rnn)、长短期记忆(lstm)神经网络或门控递归单元(gru)的那些机器学习服务。在一个示例中,可以将与服务相关的内容或其他信息(诸如单词、句子、图像、视频或其他此类内容/信息)转换成矢量表示。矢量表示可以对应于诸如rnn、lstm或gru之类的技术。可以在服务初始化之前离线训练深度学习模型,然后可以使用本公开中描述的系统和节点来部署深度学习模型。节点可以是硬件可编程逻辑设备,其可以被专门定制以执行在诸如dnn之类的神经网络的上下文中发生的操作的类型。在一个示例中,神经网络模型的状态和被用来控制模型的参数可以被固定到包括分布式硬件平台的节点的片上存储器。可以在服务启动时将神经网络模型固定(例如,预加载)到片上存储器,并且可以不更改片上存储器的内容,除非模型需要更改或需要用模型重新加载片上存储器的另一事件。因此,在该示例中,与其他布置相反,可以不从与硬件平台相关联的dram访问神经网络模型,而是将其直接加载到硬件节点的片上存储器(例如,sram)中。将模型固定在分布式可编程逻辑块集合(例如,fpga资源)上可以允许节点(例如,fpga)以全容量操作,并且可以有利地改进与服务相关联的吞吐量和延迟。作为示例,即使来自服务的单个请求也可以导致分布式节点集合以全容量操作,并且从而以非常低的延迟递送由服务的用户所请求的结果。在一个示例中,神经网络模型可以包括许多层,并且每个层可以被编码为以经由神经网络的离线训练获得的系数或常数的形式表达的权重的矩阵或矢量。节点中的可编程硬件逻辑块可以处理矩阵或矢量以执行各种操作,包括针对表示与服务相关的编码信息的输入矢量的乘法、加法和其他操作。在一个示例中,可以通过使用诸如图形分区之类的技术,在多个节点上对权重的矩阵或矢量进行分区和固定。作为该过程的一部分,可以将大型神经网络转换为中间表示(例如,图形),然后可以将中间表示划分为较小的表示(例如,子图形),并且对应于每个子图形的每个权重矩阵可以被固定到节点的片上存储器。在一个示例中,可以将模型转换为固定大小的矩阵和矢量。这样,节点的资源可以并行地对固定大小的矩阵和矢量进行操作。以lstm为例,lstm网络可以包括一系列重复的rnn层或其他类型的层。lstm网络的每层可以在给定时间步长消耗输入,例如,来自前一时间步长的层状态,并且可以产生一组新的输出或状态。在使用lstm的情况下,可以将单个内容组块编码成单个矢量或多个矢量。作为示例,可以将单词或单词的组合(例如,短语、句子或段落)编码为单个矢量。可以将每个组块编码到lstm网络的个体层(例如,特定时间步长)中。可以使用一组方程式来描述lstm层,诸如下面的方程式:it=σ(wxixt+whtht-1+wotct-1+bift=σ(wxfxt+whfht-1+wofct-1+bf)ct=ftct-1ittanh(wxoxt+whoht-1+bo)ot=σ(wxoxt+whoht-1+wcoct+bo)ht=ottanh(ct)在该示例中,在每个lstm层内部,可以使用矢量操作(例如,点积、内积或矢量加法)和非线性函数(例如,s形、双曲线和切线)的组合来处理输入和隐藏状态。在某些情况下,大多数计算密集型操作可能来自点积,其可以使用密集矩阵-矢量和矩阵-矩阵乘法例程来实现。在一个示例中,可以并行执行矢量操作和非线性函数的处理。图1是根据一个示例的包括经由数据中心网络110互连的节点的系统100的框图。例如,如图1中所示,多个节点102、104和106可以经由数据中心网络而耦合。这些节点可以被实例化并被用来并行化诸如lstm网络之类的神经网络的多个层。在一个示例中,每个节点可以被实现为服务器并且还可以包括至少一个硬件节点(例如,fpga)。因此,节点102可以包括fpga122,节点104可以包括fpga124,并且节点106可以包括fpga126。fpga可以经由基于光运输层协议的系统而被互连。在一个示例中,fpga122的第一实例可以经由运输链路132与fpga124的第一实例耦合,并且fpga122的第一实例还可以经由运输链路134与fpga124的第二实例耦合。fpga124的第一实例可以经由运输链路136与fpga126的第一实例耦合,并且fpga124的第一实例还可以经由运输链路140与fpga126的第一实例耦合。类似地,fpga124的第二实例可以经由运输链路142与fpga126的第一实例耦合,并且fpga124的第二实例还可以经由运输链路138与fpga126的第二实例耦合。光运输层协议可以为fpga提供经由数据中心网络110彼此传递或接收分组或其他此类数据的能力。fpga也可以在其他配置中互连。例如,fpga122的若干实例可以经由多个运输链路152被耦合到fpga124的若干实例。类似地,fpga124的若干实例可以经由运输链路154被耦合到fpga126的若干实例。虽然图1示出了包括fpga的特定数目和布置的节点,但是可以存在更多或更少数目的不同地布置的节点。图2是根据一个示例的包括分布式节点的系统200的框图。在该示例中,多个节点可以被实现为数据中心中的服务器机架。每个服务器可以被耦合到架顶式(tor)交换机。其他机架虽然未被示出,但是可以具有类似的配置。每个服务器可以包括至少一个节点或多个节点。每个节点可以包括服务器(例如,服务器204、服务器206或服务器208),并且每个服务器可以被耦合到tor交换机(例如,tor交换机210)。服务器204可以包括主机组件,主机组件包括诸如cpu214和cpu216之类的cpu,其可以经由本地链路(例如,pcie)220而被耦合到硬件节点,例如fpga218。每个硬件节点还可以通过(例如,被用来跨针对数据中心的网络基础设施进行通信)网络接口控制器222而被耦合。图2中所示的系统可以允许节点对从tor交换机或其他交换机接收(和/或发送到tor交换机或其他交换机)的消息执行处理。使用该示例系统,各个节点可以直接向彼此发送包括分组的消息,并且因此这可以允许对甚至跨越多个fpga的单个神经网络进行分区而不会引发不可接受的延迟。对于通信,节点可以使用轻量级协议,包括例如rdma。虽然图2示出了以某种方式布置的系统的一定数目的组件,但是可以存在更多或更少数目的不同地布置的组件。还可以通过跨多个节点分割神经权重来在神经网络的层内执行并行化。作为示例,可以跨多个节点对单个rnn模型(例如,包括lstm权重矩阵)进行分区并固定。在该示例的实现中,rnn模型可以被分布在多个fpga中的每个fpga的存储器(例如,bram)上。在该示例配置中,多级流水线中的每个个体fpga可以将一部分lstm权重矩阵存储在快速片上存储器(例如,bram)中。这可以有利地导致高吞吐量和低延迟系统。在服务启动时,lstm权重矩阵可以被分解成特定大小的矩阵(例如,n×m矩阵,其中n和m中的每一个是等于或大于8的整数),并且然后被加载到fpga的片上存储器中。运行时管理层可以实现fpga的分配、调度和管理。在一个示例中,每个节点可以被实现为基于一个或多个fpga的haas附接的lstm聚焦矢量处理器。每个节点可以被设计为运行神经网络评估——作为pcie附接的fpga或作为fpga的haas池的一部分。图3是根据一个示例的硬件节点300的框图。每个硬件节点300可以包括用于从其他节点接收消息的输入消息处理器(imp)310和用于处理到其他节点或组件的传出消息的输出消息处理器(omp)340。每个节点还可以包括控制/标量处理器(csp)320和神经功能单元(nfu)330。虽然未被示出,但是节点接收的接收消息可以被存储在至少两个不同的队列中:(1)imp到csp辅助队列和(2)imp到nfu数据队列。虽然未被示出,但是传出消息可以被存储在至少两个不同的队列中:(1)csp到imp辅助队列和(2)nfu到omp数据队列。在该示例中,节点可以接受包含诸如控制和标量数据之类的辅助信息和有效负载数据(例如,矢量、矩阵或其他张量数据结构)两者的片外消息。辅助信息可以包括对有效负载执行计算密集型操作的请求,然后以输出消息的形式返回结果。在该示例中,传入消息由轻量输入消息处理器(imp)310处理,其将辅助信息发送到控制/标量处理器(csp)320(其可以是基于nios的控制处理器)并将有效负载数据(例如,输入张量)发送到神经功能单元(nfu)330,其可以被实现为矩阵-矢量处理器。作为示例,csp320然后可以解译该请求,并且基于其固件,可以向nfu330发送一系列指令。在一定的处理延迟之后,nfu可以产生请求的结果,其可以与由csp320产生的辅助数据在轻量级输出消息处理器(omp)340中结合,并且然后被片外发送。csp固件可以向nfu330提供指令。示例指令的进一步细节作为指令集架构(isa)的一部分而被讨论。还可以执行用于csp320的固件的运行时重新加载。因此,在该示例中,架构主要是事件驱动的。输入消息可以从许多源(包括通过网络)到达。imp可以检查消息队列的头部,并且它可以使任何需要被执行的指令出列并通过系统馈送它。虽然图3示出了以特定方式布置的示例节点的特定数目的组件,但是可以存在更多或更少数目的不同地布置的组件。在一个示例中,nfu可以被实现为矩阵-矢量处理器,其被设计为扩展到fpga的大部分资源。在该示例中,nfu的主要硬件加速目标是通过应用数千个乘法加法器利用其矩阵-矢量单元(mvu)以高吞吐量和低延迟执行矩阵-矢量乘法。nfu可以接收系数(例如,常数)的矩阵,并且可以被用于将这些系数与动态输入矢量数据相乘。因此,代替将系数存储在对应于cpu/gpu的dram中,系数可以在服务启动时被预加载到对应于nfu的片上存储器(例如,fpga的块随机存取存储器(bram))中。在一个示例中,除非正在使用的神经网络模型被修改或服务被重新启动,否则系数一旦被加载就可能永远不会被再次加载。换言之,作为该示例的一部分,模型可以以分布式的方式被分区和固定到多个节点的片上存储器(例如,fpga),这些节点以它们可以在不依赖来自cpu资源的协助的情况下直接彼此传递消息或分组的方式而被连接。在一个示例中,mvu可以是完全流水线化的,并且可以能够在o(n)时间内执行o(n2)复杂度的矩阵-矢量乘法,其性能为每秒4000-18000亿次定点运算。虽然矩阵-矢量乘法可以表示评估lstm层所需的绝大多数定点运算,但评估还可以包含各种矢量减少、超越(transcendental)和偏置矢量的添加。nfu还可以实现流水线多功能单元(mfu)以在o(n)时间内处理这些o(n)复杂度的矢量函数。这些mfu可以被组织成链式架构,其中mvu将数据传递到第一mfu,第一mfu将数据传递到第二mfu,等等。在nfu的一个示例实现中,可以使用1个mvu和5个mfu。基于矢量函数在矢量和矩阵-矢量操作花费大约相同时间来进行计算的架构中可能潜在地支配lstm评估时间的观察,链式架构可以允许nfu利用单个矩阵-矢量乘法和若干矢量函数之间的大规模流水线并行性。nfu的存储器子系统也可以被配置为支持高吞吐量。作为示例,存储器子系统可以支持高达1.8tb/s的矩阵值吞吐量,以及支持同时加载6个矢量和存储6个矢量。图4示出了nfu400的示例实现。nfu400可以包括用于接收输入数据的输入队列(iq)410和用于输出输出数据的输出队列(oq)420。因此,nfu400可以通过其输入队列(iq)410引入外部矢量和矩阵数据,并通过其输出队列(oq)420发出矢量数据。nfu400可以包括用于提供可以被用来存储矢量数据的集中化位置的全局矢量寄存器文件(gvrf)430。nfu400可以包括矩阵-矢量单元(mvu)440和五个多功能单元(mfu)(例如,mfu#0450、mfu#1460、mfu#2470、mfu#3480和mfu#4490,如图4中所示)。mvu440可以包括矩阵-寄存器文件442,用于存储可以在开始由节点支持的服务时被预加载的矩阵。每个mfu还可以包括本地矢量寄存器文件(lvrf)453,用于存储用于对应mfu的本地矢量数据(例如,lvrf452、lvrf462、lvrf472、lvrf482和lvrf492)。指令可以由nfu400按顺序执行。可以配置一系列指令,使得流水线(包括例如一个mvu440和五个mfu)并行地执行指令链。作为示例,可以使用矩阵运算(其使用mvu440)来对输入矢量数据相乘,然后可以通过流水线将其传递到输出队列420。nfu400中的各种数据流可能性经由图4中的两条虚线路径和一条实线路径示出。稍后将提供指令链的进一步细节和示例。示例nfu400可以对矢量和矩阵进行操作。矢量是1d标量元素集合,矩阵是2d标量元素集合。可以使用下面的表1中的参数来设置元素、矢量和矩阵的大小。表1某些参数(例如,如表1中所示)可以被用来在设计时或之后配置nfu400。在一个示例中,可以使用四个参数来配置nfu400。第一参数可以是矩阵和矢量元素的数据类型,尤其是单个元素的宽度(elem_width)。作为示例,8位定点数据类型、16位定点数据类型、27位定点数据类型和32位浮点数据类型在一个示例中可以是数据类型集合。nfu400中的每个数据总线的宽度可以被配置为elem_width*lanes个位;每个矢量可以在存储器中使用elem_width*hwvec_elems个位;并且每个矩阵可以在存储器中使用elem_width*hwvec_elems*hwvec_elems个位。第二参数可以是硬件矢量大小(hwvec_elems)。在一个示例中,存储在nfu400内的所有矢量可以具有等于hwvec_elems的固定数目的元素,并且所有矢量指令可以接受hwvec_elems个元素作为输入和/或产生hwvec_elems个元素作为输出。此外,所有矩阵可以具有等于hwvec_elems的固定数目的元素。许多应用可以具有其自己的算法维度,其可以与硬件矢量大小不同。当是这种情况时,程序员(或编译器)可以使用诸如矩阵阻塞之类的技术将高级操作映射到硬件矢量大小。例如,下面的表2示出了具有500x500矩阵大小和500个元素矢量大小的应用;然而,nfu400的硬件矢量大小为250。表2中所示的函数可以被用于解决这种差异。表2第三参数可以是矢量通道(lanes)的数目,其描述了应当在每个mfu内并行操作多少元素。作为示例,矩阵-矢量单元(mvu)440内的并行操作的数目可以被定义为lanes*hwvec_elems,假设存在hwvec_elems个区片,每个区片具有lanes个乘法加法器。区片被进一步描述作为对应于示例矩阵-矢量单元(mvu)440的描述的一部分。此外,包括顶级端口在内的每个nfu数据总线可以每个周期携带lanes个矢量元素以用于lanes*elem_width个位的总宽度。在一个示例中,lanes是hwvec_elems的整数因子以避免位填充,因为矢量在lanes大小的组块中操作并且需要hwvec_elems/lanes个周期来处理矢量。第四参数可以是矩阵寄存器文件的大小(nrf_size),其在与nfu相对应的片上存储器(例如,快速片上bram(稍后参见描述))中存储给定数目的hwvec_elemsxhwvec_elems个矩阵。在一个示例中,节点上的存储器资源需求(例如,fpga上的bram资源的数目)可以通过下面的公式集导出(注意,ceil(x,y)将x四舍五入到y的最近倍数):bramwtdth=cett(lanes*data_width,40)关于存储器子系统,nfu400可以将其内部存储装置分布在三种主要类型的存储器上。首先,矩阵寄存器文件可以被用来在一系列快速片上随机存取存储器(例如,fpga中的bram)中存储mrf_sizehwvec_elemsxhwvecs_elems个矩阵。这些bram可以被分布在整个矩阵矢量单元中,并且每个周期可以各自提供lanes个矩阵元素,以获得hwvec_elems*lanes*elem_width位/周期的总的片上矩阵吞吐量。在这个示例中,可能需要o(hwvec_elems2)个周期来将矩阵存储到矩阵寄存器文件中;因为这样的矩阵存储可以在预加载步骤中被执行,然后针对许多矩阵-矢量乘法进行分摊。接下来,如图4中所示,全局矢量寄存器文件(gvrf)430可以用作程序员可以用来存储矢量数据的集中化位置。用于gvrf的一个示例配置可以存储32个矢量,并且可以每个周期读取lanes个矢量元素,同时还每个周期写入lanes个矢量元素。此外,nfu中的每个多功能单元可以具有其自己的本地矢量寄存器文件(lvrf),其也可以每个周期读取和写入lanes个矢量元素。因此,在具有5个mfu的示例nfu中,总的矢量存储器带宽是每个周期12个分离的矢量的6*lanes个读取和6*lanes个写入。该矢量存储器架构被配置为支持将若干矢量函数链接在一起,其中一个可以从gvrf读取,其中每个可以读取和写入到一个lvrf,并且其中一个可以写回到gvrf。nfu的矩阵-矢量单元(mvu)440可以执行流水线化的高吞吐量低延迟矩阵-矢量乘法。在一个示例中,mvu440使用lanes*hwvec_elems个乘法器和加法器来实现该目标,并且其吞吐量可以被测量为每秒2*lanes*hwvec_elems*fmax个操作。在一个示例中,与依赖于矢量批处理的典型高吞吐量矩阵-矢量乘法器不同,mvu440一次接受一个矢量到其流水线中。图5a和图5b示出了根据另一示例的神经功能单元(nfu)500的框图。nfu500可以包括输入队列单元510、全局矢量寄存器文件(vrf)520、矩阵矢量相乘530和n个多功能单元(mfu)。作为示例,nfu500可以包括mfu0540、mfu1560和mfun-1580。在该示例中,可以以流水线的方式连接这些组件中的每个组件。nfu500还可以包括复用器和解复用器的布置,其可以被用来通过nfu500控制矢量、指令或其他数据的路由。例如,nfu500可以包括复用器mux0504、mux1506、mux2510和mux544,并且它还可以包括解复用器demux502、demux508、demux512、demux514和demux516。作为示例,解复用器demux502可以从输入队列单元510接收指令或数据,并且将它耦合到复用器mux0504或复用器mux1506。可以通过向解复用器提供控制信号来实现这些备选耦合。控制信号可以由与nfu500相关联的解码器来生成。每个mfu可以包括局部矢量寄存器文件(localvrf)542、加法块(+)546、乘法块(x)548、双曲正切函数块(tanh)550、s形块(sigm)552和无操作(nop)块554、以及存储器管理功能性。虽然图5示出了以某种方式布置的nfu500的一定数目的组件,但是可以有更多或更少数目的不同地布置的组件。图6示出了根据一个示例的用于执行神经网络处理的硬件节点(例如,fpga)600的框图。硬件节点600可以包括处理逻辑块(例如,数字信号处理器(dsp))622和存储器元件(例如,块ram)610的列。可以配置一小组bram和dsp以创建处理区片,例如,处理区片630。在图6的示例中,每个区片(例如,处理区片630)可以包括bram632、634、636、638和640,其可以如图所示进行布置。每个处理区片630还可以包括处理逻辑块(例如,数字信号处理器(dsp))642、644、646、648、650和652,其可以如图6中所示进行布置。处理逻辑块可以被用来将输入矢量与一行权重相乘。可以使用加法器660来将处理逻辑块的输出相加。因此,在该示例中,每个区片可以执行逐点的点积运算。虽然图6示出了硬件节点600的以一定方式布置的一定数目的组件,但是可以存在更多或更少数目的不同地布置的组件。图7示出了根据一个示例的用于执行神经网络处理的区片的布置700的框图。如图7中所示,在该示例中,通过树广播将这些矢量馈送到hwvec_elems个处理元件(例如,在图7中被称为区片)的阵列。因此,作为示例,经由矢量入口702接收的矢量可以被存储在图7中所示的入口树寄存器(reg)710中。接下来,矢量可以扇出到两个或更多个寄存器(例如,入口树寄存器712和入口树寄存器714)。可以使用附加参数(扇出)来描述从入口树中的每个节点扇出的连接的数目。处理元件(例如,区片722、724、726和728)可以处理矢量,并且每个区片可以向出口移位寄存器(reg)(例如,出口移位寄存器742和出口移位寄存器744)提供输出。来自mvu的输出可以通过矢量出口块750移出。处理元件(例如,区片)可以在每个周期执行lanes相乘和lanes相加。mvu可以每个周期接受lanes个输入矢量元素,并且在流水线延迟之后,在对应的输出矢量的每个周期发出lanes个元素。针对单个输入矢量的该延迟可以被定义为logfanout(hwvec_elems)+2*hwvec_elems/lanes,因为需要logfanout(hwvec_elems)个周期来使数据通过入口树渗透,需要hwvec_elems/lanes个周期来计算输出,并且需要hwvec_elems/lanes个周期来通过出口流水线发出矢量。每个处理元件(例如,区片)可以存储一行mrf_size矩阵,并使用其处理元件针对所选矩阵的单行计算矢量的点积。图8示出了根据一个示例的处理元件800的框图。在该示例中,处理元件可以被实现为用于矢量(gemv)区片810的通用矩阵乘法。每个处理元件800可以从入口树接收输入数据(例如,如图5中所示)并且将数据输出到出口流水线(例如,如图7中所示)。每个处理元件可以包括用于存储矢量数据的块ram(例如,用于矩阵行1的bram820)。在该示例中,每个处理元件(例如,gemv区片)可以包括bram,其可以存储矩阵的行1并且处理该行中的矢量数据。在一个示例中,处理元件可以使用处理块(例如,用于矩阵行1的pe830)计算矢量数据和任何输入数据之间的点积(例如,经由路径“从入口树输入数据”接收)。可以经由路径“将数据输出到出口流水线”提供输出数据以供进一步处理。虽然图8示出了以一定方式布置的gemv区片810的一定数目的组件,但是可以存在更多或更少数目的不同地布置的组件。图9示出了在包括区片矩阵中的节点900的示例实现。在该示例实现中,使用具有252个区片的节点900处理252x252矩阵910的数据。示例节点900可以经由输入队列920接收数据,输入队列920可以使用总线922而被耦合到广播块930。在该示例中,总线922的总线宽度可以是192位。广播块930可以经由各个总线而被耦合到sram块,以允许将预先训练的神经网络模型快速加载到节点900中。作为示例,图9示出了区片0940、区片1950和区片251960。区片0940可以经由192位总线932而被耦合到广播块930。区片1950可以经由192位总线934而被耦合到广播块930。区片251960可以经由192位总线936而被耦合到广播块930。每个区片可以包括对应的sram和点积单元。作为示例,区片0940可以包括sram942和点积单元944,其可以使用192位总线946彼此耦合。区片1950可以包括sram952和点积单元954,其可以使用192位总线956彼此耦合。区片251960可以包括sram962和点积单元964,其可以使用192位总线966彼此耦合。每个sram可以存储权重矩阵的一行,其可以基于图9中所示的寻址方案而被存储。每个点积单元可以被实现为12输入(12-input)点积单元。在服务启动时,预训练的神经网络模型权重可以被流入到fpga的片上存储器(例如,图9中的sram)中并被固定到特定的布置中,允许计算单元以非常高的吞吐量生成输出。在一个示例中,矩阵的每一行可以表示神经元,并且该行中的每列条目可以表示附接到该神经元的突触权重。以矩阵形式(例如,表示神经元)存储的系数可以被预加载到sram或与硬件节点相关联的其他存储器中。在神经元不适合单个硬件节点(例如,fpga)的情况下,可以将一部分神经元加载到第二硬件节点中,依此类推。在一个示例中,可以使用图形分区技术来分布神经权重矩阵。使得表示神经权重矩阵的图形可以被分割成子图形,然后可以将其固定到不同硬件节点的存储器中,这些存储器可以使用轻量运输协议或其他类型的协议彼此通信。例如,使用经由图1和图2描述的架构和系统,硬件节点可以彼此直接通信。广播块930可以包括如先前关于图5所讨论的入口树。这个示例示出了使用fpga构建的架构,其在固定大小的矩阵和矢量上操作。在此示例中,所支持的原生大小为252乘252方形矩阵。在这些设计的其他参数化实例中,可以使用其他形状和大小的矩阵。在该示例中,存在24方形矩阵,其可以被存储在片上存储器(例如,sram)中。因此,在该示例中,存在252个区片的阵列,并且每个区片是计算单元。每个sram可以每个时钟周期从广播块接收192位并且输出192位到12输入点积单元。这转换为每个周期以每个元素16位馈送12个元素。作为示例,与地址0(addr0)相对应的sram的行被配置为存储元素0-0到0-11,其是前12个元素。在addr1,存储另外12个元素,依此类推。此示例示出了每个时钟周期为一行馈送多个元素的一种打包策略。在这个示例中,sram只使用21行,地址0到地址20,并且这足以存储整个方形矩阵。在该示例中,可以将多达二十四个252乘252方形矩阵打包到对应于节点900的片上存储器中。取决于权重的数值精度,可以打包更少或更多的矩阵。作为示例,8位模式可以被用来打包多达48个与16位模式相同大小的矩阵。实际上,也可以支持其他置换。12输入点积单元执行计算,并且因此,在该示例中,节点900包括矢量乘法-加法树。作为示例,为了执行点积运算,可以执行在该行的每个元素与矢量的每个元素之间的元素成对相乘,然后将其求和为一个累加变量。在图9中所示的示例中,每个区片负责计算矩阵的一行。在每个时钟周期上,可以一次处理出自该矩阵中的12个元素。该示例对应于16位整数运算(例如,每个权重由16位表示),并且因此每个sram条目是512×192位。可以使用包括例如1位、2位、4位或8位在内的其他位大小来表示对应于神经网络模式的权重。图10示出了根据一个示例的多功能单元(mfu)1000的框图,其对应于例如关于图4的先前描述的nfu。关于nfu的多功能单元(mfu),它们可以基于本地和/或外部数据执行若干矢量功能。示例mfu实现可以支持逐点加法、乘法、s形和双曲正切函数,以及传递和存储器管理功能性。在一个示例中,每个mfu可以以如下方式进行配置:在每个mfu中提供mfu可以处理的每个指令类型所需的每个操作符(例如,用于执行操作的硬件块),并且每个操作符沿着多个mfu的链式路径而被复制(例如,如图4中所示)。以这种方式,可以灵活地形成链式指令(稍后解释),而不必规定或提供指令在链中的位置。可以使用查找表来实现s形和双曲正切。对于所选择的功能,在一个示例中,单个mfu可以每个周期执行一定数目的操作(例如,由早先描述的lanes参数所指定的操作),同时分别为相加/相乘和s形/切线添加1到2个延迟周期。在该示例中,mfu1000可以包括被配置为执行不同操作的硬件块。每个硬件块可以对从包括例如先前的mfu、mvu或gvrf的若干源接收的值或操作数执行操作。中间值可以被存储在本地矢量寄存器文件(lvrf)1010中。作为示例,一个硬件块1020可以执行加法操作。另一硬件块1030可以执行乘法操作。另一块1040可以执行切线(例如,tanh)操作。另一块1050可以执行s形(sigm)操作。又一块1060可以执行无操作(nop)。各种硬件块的输出可以被供应给复用器1060。基于来自各种队列控制器或其他控制逻辑的一个或多个控制信号,复用器(mux)可以提供输出,该输出可以被耦合到流水线中的下一mfu或耦合到输出队列。在一个示例中,控制信号可以是从对应于神经功能单元(nfu)的指令解码器接收的信号。mux的输出还可以被耦合到lvrf1010,以用于存储与示例mfu所执行的各种操作相对应的中间值。在一个示例中,可以与流水线相邻的控制处理器可以具有指令队列,并且它可以将指令动态地写入到用于nfu的各种组件的相关队列中。在指令被执行时,它们可以扇出到独立的控制队列中,并且可以确定nfu的哪个部分得到激活。nfu的每个组件可以访问控制队列的头部并相应地执行操作,例如,加、乘、正切、s形或nop。控制队列可能不会出列,直到所有矢量都已传递通过,然后控制队列可以传递到下一组件上。虽然图10示出了以特定方式布置的mfu1000的一定数目的组件,但是可以具有更多或更少数目的不同地布置的组件。作为示例,mfu1000可以包括用以执行其他操作的附加硬件块,诸如softmax操作、整流线性单元(relu)操作、激活块操作等。就与包括nfu的节点相关的一个示例指令集架构(isa)而言,指令可以总是以程序顺序执行。另外,所有指令可以作用于原生大小hwvec_elems的矢量和/或矩阵。isa可以被用来暴露分布式存储器系统和nfu流水线中可用的大规模流水线并行性两者。在一个示例中,可以通过将两个或更多个指令显式地标识为链的成员来利用这种并行性。示例链可以使用针对矩阵-矢量相乘、矢量-矢量相加和矢量s形函数的指令来配置跨越mvu和两个mfu的流水线以并行执行所有三个指令。在一个示例中,指令可以在以下情况下有资格成为链:最多一个输入并且最多一个输出的一系列相关指令需要全局存储器,所有其他自变量(argument)仅依赖于中间值和本地存储器的内容,以及每个功能单元按流水线顺序使用nfu最多一次。在一个示例中,程序可以被编译或构造以尝试将尽可能多的指令链接在一起以将性能最大化。通过在第一指令的目的地自变量中声明转发标志并通过在第二指令中声明接收标志代替源地址自变量,可以将一对指令链接在一起。链继续,直到指令没有声明转发,或者nfu中的所有功能单元已经在链中被使用。因此,在这个示例中,在一条指令中声明转发然后在下一指令中不声明接收是违法的(反之亦然)。可以通过其资源要求将指令映射到nfu的功能单元。例如,矩阵-矢量相乘只能在矩阵-矢量单元(mvu)中发生,而矢量-矢量相加只能在多功能单元(mfu)中发生。在该示例中,指令链必须以图4中所示的从左到右流水线顺序使用nfu的功能单元:输入队列(iq)、mvu、然后是每个mfu、然后是输出队列(oq)。然而,在一个示例中,链可以从iq、mvu或第一mfu开始。最后,在这个示例中,需要mfu的链中的第一指令将被映射到mfu0,下一指令将使用mfu1,等等。在这个示例中,这很重要,因为mfu指令所使用的本地存储器是由链中的该指令的深度隐式地设置的,以同时用于存储和加载。大多数指令可以采用相同的自变量的一般集合:源、目的地和可选的第二源。可能还存在可以具体标识目标mfu的一些存储器管理指令,但是通常从指令在链中的位置推断出将执行指令的mfu。每个源和目的地自变量可以使用下面表3中的强类型之一。例如,dst自变量意味着指令的输出可以被转发、全局存储或本地存储,而gdst自变量只能被全局存储。在此示例中,只有采取gsrc的指令才能被附加到链中,并且只有供应dst的指令才能将数据传递到链中。通常,大多数指令可以在链中或以独立模式(全局源和全局目的地)被使用。然而,在此示例中,存储器管理指令(以vrf_开头的那些)不能在链中被使用,并且一些指令(v_pass、v_store)只能在链内被使用。表3节点服务可以使用应用编程接口(api)来与包括控制/标量处理器(csp)和nfu的每个节点通信。api可以被用来向nfu发送指令并接受/制定对网络的请求/响应。节点服务可以从网络接收请求,利用来自请求的自变量启动子例程,然后通过网络发回响应。在该示例中,请求可以包括由csp解译的节点报头以及被转发到nfu的有效负载。同样,传出响应可以具有节点报头和(可选的)有效负载。用于节点的编程模型可以允许子例程采取最多30个运行时自变量。这些自变量可以通过节点报头作为“辅助数据”而被传递给子例程。在一个示例中,可以保留aux[0]以用于选择子例程。在一个示例中,针对运行时自变量的一个常见用途是设置针对给定lstm评估的迭代次数。每个子例程可以是执行矩阵和矢量操作的一系列api调用。这些api调用中的每一个可以对应于nfu指令,并且当csp遇到这些api调用之一时,它可以将该指令发送到nfu。在一个示例中,所有指令可以作用于维度为hwvec_elems的矢量和维度为hwvec_elemsxhwvecv_elems的矩阵。一组辅助函数(如下面的表4中所示)可以被用来在自变量中设置适当的位字段:表4附加地,可以使用三个辅助常数,如下面的表5中所示:next仅设置dst的forward标志prev仅设置gsrc的receive标志acc仅设置dst的store标志(仅与mv_mulapi一起使用)表5子例程之一可以是环回(loopback),其将矢量从输入队列引入到nfu中并将其存储在全局存储器中,然后从全局存储器读取它并通过输出队列将其发送出nfu。示例环回子例程如下面的表6中所示:表6可以通过在发送回输入矢量之前对输入矢量执行逐个元素s形来扩展环回示例。实现此目的的一种方法是在独立模式下调用输入矢量、s形和输出矢量api,如下面的表7中所示:表7上面的表7中的示例不使用任何指令链接,然而可以通过将所有三个操作链接在一起来实现更高的性能。为了实现链接,输入队列、执行s形的mfu和输出队列之间的数据流被分析。关于图4中的示例nfu,链需要通过mvu和流水线中的其他4个mfu传递数据。链接使用较少的周期,因为,作为示例,它避免了通过全局存储器进行多次往返,这在时间消耗方面可能是昂贵的操作。下面的表8示出了已经使用链接进行了优化的子例程的一个示例。表8第二种方法使用更多指令,但也以明显更少的周期执行。注意,第二种方法在其初始使用后丢弃输入矢量和输出矢量二者。如果需要存储这些值以供以后使用,那么可以使用表9中的子例程4。表9用于相加两个矢量的过程建立在用于获取矢量的s形的过程上。主要区别在于相加需要第二输入矢量,在一个示例中,该第二输入矢量必须始终源自于执行相加的mfu的本地存储器。在该示例中,如果第二操作数尚未存在于本地存储器中,那么需要另一指令(例如,vrf_g_i_copy)将其放置在那里。假设表9的子例程4已经执行并且已经在全局地址0中存储了矢量,并且在mfu0的本地地址中该矢量的s形是0,则下面的api调用将那两个矢量相加在一起并将结果存储回全局存储器中。表10如前所讨论的,由使用处理组件的程序所使用的任何矩阵在启动时被预加载,因为在该示例中,花费o(hwvec_elems2)个周期来存储来自节点外部的矩阵,而每个其他操作花费o(hwvec_elems)个周期。还可能期望预加载在整个执行期间保持恒定的偏置矢量集合。以下示例子例程将两个权重矩阵存储在矩阵存储器(mvu内的矩阵寄存器文件)中。然后它加载两个偏置矢量,一个放入到mfu1的本地存储器中,一个放入到mfu2中。表11通过使用具有指令链接的示例子例程,可以改进矢量加载的性能,如下面的表12中所示。表12一旦矩阵和矢量已被预加载,表13是图示出执行如下的示例子例程的示例:v_out=(m[0]*v_in[2]+m[1]*v_in[3]+v_in[0])*v_in[1]。因此,在该示例中,假设已经调用子例程6来预加载m[0]、m[1]、v_in[0]和v_in[1]。表13在一个示例中,mvu特征可以被用来优化表13的子例程8的资源利用,其使用mfu0来对两个mv_mul()结果求和。mvu允许矩阵-矢量乘法的结果被保持在其累加寄存器中而不是输出矢量。如果(通过声明store标志)为mv_mul启用了该特征,则下一个mv_mul的结果将与第一mv_mul的结果求和。在该示例中,为了进行该优化工作,如下面的表14中所示,可以调整子例程6以改为在mfu0和mfu1中存储v_in[0]和v_in[1]。下面的表15示出了使用链接的优化矩阵-矢量子例程。表14表15通过使用避免硬编码的地址转而用具有良好命名的常量来暴露地址的意图的编码和编译器技术,可以对子例程进行附加的改进。此外,可以提供typedef以用于分别用vectornum、matrix和mfu来标识矢量、矩阵和mfu地址。为确保编码中的一致性,可以使用下面的表16中所示的样式:表16在该示例中,必须将在下面的表17中所示的某些地址设置为节点的分布式存储器中的物理地址:表17作为示例,用于具有csp和nfu的节点的lstm评估程序可以包括预加载步骤,之后是评估的若干次迭代,直到产生输出。因此,在该示例中,首先,预加载步骤存储跨nfu的分布式存储器进行评估所需的权重矩阵和偏置矢量。接下来,对于评估的每次迭代,输入矢量到达并通过越来越长的指令链进行处理,直到产生输出。图11示出了根据一个示例的用于神经网络评估的数据流图形1100。在高级别处,在该示例中,加载一个输入矢量(iq_v)并且将其与两个权重矩阵(mv_mul1和4)相乘。历史矢量也与两个其他权重矩阵(mv_mul2和3)相乘。接下来,将一对输入/历史结果的结果求和在一起,另一对输入/历史结果(vv_add1和3)也是如此。在那之后,针对偏置矢量(vv_add2和4)相加每个求和矢量,然后针对s形(v_sigm1和2)应用每个求和矢量。然后将s形结果相乘在一起,并且结果是最终输出(vv_mul和oq_v)。该数据流图形的依赖性分析示出了对于4条指令链的机会。可以使用编译器或类似工具来执行依赖性分析。例如,链a(经由图11中的虚线示出)从输入队列获取其矢量输入,将该矢量存储在gvrf中,然后使用它来针对本地存储器中的矩阵执行mv_mul1。mv_mul的结果也被存储在本地存储器中。在该示例中,链b(经由图11中的虚线示出)可以立即跟随链a通过流水线,因为它从全局存储器获取一个输入(历史矢量),从本地存储器获取针对mv_mul2的矩阵,将针对vv_add1的在本地存储器中的预加载的偏置矢量和针对vv_add2的mv_mul1的本地存储结果相加,并且对vv_add2的结果执行v_sigm1。v_sigm的结果也被存储在本地存储器中,以便于链d(经由图11中的虚线示出)。来自图11的示例数据流图形可以在以下示例子例程中以优化的方式被实现,该示例子例程包括用于lstm初始化的子例程11和用于lstm评估的子例程12。表18表19图12示出了根据一个示例的神经功能单元的指令链的示例处理1200。另外,参考图12,示出了用于子例程12的总执行时间的近似图形。如前所解释的,一旦指令链(链a-d)已经由控制处理器(例如,图3的控制/标量处理器)映射,就以流水线的方式从左到右处理指令(例如,流水线包括图4中所示的mvu和五个mfu)。因此,链a包括在将输入矢量加载到对应于mvu的矩阵寄存器文件之后对mv_mul1指令的处理。链b包括由mvu和mfu0对指令mv_mul2和w_add1的并行处理。同时,使用例如mfu1和mfu2处理w_add2和v_sigm1。链c(其仅包括一个指令——mv_mul3)由mvu处理。最后,链d由整个流水线处理。mvu同时处理mv_mul4和w_add3两者,并且mfu并行处理链d中的剩余指令,包括两个指令v_pass,其简单地将从先前mfu接收的输入传递到下一个mfu或输出队列(oq)。在此示例中,总执行时间主要由mv_mul指令驱动,而其他矢量操作全都通过流水线操作到mv_mul。并且w_add1和w_add3发生在mvu的累加寄存器内。在另一lstm实现中,在由nfu处理矢量数据和标量数据之前,执行两个附加步骤。首先,环路被用来针对每个请求所提供的多次迭代展开lstm。其次,矩阵阻塞被用来将算法矩阵和矢量大小映射到可以具有不同原生大小的处理器。在此示例中,我们具有250的hwvec_elems,而算法输入矢量为大小200,其余算法矢量为大小500,算法输入矩阵为500x200,并且算法历史矩阵为500x500。因此,输入矩阵-矢量相乘被阻塞为两个mv_mul()调用(使用一些零填充),而历史矩阵-矢量相乘被阻塞为四个mv_mul()调用和两个vv_add()调用。作为该示例的一部分,存在三个子例程:一个用以对矩阵集合进行初始化,一个用以对偏置矢量进行初始化,并且一个用以对矢量集合执行lstm评估。作为示例,在启动时,一个使用场景将是在8个矩阵上各自调用矩阵初始化(例如,表20中的子例程13)3次,以加载24个矩阵,然后调用偏置矢量初始化(例如,表21中的子例程14))一次。然后,在运行时,在该示例中,将针对每个查询调用lstm评估(例如,表22中的子例程15)。表20表21表12尽管上述子例程示例提供了用以说明各种实施例的相应指令集,但是相应指令集可以包括更多或更少的指令。另外,可以以不同的顺序执行这些指令。另外,尽管描述了用于配置或控制节点和节点的处理的各种方面的若干参数,但是这些参数仅是示例。附加的或更少的参数可以与本公开中讨论的示例的不同版本一起使用。图13示出了根据一个示例的用于神经网络评估的数据流图形1300。数据流图形1300包括四个指令链:链1、链2、链3和链4。链1包括在对应于神经网络模型的权重(例如,w_xi,其可以对应于神经网络模型)和运行时输入矢量(例如,x)之间执行矩阵相乘操作。链1还包括在输入矢量的过去值(例如,h_prev)和历史权重(例如,w_hi)之间执行矩阵相乘操作。可以使用矢量的逐点加法来相加乘法输出。接下来,作为链1的一部分,可以执行s形操作。作为链2的一部分,可以在遗忘门权重矩阵(例如,w_xf)和运行时输入矢量(例如,x)之间执行矩阵相乘操作。链2还包括在输入矢量的过去值(例如,h_prev)和历史遗忘门权重矩阵(例如,w_hf)之间执行矩阵相乘操作。可以使用矢量的逐点加法来相加乘法输出。接下来,作为链2的一部分,可以将偏置输入矢量(例如,b_i)加到加法操作的输出。接下来,作为链2的一部分,可以执行s形操作。现在转向链3,作为链3的一部分,可以在单元门权重矩阵(例如,w_xc)和运行时输入矢量(例如,x)之间执行矩阵相乘操作。链3还包括在输入矢量的过去值(例如,h_prev)和历史单元门权重矩阵(例如,w_hc)之间执行矩阵相乘操作。可以使用矢量的逐点加法来相加乘法输出。接下来,作为链3的一部分,可以将偏置单元门矢量(例如,b_c)加到加法操作的输出。接下来,作为链3的一部分,可以执行双曲线函数操作。关于链4,可以在输出门加权矩阵(例如,w_xo)和运行时输入矢量(例如,x)之间执行矩阵相乘操作。链4还包括在输入矢量的过去值(例如,h_prev)和历史输出门权重矩阵(例如,w_ho)之间执行矩阵相乘操作。可以使用矢量的逐点加法来相加乘法输出。接下来,作为链4的一部分,可以将偏置输出门矢量(例如,b_o)加到加法操作的输出。接下来,作为链4的一部分,可以执行s形操作。可以对四个链的输出执行附加操作。虽然图13示出了使用一定数目的链执行的一定数目的操作,但是可以使用不同数目的链来执行附加的或更少的操作。图14示出了根据一个示例的如何使用硬件节点(例如,fpga)处理指令链的图。可以使用与先前描述的硬件节点相对应的架构来实现示例处理1400。如经由处理方面1410所示,控制处理器(例如,图3的控制/标量处理器320)可以被配置为接收和解码从队列接收的指令。作为处理方面1410的一部分,处理所接收的指令,使得它们扇出到独立控制队列中,诸如图14中所示的各种队列——作为块1410的一部分。在一个示例中,独立控制队列可以确定神经功能单元的哪个部分(例如,前面描述的任何nfu)得到激活。每个处理单元,包括mvu和mfu,将看到与该单元相关联的控制队列的头部。在该示例中,针对各种处理元件具有独立控制队列可以允许以到链的输入不依赖于来自另一链的输出的程度来并行处理指令链。另外,关于mfu,将基于由相应控制队列发出的相应控制信号来激活各种复用器、控制门或其他类似结构。作为示例,当允许控制对mfu的加法块的输入的复用器通过输入时,mfu的加法块可以经由被输入到硬件节点的比特流接收输入。在一个示例中,比特流可以表示查找表的内容及其连接。在所有矢量都已通过之前,可以不将对数据输入到加法块的队列进行出列。在相应链的执行期间生成的中间输出可以被存储在与相关mvu或mfu相对应的本地矢量寄存器文件中。然后,来自相应链的后续指令可以获取该值以供进一步消费。大多数指令可以包括自变量集合:源、目的地和可选的第二源。每个源和目的地自变量可以使用来自表4的自变量类型之一,如前所述。作为示例,dst自变量意味着指令的输出可以被转发、被全局存储或被本地存储,而gdst自变量意味着指令的输出只能被全局存储(例如,作为相关gvrf寄存器的一部分)。在一个示例中,只有那些可以从gsrc获取输入的指令可以被附加到链中,并且只有那些可以供应dst自变量的指令才能将数据下传到另一链。参考图14中所示的示例,一旦与在判定块1420处的指令相关联的操作码被解码,那么可以确定该指令以哪个目标功能单元为目标。如果指令以输入队列(iq_v(块1412))为目标,并且自变量是dst(块1422),那么硬件节点逻辑可以通过输入队列将下一个矢量移动到nfu中进入到dst中(块1424)。如果与指令相关联的自变量是gdst(全局dst),那么可以按照与gdst相关联的地址将下一个矢量移动到全局寄存器中。如果与指令相关联的自变量是ldst(本地dst),那么可以按照与ldst相关联的地址将下一个矢量移动到本地寄存器中。如果与指令相关联的自变量是fgdst,那么可以按照与fgdst相关联的地址将下一个矢量移动到全局寄存器中。继续参考图14,如果指令以矩阵-矢量相乘单元(mvu)为目标(例如,mv_mul(块1414)),则与硬件节点相关联的逻辑可以采取与从寄存器或指定地址获得的矩阵相乘相关联的步骤。mv_mul指令可以包括将在msrc处的矩阵乘以来自gsrc的矢量并将其递送给dst。本地存储可以在累积寄存器中发生,并且与转发互斥。关于矢量数据的源,作为块1432的一部分,与硬件节点相关联的逻辑可以确定数据源是gsrc还是来自另一矩阵相乘操作的输出(块1438)。取决于源,可以将矢量数据提供给mvu。备选地,如果矢量数据的源是特定地址(例如,op#2x21(块1436)),那么可以从该源加载矢量数据并将其提供给mvu。另外,关于矢量数据的目的地,如果与指令相关联的自变量是gdst(全局dst),那么可以按照与gdst相关联的地址将下一个矢量移动到全局寄存器中。中间结果可以被本地存储在累加器(acc)中。有利地,在一个示例中,可以不将结果存储为中间结果,而是可以将它们直接转发到下一个mvu(如块1440中所示)。如果与指令相关联的自变量是fgdst,那么可以按照与fgdst相关联的地址将下一个矢量移动到全局寄存器中。仍然参考图14,如果指令是s形操作(v_sigm(块1416))并且因此它以mfu中的一个为目标,则与硬件节点相关联的逻辑可以确定以mfu中的哪一个(例如,mfu#0、mfu#1、mfu#2、mfu#3或mfu#4)为目标(块1452)。在该示例中,如图14中所示,该指令针对s形操作以mfu#0为目标。作为块1460的一部分,可以通过与硬件节点相关联的逻辑来完成附加处理。作为示例,在块1462,与硬件节点相关联的逻辑可以确定数据源是gsrc还是来自另一源的输出(块1438)。取决于源,可以从gsrc或其他源提供矢量数据(块1466)。可以对(例如,从gsrc获得的)矢量数据执行逐点s形操作并将其递送到dst。在块1464处,与硬件节点相关联的逻辑可以确定输出的目的地。可以将数据提供给块1468中列出的任何目的地。虽然图14示出了以某种方式链接的与指令相关的某些系列动作,但是可以执行其他动作。另外,数据可以从除图14中描述的源以外的其他源获得,并且可以被提供给图14中描述的目的地以外的其他目的地。图15示出了根据一个示例的用于处理指令的方法的流程图1500。在一个示例中,可以使用包括用于处理指令的流水线的硬件节点来执行该方法,其中流水线可以包括:矩阵矢量单元;第一多功能单元,其中第一多功能单元可以被连接以接收来自矩阵矢量单元的输入;第二多功能单元,其中第二多功能单元可以被连接以接收来自第一多功能单元的输出;以及第三多功能单元,其中第三多功能单元可以被连接以接收来自第二多功能单元的输出。该方法可以包括步骤(例如,步骤1520),包括:经由全局寄存器从输入队列接收第一类型指令,其中第一类型指令只能由矩阵矢量单元执行,并且由矩阵矢量单元执行第一类型指令并将第一类型指令的第一结果存储在至少一个累加器寄存器中。第一类型指令可以是矩阵操作,并且第二类型操作可以是辅助操作中的任何一种,诸如加法、乘法、正切或s形。辅助操作还可以包括nop。硬件节点可以包括前面描述的任何神经功能单元。该方法还可以包括步骤(例如,步骤1530),包括:经由全局寄存器从输入队列接收第二类型指令,其中第二类型指令只能由第一多功能单元、第二多功能单元或第三多功能单元中的至少一个执行,并且使用第一多功能单元执行第二类型指令,其中该执行包括对至少第一类型指令的第一结果执行操作并生成第二结果。在一个示例中,该步骤可以由先前描述的任何nfu执行。在执行指令时,它们可以扇出到独立的控制队列中,并且可以确定nfu的哪个部分得到激活。nfu的每个组件可以访问控制队列的头部并相应地执行操作,例如,相加、相乘、相切、s形或nop。控制队列可以在所有矢量都通过之前不会出列,然后控制队列可以传递给下一个组件。下一步骤(例如,步骤1540)可以包括:在不将第一结果或第二结果存储在全局寄存器中的情况下,将第二结果传递给第二多功能单元,并且在那之后将第二结果传递给第三多功能单元。在没有存储的情况下,传递结果可以包括以mfu为目标,但仅执行无操作。这可以由与硬件节点相关联的逻辑确定。由于不将结果存储在全局寄存器中,因此在执行某些链接指令期间可以消除诸如对全局寄存器的写入之类的昂贵操作。图12的链d是链接在一起的不同类型指令的示例,包括将结果通过两个mfu传递给输出队列。mvu同时处理mv_mul4和w_add3,并且mfu并行处理链d中的剩余指令,包括简单地将从先前mfu接收的输入传递给下一个mfu或输出队列(oq)的两个指令v_pass。在此示例中,总执行时间主要由mv_mul指令驱动,而其他矢量操作都通过流水线操作到mv_mul。而且w_add1和w_add3发生在mvu的累加寄存器内。总之,本公开涉及一种在包括全局寄存器和流水线的硬件节点中用于处理指令的方法,该流水线包括:矩阵矢量单元,该矩阵矢量单元包括至少一个累加器寄存器;第一多功能单元,其中第一多功能单元被连接以接收来自矩阵矢量单元的输入;第二多功能单元,其中第二多功能单元被连接以接收来自第一多功能单元的输出;以及第三多功能单元,其中第三多功能单元被连接以接收来自第二多功能单元的输出。该方法可以包括经由全局寄存器从输入队列接收第一类型指令,其中第一类型指令只能由矩阵矢量单元执行,并且由矩阵矢量单元执行第一类型指令并将第一类型指令的第一结果存储在至少一个累加器寄存器中。该方法还可以包括经由全局寄存器从输入队列接收第二类型指令,其中第二类型指令只能由第一多功能单元、第二多功能单元或第三多功能单元中的至少一个执行,并且使用第一多功能单元执行第二类型指令,其中该执行包括对至少第一类型指令的第一结果执行操作并生成第二结果。该方法可以进一步包括在不将第一结果或第二结果存储在全局寄存器中的情况下,将第二结果传递给第二多功能单元,并且在那之后将第二结果传递给第三多功能单元。在一个示例中,第一多功能单元、第二多功能单元和第三多功能单元中的每一个还可以包括逐点加法块、逐点乘法块、s形块、双曲正切块和无操作块。该方法还可以包括在将第二结果传递给第三多功能单元之后,将第二结果传递给被耦合到流水线的输出队列。第一类型指令可以是矢量类型的指令,第二类型指令可以是标量类型的指令。在该示例中,第一类型指令可以包括存储指示符,该存储指示符使得第一结果被存储在至少一个累加器寄存器中,并且第二类型指令可以包括前向指示符,该前向指示符使得第二结果被传递到流水线的下一个单元。第一类型指令和第二类型指令可以包括指令链。在另一示例中,本公开涉及一种硬件节点,包括全局寄存器和被配置为处理指令的流水线,该流水线包括:矩阵矢量单元,该矩阵矢量单元包括至少一个累加器寄存器;第一多功能单元,其中第一多功能单元被连接以接收来自矩阵矢量单元的输入;第二多功能单元,其中第二多功能单元被连接以接收来自第一多功能单元的输出;以及第三多功能单元,其中第三多功能单元被连接以接收第二多功能单元的输出。硬件还可以被配置为经由全局寄存器从输入队列接收第一类型指令,其中第一类型指令只能由矩阵矢量单元执行,并且由矩阵矢量单元执行第一类型指令并将第一类型指令的第一结果存储在至少一个累加器寄存器中,经由全局寄存器从输入队列接收第二类型指令,其中第二类型指令只能由第一多功能单元、第二多功能单元或第三多功能单元中的至少一个执行,并使用第一多功能单元执行第二类型指令,其中该执行包括对至少第一类型指令的第一结果执行操作,并生成第二结果,并且在不将第一结果或第二个结果存储在全局寄存器中的情况下,将第二结果传递给第二多功能单元并且在那之后将第二结果传递给第三多功能单元。在该示例中,第一多功能单元、第二多功能单元和第三多功能单元中的每一个还可以包括逐点加法块、逐点乘法块、s形块、双曲正切块和无操作块。硬件节点还可以被配置为在将第二结果传递给第三多功能单元之后,将第二结果传递给被耦合到流水线的输出队列。第一类型指令可以是矢量类型的指令,第二类型指令可以是标量类型的指令。在该示例中,第一类型指令可以包括存储指示符,该存储指示符使得第一结果被存储在至少一个累加器寄存器中,并且第二类型指令可以包括前向指示符,该前向指示符使得第二结果被传递给流水线的下一个单元。第一类型指令和第二类型指令可以包括指令链。在又一示例中,本公开涉及一种硬件节点,包括全局寄存器和被配置为处理指令的流水线,该流水线包括:矩阵矢量单元,该矩阵矢量单元包括至少一个累加器寄存器;第一多功能单元,其中第一多功能单元多功能单元被连接以接收来自矩阵矢量单元的输入;第二多功能单元,其中第二多功能单元被连接以接收来自第一多功能单元的输出;以及第三多功能单元,其中第三多功能单元被连接以接收来自第二多功能单元的输出,其中第一多功能单元、第二多功能单元和第三多功能单元中的每一个还包括逐点加法和无操作块中的至少一个。硬件还可以被配置为经由全局寄存器从输入队列接收第一类型指令,其中第一类型指令只能由矩阵矢量单元执行,并且由矩阵矢量单元执行第一类型指令并将第一类型指令的第一结果存储在至少一个累加器寄存器中,经由全局寄存器从输入队列接收第二类型指令,其中第二类型指令只能由第一多功能单元、第二多功能单元或第三多功能单元中的至少一个执行,并使用第一多功能单元执行第二类型指令,其中该执行包括对至少第一类型指令的第一结果执行操作,并生成第二结果,并且在不将第一结果或第二结果存储在全局寄存器中的情况下,将第二结果传递给第二多功能单元并且在那之后将第二结果传递给第三多功能单元。在该示例中,硬件节点还可以被配置为在将第二结果传递给第三多功能单元之后,将第二结果传递给被耦合到流水线的输出队列。第一类型指令可以是矢量类型的指令,第二类型指令可以是标量类型的指令。在该示例中,第一类型指令可以包括存储指示符,该存储指示符使得第一结果被存储在至少一个累加器寄存器中,并且第二类型指令可以包括前向指示符,该前向指示符使得第二结果被传递给流水线的下一个单元。第一类型指令和第二类型指令可以包括指令链。应该理解,本文所描绘的方法、模块和组件仅是示例性的。备选地或另外,本文中功能性地描述的内容可以至少部分地由一个或多个硬件逻辑组件执行。例如但不限于,可以使用的说明性类型的硬件逻辑组件包括现场可编程门阵列(fpga)、专用集成电路(asic)、专用标准产品(assp)、片上系统(soc)、复杂可编程逻辑器件(cpld)等。在抽象但仍然明确的意义上,实现相同功能性的任何组件布置被有效地“关联”,使得实现期望的功能性。因此,本文组合以实现特定功能性的任何两个组件可以被视为彼此“相关联”,使得实现期望的功能性,而不管架构或中间组件如何。同样地,如此相关联的任何两个组件也可以被视为彼此“可操作地连接”或“耦合”以实现期望的功能性。与本公开中描述的一些示例相关联的功能性还可以包括被存储在非瞬态介质中的指令。本文使用的术语“非瞬态介质”是指存储使机器以特定方式操作的数据和/或指令的任何介质。示例性非瞬态介质包括非易失性介质和/或易失性介质。非易失性介质包括例如硬盘、固态驱动器、磁盘或磁带、光盘或光带、闪存、eprom、nvram、pram或其他此类介质、或这种介质的联网版本。易失性介质包括例如动态存储器诸如dram、sram、高速缓存或其他这样的介质。非瞬态介质不同于传输介质,但可以与传输介质结合使用。传输介质被用于向机器传递数据和/或从机器传递指令。示例性传输介质包括同轴电缆、光纤电缆、铜线和诸如无线电波之类的无线介质。此外,本领域技术人员将认识到,上述操作的功能性之间的界限仅仅是说明性的。多个操作的功能性可以被组合成单个操作,和/或单个操作的功能性可以被分发在附加操作中。此外,备选实施例可以包括特定操作的多个实例,并且可以在各种其他实施例中更改操作的顺序。尽管本公开提供了具体示例,但是在不脱离如下面的权利要求中阐述的本公开的范围的情况下,可以进行各种修改和改变。相应地,说明书和附图应被视为说明性而非限制性意义,并且所有这些修改旨在被包括在本公开的范围内。本文关于特定示例描述的对问题的任何益处、优点或解决方案不旨在被解释为任何或所有权利要求的关键的、必需的或必要的特征或元素。此外,如本文所使用的术语“一”或“一个”被定义为一个或多于一个。而且,在权利要求中使用诸如“至少一个”和“一个或多个”之类的引入短语不应被解释为暗示:由不定冠词“一”或“一个”对另一权利要求元素的引入将包含这种引入的权利要求元素在内的任何特定权利要求限制为仅包含一个这样的元素的发明,即使相同的权利要求包括引入短语“一个或多个”或“至少一个”和诸如“一”或“一个”的不定冠词。对于使用定冠词的情况也是如此。除非另有说明,否则诸如“第一”和“第二”之类的术语被用来在这些术语所描述的元素之间进行任意区分。因此,这些术语不一定旨在表示这些元素的时间或其他优先次序。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1