用于利用约简操作来支持数据并行循环的计算引擎架构的制作方法

文档序号:14910887发布日期:2018-07-10 23:22阅读:334来源:国知局

本公开总体涉及电子学,更具体地涉及用于利用约简操作来支持数据并行循环的计算引擎架构。



背景技术:

仅在过去几年时间里,来自相对新生的机器学习领域的算法已广泛应用于许多类型的实际应用,从而产生各种技术,诸如,无人驾驶汽车、改进的互联网搜索引擎、语音、音频和/或视觉识别系统、人类健康数据和基因组分析、推荐系统、欺诈检测系统等。这些算法的增长已部分地受到近期正由人类和非人类两者产生的数据类型和量的增加的促进。由此,随着可用于分析的数据的增加量的急剧增长,对机器学习的兴趣也已急剧增长。

然而,机器学习算法趋于在计算上是昂贵的,因为它们可能涉及对大量数据的大量非简单操作(例如,浮点乘法)。结果,尽可能高效地实现这些算法是极其重要的,因为由于计算的规模之大,任何小的低效率都会迅速被放大。

例如,许多机器学习算法执行对巨型矩阵的线性代数运算。然而,这些类型的操作在现代计算系统中极难并行化,这至少部分地由于跨迭代(例如,在矩阵中更新值的循环)的潜在的写到读依赖关系。

用于执行这些类型的线性代数运算的一些当前方式要么采用锁定技术,要么采用近似无锁实现方式。锁定继续产生与顺序实现方式相同的解,并且此权衡锁定开销以得到更大的并行性。然而,作为锁定开销的结果,先前方式已显示性能并不缩放超过2-4个核,并且甚至直到4个核也不产生接近线性性能缩放的任何结果。

第二种方式(涉及使用近似无锁实现方式)确实更接近线性性能缩放,但是由于在根本上依赖于近似而无法实现最佳解。此外,输出偏差对于具有幂律分布的数据集(其中,一些特征比另一些特征更常见)可能是尤其高的,这导致错误更新的更大几率。

因此,迫切需要增强对这些类型算法(诸如,具有跨循环迭代的写到读数据依赖关系的那些算法)的执行的技术。

附图说明

通过参考用于说明一些实施例的以下描述和所附附图,可最佳地理解本发明。在附图中:

图1是示出根据一些实施例的系统的框图,该系统包括实现用于利用约简操作来支持数据并行循环的计算引擎架构的硬件处理器。

图2是示出根据一些实施例的包括具有迭代间数据依赖关系的循环的累积分布函数(CDF)代码段以及经由图1的计算引擎架构实现显著的计算加速的经优化的CDF代码段的框图。

图3是示出根据一些实施例的可由图2中的经优化的CDF代码段利用的示例性数据结构和数据的框图,图2中的经优化的CDF代码段经由图1中的所公开的计算引擎架构来实现显著的计算加速。

图4是示出根据一些实施例的图2中的经优化的CDF代码段的部分如何能够由图1中的计算引擎架构的示例性实现方式执行的框图。

图5是示出根据一些实施例的用于利用用于支持数据并行循环的计算引擎架构的操作流程的流程图。

图6是示出根据一些实施例的、用于利用用于支持数据并行循环的包括多个处理元件的计算引擎架构来执行任务的操作流程的流程图。

图7示出根据一些实施例的示例实现方式,在该示例实现方式中,加速器通过高速缓存一致接口通信地耦合到多个核。

图8示出根据一些实施例的加速器的另一视图。

图9示出根据一些实施例的由处理元件执行的示例操作集。

图10a描绘根据一些实施例的在稀疏矩阵A与向量x之间相乘以产生向量y的乘法的示例。

图10b示出根据一些实施例的矩阵A的CSR表示,在该CSR表示中,每一个值被存储为(值,行索引)对。

图10c示出根据一些实施例的矩阵A的CSC表示,该CSC表示使用(值,列索引)对。

图11a、图11b和图11c示出每一种计算模式的伪代码,其中:

图11a示出根据一些实施例的面向行的(row-oriented)稀疏矩阵与密集向量相乘(spMdV_csr)。

图11b示出根据一些实施例的面向列的(column-oriented)稀疏矩阵与稀疏向量相乘(spMspC_csc)。

图11c示出根据一些实施例的缩放并更新操作(scale_update)。

图12示出根据一些实施例的用于数据管理单元和处理元件的一种实现方式的处理流。

图13a突出显示根据一些实施例的用于spMspV_csc和scale_update操作的路径。

图13b示出根据一些实施例的用于spMdV_csr操作的路径。

图14a-图14b示出将图形表示为邻接矩阵的示例。

图14c示出根据一些实施例的顶点程序。

图14d示出根据一些实施例的用于执行顶点程序的示例性程序代码。

图14e示出根据一些实施例的广义稀疏矩阵与向量相乘(GSPMV)的公式化。

图15示出根据一些实施例的用于GSPMV的设计框架的一种实现方式。

图16示出根据一些实施例的用于GSPMV的架构模板的一种实现方式。

图17示出根据一些实施例的每一个加速器片的操作的概要。

图18a示出根据一些实施例的概括了模板的一种实现方式的可定制参数的表。

图18b示出根据一些实施例的框架的一种实现方式的调节考虑,该框架执行自动调节以确定用于定制硬件架构模板的最佳设计参数,从而为输入顶点程序和(可任选地)图形数据优化该硬件架构模板。

图19示出根据一些实施例的压缩行存储(CRS,有时缩写为CSR)稀疏矩阵格式。

图20示出根据一些实施例的在使用CRS数据格式来实现稀疏矩阵-密集向量乘法中所涉及的示例性步骤。

图21示出根据一些实施例的加速器的一种实现方式,该加速器包括加速器逻辑管芯以及一个或多个叠层的DRAM管芯。

图22示出根据一些实施例的、从俯视视角穿过DRAM管芯的叠层而定向的加速器逻辑芯片的一种实现方式。

图23提供根据一些实施例的点积引擎(DPE)的高层级概览图,该DPE包含两个缓冲器、两个64位乘-加算术逻辑单元(ALU)以及控制逻辑。

图24示出根据一些实施例的用于大型稀疏矩阵计算的分块方案。

图25示出根据一些实施例的块描述符的格式。

图26示出根据一些实施例的将块描述符用于两行矩阵,该两行矩阵适配在具有仅一个堆叠的动态随机存取存储器(DRAM)数据通道和四字数据猝发的系统上的单个点积引擎的缓冲器内。

图27示出根据一些实施例的点积引擎中的硬件的一种实现方式。

图28示出根据一些实施例的进行捕捉的匹配逻辑的内容。

图29示出根据一些实施例的用于支持稀疏矩阵-稀疏向量乘法的点积引擎设计的细节。

图30示出根据一些实施例的使用特定值的示例多轮次(multi-pass)方式。

图31示出根据一些实施例的上文所述的稀疏-密集和稀疏-稀疏点积引擎能够如何组合的方式。

图32是根据一些实施例的寄存器架构3200的框图。

图33A是示出根据一些实施例的示例性有序流水线和示例性的寄存器重命名的乱序发布/执行流水线的框图。

图33B是示出根据一些实施例的要包括在处理器中的有序架构核的示例性实施例和示例性的寄存器重命名的乱序发布/执行架构核的框图。

图34A-图34B示出更具体的示例性有序核架构的框图,该核将是芯片中的若干逻辑块(包括相同类型和/或不同类型的其他核)之一。

图34A是根据一些实施例的单个处理器核以及它与管芯上互连网络3402的连接及其第二级(L2)高速缓存的本地子集3404的框图。

图34B是根据一些实施例的图34A中的处理器核的一部分的展开图。

图35是根据一些实施例的可具有多于一个核、可具有集成的存储器控制器、并且可具有集成图形的处理器3500的框图。

图36-图39是示例性计算机架构的框图。

图36示出根据一些实施例的系统的框图。

图37是根据一些实施例的更具体的第一示例性系统的框图。

图38是根据一些实施例的更具体的第二示例性系统的框图。

图39是根据一些实施例的SoC的框图。

图40是示出根据一些实施例的对照使用软件指令转换器将源指令集中的二进制指令转换成目标指令集中的二进制指令的框图。

具体实施方式

以下描述内容描述了涉及用于利用约简操作来支持数据并行循环的计算引擎架构的方法、装置和系统。在该描述中,可陈述众多具体细节(诸如,系统组件的逻辑实现、类型和相互关系等)以提供对一些实施例的更透彻理解。然而,本领域技术人员应当领会,没有这些具体细节也可实践本发明。在其他实例中,没有详细示出控制结构、门级电路和/或完整的软件指令序列,以便不至于使本发明变得模糊。本领域技术人员利用所包括的描述将能够在无需过度实验的情况下实现适当的功能。

说明书中对“一个实施例”、“实施例”、“示例实施例”等等的引用表明所描述的实施例可以包括特定的特征、结构或特性,但是每个实施例可能不一定包括该特定的特征、结构或特性。此外,此类短语不一定是指同一个实施例。此外,当结合实施例描述特定的特征、结构或特性时,认为结合无论是否被明确描述的其他实施例而影响此类特征、结构或特性是在本领域技术人员的知识范围之内的。

用括号括起来的文本以及具有虚线边界的框(例如,大虚线、小虚线、点虚线、点线)可在本文中用于示出向本发明的实施例添加附加特征的可任选操作。然而,此类记号不应当被认为意味着它们是仅有的选项或可任选操作,和/或具有实线边界的框在本发明的某些实施例中不是可任选的。

贯穿本说明书,在(对应于所示实体的)附图标记的末尾使用字母符号不旨在指示任何特定数量的那个实体必须一定存在,而仅指示该实体是潜在许多类似实体中的一个。例如,处理元件106A-106X包括“A”和“Z”这两个字母后缀,这意味着可以有两个处理元件、三个处理元件、十六个处理元件,等等。

本文中公开的实施例提供用于支持具有迭代间数据依赖关系或不规则控制依赖关系的数据并行循环的计算引擎架构(例如,对数据并行加速器的扩展)。当计算在许多文本分析应用(诸如,潜在狄利克雷分配(LDA))中发现的累积分布函数(CDF)时,此类数据并行循环的一个常见示例存在。现有的数据并行加速器不支持此类循环,因为它们预期不到跨迭代的依赖关系,并且支持此类依赖关系将引发大的性能开销。

然而,本文中公开的实施例利用菊形链和约简操作来提供数据并行加速器。凭借所公开的计算引擎架构,具有迭代间循环依赖关系(例如,CDF的实现方式)的许多常见算法可映射至数据并行加速器,并且可实现极高性能。类似地,能以(例如)每个元件1周期来执行具有不规则控制依赖关系的数据并行循环(诸如,对‘n’个元素的排序)。

此外,用于数据并行循环的现有硬件解决方案(诸如,向量单元或单指令多数据(SIMD)单元)完全依赖于并行循环来获得高效率和性能。然而,这些解决方案再次在性能和效率方面受损,因为跨迭代引入了不规则的数据或控制依赖关系。本文中所公开的实施例可支持这些依赖关系,而没有任何软件改变,或者仅具有最少的软件改变。

图1是示出根据一些实施例的系统100的框图,该系统100包括实现用于利用约简操作来支持数据并行循环的计算引擎架构的硬件处理器102。该系统包括硬件处理器102,在一些实施例中,该硬件处理器102是可由另一硬件处理器101(例如,中央处理单元(CPU))通过(例如,经由接口130)将任务“卸载”至该硬件处理器102来利用的硬件加速器(例如,机器学习加速器)。由此,硬件加速器102可充当数据并行加速器,具有对迭代间数据依赖关系和不规则控制依赖关系的显式支持。然而,在一些实施例中,硬件处理器102自身可以是CPU,因此可不服务另一处理器。

所示实施例包括处理元件的阵列106A-106Z,其经由邻至邻(neighbor-to-neighbor)链路120A-120Z以及约简链路126(例如,引向约简网络124和/或控制引擎104)被连接。凭借此架构,实施例可对难以处置其他数据并行结构(诸如,SIMD单元)的循环实现高性能。在各种实施例中,可以有不同数量的处理元件106A-106Z,诸如,两个、四个、六个、八个、十个、十二个、十六个、三十二个,等等。处理元件106A-106Z的具体数量可灵活地选择以便针对各种因素进行优化,这些因素诸如,硬件处理器102预期要执行的操作、硬件处理器102的大小和/或功率可用性,等等。

在一些实施例中,处理元件106A-106Z中的每一个都包括允许处理元件执行整数、浮点和/或控制操作(包括但不限于数学操作(例如,加法、乘法)、存储器操作(例如,加载、存储)等)的硬件块。由此,在一些实施例中,处理元件106A-106Z中的每一个可包括用于执行一条或多条指令来执行操作的电路,或者可以是或可以不是处理器核的部分。由此,处理元件可视为一种类型的硬件处理器。处理元件106A-106Z中的每一个也可从高速缓存(例如,存储器单元110)加载或存储数据/向高速缓存(例如,存储器单元110)加载或存储数据,或者从“邻居”处理元件加载或存储数据/向“邻居”处理元件加载或存储数据。例如,第一处理元件106A可通过邻至邻链路120A将值(例如,数据)发送到其相邻的处理元件106B。类似地,处理元件106B可通过邻至邻链路120A从第一处理元件106A接收这个值,并且经由另一邻至邻链路120B将另一值(其可以与接收到的那个值相同或不同)发送到另一相邻/邻近处理元件106C(在此未示出),以此类推。“最后一个”处理元件106Z可类似地通过邻至邻链路120Y从其前一的邻居处理元件106Y(未示出)接收值,可任选地,该处理元件106Z可经由另一邻至邻链路120Z(在此以虚线示出以强调其可任选性质)被连接,该邻至邻链路120Z可将值“往回”发送到第一处理元件106A,但是在其他实施例中,可以不包括(或利用)该链路120Z,因为数据可通过其他方式(例如,经由工作卸载122从控制引擎104)被往回提供至第一处理元件106A。

可任选地,处理元件106A-106Z可连接至存储器单元111,这可经由存储器仲裁器108单元发生。存储器单元100和存储器仲裁器是本领域技术人员公知的块,并且具有本领域技术人员公知的可用于实现这些元件的许多技术和硬件元件。在一些实施例中,仲裁器108可以是本文中稍后讨论的数据管理单元(DMU)的部分,其也可以或可以不包括(高速缓存)存储器单元110。此外,在仲裁器108是DMU的部分的实施例中,DMU也可包括约简网络124,并且也可充当至外部存储器单元111的(用于处理元件106A-106Z的)接入点。

在使用存储器单元110的一些实施例中,它可以是“高度”区块化(例如,4个区块、8个区块、16个区块、32个区块、64个区块)且经优化以提供对处理元件106A-106Z的相对低等待时间访问(例如,5周期、10周期、16周期)的片上高速缓存。例如,存储器单元110大小可以是1兆字节(MB),具有每区块8字节的32个区块、8字节存储单元,并且具有大约10周期的等待时间。作为另一示例,存储器单元110大小可以是512千字节(KB),具有每区块8字节的32个区块、8字节存储单元,并且具有大约16周期的等待时间。当然,可利用许多其他配置,但是总体而言,具有较多数量区块(以允许较多数量的并行访问)并具有较少等待时间的那些配置通常将使硬件处理器102对于本文中讨论的、具有跨迭代而被引入的不规则的数据或控制依赖关系的循环类型能够具有较好性能。然而,重要的是要注意,在一些实施例中,该存储器单元110不被包括,因为它对于加速器设计不是严格意义上重要的,而是设计选项,该设计选项由于设计考虑、所预期的工作负荷的类型以及要优化的工作负荷的类型等在某些实施例中可能有用或可能不是有用的。

硬件处理器102还示出为包括约简链路126,处理元件106A-106Z可使用该约简链路126以将数据提供至约简网络124和/或控制引擎104。约简网络124可包括允许该约简网络124使用从处理元件106A-106Z接收的数据执行“聚合”类型操作的各种硬件块。例如,约简网络124可配置成用于将多个接收到的值相加或相乘,基于多个接收到的值确定统计测量(例如,平均、均值、中位数、标准差),将特定函数(例如,用户定义的函数)应用于值,使值被存储在存储器单元110/111中,等等。

这些值(要么由约简网络124生成、修改或用附加数据来补充,要么直接由处理元件106A-106Z提供)可被提供至控制引擎104。控制引擎104包括控制或管理硬件处理器102执行所需任务的运行的硬件块。例如,在硬件处理器102是加速器的实施例中,控制引擎104可(例如,经由接口130从另一硬件处理器)接收执行任务的信号/命令,可以可任选地从外部存储器单元11加载数据(以提供至处理元件106A-106Z),将任务的子任务“卸载”到处理元件(106A-106Z)(诸如,对于用于循环和/或数据的迭代的指令),配置约简网络124,等等。

为了更清楚地说明该架构的益处,参考图2、图3和图4呈现具有迭代间数据依赖关系的循环的一个示例。然而,应当理解,该示例仅是可由本文中公开的实施例以高性能方式执行的具有迭代间数据依赖关系的(无限)类型的循环中的一种;由此,实施例不限于仅适用于这一个示例。

由此,我们转向图2,图2是示出根据一些实施例的包括具有迭代间数据依赖关系的循环的累积分布函数(CDF)代码段200以及经由图1的计算引擎架构实现显著的计算加速的经优化的CDF代码段220的框图。

(具有行201-210的)CDF内核(“cdfOp”)代码段220常在诸如LDA之类的文本分析应用中找到,但是类似循环在其他领域(例如,计算机视觉)也非常常见。由于迭代间数据依赖关系,该cdfOp内核尤其难以在现代处理器上并行化。例如,行205-209示出具有迭代间数据依赖关系的循环——在此,对于每个迭代,变量“temp”通过使该变量“temp”递增而被更新(在行207中),即,读取当前值,并且基于该当前值确定新值,并将该新值写入到该变量“temp”。由此,在该循环的每一个迭代中,要求temp的现有值,使得该值可被加到“spVector[i].data*denseVector[spVector[i].index]”的结果。相应地,由于连续更新该变量所涉及的存储器等待时间,现有的处理器要高效地并行化此类循环是勉为其难的。此外,由于聚集/分散操作以及1周期的依赖深度,尝试为该任务获得高向量利用率是一个挑战。由此,在示例性现代处理器核上,该循环对于每个元件将要求多于2个周期。

然而,当映射至我们的数据并行加速器架构(如要由每一个处理元件执行的代码段220(在行221-232中的‘PECode_cdfOp’))时,实施例可维持每周期2个元件的吞吐量,这相对于每个元件2个周期是巨大的改进。此外,在一些实施例中,用于处理元件映射的该代码220可由现有编译器自动生成而无需任何软件改变。实施例可使用由硬件处理器102提供的reduce()、fetchLeft()和/或sendRight()能力来实现此性能。

在一些实施例中,(行226处的)约简操作可由处理元件用于利用约简网络124来例如执行复杂操作,该复杂操作诸如求和、相乘等,其可以或可以不涉及来自已经以压缩格式被存储的向量、矩阵或其他数据结构的数据值。由此,处理元件可使用该专用硬件块(例如,通过经由约简链路126将执行操作的请求发送至约简网络124,该约简网络124可通过链路126将结果返回至处理元件或可往回通过控制引擎104将结果返回至处理元件)以快得多的速度来执行某些操作然而,在一些实施例且在一些特定的代码执行中,此类约简操作可能不需要被使用——例如,行226可被省略,由此,操作替代地由处理元件自身执行。

在一些实施例中,硬件处理器102的处理元件106A-106Z可利用fetchLeft操作,该操作在代码段220中在行227中示出。fetchLeft操作可使处理元件获取在将该处理元件连接至其“前一”处理元件的邻至邻链路120上正被传递的值。类似地,在一些实施例中,硬件处理器102的处理元件106A-106Z可利用sendRight操作,该操作在代码段220中在行229中示出。fetchLeft操作可使处理元件经由将该处理元件连接至其“后一”处理元件的邻至邻链路120来发送值。

由此,在经优化的代码段220中,实施例可使用行226中的约简操作以高效地确定行225的乘法的结果,通过使用fetchLeft操作(从先前代码段200的行207)获取temp的“现有的”(或“先前”)值作为prevVal,基于约简操作和fetchLeft操作的结果来确定newVal(在行228处),并且既(经由行229处的sendRight操作)将该newVal发送到相邻处理元件供其用于执行同一循环的下一迭代,又用新值来更新输出向量(outputVector)。

由此,在一些实施例中,处理元件106A-106Z能以近乎同时的方式执行同一循环的相继的多个迭代,同时消除由于迭代间数据依赖关系而导致的显著的时间损失,因为来自先前迭代的结果一可用,处理元件106A-106Z就可(从执行前一迭代的相邻处理元件)迅速获取该结果,并且/或者其迭代的结果一可用,处理元件106A-106Z就可迅速提供该结果(至正在执行该循环的相继迭代的相邻处理元件)。

为了易于理解并澄清硬件处理器102的效率,将说明代码段220的示例性样本执行。为开始此示例,我们转到图3,图3是示出根据一些实施例的可由图2中的经优化的CDF代码段利用的示例性数据结构和数据的框图,图2中的经优化的CDF代码段经由图1中的所公开的计算引擎架构来实现显著的加速。

图3示出示例性稀疏向量305和示例性密集向量320,它们对应于主要在代码段220中的行225处被引用的“spVector”和“denseVector”变量。示例性稀疏向量305是“稀疏的”,体现在它包括显著量的“空”值(此处为“0”值)。在许多现代机器学习环境中,此类稀疏向量非常常见,并且与浪费大量存储器来存储完整的稀疏向量305不同,稀疏向量305可转而被存储为经压缩的稀疏向量310表示。所示的经压缩稀疏向量310包括稀疏向量305的非空(或非零)值中的每一个的元素312(在此为包括值314和索引316的对)。由此,每一个元素312包括来自稀疏向量305的值314中的一个值以及指示那个值314在原始的稀疏向量305中的位置的索引316号。如图所示,第一元素312是(2,0),指示数字2位于示例性稀疏向量305的第0个索引处(或者是第一个元素);类似地,第四个元素(6,5)指示数字6位于示例性稀疏向量305的第5个索引处(或者是第六个元素)。由此,由于具有示例性稀疏向量305的五个非零值,经压缩的稀疏向量310包括五个元素312。相应地,变量“vectorLen”318被设置为五,它在代码段220中的行223处被使用。

示例性密集向量320不是稀疏向量,因为它并不包括显著量的空值。当然,术语“显著”是相对性术语,由此其确切定义可基于特定的实现方式来灵活地确定,在特定的实现方式中,可权衡相对于使用常规未经压缩的数据结构而使用经压缩数据结构的成本收益比。相应地,由于向量是密集的,因此在一些实施例中,该向量可用作典型的值阵列/列表,诸如,示例性密集向量表示325。

由此,为了继续我们的示例,经压缩的稀疏向量310将用作代码块220的部分400(其在图4中示出)内的“spVector”,并且示例性密集向量表示将用作该部分400内的“denseVector”。图4是示出根据一些实施例的图2中的经优化的CDF代码段220的部分400如何能够由图1中的计算引擎架构的示例性实现方式执行的框图。

相应地,在此示例中,代码段400(其可被称为整个任务(即,整个代码段220、或包括或调用对代码段220的执行的另一程序)的子任务)将由三个处理元件106A-106C中的每一个执行。当然,在各种实施例中,处理元件106A-106Z的数量可显著地不同,并且更多的处理元件可用于实现进一步加速;在此示例性执行405中,为了清楚和易于理解,仅使用三个处理元件106A-106C。

在此示例性执行405中,这三个处理元件106A-106C可执行第一轮440,在第一轮440中,每一个处理元件都将执行代码部分400。具体地,第一处理元件106将执行循环的第一迭代412,第二处理元件106B将执行循环的第二迭代422,并且第三处理元件106C将执行循环的第三迭代432。这可例如通过使处理元件中的每一个在行222中以不同的起始值开始——在此,0用于第一处理元件160A,1用于第二处理元件160B,并且2用于第三处理元件160C。

在该第一轮440中,第一处理元件106A将会(在行224-225处)将currVal确定为4,在行226处确定先前值(经由fetchLeft,在此其为空值或“0”,因为没有前一迭代)为NULL(空值),并且在行227处将newVal确定为等于4+NULL或4。在行228处,该值几乎立即可从第一处理元件106A经由邻至邻链路120A被发射(或发送)到第二处理元件106B,从而允许第二处理元件106B在行226处使用该值来计算该第二处理元件106B自身的newVal(“6”),类似地,该newVal可(经由执行行228处sendRight操作的第二处理元件106B)继续传递至第三处理元件106C,供该第三处理元件106C使用。由此,在极其短的时间量内,可执行该循环的前三个依赖于数据的迭代。这与其他现代处理元件形成鲜明对比,其他现代处理元件在多个迭代之间会具有显著延迟,因为通过公知的编译器优化等方式,存储器访问延迟不能够被“隐藏”。

在此示例中,值laneLength可提供给处理元件106A-106C以指示正在执行迭代的处理元件106A-106C的数量,由此,在该情况下,laneLength的值可以是3。

由此,由于“i”循环计数器的递增大小为laneLength的大小(参见行222,其中“i+=laneLength”),因此i的值对于第一处理元件160A现在是3,并且对于第二处理元件160B是4。由于i对于第三处理元件160C将是5,并且由于5超出了循环条件(i<vectorLen,或i<5),因此第三处理元件106C在第二轮450期间将不执行第二迭代。

然而,第一处理元件106A和第二处理元件106B将分别执行迭代414和424以完成对子任务的执行。如以点状线所示,在邻至邻链路存在于第三处理元件106C与第一处理元件106A之间的情况下,来自第三处理元件106C(来自迭代432)的行228的值可(例如,经由sendRight操作)被直接提供,从而实现环形sendRight。然而,在其他实施例中,(当第三处理元件106C可能不具有与第一处理元件106A的邻至邻链路时)来自sendRight的值可转而由第三处理元件106C传递至控制引擎104,该控制引擎由此将该值提供给第一处理元件106A。

值得注意的是,使用了某些抽象来呈现该示例,以便不使本发明的实施例的多个方面模糊。由此,例如这些确切示出的图示指令220可以不由处理元件执行,替代地,(基于所示代码220动态或静态地生成的)不同指令可在各种实施例中被执行。

现在我们转向图5,图5是示出根据一些实施例的用于利用用于支持数据并行循环的计算引擎架构的操作流500的流程图。将参照其他附图中的示例性实施例来描述该流程图和其他流程图中的操作。然而,应当理解,该流程图中的操作可由除参照其他附图所讨论的那些实施例之外的实施例来执行,并且参照这些其他附图所讨论的实施例可执行与参照该流程图所讨论的操作不同的操作。在一些实施例中,该流程500由图1中的硬件处理器102执行。

可任选地,流程500包括框505:由第一硬件处理器确定任务已从第二硬件处理器卸载到该第一硬件处理器以供执行。第一硬件处理器包括区块化为多个区块的存储器单元和多个处理元件。多个处理元件中的每一个经由一个或多个邻至邻链路直接与一个或多个相邻的处理元件耦合,使得处理元件能够:(1)从相邻处理元件接收值;(2)将值提供给相邻处理元件;或(3)从一个相邻处理元件接收值,并将值提供给另一相邻处理元件。

在框510处,流程500包括:由第一硬件处理器执行任务,其中,执行任务包括:使多个处理元件中的每一个执行任务的同一子任务的一个或多个迭代。对于多个迭代中的每一个迭代,多个处理元件中的处理元件(例如,至少一半处理元件)用于访问从存储器单元获取的一个或多个数据值,并且(1)既基于从第一相邻处理元件接收到的第一值和一个或多个数据值中的至少一个数据值来确定值,(2)又将所确定的值提供给第二相邻处理元件供该第二相邻处理元件在执行该子任务的迭代时使用。对任务的执行使第二硬件处理器确定一个或多个输出值。

可任选地,在框515处,流程500可任选地包括:由第一硬件处理器将这一个或多个输出值提供给第二硬件处理器。

在图6内呈现框510的一个示例,其是示出根据一些实施例的、用于利用用于支持数据并行循环的包括多个处理元件的计算引擎架构来执行任务的操作流程600的流程图。然而,一些实施例可执行流程600,并且其操作可以不充当流程500的部分——即,一些实施例可以不执行流程500,但仍执行流程600。在一些实施例中,该流程600由图1中的硬件处理器102执行。

流程600包括:在框605处,由硬件处理器的多个处理元件(PE)中的第一处理元件执行任务的子任务的第一迭代。该执行包括:访问来自存储器单元的一个或多个数据值的第一集合;基于该数据值的第一集合来生成第一值;以及经由第一邻至邻链路将该第一值发送到多个PE中的第二PE。

流程600还包括:在框610处,由多个PE中的第二PE执行该子任务的第二迭代,该执行包括:访问来自存储单元的一个或多个数据值的第二集合;基于该数据值的第二集合并且也基于第一值来生成第二值;以及经由第二邻至邻链路将该第二值发送至多个PE中的第三PE。

可任选地,流程600还包括框615的一个或多个迭代(通过虚线655示出),其包括由多个PE中的第x(例如,第三、第四、第五)PE执行该子任务的第x迭代,该执行包括:访问来自存储器单元的一个或多个数据值的第x集合;基于该数据值的第x集合并且也基于第(x-1)值来生成第x值。可任选地,框615包括:经由第x邻至邻链路将第x值发送至多个PE中的第y个PE。在框615被执行一次或多次(例如,由不同PE)的实施例中,该流程可继续经由箭头650回到框605,以便由PE执行迭代的第二轮。附加地或替代地,在一些实施例中,流程600可经由箭头660(或从框610)继续进行到框620。

框620包括:由HP至少部分地基于第一值和第二值来将一个或多个输出值确定为任务的结果。在一些实施例(诸如,流程600包括框615的一个或多个迭代的那些实施例)中,框620可进一步包括:基于来自框615的所生成的第X值来进一步确定一个或多个输出值。

示例

在一些实施例中,一种在第一硬件处理器(HP)中的方法包括:由所述第一HP确定任务已从第二HP卸载到所述第一HP,所述第一HP包括区块化为多个区块的存储器单元和多个处理元件(PE),每一个PE都经由一个或多个邻至邻链路直接与一个或多个相邻PE耦合,使得每一个PE能够:从相邻PE接收值,将值提供给相邻PE,或者既从一个相邻PE接收值,又将值提供给另一相邻PE;以及由所述第一HP执行所述任务,所述执行包括使所述多个PE中的每一个PE执行所述任务的同一子任务的一个或多个迭代,其中,对于迭代中的每一个迭代,所述多个PE中的PE用于:访问从所述存储器单元获取的一个或多个数据值;以及既基于从第一相邻PE接收的第一值和所述一个或多个数据值中的至少一个数据值来确定值,又将所确定的值提供给第二相邻PE,以供所述第二相邻PE在执行所述子任务的迭代时使用,其中,对所述任务的执行使所述第一HP确定一个或多个输出值;以及由所述第一HP将所述一个或多个输出值提供给所述第二HP。在一些实施例中,所述多个区块包括至少八个区块。在一些实施例中,所述多个区块包括至少三十二个区块。在一些实施例中,对于由所述多个PE中的一个PE对所述存储器单元的所述多个区块中的一个区块的存储器访问,最多有二十周期的等待时间。在一些实施例中,所述一个或多个数据值包括第一数据值向量和第二数据值向量,其中,所确定的值基于所述第一数据值向量中的至少一个数据值以及所述第二数据值向量中的至少一个值。在一些实施例中,所述多个PE中的每一个PE都能够执行整数操作、浮点操作和控制操作。在一些实施例中,由所述第一HP执行所述任务包括执行由编译器生成的一条或多条指令,其中所述一条或多条指令包括至少一条fetchLeft指令和至少一条sendRight指令,所述至少一条fetchLeft指令使PE经由邻至邻链路从相邻PE获取值,所述至少一条sendRight指令使PE经由邻至邻链路将值发送至相邻PE。

在一些实施例中,执行所述任务包括:由所述HP的多个处理元件(PE)中的第一PE执行所述子任务的第一迭代,其中,执行所述子任务的第一迭代包括:访问来自所述存储器单元的一个或多个数据值的第一集合;基于所述数据值的第一集合来生成第一值;以及经由第一邻至邻链路将所述第一值发送至所述多个PE中的第二PE;由所述多个PE中的第二PE执行所述子任务的第二迭代,执行所述子任务的第二迭代包括:访问来自所述存储单元的一个或多个数据值的第二集合;基于所述数据值的第二集合并且也基于所述第一值来生成第二值;以及经由第二邻至邻链路将所述第二值发送至所述多个PE中的第三PE;以及由所述HP至少部分地基于所述第一值和所述第二值来将一个或多个输出值确定为所述任务的结果。

根据一些实施例,一种硬件处理器包括:存储器单元,所述存储器单元区块化为多个区块;多个处理元件(PE),其中,所述多个PE中的每一个PE都经由一个或多个邻至邻链路直接与所述多个PE中的一个或多个相邻PE耦合,使得每一个PE都能够:从相邻PE接收值;将值提供给相邻PE;或者既从一个相邻PE接收值,又将值提供给另一相邻PE;以及控制引擎,与所述多个PE耦合,所述控制引擎用于使所述多个PE共同执行任务以便通过每一个PE执行所述任务的同一子任务的一个或多个迭代来生成一个或多个输出值,其中,所述一个或多个迭代中的每一个迭代包括:PE从相邻PE接收值,将值提供给相邻PE,或者既从一个相邻PE接收值,又将值提供给另一相邻PE。在一些实施例中,所述多个区块包括至少八个区块。在一些实施例中,所述多个区块包括至少三十二个区块。在一些实施例中,对于由所述多个PE中的一个PE对所述存储器单元的所述多个区块中的一个区块的存储器访问,最多有二十周期的等待时间。在一些实施例中,所述多个PE中的每一个PE都能够执行整数操作、浮点操作和控制操作。在一些实施例中,所述硬件处理器进一步包括接口,所述接口用于使所述硬件处理器能够经由一个或多个总线与另一硬件处理器耦合,其中,所述另一硬件处理器用于将所述任务卸载到所述硬件处理器。

根据一些实施例,一种系统包括:第一硬件处理器,所述第一硬件处理器用于将任务卸载到第二硬件处理器;以及所述第二硬件处理器。所述第二硬件处理器包括:存储器单元,所述存储器单元区块化为多个区块;多个处理元件(PE),其中,所述多个PE中的每一个PE都经由一个或多个邻至邻链路直接与所述多个PE中的一个或多个相邻PE耦合,使得每一个PE都能够:从相邻PE接收值;将值提供给相邻PE;或者既从一个相邻PE接收值,又将值提供给另一相邻PE;以及控制引擎,与所述多个PE耦合,所述控制引擎用于使所述多个PE共同执行任务以便通过每一个PE执行所述任务的同一子任务的一个或多个迭代来生成一个或多个输出值,其中,所述一个或多个迭代中的每一个迭代包括:PE从相邻PE接收值,将值提供给相邻PE,或者既从一个相邻PE接收值,又将值提供给另一相邻PE。在一些实施例中,所述多个区块包括至少八个区块。在一些实施例中,所述多个区块包括至少三十二个区块。在一些实施例中,对于由所述多个PE中的一个PE对所述存储器单元的所述多个区块中的一个区块的存储器访问,最多有二十周期的等待时间。在一些实施例中,所述多个PE中的每一个PE都能够执行整数操作、浮点操作和控制操作。在一些实施例中,所述第二硬件处理器进一步包括接口,所述接口经由一个或多个总线将所述第二硬件处理器与所述第一硬件处理器耦合,其中,所述另一硬件处理器用于将所述任务卸载到所述硬件处理器。

根据一些实施例,一种在硬件处理器(HP)中的方法包括:由所述HP的多个处理元件(PE)中的第一PE执行任务的子任务的第一迭代,其中,执行所述子任务的第一迭代包括:访问来自存储器单元的一个或多个数据值的第一集合;基于所述数据值的第一集合来生成第一值;以及经由第一邻至邻链路将所述第一值发送至所述多个PE中的第二PE;由所述多个PE中的第二PE执行所述子任务的第二迭代,执行所述子任务的第二迭代包括:访问来自所述存储单元的一个或多个数据值的第二集合;基于所述数据值的第二集合并且也基于所述第一值来生成第二值;以及经由第二邻至邻链路将所述第二值发送至所述多个PE中的第三PE;以及由所述HP至少部分地基于所述第一值和所述第二值来将一个或多个输出值确定为所述任务的结果。

根据一些实施例,一种硬件处理器(HP)包括:用于由所述HP的多个处理元件(PE)中的第一PE执行任务的子任务的第一迭代的装置,其中,执行所述子任务的第一迭代包括:访问来自存储器单元的一个或多个数据值的第一集合;基于所述数据值的第一集合来生成第一值;以及经由第一邻至邻链路将所述第一值发送至所述多个PE中的第二PE;用于由所述多个PE中的第二PE执行所述子任务的第二迭代的装置,执行所述子任务的第二迭代包括:访问来自所述存储单元的一个或多个数据值的第二集合;基于所述数据值的第二集合并且也基于所述第一值来生成第二值;以及经由第二邻至邻链路将所述第二值发送至所述多个PE中的第三PE;以及用于由所述HP至少部分地基于所述第一值和所述第二值来将一个或多个输出值确定为所述任务的结果的装置。

本文中公开的实施例利用电子设备。电子设备使用机器可读介质(也称为计算机可读介质)来存储和(在内部以及/或者用其他电子设备通过网络的方式)传输代码(所述代码由软件指令组成并且有时被称为计算机程序代码或计算机程序)和/或数据,机器可读介质诸如机器可读存储介质(例如,磁盘、光盘、只读存储器(ROM)、闪存设备、相变存储器)和机器可读传输介质(也称为载体)(例如,电、光、无线电、声或其他形式的被传播信号——诸如,载波、红外信号)。因此,电子设备(例如,计算机)包括硬件和软件,诸如,一个或多个处理器的集合,该一个或多个处理器的集合耦合到一个或多个机器可读存储介质,该机器可读存储介质用于存储供在处理器集合上执行的代码和/或用于存储数据。例如,电子设备可包括包含代码的非易失性存储器,因为非易失性存储器甚至当电子设备被关闭(当功率被移除)时也可使代码/数据留存,而当电子设备被开启时,将由那个电子设备的(多个)处理器执行的代码的那部分从较慢的非易失性存储器典型地被复制到那个电子设备的易失性存储器(例如,动态随机存取存储器(DRAM)、静态随机存取存储器(SRAM))中。典型的电子设备还包括用于建立与其他电子设备的网络连接(以使用传播信号传输和/或接收代码和/或数据)的一个或多个物理网络接口的集合。实施例的一个或多个部分可使用软件、固件和/或硬件的不同组合来实现。

示例性加速器架构

概览

在一些实现方式中,加速器耦合到处理器核或其他处理元件以加速某些类型的操作(诸如,图形操作、机器学习操作、图案分析操作以及(如下文中详述的)稀疏矩阵乘法操作,仅举数例)。加速器可通过总线或其他互连(例如,点对点互连)通信地耦合到处理器/核,或者可与处理器一起集成在同一芯片上且通过内部处理器总线/互连通信地耦合到核。无论加速器连接的方式如何,处理器核都可将某些处理任务分配给加速器(例如,以指令或微操作(μop)序列的形式),该加速器包括用于高效地处理这些任务的专用电路/逻辑。

图7示出示例实现方式,其中,加速器700通过高速缓存一致接口730通信地耦合到多个核710-711。核710-711中的每一个包括用于存储虚拟到物理地址转换的转换后备缓冲器712-713以及用于对数据和指令进行高速缓存的一个或多个高速缓存714-715(例如,L1高速缓存、L2高速缓存等)。存储器管理单元720管理核710-711对系统存储器750的访问,系统存储器750可以是动态随机存取存储器DRAM。共享高速缓存726(诸如,L3高速缓存)可在处理器核710-711之间被共享,并且经由高速缓存一致接口730与加速器700共享。在一种实现方式中,核ATA 1010T-1011、MMU 720和高速缓存一致接口730集成在单个处理器芯片上。

所示加速器700包括数据管理单元705,该数据管理单元705具有高速缓存707和调度器AT006,该调度器用于调度对多个处理元件701-702、N的操作。在所示实现方式中,每一个处理元件具有其自身的本地存储器703-704、N。如在下文中所详述,每一个本地存储器703-704、N可实现为堆叠的DRAM。

在一种实现方式中,高速缓存一致接口730提供核710-711与加速器700之间的高速缓存一致的连接性,从而实际上将加速器视为核710-711的对等设备(peer)。例如,高速缓存一致接口730可实现高速缓存一致协议以确保由加速器700访问/修改以及存储在加速器高速缓存707和/或本地存储器703-704、N中的数据与存储在核高速缓存710-711、共享高速缓存726和系统存储器750中的数据一致。例如,高速缓存一致接口730可参与由核710-711和MMU 720用于检查共享高速缓存726和本地高速缓存714-715内的高速缓存行的状态的监听机制,并且可充当代理(proxy),从而响应于由处理元件701-702、N进行的对高速缓存行的访问和所尝试的修改来提供监听更新。此外,当高速缓存行由处理元件701-702、N修改时,如果这些高速缓存行存储在共享高速缓存726或本地高速缓存714-715内,则高速缓存一致接口730可更新这些高速缓存行的状态。

在一种实现方式中,数据管理单元705包括存储器管理电路,该存储器管理电路提供对系统存储器750和共享高速缓存726的加速器700访问。此外,数据管理单元705可根据需要将更新提供给高速缓存一致接口730,并从高速缓存一致接口730接收更新(例如,以便确定高速缓存行的状态变化)。在所示实现方式中,数据管理单元705包括调度器706,该调度器706用于调度待由处理元件701-702、N执行的指令/操作。为了执行其调度操作,调度器706可评估指令/操作之间的依赖关系以确保指令/操作以一致的顺序被执行(例如,以确保第一指令在第二指令之前执行,该第二指令依赖于来自第一指令的结果)。不互相依赖的指令/操作可在处理元件701-702、N上并行地执行。

用于矩阵和向量操作的加速器架构

图8示出加速器700和先前描述的其他组件的另一视图,这些组件包括数据管理单元705、多个处理元件701-N以及快速片上存储设备800(例如,在一种实现方式中,使用堆叠的本地DRAM来实现)。在一种实现方式中,加速器700为硬件加速器架构,并且处理元件701-N包括用于执行矩阵*向量以及向量*向量操作(包括对于稀疏/密集矩阵的操作)的电路。具体地,处理元件701-N可包括用于面向列和面向行的矩阵处理的硬件支持,并且可包括用于(诸如,用于机器学习(ML)算法的)“缩放并更新”操作的微架构支持。

所描述的实现方式执行矩阵/向量操作,这些矩阵/向量操作通过以下方式来优化:将频繁使用、随机访问、潜在稀疏(例如,聚集/分散)的向量数据保持在快速片上存储设备800中,并将大型、不频繁使用的矩阵数据维持在每当可能时就以流式方式被访问的片外存储器(例如,系统存储器750)中,并且暴露矩阵块内/间并行性以便按比例放大。

处理元件701-N的实现方式处理稀疏矩阵、密集矩阵、稀疏向量和密集向量的不同组合。如本文中所使用,“稀疏”矩阵或向量是其中元素中的大多数为零的矩阵或向量。相比之下,“密集”矩阵或向量是其中元素中的大多数为非零的矩阵或向量。矩阵/向量的“稀疏度”可基于非零值元素的数量除以元素总数(例如,对于m x n矩阵,总数为m x n)来定义。在一种实现方式中,如果矩阵/向量的稀疏度高于指定的阈值,则它被视为是“稀疏的”。

在图9中的表中示出由处理元件701-N执行的示例性操作集。具体地,操作类型包括使用稀疏矩阵的第一乘法900、使用密集矩阵的第二乘法901、缩放并更新操作902m和点积操作903。提供列用于:第一输入操作数910和第二输入操作数911(其中的每一个都可包括稀疏或密集矩阵/向量);输出格式913(例如,密集向量或标量);矩阵数据格式(例如,经压缩的稀疏行、经压缩的稀疏列、面向行的,等等);以及操作标识符914。

在一些当前工作负荷中发现的运行时主导计算模式包括以面向行和面向列方式的矩阵乘以向量的变体。它们按公知的矩阵格式工作:经压缩的稀疏行(CSR)和经压缩的稀疏列(CSC)。图10a描绘在稀疏矩阵A与向量x之间相乘以产生向量y的乘法的示例。图10b示出矩阵A的CSR表示,在该CSR表示中,每一个值被存储为(值,行索引)对。例如,对于行0的(3,2)指示值3被存储在行0的元素位置2中。图10c示出矩阵A的CSC表示,该CSC表示使用(值,列索引)对。

图11a、图11b和图11c示出在下文中详述的每一种计算模式的伪代码。具体地,图11a示出面向行的稀疏矩阵与密集向量相乘(spMdV_csr);图11b示出面向列的稀疏矩阵与稀疏向量相乘(spMspC_csc);图11c示出缩放并更新操作(scale_update)。

A.面向行的稀疏矩阵与密集向量乘法(spMdV_csr)

这是在许多应用领域(诸如,高性能计算)中重要的公知的计算模式。在此,对于矩阵A的每一行,执行那行对向量x的点积,并且结果被存储在由行索引指向的y向量元素中。此计算在跨样本集(即,矩阵的多行)执行分析的机器学习(ML)算法中使用。它可在诸如“迷你批次”之类的技术中使用。也存在这样的情况,其中,ML算法仅执行稀疏向量对密集向量的点积(即,spMdV_csr循环的迭代),诸如,在学习算法的随机变量中。

会影响此计算的性能的已知因素是在点积计算中随机访问稀疏的x向量元素的需要。对于常规的服务器系统,当x向量为大时,这将导致对存储器或末级高速缓存的不规则访问(聚集)。

为了解决这一问题,处理元件的一种实现将矩阵A划分为列块,并将x向量分为为多个子集(每一个子集对应于A矩阵的列块)。块大小可选择为使得x向量的子集可在芯片上适配。因此,对它的随机访问可局部化在片上。

B.面向列的稀疏矩阵与稀疏向量乘法(spMspV_csc)

将稀疏矩阵与稀疏向量相乘的这种模式不如spMdV_csr有名。然而,它在一些ML算法中是重要的。它在算法作用于被表示为数据集中的矩阵列(因此,具有对面向列的矩阵访问的需求)的特征集时被使用。

在此计算模式中,矩阵A的每一列被读取,并与向量x的对应的非零元素相乘。结果被用于更新保持在y向量处的部分点积。当与非零x向量元素相关联的所有列都已被处理之后,y向量将包含最终点积。

虽然对矩阵A的访问是规则的(即,流入A的列),但是对y向量的访问以更新部分点积是不规则的。要访问的y元素取决于正在被处理的A向量元素的行索引。为了解决这一问题,矩阵A可划分为行块。结果,向量y可划分为对应于这些块的子集。以此方式,当处理矩阵行块时,它仅需要不规则地访问(聚集/分散)其y向量子集。通过适当地选择块大小,y向量子集可保持在片上。

C.缩放并更新(scale_update)

此模式典型地由ML算法用于将缩放因子应用于矩阵中的每一个样本,并使这些缩放因子约简(reduce)为各自对应于特征(即,A中的列)的权重集。在此,x向量包含缩放因子。对于矩阵A的每一行(按CSR格式),用于那行的缩放因子从x矩阵读取出,并随后应用于那行中A的每一个元素。结果被用于更新y向量的元素。在所有行已被处理之后,y向量包含经约简的权重。

与先前的计算模式类似,当y为大时,对y向量的不规则访问会影响性能。将矩阵A划分为列块并将y向量划分为对应于这些块的多个子集可有助于使每一个y子集内的不规则访问局部化。

一种实现方式包括可高效地执行上文讨论的计算模式的硬件加速器700。加速器700是可与通用处理器集成的硬件IP块,类似于在现有的基于加速器的解决方案(例如,PowerEN、M7)中发现的那些。在一种实现方式中,加速器700通过与用于执行计算模式的处理器共享的互连来独立地访问存储器750。它支持驻留在片外存储器中的任何任意大的矩阵数据集。

图12示出用于数据管理单元705和处理元件701-702的一种实现方式的处理流。在该实现方式中,数据管理单元705包括处理元件调度器1201、读取缓冲器1202、写入缓冲器1303和约简单元1204。每一个PE 701-702都包括输入缓冲器1205-1206、乘法器1207-1208、加法器1209-1210、本地RAM1221-1222、和寄存器1211-1212以及输出缓冲器1213-1214。

加速器支持上文讨论的矩阵分块方案(即,行和列分块)以支持任何任意大的矩阵数据。加速器设计成用于处理矩阵数据块。每一个块进一步划分成由PE 701-702并行地处理的子块。

在操作中,数据管理单元705将矩阵行或列从存储器子系统读取到该数据管理单元705的读取缓冲器1202中,这些矩阵行或列随后由PE调度器1201跨PE 701-702动态地分布以用于处理。该数据管理单元705也从其写入缓冲器1203将结果写入到存储器。

每一个PE 701-702负责处理矩阵子块。PE包含片上RAM 1221-1222以存储需要被随机访问的向量(即,如上文所述的x或y向量的子集)。PE还包含:浮点乘法累加(FMA)单元,其包括乘法器1207-1208和加法器1209-1210;以及输入缓冲器1205-1206内的拆包逻辑,用于从输入数据提取矩阵元素;以及和寄存器1211-1212,用于保持所累加的FMA结果。

加速器的一种实现方式实现非常高的效率,因为:(1)它将被不规则访问的(聚集/发散)数据放置在片上PE RAM 1221-1222中;(2)它利用硬件PE调度器1201来确保PE被很好地利用;以及(3)与利用通用处理器不同,加速器仅由基本上用于稀疏矩阵操作的硬件资源构成。总体而言,加速器高效地将被提供给它的可用存储器带宽转换为性能。

性能的缩放可通过以下操作来完成:采用加速器块中的更多PE以并行地处理多个矩阵子块;和/或采用更多加速器块(每一个加速器块具有PE集)以并行地处理多个矩阵块。在下文中考虑这些选项的组合。PE和/或加速器块的数量应当经调节以匹配存储器带宽。

加速器700的一种实现方式可通过软件库(类似于数学内核库(Math Kernel Library))来编程。此类库在存储器中准备矩阵数据,利用关于计算的信息(例如,计算类型、指向矩阵数据的存储器指针)来设置加速器700中的控制寄存器,并且启动加速器。随后,加速器独立地访问存储器中的矩阵数据,执行计算并将结果写回到存储器供软件消耗。

如图13a-图13b中所描绘,加速器通过将其PE设置为适当的数据路径配置来处置不同的计算模式。具体地,图13a(使用点状线)突出显示用于spMspV_csc和scale_update操作的路径,而图13b示出用于spMdv_csr操作的路径。在下文中详述用于执行每一种计算模式的加速器操作。

对于spMspV_csc,初始y向量由DMU 705加载到PE的RAM 1221中。随后,它从存储器读取x向量元素。对于每一个x元素,DMU 705从存储器流送对应矩阵列的元素,并将它们供应至PE 701。每一个矩阵元素包含值(A.val)和索引(A.idx),该索引指向将从PE的RAM 1221读取的y元素。DMU 705也提供x向量元素(x.val),该x向量元素通过乘法累加(FMA)单元与A.val相乘。结果被用于更新在由A.idx所指向的PE的RAM中的y元素。注意,即便未由我们的工作负荷使用,加速器也支持通过处理所有矩阵列而不是处理仅子集(因为x是密集的)来支持与密集x向量进行的逐列乘法(spMdv_csc)。

scale_update操作与spMspV_csc类似,例外在于,DMU 705读取以CSR格式而非CSC格式表示的A矩阵的行。对于spMdV_csr,x向量子集被加载到PE的RAM 1221中。DMU 705使来自存储器的矩阵行元素(即,{A.val,A.idx}对)流入。A.idx用于从RAM 1221读取适当的x向量元素,该x向量元素通过FMA与A.val相乘。结果被累加到和寄存器1212中。每当PE看见由DMU705供应的指示行结尾的标记时,和寄存器就被写入输出缓冲器。以此方式,每一个PE都为它所负责的行子块产生和。为了产生行的最终和,由DMU中的约简单元1204(参见图12)将由所有PE产生的子块和加在一起。最终和被写入输出缓冲器1213-1214,随后DMU 705将这些最终和写入到存储器。

图形数据处理

在一种实现方式中,本文中描述的加速器架构配置成用于处理图形数据。图形分析依赖于图形算法以提取关于被表示为图形的数据之间的关系的情况。(来自诸如社交媒体之类的源的)图形数据的激增已导致对图形分析的强烈需求和广泛使用。由此,能够尽可能高效地完成图形分析是至关重要的。

为解决这一需求,一种实现方式自动地将用户定义的图形算法映射至被定制到给定的输入图形算法的硬件加速器架构“模板”。加速器可包括上文描述的架构,并且可实现为能以极高效率执行的FPGA/ASIC。概括而言,一种实现方式包括:

(1)硬件加速器架构模板,其基于广义稀疏矩阵与向量相乘(GSPMV)加速器。它支持任意图形算法,因为已显示出图形算法可公式化为矩阵操作。

(2)自动方式,用于将广泛使用的“顶点-中心”(“vertex-centric”)图形编程抽象映射并调节至架构模板。

存在现有的稀疏矩阵相乘硬件加速器,但是它们不支持可定制性以允许映射图形算法。

设计框架的一种实现方式按如下方式操作:

(1)用户将图形算法指定为遵循顶点-中心图形编程抽象的“顶点程序”。在此,由于其流行性,该抽象被选为示例。顶点程序不暴露硬件细节,因此不具备硬件专业知识的用户(例如,数据科学家)可创建该程序。

(2)与(1)中的图形算法一起,框架的一种实现方式接受以下输入:

a.待生成的目标硬件加速器的参数(例如,片上RAM的最大量)。这些参数可由用户提供,或者当以现有系统(例如,特定的FPGA板)为目标时从已知参数的现有库获取。

b.设计优化目标(例如,最大性能、最小面积)。

c.目标图形数据的属性(例如,图形类型)或图形数据自身。这是可任选的,并且用于辅助自动调节。

(3)给定上述输入,框架的一种实现方式执行自动调节以确定应用于硬件模板的定制集以:优化输入图形算法;将这些参数映射到架构模板上以在可合成RTL中产生加速器实例;以及对照从输入图形算法规范导出的功能和性能软件模型来执行对所生成RTL的功能和性能验证。

在一种实现方式中,上文描述的加速器架构经扩展以通过以下方式来支持顶点程序的执行:(1)将其做成可定制硬件模板;以及(2)支持顶点程序所需的功能。基于此模板,描述设计框架以将用户供应的顶点程序映射至硬件模板以产生为该顶点程序所优化的可合成RTL(例如,Verilog)实现实例。该框架也执行自动验证和调节以确保所产生的RTL是正确且经优化的。对于此框架有多个用例。例如,所产生的可合成RTL可部署在FPGA平台(例如,Xeon-FPGA)中以高效地执行给定的顶点程序。或者,可进一步改良所产生的可合成RTL以产生ASIC实现。

已经显示,图形可表示为邻接矩阵,并且图形处理可公式化为稀疏矩阵操作。图14a-图14b示出将图形表示为邻接矩阵的示例。矩阵中的每一个非零表示图形中两个节点之间的边缘。例如,第0行第2列中的1表示从节点A到节点C的边缘。

用于描述对图形数据的计算的最流行的模型之一是顶点编程模型。一种实现方式支持来自Graphmat软件框架的顶点编程模型变量,该Graphmat软件框架将顶点程序公式化为广义稀疏矩阵与向量相乘(GSPMV)。如图14c中所示,顶点程序由以下类型的数据组成:与图形中的边缘/顶点相关联的数据(edata/vdata)、跨图形中的顶点发送的消息(mdata)以及临时数据(tdata)(在程序代码的顶部示出);以及使用读取并更新图形数据的预定义API的无状态的用户定义的计算函数(如在程序代码的底部所示)。

图14d示出用于执行顶点程序的示例性程序代码。边缘数据被表示为邻接矩阵A(如图14b中),顶点数据被表示为向量y,并且消息被表示为稀疏向量x。图14e示出GSPMV公式化,其中,SPMV中的multiply()和add()由用户定义的PROCESS_MSG()和REDUCE()来概括。

在此的一项观察是执行顶点程序所需的GSPMV变量执行稀疏矩阵A(即,邻接矩阵)与稀疏向量x(即,消息)的面向列的乘法以产生输出向量y(即,顶点数据)。此操作被称为col_spMspV(先前参照上文中的加速器进行描述)。

设计框架.框架的一种实现方式在图15中示出,图15包括模板映射组件1511、验证组件1512和自动调节组件1513。它的输入是用户指定的顶点程序1501、设计优化目标1503(例如,最大性能、最小面积)以及目标硬件设计约束1502(例如,片上RAM的最大量、存储器接口宽度)。作为用于辅助自动调节的可任选输入,该框架也接受图形数据属性1504(例如,类型=自然图形)或样本图形数据。

给定这些输入,框架的模板映射组件1511将输入顶点程序映射到硬件加速器架构模板,并产生为执行顶点程序1501所优化的加速器实例的RTL实现1505。自动调节组件1513执行自动调节1513来为给定的设计目标优化所生成的RTL,同时满足硬件设计约束。此外,验证组件1512自动地对照从输入导出的功能和性能模型来验证所生成的RTL。验证测试台(text bench)1506和调节报告1507连同RTL一起产生。

广义稀疏矩阵与向量相乘(GSPMV)硬件架构模板

用于GSPMV的架构模板的一种实现方式在图16中示出,图16基于上文所述的加速器架构(参见例如图12和相关联的文本)。图16中示出的组件中的许多组件是可定制的(如以灰线突出显示的那样)。在一种实现方式中,用于支持对顶点程序的执行的架构已按如下方式扩展。

如图16中所示,可定制逻辑块在每一个PE内被提供以支持顶点程序所需的PROCESS_MSG()1610、REDUCE()1611、APPLY 1612以及SEND_MSG()1613。此外,一种实现方式提供可定制片上存储结构和打包/拆包逻辑1605以支持用户定义的图形数据(即,vdata、edata、mdata、tdata)。图16中示出的数据管理单元705包括(用于如上文所述调度PE的)PE调度器1201、用于存储活跃的列,x数据)的aux缓冲器1601、读取缓冲器1202、用于控制对系统存储器的访问的存储器控制器1603以及写入缓冲器1203。此外,在图16中示出的实现方式中,旧的和新的vdata和tdata被存储在本地PE存储器1221内。各种控制状态机可经修改以支持执行顶点程序,从而实现由图14d和图14e中的算法指定的功能。

每一个加速器片的操作在图17中概括。在1701处,y向量(vdata)被加载到PE RAM 1221。在1702处,x向量和列指针被加载到aux缓冲器1601。在1703处,对于每一个x向量元素,A列被流入(edata),并且PE执行PROC_MSG()1610和REDUCE()1611。在1704处,PE执行APPLY()1612。在1705处,PE执行SEND_MSG()1631,从而产生消息,并且数据管理单元705将这些消息作为x向量写入在存储器中。在1706处,数据管理单元705将存储在PE RAM 1221中的经更新的y向量(vdata)写回到存储器。以上技术符合图14d和图14e中示出的顶点程序执行算法。为了放大性能,该架构允许增加片中PE的数量和/或增加设计中片的数量。以此方式,该架构可利用图形中的多级并行性(即,跨子图形(跨邻接矩阵的块)或在每一个子图形内)。图18a中的表格概括了模板的一种实现方式的可定制参数。指派用于优化的跨片的非对称参数(例如,一个片比另一片有更多的PE)也是可能的。

自动映射、验证和调节

调节.基于输入,框架的一种实现方式执行自动调节以确定用于定制硬件架构模板的最佳设计参数,从而为输入顶点程序和(可任选地)图形数据优化该硬件架构模板。有许多调节考虑,这在图18b中的表格中进行概括。如图所示,这些考虑包括数据的局部性、图形数据大小、图形计算函数、图形数据结构、图形数据访问属性、图形数据类型以及图形数据模式。

模板映射.在该阶段,框架取得由调节阶段确定的模板参数,并且通过“填”入模板的可定制部分来产生加速器实例。用户定义的计算函数(例如,图14c)可使用现有的高级合成(HLS)工具从输入规范被映射至合适的PE计算块。存储结构(例如,RAM、缓冲器、高速缓存)和存储器接口使用其对应的设计参数来实例化。打包/拆包逻辑可从数据类型规范(例如,图14a)自动地生成。控制有限状态机(FSM)的部分也基于所提供的设计参数(例如,PE调度方案)来生成。

验证.在一种实现方式中,由模板映射产生的加速器架构实例(可合成RTL)随后被自动验证。为了完成此,框架的一种实现方式导出将用作“黄金”参考的顶点程序的功能模型。测试台被生成以将对此黄金参引的执行与对架构实例的RTL实现的模拟进行比较。该框架也通过将RTL模拟与分析性能模型和周期精确的软件模拟器进行比较来执行性能验证。该架构报告运行时崩溃并精确定位影响性能的设计瓶颈。

用于处理稀疏数据的加速器架构

引论

对稀疏数据集——其值中的大多数为零的向量或矩阵——的计算对于增长数量的商业上重要的应用是关键的,但是当运行在现今的CPU上时,典型地仅实现峰值性能中的一些百分比。在科学计算领域,几十年来稀疏矩阵计算一直作为线性解算器(solver)的关键内核。最近,机器学习和图形分析的爆炸式增长已将稀疏计算推向主流。稀疏矩阵计算是许多机器学习应用的中心议题,并且形成许多图形算法的核心。

稀疏矩阵计算趋于受限于存储器带宽而非受限于计算,这使CPU改变以改善其性能变得困难。稀疏矩阵计算对于每个矩阵数据元素执行很少的操作,并且常在重新使用任何数据之前对整个矩阵迭代,从而使得高速缓存不起作用。此外,许多稀疏矩阵算法包含大量依赖于数据的聚集和分散(诸如,在稀疏矩阵-向量乘法中找到的result[row]+=matrix[row][i].value*vector[matrix[row][i].index]操作),这些依赖于数据的聚集和分散难以预测,并降低了预取器的有效性。

为了取得比常规微处理器更好的稀疏矩阵性能,系统必须提供比当前CPU显著更高的存储器带宽以及能效非常高的计算架构。增加存储器带宽使改善性能成为可能,但是DRAM访问的高能量/位成本限制了可用于处理该带宽的功率量。在没有高能效计算架构的情况下,系统会发现其自身处于这种处境:在不超出其功率预算的情况下,不能够处理来自高带宽存储器系统的数据。

一种实现方式包括用于稀疏矩阵计算的加速器,该加速器使用堆叠的DRAM以提供稀疏矩阵算法需要的带宽以及用于以高能效方式处理该带宽的定制计算架构。

稀疏矩阵概览

许多应用创建其中绝大多数值为零的数据集。有限元方法将对象建模为点的网格,其中,每一个点的状态是在该网格中靠近该点的多个点的状态的函数。从数学上来说,这成为由矩阵表示的方程组,其中,每一行描述一个点的状态,并且对于不直接影响该行描述的该点的状态的所有点,该行中的值为零。图形可被表示为邻接矩阵,其中,该矩阵中的每一个元素{i,j}给出图形中顶点i与j之间的边缘的权重。由于图形中的大多数顶点仅连接至其他顶点中的一小部分,因此邻接矩阵中的绝大多数元素为零。在机器学习中,模型典型地使用由许多样本组成的数据集来训练,这些样本中的每一个样本包含特征集(系统或对象的状态的观察结果)以及用于该特征集的模型的所期望的输出。对大多数样本而言仅包含可能特征的小子集是非常常见的,例如,当特征表示可存在于文档中的不同单词而再次创建其中大多数值为零的数据集时。

其中大多数值为零的数据集被描述为是“稀疏的”,并且稀疏数据集极其稀疏(在其元素中的小于1%的元素中具有非零值)是非常常见的。这些数据集常使用仅指定矩阵中非零元素值的数据结构来表示为矩阵。虽然这增加了表示每一个非零元素所需的空间量,但是由于指定元素的位置和其值两者是必要的,因此如果矩阵足够稀疏,则总空间(存储器)节省可能是显著的。例如,稀疏矩阵的最直接的表示形式中的一种是坐标列表(COO)表示,其中,每一个非零由{行索引,列索引,值}三元组指定。虽然这使每一个非零值所需的存储量变成三倍,但是如果矩阵中仅1%的元素具有非零值,则COO表示将仅占据密集表示(表示矩阵中的每一个元素的值的一种表示)将占据的空间的3%。

图19示出最常见的稀疏矩阵格式中的一种,即压缩行存储(CRS,有时缩写为CSR)格式。在CRS格式中,矩阵1900通过三个阵列来描述:值阵列1901,其包含非零元素的值;索引阵列1902,其指定每一个非零元素在矩阵的该非零元素所在的行内的位置;以及行开始阵列1903,其指定矩阵的每一行在索引和值的列表中的何处开始。由此,示例矩阵的第二行的第一个非零元素可在索引和值阵列中的位置2处被找到,并且可由元组{0,7}来描述,其指示该元素出现在该行内的位置0处,并且具有值7。其他常用的稀疏矩阵格式包括压缩稀疏列(CSC)和ELLPACK,CSC是相对于CRS对偶的列为主的,ELLPACK将矩阵的每一行表示为非零值及其索引的固定宽度列表,当行具有比该矩阵中的最长行更少的非零元素时,用显式的零来填补。

对稀疏矩阵的计算具有对其对等的密集矩阵计算相同的结构,但是稀疏数据的性质趋于使得它们比其对等的密集矩阵带宽密集程度高得多。例如,矩阵-矩阵乘法的稀疏变量和密集变量两者都通过对于所有的i,j,计算Ci,j=Ai,·B,j来求解C=A·B。在密集矩阵-矩阵计算中,这导致显著的数据重新使用,因为A的每一个元素都参与到N次乘-加操作(假定为N x N矩阵),B的每一个元素也是如此。只要该矩阵-矩阵乘法由于高速缓存局部性而被阻塞,该重新使用就使计算具有低字节/操作比且是受限于计算的。然而,在稀疏变量中,A的每一个元素仅参与到与B的对应行中所具有的非零值一样多的乘-加操作中,同时B的每一个元素仅参与到与A的对应列中所具有的非零值一样多的乘-加中。随着矩阵的稀疏度增加,字节/操作比也增加,从而尽管事实上密集矩阵-矩阵乘法是典型的计算受限计算中的一种却使得许多稀疏矩阵-矩阵计算的性能受限于存储器带宽。

四种操作构成当今应用中所见的稀疏矩阵计算的主体:稀疏矩阵-密集向量乘法(spMV)、稀疏矩阵-稀疏向量乘法、稀疏矩阵-稀疏矩阵乘法、以及松弛/平滑器操作,诸如,在高性能共轭梯度基准的英特尔实现中使用的Gauss-Seidel平滑器。这些操作共享使稀疏矩阵加速器切合实际的两个特性。首先,它们由向量点积操作占主导,这使得实现可实现全部四个重要计算的简单硬件成为可能。例如,矩阵-向量乘法通过进行矩阵中的每一行与向量的点积来执行,而矩阵-矩阵乘法进行一个矩阵的每一行与另一矩阵的每一列的点积。其次,应用通常对相同矩阵执行多次计算,诸如,支持向量机算法通过训练模型来执行的相同矩阵乘以不同向量的数千次乘法。这种对相同矩阵的重复使用使得在程序执行期间往/返于加速器传送矩阵和/或以简化硬件任务的方式重新格式化矩阵是切合实际的,因为数据传送/变换的成本可跨对每一个矩阵的许多操作被分摊。

稀疏矩阵计算典型地仅实现它们运行于其上的系统的峰值性能的一些百分比。为了阐释这为何发生,图20示出使用CRS数据格式进行的稀疏矩阵-密集向量乘法的实现方式中所涉及的步骤2001-2004。首先,在2001处,表示矩阵的行的数据结构从存储器被读出,这通常涉及易于预测和预取的一系列顺序的读取。其次,在2002处,矩阵行中非零元素的索引被用于聚集向量的对应元素,这要求许多依赖于数据的、难以预测的存储器访问(聚集操作)。此外,这些存储器访问在每一个所引用的高速缓存行中经常仅触及一个或两个字,从而当向量在高速缓存中未适配时导致大量被浪费的带宽。

接着,在2003处,处理器计算矩阵行的非零元素与向量的对应元素的点积。最后,在2004处,点积的结果被写入到结果向量中,该结果向量也被顺序地访问,并且程序继续进行到矩阵的下一行。注意,这是计算的概念性/算法视角,程序执行的确切操作序列将取决于处理器的ISA和向量宽度。

此示例示出稀疏矩阵计算的许多重要特性。假定32位的数据类型,并且矩阵和向量两者在高速缓存中都不适配,则计算输出行的第一元素要求从DRAM读取36个字节,但是仅有五条计算指令(三条乘法和两条加法),字节/操作比为7.2:1。

然而,存储器带宽不是对高性能稀疏矩阵计算的唯一挑战。如图20所示,在spMV中对向量的访问是依赖于数据且难以预测的,从而将向量访问的等待时间暴露于应用。如果向量在高速缓存中不适配,则除非甚至当许多线程被停止以等待数据时处理器提供足够的并行性来使DRAM带宽饱和,否则SpMV性能变得对DRAM等待时间和带宽敏感。

由此,用于稀疏矩阵计算的架构必须提供若干要素以便有效。它必须递送高存储器带宽以满足稀疏计算的字节/操作需求。它还必须支持从在高速缓存中可能不适配的大型向量向外的高带宽聚集。最后,虽然执行足够的算术操作/秒以跟上DRAM带宽在其本身以及就其本身而言不是挑战,但是架构必须以高能效方式执行那些操作以及那些操作所需的所有存储器访问以保持处于系统功率预算内。

实现方式

一种实现方式包括设计成用于提供对高稀疏矩阵性能所必需的三个特征的加速器:高存储器带宽、从大型向量向外的高带宽聚集以及高能效计算。如图21中所示,加速器的一种实现方式包括加速器逻辑管芯2105以及一个或多个DRAM管芯的叠层2101-2104在下文中更详细地描述的堆叠的DRAM以低能量/位来提供高存储器带宽。例如,预期堆叠的DRAM以2.5pJ/位实现256-512GB/秒,而预期LPDDR4DIMM仅实现68GB/秒,并且将具有12pJ/位的能量成本。

在加速器叠层底部的加速器逻辑芯片2105针对稀疏矩阵计算的需求来定制,并且能够消耗由DRAM叠层2101-2104提供的带宽,同时仅花费2-4W的功率,能耗与叠层的带宽成比例。保守地说,对于该应用的其余部分,假定了273GB/秒的叠层带宽(WIO3叠层的预期带宽)。基于较高带宽叠层的设计将并入更多并行性以消耗存储器带宽。

图22示出从俯视视角穿过DRAM管芯的叠层2101-2104而定向的加速器逻辑芯片2105的一种实现方式。朝向视图中心的叠层DRAM通道块2205表示将逻辑芯片2105连接至DRAM 2101-2104的硅通孔,而存储器控制器块1210包含生成用于DRAM通道的控制信号的逻辑。虽然在图中示出八个DRAM通道2205,但是在加速器芯片上实现的实际通道数量将取决于所使用的堆叠的DRAM而有所不同。正在开发的叠层DRAM技术中的大多数提供四个或八个通道。

点积引擎(DPE)2220是架构的计算元件。在图22中示出的特定实现方式中,每一组八个DPE与向量高速缓存2215相关联。图23提供DPE的高层级概览,该DPE包含两个缓冲器2305-2306、两个64位乘-加ALU 2310以及控制逻辑2300。在计算期间,芯片控制单元2300使正在被处理的数据块体(chunk)流入缓冲器存储器2305-2306中。一旦每一个缓冲器满了,DPE的控制逻辑就贯穿缓冲器定序,从而计算它们包含的向量的点积,并将结果向外写入到DPE的结果锁存器2310,该结果锁存器2310以菊形链(daisy-chain)与其他DPE的结果锁存器连接以将计算的结果写回到叠层DRAM 2101-2104。

在一种实现方式中,加速器逻辑芯片2405以大约1GHz和0.65V操作以使功耗最小化(但是对于不同应用可修改具体的操作频率和电压)。基于14nm设计研究的分析显示出32-64KB缓冲器在那个电压下满足这一频率规格,但是可能要求强ECC来防止软错误。乘-加单元能以基准时钟速率的一半来操作以满足0.65V供应电压和浅流水线的时序。拥有两个ALU对于每个DPE提供了一个双精度乘-加/周期的吞吐量。

在273GB/秒以及1.066MHz的时钟速率下,DRAM叠层2101-2104对于每个逻辑芯片时钟周期递送256字节的数据。假定阵列索引和值是至少为32位的量,则这转换成每个周期32个稀疏矩阵元素(索引的4个字节+值的4个字节=8字节/元素),从而要求芯片每个周期执行32次乘-加以便能够跟上。(这是对矩阵-向量乘法而言的,并假定向量高速缓存中的高命中率,使得100%的叠层DRAM带宽被用于取出矩阵。)图22中示出的64个DPE提供2-4x(2-4倍)所需计算吞吐量,从而在即便ALU 2310不是100%时间被使用的情况下也允许芯片以峰值叠层DRAM带宽处理数据。

在一种实现方式中,向量高速缓存2215对矩阵-向量乘法中的向量的元素进行高速缓存。这显著地增加了下文所述的矩阵分块方案的效率。在一种实现方式中,每一个向量高速缓存块(block)包含高速缓存的32-64KB,从而在八通道架构中有256-512KB的总容量。

芯片控制单元2201管理计算流,并处置与加速器中的其他叠层以及与系统中的其他插槽的通信。为了减小复杂度和功耗,点积引擎从不从存储器请求数据。相反,芯片控制单元2201管理存储器系统,从而发起将合适的数据块推送到DPE中的每一个DPE的传送。

在一种实现方式中,多叠层加速器中的叠层经由KTI链路2230的网络彼此通信,KTI链路2230的网络使用附图中示出的邻居连接2231来实现。芯片也提供三个附加的KTI链路,这三个附加的KTI链路用于与多插槽系统中的其他(多个)插槽通信。在多叠层加速器中,叠层的封装外KTI链路2230中的仅一个将是活动的。目标为其他叠层上的存储器的KTI事务将通过封装上KTI网络被路由至合适的叠层。

实现稀疏矩阵操作

在本小节中,我们描述在加速器的一种实现方式上实现稀疏矩阵-密集向量和稀疏矩阵-稀疏向量乘法所需的技术和硬件。该设计也扩展至支持矩阵-矩阵乘法、松弛操作和其他重要功能以创建支持所有关键的稀疏矩阵操作的加速器。

虽然稀疏-稀疏和稀疏-密集矩阵-向量乘法执行相同的基本算法(进行矩阵中的每一行与向量的点积),但是当向量相比其为密集而为稀疏时,在该算法如何实现方面具有显著区别,在以下表1中进行概括。

表1

在稀疏矩阵-密集向量乘法中,向量大小是固定的且等于矩阵的列数。由于科学计算中找到的矩阵中的许多矩阵每行平均有大约10个非零元素,因此稀疏矩阵-密集向量中的向量占据与矩阵自身一样多空间的5-10%并非不常见。另一方面,稀疏向量经常是非常短的,包含与矩阵的行类似数量的非零值,这使得稀疏向量在片上存储器中进行高速缓存要容易得多。

在稀疏矩阵-密集向量乘法中,向量中的每一个元素的位置由其索引确定,从而使得聚集对应于在矩阵区域中的非零值的向量元素并且预先计算需要为矩阵将相乘的任何密集向量所聚集的向量元素集是可行的。然而,稀疏向量中的每一个元素的位置是不可预测的,并且取决于该向量中的非零元素的分布。这使得检查稀疏向量和矩阵的非零元素以确定矩阵中的哪些非零对应于向量中的非零值是必要的。

将矩阵中的非零元素的索引与向量比较是有帮助的,因为计算稀疏矩阵-稀疏向量点积所需的指令/操作的数量是不可预测的,并且依赖于矩阵和向量的结构。例如,考虑进行矩阵行与单个非零元素以及向量与许多非零元素的点积。如果行的非零具有比向量中的非零中的任一非零更低的索引,则点积仅要求一次索引比较。如果行的非零具有比向量中的非零中的任一非零更高的索引,则计算点积要求将该行的非零的索引与向量中的每一个索引进行比较。这假定线性搜遍向量,这是常见做法。其他搜索(诸如,二分搜索)在最坏的情况下将较快,但在行和向量中的非零重叠的常见情况下将增加显著的开销。相比之下,执行稀疏矩阵-密集向量乘法所需的操作的数量是固定的且由矩阵中的非零值的数量确定,从而使得预测计算所需的时间量是容易的。

由于这些区别,加速器的一种实现方式使用相同的高级算法来实现稀疏矩阵-密集向量和稀疏矩阵-稀疏向量乘法,而向量如何跨点积引擎分布以及如何计算点积有所区别。由于加速器旨在用于大型稀疏矩阵计算,因此不能够假定矩阵或向量中的任一者将在片上存储器中适配。相反,一种实现方式使用图24中概括的分块方案。

具体地,在此实现方式中,加速器将会将矩阵划分为大小设定为在片上存储器中适配的固定大小的数据块2401-2402,并且将会将块中的行乘以向量以便在继续进行到下一个块之前生成输出向量的块体。此方式提出两个挑战。首先,稀疏矩阵的每一行中非零的数量在各个数据集之间广泛地不同,在所研究的数据集中从低至1个到高达46000个。这使得将一行甚至固定数量的行指派给每一个点积引擎是不切实际的。因此,一种实现方式将固定大小的矩阵数据块体指派给每一个点积引擎,并且处置块体包含多个矩阵行的情况以及单个行跨多个块体被分割的情况。

第二个挑战在于,对于矩阵的每一个块,从叠层DRAM取出整个向量具有浪费大量带宽的可能性(即,取出在块中针对其没有对应非零的向量元素)。这对于稀疏矩阵-密集向量乘法(其中,向量可以稀疏矩阵大小的大部分)尤其是问题。为解决这一问题,一种实现方式为矩阵中的每一个块2401-2402构造取出列表2411-2412,该取出列表列举对应于块中的非零值的向量2410元素集,并且当处理块时仅取出那些元素。虽然取出列表也必须从叠层DRAM取出,但是已确定用于大多数块的取出列表将是块大小的一小部分。诸如运行长度编码之类的技术也可用于减小取出列表的大小。

由此,在加速器上的矩阵-向量乘法将涉及以下操作序列:

1.从DRAM叠层取出矩阵数据块,并跨点积引擎分布该矩阵数据块;

2.基于矩阵数据中的非零元素来生成取出列表;

3.从叠层DRAM取出取出列表中的每一个向量元素,并且将该向量元素分布至点积引擎;

4.计算块中的行与向量的点积,并将结果向外写入到叠层DRAM;以及5.与计算并行地,取出下一个矩阵数据块并进行重复,直到整个矩阵已被处理。

当加速器包含多个叠层时,矩阵的“分区”可被静态地指派给不同叠层,随后可在每一个分区上并行地执行分块算法。该分块和广播方案具有所有存储器参考都源于中央控制单元的优势,这简化了片上网络的设计,因为网络不必在点积引擎与存储器控制器之间路由不可预测的请求和回复。它也通过以下方式节省能量:对于给定块需要的每一个向量元素仅发布一个存储器请求,而不是使各个点积引擎为它们执行它们的计算部分所要求的向量元素发布存储器请求。最终,从经组织的索引列表取出向量元素使得以使堆叠的DRAM中的页命中最大化且由此使带宽使用最大化的方式调度那些取出所要求的存储器请求是容易的。

实现稀疏矩阵-密集向量乘法

在本文中所述的加速器实现方式上实现稀疏矩阵-密集向量乘法的一个挑战是将正从存储器流出的向量元素匹配至每一个点积引擎的缓冲器中的矩阵元素的索引。在一种实现方式中,每个周期向量的256个字节(32-64个元素)到达点积引擎,并且每一个向量元素可对应于点积引擎的矩阵缓冲器中的非零中的任一个非零,因为固定大小的矩阵数据块被取到每一个点积引擎的矩阵缓冲器中。

每个周期执行那么多比较在面积和功率方面都将是过于昂贵的。替代地,一种实现方式利用以下事实:许多稀疏矩阵应用反复地将相同矩阵乘以相同或不同的向量,并且使用图25中示出的格式预先计算每一个点积引擎处理其矩阵块体将需要的取出列表中的元素。在基线CRS格式中,矩阵通过以下各项来描述:索引阵列2502,其定义每一个非零值在它的行内的位置;包含每一个非零值的阵列2503;以及阵列2501,其指示每一行在索引和值阵列中的何处开始。为实现那个目的,一种实现方式添加块描述符阵列2505,该块描述符阵列2505标识每一个点积引擎需要捕捉向量数据的哪些猝发来执行总计算中的该点积引擎的部分。

如图25中所示,每一个块描述符由8个16位值和猝发描述符的列表组成。第一个16位值告诉硬件块描述符中有多少猝发描述符,而其余七个为叠层DRAM数据通道除第一个数据通道之外的所有数据通道标识在猝发描述符列表中的起点。这些值的数量将取决于堆叠的DRAM提供的数据通道的数量而变化。每一个猝发描述符包含24位猝发计数和“所需字”位向量,24位猝发计数告诉硬件该硬件需要关注的数据的哪些猝发,“所需字”位向量标识包含点处理引擎需要的值的猝发内的字。

一种实现方式中所包括的其他数据结构是矩阵缓冲器索引(MBI)阵列2504,矩阵中的每一个非零有一个MBI。每一个MBI给出对应于非零的密集向量元素将被存储在相关点积引擎的向量值缓冲器(参见例如图27)中的位置。当执行稀疏矩阵-密集向量乘法时,矩阵缓冲器索引而不是原始的矩阵索引被加载到点积引擎的矩阵索引缓冲器2504中,并充当在计算点积时用于查找对应向量值的地址。

图26示出这对于在单个点积引擎的缓冲器内适配的两行式矩阵,在仅具有一个堆叠的DRAM数据通道和四字数据猝发的系统上是如何工作的。在该图的左边示出原始的CRS表示,其包括行开始值2601、矩阵索引2602和矩阵值2603。由于这两行在列{2,5,6}和{2,4,5}中具有非零元素,因此需要向量的元素2、4、5和6来计算点积。块描述符反映了这一点,指示了需要第一个四字猝发的字2(向量的元素2)以及第二个四字猝发的字0、字1和字2(向量的元素4-6)。由于向量的元素2是点积引擎需要的向量的第一个字,因此它去往向量值缓冲器中的位置0。向量的元素4将去往位置1,以此类推。

矩阵缓冲器索引阵列数据2604保存硬件将找到对应于矩阵中的非零的值的向量值缓冲器内的位置。由于矩阵索引阵列中的第一个条目具有值“2”,因此矩阵缓冲器索引中的第一个条目获得值“0”,这对应于向量的元素2将被存储在的向量值缓冲器中的位置。类似地,无论“4”出现在矩阵索引阵列中的何处,“1”将出现在矩阵缓冲器索引中,矩阵索引中的每一个“5”将在矩阵缓冲器索引中具有对应的“2”,矩阵索引中的每一个“6”将对应于矩阵缓冲器索引中的“3”。

本发明的一种实现方式当矩阵被加载到加速器上时执行支持从密集向量向外快速聚集所要求的预先计算,从而利用多叠层加速器的总带宽远大于用于将数据从CPU传送至加速器的KTI链路的带宽这一事实。取决于相同矩阵索引的多个副本多频繁地出现在被映射至点积引擎上的矩阵的块体内,该预先计算的信息将保存矩阵所要求的存储器量增加高达75%。然而,由于当执行矩阵-向量乘法时,16位矩阵缓冲器索引阵列而不是矩阵索引阵列被取出,因此被取出叠层DRAM的数据量将经常小于原始CRS表示中的数据量,对于使用64位索引的矩阵尤其如此。

图27示出使用该格式的点积引擎中的硬件的一种实现方式。为了执行矩阵-向量乘法,构成块的矩阵的块体被复制到矩阵索引缓冲器2703和矩阵值缓冲器2705中(复制矩阵缓冲器索引而不是原始的矩阵索引),并且相关的块描述符被复制到块描述符缓冲器2702中。随后,使用取出列表以从密集向量加载所要求的元素,并将这些元素广播到点积引擎。每一个点积引擎对在每一个数据通道上经过的向量数据的猝发数量计数。当在给定数据通道上的计数匹配猝发描述符中所指定的值时,匹配逻辑2720捕捉所指定的字,并将这些字存储在其向量值缓冲器2704中。

图28示出进行此捕捉的匹配逻辑2720单元的内容。当计数器匹配猝发描述符中的值时,锁存器2805捕捉数据通道的线上的值。移位器2806从猝发2801向外提取所要求的字2802,并将这些字路由至大小匹配向量值缓冲器中的行的线缓冲器2807中的右边位置。当猝发计数2801等于内部计数器2804时,加载信号被生成。当线缓冲器填满时,它(通过多路复用器2808)被存储在向量值缓冲器2804中。按此方式将字从多个猝发组装到多个线中减少了向量值缓冲器需要支持的写入/周期的数量,从而减小了向量值缓冲器的大小。

一旦向量的所有所要求元素已被捕捉在向量值缓冲器中,点积引擎就使用ALU 3010来计算所要求的(多个)点积。控制逻辑3001顺序地逐步通过矩阵索引缓冲器3003和矩阵值缓冲器3004,每个周期通过一个元件。矩阵索引缓冲器3003的输出被用作在下一周期上用于向量值缓冲器3004的读取地址,而矩阵值缓冲器3005的输出被锁存,使得矩阵值缓冲器3005的该输出与来自向量值缓冲器3004的对应值同时到达ALU 3010。例如,使用来自图26的矩阵,在点积计算的第一周期上,硬件将从矩阵索引缓冲器3003读出矩阵缓冲器索引“0”,并从矩阵值缓冲器3005读取值“13”。在第二周期上,来自矩阵索引缓冲器3003的值“0”充当用于向量值缓冲器3004的地址,从而取出向量元素“2”的值,随后在循环3上,该值乘以“13”。

行开始位向量2901中的值告诉硬件矩阵的行何时结束以及新的行何时开始。当硬件到达行的结尾时,该硬件将该行的所累加的点积放置在其输出锁存器3011中,并且开始为下一行累加点积。每一个点积引擎的点积锁存器以菊形链连接,该菊形链聚集输出向量以用于写回。

实现稀疏矩阵-稀疏向量乘法

在稀疏矩阵-稀疏向量乘法中,向量趋于占据比稀疏矩阵-密集向量乘法中少得多的存储器,但是由于向量是稀疏的,因此直接取出对应于给定索引的向量元素是不太可能的。相反,必须搜索向量,从而使仅将每一个点积引擎需要的元素路由至该点积引擎是不切实际的,并使计算指派给每一个点积引擎的矩阵数据的点积所要求的时间量不可预测。由于这一点,用于稀疏矩阵-稀疏向量乘法的取出列表仅指定矩阵块中最低和最高非零元素的索引,并且那些点之间的向量的所有非零元素都必须被广播至点积引擎。

图29示出用于支持稀疏矩阵-稀疏向量乘法的点积引擎设计的细节。为了处理矩阵数据块,点积引擎的矩阵的块体的索引(不是稀疏-密集乘法中使用的矩阵缓冲器索引)和值被写入到矩阵索引和值缓冲器中,就如同处理块所要求的向量区域的索引和值。随后,点积引擎控制逻辑2940穿过索引缓冲器2902-2903定序,索引缓冲器2902-2903将四个索引的块输出到4x4比较器2920。4x4比较器2920将来自向量2902的索引中的每一个索引与来自矩阵2903的索引中的每一个索引进行比较,并将任何匹配的缓冲器地址输出到匹配的索引队列2930。匹配的索引队列2930的输出驱动矩阵值缓冲器2905和向量值缓冲器2904的读取地址输入,矩阵值缓冲器2905和向量值缓冲器2904将对应于匹配的值输出到乘-加ALU 2910中。只要匹配的索引队列2930具有空的空间,该硬件就允许点积引擎每个周期消耗至少四个以及多达八个索引,从而减少当索引匹配稀少时处理数据块所要求的时间量。

如同稀疏矩阵-密集向量点积引擎那样,行开始的位向量2901标识开始矩阵的新的行的矩阵缓冲器的矩阵缓冲器2992-2903中的条目。当遇到此类条目时,控制逻辑2940重置到向量索引缓冲器ATA 3202的开头,并且从它们的最低值开始检查向量索引,从而将这些向量索引与矩阵索引缓冲器2903的输出进行比较。类似地,如果达到向量的结尾,则控制逻辑2940进展到矩阵索引缓冲器2903中的下一行的开头,并且重置到向量索引缓冲器2902的开头。“完成”输出通知芯片控制单元点积引擎何时已完成处理数据块或向量区域并准备好进展到下一者。为了简化加速器的一种实现方式,控制逻辑2940将会直到所有点积引擎已完成处理才进展到下一块/区域。

在许多情况下,向量缓冲器将足够大以保存处理块所要求的所有稀疏向量。在一种实现方式中,取决于使用了32位值还是64位值,提供用于1024或2048个向量元素的缓冲器空间。

当向量的所要求元素不在向量缓冲器中适配时,可使用多轮次方式。控制逻辑2940将会将向量的完整缓冲器广播到每一个点积引擎,这将开始迭代遍该点积引擎的矩阵缓冲器中的各行。当点积引擎在到达行的结尾之前到达向量缓冲器的结尾时,该点积引擎将对当前行位置位向量2911中的位进行置位以指示当下一向量区域到达时该点积引擎应当在何处恢复对行的处理,该点积引擎将保存它已经在对应于行开始的矩阵值缓冲器2905的位置中累加的部分点积,除非该行开始具有比目前已处理的向量索引中的任一向量索引更高的索引值,并且该点积引擎将进展到下一行。当矩阵缓冲器中的所有行都已处理之后,该点积引擎将断言其完成信号以请求下一向量区域,并且将重复该过程,直到整个向量已被读取。

图30示出使用特定值的示例。在计算开始3001处,矩阵的四元素块体已被写入到矩阵缓冲器2903、2905中,并且向量的四元素区域已被写入到向量缓冲器2902、2904中。行开始2901和当前行位置位向量2911两者都具有值“1010”,这指示点积引擎的矩阵的块体包含两行,其中的一行开始于矩阵缓冲器中的第一个元素处,并且其中的一行开始于第三个元素处。

当第一区域被处理时,块体中的第一行看见索引3处的索引匹配,计算矩阵和向量缓冲器的对应元素的积(4×1=4),并且将那个值写入到对应于行开始的矩阵值缓冲器2905的位置中。第二行看见在索引1处的一个索引匹配,计算向量和矩阵的对应元素的积,并且在对应于该第二行开始的位置处将结果(6)写入到矩阵值缓冲器2905中。当前行位置位向量的状态变化为“0101”,这指示每一行的第一个元素已处理,并且计算应当以第二个元素来恢复。随后,点积引擎断言其完成线,以便用信号通知该点积引擎为向量的另一区域做好准备。

当点积引擎处理第二向量区域时,该点积引擎看见行1在索引4处具有索引匹配,计算矩阵和向量的对应值的积(5×2=10),将那个值加到在第一向量区域已处理之后被保存的部分点积,并且输出结果(14)。如图中所示,第二行看见索引7处的匹配,并且输出结果38。以此方式保存部分点积和计算的状态避免了处理也许不太可能匹配向量的后续区域中的索引的矩阵元素的冗余工作(因为向量以索引按升序排序),而不要求用于部分积的大量额外存储。

统一点积引擎设计

图31示出上文所述的稀疏-密集和稀疏-稀疏点积引擎如何组合来获得可处置这两种类型计算的点积引擎。考虑到这两种设计之间的类似性,仅要求的改变是实例化以下两者:稀疏-密集点积引擎的匹配逻辑3111;以及稀疏-稀疏点积引擎的比较器3120和匹配的索引队列3130,以及多路复用器的集合3150和多路复用器3151,多路复用器的集合3150确定哪些模块驱动缓冲器2904-2905的读取地址和写入数据输入,多路复用器3151选择矩阵值缓冲器的输出还是矩阵值缓冲器的经锁存的输出被发送到乘-加ALU 2910。在一种实现方式中,这些多路复用器由控制单元2940中的配置位控制,该配置位在矩阵-向量乘法的开始时被置位,并且贯穿整个操作保持在同一配置中。

指令集

指令可包括一个或多个指令格式。给定的指令格式可定义各种字段(例如,位的数量、位的位置)以指定将要执行的操作(例如,操作码)以及将对其执行该操作的(多个)操作数和/或(多个)其他字段(例如,掩码),等等。通过指令模板(或子格式)的定义来进一步分解一些指令格式。例如,可将给定指令格式的指令模板定义为具有指令格式字段(所包括的字段通常按照相同顺序,但是至少一些字段具有不同的位的位置,因为更少的字段被包括)的不同子集,和/或定义为具有以不同方式进行解释的给定字段。由此,ISA的每一条指令使用给定的指令格式(并且如果经定义,则按照该指令格式的指令模板中的给定指令模板)来表达,并包括用于指定操作和操作数的字段。例如,示例性ADD(加法)指令具有特定的操作码和指令格式(包括用于指定该操作码的操作码字段和用于选择操作数(源1/目的地以及源2)的操作数字段),并且该ADD指令在指令流中出现将使得在选择特定操作数的操作数字段中具有特定的内容。已经推出和/或发布了被称为高级向量扩展(AVX)(AVX1和AVX2)和利用向量扩展(VEX)编码方案的SIMD扩展集(参见例如2014年9月的64和IA-32架构软件开发者手册;以及参见2014年10月的高级向量扩展编程参考)。

示例性寄存器架构

图32是根据一些实施例的寄存器架构3200的框图。在所示出的实施例中,有32个512位宽的向量寄存器3210;这些寄存器被引用为zmm0到zmm31。较低的16zmm寄存器的较低阶256个位覆盖在寄存器ymm0-16上。较低的16zmm寄存器的较低阶128个位(ymm寄存器的较低阶128个位)覆盖在寄存器xmm0-15上。

写掩码寄存器3215-在所示的实施例中,存在8个写掩码寄存器(k0至k7),每一写掩码寄存器的大小是64位。在替代实施例中,写掩码寄存器3215的大小是16位。如先前所描述,在本发明的一个实施例中,向量掩码寄存器k0无法用作写掩码;当正常指示k0的编码用作写掩码时,它选择硬连线的写掩码0xFFFF,从而有效地停用该指令的写掩码操作。

通用寄存器3225——在所示实施例中,有十六个64位通用寄存器,这些寄存器与现有的x86寻址模式一起使用来对存储器操作数寻址。这些寄存器通过名称RAX、RBX、RCX、RDX、RBP、RSI、RDI、RSP以及R8到R15来引用。

标量浮点栈寄存器组(x87栈)3245,在其上面重叠了MMX紧缩整数平坦寄存器组3250——在所示出的实施例中,x87栈是用于使用x87指令集扩展来对32/64/80位浮点数据执行标量浮点运算的八元素栈;而使用MMX寄存器来对64位紧缩整数数据执行操作,以及为在MMX和XMM寄存器之间执行的一些操作保存操作数。

本发明的替代实施例可以使用较宽的或较窄的寄存器。另外,本发明的替代实施例可以使用更多、更少或不同的寄存器组和寄存器。

示例性核架构、处理器和计算机架构

处理器核可以用出于不同目的的不同方式在不同的处理器中实现。例如,这样的核的实现可以包括:1)旨在用于通用计算的通用有序核;2)预期用于通用计算的高性能通用无序核;3)旨在主要用于图形和/或科学(吞吐量)计算的专用核。不同处理器的实现可包括:1)包括旨在用于通用计算的一个或多个通用有序核和/或旨在用于通用计算的一个或多个通用无序核的CPU;以及2)包括旨在主要用于图形和/或科学(吞吐量)的一个或多个专用核的协处理器。这样的不同处理器导致不同的计算机系统架构,其可包括:1)在与CPU分开的芯片上的协处理器;2)在与CPU相同的封装中但分开的管芯上的协处理器;3)与CPU在相同管芯上的协处理器(在该情况下,这样的协处理器有时被称为诸如集成图形和/或科学(吞吐量)逻辑等专用逻辑,或被称为专用核);以及4)可以将所描述的CPU(有时被称为应用核或应用处理器)、以上描述的协处理器和附加功能包括在同一管芯上的片上系统。接着描述示例性核架构,随后描述示例性处理器和计算机架构。

示例性核架构

有序和无序核框图

图33A是示出根据本发明的各实施例的示例性有序流水线和示例性的寄存器重命名的乱序发布/执行流水线的框图。图33B是示出根据本发明的各实施例的要包括在处理器中的有序架构核的示例性实施例和示例性的寄存器重命名的乱序发布/执行架构核的框图。图33A-图33B中的实线框示出了有序流水线和乱序核,而可任选增加的虚线框示出了寄存器重命名的、乱序发布/执行流水线和核。考虑到有序方面是乱序方面的子集,将描述乱序方面。

在图33A中,处理器流水线3300包括取出级3302、长度解码级3304、解码级3306、分配级3308、重命名级3310、调度(也被称为分派或发布)级3312、寄存器读取/存储器读取级3314、执行级3316、写回/存储器写入级3318、异常处理级3322以及提交级3324。

图33B示出处理器核3390,包括耦合至执行引擎单元3350的前端单元3330,该前端单元和执行引擎单元两者均耦合至存储器单元3370。核3390可以是精简指令集计算(RISC)核、复杂指令集计算(CISC)核、超长指令字(VLIW)核或混合或替代核类型。作为又一选项,核3390可以是专用核,诸如例如,网络或通信核、压缩引擎、协处理器核、通用计算图形处理单元(GPGPU)核、图形核,等等。

前端单元3330包括耦合到指令高速缓存单元3334的分支预测单元3332,该指令高速缓存单元耦合到指令转换后备缓冲器(TLB)3336,该指令转换后备缓冲器耦合到指令取出单元3338,指令取出单元耦合到解码单元3340。解码单元3340(或解码器)可解码指令,并生成从原始指令解码出的、或以其他方式反映原始指令的、或从原始指令导出的一个或多个微操作、微代码进入点、微指令、其他指令、或其他控制信号作为输出。解码单元3340可使用各种不同的机制来实现。合适机制的示例包括但不限于,查找表、硬件实现、可编程逻辑阵列(PLA)、微代码只读存储器(ROM)等。在一些实施例中,核3390包括存储用于某些宏指令的微代码的微代码ROM或其他介质(例如,在解码单元3340中,或以其他方式在前端单元3330内)。解码单元3340耦合至执行引擎单元3350中的重命名/分配器单元3352。

执行引擎单元3350包括耦合到引退单元3354和一个或多个调度器单元3356的集合的重命名/分配器单元3352。(多个)调度器单元3356表示任意数量的不同调度器,包括预留站、中央指令窗口等。(多个)调度器单元3356耦合到(多个)物理寄存器组单元3358。(多个)物理寄存器组单元3358中的每一个表示一个或多个物理寄存器组,其中不同的物理寄存器组存储一个或多个不同的数据类型,诸如,标量整数、标量浮点、紧缩整数、紧缩浮点、向量整数、向量浮点,状态(例如,作为要执行的下一条指令的地址的指令指针)等等。在一个实施例汇总,(多个)物理寄存器组单元3358包括向量寄存器单元、写掩码寄存器单元和标量寄存器单元。这些寄存器单元可以提供架构向量寄存器、向量掩码寄存器、和通用寄存器。(多个)物理寄存器组单元3358被引退单元3354所覆盖,以示出可实现寄存器重命名和乱序执行的多种方式(例如,使用(多个)重排序缓冲器和(多个)引退寄存器组、使用(多个)未来文件(future file)、(多个)历史缓冲器、(多个)引退寄存器组、使用寄存器映射和寄存器池等等)。引退单元3354和(多个)物理寄存器组单元3358耦合至(多个)执行群集3360。(多个)执行群集3360包括一个或多个执行单元3362的集合以及一个或多个存储器访问单元3364的集合。执行单元3362可执行各种操作(包括:移位、加法、减法、乘法)并可对各种数据类型(诸如、标量浮点、紧缩整数、紧缩浮点、向量整数、向量浮点)执行。尽管一些实施例可以包括专用于特定功能或功能集合的多个执行单元,但其他实施例可包括全部执行所有功能的仅一个执行单元或多个执行单元。(多个)调度器单元3356、(多个)物理寄存器组单元3358和(多个)执行群集3360被示为可能有多个,因为某些实施例为某些类型的数据/操作创建分开的流水线(例如,标量整型流水线、标量浮点/紧缩整型/紧缩浮点/向量整型/向量浮点流水线,和/或各自具有其自己的调度器单元、(多个)物理寄存器组单元和/或执行群集的存储器访问流水线——以及在分开的存储器访问流水线的情况下,实现其中仅该流水线的执行群集具有(多个)存储器访问单元3364的某些实施例)。还应当理解,在使用分开的流水线的情况下,这些流水线中的一个或多个可以为乱序发布/执行,并且其余流水线可以为有序发布/执行。

存储器访问单元3364的集合耦合到存储器单元3370,该存储器单元包括耦合到数据高速缓存单元3374的数据TLB单元3372,其中数据高速缓存单元耦合到第二级(L2)高速缓存单元3376。在一个示例性实施例中,存储器访问单元3364可包括加载单元、存储地址单元和存储数据单元,其中的每一个均耦合至存储器单元3370中的数据TLB单元3372。指令高速缓存单元3334还耦合到存储器单元3370中的第二级(L2)高速缓存单元3376。L2高速缓存单元3376耦合至一个或多个其他级别的高速缓存,并最终耦合至主存储器。

作为示例,示例性的寄存器重命名乱序发布/执行核架构可以如下所述地实现流水线3300:1)指令取出3338执行取出和长度解码级3302和3304;2)解码单元3340执行解码级3306;3)重命名/分配器单元3352执行分配级3308和重命名级3310;4)(多个)调度器单元3356执行调度级3312;5)(多个)物理寄存器组单元3358和存储器单元3370执行寄存器读取/存储器读取级3314;执行群集3360执行执行级3316;6)存储器单元3370和(多个)物理寄存器组单元3358执行写回/存储器写入级3318;7)各单元可牵涉到异常处理级3322;以及8)引退单元3354和(多个)物理寄存器组单元3358执行提交级3324。

核3390可支持一个或多个指令集(例如,x86指令集(具有与较新版本一起添加的一些扩展);加利福尼亚州桑尼维尔市的MIPS技术公司的MIPS指令集;加利福尼州桑尼维尔市的ARM控股的ARM指令集(具有诸如NEON等可任选附加扩展)),其中包括本文中描述的各指令。在一个实施例中,核3390包括用于支持紧缩数据指令集扩展(例如,AVX1、AVX2)的逻辑,由此允许由许多多媒体应用使用的操作利用紧缩数据来执行。

应当理解,核可支持多线程化(执行两个或更多个并行的操作或线程的集合),并且可以按各种方式来完成该多线程化,此各种方式包括时分多线程化、同时多线程化(其中单个物理核为物理核正在同时多线程化的各线程中的每一个线程提供逻辑核)、或其组合(例如,时分取出和解码以及此后诸如以超线程化技术的实现同时多线程化)。

尽管在乱序执行的上下文中描述了寄存器重命名,但应当理解,可以在有序架构中使用寄存器重命名。尽管所示出的处理器的实施例还包括分开的指令和数据高速缓存单元3334/3374以及共享L2高速缓存单元3376,但替代实施例可以具有用于指令和数据两者的单个内部高速缓存,诸如例如,第一级(L1)内部高速缓存或多个级别的内部高速缓存。在一些实施例中,该系统可包括内部高速缓存和在核和/或处理器外部的外部高速缓存的组合。或者,所有高速缓存都可以在核和/或处理器的外部。

具体的示例性有序核架构

图34A-图34B示出了更具体的示例性有序核架构的框图,该核将是芯片中的若干逻辑块(包括相同类型和/或不同类型的其他核)之一。根据应用,这些逻辑块通过高带宽的互连网络(例如,环形网络)与一些固定功能逻辑、存储器I/O接口和其他必要的I/O逻辑通信。

图34A是根据本发明的各实施例的单个处理器核以及它与管芯上互连网络3402的连接及其第二级(L2)高速缓存的本地子集3404的框图。在一个实施例中,指令解码器3400支持具有紧缩数据指令集扩展的x86指令集。L1高速缓存3406允许对进入标量和向量单元中的高速缓存存储器的低等待时间访问。尽管在一个实施例中(为了简化设计),标量单元3408和向量单元3410使用分开的寄存器集合(分别为标量寄存器3412和向量寄存器3414),并且在这些寄存器之间转移的数据被写入到存储器并随后从第一级(L1)高速缓存3406读回,但是本发明的替代实施例可以使用不同的方法(例如,使用单个寄存器集合或包括允许数据在这两个寄存器组之间传输而无需被写入和读回的通信路径)。

L2高速缓存的本地子集3404是全局L2高速缓存的一部分,该全局L2高速缓存被划分成多个分开的本地子集,即每个处理器核一个本地子集。每个处理器核具有到其自己的L2高速缓存的本地子集3404的直接访问路径。被处理器核读出的数据被存储在其L2高速缓存子集3404中,并且可以与其他处理器核访问其自己的本地L2高速缓存子集并行地被快速访问。被处理器核写入的数据被存储在其自己的L2高速缓存子集3404中,并在必要的情况下从其他子集转储清除。环形网络确保共享数据的一致性。环形网络是双向的,以允许诸如处理器核、L2高速缓存和其他逻辑块之类的代理在芯片内彼此通信。每个环形数据路径为每个方向1012位宽。

图34B是根据本发明的各实施例的图34A中的处理器核的一部分的展开图。图34B包括L1高速缓存3404的L1数据高速缓存3406A部分,以及关于向量单元3410和向量寄存器3414的更多细节。具体地说,向量单元3410是16宽向量处理单元(VPU)(见16宽ALU 3428),该单元执行整数、单精度浮点以及双精度浮点指令中的一个或多个。该VPU通过混合单元3420支持对寄存器输入的混合、通过数值转换单元3422A-B支持数值转换、并通过复制单元3424支持对存储器输入的复制。写掩码寄存器3426允许预测所得的向量写入。

图35是根据本发明的实施例的可具有多于一个核、可具有集成的存储器控制器、并且可具有集成图形的处理器3500的框图。图35中的实线框示出具有单个核3502A、系统代理3510、一个或多个总线控制器单元3516的集合的处理器3500,而虚线框的可任选附加示出具有多个核3502A-N、系统代理单元3510中的一个或多个集成存储器控制器单元3514的集合以及专用逻辑3508的替代处理器3500。

因此,处理器3500的不同实现可包括:1)CPU,其中专用逻辑3508是集成图形和/或科学(吞吐量)逻辑(其可包括一个或多个核),并且核3502A-N是一个或多个通用核(例如,通用的有序核、通用的乱序核、这两者的组合);2)协处理器,其中核3502A-N是旨在主要用于图形和/或科学(吞吐量)的大量专用核;以及3)协处理器,其中核3502A-N是大量通用有序核。因此,处理器3500可以是通用处理器、协处理器或专用处理器,诸如例如,网络或通信处理器、压缩引擎、图形处理器、GPGPU(通用图形处理单元)、高吞吐量的集成众核(MIC)协处理器(包括30个或更多核)、或嵌入式处理器等。该处理器可以被实现在一个或多个芯片上。处理器3500可以是一个或多个基板的一部分,和/或使用多种工艺技术(诸如,BiCMOS、CMOS或NMOS)中的任意技术被实现在一个或多个基板上。

存储器层次结构包括核内的一个或多个高速缓存级、一个或多个共享高速缓存单元3506的集合、以及耦合至集成存储器控制器单元3514的集合的外部存储器(未示出)。共享高速缓存单元3506的集合可包括一个或多个中级高速缓存,诸如,第二级(L2)、第三级(L3)、第四级(L4)或其他级别的高速缓存、末级高速缓存(LLC)和/或以上各项的组合。尽管在一个实施例中,基于环的互连单元3512将专用逻辑3508(例如,集成图形逻辑)、共享高速缓存单元3506的集合以及系统代理单元3510/(多个)集成存储器控制器单元3514互连,但替代实施例可使用任何数量的公知技术来将这些单元互连。在一个实施例中,可以维护一个或多个高速缓存单元3506和核3502-A-N之间的一致性(coherency)。

在一些实施例中,核3502A-N中的一个或多个能够实现多线程。系统代理3510包括协调和操作核3502A-N的那些组件。系统代理单元3510可包括例如功率控制单元(PCU)和显示单元。PCU可以是对核3502A-N以及集成图形逻辑3508的功率状态进行调节所需的逻辑和组件,或可包括这些逻辑和组件。显示单元用于驱动一个或多个外部连接的显示器。

核3502A-N在架构指令集方面可以是同构的或异构的;即,这些核3502A-N中的两个或更多个核可能能够执行相同的指令集,而其他核可能能够执行该指令集的仅仅子集或不同的指令集。

示例性计算机架构

图36-图39是示例性计算机架构的框图。本领域已知的对膝上型设备、台式机、手持PC、个人数字助理、工程工作站、服务器、网络设备、网络集线器、交换机、嵌入式处理器、数字信号处理器(DSP)、图形设备、视频游戏设备、机顶盒、微控制器、蜂窝电话、便携式媒体播放器、手持设备以及各种其他电子设备的其他系统设计和配置也是合适的。一般地,能够包含本文中所公开的处理器和/或其他执行逻辑的多个系统和电子设备一般都是合适的。

现在参见图36,所示为根据本发明的一个实施例的系统3600的框图。系统3600可以包括一个或多个处理器3610、3615,这些处理器耦合到控制器中枢3620。在一个实施例中,控制器中枢3620包括图形存储器控制器中枢(GMCH)3690和输入/输出中枢(IOH)3650(其可以在分开的芯片上);GMCH 3690包括存储器和图形控制器,存储器3640和协处理器3645耦合到该存储器和图形控制器;IOH 3650将输入/输出(I/O)设备3660耦合到GMCH3690。或者,存储器和图形控制器中的一个或两者可以被集成在处理器内(如本文中所描述的),存储器3640和协处理器3645直接耦合到处理器3610以及控制器中枢3620,控制器中枢3620与IOH 3650处于单个芯片中。

附加的处理器3615的可任选性在图36中通过虚线来表示。每一处理器3610、3615可包括本文中描述的处理核中的一个或多个,并且可以是处理器3500的某一版本。

存储器3640可以是例如动态随机存取存储器(DRAM)、相变存储器(PCM)或这两者的组合。对于至少一个实施例,控制器中枢3620经由诸如前端总线(FSB)之类的多分支总线、诸如快速通道互连(QPI)之类的点对点接口、或者类似的连接3695与(多个)处理器3610、3615进行通信。

在一个实施例中,协处理器3645是专用处理器,诸如例如高吞吐量MIC处理器、网络或通信处理器、压缩引擎、图形处理器、GPGPU、或嵌入式处理器等等。在一个实施例中,控制器中枢3620可以包括集成图形加速器。

在物理资源3610、3615之间可以存在包括架构、微架构、热、和功耗特征等的一系列品质度量方面的各种差异。

在一个实施例中,处理器3610执行控制一般类型的数据处理操作的指令。协处理器指令可嵌入在这些指令中。处理器3610将这些协处理器指令识别为应当由附连的协处理器3645执行的类型。因此,处理器3610在协处理器总线或者其他互连上将这些协处理器指令(或者表示协处理器指令的控制信号)发布到协处理器3645。(多个)协处理器3645接受并执行所接收的协处理器指令。

现在参考图37,所示为根据本发明的实施例的更具体的第一示例性系统3700的框图。如图38所示,多处理器系统3700是点对点互连系统,且包括经由点对点互连3750耦合的第一处理器3770和第二处理器3780。处理器3770和3780中的每一个都可以是处理器3500的某一版本。在本发明的一个实施例中,处理器3770和3780分别是处理器3610和3615,而协处理器3738是协处理器3645。在另一实施例中,处理器3770和3780分别是处理器3610和协处理器3645。

处理器3770和3780被示为分别包括集成存储器控制器(IMC)单元3772和3782。处理器3770还包括作为其总线控制器单元的一部分的点对点(P-P)接口3776和3778;类似地,第二处理器3780包括P-P接口3786和3788。处理器3770、3780可以经由使用点对点(P-P)接口电路3778、3788的P-P接口3750来交换信息。如图37所示,IMC 3772和3782将处理器耦合到相应的存储器,即存储器3732和存储器3734,这些存储器可以是本地附连到相应处理器的主存储器的部分。

处理器3770、3780可各自经由使用点对点接口电路3776、3794、3786、3798的各个P-P接口3752、3754与芯片组3790交换信息。芯片组3790可以可任选地经由高性能接口3792与协处理器3738交换信息。在一个实施例中,协处理器3738是专用处理器,诸如例如,高吞吐量MIC处理器、网络或通信处理器、压缩引擎、图形处理器、GPGPU、嵌入式处理器,等等。

共享高速缓存(未示出)可被包括在任一处理器中,或在两个处理器的外部但经由P-P互连与这些处理器连接,从而如果处理器被置于低功率模式,则任一个或这两个处理器的本地高速缓存信息可被存储在该共享的高速缓存中。

芯片组3790可以经由接口3796耦合至第一总线3716。在一个实施例中,第一总线3716可以是外围组件互连(PCI)总线或诸如PCI高速总线或另一第三代I/O互连总线之类的总线,但是本发明的范围不限于此。

如图37所示,各种I/O设备3714可连同总线桥3718一起耦合到第一总线3716,总线桥3718将第一总线3716耦合到第二总线3720。在一个实施例中,诸如协处理器、高吞吐量MIC处理器、GPGPU的处理器、加速器(诸如例如,图形加速器或数字信号处理(DSP)单元)、现场可编程门阵列或任何其它处理器的一个或多个附加处理器3715耦合到第一总线3716。在一个实施例中,第二总线3720可以是低引脚数(LPC)总线。各种设备可耦合到第二总线3720,这些设备包括例如键盘和/或鼠标3722、通信设备3727以及存储单元3728,该存储单元3728诸如在一个实施例中的可包括指令/代码和数据3730的盘驱动器或者其他大容量存储设备。此外,音频I/O 3724可以被耦合至第二总线3720。注意,其他架构是可能的。例如,代替图37的点对点架构,系统可以实现多分支总线或其它这类架构。

现在参考图38,所示为根据本发明的实施例的更具体的第二示例性系统3800的框图。图37和图38中的相同部件用相同附图标记表示,并从图38中省去了图37中的某些方面,以避免使图38的其它方面变得模糊。

图38示出处理器3770、3780可分别包括集成存储器和I/O控制逻辑(“CL”)3772和3782。因此,CL 3772、3782包括集成存储器控制器单元并包括I/O控制逻辑。图38示出不仅存储器3732、3734耦合至CL 3772、3782,而且I/O设备3814也耦合至控制逻辑3772、3782。传统I/O设备3815被耦合至芯片组3790。

现在参照图39,所示出的是根据本发明实施例的SoC 3900的框图。在图35中,相似的部件具有同样的附图标记。另外,虚线框是更先进的SoC的可任选特征。在图39中,(多个)互连单元3902被耦合至:应用处理器3910,该应用处理器包括一个或多个核3502A-N的集合和(多个)共享高速缓存单元3506,一个或多个核3502A-N的集合包括高速缓存单元3504A-N;系统代理单元3510;(多个)总线控制器单元3516;(多个)集成存储器控制器单元3514;一组或一个或多个协处理器3920,其可包括集成图形逻辑、图像处理器、音频处理器和视频处理器;静态随机存取存储器(SRAM)单元3930;直接存储器存取(DMA)单元3932;以及用于耦合至一个或多个外部显示器的显示单元3940。在一个实施例中,(多个)协处理器3920包括专用处理器,诸如例如,网络或通信处理器、压缩引擎、GPGPU、高吞吐量MIC处理器、嵌入式处理器,等等。

本文公开的机制的各实施例可以被实现在硬件、软件、固件或这些实现方法的组合中。本发明的实施例可实现为在可编程系统上执行的计算机程序或程序代码,该可编程系统包括至少一个处理器、存储系统(包括易失性和非易失性存储器和/或存储元件)、至少一个输入设备以及至少一个输出设备。

可将程序代码(诸如,图38中示出的代码3830)应用于输入指令,以执行本文描述的各功能并生成输出信息。可以按已知方式将输出信息应用于一个或多个输出设备。为了本申请的目的,处理系统包括具有诸如例如数字信号处理器(DSP)、微控制器、专用集成电路(ASIC)或微处理器之类的处理器的任何系统。

程序代码可以用高级程序化语言或面向对象的编程语言来实现,以便与处理系统通信。在需要时,也可用汇编语言或机器语言来实现程序代码。事实上,本文中描述的机制不限于任何特定编程语言的范围。在任一情形下,该语言可以是编译语言或解释语言。

至少一个实施例的一个或多个方面可以由存储在机器可读介质上的表示性指令来实现,指令表示处理器中的各种逻辑,指令在被机器读取时使得该机器制造用于执行本文所述的技术的逻辑。被称为“IP核”的这些表示可以被存储在有形的机器可读介质上,并被提供给多个客户或生产设施以加载到实际制造该逻辑或处理器的制造机器中。

这样的机器可读存储介质可以包括但不限于通过机器或设备制造或形成的物品的非瞬态的有形安排,其包括存储介质,诸如,硬盘;任何其它类型的盘,包括软盘、光盘、紧致盘只读存储器(CD-ROM)、紧致盘可重写(CD-RW)以及磁光盘;半导体器件,诸如,只读存储器(ROM)、诸如动态随机存取存储器(DRAM)和静态随机存取存储器(SRAM)之类的随机存取存储器(RAM)、可擦除可编程只读存储器(EPROM)、闪存、电可擦除可编程只读存储器(EEPROM);相变存储器(PCM);磁卡或光卡;或适于存储电子指令的任何其它类型的介质。

因此,本发明的各实施例还包括非瞬态的有形机器可读介质,该介质包含指令或包含设计数据(诸如,硬件描述语言(HDL),它定义本文中描述的结构、电路、装置、处理器和/或系统特征)。此类实施例也可称为程序产品。

仿真(包括二进制变换、代码变形等)

在一些情况下,指令转换器可用来将指令从源指令集转换至目标指令集。例如,指令转换器可以变换(例如使用静态二进制变换、包括动态编译的动态二进制变换)、变形、仿真或以其他方式将指令转换成将由核来处理的一个或多个其他指令。指令转换器可以用软件、硬件、固件、或其组合实现。指令转换器可以在处理器上、在处理器外、或者部分在处理器上且部分在处理器外。

图40是根据本发明的各实施例的对照使用软件指令转换器将源指令集中的二进制指令转换成目标指令集中的二进制指令的框图。在所示的实施例中,指令转换器是软件指令转换器,但作为替代,该指令转换器可以用软件、固件、硬件或其各种组合来实现。图40示出可使用x86编译器4004来编译利用高级语言4002的程序,以生成可由具有至少一个x86指令集核的处理器4016原生执行的x86二进制代码4006。具有至少一个x86指令集核的处理器4016表示任何处理器,这些处理器能通过兼容地执行或以其它方式处理以下内容来执行与具有至少一个x86指令集核的处理器基本相同的功能:1)指令集核的指令集的本质部分,或2)目标为在具有至少一个x86指令集核的处理器上运行的应用或其它程序的目标代码版本,以便取得与具有至少一个x86指令集核的处理器基本相同的结果。x86编译器4004表示用于生成x86二进制代码4006(例如,目标代码)的编译器,该二进制代码可通过或不通过附加的链接处理在具有至少一个x86指令集核的处理器4016上执行。类似地,图40示出可以使用替代的指令集编译器4008来编译利用高级语言4002的程序,以生成可以由不具有至少一个x86指令集核的处理器4014(例如具有执行加利福尼亚州桑尼维尔市的MIPS技术公司的MIPS指令集、和/或执行加利福尼亚州桑尼维尔市的ARM控股公司的ARM指令集的核的处理器)原生执行的替代指令集二进制代码4010。指令转换器4012被用来将x86二进制代码4006转换成可以由不具有x86指令集核的处理器4014原生执行的代码。该转换后的代码不大可能与替代性指令集二进制代码4010相同,因为能够这样做的指令转换器难以制造;然而,转换后的代码将完成一般操作并由来自替代指令集的指令构成。由此,指令转换器4012通过仿真、模拟或任何其它过程来表示允许不具有x86指令集处理器或核的处理器或其它电子设备执行x86二进制代码4006的软件、固件、硬件或其组合。

虽然附图中的流程图示出由某些实施例执行的操作的特定顺序,但是应当理解,此类顺序是示例性的。由此,替代实施例可按不同的顺序执行这些操作,可组合某些操作,可重叠某些操作,等等。

此外,尽管已通过若干实施例描述了本发明,但是本领域技术人员将认识到,本发明不仅限于所描述的实施例,并且本发明可在所附权利要求书的精神和范围内作出修改和更改来实践。说明书由此被视为是说明性的而不是限制性的。

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