分形计算装置、方法、集成电路及板卡与流程

文档序号:22739459发布日期:2020-10-31 09:21阅读:132来源:国知局
分形计算装置、方法、集成电路及板卡与流程

本公开一般地涉及神经网络领域。更具体地,本公开涉及分形计算装置、方法、集成电路及板卡。



背景技术:

机器学习技术已经大量应用于新兴商业,像是图像识别、文本识别、语音识别、面部识别视频分析、广告推荐和游戏等领域。近年来,许多不同规模的专用机器学习计算装置已部署在各种的嵌入式设备、服务器和数据中心中,人们的生活早已离不开机器学习技术。

大多数的机器学习计算装置持续专注于优化性能,光是2012年到2018年间,其功效增长了逾1200倍。虽然机器学习计算装置的能效一直在快速增长,但是编程效率的发展有限,阻碍了机器学习技术的普及化。即使现有的计算装置具有很高的峰值性能,但精简的硬件控制管理和软件堆栈对于机器学习计算装置的实际性能仍然至关重要。不仅如此,现有的机器学习计算装置的异构性、并行性和分层特性也影响了编程效率。

因此,一种同构、串行的分层结构、具有相同的指令集的机器学习计算装置是迫切需要的。



技术实现要素:

为了至少部分地解决背景技术中提到的技术问题,本公开的方案提供了一种分形计算装置、方法、集成电路及板卡。

在一个方面中,本公开揭露一种分形计算装置,包括多层计算单元,每层计算单元包括功能单元及存储器。功能单元用以执行任务;存储器用以存储与所述任务相关的数据。

在另一个方面,本公开揭露一种根据输入指令计算数据的计算单元,所述计算单元分为m阶段的流水线,包括串行分解器及本地存储器。串行分解器将所述输入指令分解为n个串行指令,并生成反映所述n个串行指令间的依赖关系的中间数据。本地存储器包括静态内存段及循环内存段,静态内存段用以存储所述中间数据,循环内存段用以存储执行所述n个串行指令所需的子数据,及所述子数据在m阶段的流水线中计算所产生的各阶段数据。其中所述子数据为所述数据的一部分。

在另一个方面,本公开揭露一种根据输入指令计算数据的分形计算装置,包括多层计算单元,每层计算单元包括指令译码模块、数据加载模块、操作执行模块、操作归约模块、数据写回模块。指令译码模块用于将所述输入指令译码成本地指令、分形指令及直接存储器存取指令;数据加载模块用于根据所述直接存储器存取指令,将所述数据的子数据自上层存储器加载至本地存储器;操作执行模块用于根据所述分形指令,执行所述子数据对应的任务,以产生计算结果;操作归约模块用于根据所述本地指令,对所述计算结果进行归约;数据写回模块将归约后的计算结果写回所述上层存储器。

在另一个方面,本公开揭露一种分形计算装置,包括多层计算单元,每层计算单元包括串行分解模块、指令译码模块、操作执行模块。串行分解模块用于接收来自上层计算单元的上层分形指令,并将所述上层分形指令分解为多个串行子指令;指令译码模块用于根据所述计算单元的硬件资源,将所述多个串行子指令译码成本地分形指令;操作执行模块用于下发所述本地分形指令至下层计算单元,以产生计算结果。

在另一个方面,本公开揭露一种分形计算方法,包括:响应来自上层计算单元的上层分形指令,将所述上层分形指令分解为多个串行子指令;根据本层计算单元的硬件资源,将所述多个串行子指令译码成本地分形指令;以及下发所述本地分形指令至下层计算单元,以产生计算结果。

在另一个方面,本公开揭露一种集成电路装置,包括前述的分形计算装置;并揭露一种板卡,包括前述的集成电路装置。

本公开是一系列能被相同指令集所驱动的同构(homogeneous)、串行(sequential)、多层(multi-layer)、层相似(layer-similar)的机器学习计算技术方案,可以实现简单控制和高效率。

附图说明

通过参考附图阅读下文的详细描述,本公开示例性实施方式的上述以及其他目的、特征和优点将变得易于理解。在附图中,以示例性而非限制性的方式示出了本公开的若干实施方式,并且相同或对应的标号表示相同或对应的部分其中:

图1是示出一种分形计算装置的框架示意图;

图2是示出本公开实施例的计算装置的框图;

图3是示出本公开另一实施例的分形计算装置的框图;

图4是示出本公开另一实施例的分形计算装置的框图;

图5是示出本公开另一个实施例的流水线的示意图;

图6是示出本公开另一个实施例的流水线的示例图;

图7是示出根据本公开实施例的内存组件的划分的示意图;

图8是示出本公开另一实施例的串行分解的流程图;

图9是示出本公开另一实施例的流水线的示意图;

图10是示出本公开的另一实施例的内存组件的划分的示意图;

图11是示出本公开另一实施例的静态内存段的示意图;

图12是示出本公开另一实施例的静态内存段的示意图;

图13是示出本公开另一实施例的分形计算装置的示意图;

图14是示出本公开另一实施例的流水线的示意图;

图15是示出本公开另一实施例的每层计算单元的示意图;

图16是示出单任务多继承的框架;

图17是示出本公开另一实施例的集成电路装置的示意图;

图18是示出本公开另一实施例的板卡的示意图;

图19是示出本公开另一实施例的流水线的流程图;

图20是示出本公开另一个实施例的单任务多继承方法的流程图;以及

图21是示出本公开另一实施例的计算单元的框图。

具体实施方式

下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本公开一部分实施例,而不是全部的实施例。基于本公开中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。

应当理解,本公开的权利要求、说明书及附图中的术语“第一”、“第二”、“第三”和“第四”等是用于区别不同对象,而不是用于描述特定顺序。本公开的说明书和权利要求书中使用的术语“包括”和“包含”指示所描述特征、整体、步骤、操作、元素和/或组件的存在,但并不排除一个或多个其它特征、整体、步骤、操作、元素、组件和/或其集合的存在或添加。

还应当理解,在此本公开说明书中所使用的术语仅仅是出于描述特定实施例的目的,而并不意在限定本公开。如在本公开说明书和权利要求书中所使用的那样,除非上下文清楚地指明其它情况,否则单数形式的“一”、“一个”及“该”意在包括复数形式。还应当进一步理解,在本公开说明书和权利要求书中使用的术语“和/或”是指相关联列出的项中的一个或多个的任何组合以及所有可能组合,并且包括这些组合。

如在本说明书和权利要求书中所使用的那样,术语“如果”可以依据上下文被解释为“当...时”或“一旦”或“响应于确定”或“响应于检测到”。

下面结合附图来详细描述本公开的具体实施方式。

本公开提出了一种机器学习计算装置新框架,它具有易于编程和高效运行的优点,这种框架是以分形(fractal)的方式组织计算装置的各个组成部分。“分形”原是几何学上的用词,指的是以非整数维形式充填空间的形态特征,通常被定义为零碎的几何形状,可以分成数个部分,且每一部分都是或至少近似整体缩小后的形状,即具有自相似的性质。分形一词在计算机领域指的是机器会迭代分解,该分解具有任意规模的自相似模式。

图1示出一种分形计算装置的框架示意图。计算装置101、计算装置102、计算装置103及计算装置104都是规模大小不同的计算单元,其中计算装置101是计算装置102的分形单元,也就是计算装置102主要是由计算装置101排列组成的,计算装置102是计算装置103的分形单元,计算装置103是计算装置104的分形单元。可以理解的,计算装置104拥有的计算单元最多,因此,计算装置104的算力最强,反之,计算装置101的算力最弱。这些计算装置根据算力强弱,适用于不同规模的不同方案,例如计算装置101可以应用在单核加速器,计算装置102可以应用在多核芯片,计算装置103可以应用在多芯片服务器,而计算装置104可以应用在多服务器系统。由于这种分形计算装置具有相同的分形单元,高度重复的结构使得控制计算装置变得十分容易。

本公开的技术方案是一系列能被相同指令集所驱动的同构、串行、多层、层相似的机器学习计算装置,其具有分形的冯.诺伊曼架构来迭代管理每一层的计算单元,而每一层的计算单元仍然是冯.诺伊曼架构且由相同指令集所驱动的机器。本公开的机器学习计算装置支持分形计算,母节点(上层计算单元)可以将指令迭代分解为子节点(下层计算单元)上的指令。层数量直接对应至计算规模,不同计算规模的机器学习计算装置可以用于嵌入式系统、台式机、数据中心到超级计算装置等不同场景。因此,开发者只需要考虑一组指令集,控制最顶层的计算单元,便可驱动规模大小不同的设备,十分容易扩展。

机器学习为计算及访存密集型技术,在不同层次上是高度并行的。本公开将机器学习分解为基于矩阵和向量的多种运算,例如:将向量乘矩阵和矩阵乘向量等操作聚合为矩阵相乘;将矩阵加/减矩阵、矩阵乘标量和向量基本算数运算等操作聚合为按元素逐个(element-wise)运算等。通过将机器学习进行分解、聚合,本公开提出七个主要的计算原语(primitive):

以上计算原语概括了机器学习的主要特征,也就是说机器学习的计算基本上都可以利用这些计算原语的组合来实现,并且这些计算原语都是可以被分形的运算。

如果一个运算式f(x)满足以下条件,则可以被称为是分形运算:

f(x)=g(f(xa),f(xb),…)

其中,f(·)是目标运算符,g(·)是取回运算符(retrievingoperator),x表示f(·)所有的操作数,可以为张量数据,而xa、xb等表示操作数x的子集。

基于分形后的操作数xa、xb…和x之间的关系,可以将分形运算分为三类:独立运算、输入依赖运算和输出依赖运算。

独立运算是指分形后的操作数xa、xb…彼此独立且不重合,每个子集可以做单独运算,且只需要组合每个子集局部运算的结果即可得到最终的运算结果。以向量加法运算作为示例来解释说明独立运算,假设以下算式要被运算:

由于可以分别分为两个独立子集因此前述算式能推演为:

也就是两个子集可以独立完成局部向量加法运算,即最终的运算结果只需要合并每个局部运算的结果即可。换言之,也能分为独立子集

输入依赖运算是指xa、xb等至少部分重叠,每个子集都需要一些输入的额外副本,以进行完整的运算,从而导致分形操作中的数据冗余,所谓的数据冗余是指同一个数据在系统中多次重复被使用。例如,在进行一维卷积时,同样利用来表示两个操作数,其中运算上分为两部分,每一部分都在输出的独立部分上工作,即然而,基于卷积的特性,这两个运算的输入重叠,会需要额外的的一部分(即)来与分形的另一部分做运算,也就是数入端的操作数无法独立分形,互有依赖。

输出依赖运算是指每个分形单元产出计算结果后,还需要进行归约(reduce),才能得到最终结果。归约是指在基于对数据本身内容理解的基础上,根据数据的某些特征分别计算,以缩减数据计算规模,从而在尽可能保持数据原貌的前提下,最大限度地精简数据量,再以该特征为基础还原或整合计算结果。例如,将内积运算分成较小的单位,每个计算单元均执行部分内积运算,例如但是要获得最终结果,必须将这些运算结果做归约,进行归约时计算结果是互为依赖的。

计算原语根据不同的分解方式,会导致依赖性有所差异,具体如表1所示。

表1计算原语分析

举例来说,卷积运算可以在通道维度上以输入特征图(inputfeaturesmap)为基础划分,最终输出取决于每个划分部分的结果,因此属于输出依赖运算,或者卷积运算也可以按矩阵高度或宽度划分输入特征图,则输出结果的每个部分就会需要具有一定重叠的输入,因此属于输出依赖运算。显然,独立运算很容易映射到图1所示的分形架构和分形计算中,而输入依赖运算需要转换为具有输入冗余的独立运算,原则上也可视为是独立的,而输出依赖运算则需要归约程序。

在表1中,本公开以分形的形式对计算原语的分解进行了分析,其显示以分形的形式执行机器学习计算是完全可行的,但是在设计分形体系结构时仍存在以下挑战。本公开均提出相应有效的解决方案:

归约运算

输出依赖运算的归约运算g(·)不像独立运算和输入依赖运算那样适合分形框架,为了有效地处理g(·),本公开在每个节点引入了本地计算单元,通过将每层的分形计算单元中的数据迭代地聚合到上层的本地计算单元中,由上层的本地计算单元有效地执行归约运算。

数据冗余

在分形运算中,将输入依赖运算转换成具有数据冗余的独立运算,为此,本公开的计算装置的存储器是分区组织的,可以在不同的时间序里访问存储器的任一区,以获取数据。

通信

不同节点之间的通信需要大量的线路连接,导致芯片面积过大,还有延迟和耗能等问题。为此,根据本公开的方案,即使是输出依赖运算,也只需要将数据从下层计算单元传送到上层计算单元进行归约运算。因此,本公开的计算装置没有必要在任何一对节点之间进行通信,改以分形的形式堆叠组织机器学习计算,信号传递仅限于上下层间,从而减少了线路的布局。

本公开的一个实施例是具有母子连接关系的计算单元的计算装置,这些计算单元从最高级(0级)计算单元(母节点)译码并将指令发送到其分形功能单元(子节点),其中,每个分形功能单元重复译码、发送过程直到叶计算单元执行为止。叶计算单元将计算结果返回到其母节点,该操作一直重复到最高级计算单元(母节点)为止。

此实施例提供了一种计算装置,包括多层计算单元,每一个计算单元包括控制器、采用的内存组件以及分形功能单元。

图2示出此实施例的计算装置的框图。如图2所示,计算装置的第一层可以为一个计算单元,该计算单元可以包括控制器、内存组件以及功能单元,其中功能单元便是下一层(第二层)计算单元,第二层计算单元可以有多个,具体的数量本公开不作限定。如图2所示,第二层计算单元内也可以包括:控制器、内存组件以及下一层(第三层)计算单元。同样的,第i层计算单元内可以包括:控制器、内存组件以及第i+1层计算单元,其中,i为自然数。

其中,控制器可以以硬件的形式实现,例如可以是数字电路、模拟电路等等;硬件结构的物理实现包括但不局限于晶体管,忆阻器等等,控制器也可以通过软件的方式实现,本公开对此不作限定。内存组件可以为随机存储器(ram),只读存储器(rom),以及高速缓存(cache)等,本公开内存组件的具体形式不作限定。

需要说明的是,尽管图2中只画出了第一层计算单元中包括的第二层计算单元中的一个功能单元的展开结构(图2示出的第二层),可以理解的是图2仅仅是示意图,其他第二层计算单元的展开结构中同样包括控制器、内存组件以及第三层计算单元,图1为了简化没有示出其他第二层计算单元的展开结构,第i层计算单元同样也是如此。其中,不同的第i层计算单元中包括的第i+1层计算单元的个数可能相同,也可能不同,本公开对此不作限定。

本公开的另一实施例是另一种分形计算装置,其框架如图3所示。此分形计算装置300包括多层计算单元,例如根计算单元301、第i层计算单元302、第i+1层计算单元303、叶计算单元304。根计算单元301为最顶层,或称为第0层计算单元;在根计算单元301之下有多个中层计算单元,这些中层计算单元具有同样的结构,在图3中以第i层计算单元302和第i+1层计算单元303示例说明;叶计算单元304为最底层计算单元,专门负责计算。

每层计算单元均包括控制器、功能单元及存储器,控制器接收上层发送来的任务,用以指派任务或将任务分解成子任务,再发送给功能单元,功能单元用以执行所分配的任务,存储器则用以存储与这些任务相关的数据。

根计算单元301包括控制器305、功能单元(fu)306及存储器307。根计算单元301做为最顶层计算单元,主要接收一个完整的计算指令,例如是执行矩阵相乘的任务,所述矩阵相乘指令和矩阵数据存储在存储器307中,控制器305根据所述计算指令,接收到相应的任务,并发送本地指令控制功能单元306执行所述任务,控制功能单元306进行运算。更详细来说,功能单元306本身并不执行具体计算,仅将任务下发给中层计算单元。

如前所述,中层计算单元是由多层相同结构的计算单元所堆叠而成,此处以第i层计算单元302示例说明。第i层计算单元302包括控制器308、存储器309及分形功能单元(fractalfunctionalunit,ffu)310及本地功能单元(localfunctionalunit,lfu)311。

控制器308用以自上层接收到任务,以产生分形指令及本地指令。更详细来说,控制器308基于同层分形功能单元310的数量,决定拆分任务的方式及数量,以形成子任务,使得每个分形功能单元310都对应一个子任务,并将这些信息载入至分形指令中,再基于拆分任务的方式及数量,决定归约的方式,也就是本地任务,并将归约的信息载入至本地指令中。

第i层计算单元302示例性的包括四个分形功能单元310,需特别注意的是本公开并不限制分形功能单元的数量。每个分形功能单元310接收到控制器308发送的分形指令,根据所接收到的分形指令,下发相对应的子任务。对第i层计算单元302来说,分形功能单元310亦不执行具体计算,而是将子任务下发给第i+1层计算单元303。同时,第i+1层计算单元303的控制器将执行任务所需的数据自存储器309复制到第i+1层计算单元303的存储器中。

第i层分形计算单元302示例性的包括两个本地功能单元311,需特别注意的是本发明并不限制本地功能单元的数量。本地功能单元311接收来自控制器308的本地指令,根据本地指令执行本地任务,所述本地任务包括归约所有返回到分形功能单元310的计算结果。

存储器309则用以存储执行子任务所需的数据。

如图3所示,每个分形功能单元310其实就是下一层的分形计算单元。第i层分形计算单元302的分形功能单元310的子任务下发到第i+1层分形计算单元303后,第i层分形计算单元302的子任务即是第i+1层分形计算单元303的任务,第i+1层分形计算单元303在基于前述的操作将任务进一步分割下发,直到最底层分形计算装置,也就是叶计算单元304。

叶计算单元304同样包括控制器312、功能单元313及存储器314。控制器312根据接收到的任务,产生分形指令。与中层计算单元不同的是,功能单元313只有分形功能单元,其为加速器,并根据所述分形指令计算子任务。叶计算单元304示例性的包括三个分形功能单元313,需特别注意的是本发明并不限制功能单元313的数量。以前述的矩阵乘法为例,矩阵乘法的任务经每层持续分形分解成许多的子任务,到了叶计算单元304后,功能单元313执行计算,获得计算结果,暂存在存储器314中,控制器312将计算结果返回给上一层的计算单元。

同样以第i层计算单元302做说明,第i层计算单元302接收到所有分形功能单元310的计算结果后,暂存于存储器309中,本地功能单元311执行任务中的本地任务,也就是将第i层的计算结果进行归约,控制器308再将归约后的计算结果往上一层发送,直到最顶层的根计算单元301,便完成计算任务。

由前述可知,此实施例的分形计算装置300具有多层的计算单元,任务会根据同层分形功能单元的数量拆解成子任务,下发再分形,直到叶计算单元。叶计算单元执行计算后,将计算结果发送回上一层,上一层的本地功能单元进行归约,将归约后的计算结果再往上一层发送,直到根计算单元,便完成了计算任务。换言之,中层计算单元执行分形下发,并将计算结果进行归约后上传,叶计算单元则负责具体的计算任务。

根计算单元301所接收到的输入指令可以包括:运算符和操作数参数,所述操作数参数是指向输入指令的操作数的参数,所述操作数参数包括全局参数和局部参数,全局参数是表示输入指令对应的第一操作数的大小的参数,局部参数是表示输入指令的第二操作数在所述第一操作数中的起始位置和第二操作数的大小的参数。也就是说,第二操作数可以是第一操作数中的部分数据或者全部数据,执行输入指令时可以实现对第二操作数的处理,对第二操作数的处理是与输入指令的运算符对应的处理。

在前述的实施例中,由于每层计算单元的结构都相同,因此可以使用同一种指令集架构来驱动,使得控制本公开的分形计算装置变得十分简易。这种指令集称为分形指令集架构(fractalinstructionsetarchitecture,fisa)。分形指令集的指令i由一个三元组〈o,p,g〉所组成,其中o代表特定运算,p是一个有限的操作数集,g是粒度指示符。当且仅当指令i〈o,p,g〉存在一组指示符g′1、g′2、g′3、、、,使得i〈o,p,g〉可以通过计算i′1(g′1)、i′2(g′2)、i′3(g′3)、、、和其他fisa指令迭代获得时,i〈o,p,g〉才是分形指令。表2示出应用在本公开的分形计算装置的分形指令集。

表2:分形指令集

本公开通过前述的实施例揭示了分形计算装置,搭配分形指令集,使得驱动包括这类分形计算装置的芯片变得简易。图4示出以另外一个角度展示本公开的分形计算装置。分形计算装置400包括多层计算单元401、402、403、404、405,每层计算单元都是由相同结构的分形指令集406、407、408、409、410所控制。对程序员411来说,虽然欲控制的是整个分形计算装置400,但实际上他仅能“看见”最顶层的根计算单元401,其余层皆隐藏在分形指令集406后,换言之,程序员411只需要基于分形指令集406编写代码控制根计算单元401即可,根计算单元401的控制器会根据相同结构的分形指令集407,产生分形指令,进而控制下一层的计算单元402,以此类推,每层计算单元只需产生分形指令以控制下一层计算单元,因此各层只跟上下层产生联系,通信直接,指令简单,不受干扰。

在本公开的一种可能的实现方式中,前述控制器用于对任意一个计算单元的输入指令进行分解得到多个子指令,例如可以分解为多个并行子指令,将并行子指令发送给所述任意一个计算单元中的控制器控制分形功能单元,以流水线的方式分多个阶段执行。所述计算单元从上一层计算单元的内存组件中加载执行并行子指令需要的操作数,所述计算单元根据输入指令执行对应的操作。

所述多个阶段可以包括:指令译码id(instructiondecoding)、数据加载ld(loading)、操作执行ex(execution)、操作归约rd(reduction)以及数据写回wb(writingback),所述流水线按照指令译码id、数据加载ld、操作执行ex、操作归约rd以及数据写回wb的顺序传播。需要说明的是,以上实施方式中的多个阶段仅仅是本公开的一个示例,不以任何方式限制本公开,例如,所述多个阶段还可以包括串行分解等。

指令译码id是指对接收到的上一层(或者输入端)发送的输入指令进行译码处理,具体可以包括:根据输入指令对应的操作数的存储需求为输入指令分配本层计算单元的内存组件上的内存空间,并将分配的内存空间的地址(本地地址)绑定到输入指令中写操作数的指令上。

数据加载ld是指根据输入指令中记载所对应的读取操作数的地址,从上一层计算单元的内存组件中查找到输入指令对应的操作数的存储位置,并读取操作数,然后根据本地地址写入到本层计算单元的内存组件中。

操作执行ex是指根据操作符以及操作数获得运算结果的过程。如上所述,由于分形功能单元可能有多个,或者,本层计算单元的内存组件的容量小于存储输入指令需要的数据所需要的内存的容量,因此控制器还可以对输入指令进行分解。

有些操作还需要对分解后的指令的运算结果进行归约,即操作归约rd,才能得到输入指令的运算结果。

数据写回wb是指将本层计算单元的输入指令的运算结果写回到上一层计算单元中。

图5示出根据本公开的另一个实施例的流水线的示意图。下面结合图3所示的计算装置以及图5对以流水线的方式分多个阶段执行输入指令对应的操作的过程进行说明。如图3所示,以第i层计算单元为例,第i层计算单元接收上一层(第i-1层)计算单元的输入指令,并对输入指令进行指令译码id得到译码后的指令,加载运行输入指令需要的数据,然后将译码后的指令发送给下一层(第i+1层)计算单元,由下一层(第i+1层)计算单元根据加载的数据执行译码后的指令以完成操作执行ex阶段。由于本层计算单元的内存组件的容量可能小于存储输入指令需要的数据所需要的内存容量,因此控制器还可以对输入指令进行分解,有些操作还需要对分解后的指令的运算结果进行归约,即操作归约阶段操作归约rd,才能得到输入指令的运算结果,如果第i层计算单元不是第一层计算单元,第i层计算单元的控制器还需要将输入指令的运算结果写回到上一层(第i-1层)计算单元中。需要说明的是,下一层(第i+1层)计算单元也是以流水线的方式分所述多个阶段执行操作执行ex。也就是说,下一层(第i+1层)计算单元在接收到本层(第i层)计算单元的控制器发送的指令(作为下一层(第i+1层)计算单元的输入指令)后,可以对输入指令进行指令译码,从本层的内存组件中加载输入指令需要的数据,将译码后的指令发送给下一层(第i+1层)计算单元的下一层(第i+2层)计算单元以进行操作执行ex阶段。换言之,下一层(第i+1层)计算单元按照指令译码id、数据加载ld、操作执行ex、操作归约rd以及数据写回wb的顺序以流水线的形式执行操作。

本公开实施例的计算装置通过多层迭代的方式构建计算装置的层级架构,该计算装置的每个计算单元的结构是相同的,不同层的计算单元、不同规模的计算装置上都具有相同的编程接口和指令集架构,以执行相同格式的程序,和层与层之间隐式装载数据。计算装置的层级架构以通过迭代的流水线的方式执行输入指令对应的操作,高效利用每一层级的计算单元,提高了运算的效率。

如图5所示,本公开的串行分解器501的输出端和译码器502的输入端之间连接有子指令队列(sub-levelinstructionqueue)503,串行分解器501的输出端连接子指令队列503的输入端,子指令队列503的输出端连接译码器502的输入端。控制器还可以包括并行分解器(paralleldecomposer)504,并行分解器504的输入端连接译码器502的输出端,并行分解器504的输出端连接分形功能单元505的输入端,并行分解器504根据所述分形功能单元505的数量,对译码后的串行子指令进行并行分解得到并行子指令,再将并行子指令发送给分形功能单元505,以使分形功能单元505根据并行子指令对应的操作数并行运行并行子指令。其中,并行分解可以是指分解后的并行子指令可以并行执行。

此实施例的计算单元中设置有本地功能单元506、第一内存控制器507(directmemoryaccesscontroller,dmac)以及第二内存控制器508(directmemoryaccess,dma),所述控制器还包括:归约控制器(reductioncontroller)509。第一内存控制器507可以通过硬件电路或者软件程序的方式实现,本公开对此不作限定。

第一内存控制器507连接第二内存控制器508。任意一个计算单元的内存组件与所述任意一个计算单元的上一层计算单元和分形功能单元的内存组件之间连接有数据通路,如图5所示,内存组件i510连接内存组件i-1511,内存组件i510连接分形功能单元505可以是指连接下一层计算单元的内存组件i+1。第二内存控制器508可以连接数据通路,第一内存控制器507可以根据计算单元中的其他组件发送的控制信号控制第二内存控制器508,第二内存控制器508控制所述数据通路将输入指令的操作数从一个内存组件送往另一个内存组件。例如,第一内存控制器507可以根据译码器502发送的控制信号控制第二内存控制器508,将输入指令的操作数从上一层计算单元的内存组件i-1511加载到本地内存组件i510,或者,也可以将输入指令的运算结果从本地内存组件i510写回到上一层计算单元的内存组件i-1511。

在一种可能的实现方式中,第一内存控制器507可以根据控制信号生成加载指令,将加载指令发送给第二内存控制器508,由第二内存控制器508根据加载指令控制数据通路,实现数据的加载。

第一内存控制器507可以根据控制信号确定基地址、起始偏移量、加载数据的数量、跳转的偏移量等参数,然后根据基地址、起始偏移量、加载数据的大小、跳转的偏移量等参数生成加载指令,还可以根据操作数的维度设置循环加载数据的次数。其中,基地址可以是操作数在内存组件中存储的起始地址,起始偏移量为要读的操作数在原操作数中开始的位置,起始偏移量可以根据局部参数中的起始位置确定,加载数据的数量可以根据局部参数中的大小确定,跳转的偏移量表示下一部分要读的操作数在原操作数中开始的位置相对于上一部分读的操作数在原始操作数中开始的位置之间的偏移,也就是说,跳转的偏移量为下一个读取数据的起始偏移量相对于上一个读取数据的起始偏移量的偏移量。例如,可以将起始位置作为起始偏移量,将局部参数中的大小作为一次加载的数据的数量,将局部参数中的大小作为跳转的偏移量。

第一内存控制器507分别连接串行分解器501、译码器502,根据串行分解器501或译码器502发送的控制信号从上一层计算单元的内存组件中读取操作数、并写入当前计算单元的内存组件中。第一内存控制器507除了负责数据的读取、写入,还负责不同层计算单元之间的数据写回,例如,将i+1层计算单元的运算结果写回到第i层计算单元。

在一种可能的实现方式中,每一个计算单元的内存组件还连接同一计算单元内的本地功能单元506。译码器502的输出端还连接归约控制器509,归约控制器509连接本地功能单元506。归约控制器509用于控制本地功能单元506在操作归约rd阶段进行归约以得到输入指令的运算结果,并将运算结果写入到内存组件i510中。第一内存控制器507可以控制第二内存控制器508将内存组件i510中的运算结果写回到上一层计算单元的内存组件i-1511中。

串行分解器501可以将串行分解后的串行子指令输出到子指令队列503中,译码器502从子指令队列503中获取串行子指令,译码器502主要根据主体指令存储数据的需求在内存组件i510上分配内存空间,译码器502是根据主体指令对应的操作数的存储需求为串行子指令分配本层计算单元的内存组件上的内存空间,并将分配的内存空间的地址(本地地址)绑定到主体指令中获取操作数的指令上,从而实现译码处理。

译码器502还可以根据串行子指令向第一内存控制器507发送控制信号,第一内存控制器507可以根据控制信号控制第二内存控制器508将串行子指令对应的操作数加载到为其分配的内存空间中,也就是说根据串行子指令中记载的输入指令对应的操作数的地址从上一层计算单元的内存组件中查找到串行子指令对应的操作数的存储位置,并读取操作数,然后根据本地地址写入到本层计算单元的内存组件中。

译码器502对串行子指令进行译码处理后发送给并行分解器504,并行分解器504可以根据分形功能单元505的数量对译码处理后的串行子指令进行并行分解,并行分解可以是指分解后的并行子指令可以并行执行。举例来说,假设串行子指令为对向量a和b相加,其中,a=(a1,a2…aj,…an),b=(b1,b2…bj,…bn),其中,n表示向量a和b中元素的个数,n为正整数,j表示元素的序号,j为正整数且j≤n,那么并行分解器504可以根据分形功能单元的数量将串行子指令并行分解为多个并行子指令,每个并行子指令负责处理向量中部分数据的相加操作,例如,假设n=4,并行分解器504连接了4个分形功能单元505,则并行分解器504可以对串行子指令并行分解得到4个并行子指令,4个并行子指令分别为对a1和b1、a2和b2、a3和b3以及a4和b4相加,并行分解器504可以将4个并行子指令发送给分形功能单元505。需要说明的是,以上举例仅仅是为了说明并行分解的示例,不以任何方式限制本公开。

在一种可能的实现方式中,所述任意一个计算单元中的控制器控制所述分形功能单元,以流水线的方式分多个阶段执行所述任意一个计算单元的串行子指令对应的操作。图6示出根据本公开的另一个实施例的流水线的示例。

如图6所示,多个阶段可以包括:指令译码id、数据加载ld、操作执行ex、操作归约rd以及数据写回wb,所述流水线按照指令译码id、数据加载ld、操作执行ex、操作归约rd以及数据写回wb的顺序传播。

译码器502用于对所述多个子指令(串行子指令)进行指令译码。译码器502根据所述头部指令向所述第一内存控制器507发送第一控制信号,以使第一内存控制器507根据第一控制信号控制第二内存控制器508加载共用操作数。对于所述主体指令,译码器502可以根据主体指令对应的其他操作数的存储需求分配本层计算单元的存储器上的内存空间,并将分配的内存空间的地址(本地地址)绑定到主体指令中获取或者存储其他操作数的指令上,从而实现译码处理。译码器502还可以根据主体指令向第一内存控制器507发送第二控制信号,以使第一内存控制器507根据第二控制信号控制第二内存控制器508存取其他操作数。

在一种可能的实现方式中,所述内存组件可以包括静态内存段701和循环内存段702。图7示出根据此实施例的内存组件的划分的示意图。如图7所示,可以所述内存组件的内存空间划分为静态内存段701和循环内存段702。

如上文所述,输入指令可以是描述了机器学习的操作指令,机器学习的操作以由表1中的计算原语组成,输入指令可以包括操作数和操作符等。也就是说,对于任意一个计算单元的输入指令:控制器对输入指令进行分解得到的多个子指令,这多个子指令可能会共用一部分操作数,这部分操作数即共用操作数。以矩阵相乘运算作为示例,假设输入指令为对矩阵x和y相乘,如果仅仅对矩阵x进行分解,那么对输入指令进行串行分解得到的串行子指令需要共同使用操作数y,操作数y为共用操作数,也就是输入依赖运算。

如果所述多个子指令之间存在共用操作数,则所述控制器在所述静态内存段701中为所述共用操作数分配内存空间。

对于共用操作数,为了避免频繁的读写,本公开在内存组件中设置静态内存段701专门用于存储共用操作数,在所述循环内存段702中为所述多个子指令的其他操作数分配内存空间。对于多个子指令的共用操作数,在执行多条子指令之前,只需要执行一次将共用操作数从任意一个计算单元的上一层计算单元的内存组件中加载共用操作数到静态内存段701的操作即可,可以避免频繁存取数据、节约带宽资源。

上述其他操作数可以是指,输入指令的操作数中被分解的操作数、执行子指令得到的中间结果、归约结果,等等,其中,归约结果可以是对中间结果进行操作归约得到的,操作归约可以是指上文中提到的归约处理。

在一种可能的实现方式中,可以根据基地址以及起始偏移量确定开始读取操作数的起始地址,根据加载数据的数量以及起始地址可以确定一次读取操作数的结束地址,根据起始地址以及跳转的偏移量可以确定下一部分要读的操作数的起始地址,同样的,可以根据加载数据的数量以及下一部分要读的操作数的起始地址确定本次读取操作数的结束位置,重复以上过程,直到达到循环加载操作数的次数。其中的一次读取操作数和本次读取操作数可以是指:读取同一个操作数需要一次或多次完成,每次读取同一个操作数中的部分操作数,上述一次和本次可以是指多次中的一次。

也就是说,读取一个操作数可能需要循环多次读取完成,第一内存控制器507可以根据基地址、起始偏移量、加载数据的数量、跳转的偏移量确定每次读取操作数时的起始地址和结束地址,例如,针对每次读取过程,可以根据上一次读取过程的起始地址和跳转的偏移量确定本次读取过程的起始地址,再根据本次读取过程的起始地址和加载数据的数量(以及数据的格式)确定本地读取过程的结束地址。其中,跳转的偏移量是根据跳转的数据的数量以及数据的格式确定。

第二内存控制器508用于数据加载ld:将输入指令的操作数加载到内存组件,具体包括:根据与所述头部指令对应的第一控制信号从上一层计算单元的内存组件中加载共用操作数到图7的静态内存段701,根据与所述主体指令对应的第二控制信号从上一层计算单元的内存组件中加载所述其他数据到图7的循环内存段702。所述第二内存控制器508根据所述第二控制信号从上一层计算单元的内存组件中加载所述其他数据到所述循环内存段702,这里主要是加载的其他操作数中的部分操作数,主要是输入操作数中的一部分,而不是中间结果或者归约结果。

译码器502对串行子指令进行译码处理后发送给并行分解器504,并行分解器504可以根据并行分解器504连接的分形功能单元505的数量对译码处理后的串行子指令进行并行分解,并行分解可以是指分解后的并行子指令可以并行执行。

分形功能单元505可以以流水线的方式分多个阶段执行所述操作执行,得到执行结果。归约控制器509用于控制本地功能单元506对所述执行结果进行操作归约,得到所述输入指令的运算结果,第二内存控制器508还用于数据写回:将运算结果写回到所述任意一个计算单元的上一层计算单元的内存组件中。

通过设置指令队列512作为串行分解器501与上一层计算单元之间的缓冲,可以省去串行分解器501与上一层计算单元之间严格的同步执行关系。指令队列512可以简化电路设计,同时提高执行效率,例如,允许串行分解器501和上一层计算单元之间异步执行,以减少串行分解器501等待上一层计算单元发送输入指令的时间。子指令队列503作为串行分解器501与译码器502之间的缓冲,可以省去串行分解器501与译码器502之间严格的同步执行关系。子指令队列503可以简化电路设计,同时提高执行效率,例如,允许串行分解器501异步执行,减少译码器502等待串行分解器501对输入指令进行串行分解的时间等。通过设置指令队列512和子指令队列503可以提高计算装置的处理效率。

在一种可能的实现方式中,控制器用于对任意一个计算单元的输入指令进行分解得到多个子指令,包括:串行分解器501根据所述输入指令需要的内存容量、所述内存组件的容量,对所述输入指令进行串行分解得到串行子指令。

对输入指令的串行分解可以包括对输入指令的操作数的分解以及对输入指令的分解。在进行串行分解时,为了更有效的利用计算单元的资源,串行分解得到的串行子指令将具有尽可能大的分解粒度,串行分解得到的串行子指令的分解粒度由计算单元的资源决定,例如,计算单元的资源可以为计算单元的内存组件的容量。这里的分解粒度可以指分解操作数的维度。

输入指令需要的内存容量根据存储输入指令的操作数需要的内存容量、以及存储操作符对操作数进行处理后的中间结果需要的内存容量等确定,在确定输入指令需要的内存容量后,可以判断本层计算单元的内存组件的容量是否满足输入指令需要的内存容量,如果不满足,则可以根据本层计算单元的内存组件的容量对输入指令进行串行分解得到串行子指令。

为便于理解,下面会用一种具体的操作作为示例对串行分解的过程进行解释。以矩阵相乘运算作为示例说明串行分解器501的功能,假设输入指令为对矩阵x和y相乘,串行分解器501可以根据矩阵x和矩阵y的大小确定输入指令需要的内存容量,可以将输入指令需要的内存容量与本层计算单元的内存组件的容量进行比较,如果输入指令需要的内存容量大于本层计算单元的内存组件的容量,则需要对输入指令进行串行分解。具体的过程可以为,对操作数进行分解,从而将输入指令分为多个串行子指令,该多个串行子指令可以串行执行,例如,可以对矩阵x或者矩阵y进行分解,或者对矩阵x和矩阵y都进行分解。以对矩阵x进行分解为例,可以将输入指令串行分解为多个矩阵相乘的串行子指令以及求和的串行子指令,在串行执行完多个矩阵相乘的串行子指令后,根据多个矩阵相乘的串行子指令的运算结果以及求和的串行子指令进行求和得到输入指令的运算结果。需要说明的是,上述对于矩阵相乘的串行分解方式仅仅是本公开为了说明串行分解器501的功能的一个示例,不以任何方式限制本公开。

在一种可能的实现方式中,串行分解器501根据所述任意一个计算单元的内存组件的容量、以及所述输入指令需要的内存容量,对所述输入指令进行串行分解得到串行子指令,具体可以包括:确定操作数的维度的分解优先级,按照分解优先级的顺序依次选择对操作数分解的维度,并以二分法方式确定最大分解粒度,直到分解后的操作数需要的内存容量小于或等于本层计算单元的内存组件的容量。通过这种分解方式保证以尽可能大的分解粒度对输入指令进行串行分解。

在一种可能的实现方式中,为了提高分解的效率,对于任一选择的对操作数分解的维度,在该维度方向上以二分法方式确定最大分解粒度之前,可以先确定在该维度方向上分解为原子大小之后的操作数需要的内存容量,与本层计算单元的内存组件的容量之间的大小关系。如果在该维度方向上分解为原子大小之后的操作数需要的内存容量<本层计算单元的内存组件的容量,则以在该维度方向上以二分法方式拆分操作数;如果在该维度方向上分解为原子大小之后的操作数需要的内存容量>本层计算单元的内存组件的容量,则按照分解优先级在下一个维度方向上重复以上过程;如果在该维度方向上分解为原子大小之后的操作数需要的内存容量=本层计算单元的内存组件的容量,则可以直接确定分解的维度。其中,分解为原子大小可以指分解粒度为1。

图8示出本公开的另一实施例的串行分解的流程图。如图8所示:(1)在步骤801中,确定输入指令的操作数的维度的分解优先级,在一种可能的实现方式中,可以按照操作数的维度的大小确定分解优先级,维度越大分解优先级越高,优先分解操作数的最大维度,比如说,操作数x为n维张量,维度分别为t1、t2、…ti、…tn,其中,t1<t2<…ti…<tn,其中,i表示不同的维度,i为正整数且i≤n,那么在确定对操作数x的维度的分解优先级时,tn维度最大,分解优先级最高,其次为tn-1…ti…t2、t1。

(2)按照分解优先级的顺序选择对操作数分解的维度,将i初始化为n。在步骤802中,判断i=>0;如是,执行步骤803,在ti方向上确定分解粒度为1,在步骤804中,判断在ti方向分解为1后的操作数需要的内存容量与本层计算单元的内存组件的容量的大小关系,若小于,则在ti维度方向上以二分法方式分解操作数,具体过程可以为:在步骤805中,确定最小分解粒度min=0,最大分解粒度max=ti;在步骤806中,确定在ti方向上分解粒度为[(max-min)/2];在步骤807中,判断在ti方向上分解为[(max-min)/2]的操作数需要的内存容量与本层计算单元的内存组件的容量的大小关系,若分解为[(max-min)/2]的操作数需要的内存容量=本层计算单元的内存组件的容量,则可以结束分解的过程。若分解为[(max-min)/2]的操作数需要的内存容量<本层计算单元的内存组件的容量,则步骤808设置最小分解粒度min=[(max-min)/2],若分解为[(max-min)/2]的操作数需要的内存容量>本层计算单元的内存组件的容量,则在步骤809中设置最大分解粒度max=[(max-min)/2];在步骤810中,判断此时最大分解粒度与最小分解粒度的差值是否为1,如果为1,则执行步骤811,在ti方向上确定分解粒度为min,若不为1,则返回步骤806继续在确定在ti方向上分解粒度为[(max-min)/2],如此重复以上步骤806-811的过程。

(3)回到刚才的步骤802,若在ti方向分解为1后的操作数需要的内存容量等于本层计算单元的内存组件的容量,则可以确定分解的维度,结束分解操作数的过程;若在ti方向分解为1维后的操作数需要的内存容量大于本层计算单元的内存组件的容量,则另i=i-1,并返回到步骤802,判断此时i=i-1>0,接着执行步骤803。重复上述过程,直到确定出分解后的操作数需要的内存容量满足本层计算单元的内存组件的容量。

在分解完操作数后,可以根据分解的操作数对输入指令进行分解,具体可以包括:将输入指令分解为多个串行子指令,多个串行子指令中包括负责分解后的各子集的操作数的运算的串行子指令,若串行分解后存在输出依赖,则多个串行子指令中还可以包括归约指令。

需要说明的是,图8仅仅是对操作数分解的过程的一个示例,不以任何方式限制本公开。可以理解的是,还可以通过其他方式确定分解粒度,比如,分解优先级可以通过其他方式选择,对维度分解的方式也不限于二分法,只要能选择尽可能大的分解粒度即可。

控制器中的串行分解器501、译码器502和并行分解器504是分开的,内存分配在时间上可以很好地错开。具体来说,并行分解器504总是在译码器502之后分配内存空间,但分配的内存空间释放得更早,译码器502总是在串行分解器501之后分配内存空间,但分配的内存空间同样释放得更早。而用于串行分解器501进行串行分解的内存空间可能会在多个串行子指令中用到,因此,为串行分解器501设置了静态内存段701,而其他部分共用内存组件中除了静态内存外的内存(循环内存段702)。

在以上流水线的多个阶段中,除了指令译码id外其他4个阶段均涉及内存的访问,因此,最多有4条指令同时需要访问内存。而数据加载ld和数据写回wb阶段都是第二内存控制器508访问内存段,数据加载ld和数据写回wb的先后顺序由第一内存控制器507控制,访问内存时不会产生冲突,也就是说会有3条指令同时访问循环内存段702,因此,此实施例将循环内存段702划分为多段子内存块,例如可以划分为3段子内存块。在译码器502需要为串行子指令的操作数分配内存空间时,可以按照串行子指令的输入顺序依次在3段子内存块中为串行子指令的操作数分配内存空间,这样的话,可以降低内存管理复杂性、并且可以提高内存空间利用率。

在一种可能的实现方式中,控制器设置有第一计数器,循环内存段702包括多段子内存块,控制器在循环内存段702中为所述多个子指令的其他操作数分配内存空间,包括:控制器从循环内存段702中与第一计数器的计数值对应的子内存块内,为所述其他操作数分配内存空间。

图9及图10示出根据本公开的另一实施例的内存组件的划分的示意图。图10的内存组件与图7近似,不同处在于图10的内存组件将循环内存段702进一步划分为3段子内存块1001、1002、1003,所述3段子内存块的内存容量大小可以相同,也可以不同,本公开对此不作限定。译码器502从子指令队列503中获取串行子指令后,对于串行子指令中的主体指令,可以按照主体指令以及第一计数器的计数值顺序为其分配循环内存段702的内存空间。举例来说,若获取了一条第一主体指令,第一计数器的计数值为0,那么译码器502将在子内存块1001中为第一主体指令的操作数分配内存空间;然后获取了一条第二主体指令,此时第一计数器的计数值为1,那么译码器502将在子内存块1002中为第二主体指令的操作数分配内存空间;然后获取了一条第三主体指令,此时第一计数器的计数值为2,那么译码器502将在子内存块1003中为第三主体指令的操作数分配内存空间;如果再获取了一条第四主体指令,此时第一计数器的计数值会回到0,那么译码器502将在子内存块1001中为第四主体指令的操作数分配内存空间,以此类推。

图9中还示出此实施例的多条指令的流水线传播过程的示意图。下面结合上述分配内存空间的示例以及流水线的传播过程对此进行说明。如图9所示,在t1时,在译码器502为第一主体指令在子内存块1001中分配内存空间后,发送给并行分解器504,由并行分解器504对第一主体指令进行并行分解得到(多个)并行子指令1。

在t2时,译码器502为第二主体指令在子内存块1002中分配内存空间,对于第一主体指令,进入到数据加载ld阶段,由第二内存控制器508将第一主体指令的输入操作数加载到子内存块1001中,也就是此时由第二内存控制器508使用子内存块1001。

在t3时,译码器502为第三主体指令在子内存块1003中分配内存空间;对于第二主体指令,进入到数据加载ld阶段,由第二内存控制器508将第二主体指令的输入操作数加载到子内存块1002中,也就是此时由第二内存控制器508使用子内存块1002;对于第一主体指令,则进入到操作执行ex阶段,由分形功能单元505执行并行指令1,并将执行结果写回到子内存块1001,也就是此时由分形功能单元505使用子内存块1001。

在t4时,译码器502为第四主体指令在子内存块1001中分配内存空间;对于第三主体指令,进行到数据加载ld阶段,由第二内存控制器508将第三主体指令的输入操作数加载到子内存块1003中,也就是此时由第二内存控制器508使用子内存块1003;对于第二主体指令,进行到操作执行ex阶段,由分形功能单元505执行并行指令2,并将执行结果写回到子内存块1002,也就是此时由分形功能单元505使用子内存块1002;对于第一主体指令,本地功能单元506对执行结果进行操作归约,也就是此时由本地功能单元506使用子内存块1001。

在t5时,对于第一主体指令,进行到数据写回wb阶段,第二内存控制器508将子内存块1001中的归约结果写回到上一层计算单元的内存组件上;对于主体指令4,进行到数据加载ld阶段,由第二内存控制器508将主体指令4的输入操作数加载到子内存块1001中,也就是此时由第二内存控制器508使用子内存块1001;对于第三主体指令,进行到操作执行ex阶段,由分形功能单元505执行并行指令3,并将执行结果写回到子内存块1003,也就是此时由分形功能单元505使用子内存块1003;对于第二主体指令,本地功能单元506对执行结果进行操作归约,也就是此时由本地功能单元506使用子内存块1002。

通过以上过程可知,在流水线传播的过程中,第二内存控制器508、分形功能单元505以及本地功能单元506按顺序循环使用3段子内存块。能够降低内存管理的复杂性,并提高内存空间利用率。

需要说明的是,五级流水线并不是在每条指令执行的过程中都需要经历的。比如输入指令为排序sorta,b,进行串行分解,会产生规约,串行分解器501会得到串行子指令:

sorta1,k1;

sorta2,k2;

mergek1,k2,b;

其中a1,a2,b位于上一层计算单元的内存组件中,k1,k2被串行分解器501分配于静态内存段701。

所以执行串行子指令sorta1,k1时,译码器502不对k1进行降级,因此,也就不需要写回,数据写回wb阶段会成为空泡。在操作归约rd阶段,本地功能单元506将结果写到静态内存段701的k1上;执行串行子指令sorta2,k2的过程和执行串行子指令sorta1,k1的过程类似。

而执行mergek1,k2,b时,译码器502也不对k1,k2进行降级,也就是说,不需要加载数据,数据加载ld阶段会成为空泡。在操作执行ex阶段时,分形功能单元505会直接访问静态内存段701来取数据。

在一种可能的实现方式中,如果三条相邻(或者相距比较近)的输入指令都存在共用操作数时,由于本公开的计算装置采用流水线的方式处理输入指令,串行分解器501在静态内存段701为共用操作数分配内存空间时,就有可能出现静态内存段701碎片化的问题,造成内存空间利用率低。

图11示出根据本公开另一实施例的静态内存段701的内存空间分配方法的示意图。

举例来说,假设三条相邻的输入指令的共用操作数分别为操作数1、操作数2和操作数3。如图11所示,串行分解器501先为输入指令1的操作数1分配内存空间,再为第二条输入指令2的操作数2分配内存空间,此时操作数1还在使用,因此可以在操作数1存储相邻的位置为操作数2分配内存空间;在第三条输入指令3到达时,操作数1可能已经使用完毕,操作数2还在使用,此时可以在操作数1存储的位置为操作数3分配内存空间,但是操作数3需要的内存空间可能稍微小于存储操作数1的内存空间,此时,存储操作数3和操作数2的内存空间之间可能就会有一部分内存空间无法利用。或者,存储操作数3需要的内存空间可能稍微大于存储操作数1的内存空间,此时,可能需要在图11中操作数2的右侧为操作数3分配内存空间。导致内存管理复杂,并且内存空间利用率低。

为了解决上述技术问题,本公开还在所述控制器中设置有第二计数器,第二计数器为不同的计数值时,串行分解器501可以按照串行分解产生的头部指令的顺序以及第二计数器的值,在静态内存段701中不同的端为共用操作数分配内存空间。

图12示出根据本公开的另一实施例的静态内存段701的内存空间分配方法的示意图。结合图12对串行分解器501为共用操作数分配静态内存段701的内存空间的过程进行说明。串行分解器501从子指令队列503中获取输入指令1,对输入指令1进行串行分解后得到多个串行子指令1,多个串行子指令1具有共用操作数1,串行分解器501要从静态内存段701中为操作数1分配内存空间,假设此时第二计数器的计数值为0,那么串行分解器501可以从图12所示的a端为操作数1分配内存空间。

接着串行分解器501从子指令队列503中获取输入指令2,对输入指令2进行串行分解后得到多个串行子指令2,多个串行子指令2具有共用操作数2,串行分解器501要从静态内存段701中为操作数2分配内存空间,此时第二计数器的计数值为1,那么串行分解器501会从图12所示的b端为操作数2分配内存空间。

接着串行分解器501从子指令队列503中获取输入指令3,对输入指令3进行串行分解后得到多个串行子指令3,多个串行子指令3具有共用操作数3,串行分解器501要从静态内存段701中为操作数3分配内存空间,此时第二计数器的计数值回为0,那么串行分解器501会从图12所示的a端为操作数3分配内存空间。如果操作数1不再需要了,则操作数3直接覆盖操作数1;如果操作数1还需要,则操作数3在操作数1旁接续存储。

通过本实施例可以在输入操作数与之前的多条串行子指令的输出操作数不存在重叠的情况,采用指令预加载以上内存管理的方式加快处理,以提高计算装置的处理效率,降低内存管理复杂性,并且提高内存空间利用率。

在图5的实施例中,控制器还可以包括委托寄存器513(commissionregister,cmr),在归约控制器509判断对所述分形功能单元505的运算结果进行归约处理所需要的资源大于本地功能单元506的资源上限时,归约控制器509可以根据串行子指令向委托寄存器513写入委托指令,并行分解器504定期检查委托寄存器513中是否存在委托指令,若存在委托指令,则根据委托指令控制分形功能单元505对其运算结果进行归约处理得到输入指令的运算结果。其中的定期检查可以是根据处理的周期检查,处理的周期可以根据分形功能单元505处理完一条串行子指令的时间等确定,本公开对此不作限定。通过设置委托寄存器513可以提高整个计算单元的处理效率。

本公开的另一个实施例是一种分形计算装置,包括多层计算单元,其多层结构如图3所示。每层计算单元是以流水线方式运行,如图13所示,所述分形计算装置包括串行分解模块1301、指令译码模块1302、数据加载模块1303、操作执行模块1304、操作归约模块1305及数据写回模块1306。串行分解模块1301用于接收上一层的输入指令,将输入指令分解成串行子指令,并作为输入的缓冲。指令译码模块1302用于将输入指令译码成本地指令、分形指令及直接存储器存取指令。数据加载模块1303用于根据所述直接存储器存取指令,将欲计算的输入数据的子数据自上层存储器加载至本地存储器。操作执行模块1304用于根据所述分形指令,执行子数据对应的任务,以产生计算结果。操作归约模块1305用于根据本地指令,对所述计算结果进行归约。数据写回模块1306将归约后的计算结果写回所述上层存储器。

此实施例的每层计算单元为五级的流水线,每级对应一个模块,同时间各模块响应不同输入指令运作。更详细来说,指令译码模块1302、数据加载模块1303、操作执行模块1304、操作归约模块1305及数据写回模块1306为流水线。

图14示出此实施例的流水线的示意图。下面结合图3所示的计算装置以及图13对流水线的操作进一步说明。如图3所示,以第i层计算单元302为例,第i层计算单元302的流水线1401运行如下:接收上一层(第i-1层)计算单元的输入指令,在指令译码id阶段,指令译码模块1302对输入指令进行译码,在数据加载ld阶段,数据加载模块1303自第i-1层计算单元加载运行输入指令需要的子数据至本地存储器,然后在操作执行ex阶段,操作执行模块1304将本地的译码后指令发送给下一层(第i+1层)计算单元303,由下一层(第i+1层)计算单元303根据子数据执行译码后的指令以完成操作。由于中层计算单元的结构相同,故在第i+1层计算单元303中,一样是执行流水线1402。

由于第i层计算单元302的内存组件的容量可能小于存储数据所需要的内存容量,因此指令译码模块1302还可以对输入指令进行分解,在操作归约rd阶段,操作归约模块1305需要对计算结果进行归约,才能得到输入指令的计算结果。在数据写回wb阶段,数据写回模块1306将计算结果写回到上一层计算单元中。

如前所述,在流水线1401的操作执行ex阶段,操作执行模块1304将译码后的指令发送给第i+1层计算单元303,由第i+1层计算单元303根据子数据及分形指令完成操作,第i+1层计算单元303在接收到输入指令(即第i层计算单元302的分形指令)后,在第i+1层计算单元303的串行分解模块1301将指令分解为串行子指令后,便启动第i+1层的流水线1402,执行指令译码id、数据加载ld、操作执行ex、操作归约rd以及数据写回wb对应的操作。

此实施例的流水线运作与图9的实施例相同,不再赘述。

图15示出图13的实施例的每层计算单元的示意图。串行分解模块1301用于接收来自上层计算单元的上层分形指令,并将所述上层分形指令分解为多个串行子指令,其包括指令队列1501、串行分解器1502及子指令队列1503及张量置换表1504。

指令队列1501接收并暂存上一层计算单元发送来的上层分形指令(即本层的输入指令),作为串行分解器1502与上一层计算单元之间的缓冲,可以省去串行分解器1502与上一层计算单元之间严格的同步执行关系。

串行分解器1502自指令队列1501获取上层分形指令,并分解为多个串行子指令,其分解的方式可以如图8所示的流程进行,这些串行子指令暂存在子指令队列1503中。如果这些串行子指令间存在输入依赖关系,则串行分解器1502还生成反映依赖关系的中间数据。

计算单元包括本地存储器1514。张量置换表1504用于存储输入数据在上层存储器1515及本地存储器1514的地址对照表。如前所述,串行分解器1502会将共用操作数及中间数据存储在本地存储器1514中,在需要读取这些数据时,会根据张量置换表1504以判断这些数据是否存放在本地存储器1514中,如是,串行分解器1502会参照本地地址自本地存储器1514取出数据,而非从上层存储器1515取值,以尽量避免频繁访问上层存储器1515,提高处理效率。

指令译码模块1302用于根据计算单元的硬件资源,将所述多个串行子指令译码成分形指令,所述硬件资源包括本地存储器1514的容量限制、串行分解器1502分解上层分形指令的能力、分形功能单元1512的算力及的个数等。指令译码模块1302包括降层译码器1505、并行分解器1506、归约控制器1507、委托寄存器1508、张量置换表1509。

降层译码器1505用于自子指令队列1503依序获取多个串行子指令,产生下层指令及直接存储器存取指令。这些指令对应有操作数,降层译码器1505检查这些操作数的存储要求,生成指向本地存储器1514的直接存储器存取指令。降层译码器1505根据不同指令间的操作数的依赖度来运行流水线。举例来说,降层译码器1505判断这些操作数间的依赖度是否为写后读关系,如是,则表示先要完成特定操作数的计算,然后写回本地存储器1514,再由下一个指令读出接着计算。顺序一旦出现混乱,便会导致计算错误。在这种情况下,降层译码器1505会暂停运行流水线,直到写后读关系结束。

并行分解器1506用于将下层指令并行分解分形指令,分形指令则用来控制分形功能单元1512进行分形操作。更详细来说,并行分解器1506根据下层指令的操作数将本地存储器1514的本地地址绑定至分形指令的操作数中,这些操作数是操作执行模块1304需要使用的。

归约控制器1507用于将下层指令译码成本地指令,本地指令将在操作归约模块1305中控制归约程序。当归约控制器1507判断对分形功能单元1512的计算结果进行归约处理所需要的资源大于本地功能单元1513的资源上限时,归约控制器1507向委托寄存器1508写入委托指令,并行分解器1506根据委托指令规划分形功能单元1512进行计算的时程,以配合本地功能单元1513的资源。

由于计算所需的数据会从上层存储器1515加载至本地存储器1514,张量置换表1509用于存储这些数据在上层存储器及本地存储器的地址对照表,当降层译码器1505需要取数时,会根据张量置换表1509查找该数据的本地地址,然后至本地存储器1514中取数。

在此实施例中,前述的串行分解模块1301与指令译码模块1302对应至图3的控制器308,换言之,控制器308包括指令队列1501、串行分解器1502、子指令队列1503、张量置换表1504、降层译码器1505、并行分解器1506、归约控制器1507、委托寄存器1508、张量置换表1509。

数据加载模块1303用于将操作执行模块1304所需的数据自上层存储器1515加载至本地存储器1514,具体实现方式是通过直接存储器存取控制器1510和直接存储器存取(dma)1511。直接存储器存取控制器1510是一种外设通过直接存储器存取1511的一种专门接口电路,其向系统提出接管总线1516控制权的总线请求,系统收到该信号后,在当前的总线周期结束后,会按直接存储器存取指令的优先级和直接存储器存取请求,让出总线1516的控制权。在直接存储器存取控制器1510的管理下,数据自上层存储器1515加载至本地存储器1514。在操作执行模块1304完成任务并回传计算结果后,直接存储器存取1511再将计算结果存储至本地存储器1514。每次数据传送完毕后,直接存储器存取控制器1510都会交还总线1516的控制权。

操作执行模块1304用于下发分形指令至下层计算单元,以产生计算结果。与前述实施例相同,操作执行模块1304包括多个分形功能单元1512,用于执行下发任务。直接存储器存取1511将存储在本地存储器1514的数据发送给分形功能单元1512,分形功能单元1512接收到来自并行分解器1506的分形指令与来自直接存储器存取1511的相应数据后,开始进行计算任务。事实上,如图3所示,分形功能单元1512是下一层的计算单元,因此操作执行模块1304将分形指令及相应数据下发给下一层的计算单元,并等待计算结束回传计算结果,也就是图14中的流水线1402。

操作归约模块1305包括本地功能单元1513,当分形功能单元1512产出计算结果后,本地功能单元1513根据本地指令,对计算结果进行归约。

数据写回模块1306用于将归约后的计算结果传回上一层计算单元。在此实施例中,数据写回模块1306利用直接存储器存取控制器1510,向系统提出接管总线1516控制权的总线请求,系统响应直接存储器存取请求让出总线1516的控制权,直接存储器存取1511将归约后的计算结果发送至上层存储器1515中,归约后计算结果传送完毕后,直接存储器存取控制器1510交还总线1516的控制权。

此实施例的本地存储器1514同样具有如图10所示的结构,包括静态内存段701及循环内存段702。静态内存段701用以存储串行分解器1502所产生的中间数据及共用操作数。所谓的中间数据指的是,串行指令间可能会存在依存关系,例如第二条串行指令需要使用第一条串行指令的中间数据;共用操作数则是子指令间会共用的一部分操作数。串行分解器1502会将有依存关系的数据存储在静态内存段701中,而这些直接数据的本地地址记录在张量置换表1504。这些中间数据及共用操作数是依序从静态内存段701的两端往中间存储,其具体存储方式如图12所示。

循环内存段702受到降层译码器1505的管理,用以存储执行串行指令所需的子数据,及子数据在五级的流水线中计算所产生的各级数据。如图10所示,本地存储器1514的循环内存段702分为三子内存块1001、1002、1003,每个子内存块存储执行特定串行指令所需的特定子数据,及所述特定子数据在流水线中所产生的各级数据。降层译码器1505从子指令队列1503中获取串行子指令后,直接存储器存取1511根据本地地址,依次在每个子内存块和上层存储器1515之间进行数据交换。

举例来说,降层译码器1505自子指令队列1503获取了第一串行子指令,将相关的数据(如操作数)指定分配至子内存块1001。接着又获取了第二串行子指令,降层译码器1505将第二串行子指令的相关数据指定分配至子内存块1002中。在指令译码模块1302的降层译码器1505将第二串行子指令的相关数据指定分配至子内存块1002的同时,数据加载模块1303的直接存储器存取1511将第一串行子指令的相关数据自上层存储器1515加载至子内存块1001。

接着,指令译码模块1302的降层译码器1505将第三串行子指令的相关数据指定分配至子内存块1003中,同时间数据加载模块1303的直接存储器存取1511将第二串行子指令的相关数据自上层存储器1515加载至子内存块1002,且操作执行模块1304的分形功能模块1512将子内存块1001的数据取出往下层递送,并将下层计算单元的计算结果存储至子内存块1001。

接着,指令译码模块1302的降层译码器1505将第四串行子指令的相关数据指定分配至子内存块1001中,同时间数据加载模块1303的直接存储器存取1511将第三串行子指令的相关数据自上层存储器1515加载至子内存块1003,且操作执行模块1304的分形功能模块1512将子内存块1002的数据取出往下层递送,并将下层计算单元的计算结果存储至子内存块1002,且操作归约模块1305的本地功能单元1513自子内存块1001中取出计算结果进行归约,并将归约后的计算结果存回子内存块1001。

接着,指令译码模块1302的降层译码器1505将第五串行子指令的相关数据指定分配至子内存块1002中,同时间数据加载模块1303的直接存储器存取1511将第四串行子指令的相关数据自上层存储器1515加载至子内存块1001,且操作执行模块1304的分形功能模块1512将子内存块1003的数据取出往下层递送,并将下层计算单元的计算结果存储至子内存块1003,且操作归约模块1305的本地功能单元1513自子内存块1002中取出计算结果进行归约,并将归约后的计算结果存回子内存块1002,且数据写回模块1306将子内存块1001中的归约后计算结果写回上层存储器1515。

此实施例依前述方式进行流水线操作,并采用了多种方式来管理数据一致性。由于此实施例的计算装置会将输入指令分解为较小的非重叠串行子指令,供计算单元执行,因此,数据可能在不同层的计算单元中具有许多副本。此实施例不允许将数据写入原读取地址空间,也就是不允许覆盖原有数据,从而确保数据一致性。

此外,张量置换表1504及1509在将数据从上层存储器1515的写入地址空间映射到本地存储器1514的读取地址空间时,同样可能会导致数据不一致的风险。此实施例的张量置换表1504及1509中的每个记录均设置了有效期,张量置换表1504及1509像存储空间一样被划分为多个存储体,每个存储体仅维护其相应存储段的信息。每当数据处理完毕时会回收该存储段,重新分配给新数据,使旧数据被覆盖,从而旧数据再也无法再被使用。通过张量置换表1504及1509中存储段的设置,可以使所有数据在一定的时间内失效,故数据记录的生存期不会超过引用数据的生存期。不仅如此,为了保证数据的一致性,如前所述,此实施例分配给每个分形功能单元1512的指令的本地地址始终是不同的,会在子内存块1001、1002、1003间轮替分配。

此实施例的各层功能单元同样具有图4的特征,即各层功能单元无需额外的安排便可运行同一段代码,也就是使用上述的分形指令集。分形指令集的原理是各层执行自己的任务,不干扰下层的工作方式。程序员在编写代码时,只需要控制最顶层的计算单元,各层自动产生控制下层的子指令,因此具有以下优势:

1.每个分形指令集的指令都对应一个完整的计算原语,程序员不会也不能生成更细节的操作分解方式,达到指令单纯化的目的。

2.与精简指令集计算机(reducedinstructionsetcomputing,risc)不同的是,本公开的分形指令集不向程序员提供明确的加载存储指令,

分形指令集对程序员隐藏了内部存储器,程序员无法介入干预内部存储器的使用方式,因此当分形指令集应用于不同的规模的分形计算装置时,程序员无需适应不同的存储器大小而改变控制方式。

3.分形指令集中没有出现硬件信息,也就是不需要控制特定硬件,程序员只需要专注定义计算任务,不会产生干扰内部硬件的行为,方便基于不同规模扩展计算装置。

对于下层计算单元而言,上层计算单元的降层译码器1505及并行分解器1506像是程序员,对下层计算单元产生控制指令(即分形指令),降低了编程的复杂性。基于这个特性,此实施例可以概括成一种“单任务多继承”(singletaskmultipleheritors,stmh)的框架。此实施例定义两个相邻层次结构如何协作以降低粒度,进而将任务从较高的层次结构继承到较低的层次结构。更具体地说,此实施例将协作机制分离为两个关系:与母节点的关系以及同级节点间的关系。串行分解器1502用以定义母子关系(即上下层关系),并行分解器1506定义同级节点的关系(即分形功能单元间的关系)。无论多复杂的任务,都可以明确定义整个分形计算装置的运行。

图16示出单任务多继承的框架。假设第i层计算单元1611的串行分解器接收到一个主任务1601,根据其硬件资源,假设操作数过多无法直接计算,故第i层计算单元1611的并行分解器将其分解为2个一阶子任务1602及1603,并将一阶子任务1602及1603分别发送给2个第i+1层计算单元1612。更详细来说,串行分解模块接收来自上层计算单元的上层分形指令,并将上层分形指令分解为多个串行子指令;指令译码模块根据第i层计算单元的硬件资源,将多个串行子指令译码成分形指令;操作执行模块下发所述本地分形指令至下层计算单元,以产生计算结果。其操作细节在前述实施例已说明过,不再赘述。

以一阶子任务1602为例,第i+1计算单元1612的串行分解器接收到一阶子任务1602后,其并行分解器继续将分解为2个二阶子任务1604及1605,并将二阶子任务1604及1605分别发送给2个第i+2计算单元1613。以二阶子任务1604为例,第i+2计算单元1613的串行分解器接收到二阶子任务1604后,其并行分解器继续将分解为5个三阶子任务1608。由于三阶子任务1608的粒度足够小,第i+2计算单元1613的分形功能单元可以计算,故在这层便可将主任务1601分解计算完毕。换言之,以主任务1601的粒度来说,需要一个具有3层计算单元机构的分形计算装置来执行。

再看图16的另一个例子,假设上层计算单元1631的串行分解器接收到一个主任务1621,根据其硬件资源,其并行分解器将其分解为5个一阶子任务1622至1626,并将一阶子任务1622至1626分别发送给下层计算单元1632。下层计算单元1632的串行分解器接收到一阶子任务后,其并行分解器继续将分解为4个二阶子任务1627。由于二阶子任务1627的粒度足够小,下层计算单元1632可以计算,主任务1621便下沉至下层计算单元1632来执行。换言之,以主任务1621的粒度来说,需要一个具有2层计算单元机构的分形计算装置来执行。

有上述可知,程序员无需判断或规划一个任务需下沉到哪一层执行,只需针对最顶层进行编码控制,此实施例的分形计算装置会自动分形下发执行,对于编码来说十分便利。

图17示出本公开的另一实施例,是一种集成电路装置1700的结构图。如图17所示,集成电路装置1700包括计算装置1702,该计算装置1702是前述多个实施例中具有多层计算单元的分形计算装置。另外,集成电路装置1700还包括通用互联接口1704和其他处理装置1706。

其他处理装置1706可以是中央控制器、图形控制器、人工智能控制器等通用和/或专用控制器中的一种或多种类型的控制器,其数目不做限制而是依实际需要来确定。其他处理装置1706作为计算装置1702与外部数据和控制的接口,执行包括但不限于数据搬运,完成对计算装置1702的开启、停止等的基本控制。其他处理装置1706也可以和计算装置1702协作共同完成运算任务。

通用互联接口1704可以用于在计算装置1702与其他处理装置1706间传输数据和控制指令。例如,计算装置1702可以经由通用互联接口1704从其他处理装置1706中获取所需的输入数据,写入计算装置1702片上的存储单元。进一步,计算装置1702可以经由通用互联接口1704从其他处理装置1706中获取控制指令,写入计算装置1702片上的控制缓存。替代地或可选地,通用互联接口1704也可以读取计算装置1702的存储模块中的数据并传输给其他处理装置1706。

集成电路装置1700还包括存储装置1708,其可以分别与计算装置1702和其他处理装置1706连接。存储装置1708用于保存计算装置1702和其他处理装置1706的数据,尤其适用于所需要运算的数据在计算装置1702或其他处理装置1706的内部存储中无法全部保存的数据。

根据应用场景的不同,集成电路装置1700可以作为手机、机器人、无人机、视频采集等设备的片上系统(soc),从而有效地降低控制部分的核心面积,提高处理速度并降低整体的功耗。在此情况时,集成电路装置1700的通用互联接口1704与设备的某些部件相连接。此处的某些部件可以例如是摄像头,显示器,鼠标,键盘,网卡或wifi接口。

本公开还揭露一种芯片或集成电路芯片,其包括了集成电路装置1700。本公开还揭露一种芯片封装结构,其包括了上述芯片。

本公开另一个实施例是一种板卡,其包括了上述芯片封装结构。参阅图18,板卡1800除了包括多个上述芯片1802以外,还可以包括其他的配套部件,该配套部件包括存储器件1804、接口装置1806和控制器件1808。

存储器件1804与芯片封装结构内的芯片1802通过总线1814连接,用于存储数据。存储器件1804可以包括多组存储单元1810。

接口装置1806与所述芯片封装结构内的芯片1802电连接。所述接口装置1806用于实现芯片1802与外部设备1812之间的数据传输。在此实施例中,接口装置1806为标准pcie接口,待处理的数据由服务器通过标准pcie接口传递至芯片1802,实现数据转移。芯片1802的计算结果亦由接口装置1806传送回外部设备1812。

控制器件1808与芯片1802电连接,以便对芯片1802的状态进行监控。具体地,芯片1802与控制器件1808可以通过spi接口电连接。控制器件1808可以包括单片机(microcontrollerunit,mcu)。

本公开的另一个实施例是一种电子设备或装置,其包括了上述板卡1800。根据不同的应用场景,电子设备或装置可以包括数据处理装置、机器人、电脑、打印机、扫描仪、平板电脑、智能终端、手机、行车记录仪、导航仪、传感器、摄像头、服务器、云端服务器、相机、摄像机、投影仪、手表、耳机、移动存储、可穿戴设备、交通工具、家用电器、和/或医疗设备。所述交通工具包括飞机、轮船和/或车辆;所述家用电器包括电视、空调、微波炉、冰箱、电饭煲、加湿器、洗衣机、电灯、燃气灶、油烟机;所述医疗设备包括核磁共振仪、b超仪和/或心电图仪。

本公开的另一个实施例是一种流水线的分形计算方法,适用于图13及图15的实施例中,其流程如图19所示。

在步骤1901中,接收上一层的输入指令,将输入指令分解成串行子指令,并作为输入的缓冲。首先接收并暂存上一层计算单元发送来的上层分形指令;接着将上层分形指令分解为多个串行子指令;生成反映这些串行指令间的依赖关系的中间数据;产生中间数据及共用操作数在上层存储器及本地存储器的地址对照表;当需要存取中间数据或共用操作数时,判断所述数据是否存放在本地存储器中;如是,则自本地存储器取数。

在步骤1902中,将输入指令译码成本地指令、分形指令及直接存储器存取指令。更详细来说,此步骤根据计算单元的硬件资源,将多个串行子指令译码成本地分形指令,所述硬件资源包括本地存储器的容量限制、串行分解器分解上层分形指令的能力、下层计算单元的计算能力及分形功能单元的个数等。此步骤更包括以下步骤:根据多个串行子指令,产生下层指令及直接存储器存取指令,这些指令对应有操作数,首先检查这些操作数的存储要求,以生成指向本地存储器的直接存储器存取指令,再根据不同指令间的操作数的依赖度来运行流水线;将下层指令并行分解成分形指令,更详细来说,包括根据下层指令的操作数将本地存储器的本地地址绑定至分形指令的操作数中;将下层指令译码成本地指令;产生子数据在上层存储器及本地存储器的地址对照表;当需要读取子数据时,根据本地地址至本地存储器中取数。

在步骤1903中,根据直接存储器存取指令,将欲计算的输入数据的子数据自上层存储器加载至本地存储器。首先提出接管总线控制权的总线请求;响应直接存储器存取请求让出总线的控制权;将子数据从上层存储器加载至本地存储器;最后交还总线控制权。

在步骤1904中,根据所述分形指令,执行子数据对应的任务,以产生计算结果。首先将存储在本地存储器的子数据发送给分形功能单元,以执行下发任务;回传计算结果;将计算结果存储至本地存储器。

在步骤1905中,根据本地指令,对所述计算结果进行归约。

在步骤1906中,将归约后的计算结果写回上层存储器。首先提出接管总线控制权的总线请求;响应直接存储器存取请求让出总线的控制权;将归约后的计算结果加载至上层存储器中;最后交还总线控制权。

本公开的另一个实施例是一种分形计算方法,适用于图13及图15的实施例中,更详细来说,此实施例是具体实现“单任务多继承”的方法。其流程如图20所示。

在步骤2001中,响应来自上层计算单元的上层分形指令,将上层分形指令分解为多个串行子指令。串行分解器自指令队列获取上层分形指令,并分解为多个串行子指令,其分解的方式如图8的实施例所示,这些串行子指令暂存在子指令队列中。

在步骤2002中,根据本层计算单元的硬件资源,将所述多个串行子指令译码成本地分形指令。指令译码模块用于根据计算单元的硬件资源,将所述多个串行子指令译码成本地分形指令,所述硬件资源包括本地存储器的容量限制、串行分解器分解上层分形指令的能力、分形功能单元的计算能力及分形功能单元的个数等。

在步骤2003中,下发所述本地分形指令至下层计算单元,以产生计算结果。操作执行模块包括多个分形功能单元,用于执行下发任务。分形功能单元接收到来自并行分解器的分形指令,与来自直接存储器存取的相应数据后,开始进行计算任务。如前所述,分形功能单元是下一层的计算单元,因此操作执行模块将分形指令及相应数据下发给下一层的计算单元,并等待计算结束回传计算结果。

此实施例定义两个相邻层次结构如何协作以降低粒度,进而将任务从较高的层次结构继承到较低的方法。更具体地说,此实施例将协作机制分离为两个关系:与母节点的关系以及同级节点间的关系。步骤2001用以定义母子关系(即上下层关系),步骤2002定义同级节点的关系(即分形功能单元间的关系)。无论多复杂的任务,都可以明确定义“单任务多继承”的运行。

图21示出根据本申请另一实施例的计算单元的框图。如图21所示,译码器2101的输入端接收输入指令,译码器2101的输出端连接内存控制器2102的输入端,内存组件可以同数据通路连接任意一个计算单元的上一层计算单元和下一层计算单元的内存组件,内存控制器2102连接上述数据通路,内存组件i2103连接内存组件i-12104,内存组件i-12104可以表示当前计算单元的上一层计算单元的内存组件,内存组件i2103连接下一层计算单元表示连接下一层计算单元的内存组件,内存控制器2102连接内存组件之间的数据通路。数据通路在内存控制器2102的控制下将数据从一个内存组件送往另一个内存组件。译码器2101的输出端还连接下一层计算单元2105的输入端以及归约控制器2106的输入端,归约控制器2106连接本地功能单元2107。

译码器2101用于指令译码id,内存控制器2102用于数据加载ld:将输入指令的操作数从上一层计算单元的内存组件加载到本地内存组件,归约控制器2107用于控制lfu执行操作归约rd得到输入指令的运算结果,内存控制器2102还用于将运算结果写回到所述任意一个计算单元的上一层计算单元的内存组件中。

与前述实施例不同处在于,流水线控制单元2108连接译码器2101、归约控制器2107、内存控制器2102以及下一层计算单元2105,流水线控制单元2108根据译码器2101、归约控制器2107、内存控制器2102以及下一层计算单元2105的反馈同步多个阶段。例如,所述流水线控制单元2108在接收到译码器2101、内存控制器2102、下一层计算单元2105以及所述归约控制器2107发送的第一反馈信号后,控制流水线按顺序向下传播,其中,第一反馈信号可以是指表示译码器2101、内存控制器2102、下一层计算单元2105以及归约控制器2107执行完当前指令的相应阶段的信号。

示例性的,假设有输入指令1、输入指令2、输入指令3、输入指令4和输入指令5、输入指令6,内存控制器2102在对输入指令1进行数据写回wb,归约控制器2107在控制本地功能单元2107对输入指令2进行操作归约rd,下一层计算单元2105在对输入指令3进行操作执行ex,内存控制器2102在对输入指令4进行数据加载ld,译码器2101在对输入指令5进行指令译码id。在第一内存控制器2102、归约控制器2107、下一层计算单元2105以及译码器2101执行完当前指令的相应阶段的处理后,可以向流水线控制单元2108发送第一反馈信号,流水线控制单元2108在接收到内存控制器2102、归约控制器2107、下一层计算单元2105以及译码器2101发送的第一反馈信号后,可以控制流水线按顺序向下传播:内存控制器2102在对输入指令2进行数据写回wb,归约控制器2107在控制本地处理单元2107对输入指令3进行操作归约rd,下一层计算单元2105在对输入指令4进行操作执行ex,内存控制器2102在对输入指令5进行数据加载ld,译码器2101在对输入指令6进行指令译码id。

此实施例具有如图6所示的结构。计算单元还可以包括:流水线锁存器601至604,位于指令译码id和数据加载ld间、数据加载ld和操作执行ex间、操作执行ex和操作归约rd间、以及操作归约rd和数据写回wb间。更详细来说,流水线锁存器601位在第一内存控制器507之前,流水线锁存器602位在分形功能单元505之前,流水线锁存器603位在本地处理单元506之前,流水线锁存器604位在第一内存控制器507之前。流水线锁存器601至604用于缓存下一阶段要处理的指令。控制器的流水线控制单元通过控制流水线锁存器601至604同步所述多个阶段。

所述流水线控制单元在接收到译码器502、第二内存控制器508、分形计算单元505以及归约控制器509发送的第一反馈信号后,分别向各个流水线锁存器发送第一控制信号,各个流水线锁存器根据第一控制信号更新输出。其中,所述第一控制信号可以是高电平信号或者低电平信号,本公开对此不作限定。更新输出是指流水线锁存器在接收到第一控制信号时,输出跟随输入的并行子指令或者与输入指令的操作相关的控制信号而变化,这里输入的并行子指令或者与输入指令的操作相关的控制信号是指图6中从流水线锁存器的左侧输入的。

仍然以上文所述的输入指令1、输入指令2、输入指令3、输入指令4和输入指令5、输入指令6为例,结合图6对流水线的处理过程进行说明。

(1.1)第一内存控制器507接收到流水线锁存器604输出的控制信号,根据控制信号控制第二内存控制器508对输入指令1进行数据写回wb;

(1.2)本地功能单元506接收流水线锁存器603输出的控制信号,对输入指令2进行操作归约rd,将归约结果(输入指令2的计算结果)存储到内存组件中;

(1.3)分形功能单元505接收流水线锁存器602中的并行子指令(对输入指令3分解后得到的),对输入指令3进行操作执行ex,将执行结果写回到内存组件中;

(1.4)第一内存控制器507接收流水线锁存器601发送的控制信号,根据控制信号控制第二内存控制器508将输入指令4的输入操作数加载到内存组件中;

(1.5)译码器502在对输入指令5进行指令译码id,并将译码后的输入指令5发送给并行分解器504和归约控制器509,将数据加载、以及数据写回等相关的控制信号缓存在流水线锁存器601中,并行分解器504对译码后的输入指令5进行并行分解得到并行子指令,将并行子指令缓存在流水线锁存器601中,归约控制器509将输入指令5的操作归约对应的控制信号缓存在流水线锁存器601中。

在第一内存控制器507、归约控制器509、分形功能单元505以及译码器502执行完当前指令的相应阶段的处理后,可以向流水线控制单元发送第一反馈信号,流水线控制单元在接收到第一内存控制器507、归约控制器509、分形功能单元505以及译码器502发送的第一反馈信号后,可以向各个所述流水线锁存器发送第一控制信号,控制流水线按顺序向下传播,各流水线锁存器在接收到第一控制信号后,输出的控制信号跟随输入信号变化。例如,(1)针对输入指令2的数据写回对应的控制信号从流水线锁存器604输出、针对输入指令3的数据写回对应的控制信号从流水线锁存器603输出到流水线锁存器604;(2)针对输入指令3的操作归约对应的控制信号从流水线锁存器603输出、针对输入指令2的操作归约对应的控制信号从流水线锁存器602输出到流水线锁存器603、针对输入指令1的操作归约对应的控制信号从流水线锁存器601输出到流水线锁存器602;(3)针对输入指令4的并行子指令从流水线锁存器602输出、针对输入指令5的并行子指令从流水线锁存器601输出到流水线锁存器602;(4)针对输入指令5的数据加载对应的控制信号从流水线锁存器601输出;(5)输入指令6输入到译码器502中,译码器502对输入指令6进行指令译码id,并将译码后的输入指令6发送给并行分解器504和归约控制器509,将数据加载、以及数据写回等相关的控制信号缓存在流水线锁存器601中,并行分解器504对译码后的输入指令6进行并行分解得到并行子指令,将并行子指令缓存在流水线锁存器601中,归约控制器509将输入指令6的操作归约对应的控制信号缓存在流水线锁存器601中。第一内存控制器507、归约控制器509、分形功能单元505以及译码器502的执行过程如下:

(2.1)第一内存控制器507接收到流水线锁存器604输出的控制信号,控制第二内存控制器508对输入指令2的运算结果进行数据写回wb;

(2.2)本地功能单元506接收流水线锁存器603输出的控制信号,根据控制信号从内存组件中获取对输入指令3进行操作执行ex后的执行结果,对输入指令3的指令结果进行操作归约rd,将归约结果(输入指令3的运算结果)存储到内存组件中;

(2.3)分形功能单元505接收流水线锁存器602输出的针对输入指令4的并行子指令,对输入指令4进行操作执行ex,将执行结果写回到内存组件中;

(2.4)第一内存控制器507接收流水线锁存器601发送的控制信号,根据控制信号控制第二内存控制器508将输入指令5的输入操作数加载到内存组件中;

(2.5)译码器502从子指令队列503中获取输入指令6,对输入指令6进行指令译码id。

在一种可能的实现方式中,译码器502在从子指令队列503中获取到串行子指令时,可以检测串行子指令的数据依赖情况,若检测到串行子指令存在数据依赖,则译码器502可以停止从子指令队列503中获取串行子指令。

串行子指令存在数据依赖可以是指串行子指令的输入操作数与之前的多条串行子指令的输出操作数存在重叠(数据依赖)。之前的多条串行子指令的条数可以根据流水线的级数确定,比如在此实施例的5级流水线的示例中,之前的多条串行子指令可以是指之前的4条串行子指令。当前译码的串行子指令的输入操作数与之前的多条串行子指令的输出操作数存在重叠,可以是指当前译码的串行子指令的输入操作数与之前的多条串行子指令中的任意一条或多条的输出操作数存在重叠,本公开对此不作限定。

由于当前译码的串行子指令的输入操作数与之前的多条串行子指令的输出操作数存在重叠,也就是说,当前译码的串行子指令的输入操作数是之前的多条串行子指令的输出操作数中的部分或全部,因此,需要之前多条串行子指令执行完得到输出操作数之后才能够加载当前译码的串行子指令的输入操作数。所以,需要暂停流水线的传播,直到运行完之前的多条串行子指令得到输出操作数,继续流水线的传播过程。具体过程可以为,译码器502停止从子指令队列503中获取串行子指令,译码器502的输出不变,译码器502之后的第一个流水线锁存器601不再输出锁存的控制信号,而是输出空泡控制信号,收到空泡控制信号的各功能部件不进行操作,仅立刻向流水线控制单元发送第一反馈信号。流水线控制单元继续按原条件发射第一控制信号,让流水线带着从第一个流水线锁存器601注入的空泡继续执行,直到数据依赖得以解决。数据依赖解决后,译码器502继续从子指令队列503中取指令,第一个流水线锁存器601继续输出锁存的控制信号。

根据上述实施方式的流水线控制过程,可以灵活的控制流水线的进程,避免计算结果出错。

译码器502在检测到当前译码的串行子指令的输入操作数与之前的多条串行子指令的输出操作数不存在重叠时,将当前译码的串行子指令译码后预加载到所述分形功能单元505上。

根据上文描述的过程可知,对于一条串行子指令,在译码完成后,需要等待数据加载ld完成后,才会加载到分形功能单元505上进行操作执行ex。根据上文中的示例,在(2.3)中分形功能单元505对输入指令4进行操作执行ex时,(2.5)译码器502从子指令队列503中获取输入指令6,对输入指令6进行指令译码id,输入指令的并行子指令被缓存在流水线锁存器601中,还没有加载到分形功能单元505上,在下一个第一控制信号到来时,才会加载到分形功能单元505上。

对于输入操作数与之前的多条串行子指令的输出操作数不存在重叠的情况,译码器502可以向流水线控制单元发送预加载信号。如果分形功能单元505已经完成了输入指令4的并行子指令的操作执行,并向流水线控制单元发送了第一反馈信号,这时,流水线控制单元可以根据预加载信号,向流水线锁存器601发送第一控制信号,流水线锁存器601根据第一控制信号预先将输入指令6的并行子指令输出到分形功能单元505,以使分形功能单元505提前对输入指令6的进行操作执行ex,从而提升运算装置的运算效率。

在以上示例中,对于当前译码的串行子指令的输入操作数与之前的多条串行子指令的输出操作数是否存在重叠,译码器502可以通过检测之前多条(例如5条)串行子指令的输出操作数的地址以及当前译码的串行子指令的输入操作数的地址和大小描述符来确定。

通过本实施方式可以在输入操作数与之前的多条串行子指令的输出操作数不存在重叠的情况,采用指令预加载的方式加快处理的速度,提高运算装置的处理效率。

本公开所揭露的技术有以下优势:机器学习计算原语可以视为是分形运算,将其迭代分解为几个较小的自相似运算;本公开所提出的架构是一系列具有分形冯.诺伊曼架构和相同指令集的同构、串行、多层、层相似的分形计算装置,由于各层具有相同的结构,可以实现简单编程和高效率。

需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本披露并不受所描述的动作顺序的限制,因为依据本披露,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于可选实施例,所涉及的动作和模块并不一定是本披露所必须的。

进一步需要说明的是,虽然图中的各个模块按照箭头的指示依次显示,但是这些并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,执行顺序并没有严格的顺序限制。方法中的步骤同样没有严格的顺序限制。

应该理解,上述的装置实施例仅是示意性的,本披露的装置还可通过其它的方式实现。例如,上述实施例中所述单元/模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。例如,多个单元、模块或组件可以结合,或者可以集成到另一个系统,或一些特征可以忽略或不执行。

另外,若无特别说明,在本披露各个实施例中的各功能单元/模块可以集成在一个单元/模块中,也可以是各个单元/模块单独物理存在,也可以两个或两个以上单元/模块集成在一起。上述集成的单元/模块既可以采用硬件的形式实现,也可以采用软件程序模块的形式实现。

所述集成的单元/模块如果以硬件的形式实现时,该硬件可以是数字电路,模拟电路等等。硬件结构的物理实现包括但不局限于晶体管,忆阻器等等。若无特别说明,控制器可以是任何适当的硬件控制器,比如cpu、gpu、fpga、dsp和asic等等。若无特别说明,所述内存组件可以是任何适当的磁存储介质或者磁光存储介质,比如,阻变式存储器rram(resistiverandomaccessmemory)、动态随机存取存储器dram(dynamicrandomaccessmemory)、静态随机存取存储器sram(staticrandom-accessmemory)、增强动态随机存取存储器edram(enhanceddynamicrandomaccessmemory)、高带宽内存hbm(high-bandw指令译码idthmemory)、混合存储立方hmc(hybr指令译码idmemorycube)等等。

所述集成的单元/模块如果以软件程序模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算装置可读取存储器中。基于这样的理解,本披露的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算装置软件产品存储在一个存储器中,包括若干指令用以使得一台计算装置设备(可为个人计算装置、服务器或者网络设备等)执行本披露各个实施例所述方法的全部或部分步骤。而前述的存储器包括:u盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

以上对本披露实施例进行了详细介绍,本文中应用了具体个例对本披露的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本披露的方法及其核心思想;同时,对于本领域的一般技术人员,依据本披露的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本披露的限制。

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