神经网络硬件的制作方法

文档序号:18198969发布日期:2019-07-17 06:02阅读:263来源:国知局
神经网络硬件的制作方法

本公开涉及神经网络硬件。



背景技术:

本发明涉及用于实施具有卷积层的深度神经网络的硬件,以及用于以硬件的方式实施具有卷积层的深度神经网络的方法。

深度神经网络(dnn)是在输入层和输出层之间具有多层的一种类型的人工神经网络。dnn可以用于机器学习应用。具体而言,深度神经网络可以用于信号处理应用,信号处理应用包括图像处理应用和计算机视觉应用。

dnn通常在功率资源不是重要因素的应用中实施。尽管如此,dnn在许多不同的技术领域中都有应用,其中用于实施dnn的硬件的资源使得功耗、处理能力或硅面积受到限制。此外,用于特定应用的dnn的限定可能随着时间而变化——例如,由于dnn的额外训练。

dnn通常包括卷积层,在该卷积层处向数据集的窗口应用滤波。具体而言,卷积神经网络(cnn)是包括一个或多个卷积层的一类dnn,并且通常应用于分析图像数据。根据应用,卷积层处的滤波和窗口的数量在不同的dnn之间可能发生巨大变化。

需要用于在dnn中以灵活且可伸缩的方式在各种各样的不同dnn架构上高效地执行卷积操作的一种系统。



技术实现要素:

本发明内容被提供用于介绍对以下具体实施方式中进一步描述的概念的选择。本发明不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于限制所要求保护的主题的范围。

提供了一种用于实施深度神经网络(dnn)的硬件,所述深度神经网络具有卷积层,所述硬件包括多个卷积引擎,每个卷积引擎能够操作以通过向数据窗口应用滤波来执行卷积操作,每个滤波包括用于与数据窗口的相应的数据值组合的权重的集合,并且所述多个卷积引擎中的每个卷积引擎包括:乘法逻辑,其能够操作以将滤波的权重与数据窗口的相应的数据值组合;控制逻辑,其被配置为:接收配置信息,所述配置信息标识用于在所述多个卷积引擎处的数据窗口的集合上操作的滤波的集合;使用所述配置信息来确定卷积操作的序列,以用于在所述乘法逻辑处进行评估;根据所确定的卷积操作的序列,请求权重和数据值,以用于至少部分地向数据窗口应用滤波;并且使得所述乘法逻辑将所述权重与其相应的数据值组合;以及累加逻辑,其被配置为将由所述乘法逻辑执行的多个组合的结果累加,以便形成所确定的序列的卷积操作的输出。

所述多个卷积引擎中的每个卷积引擎可以被布置为独立地执行不同序列的卷积操作,使得所述卷积引擎共同地向数据窗口的集合中的每个数据窗口应用滤波的集合。

所述多个卷积引擎中的每个卷积引擎可以被配置为独立地请求下一个卷积操作的权重和数据值,并且使得其乘法逻辑开始下一个卷积操作,而不管所述卷积引擎中的其他卷积引擎是否已经完成其当前的卷积操作。

所述配置信息包括滤波的集合中的滤波的数量和数据窗口的集合中的数据窗口的数量;并且所述控制逻辑可以被配置为使用所述配置信息来确定卷积操作的序列,并且卷积引擎的数量被布置为向所述数据窗口的集合应用所述滤波的集合。

所述硬件可以被布置为执行卷积操作的预定序列,每个卷积操作由指数标识,根据所述指数每个下一个卷积操作通过使所述指数递增来标识,并且在完成卷积操作时,每个卷积引擎被可以被配置为通过使其当前卷积操作的指数递增根据所述卷积引擎的数量而得出的步长值来确定其下一个卷积操作,使得在每个卷积引擎处执行的所述卷积操作的序列也被预先确定。

所述步长值可以是卷积引擎的数量。

所述滤波的集合可以被布置为在所述数据窗口的集合中的每个集合上以固定的序列执行以便形成卷积操作的预定序列,并且所述控制逻辑可以被配置为通过根据所述预定确定序列确定每个下一个卷积操作的滤波和数据窗口来确定该下一个卷积操作的权重和数据值。

所述控制逻辑被配置为:在所述乘法逻辑完成其当前权重和数据值的组合之前请求下一个权重和数据值。

所述配置信息可以在硬件处理开始时在每个卷积引擎处被接收,由所述配置信息标识的数据窗口的集合和应用于数据窗口的集合的滤波的集合是完整的滤波的集合和完整的数据窗口的集合,以用于由所述硬件处理中的所述硬件的所述多个卷积引擎进行评估。

每个卷积引擎可以被配置为:标识所请求的权重中的零权重,并且对于每个权重以及其相应的数据值,使得所述乘法逻辑仅在所述权重为非零时将所述权重与其相应的数据值组合。

每个卷积引擎还可以被配置为:标识所请求的数据值中的零数据值,并且对于每个权重以及其相应的数据值,使得所述乘法逻辑仅在所述权重和所述数据值为非零时将所述数据值与其相应的权重组合。

所述硬件还可以包括输入数据逻辑,所述输入数据逻辑用于控制一个或多个输入缓冲器,所述一个或多个输入缓冲器被布置为存储所述多个卷积引擎所需的所述数据窗口的数据值,所述输入数据逻辑被配置为对来自每个卷积引擎的数据值的请求做出响应。

在数据值的每个请求中,每个卷积引擎的控制逻辑被配置为标识所述数据值所关于的所述数据窗口和所述权重所关于的所述滤波,并且所述输入数据逻辑被配置为在使用该数据窗口的最终卷积引擎根据卷积操作的预定序列来请求该数据窗口的最终数据值和最终滤波的最终权重时,根据卷积操作的预定序列用下一个数据窗口替换该数据窗口。

根据第二方面,提供了一种用于以硬件的方式实施深度神经网络(dnn)的方法,所述深度神经网络具有卷积层,所述硬件包括多个卷积引擎,每个卷积引擎能够操作以通过向数据窗口应用滤波来执行卷积操作,并且每个滤波包括用于与数据窗口的相应的数据值组合的权重的集合,所述方法包括在所述多个卷积引擎中的每个卷积引擎处:接收配置信息,所述配置信息标识用于在所述多个卷积引擎处的数据窗口的集合上操作的滤波的集合;使用所述配置信息来确定卷积操作的序列,以用于在所述卷积引擎处进行评估;根据所确定的卷积操作的序列,请求权重和数据值,以用于至少部分地向数据窗口应用滤波;对于每个所接收的权重及其相应的数据值,将所述权重乘以其相应的数据值;以及将多个乘法逻辑的结果累加,以便形成所确定的序列的卷积操作的输出。

所述的方法还可以包括使得所述多个卷积引擎中的每个卷积引擎独立地执行不同序列的卷积操作,使得所述卷积引擎共同地向数据窗口的集合中的每个数据窗口应用滤波的集合。

由所述多个卷积引擎中的每个卷积引擎执行的请求包括独立地请求下一个卷积操作的权重和数据值,并且开始所述下一个卷积操作的权重和数据值的相乘,而不管所述卷积引擎中的其他卷积引擎是否已经完成其当前的卷积操作。

所述配置信息可以包括滤波的集合中的滤波的数量和数据窗口的集合中的数据窗口的数量;并且确定过程包括使用所述配置信息来确定卷积操作的序列,并且卷积引擎的数量被布置为向所述数据窗口的集合应用所述滤波的集合。

所述卷积操作可以被布置为按预定序列,并且每个卷积操作由指数标识,根据所述指数每个下一个卷积操作通过使所述指数递增来标识,并且确定过程包括:在卷积引擎完成其卷积操作时,通过使其当前卷积操作的指数递增根据所述卷积引擎的数量而得出的步长值来确定其下一个卷积操作,使得在每个卷积引擎处执行的所述卷积操作的序列也被预先确定。

所述步长值可以是卷积引擎的数量。

所述滤波的集合可以被布置为在所述数据窗口的集合中的每个集合上以固定的序列执行以便形成卷积操作的预定序列,并且确定过程可以包括通过根据所述预定确定序列确定所述下一个卷积操作的滤波和数据窗口来确定每个下一个卷积操作的权重和数据值。

可以在完成当前权重和数据值的相乘之前执行请求下一个权重和数据值。

所述方法还可以包括:在所述多个卷积引擎中的每个卷积引擎处,标识所请求的权重中的零权重,并且对于每个权重以及其相应的数据值,相乘过程可以包括仅在所述权重为非零时将所述权重乘以其相应的数据值。

所述方法还可以包括:在所述多个卷积引擎中的每个卷积引擎处,标识所请求的数据值中的零数据值,并且对于每个权重以及其相应的数据值,相乘过程可以包括仅在所述权重和所述数据值为非零时将所述数据值乘以其相应的权重。

硬件可以被配置为执行本文所述的方法中的任一项。

所述硬件可以被包含在集成电路上。

提供了一种使用集成电路制造系统来制造如本文所述的硬件的方法。

提供了一种使用集成电路制造系统来制造如本文所述的硬件的方法。所述方法包括:使用布局处理系统处理图形处理系统的计算机可读描述,以便生成包含硬件的集成电路的电路布局描述;以及使用集成电路生成系统来制造根据电路布局描述的硬件。

提供了一种用于执行本文所述的方法中的任一项的计算机程序代码。提供了一种非暂时性计算机可读存储介质,其上存储有计算机可读指令,当在计算机系统处执行时,所述计算机可读指令使得所述计算机系统执行本文所述的方法中的任一项。

提供了一种集成电路限定数据集,当在集成电路制造系统中进行处理时,所述集成电路限定数据集将所述集成电路系统配置为本文所述的硬件。

提供了一种非暂时性计算机可读存储介质,其上存储有计算机可读存储介质,当在集成电路制造系统中进行处理时,使得所述集成电路系统制造包含所述硬件的集成电路。

提供了一种非暂时性计算机可读存储介质,其上存储有计算机可读存储介质,当在集成电路制造系统中进行处理时,使得所述集成电路系统制造包含所述硬件的集成电路。

提供了一种计算机可读存储介质,其上存储有如本文所述的硬件的计算机可读描述,当在集成电路制造系统中进行处理时,使得所述集成电路制造系统:使用布局处理系统处理图形处理硬件的计算机可读描述,以便生成包含硬件的集成电路的电路布局描述;以及使用集成电路生成系统来制造根据电路布局描述的硬件。

提供了一种被配置为制造如本文所述的硬件的集成电路制造系统。

提供了一种集成电路制造系统,包括:非暂时性计算机可读存储介质,其上存储有如本文所述的硬件的计算机可读描述;布局处理系统,其被配置为处理计算机可读描述,以便生成包含所述硬件的集成电路的电路布局描述;以及集成电路生成系统,其被配置为制造根据所述电路布局描述的硬件。

附图说明

参考附图通过示例的方式对本发明进行描述。在附图中:

图1显示了用于卷积神经网络中的数据的结构的示例;

图2是用于实施深度神经网络的硬件的示意图;

图3是图2的硬件的神经元引擎的示意图;

图4是图2的硬件的权重缓冲器的示意图;

图5示出了向神经元引擎分配窗口和滤波的第一示例性配置;

图6示出了向神经元引擎分配窗口和滤波的第二示例性配置;

图7是示出神经元引擎对权重和数据值的示例性操作的流程图;

图8是示出图2的硬件的示例性操作的流程图;

图9是集成电路制造系统的示意图。

具体实施方式

以下描述通过示例的方式给出,以使本领域技术人员能够制造和使用本发明。本发明不限于本文所述的实施例,并且对本领域技术人员而言,对所公开的实施例的各种修改将是显而易见的。仅通过示例的方式来描述实施例。

在本文所提供的示例中,本发明针对卷积神经网络(cnn)进行描述。卷积神经网络是一种类型的深度神经网络。将理解的是,本发明不限于在卷积神经网络中使用,并且可以用于包括卷积层的任何种类的深度神经网络。

在图1中示出了cnn中所使用的数据的格式的示例性概述。如图1中可以看出,cnn中所使用的数据的格式可以由多个平面形成。输入数据可以被布置为p个数据平面,其中每个平面具有维度x×y。cnn包括多个层,其中的每个层具有与之相关联的多个滤波w0...wn。滤波w0…wn均具有维度m×n×p并且根据在方向s和t上跨多个步骤的卷积操作应用于输入数据,如图1中所示的。

如上所述,每个层可以具有与之相关联的多个滤波w0...wn。如本文所使用的,滤波也可以被称为权重、滤波权重或系数。滤波可以包括m×n×p权重和偏置值。滤波权重的数量和值可以在层之间变化,使得对于第一层,权重的数量可以被限定为并且对于第二层,权重的数量可以被限定为其中第一层中的权重的数量是n1并且第二层中的权重的数量是n2。

对于cnn的多个卷积层,该层的输入数据通过使用与该层相关联的权重对该层的输入数据进行卷积来处理。对于第一层,“输入数据”可以被认为是对cnn的初始输入,这在一些示例中可以是图像——例如,其中cnn正被用于视觉应用。第一层处理输入数据,并生成被传递到第二层的第一组中间数据。第一组中间数据也可以采用多个数据的平面的形式。第一组中间数据可以被认为是形成第二层的输入数据的,第二层处理第一中间数据以采用第二中间数据形式生成输出数据。在cnn包含第三层的情况下,第三层接收第二中间数据作为输入数据,并处理该数据以产生第三中间数据作为输出数据。因此,本文对输入数据的引用可以被解释为包括对任何层的输入数据的引用。例如,术语输入数据可以指代中间数据,中间数据是特定层的输出和对后续层的输入。重复该操作,直到最终层产生可以被认为是cnn的输出的输出数据。

注意,cnn的层仅指代在操作神经网络时执行的处理的逻辑阶段,并且并不意味着被配置为执行神经网络的硬件是根据层模型布置的,或者上面讨论的逻辑层的输入和输出是可在数据流中通过硬件识别的。

cnn的硬件实施方式

图2示出了被配置为实施cnn的示例性硬件实施方式200。图2显示了与本发明一起使用的硬件的仅一个示例:一般而言,本发明可以与适合于实施cnn的硬件的任何配置一起使用。

图2中所示的硬件实施方式包括数字逻辑电路,该数字逻辑电路被配置为接收数据,所述数据限定要实施的cnn并且被配置为根据该数据限定进行操作以处理输入数据以便实施cnn。因此,硬件实施方式可以被认为是用于实施一个或多个cnn的可配置硬件。以这种方式,本文对cnn的硬件实施方式的引用是对硬件的引用,该硬件被配置为通过根据所接收的配置数据对输入数据进行操作来实施cnn。更一般地,硬件可以利用卷积层实施dnn。硬件实施方式本身不一定被配置为实施特定的cnn,并且也不一定用cnn的特定配置数据进行加载。例如,cnn的硬件实施方式不需要包括预先加载(或硬编码)的权重数据和层限定。因此,硬件实施方式被配置为基于其接收的配置数据来实施任何cnn。如此,配置数据(本文也被称为命令数据)限定要实施的特定cnn,其包括要包括的层数和权重数据的大小和值,以及输入数据的预期格式。

限定cnn以及如何处理cnn的数据可以包括配置(或命令)数据、权重数据和输入数据。因此,硬件实施方式被配置为使用权重数据来处理输入数据,以便执行由cnn限定的操作。在图2中所示的示例中,硬件实施方式200包括存储器接口210、输入缓冲器控制器215、命令解码器220、输入缓冲器235、交叉开关242,n个权重缓冲器240,n个神经元引擎245、宽度转换器250、激活模块255、归一化模块265、共享缓冲器270和池化模块275。

存储器接口210被配置为在硬件实施方式200和外部存储器(未示出)之间提供接口。外部存储器可以被认为是硬件实施方式200的单独模块,或者可以被认为是与硬件200集成在一起的。例如,命令或配置数据可以包括关于权重数据的大小和/或格式以及输入数据大小和格式以及它们在外部存储器中的位置的信息。

存储器接口210被配置为从外部存储器接收要在cnn内的计算中使用的权重和数据,以及用于控制硬件实施方式200的操作的命令信息。所接收的权重(本文也被称为系数)被提供给权重缓冲器240,并且所接收的数据被传递到输入缓冲器控制器215。所接收的命令被传递到命令解码器220,命令解码器220进而被配置为对命令进行解码,并且随后向硬件实施方式的元件(包括输入缓冲器控制器215和神经元引擎)发出控制信息,以便控制对权重和输入数据的处理。

输入缓冲器235被布置为向神经元引擎245提供输入数据,并且权重缓冲器240被布置为借助于交叉开关242向神经元引擎提供权重数据,交叉开关242是允许神经元引擎245中的每个神经元引擎访问权重缓冲器中的任何权重缓冲器中的数据的互连的示例。权重缓冲器和神经元引擎的操作在下面更详细地描述。

来自神经元引擎的完整结果由宽度转换器250分组在一起,并按顺序提供给激活模块255。激活模块被配置为针对给定的硬件通路执行适合于cnn的激活层的激活函数。宽度转换器是卷积输出逻辑的示例,其提供来自dnn的卷积层的输出值。

激活模块255可以被配置为借助于查找表来执行激活函数。例如,表示激活函数的查找数据可以存储在查找表处,以便允许通过在查找表中向上查找所接收的输入值来确定所接收的输入值的激活函数的至少近似值。例如,存储在查找表中的数据点之间的激活函数所处的值可以通过在所存储的数据点之间进行插入(例如,线性或二次插入)或通过评估表示激活函数的总限定范围的某个部分上的激活函数的所存储的曲线区段来建立。

在其他示例中,激活函数可以直接在被布置为执行激活函数的适合的硬件逻辑处进行评估。

硬件实施方式200还可以包括归一化模块265和池化模块275,归一化模块265和池化模块275被配置为经由共享缓冲器270共享数据,共享缓冲器270接收激活模块255的输出。归一化模块可以被配置为对共享缓冲器中的数据执行一个或多个归一化函数。池化模块可以被配置为对共享缓冲器中的数据执行一个或多个池化函数——例如,在为cnn的每个层限定的滑动窗口内执行的最大计算或平均计算。

存储在共享缓冲器270中的结果被传递给存储器接口210,存储器接口210可以将结果存储在外部存储器中,或者将结果传递回输入缓冲器中以进行进一步处理,而不必首先向外传递到外部存储器。

共享缓冲器270允许由激活模块输出的值被缓冲,直到正确的样本可用于输出和/或执行归一化和/或池化。以这种方式使用,共享缓冲器提供了存储效率,因为在许多实施方式中,归一化和池化不会在同一过程中组合。此外,共享缓冲器的使用允许执行归一化和池化的顺序适合于在硬件200处实施的cnn。此外,通过提供共享缓冲器270,激活函数、归一化函数和池化函数可以背对背地执行,而不必从外部存储器检索数据。

卷积神经网络中的稀疏性

在cnn中,权重和输入数据经常为零。由于在对输入数据操作cnn之前在映射期间中被插入,权重通常为零。包含大量零的权重和输入数据集可以被认为是稀疏的。在卷积层中,输入值乘以它们相应的权重。因此,卷积层中的大量操作可能产生零输出。通过跳过(即不执行)这些“乘以零”操作,可以提高系统的性能。

例如,由于以下原因,可以在映射过程期间人工插入零权重:

·深度可分离卷积

可分离滤波的第一部分只能在单个平面上操作,因此如果将它们映射为正常卷积,则对于与所有不相关输入平面相关的权重,插入零权重。

·带孔卷积

带孔卷积操作通常使用以规则间隔(空洞)间隔开的输入值。当这些操作被映射为正常卷积时,对于与未使用的窗口内的输入数据值相关的权重,插入零权重。

·算到封装平面的数量

当算到在内部存储器中交错在一起的平面的数量或在输入缓冲器中封装在一起的平面的数量时,插入零权重以对应于无效的平面。

·权重量化

当将权权重化到特定位深度下的不动点时,一些权重可能变为零。当用于权重的位深度减少时,由该过程引入的零的数量增加。这可以被认为是“隐性修剪”。

·零修剪

零剪枝是可以在映射期间执行的过程,其中非常小的非零权重可以被设置为零,以便在不显著影响网络准确度的情况下增加稀疏性。当cnn的硬件实施方式被配置为跳过输入数据乘以权重为零的权重时,通过对权重执行修建可以获得显著的性能优势。

通常,大多数权重稀疏性是人工引入权重数据集的。

输入数据中的稀疏性可能由于以下原因出现:

·激活函数

在relu激活层之后,数据稀疏性通常较高,因为这个函数将所有负值钳位为零。其他激活函数(例如tanh和sigmoid)通常不会增加数据稀疏性。

·池化

在最大池化或平均池化层之后,数据稀疏性通常较低,因为这些操作减少了数据中存在的零的数量。

·数据量化

当在特定的位深度下将数据转换为定点格式时,一些小值可以变为零。所使用的位深度越低,可能引入数据的零越多。

·遵循滤波操作

在权重为零的情况下,滤波操作的输出将为零。结果,已经通过一个或多个卷积滤波的卷积层的输入数据可以显示出高稀疏性。

神经元引擎

利用cnn的硬件实施方式中的稀疏性,以便减少硬件需要执行的计算次数,并且从而提高其表观性能或允许用较少的逻辑元件实现的类似水平的性能,将是有利的。现在将针对上面提供的cnn的硬件实施方式的概述描述神经元引擎方法,并针对图2对其进行描述。本文所述的神经元引擎是用于通过对数据窗口的数据值操作滤波的权重来执行卷积操作的卷积引擎的示例。

图3示出了如图2中所示的神经元引擎245。每个神经元引擎245可以包括乘法逻辑309和累加器312,以及控制块304,该控制块304被配置为基于一个或多个稀疏性映射选择哪些数据和权重元素来进行操作。乘法逻辑被配置为将权重与其相应的数据值组合以便至少部分地执行卷积操作。这样的组合包括:可选地用偏移量、数字格式之间的转换或其他操作,将权重与数据值相乘。神经元引擎至少基于权重数据的稀疏性映射来选择哪些数据和权重元素来进行操作。神经元引擎还可以基于输入数据的稀疏性映射选择哪些数据和权重元素来进行操作。每个神经元引擎可以在多个时钟周期内执行单个神经元计算,其中神经元可以被限定为生成单个输出元素所需的计算。神经元是卷积操作的示例,其包括在数据窗口上操作滤波。神经元引擎被配置为每次在单个滤波和单个卷积窗口上进行操作,并且可以每循环执行1次乘法直到该神经元完成,此时其生成单个输出元素。然后,神经元引擎可以开始处理另一个神经元,这可以在不同的滤波和/或窗口上进行操作。

在一些实施方式中,神经网络可以包括多个乘法器和加法器树,该加法器树被布置为在累加之前对来自乘法器的输出求和,以便形成卷积计算的结果。由于每个累加器有更多的乘法器,这可以给出单位面积的提高性能,但也增加了选择要乘的非零值的某些复杂性。

输入数据301从输入缓冲器235被接收到神经元引擎中,并且输入数据301被保持在输入寄存器305处。权重数据302从权重缓冲器240(经由交叉开关242)被接收到神经元引擎中,并且权重数据302被保持在权重寄存器306处。控制块304被配置为通过请求根据要操作的卷积窗口的数据以及根据要在那些卷积窗口上执行的滤波的权重来控制被接收到相应寄存器305和306中的数据和权重数据。控制块从命令解码器220接收配置信息,命令解码器220指示神经元引擎要在哪些滤波和窗口上进行操作。控制块可以接收配置信息,例如:要在卷积窗口上执行的滤波的数量;每个滤波的权重数量(与3d窗口大小相同);要在平面上执行的窗口数量(其可以从数据集的x,y,p维度和m,n窗口大小以及s,t步长得出);每个窗口的大小(与每个滤波的权重数量相同)。

在一些示例中,在控制块被配置为请求其下一个滤波和/或窗口的情况下是有利的——例如,在完成滤波操作时,或者与执行当前滤波操作同时进行,使得只要神经元引擎完成其当前滤波操作,则下一个滤波的权重和/或下一个窗口的数据就是可用的。以这种方式,神经元引擎可以以一定速度通过滤波和窗口的列表工作,在所述速度下其可以在窗口上执行每个滤波操作。由于处理给定滤波/窗口组合所需的时间取决于权重和输入数据的稀疏性(见下文),这使得不同的神经元引擎能够以他们的最大速率工作,而不必等待其他神经元引擎完成它们的任务。配置每个神经元引擎以请求其下一个滤波/窗口组合还避免了对用于将工作分配给神经元引擎的高级调度器的需要。

当每个神经元引擎被配置为请求工作时,在卷积层中的窗口上执行滤波的特定顺序是在命令解码器220的控制之下的。命令解码器经由存储器接口210从存储器接收命令流。通过生成适合的命令流,可以对针对cnn的卷积层执行滤波和窗口的顺序进行控制,并且因此可以确保特定组的神经元引擎在相似的时间对相关的滤波/窗口组合进行操作,使得这些计算的结果能够在宽度转换器250处一起获得,以便在激活模块255处进行处理。可以在使用cnn之前确定要在窗口上执行滤波的最佳顺序——例如,通过使用在数据处理系统上运行的配置软件,在该数据处理系统处提供硬件实施方式的实例化。

在其他实施例中,可以提供调度器来将权重和数据推送到神经元引擎以进行处理,而不是请求工作的神经元引擎。

神经元引擎245可以一次处理单个神经元,其中神经元被限定为应用于数据中的单个窗口位置的单个滤波,并返回单个结果值(在滤波被划分的情况下是完整的累加或部分的累加)。每个神经元可以通过标识特定窗口的指数和标识要应用于窗口的特定滤波的指数来标识,例如{window_index,filter_index}。神经元引擎接收与特定神经元有关的数据301和权重302的集合,并且通过这些工作。寄存器305和306的大小可以根据每个神经元引擎所消耗的电路面积、它们的功耗、性能等之间的期望平衡来选择。对于典型的应用,寄存器305和306的大小可能不足以容纳限定窗口的输入数据的完整集合以及用于对该输入数据进行操作的对应权重的完整集合。在这种情况下,将需要从输入缓冲器多次提取输入数据和从权重缓冲器多次提取权重,以便处理整个神经元。

理论上,可以在硬件实施方式200中包括任何数量的神经元引擎,从而允许以精细的粒度来缩放设计。此外,与cnn的其他单片硬件实施方式不同,增加更多的计算单元(神经元引擎)不会减少计算单元的使用,因此设计可以潜在地缩放到更大的尺寸,而不会引起效率损失。激活模块255、归一化模块265和池化模块275的吞吐量可以独立于神经元引擎的数量进行缩放。

稀疏性映射

控制块304可以被配置为识别每个输入数据或其相应权重是否为零。如果输入数据或其相应的权重为零,则跳过数据-权重对,并且不对其进行处理。下一个非零操作可以替代地在相同的周期上执行。这可以通过使用多路复用器307和308来实现,多路复用器307和308被配置为仅在数据和权重均为非零的那些数据-权重对上传递到乘法逻辑309(在这种情况下是乘法器)。如果稀疏性高,则可以跳过许多操作,并且可以大大减少处理神经元所花费的周期的数量。

该控制块可以被配置为借助于为输入数据和/或权重提供的稀疏性映射来识别每个数据-权重对是否包括零值。稀疏性映射可以是二进制串,该二进制串指示在提供到神经元引擎的输入数据或权重值的有序序列中哪些值(例如,输入值或权重)为零。在稀疏性映射中,根据稀疏性映射所关联的数据类型,每个相应的数据元素(例如,输入值或权重)可能有一个位。输入数据的稀疏性映射可以由输入缓冲器235提供输入数据301。权重的稀疏性映射可以由相应的权重缓冲器240提供权重302。通过组合稀疏性映射对,控制块可以容易地确定哪些数据-权重对包括零值。

在一些示例中,可以响应于加载到寄存器305/306中的数据/权重值而在神经元引擎处生成稀疏性映射——例如,寄存器中的零值可以借助于神经元引擎处的逻辑来检测,并且响应于检测每个零值,设置表示寄存器中零的位置的稀疏性映射的对应位。在一些示例中,不生成与权重/输入数据不同的稀疏性映射,并且控制块从控件提供每个权重-数据值对以在乘法逻辑处进行评估的点处的权重/数据值本身确定每个权重/数据值是否为零。

在一些实施方式中,可以以压缩格式将权重提供给神经元引擎,其中去除了零。当以压缩形式将权重提供给权重缓冲器时,这避免了为稀疏性而解包权重的需要。然后可以使用权重稀疏性映射来确保每个输入数据由相应的权重操作,其中输入数据稀疏性映射指示神经元引擎将要在其上操作的下一个非零值对。输入数据被未压缩(即,包括零)地存储在寄存器305中。通常,从缓冲器大小的角度压缩寄存器中保存的数据没有好处,因为(不同于权重数据)数据的稀疏性事先是未知的,所以无论如何都需要提供足够大的缓冲器来存储未压缩的数据。而且,这些数据需要作为3d数据集进行随机访问,如果数据被压缩地存储,那么实现这些数据将更加困难。

由于在配置和优化网络时已知神经网络的权重数据(通常权重是为训练的神经网络上的滤波所生成的),因此权重数据的稀疏性映射可以预先计算并将其与权重一起存储在存储器中(参见对权重数据打包的以下讨论)。然而,输入数据是未知的直到神经网络运行时。输入数据的稀疏性映射可以沿着输入数据到dnn的数据路径在任何合适的点处形成。例如,在支持硬件实施方式200的数据处理系统处运行的实体可以被配置为生成输入数据的稀疏性映射并将稀疏性映射存储在存储器中,以供输入数据模块230随后使用。在其他示例中,输入数据的稀疏性映射可以在硬件实施方式200中生成——例如,输入缓冲控制器215可以被配置为对接收到的用于在输入缓冲器235处存储的输入数据生成稀疏性映射。

上述方法意味着处理每个神经元所需的时间根据针对该神经元的输入数据的稀疏性和权重而变化。总的来说,通过不评估在寄存器305和306处保持的零值,改进了性能并且降低了功耗。

输入缓冲器控制器可以被配置为生成提供给神经元引擎的输入数据的稀疏性映射。如果外部存储器中的数据以压缩形式存储,则可以提供解压缩块以在数据被写入输入缓冲器235之前对其进行解压缩。类似地,可以提供额外的压缩块来压缩经由存储器接口210写回外部存储器(例如,由宽度转换器或用于写出到存储器的共享缓冲器提供的)的输出数据。

在图7中显示了示出被配置为跳过零权重或数据值的乘法的神经元引擎的操作的流程图。神经元引擎接收(701)足以至少部分地评估神经元的权重和数据值。神经元引擎还可以接收标识零权重和/或零数据值的稀疏性数据。神经元引擎在所接收的权重和数据值中标识(702)零权重和可选地标识零数据值。神经元引擎被配置为:仅在权重和/或数据值为非零的情况下,并且可选地仅在权重和数据值均为非零的情况下,将权重和数据值对传递到乘法逻辑以用于处理703。以这种方式,跳过了权重和数据值中的一个或两个为零的空操作。

所执行的乘法操作的结果被累加704,以便形成神经元的输出。给定的神经元可以采取多次处理以在神经元引擎处进行评估,其中关于神经元的每个部分累加可用于后续处理(例如,在未来的硬件处理中)。关于给定的神经元所执行的每一次处理可以或可以不在同一神经元引擎上。

神经元分配

每个神经元引擎包括控制块304,控制块304被配置为请求输入数据和权重值以相乘和累加,以便基于与输入数据和权重相关联的稀疏性映射来评估神经元。每个神经元引擎可以通过在一个或多个窗口的集合上操作一个或多个滤波的集合来独立地工作,以便评估神经元的序列。每个神经元引擎通过神经元序列进展的速率独立于其他神经元引擎。因此,允许不同的神经元引擎245彼此运行不同步,使得每个神经元引擎可以在完成当前一个神经元之后立即开始处理下一个神经元,而不等待其他神经元引擎在它们的处理中处于同一点。每个神经元引擎可以处理确定性的神经元序列。

每个神经元引擎可以被配置为一旦神经元引擎完成其当前神经元就请求其下一个神经元,并且提供给命令解码器220的命令流可以被布置为确保神经元始终可用于神经元引擎(直到该神经元引擎/所有神经元引擎的神经元序列用尽为止),以便避免神经元引擎被闲置。任何神经元引擎可以在任何窗口位置上执行任何滤波。因此,滤波的数量可能不同于在硬件200处提供的神经元引擎245的数量。这种神经元到神经元引擎的灵活分配避免了由于特定神经元引擎用于特定滤波或特定窗口的限制而使得神经元引擎被闲置。

每个神经元引擎的控制块可以由命令解码器220配置——例如,在硬件处理开始时。由每个神经元引擎处理的神经元序列可以是确定性的。每个神经元引擎的控制块可以被配置为确定接下来处理哪个神经元。命令解码器可以向控制块提供在硬件处理中要处理的滤波的数量和在硬件处理中要处理的窗口的数量。该信息可以允许每个神经元引擎确定在硬件处理期间要处理的神经元序列,而无需从命令解码器进一步接收这种配置信息。命令解码器还可以向控制块提供以下项中的一者或两者:指示其为哪个神经元引擎的标识符(例如,neuron_engine_index);以及硬件200中有多少神经元引擎(例如,num_neuron_engines)。然而,由于这两个值对于硬件都是固定的,所以这些值可以是在每个神经元引擎处保持(例如,硬编码)的常数,在这种情况下,命令解码器不需要提供它们。

神经元引擎可以被配置为使用由命令解码器提供的配置数据(以及可选地在神经元引擎处保持的一个或多个常数)以固定的顺序处理神经元。例如,每个神经元可以通过神经元指数来标识,该神经元指数在给定硬件处理中要处理的滤波和窗口上递增。神经元指数可以首先在滤波上递增,然后在窗口上递增,如图5和图6中所示的。在一个示例中,在处理开始时,每个神经元请求(或以其他方式提供)其第一神经元以进行处理。一旦每个神经元引擎完成了对其神经元的处理,神经元引擎(例如,其控制块304)就可以标识下一个神经元以进行处理。例如,使用包括滤波数量、窗口数量和神经元引擎数量的配置信息,神经元引擎可以通过将神经元引擎的数量添加到其当前处理/刚刚完成处理的神经元的神经元指数来标识其下一个神经元以进行处理。由于神经元引擎知道有多少个滤波和窗口,所以神经元引擎可以标识其需要的滤波和窗口,以便处理那个神经元。以这种方式,每个神经元引擎将被配置为处理确定性的神经元序列,并且神经元引擎可以共同处理可用于处理的神经元的总数。根据这个方案的布置在图5和图6中示出。将理解的是,根据神经元引擎可以配置为请求神经元,许多其他方案是可能的。在一些方案中,可以不使用神经元指数,并且神经元引擎可以直接标识用于处理的滤波和窗口。

优选地,在正常环境下,在完成一个神经元和开始下一个神经元之间没有闲置的乘法器周期。

用于给定硬件处理的神经元可以被形成为由窗口位置排序的序列,并且通过滤波形成在每个窗口内,使得根据该序列,在移动到下一个窗口并按顺序执行其所有滤波之前,执行给定窗口的每个滤波,等等。然后,将神经元(例如,滤波-窗口对)分配给可用的神经元引擎的集合,以便按照该顺序进行处理。

个体神经元引擎可以基于以下信息来确定它应该处理的神经元序列:

·num_neuron_engines——限定硬件中存在多少个神经元引擎的常数;

·num_filters_min1——指示处理中的每个窗口的滤波数量的可配置参数;

·num_windows_min1——指示处理中的窗口数量的可配置参数。

在图5中显示了分配序列的示例,以用于滤波比神经元引擎少的情况。提供给控制块的配置参数如下:

·num_neuron_engines=8

·num_filters_min1=2

·num_windows_min1=8

在图中,由每个神经元引擎245处理的神经元序列被显示在该神经元引擎下面的对应列中。可以看出,在该次处理中处理了26个神经元,其中按顺序处理了9个窗口中的每个窗口,并且在每个窗口内,按顺序处理了3个滤波。

注意,允许每个神经元引擎在其处理序列中移动到下一个神经元,而不等待其他神经元引擎,条件是在任何时间激活的第一窗口和最后窗口与输入缓冲器235可以同时提供的最大数量的窗口相比不会进一步分开。

当同时由多于一个神经元引擎使用相同的滤波时,将神经元引擎限制在有限数量的滤波权重字内是有利的,从而可以在神经元引擎之间共享权重解包的成本(见下文)。使用不同滤波的神经元引擎不会有这样的限制,并且可能进一步失去同步。

对于滤波比神经元引擎多的情况,分配序列的示例在图6中显示。提供给控制块的配置参数如下:

·num_neuron_engines=8

·num_filters_min1=9

·num_windows_min1=2

在图中,由每个神经元引擎245处理的神经元序列被显示在该神经元引擎下面的对应列中。可以看出,在该次处理中处理了29个神经元,其中按顺序处理了3个窗口中的每个窗口,并且在每个窗口内,按顺序处理了10个滤波。

在图5和图6中,每个滤波一次仅由一个神经元引擎使用,但是哪个神经元引擎使用哪个滤波通过处理次数而变化。

为了处理神经元,神经元引擎的控制块304从输入数据模块230请求(303)用于要处理的窗口的输入数据,并且(优选地,同时)通过交叉开关242从权重缓冲器240请求相关滤波的权重。返回的输入数据301和权重302均与对应的稀疏性映射一起被接收,并被存储在相应的寄存器305和306中。偏置值也可以被接收并采集在寄存器(未示出)中,以便在累加器312处使用。可以在权重缓冲器处为滤波存储偏置——例如,连同偏置所对应的滤波的权重。可以使用线性指数来标识滤波和窗口两者,线性指数按顺序递增以根据滤波和窗口的标称处理顺序进行。

可以根据确定性序列将神经元分配给每个神经元引擎,在该确定性序列中,神经元引擎在移动到下一个窗口之前首先针对给定窗口操作所有滤波(例如,根据标识由神经元引擎执行的处理的滤波和窗口指数,在使窗口指数递增以便移动到序列中的下一个窗口之前,神经元引擎首先使滤波指数递增,直到所有滤波已在窗口上执行)。

在任何特定时间,可配置数量的一个或多个数据窗口可用于输入缓冲器235处的神经元引擎。每个神经元引擎选择已经分配给它使用的输入数据窗口(例如,使用窗口指数来标识输入缓冲器235中的窗口)。多个神经元引擎可以同时在一个特定的窗口上工作。这给出了各种神经元引擎可以在任何时间工作的窗口位置的范围。当任何神经元引擎不再需要最后窗口时,该窗口的数据可以从输入缓冲器丢弃,并且由输入缓冲器控制器215加载下一个窗口的数据。

如果神经元引擎前进得如此之远,以至于其需要的窗口还不可用,那么神经元引擎将会停止并等待其他神经元引擎赶上下一个窗口位置可用的点。要评估的窗口位置的序列可以被布置为从输入数据平面的一行的末端绕到下一行的起点,以避免在平面(例如,图像帧)的边缘处不使用任何神经元引擎。输入缓冲器控制器可以配置为跟踪每个窗口已经完成了哪些滤波。当已经请求了针对特定窗口的所有滤波时,不再需要该窗口,并且输入缓冲器235中的相关联的储存器被重新分配到序列中的下一个窗口位置。

命令解码器220被配置为向每个神经元引擎提供配置数据303。可以在硬件处理的起点处将配置数据提供给神经元引擎:这样的配置数据可以指示神经元引擎要评估的滤波和窗口的一些或所有序列。

神经元可以以固定的确定性序列分配给每个神经元引擎,或者在一些实施例中,分配给在共同的神经元序列上操作的神经元引擎的限定组。一个神经元引擎有可能在其自身的处理序列内领先于另一个。在某些环境下,动态地将神经元分配给神经元引擎可能给出稍高的性能,但是这种性能的不确定性将使得在宽度转换器处按正确顺序布置输出数据更加复杂,并且还会使其难以模拟cnn的硬件实施方式,因为不可能确保特定的神经元引擎在软件模拟中处理与硬件中的神经元相同的神经元。由每个神经元引擎处理的神经元的确定性分配的另一个优点是每个神经元引擎可以计算其应该自己处理的神经元序列,从而避免了对中央调度器的需要。

在一些示例中,可以提供多个组的神经元引擎,每个组包括被配置为在神经元的集合上操作的多个神经元引擎。每个组可以被布置为在不同的神经元的集合上操作。根据上述原则中的任何原则,每个组可以从其集合中分配神经元。

在图8中显示了示出多个神经元引擎245的操作的流程图。配置信息801被提供给神经元引擎,该神经元引擎标识要在硬件处评估的神经元(即,滤波和窗口的集合)。这可能是在硬件处理的起点。每个神经元引擎使用所接收的配置信息来确定要评估的神经元802的序列——例如,以上述的方式。然后,神经元引擎按顺序请求(803)每个神经元的权重和数据值。典型地,神经元引擎将对每个神经元的权重和数据值进行多次请求,因为神经元引擎在其寄存器处没有能力存储所有的权重和数据值以评估完整的神经元(例如,针对窗口执行所有的滤波)。

神经元引擎将权重乘以(804)它们的数据值(可选地跳过权重或数据值为零的任何乘法操作)。然后,神经元引擎累加(805)乘法运算,以便形成神经元的输出。给定神经元可以进行多次处理以在神经元引擎中处进行评估,其中关于神经元的每个部分累加可用于后续处理(例如,在未来的硬件处理处)。关于给定神经元所执行的每次处理可以或可以不在相同的神经元引擎上。

然后,由每个神经元引擎执行的神经元操作的最终结果被累加806(例如,在宽度转换器250处),以便形成神经网络的卷积层的输出,以用于在后端285处进行后续处理。

步骤802至步骤805由多个神经元引擎同时执行,并且因此每个步骤在图8中被显示为一组步骤。

累加和输出

一旦已接收到输入数据和权重,就可以通过乘法逻辑309推送数据。如上所述,控制块304可以将数据稀疏性映射与权重稀疏性映射组合,以便选择下一对非零数据和非零权重进行相乘。如果数据、对应的权重或这两者为零,则不将它们提供给乘法器,以避免通过乘以零值浪费乘法器周期。在每个周期中,选择下一个非零数据和权重对。在新滤波的第一周期中,可以将偏置值313加到(310)乘法器结果并存储到累加器寄存器311中(可以丢弃与前一滤波有关的累加器的先前内容)。在滤波的所有后续周期中,乘法器的输出被加到(310)累加器寄存器311的当前值,并被存储回到寄存器311中。

为了准确,将累加器312配置为对浮点值(例如,32位浮点值)进行操作是有利的。同时,为了最小化输入数据和权重所需的其他逻辑的复杂性和存储空间,神经元引擎的乘法逻辑309可以对定点值(例如,16位定点值)进行操作。在这种情况下,定点乘法器结果可以在累加器之前被转换为浮点314,并且累加器312的输出可以在被写入输出fifo315之前被转换回为定点317(可能具有不同的可配置指数)。

偏置值313可以以浮点格式被接收,以避免需要额外的固定到浮动转换器。然而,提供具有较短浮点位长度的偏置值(例如,在累加器以32位操作的情况下为16位)可能是有利的。这最小化了处理偏置值所需的带宽和内存。根据硬件复杂度,在不同位长度的浮点值(例如,f16到f32)之间进行转换可以相对便宜。例如,在神经元引擎中使用自定义(例如,非ieee)浮点格式可能是有利的,其中32位浮点数的16位最高有效位被布置为与相同数量的16位浮点表示相同。这通过避免在转换为f16格式时对数据进行逻辑钳位的需要,基本上简化了转换,其中值在可表示范围之外。

在其他示例中,可以使用定点累加器以避免对转换器单元310和314的需要,并且(根据所使用的定点位长度)减少神经元引擎的面积。

根据寄存器305和306相对于窗口大小和滤波权重的数量的大小,对于神经元引擎而言可能需要接收与部分处理神经元有关的输入数据和权重。增加一次请求并在神经元引擎内部本地缓冲的值的数量,减少了需要发生这种提取的次数,但是增加了寄存器、多路复用器的大小和与寄存器连接的数量。

在处理神经元时并且在由乘法逻辑309使用存储在寄存器305和306处的所有输入数据或权重(或由于稀疏性而丢弃)之前,如果控制块304请求用于当前窗口位置的输入数据的下一个子集或用于当前滤波的权重的下一个子集,则是有利的。返回的输入数据和/或权重可以被接收到相应的寄存器305和/或306,并且通过乘法逻辑309的处理可以继续(优选地不需要任何空置周期)。在需要的时间点之前发出对新数据的请求可以最小化对神经元引擎的处理的中断。神经元引擎的控制块应该被配置为请求新的输入数据/权重的最佳时间点可以在设计时间(例如通过神经元引擎电路建模而确定的)进行计算。

如果在从一个神经元切换到下一个神经元时采取与在相同神经元内从一个数据集切换到下一个数据集时所采取(如上所述)的方法类似的方法,则是有利的。

当对神经元的计算完成时,结果被写入输出fifo,并且对下一个神经元的处理开始。当对分配给特定神经元引擎的最后一个神经元的计算完成时,控制块304向命令解码器220指示它已经完成了其对硬件处理的处理,并且然后神经元引擎空置。

权重缓冲器

可以使用一个或多个权重缓冲器240来保持每个滤波的权重。在图2中所示的示例中,存在与神经元引擎245的数量相同数量的多个权重缓冲器。权重缓冲器240的数量可以等于神经元引擎245的数量,其中每个权重缓冲器被配置为提供要在一个或多个神经元引擎上执行的用于滤波的权重的集合。在其他实施例中,可以使用其它布置。例如,可能存在比神经元引擎(例如,单个权重缓冲器)更少的权重缓冲器,其中(多个)权重缓冲器被配置为在神经元引擎上的操作中提供一个或多个滤波的权重,例如,响应于来自神经元引擎的请求,神经元引擎通过滤波指数来标识权重的集合。

每个神经元引擎根据分配给它的滤波,从权重缓冲器中的一个请求权重。神经元引擎借助于交叉开关242访问权重缓冲器。每个神经元引擎可以使用标识执行滤波所需的所需权重的集合的滤波指数来寻址保持所需滤波权重的权重缓冲器。这种间接性水平意味着特定的神经元引擎并不总是与处理相同的滤波相关联。它可以在处理每个神经元的滤波之间变化。这确保了即使要在窗口上执行的滤波的数量不是神经元引擎数量的倍数时,也能够全部使用神经元引擎。有可能多个神经元引擎可以在特定时间在相同滤波上工作。

在压缩权重数据的一些实施方式中,可以限制在相同滤波上工作的不同神经元引擎以对滤波权重的相同部分进行操作,从而一次仅允许在权重缓冲器处保持的压缩权重数据的一部分被解压缩,以供在神经元引擎上使用。权重可以根据神经元引擎预期所需的权重的顺序在权重缓冲器处解包。一个已经前进得太远的神经元引擎可以停止,直到一个或多个其他神经元引擎赶上。如果神经元引擎在权重缓冲器处不再可用地解包该权重之后请求特定权重(例如当它是在其分配序列中落后于其他神经元的整个神经元时),则该神经元引擎可能被迫等待直到其他神经元引擎几乎完成滤波之后才能开始。

在图4中示出了权重缓冲器240的示例。权重缓冲器以压缩格式(例如,去除了零点并且具有可配置的减小的位深度)将其权重存储在打包权重缓冲器401中。压缩(打包)权重409从外部存储器中读取,并以压缩格式存储在打包权重缓冲器401处。这减少了外部存储器带宽,并且允许在给定大小的打包权重缓冲器401中存储更多的权重。为了向神经元引擎提供权重数据,权重缓冲器的解包器402将权重解包到经解包权重储存器404。解包权重406的每个集合可以被称为字(其可以或可以不被认为包括对应的稀疏性映射407和/或指数405)。打包的权重数据可以仅被部分解包,以便对权重数据(例如,对位深度)进行解压缩,但不对稀疏性进行解压缩,即,零值权重不被恢复到字中权重序列中的正确位置。

在一些实施方式中,权重不是为稀疏性而解包的,其中所有的零数据在权重数据406的末端被分组在一起,而不是被重新插入到其正确的位置。用一个末端处的所有零权重来打包稀疏性的权重允许对权重数据进行良好压缩,并且避免了为稀疏性而解包权重数据。存储在打包权重缓冲器401中的权重(并且保持在存储器中)可以以打包形式保持,其中零权重在一个末端是一起的(并且潜在地以减少的位深度进一步压缩)。解包权重数据406可以包括多个权重值,每个权重值对应于相应稀疏性映射407中的位。

由于稀疏性映射407指示字中零权重的位置,所以神经元引擎可以容易地使用打包权重数据。例如,考虑打包权重数据的集合,其包括8个权重值(为了简单起见,我们将其表示为整数)及其对应的稀疏性映射,该稀疏性映射是二进制串,其中“1”位指示零权重值:

权重=5,4,2,6,9,0,0,0

稀疏性映射=01001100

权重值可以通过读取非零权重值来在其适当位置处重新创建,以便提供由稀疏性映射中的零指示的非零权重,并在稀疏性映射指示“1”的地方生成零:

按其正确顺序的权重=5,0,4,2,0,0,6,9

将理解的是,许多不同的方案可以表示作为稀疏性映射的权重值集合中的零权重的位置。

在一些示例中,只有非零权重数据连同相应的稀疏性映射一起被传送到神经元引擎的寄存器306。零权重可以从在神经元引擎处所接收的权重稀疏性映射推断。

在一些示例中,稀疏性映射407和解包权重406可以组合,以便在寄存器306处按其适当顺序布置所接收的权重值。例如,可以在权重缓冲器240或在神经元引擎245处执行这样的组合。在这样的示例中,权重值本身可以用于标识哪些权重值是零,而不是稀疏性映射。

只有一部分打包权重可以一次解包。在图4中所示的示例中,权重406的四个集合被一次被拆包。在其它示例中,对于给定的硬件实施方式200,任何数量的权重集合可以根据对神经元引擎的权重的即时可用性和解包权重储存器404的大小之间的期望平衡被适当地解包。打包权重可以用可配置位深度压缩,和/或零可以被去除或表示在权重集合的末端。权重可以只针对位深度进行解包,但是如上所述,不需要按顺序恢复零。

权重缓冲器240包括控制块403,该控制块403被配置为控制权重解包成解包权重储存器404的序列,并且响应于来自神经元引擎的请求411,向神经元引擎提供对保持在储存器404处的权重的访问。滤波的权重的每个集合可以保持在可由字指数405标识的字中。因此,神经元引擎可以通过在交叉开关242上发出包括字指数和滤波指数的请求411,来请求特定滤波的特定字,其权重被保持在权重缓冲器240中的一个处。以这种方式,神经元引擎本身不需要标识哪个权重缓冲器保持其需要的权重。

每组权重可以连同其稀疏性映射一起存储在填充的权重缓冲器中,该稀疏性映射指示该组权重的哪些值是零。与一组权重相关联的稀疏性映射可以与权重一起作为未打包稀疏性映射407被解压缩到未打包权重储存器404。稀疏度映射407可以形成由单词指数405标识的存储器404处的未打包单词的一部分。

在请求解包储存器404中的滤波的字的神经元引擎上,所请求的权重406通过交叉开关242连同这些权重的稀疏性映射407一起返回(410)到神经元引擎。从神经元引擎接收字请求的控制块403可以被配置为借助于多路复用器408控制来选择哪个字从储存器404输出。

如上所述,每个滤波的权重存储在单独的权重缓冲器240中,以便每个滤波可以由神经元引擎独立地访问。当使用滤波的最后字时,权重缓冲器可以被配置为立即再次循环到滤波的起点,以便权重可用于另一个神经元引擎来启动滤波。当由命令解码器220将新的配置推送到cnn的硬件实施方式的元件时,可以在硬件处理开始时更新权重缓冲器处可用的滤波。

可以在字中一起提供任何数量的权重,其中相应的稀疏性映射具有对应于该字中权重数量的位数。在字中可以作为集合一起提供的权重的数量可以是可配置的。权重的数量可以是4或其倍数。在单次传输中提供给神经元引擎的权重的数量和输入数据值的数量可以是等效的。

每个滤波缓冲器跟踪哪个神经元引擎使用其滤波的权重。在对解包储存器404中存在的滤波的第一个字提交请求的神经元引擎上,神经元引擎可以由控制块403添加到使用滤波的神经元引擎的列表中。神经元引擎可以在其请求411中标识自身。例如,该列表可以保持在储存器404处,并且可以被控制块403访问。当神经元引擎从解包储存器请求滤波的每个字时,控制块可以被配置为仅当列表上的所有神经元引擎已经请求该字时,用包括滤波的下一个权重的下一个字来替换解包储存器中的字。

当神经元引擎请求滤波的最后字时,可以使用该滤波从神经元引擎列表中去除该神经元引擎。为了避免阻挡来自其他神经元引擎的对相同滤波的请求,如果神经元引擎在第一个字已经在解包储存器中被替换之后请求滤波的第一个字(或者可选地任何其他字),则不会立即将其添加到活动神经元列表中并且其请求将被存储(例如,在控制块处)并被推迟,直到该字在解包储存器中再次可用。此时,响应410可以返回到包括所请求的滤波字的权重和稀疏性映射的神经元引擎。

如本文所述的权重缓冲器的操作意味着当多个神经元引擎开始处理在相互的权重缓冲器所保持的滤波的字数内的相同滤波时,它们可以并行地运行以共享相同的滤波权重。如果那些神经元引擎中的一个前进得太远,则它将会停下来,直到后面最远的神经元引擎赶上来。

控制块403在接收到新请求时的行为被总结在以下伪代码中,其中ne_idx是神经元引擎的标识符:

已经由利用权重缓冲器的滤波操作的活动引擎列表上的神经元引擎读取了对哪些字的跟踪可以如下处理:

·在控制块403处为每个神经元引擎和解包储存器中的每个字保持

1位标志,即等于神经元引擎数量*解包字数量的多个标志。

·当新的字被添加到解包储存器时,设置该字的所有标志。

·当由每个神经元引擎读取字时,清除对应的位。

·对用表示活动引擎列表的掩码位当前存储的第一个字的标志进行按位与。当结果都是零位时,字可以撤回,并且用要为滤波解包的下一个字替换。

这种方法的优点是,只要控制块处有足够的寄存器空间,就不会对可以在活跃用户列表上的神经元引擎的数量产生任何限制。

权重缓冲器240的数量可以等于神经元引擎245的数量。在一些实施方式中,提供比权重缓冲器更多的神经元引擎可能是适当的,因为多个神经元引擎可以在一些应用中通常应用相同的滤波。

当这些层完全连接时,权重可以不断地从外部存储器流入。一旦已经发送了对权重数据的初始请求,则权重缓冲器可以被配置为提供权重流和相应的稀疏性映射,其中每个权重仅被使用一次。权重可以按滤波交错的顺序读取,以便允许多个神经元引擎同时运行。对于完全连接的层,通常没有比滤波缓冲器更多的神经元引擎的好处,因为只有一个神经元引擎可以从每个滤波缓冲器读取。如果存在比滤波缓冲器更多的神经元引擎,那么当在完全连接的层上操作时,一些神经元引擎将不被使用。然而,对于给定的实施方式,性能可能受到权重的外部存储器读取带宽的制,而不是受到计算吞吐量的限制。

输入缓冲器

输入缓冲器235被配置为向神经元引擎提供多个卷积窗口。每个神经元引擎从这个窗口的集合请求数据,例如由以下指出:

·window_idx——窗口的指数(例如,通过数据平面,首先跨行递增,然后跨列递增);

·word_idx——窗口内字的指数(例如,以预定方式跨窗口递增,例如沿着p方向,然后x方向,然后y方向)。

window_idx标识应该读取输入缓冲器处的哪个窗口储存器,并且word_idx用于确定应该读取该窗口储存器中的哪个字。被应用的滤波的指数(filter_idx)也可以由神经元引擎提供给输入缓冲器。这可以不用于标识要返回的窗口数据,但是可以用于如将要描述的同步。

神经元引擎从输入数据模块230请求来自输入缓冲器的窗口数据,输入数据模块230包括输入缓冲器控制器215和输入缓冲器235。神经元引擎可以被配置为针对给定的滤波-窗口操作一次请求等数量的权重值和输入数据值。神经元引擎可以对权重和输入数据值进行多次请求,以便在窗口上执行滤波的操作。通常,来自神经元引擎的请求将转到输入缓冲器控制器215,输入缓冲控制器215可以被配置为使得所请求的数据从输入缓冲器235提供。在其他示例中,神经元引擎可以被配置为直接访问输入缓冲器235中的数据。

输入缓冲器控制器可以为从输入缓冲器提供的每个窗口位置维持标志的集合。每个标志的集合可以包括用于在硬件处理中的神经元引擎处操作的每个滤波的标志,以指示该滤波是否已经针对该窗口位置被完成。标志可以如下维持:

·当窗口第一次被加载到输入缓冲器时,所有的标志都可以被清除。当神经元引擎从该窗口请求最后字时,可以设置与处理神经元引擎的滤波(filter_idx)相关的标志。

·当已经设置了与在处理中处理的滤波的数量有关的所有标志时,这指示不再需要窗口。该窗口可以撤回,并且在输入缓冲器中被要处理的下一个窗口替换。

可以根据预限定的顺序处理窗口。通常要处理的下一个窗口可以通过递增窗口指数来标识。例如,在如图1中所示的要处理的数据平面中,除了当前窗口已经是平面中最右边的窗口之外,可以按行处理窗口,其中要处理的下一个窗口位于当前窗口的右侧,在这种情况下,下一个窗口可以是下一行上的第一个窗(例如,以下所示的)。

在下面的伪代码中通过示例的方式描述了使用标志来确定何时可以重新使用窗口的储存器:

宽度转换器

每个神经元引擎每次完成神经元可以输出一个值316。这可能是最终结果或部分累加,其被提供回存储器(例如,经由存储器接口210),以用于神经元引擎处的后续处理。发生这种情况所处的速率根据数据的稀疏性和该神经元的权重以及滤波核的尺寸而变化。因此,每个神经元引擎在特定时间的输出速率可能不同。由神经元引擎输出的值在进一步处理(例如,激活)或输出到外部存储器之前,将通常需要按照限定的顺序。这样做是有利的,在允许个体神经元引擎以它们自身的速率继续处理而不停止时实现这些是有利的。

每个神经元引擎包括fifo缓冲器315,神经元引擎处理的每个神经元的输出被存储在fifo缓冲器315中。fifo的使用有助于使数据速率平滑,并允许限定组内的不同神经元引擎以不同速率完成。宽度转换器250被配置为从神经元引擎的限定集合中的神经元引擎245的fifo读取结果。宽度转换器按照所需的顺序从组的fifo中读取结果,并且根据cnn(例如,激活模块255处的激活)传递这些结果以在“后端”处进行进一步处理。集合的大小可以取决于“后端”流水线的宽度——例如,由激活模块255所接收的数据宽度。每个集合可能有8个神经元引擎。

宽度转换器250被配置为在从集合中的每个fifo读出最早的结果之前,等待直到集合中的所有神经元引擎具有要从其fifo读出的结果(一些神经元引擎在其fifo中可能有不止一个结果)。神经元引擎的集合的所有fifo都可以同时读取。此外,可能需要从神经元引擎的集合发送输出,以便使得首先读取神经元引擎的第一集合的输出,然后从第二集合读取输出等。因此,例如,宽度转换器可能需要在读出那些输出并移动到下一个集合之前,等待第一集合的所有神经元引擎具有在其fifo处可用的输出。结合将特定序列的神经元分配给每个神经元引擎,这种方法可以确保来自神经元引擎的输出以正确的顺序提供给“后端”。

如果神经元引擎变得足够不同步,以致神经元引擎中的一个内的fifo已满,而相同集合中的另一个神经元引擎内的fifo已空,则“整个”神经元引擎将停止,直到“空”神经元引擎完成其当前处理的神经元为止。如果神经元引擎(“前端”)的输出速率超过“后端”的最大吞吐率,则神经元引擎内部的fifo将开始填充并最终停止。

如果神经元引擎的数量不是神经元引擎集合数量的精确倍数,那么在最后神经元引擎的最后集合中包括更少数量的神经元引擎可能是合理的,条件是“后端”能够处理数据中的这些间隙。替代地,将神经元引擎的数量限制为神经元引擎集合大小的倍数可能是合理的。

部分累加

当滤波核的大小大于可以装入权重缓冲器的大小时,必须对滤波进行划分,以便每个滤波都经过多于一次的处理。为了允许这一点,可以在一次处理期间将累加器312的部分累加值写出(316)到存储器,并且然后在313中读回以在下一次处理期间初始化累加器。如果需要划分滤波超过两次处理,那么一些处理既读入部分累加,又写出同一次处理中更新的部分累加。

可以以与用于累加器312的偏置值313类似的方式向神经元引擎提供部分累加,使得累加器312以滤波在前一次硬件处理中所确定的部分累加进行初始化。这避免了在神经元引擎处需要单独的逻辑来处理偏置和部分累加。部分累加是前一次硬件处理的输出,并且因此,与权重和偏置值不同,在创建和优化神经元网络时是预先未知的。部分累加通常将在上一次硬件处理的末端处存储在存储器中(参见图2中的数据路径280,其允许将部分累加提供给外部存储器)。可以通过输入数据模块230连同对应的输入数据集合一起来向神经元引擎提供部分累加。部分累加可以存储在输入缓冲器235处。更一般地,部分累加可以存储在硬件实施方式处的任何地方(包括在权重缓冲器或另外的数据缓冲器或与权重缓冲器和输入数据缓冲器分开的寄存器),并且以任何适合的方式(包括响应于输入数据、权重或者来自神经元引擎的其他请求,或者由另一个模块(例如命令解码器)推送到神经元引擎)提供给神经元引擎。

相比之下,偏置是预先已知的,因为它代表了限定神经网络的部分。因此,可以方便地对偏置进行布置,偏置是由权重缓冲器240响应于神经元引擎请求权重302的集合而提供给神经元引擎的。偏置可以与对应的滤波权重的集合一起存储在存储器中。权重缓冲器可以包括寄存器(未示出)以从存储器接收偏置以及滤波权重的集合。

如上文针对偏置所描的,如果累加器对浮点值进行操作,并且乘法器对定点值进行操作,则可以将部分累加读入为浮点值以避免转换(在浮点位长度之间进行转换可能是必要的,但这可能是相对便宜的,因为其通常涉及扩展指数的msb和尾数的lsb)。

由于在累加器312处使用浮点值执行累加是有利的,因此优选地以其浮点形式保留部分累加。因此,可以提供多路复用器318,以在来自累加器312的输出的浮点形式和经转换的定点形式之间进行选择,其中fifo315能够保持所需位长度的定点值或浮点值。在累加器处所使用的浮点格式比用于fifo315处所存储的结果的定点格式长的情况下,如果fifo可配置为以两种模式来操作,即使用相同的储存器,其可以表现为较小宽度的fifo(例如,给定深度的16位宽的fifo)或表现为较小深度的更宽的fifo(例如,具有给定深度的一半的32位宽的fifo),则这是有利的。fifo的模式可以在处理之间进行配置(例如,从可以在单次处理中处理的神经元切换到将采取多次处理的神经元,反之亦然)。

在神经元引擎处形成的部分累加可以以与神经元的最终结果相同的方式写入fifo315,并通过宽度转换器250以相同的方式在数据路径316上读出。部分累加通常不应该在“后端”285(激活模块、归一化模块、池化模块等)处进行处理,而是可以通过旁路路径280经由存储器接口210传递到外部存储器。在给定的硬件处理上,神经元引擎将被配置为输出所有的部分累加或所有的最终结果。因此,神经元引擎的输出可以被配置用于硬件处理,使得从fifo315读取的值被引导通过旁路路径280或者被传递到“后端”以进行进一步处理。例如,命令解码器220可以在每次硬件处理开始时配置宽度转换器250,以便将来自每个神经元引擎的输出引导到旁路路径280或“后端”285。在其它示例中,神经元引擎可以被配置为使得宽度转换器在旁路路径280上将部分累加传递到存储器——例如,通过设置标志来标识部分累加。在其他示例中,当提供给“后端”285的最终结果是定点值时,宽度转换器可以被配置为利用部分累加是浮点值而来标识出要在路径280上被引导的部分累加。

单平面滤波支持

深度可分离卷积是两个部分卷积。第一部分(深度部分)具有一次在1个平面上操作的小滤波核,例如3x3x1滤波。在每个输入平面上操作不同的滤波。第二部分是正常的卷积操作,其只在1x1窗口上操作,但是在所有输入平面上操作,例如1x1xp卷积。

本文所述的硬件实施方式200通常将被配置为在多个平面上执行多个滤波。在这样的布置中,当执行深度可分离卷积时,滤波权重和输入数据的很大一部分将包括零值。因为神经元引擎可以跳过“乘以零”操作,所以硬件不需要执行无效操作,并且通常可以以高性能执行深度可分离卷积。

然而,当存在极高的稀疏性(例如,几乎所有的数据或权重都是零)时,提取数据/权重的下一个集合的开销可能不会被由神经元引擎执行的非零滤波操作所隐藏。现在将描述使用本文所述的神经元引擎方法来执行深度可分离卷积的改进方法。

硬件200可以以单平面滤波模式配置,其中在包括单个平面的窗口中执行滤波。在卷积滤波的典型配置中,数据中的每个窗口都包含所有输入平面,并且该滤波包含与深度p平面的窗口中的元素数量相同数量的权重。在单平面滤波模式中,每个窗口替代地被限定为仅包含单个输入平面,并且(如果必要)为每个输入平面限定单独的窗口。在这种情况下,滤波中的权重数量与单个平面窗口中的元素数量相同。这显著减少了需要存储和传输的权重的数量,以便在给定窗口上执行滤波。

在正常卷积模式下,输入缓冲器235向神经元引擎提供窗口(例如(由window_idx指出),该神经元引擎包含x和y维度中以及所有平面p上的可配置窗口大小的数据。这被描述为m×n×p窗口。每个窗口内的数据可以以p,x,y的顺序被线性化,因为p通常相比于x和y快速移动。每个神经元可以由filter_idx和window_idx标识。如已经描述的,一旦所有滤波都在该窗口上运行,输入数据模块230就可以丢弃该窗口。

在单平面滤波模式下,输入缓冲器235被配置为提供一次仅包括单个输入平面的窗口,但是其仍然能够以x和y尺寸配置。这样的窗口可以被描述为m×n×1窗口。每个平面可以作为单独的窗口被输出,用不同的window_idx指出。每个窗口内的数据可以以x,y的顺序被线性化,因为x相比于y可以快速移动。操作的窗口可以在移动到下一个x,y位置之前在对于相同x,y的所有p上递增。每个神经元仍然可以由filter_idx和window_idx标识。然而,在移动到下一个窗口之前,不再是所有滤波在每个窗口上运行的情况。只有一个滤波可以在其被丢弃之前在每个窗口上运行。输入数据模块230可以被配置为一旦应用了滤波就丢弃每个窗口——例如,通过检查滤波已经以上述方式应用。在其他示例中,在窗口被丢弃之前,多于一个但不是所有滤波可以在其被丢弃之前在窗口上运行。

当由于使除一个平面以外的所有平面的权重设置为零而存在非常高的权重稀疏性时,上述方法节省了提取零权重和对应输入数据的大集合的开销。在单平面滤波模式下,如果输入缓冲器被配置为比在正常卷积模式下维持更大数量的窗口,则这是有利的。这是很容易实现的,因为由于每个窗口是单个平面,所以窗口更小。另一个好处是减少了需要针对权重读入和存储的稀疏性映射位的数量。

当执行卷积操作的任何集合时,例如深度可分离卷积、图像缩放和平均池化(作为替代方案或对于在池化模块275处执行池化而言附加地),单平面滤波模式的这种使用可能是有用的,其中每个输入平面被单独处理。

图2-4的硬件被示出为包括许多功能块。这只是示意性的,并且不旨在限定这样的实体的不同逻辑元件之间的严格划分。每个功能块可以以任何适合的方式提供。要理解的是,在本文中被描述为在硬件中形成的中间值不需要由硬件在任何点处物理地生成,并且可以仅仅表示逻辑值,该逻辑值便利地描述由硬件在其输入和输出之间执行的处理。

本文所述的硬件可以体现在集成电路上。本文所述的硬件可以被配置为执行本文所述的任何方法。一般来说,上述功能、方法、技术或组件中的任一个可以在软件、固件、硬件(例如,固定逻辑电路)或其任何组合中实施。术语“模块”、“功能”、“组件”、“元素”、“单元”、“块”和“逻辑”在本文中通常可以用于表示软件、固件、硬件或其任何组合。在软件实施方式的情况下,模块、功能、组件、元素、单元、块或逻辑表示在处理器上执行时执行指定任务的程序代码。本文所述的算法和方法可以由一个或多个处理器来执行,所述一个或多个处理器执行使(多个)处理器执行算法/方法的代码。计算机可读存储介质的示例包括随机存取存储器(ram)、只读存储器(rom)、光盘、闪存、硬盘存储器以及可以使用磁、光和其他技术来存储指令或其他数据并且可以由机器访问的其他存储器设备。

如本文所使用的术语计算机程序代码和计算机可读指令指的是用于处理器的任何种类的可执行代码,包括用机器语言、解释语言或脚本语言表示的代码。可执行代码包括二进制代码、机器代码、字节码、限定集成电路的代码(例如硬件描述语言或网表),以及用诸如c、java或opencl之类的编程语言代码表示的代码。例如,可执行代码可以是任何种类的软件、固件、脚本、模块或库,其在虚拟机或其他软件环境下适当地执行、处理、解释、编译、执行时,使得计算机系统的处理器(其支持可执行代码)执行由代码指定的任务。

处理器、计算机或计算机系统可以是任何种类的设备、机器或专用电路、或其集合或部分,其具有处理能力,以便其能够执行指令。处理器可以是任何种类的通用或专用处理器,例如cpu、gpu、片上系统、状态机、媒体处理器、专用集成电路(asic)、可编程逻辑阵列、现场可编程门阵列(fpga)等。计算机或计算机系统可以包括一个或多个处理器。

其还旨在包含限定如本文所述的硬件配置的软件,例如hdl(硬件描述语言)软件,如用于设计集成电路的或用于配置可编程芯片的,以执行期望的功能。即,可以提供一种计算机可读存储介质,该计算机可读存储介质具有以集成电路限定数据集的形式编码于其上的计算机可读程序代码,计算机可读程序代码在集成电路制造系统中被处理时将系统配置为:制造被配置为执行本文所述的方法中的任一种的硬件或制造包括本文所述的任何装置的硬件。集成电路限定数据集例如可以是集成电路描述。

可以提供在集成电路制造系统处制造如本文所述的硬件的一种方法。可以提供集成电路限定数据集,当集成电路限定数据集在集成电路制造系统中被处理时,使得执行制造硬件的方法。

集成电路限定数据集可以采用计算机代码的形式,例如作为网表、用于配置可编程芯片的代码,作为限定任何水平的集成电路的硬件描述语言,包括作为寄存器传输级(rtl)代码、作为高级电路表示(例如verilog或vhdl)、以及作为低级电路表示(例如oasis(rtm)和gdsii)。逻辑上限定集成电路(例如rtl)的更高级表示可以在计算机系统处被处理,该计算机系统被配置为在包括电路元件的限定和用于组合那些元件的规则的软件环境的背景下生成集成电路的制造限定以便生成如由所述表示限定的集成电路的制造限定。如与在计算机系统处执行软件以限定机器的情况通常一样,可能需要一个或多个中间用户步骤(例如,提供命令、变量等),以便被配置用于生成集成电路的制造限定的计算机系统执行限定集成电路的代码,以便生成该集成电路的制造限定。

现在将参考图9描述在集成电路制造系统处处理集成电路限定数据集以便配置系统来制造硬件的示例。

图9显示了集成电路(ic)制造系统1002的示例,该ic制造系统1002被配置为制造如本文中的任何示例中所述的硬件。具体而言,ic制造系统1002包括布局处理系统1004和集成电路生成系统1006。ic制造系统1002被配置为接收ic限定数据集(例如,限定如本文中的任何示例中所描述的硬件),处理ic限定数据集,并且根据ic限定数据集(例如,其包含如本文中的任何示例中所描述的硬件)生成ic。ic限定数据集的处理将ic制造系统1002配置为制造包含如本文中的任何示例中所述的硬件的集成电路。

布局处理系统1004被配置为接收和处理ic限定数据集以确定电路布局。由ic限定数据集确定电路布局的方法在本领域中是已知的,并且例如,可以包括合成rtl代码以确定要生成的电路的门级表示,例如,根据逻辑组件(例如,nand、nor、and、or、mux和flip-flop组件)。通过确定逻辑部件的位置信息,可以由电路的门级表示确定电路布局。这可以自动完成,或可以在用户参与下完成,以便优化电路布局。当布局处理系统1004已经确定电路布局时,其可以向ic生成系统1006输出电路布局限定。电路布局限定可以是例如电路布局描述。

ic生成系统1006根据本领域已知的电路布局限定生成ic。例如,ic生成系统1006可以实施半导体器件制造工艺以生成ic,这可以涉及光刻和化学处理步骤的多步顺序,在此期间,在由半导体材料制成的晶片上逐渐创建电子电路。电路布局限定可以采用掩模的形式,该掩模可以用于根据电路限定生成ic的光刻工艺中。替代地,提供给ic生成系统1006的电路布局限定可以采用计算机可读代码的形式,ic生成系统1006可以使用计算机可读代码来形成用于生成ic的适合的掩模。

由ic制造系统1002执行的不同工艺可以在一个位置全部实施,例如由一方执行。替代地,ic制造系统1002可以是分布式系统,使得一些工艺可以在不同位置执行,并且可以由不同方执行。以下阶段中的一些可以在不同位置和/或由不同方执行,所述阶段例如:(i)合成表示ic限定数据集的rtl代码以形成要生成的电路的门级表示,(ii)基于门级表示生成电路布局,(iii)根据电路布局形成掩模,和(iv)使用掩模制造集成电路可以在不同的位置和/或由不同方执行。

在其它示例中,在集成电路制造系统处处理集成电路限定数据集可以配置系统以制造硬件,而不处理ic限定数据集,以便确定电路布局。例如,集成电路限定数据集可以限定诸如fpga之类的可重构处理器的配置,并且该数据集的处理可以配置ic制造系统以生成具有该限定配置的可重构处理器(例如,通过向fpga加载配置数据)。

在一些实施例中,集成电路制造限定数据集当在集成电路制造系统中被处理时,可以使得集成电路制造系统生成如本文所述的设备。例如,通过集成电路制造限定数据集以上述关于图9的方式配置集成电路制造系统可以使得制造如本文所述的设备。

在一些示例中,集成电路限定数据集可以包括在数据集上限定的硬件上运行的软件或与在数据集上限定的硬件相结合的软件。在图9中所示的示例中,ic生成系统可以进一步由集成电路限定数据集来配置,以在集成电路的制造过程中,根据集成电路限定数据集中所限定的程序代码,将固件加载到集成电路上,或以其他方式向集成电路提供与集成电路一起使用的程序代码。

在对设备、装置、模块和/或系统(以及在本文中所述的方法)的这种应用中所阐述的概念的实施方式可以在与已知的实施方式相比较时产生性能改进。性能改进可以包括增加的计算性能、减少的等待时间、增加的吞吐量、和/或降低的功耗中的一个或多个。在制造这样的设备、装置、模块和系统(例如在集成电路中)期间,性能改进可以针对物理实施方式进行权衡,从而改进制造的方法。例如,可以针对布局面积来权衡性能改进,从而匹配已知实施方式的性能,但使用较少的硅。这可以通过例如以串行方式重新使用功能块或在设备、装置、模块和/或系统的元素之间共享功能块来完成。相反地,本申请中所阐述的产生设备、装置、模块和系统的物理实施方式中的改进(例如减少的硅面积)的概念可以为改进的性能进行权衡。例如,这可以通过在预定面积预算内制造模块的多个实例来完成。

在该应用中在设备、装置、模块和/或系统(以及在本文中实施的方法)中所阐述的概念的实施方式可以在与已知的实施方式相比时产生性能改进。性能改进可以包括增加的计算性能、减少的等待时间、增加的吞吐量、和/或降低的功耗中的一个或多个。在制造这样的设备、装置、模块和系统(例如在集成电路中)期间,性能改进可以针对物理实施方式进行权衡,从而改进制造的方法。例如,可以针对布局面积来权衡性能改进,从而匹配已知实施方式的性能,但使用较少的硅。这可以通过例如以串行方式重新使用功能块或在设备、装置、模块和/或系统的元素之间共享功能块来完成。相反地,本申请中所阐述的产生设备、装置、模块和系统的物理实施方式中的改进(例如减少的硅面积)的概念可以为改进的性能进行权衡。例如,这可以通过在预定面积预算内制造模块的多个实例来完成。

申请人在此独立地公开本文所述的每个单独特征以及两个或更多个这样的特征的任何组合,以致于这样的特征或组合能够根据本领域技术人员的公知常识基于本说明书作为整体被实施,而不管这样的特征或特征的组合是否解决本文所公开的任何问题。鉴于以上描述,对于本领域技术人员来说显而易见的是,可以在本发明的范围内进行各种修改。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1