具有一组线程束的高效矩阵乘法和加法的制作方法

未命名 09-22 阅读:97 评论:0

具有一组线程束的高效矩阵乘法和加法
1.相关申请的交叉引用
2.本技术涉及以下共同转让的共同未决的美国专利申请,将这些专利申请中的每一个的全部内容通过引用合并:
3.·
2022年3月10日提交的题目为“用于高效访问多维数据结构和/或其他大数据块的方法和装置(methodandapparatusforefficientaccesstomultidimensionaldatastructuresand/orotherlargedatablocks)”的美国申请no.17/691,276;
4.·
2022年3月10日提交的题目为“协作组阵列(cooperativegrouparrays)”的美国申请no.17/691,621;
5.·
2022年3月10日提交的题目为“分布式共享存储器(distributedsharedmemory)”的美国申请no.17/691,690;
6.·
2022年3月10日提交的题目为“虚拟化处理器中的硬件处理资源(virtualizinghardwareprocessingresourcesinaprocessor)”的美国申请no.17/691,759;
7.·
2022年3月10日提交的题目为“跨多个计算引擎的程序化控制的数据多播(programmaticallycontrolleddatamulticastingacrossmultiplecomputeengines)”的美国申请no.17/691,288;
8.·
2022年3月10日提交的题目为“具有异步事务支持的硬件加速的同步(hardwareacceleratedsynchronizationwithasynchronoustransactionsupport)”的美国申请no.17/691,296;
9.·
2022年3月10日提交的题目为“处理器和存储器中的快速数据同步(fastdatasynchronizationinprocessorsandmemory)”的美国申请no.17/691,303;
10.·
2022年3月10日提交的题目为“用于处理器中的线程组的可扩展负载均衡的技术(techniquesforscalableloadbalancingofthreadgroupsinaprocessor)”的美国专利申请no.17/691,872;
11.·
2022年3月10日提交的题目为“不需要硬件复位的处理组件之间的执行软件的灵活迁移(flexiblemigrationofexecutingsoftwarebetweenprocessingcomponentswithoutneedforhardwarereset)”的美国申请no.17/691,808;以及
12.·
2022年3月10日提交的题目为“用于高效访问多维数据结构和/或其他大数据块的方法和装置(methodandapparatusforefficientaccesstomultidimensionaldatastructuresand/orotherlargedatablocks)”的美国专利申请no.17/691,422。
技术领域
13.该技术通常涉及提高处理效率。更具体地,这里的技术涉及用于处理矩阵乘法运算的专用电路。


背景技术:

14.用户希望随着图形处理单元(gpu)技术的改进以及处理核心单元的数量随着每代而每芯片增加,深度学习和高性能计算(hpc)计算程序继续扩展。所期望的是单个应用程序的解决方案的更快时间,不仅仅通过运行更多独立的应用程序来扩展。
15.图1a示出了包括顺序相关的计算密集层的长链的示例深度学习(dl) 网络。使用诸如例如将输入激活与权重矩阵相乘以产生输出激活的运算来计算每个层。所述层通常通过将工作划分为输出激活块(tile)而跨gpu或 gpu集群并行化,每个输出激活块都表示一个处理核心将处理的工作。
16.由于潜在大量的计算深度学习需求,通常目标更快。并且与连续地执行所有这些计算相比,并行执行许多计算将加速处理具有直观意义。事实上,应用通过在给定gpu实现上运行而实现的性能益处的量通常完全取决于它可以并行化的程度。但是存在不同的并行化方法。
17.在概念上,为了加速进程,可以使每个并行处理器执行更多工作(见图1b),或者可以替代地保持每个并行处理器上的工作量恒定并且添加更多处理器(见图1c)。考虑重铺几英里长的高速路的工作量。你作为项目经理想要在最短的时间量内完成重铺工作以最小化业务中断。显然,如果你有几名工作人员在道路的不同部分并行工作,道路重铺工程将更快地完成。但是,哪种方法将使工作更快速地完成呢——要求每个道路工作人员做更多的工作,还是增加更多的工作人员,每个工作人员做相同的工作量?结果是,答案取决于工作的性质和用于支持该工作的资源。
18.计算机科学家将第一种方法称为“弱扩展(weak scaling)”,将第二种方法称为“强扩展(strong scaling)”。
19.因此,此类应用的用户通常想要强扩展,这意味着单个应用可以在不必改变其工作负载(例如,通过增加其批大小来创建更固有的并行性)的情况下实现更高的性能。当在提供更多并行处理器的新的、容量更大的 gpu平台上运行现有的(例如,重新编译的)应用时,用户还期望提高的速度性能。gpu开发已经满足或甚至超过市场在更多并行处理器和在那些并行处理器上运行的增加数量的并行执行线程之间的更多协调/协作方面的期望——但是仍需要进一步的性能改进以实现强扩展。
20.矩阵乘法,或更具体地矩阵乘法和加法(mma),是一种在许多应用程序中非常常见的运算,例如深度学习或其他人工智能应用程序、物理应用程序、图形等,这些应用程序通常在gpu平台上运行。前几代gpu为使mma更快和更具可扩展性提供了硬件支持。
21.尽管硬件支持的mma运算在前几代gpu中实现了显著的速度和规模改进,但仍需要进一步的改进。
附图说明
22.图1a示出了在gpu上运行的示例应用。
23.图1b示出了弱扩展深度学习场景。
24.图1c示出了强扩展深度学习场景。
25.图2示出了mma运算的示例输入。
26.图3是根据一个实施例的点积运算的概念图。
27.图4示出了根据一些实施例的处理器的一部分,该处理器包括被配置为实现矩阵运算的数据路径。
28.图5a-5c示出了一些mma能力相对于三代先前gpu的示例演变。
29.图6a示出了根据一些示例实施例的流式多处理器的概念视图。
30.图6b示出了与图6a相似的概念图,但是根据一些实施例其中一组线程束协作以计算可变大小的矩阵。
31.图7a示出了根据一些实施例的在用于执行mma的示例系统中涉及一组线程束(warp)和mma状态机硬件电路的示例事件流。
32.图7b示出了图7a所示的过程中涉及的同步的另一个概念视图,以及根据一些实施例的mma状态机操作的更多细节。
33.图8示出了根据一些实施例的以混合(swizzled)模式存储在存储器中的数据,该数据由mma指令读取。
34.图9示出了与前几代gpu相比的示例实施例的选定性能参数。
35.图10示出了根据一些实施例的gpu的示例并行处理单元。
36.图11a示出了根据一些实施例的图10的并行处理单元内的示例通用处理集群(gpc)。
37.图11b示出了图10的并行处理单元的示例存储器分区单元。
38.图12a示出了根据一些实施例的图11a的具有mma状态机电路的示例流式多处理器(sm)。
39.图12b概念性地示出了根据一些实施例的在诸如图12a所示的sm 的sm中实现的四个子分区。
40.图13a是使用图10的并行处理单元(ppu)实现的处理系统的示例概念图。
41.图13b是其中可以实现各种先前实施例的各种架构和/或功能的示例性系统的框图。
具体实施方式
42.本公开的实施例通过“强扩展”mma计算来支持gpu性能改进。上面关于图1a-1c描述了强扩展,其指的是gpu设计改进,使得相同数量的工作(与上一代gpu相比)可以在更快的处理器上以多倍的速度执行。
43.本公开旨在提高计算机系统中形式为d=a*b+c的mma运算的能量效率和性能,其中a、b、c和d是矩阵(等式1)。利用等式#1的应用程序通常执行许多矩阵乘法运算,其中一个矩阵乘法的结果(d)用作后续矩阵乘法的输入(c)。等式1的一些先前实现具有以下特征:
44.·
矩阵乘法的结构使得结果d的行集可以并行计算;
45.·
每个计算单元对结果d的行集执行独立的操作;
46.·
矩阵a和b的数据从存储器加载到寄存器中;
47.·
在将进行并行计算的每个计算单元中复制矩阵b的数据(使用从存储器到寄存器的多次加载);
48.·
每个计算单元独立计算等式1;
49.·
矩阵a、b和c的数据从寄存器加载到中间缓冲区;
50.·
对中间缓冲区中的数据进行乘法和加法运算;以及
51.·
计算结果(输出d)存储在寄存器中。
52.本公开的示例实施例通过使在处理器(例如流式多处理器(sm))上执行的多个线程束能够协作地执行mma运算(operation)来提高gpu上 mma运算的能量效率和速度。在同一个sm上执行的多个线程束同步和协调运算,使得对于特定的mma运算,每个线程束单独读取a或b操作数中的一个以进行乘法运算,但a或b操作数中的另一个从存储器读取一次并在多个线程束之间共享以提高存储器访问效率。一些示例实施例包括以下方面:
53.·
将执行mma并行计算的计算单元的有效同步;
54.·
矩阵a和b的数据从存储器加载到中间缓冲区;
55.·
矩阵b的数据被多播到多个计算单元;以及
56.·
矩阵b被分成多组列,数学运算是针对一组列而不是矩阵b的所有列进行的。
57.计算单元的有效同步允许并行计算更大的矩阵并增加矩阵b数据共享的益处。将矩阵a和b从存储器加载到中间缓冲区消除了将矩阵a和 b从存储器加载到寄存器的需要,从而减少了功耗并减少了所需的寄存器分配。将矩阵b多播成多个计算单元减少了每个计算单元执行并行计算以独立加载矩阵b的需要,从而减少了带宽和功耗。对矩阵b的多组列执行数学运算允许重叠矩阵b的数学运算和加载,并且还允许减小所需的中间缓冲区大小。
58.在示例实施例中,硬件中的独立状态机负责协调每个计算单元中矩阵乘法的执行。在一些实施例中,独立状态机执行以下任务:
59.·
将数据从存储器(矩阵a和b)加载到中间缓冲区;
60.·
将数据从寄存器(矩阵c)加载到中间缓冲区;
61.·
控制乘法和加法运算的执行;以及
62.将中间缓冲区的结果存储到寄存器中(矩阵d)。
63.一组线程束协作以生成公共结果矩阵的mma运算在本文中有时被称为组mma(gmma)。
64.mma概述
65.本公开的实施例在gpu和其他处理器中提供改进的mma能力。
66.图2以图形方式示出了对形式d=a*b+c的mma运算的输入示例。 mma运算将输入矩阵a210乘以输入矩阵b220,并将结果累加到收集器矩阵c230中。如图2所示,输入矩阵a为8
×
4矩阵,输入矩阵b为4
×ꢀ
8矩阵,收集器矩阵c为8
×
8矩阵。然而,图2中没有任何显示应该被解释为将mma运算限制在特定的维度上。结果矩阵d未在图2中单独示出,但在某些实现中,是c矩阵的相同位置。即通过将a*b+c的结果写入累加器矩阵c得到d矩阵。
67.在图2中,矩阵在视觉上被划分为4
×
4元素子矩阵。在输入矩阵a210 和b220的每个元素被编码为半精度浮点值(例如,16位浮点)的实施例中,每个4
×
4元素子矩阵由四个4-矩阵中的元素向量表示。在输入矩阵 a210的情况下,矩阵被划分为上组向量和下组向量。每个向量可以对应于输入矩阵a210的一行,其中每行四个元素可以被打包到单个64位寄存器中。在输入矩阵b220的情况下,矩阵被划分为左向量集和右向量集。每个向量可以对应于输入矩阵b220的一列,其中每列四个元素可以被打包到单个64位寄存器中。在收集器矩阵c230的情况下,所示的四个4
×
4元素子矩阵中的每一个可以对应于收集器矩阵c230的多个向量(即,行的部分或列的部分),并且还对应于一个使用来自输入矩阵的对应向量对
执行多个点积运算。
68.例如,作为输入矩阵a210的第一向量《a
0,0
,a
0,1
,a
0,2
,a
0,3
》和输入矩阵 b220的第一向量《b
0,0
,b
1,0
,b
2,0
,b
3,0
》之间的点积运算的结果生成收集器矩阵c
0,0
的第一元素。输入矩阵a210的第一向量表示输入矩阵a210的第一行。输入矩阵b220的第一向量表示输入矩阵b220的第一列。因此,这两个向量之间的点积给出为:c
0,0
=a
0,0b0,0
+a
0,1b1,0
+a
0,2b2,0
+a
0,3b3,0
+c
0,0
,其中点积运算基本上是对两个向量的相应元素执行四个乘法运算,然后是四个加法运算,这些运算将乘法运算生成的四个部分积与收集器矩阵的元素的初始值相加。然后使用输入矩阵的向量的不同组合以类似方式计算收集器矩阵c230的每个其他元素。如图2所示的mma运算,输入矩阵a210的每个向量被配置为生成收集器矩阵c230的相应元素行的八个点积运算消耗。类似地,输入矩阵b220的每个向量被配置为生成收集器矩阵c230的元素的对应列的八个点积运算消耗。虽然生成收集器矩阵c230的元素的 64个点积运算中的每一个都是唯一的,如通过使用来自输入矩阵的不同向量对所定义的,但第一输入操作数的每个向量和第二输入操作数的每个向量被多个点积运算消耗,并有助于结果矩阵的多个单独元素。
69.可以通过将来自两个输入矩阵的向量集加载到计算mma的数据路径 (即逻辑电路)的输入来加速上述mma运算,只要数据路径可以配置为以一种有效的方式消耗向量集,以减少寄存器文件和数据路径输入之间的带宽使用。例如,在一个实施例中,收集器矩阵c230的左上象限的前两行可以由配置为接收输入矩阵a210的上向量集中的前两个向量和输入矩阵 b220的左向量集的前四个向量作为输入,以及收集器矩阵c230的左上象限的前两个向量(即行)。例如,这样的数据路径将需要输入8个64位字:存储输入矩阵a210的两个向量的两个64位字,存储输入矩阵b220的四个向量的四个64位字,以及存储收集器矩阵c230的两个向量的两个64 位字。应该理解,如果收集器矩阵c230的元素被编码为全精度浮点值(例如,32位浮点),那么对于收集器矩阵c230的两个向量的数据路径的输入大小将加倍为四个64位字。
70.然后可以将数据路径配置为在单次通过(pass)中并行执行八个点积运算,在多次通过中串行执行,或者串行和并行运算的某种组合。例如,数据路径可以设计为每次通过执行一个4向量点积运算,其从输入矩阵 a210获取一个向量,从输入矩阵b220获取一个向量,并生成收集器矩阵c230的单个元素。然后在八次通过中利用来自两个输入矩阵的六个向量的不同组合对八次通过进行操作,以生成收集器矩阵c230的八个不同元素。或者,可以将数据路径设计为每次通过执行四个4向量点积运算,其从输入矩阵a210获取一个向量,从输入矩阵b220获取四个向量,并并行生成收集器矩阵c230的四个元素。然后在每次通过期间利用来自输入矩阵 a210的不同向量和来自输入矩阵b220的相同四个向量在两次通过上操作数据路径,以生成收集器矩阵c230的八个元素。在数据路径使用每个点积运算中的不同输入组合执行多个点积运算之前,可以从寄存器文件加载一次数据路径。这将显著减少寄存器文件和数据路径之间消耗的带宽。例如,为了执行8个点积运算,只需将两个输入矩阵a和b的6个向量从寄存器文件加载到数据路径的输入中,而使用能够执行单个点积运算并且只有两个向量的输入容量数据路径来单独执行所有8个点积运算将需要将16 个向量从寄存器文件加载到数据路径的输入,因为向量在多个点积运算中被重复使用。
71.应当理解,矩阵元素的大小在示例实施例中不受限制。还将理解,输入矩阵的大小
在示例实施例中不受限制。已经通过引用并入的美国专利 no.10,338,919描述了将不同大小的矩阵元素打包到寄存器中,并且还描述了实现任意k维的输入矩阵的mma,其中输入矩阵a和b具有nxk和 kxm维。
72.图3是根据一个实施例的mma运算的概念图。该运算实质上是对多个部分积求和。mma运算可以指定三个操作数,向量a、向量b和标量收集器c。向量a和向量b具有相同的长度(即元素的数量)。如图3所示,向量a和b的长度为2;然而,应当理解,点积运算可以具有大于或等于二的任何长度。
73.mma运算将来自输入向量a和b的一对元素相乘。参考图3,来自输入向量a的第一元素a0312在乘法器322中与来自输入向量b的对应元素b0314相乘以生成部分积a0b0326。来自输入向量a的第二元素a1316 与乘法器324中的输入向量b的对应元素b1318相乘,以产生部分积 a1b1328。然后利用三元加法器330将部分积a0b0326、部分积a1b1328和标量收集器值c
in
320相加以产生结果值c
out
332。结果值c
out
332可以被存储在用于标量收集器值c
in
320的寄存器中并且被重新用于为更长的向量累加多个点积运算。
74.图3仅仅是示例实现,示例实现不限于图3所示的输入向量的大小。可以理解,mma运算可以通过并行添加附加的乘法器322、324等来扩展,并行计算附加的部分乘积,然后将附加的部分乘积与更大的元素加法器或较小的加法器树相加,其生成中间和,然后由附加的多元素加法器再次求和。
75.mma的示例数据路径
76.图4示出了根据一些实施例的处理器的一部分,该处理器包括被配置为实现矩阵运算的数据路径。处理器400的部分包括配置为实现矩阵运算的数据路径430。
77.处理器400包括实现为多个寄存器组410的多组寄存器文件。每个寄存器组410可以将多个数据字存储在多个寄存器中。每个寄存器组410可以具有单独且不同的读取和写入端口,使得可以在任何给定时钟周期中读取寄存器组410中的一个寄存器并且可以写入另一个寄存器。因此,可以在单个时钟周期期间同时从每个寄存器组410读取一个数据字并将其加载到操作数收集器420中。寄存器文件被配置为存储在用于mma运算的指令中指定的操作数。在一个实施例中,指令中指定的每个操作数是在行和列的二维数组中具有多个元素的矩阵,并且每个寄存器可以根据元素和/或寄存器的大小存储特定操作数的一个或更多个元素。
78.处理器400还包括耦合到一个或更多个数据路径的输入的多个操作数收集器。us10,338,919中描述了用于实现操作数收集器的各种技术,例如触发器。在多个操作数在单个时钟周期期间并行地提供给数据路径的输入之前,多个操作数收集器420可以在多个时钟周期内加载来自寄存器文件的操作数。操作数收集器420的功能是临时存储在数据路径上执行操作所需的操作数,其中操作数可以在一个或更多个时钟周期内从寄存器文件 410加载,这取决于操作数存储在哪个寄存器组410以及在这些寄存器组 410中有多少读取端口可用。
79.交叉开关415或其他类型的可切换互连可以耦合到寄存器组410的读取端口和操作数收集器的输入。交叉开关415可以被配置为将信号从与任何寄存器组410相关联的读取端口路由到特定的操作数收集器420。交叉开关405还使得操作数能够直接从共享存储器加载到操作数收集器,而无需首先被存储到寄存器文件中。
80.操作数收集器420可以耦合到一个或更多个数据路径的输入。如图4 所示,操作数收集器420可以耦合到矩阵乘法累加(mma)数据路径430 以及双精度(64位)浮点(fp64)数据路径440。fp64数据路径440可以是传统的双精度、浮点fma数据路径,支持对双精度、浮点操作数执行加法、减法、乘法、除法以及其他运算。
81.结果队列450使结果能够在等待写入端口的可用性以将值写回到寄存器文件时被临时存储。应当理解,结果队列450可以是对内部包括在数据路径中的累积寄存器的补充,该累积寄存器不需要在多条指令的执行之间被写回寄存器文件。
82.在一个实施例中,mma数据路径430共享fp64数据路径440可用的相同操作数收集器420。mma数据路径430和fp64数据路径440可以包括在处理器400的公共核心中,处理器400包括多个核心,每个核心包括一个fp64数据路径440和mma数据路径430以及可能的整数算术逻辑单元(alu)。在一个实施例中,mma数据路径430被配置为执行矩阵乘法和累加(mma)运算。用于mma运算的指令指定了多个矩阵操作数,这些矩阵操作数被配置为执行与上述等式1指定的函数等效的运算。
83.在一个实施例中,多个操作数收集器420包括存储指令中指定的第一操作数的至少两个向量(即,输入矩阵a210)和指令中指定的第二操作数的至少两个向量(即,输入矩阵b220)。至少两个向量中的每个向量在矩阵操作数的行或列中具有至少两个元素。例如,在一个实施例中,mma数据路径430被配置为接收来自第一操作数的两个向量和来自第二操作数的四个向量作为数据路径的输入。因此,操作数收集器420的数量应该足以存储两个输入矩阵操作数的至少六个向量(例如,最少六个64位操作数收集器)。取决于mma数据路径430的设计,其他实施例可能需要更多或更少的操作数收集器420。
84.在一个实施例中,mma数据路径430还被配置为接收指令中指定的第三操作数的至少两个向量(即,收集器矩阵c230)。收集器矩阵c230与指令中指定的第一和第二操作数相乘的结果相加。
85.mma数据路径430在mma数据路径430的输出处生成结果矩阵的多个元素。结果矩阵的多个元素中的每个元素通过计算从矩阵操作数中选择的对应的向量对的至少一个点积来生成。
86.在一些实施例中,gmma状态机硬件电路435控制操作数加载到操作数收集器430以及使用数据路径430同步多个线程束以执行mma运算。
87.在一个实施例中,处理器400被实现为ppu1000。在这样的实施例中, sm1140中的每个核心1250包括mma数据路径430以及fp64数据路径 440,并且可选地包括整数alu。寄存器文件1220可以实现一个或更多个存储器组410。交叉开关415和操作数收集器420可以在寄存器文件1220 和一个或更多个核心1250之间实现。此外,结果队列450可以在一个或更多个核心1250和互连网络1280之间实现,其使得存储在结果队列450中的结果能够被写回到寄存器文件1220。因此,处理器400是包括多个 sm1140的ppu1000,多个sm1140中的每个sm1140包括寄存器文件1220 和多个核心1250,多个核心1250中的每个核心1250包括mma数据路径 430的实例。
88.ppu1000实施simt架构,该架构使得多个线程能够在多个sm1140 中的多个核心1250上并行执行。在一个实施例中,mma运算被配置为由多个线程在多个核心1250上并行执行。每个线程被配置为使用针对mma 运算的指令中所指定的操作数的向量的不同组合,在
特定核心1250上生成结果矩阵(例如,收集器矩阵c230)中的元素的一部分。
89.例如,如图2所示,8
×
4输入矩阵a210和4
×
8输入矩阵b220上的 mma运算可以同时在八个线程上执行。第一线程被分配输入矩阵a210的前两个向量(例如,《a
0,0
,a
0,1
,a
0,2
,a
0,3
》&《a
1,0
,a
1,1
,a
1,2
,a
1,3
》)和输入矩阵 b220的前四个向量(例如, 《b
0,0
,b
1,0
,b
2,0
,b
3,0
》,《b
0,1
,b
1,1
,b
2,1
,b
3,1
》,《b
0,2
,b
1,2
,b
2,2
,b
3,2
》,&《b
0,3
,b
1,3
,b
2,3
,b
3,3
》)。第一线程生成包括在结果矩阵中的八个元素向量(例如, 《c
0,0
,c
0,1
,c
0,2
,c
0,3
》&《c
1,0
,c
1,1
,c
1,2
,c
1,3
》)。同样,为第二线程分配输入矩阵a210的前两个向量(例如,a
0,0
,a
0,1
,a
0,2
,a
0,3
》&《a
1,0
,a
1,1
,a
1,2
,a
1,3
》)和输入矩阵b220的接下来的四个向量(例如, 《b
0,4
,b
1,4
,b
2,4
,b
3,4
》,《b
0,5
,b
1,5
,b
2,5
,b
3,5
》,《b
0,6
,b
1,6
,b
2,6
,b
3,6
》,&《b
0,7
,b
1,7
,b
2,7
,b
3,7
》)。第二线程生成八个元素,其包括在结果矩阵的两个不同向量中(例如, 《c
0,4
,c
0,5
,c
0,6
,c
0,7
》&《c
1,4
,c
1,5
,c
1,6
,c
1,7
》)。第三线程被分配输入矩阵a210的下两个向量(例如,《a
2,0
,a
2,1
,a
2,2
,a
2,3
》&《a
3,0
,a
3,1
,a
3,2
,a
3,3
》)和输入矩阵 b220的前四个向量(例如, 《b
0,0
,b
1,0
,b
2,0
,b
3,0
》,《b
0,1
,b
1,1
,b
2,1
,b
3,1
》,《b
0,2
,b
1,2
,b
2,2
,b
3,2
》,&《b
0,3
,b
1,3
,b
2,3
,b
3,3
》)。第三线程生成包括在结果矩阵中的两个向量的八个元素(例如, 《c
2,0
,c
2,1
,c
2,2
,c
2,3
》&《c
3,0
,c
3,1
,c
3,2
,c
3,3
》)。其他五个线程与来自输入矩阵 a210和输入矩阵b220的向量的附加组合类似。在另一个实施例中,如下所述的状态机之类的控制实体基于来自线程或共享存储器的寄存器文件,并通过将结果矩阵的相应部分写入相应线程的寄存器文件。
90.应当理解,核心1250被分配给每个线程,分配给该线程的向量被加载到核心1250的操作数收集器420中,然后通过在核心1250中的mma 数据路径430上执行mma运算来生成结果矩阵的元素。在一个实施例中,每个核心耦合到仅耦合到该核心1250的一组专用操作数收集器420。在另一个实施例中,多个核心1250共享操作数收集器420。例如,具有两个 mma数据路径430的两个核心1250可以共享一组操作数收集器420,其中分配给在两个核心1250上调度的两个线程的公共向量由两个核心1250 共享。这样,分配给两个或更多线程的公共向量没有被加载到两组单独的操作数收集器420中。例如,上面讨论的前两个线程都被分配了输入矩阵 a210的前两个向量,同时被分配了输入矩阵b220的不同的向量组。因此,用于存储输入矩阵a210的向量的操作数收集器420可以通过将那些操作数收集器420耦合到两个mma数据路径430的输入而在两个核心1250 之间共享。
91.gpu中的示例mma实现
92.图5a-5c示出了一些mma能力在三代以前的gpu上的示例演变。在图5a所示的例子中,第一代(所示示例中的)gpu中的流式多处理器 (sm)支持被称为“线程束”的一组或一组执行线程的同时调度和执行。特别是,在sm内或与sm相关联的调度程序同时启动了一定数量(例如 32个)的线程来执行——这个线程集合被称为“线程束”。然而,在第一代 sm中,线程束中的每个线程都使用自己的寄存器文件单独执行任何mma 运算,而不与线程束中的任何其他线程共享其寄存器文件。因此,每个线程在数据路径上执行指令时独立运算。
93.图5b所示的第二代gpu引入了线程束中同时执行的线程之间的某种程度的数据共享。特别是,线程束中的线程在线程束中的某个线程子集 (例如,8个)的组中工作,以共享它们的寄存器文件并协作执行mma。也就是说,每个线程束包括多个(例如,4个)子集,并且每个子集利用各自的数据路径电路来协作执行mma。在一个示例中,线程束仍然包含总共32个线程,并且第二代中的每个数据路径电路都满足8线程组的需求,并被配置为执行8x4a矩阵和4x8b矩阵的乘法。例如,在8线程组中,b 矩阵的数据可以由一个线程从存储器中获取,
并通过本地寄存器文件和数据路径与同一组中的其他线程共享。然而,在相同或不同线程束中的此类线程组或线程子集之间共享数据需要写入和读取更高级别的存储器,例如高速l2缓存。尽管图中四个组中的每个组中显示的8x4矩阵a信息对于所有四个组可能都是相同的,但每个组都从其自己的关联寄存器文件中自行加载此信息。更具体地说,一个线程可以从同一组中任何其他线程的寄存器文件中加载操作数信息,但不一定从同一线程束中的任何其他线程中加载操作数信息。因此,各个组中的每一个都可能会针对相同的数据发出其自己的读取请求,从而浪费寄存器文件带宽。
94.图5c所示的第三代gpu将数据的本地共享扩展到线程束中的所有线程。因此,在第三代中,单个线程束中的所有线程可以通过共享来自它们各自寄存器的操作数来协作执行mma。也就是说,线程束中的线程可以从该线程束中的任何线程的寄存器中获取其数据路径操作的操作数。因此,例如,这一代通过使其所有线程(例如32个线程)相对于mma协作,使每个线程束能够执行16x16矩阵和16x8矩阵的mma。
95.图6a示出了根据一些示例实施例的流式多处理器(sm)的概念图。在图5c所示的第三代的基础上进行改进,所示示例实施例使多个或一组线程束能够协作计算a*b+c形式的mma。如上所述,用于计算公共结果矩阵的mma运算可以被称为gmma运算。sm在下文中例如关于图12a 和12b进行描述。
96.图6a示出了四个线程束——分别在sm 600的子分区0 602、子分区 1 604、子分区2 606和子分区3 608上执行的线程束0、线程束1、线程束 2和线程束3——合作计算a*b+c,其中c为该组计算64x8的结果矩阵。任何数量的线程束,每个都包括任何数量的线程,可以以这种方式合作。在一个实施例中,所有多个线程束都在同一个sm上执行并且都同时启动。可以在sm 600的不同子分区上启动和执行的四个线程束协作,使得所有四个线程束的所有线程彼此共享它们的寄存器文件,以在sm的张量核心 612中执行图6a中所示的64x8a矩阵和8x16b矩阵的mma。sm可以具有足够数量的张量核心,从而可以为每个线程分配其自己的相应张量核心。因此,张量核心612可以包括用于每个线程的相应核心(例如,128个张量核心对应于128个线程,四个线程束中的每一个具有32个线程)。在一个实施例中,累加c矩阵的输出累加器被分配在四个线程束中,使得每个线程束将其各自的结果写入其各自的一组分配的累加器。作为说明性示例,图12b示出了具有四个子分区1291、1292、1293和1294的sm。
97.本实施例因此具有跨不同线程束共享来自寄存器文件的mma操作数的能力。图中所示的a和/或b操作数可以从线程束组的任何线程的寄存器文件和/或从共享存储器中获取到相关的数据路径。如图所示,b操作数在所有四个线程束中共享。在一些实施例中,将b操作数从外部存储器读取一次到一组线程束中的线程束可访问的共享存储器,并且直接从共享存储器读取b操作数数据并例如通过多播直接发送到处理该线程束的线程的核心。数据被多播到的一组处理核心可以只是与共享存储器相关联(例如,位于与共享存储器相同的sm上)的处理核心的一个子集,或者甚至是全部。
98.如在该示例中可以观察到的,虽然每个线程束对其自己的一组a矩阵数据进行操作,但所有四个(或其他数量的)线程束对同一组b矩阵数据进行操作。在上一代中被多次读取到每个线程束的寄存器文件中的数据(例如b矩阵数据)现在在示例实施例中只需要读取一次——从而提高了存储器带宽利用率。每个线程束唯一的a矩阵数据可以直接从共享存
储器获取到数据路径,绕过寄存器文件。
99.图6b示出了类似于图6a的sm 600'的概念图,但是四个线程束一起工作以计算可变大小的矩阵。一些示例实施例包括可配置的或可变的a矩阵和b矩阵大小的能力。例如,在一个实施例中,a矩阵是64xk,b矩阵是kx16,其中k可以是任何正数,例如,8、16、32、64、128等。由于 b矩阵,即kx16,在所有线程束之间共享(参见张量核心612'),因此更高的k导致更高的效率增益。作为示例,所示实施例提供了64xk和kx64 矩阵的mma。
100.如图6a和6b所示,在一些实施例中,sm包括四个子分区,并且每个子分区可以托管组中同时执行的线程束之一,该组协作执行gmma运算。
101.硬件状态机
102.图7a和7b示出了根据一些实施例的在执行gmma运算的示例系统中的示例事件流700。状态机或“工作线程”702在硬件(作为逻辑电路) 中实现以控制在处理器(例如,sm)上执行的一组线程束之间的gmma 运算,以协同计算结果矩阵。需要注意的是,示出的事件流代表了gmma 运算的编程模型。
103.在所示示例中,状态机702控制多个(例如,四个)计算单元704、 706、708和710来执行gmma运算。在一些实施例中,四个计算单元可以表示sm的四个子分区,例如sm1140。每个子分区可以具有一个或更多个张量核心(参见图12b),其被配置为对矩阵执行乘法和其他运算。在该示例中,协同计算结果矩阵的线程束组中的相应线程束在每个计算单元上执行。
104.在相应计算单元704、706、708和710上执行的线程束组的每个线程束中的每个线程是与线程束的其他线程异步执行并在定义的同步点处与其他线程同步的单独程序。在一些实施例中,一组线程束中的线程启动状态机702以开始在相应张量核上执行gmma指令。线程束组中的每个线程都将其操作数例如从其寄存器文件贡献给gmma运算,并在其寄存器文件中接收gmma运算的结果。状态机702将操作数数据从寄存器文件和/ 或共享存储器移动到数据路径的输入,控制各个张量核以使用数据路径输入中的操作数执行gmma运算,并随后将运算的结果写回到寄存器文件。然后每个线程都可以访问其寄存器文件中的结果。
105.为了通过例如多播有效地共享操作数,使得组中的每个线程束中的每个线程可以将操作数贡献给它的gmma部分,实现了同步机制。该组中的线程到达第一同步屏障712,并且当基于该屏障确定该组的所有线程束中的所有线程都已到达该屏障时。到达第一同步屏障712的所有线程指示由每个线程提供的输入数据已准备好(例如在寄存器文件和/或共享存储器中)。响应于到达第一同步屏障的线程束组的所有线程,状态机702被发信号通知714以开始gmma运算的数学运算。
106.然后状态机702将根据需要将输入操作数移动到数据路径的输入,并执行gmma运算。一旦运算完成,状态机702就通知线程gmma运算完成,从而使线程从寄存器文件中读取结果。
107.该状态机驱动的gmma运算涉及使线程在表面上独立地执行的多个线程束上进行协调,该多个线程束由异步单元同步执行,该异步单元将一次全部一起执行gmma运算以最大化多播的效率。
108.图7b示出了图7a所示的过程中所涉及的同步的另一个概念视图700',以及状态机702的更多细节。
109.在状态机在线程到达屏障(例如,上面提到的第一同步屏障)的条件被线程束组中的每个线程束满足712时启动后,状态机702使相应的处理核心(例如,张量核心和/或数据路径)在识别gmma运算的结束716之前执行gmma数学运算。状态机将矩阵a的各个部分的输入操作数读取到各个处理核心的输入。例如,运算720、722、724和726分别读取计算单元0、1、2和3。随后,状态机702通过若干指令728、730和732读取 b矩阵,并且将来自b矩阵的相同数据提供给所有计算单元(例如,sm子分区)。
110.在一些实施例中,状态机可以管线执行具有寄存器/共享存储器加载和 /或写入的数学运算,以便改进延迟和带宽利用率。例如,如图所示,b的读取可以与执行数学运算和写入结果之一或两者并发地执行。对于每条指令,可以计算与结果矩阵的一部分相关的数学,并写入结果。所示实施例需要一组线程束中的至少两个(730和732)运算协作以计算部分结果矩阵,以完成计算整个结果矩阵所需的数学运算。状态机702可以通过在每个部分完成时更新同步屏障来控制用于计算各个部分的同步,从而警告所有线程以便线程可以继续提供数据用于计算另一部分。整个矩阵的计算结束可以通过状态机更新另一个同步屏障来发出信号。在一些实施例中,多个线程束执行的指令流可以包括mma指令和在指令流中布置在mma指令之后的mma同步指令,mma同步指令向多个线程束指示之前的部分或全部mma指令的完成。在一些实施例中,mma同步指令更新同步屏障以指示对多个线程束的一个或更多个mma指令的完成,或已发出的所有mma指令的完成。
111.状态机702是硬件电路,并且与子分区或更具体地与各个子分区中的处理核心异步运算。因此,每个线程可以在等待状态机执行某些数学运算的同时继续执行其活动。一个或更多个线程执行的指令触发状态机硬件 702,状态机完成的所有工作都在状态机硬件中。
112.示例实施例可以利用数学指令(在此称为gmma指令)来执行 gmma运算。在示例实施例中,gmma指令可以是《指令操作码》《输入矩阵a,大小,位置》《输入矩阵b,大小,位置》《输入矩阵c,大小,位置》《 描述符》的形式。gmma指令可以从寄存器文件中读取操作数,也可以直接从共享存储器中读取。为了使gmma指令有效地直接从共享存储器中读取,可以为指令提供描述符字段,该描述符字段标识要读取的一个或更多个矩阵存储在存储器中的预定格式(存储器中各个输入矩阵的布局)。
113.描述符字段可以指定寄存器索引,并且寄存器可以配置有一个或更多个位的位模式以指示从多个可能布局中选择的特定预定布局模式。在一些实施例中,使用描述符指定数据在共享存储器中的位置以及布局。在一些实施例中,描述符可用于提供附加信息,例如转置、前沿计算、步幅等,这些信息将用于从存储器获取数据并加载到数据路径。
114.使用描述符,gmma指令提供要根据描述符指定的布局在存储器中访问的矩阵数据。在被检索时,数据可以在写入共享存储器时进行部分转换,然后可选地在写入数据路径时进一步转换。
[0115]“工作线程”是将状态机暴露给编程模型的概念。状态机(例如状态机702)“理解”共享存储器中的数据布局(在gmma指令的描述符中指定)和数据路径中的数据组织,并且能够执行以下操作:必须在硬件中进行一次或更多次转换、转置和/或转换,以将数据输入到数据路径所需的组织中的数据路径中。
[0116]
描述符字段是支持组织数据的各种混合模式的有效方式。通过在描述符中为多个
16x16块指定组织模式,避免了指定单个块的位置的必要性。描述符允许桥接来自全局存储器的输入数据和最终馈送到张量核心数据路径的子矩阵之间的差异。根据一些实施例,描述符字段包括使gmma状态机能够响应于单个gmma指令继续在多个周期内访问寄存器文件和/或共享存储器以加载输入操作数和管线式张量核心上进行的数学运算以及参与gmma运算的各个线程的操作数加载。因此,在一些实施例中,描述符字段被gmma状态机用于基于指令流中的单个gmma指令控制整个 gmma运算的计算,而与输入矩阵的大小无关。
[0117]
在一些实施例中,关于gmma运算的同步可以根据同时提交的美国申请no.17/691,296:具有异步事务支持的硬件加速同步机制(hardwareaccelerated synchronization mechanism with asynchronous transactionsupport),其全部内容通过引用并入本文。
[0118]
图8示出了以混合模式802存储在共享存储器中的数据,其可以由 gmma状态机和/或参与线程读取。混合模式802是从全局存储器或l2读取的数据(可能是行的主要形式)如何存储在共享存储器中,以便它可以在数据路径808的列主要模式804和806中读取,而当从共享存储器中读取数据时,最小化或消除组冲突。
[0119]
在一些实施例中,响应于gmma指令,gmma状态机和/或线程可以使tmau单元112(参见图11a)将输入数据从外部存储器或l2加载到共享存储器。同时提交的美国申请no.17/691,276,其描述了tmau单元112和相关的混合模式和块数据的整体移动进出共享存储器。
[0120]
在许多应用中,tmau以与它们在全局存储器中的布局相同的顺序将数据加载到共享存储器中。但是,有些应用程序需要额外的数据移动以避免性能下降。tmau支持一种非混合模式,其中数据以与全局存储器中相同的排列方式写入共享存储器,以及一种混合模式,其中数据根据预先确定的或可配置的混合模式写入共享存储器,即导致数据的排列方式与全局存储器中的不同。
[0121]
混合适应其中数据在全局存储器中存储的顺序与该数据在共享存储器中存储的顺序不同的实施方式。当数据从全局存储器移动到共享存储器时,在一些实施例中,tmau提供对数据的加扰,因为对于一些应用,sm 垂直读取数据(例如,在数据列中)。此外,tmau在写入共享存储器时会考虑共享存储器中的存储器组布局,以优化sm对该数据的后续读取访问。在示出的示例中,共享存储器被组织在组中,特别是在8个组中。在任何给定的时钟,每个组都被读取,但只能读取来自任何给定组的一小部分数据。在图中,每个阴影图案表示根据张量的混合模式写入共享存储器中不同存储组的数据。如果要从共享存储器中读取来自h=0w=0-7的数据,并且如果共享存储器中的数据以与全局存储器中相同的方式排列,则读取该数据需要8个时钟周期,而避免组冲突。因此,如图所示。在图8的左侧 802中,来自h=0w=0-7的数据分布在共享存储器中的所有八个存储组中,因此所有该数据(即来自h=0w=0-7的数据)可以是跨8个组并行读取。这增加了每个时钟的数据吞吐量。
[0122]
在图8中的混合模式的右侧,另一列806显示当w=0时每个h的8x8 图块,箭头指示h=0、w=0和h=1、w0的图块在共享存储器中的位置(枚举的图块0和80分别)被写入。类似地,在与混合模式804较近的列中,示出了当w=1时每个h的8x8图块,箭头指示h=0、w=1和h=1,w=1 (分别枚举图块0和80)的图块在共享存储器中的位置被写入。
[0123]
在一些实施例中,gmma电路可以被配置为从如图8右侧所示的8x8 像素图块中的共享存储器读取数据。为了获得位置r=0,s=0的数据,需要从共享存储器中读取位置r=0s=0的所有通道0-63。对于gmma读取的第一个8x8像素图块,如806列的右上角图块所示,
对于h=0w=0-7的通道c=0-7的位置r=0s=0像素被读取。由于数据在共享存储器中混杂在一起,如图8所示,可以在八个时钟周期内读取包括r=0、s=0在内的八个位置的所有通道0-63。
[0124]
在图9中,表902显示了在用于执行具有64x16a矩阵904的mma 和具有64x64c/d累加器/结果矩阵908的16x64b矩阵906的几代系统之间的比较选择的性能参数。采用了四个线程束在mma的执行中。
[0125]
系统910概念性地示出了第二代gpu,其性能数字被提供在第二列性能数字中。第二代系统910使每个线程束能够在逻辑上分为四组,每组八个线程,其中组内的线程协作以共享寄存器文件并计算结果矩阵的一部分,需要16个线程组,每个线程组读取它的自己的数据来执行计算。如图所示,来自共享存储器的所有数据在被提供给数据路径之前首先被读取到相应的寄存器文件中。
[0126]
系统912概念性地示出了第三代gpu,其性能数字被提供在第三列性能数字中。如前所述,第三代允许单个线程束中的所有线程在执行mma 时共享寄存器,并且通过寄存器文件读取共享存储器中的所有数据。
[0127]
系统914概念性地示出了根据本公开的实施例的系统。系统914的性能数显示在表902的性能数的第四列中。如图所示,四个线程束(例如,根据实施例的流式多处理器上的所有线程束)共享寄存器文件和共享存储器以执行mma运算。张量核心可以绕过寄存器文件直接从共享存储器中读取a和/或b矩阵数据。
[0128]
关于示例实施例的相对性能,可以特别注意共享资源以协作地执行 mma计算的线程的数量越多(例如,128),所需的硬件指令数量越少(例如,4个),读取寄存器文件越少(例如0),读取共享存储器越少(例如32)。
[0129]
将第三代与本公开的示例实施例进行比较,即使从共享存储器读取示例实施例中的a和b操作数,也可以完全消除对a和b操作数的寄存器文件读取,同时还减少了共享存储器读取的次数。这是可以共享的矩阵大小增加的结果。还值得注意的是,示例实施例中用于示例mma运算的4 条硬件指令实际上是在本示例中向四个线程束中的每一个发出的单个指令。如表902中所示,一些示例实施例在包含寄存器文件利用率和共享存储器利用率的同时实现了双倍的性能。
[0130]
根据示例实施例,包括矩阵a、b和c的mma的任务包括在流处理器上执行并共享诸如寄存器文件之类的资源的多个线程束,并且在一些实施例中,还包括它们各自的共享存储器。线程束是一组一起启动的线程,一组线程束中的各个线程束不需要同时启动。
[0131]
尽管在前几代的nvidia gpu(例如,关于图5a-5c所描述的)中,线程束中的多个线程可以共享寄存器并协作地执行mma,但是本公开的实施例使多个线程束能够协作以执行普通的mma。在一些实施例中,所有线程束中的所有线程共享来自它们的寄存器文件的数据并且将结果写入它们的寄存器文件。在一些实施例中,用于从和/或写入结果中的一个或更多个的位置还包括流式多处理器的共享存储器。在一个示例实施例中,四个线程束,每个32个线程,每个运行在同一流式多处理器的相应分区上,共享寄存器文件和协作执行公共mma的能力。在一些实施例中,状态机电路控制mma的执行,并且在一些其他实施例中,每个线程计算结果矩阵的相应部分。
[0132]
由于多个线程束和大量线程在一个共同的mma上协作,至少一些数据(例如,大量
的b矩阵数据)可以从存储器加载一次并且更广泛地共享(例如,在更大的数量的线程之间)以生成更多数量的结果矩阵元素,从而显著提高存储器带宽利用效率。线程可以直接从它们的寄存器文件中读取到对该数据执行mma运算的处理核心(例如张量核心),并且来自处理核心的结果可以直接从处理核心写入各个线程的寄存器文件。因此,线程越多,共享的寄存器文件就越多。
[0133]
示例gpu架构
[0134]
现在将描述其中并入本技术中公开的高效mma的示例说明性架构。以下信息仅用于说明目的,不应解释为以任何方式进行限制。在排除或不排除所描述的其他特征的情况下,可以任选地结合以下任何特征。
[0135]
图10示出了根据一个实施例的并行处理单元(ppu)1000。在一个实施例中,ppu 1000是在一个或更多个集成电路设备上实现的多线程处理器。ppu 1000是一种延迟隐藏架构,旨在并行处理多个线程。线程(例如,执行线程)是被配置为由ppu 1000执行的一组指令的实例化。在一个实施例中,ppu 1000是被配置为实现图形渲染管线的图形处理单元(gpu)处理三维(3d)图形数据以生成二维(2d)图像数据,用于在诸如液晶显示 (lcd)设备的显示设备上显示。在其他实施例中,ppu 1000可用于执行通用计算。在一些其他实施例中,ppu 100被配置为在深度学习应用或其他高性能计算应用中实现大型神经网络。
[0136]
一个或更多个ppu 1000可配置为加速数千个高性能计算(hpc)、数据中心和机器学习应用程序。ppu 1000可配置为加速众多深度学习系统和应用程序,包括自主车辆平台、深度学习、高精度语音、图像和文本识别系统、智能视频分析、分子模拟、药物发现、疾病诊断、天气预报、大数据分析、天文学、分子动力学模拟、金融建模、机器人、工厂自动化、实时语言翻译、在线搜索优化和个性化用户推荐等。
[0137]
如图10中所示,ppu 1000包括输入/输出(i/o)单元1005、前端单元1015、调度器单元1020、工作分配单元1025、集线器1030、交叉开关 (xbar)1070、一个或更多个通用处理集群(gpc)1050和一个或更多个分区单元1080。lrc,例如上文关于图2描述的,可以位于交叉开关1070 和mpu 1080之间,并且可以配置为支持上述多播。ppu 1000可以通过一个或更多个高速nvlink互连1010连接到主机处理器或其他ppu 1000。 ppu 1000可以通过互连1002连接到主机处理器或其他外围设备。ppu 1000 也可以连接到包括多个存储器设备1004的存储器。在一个实施例中,存储器设备1004可以包括多个动态随机存取存储器(dram)设备。dram设备可配置为高带宽存储器(hbm)子系统,并且在每个设备内堆叠有多个 dram裸芯。
[0138]
nvlink 1010互连使系统能够扩展,并包括与一个或更多个cpu结合的一个或更多个ppu 1000,支持ppu 1000和cpu之间的缓存相干以及 cpu主控。nvlink 1010通过集线器1030将数据和/或命令传输到ppu1000的其他单元,例如一个或更多个复制引擎、视频编码器、视频解码器、电源管理单元等(未明确示出)。nvlink 1010结合图13a和图13b更详细地描述。
[0139]
i/o单元1005被配置为通过互连1002从主处理器(未示出)发送和接收通信(例如,命令、数据等)。i/o单元1005可以通过以下方式与主处理器直接通信互连1002或通过一个或更多个中间设备,例如存储器桥。在一个实施例中,i/o单元1005可以经由互连1002与一个或更多个其他处理器,例如一个或更多个ppu 1000通信。在一个实施例中,i/o单元1005 实现外围组件高速互连(pcie)接口用于通过pcie总线进行通信,并且互连1002是pcie总
线。在替代实施例中,i/o单元1005可以实现用于与外部设备通信的其他类型的众所周知的接口。
[0140]
i/o单元1005对通过互连1002接收的包进行解码。在一个实施例中,包表示被配置为使ppu 1000执行各种操作的命令。i/o单元1005将解码的命令发送到ppu 1000的各种其他单元,如命令可以指定的。例如,一些命令可以被发送到前端单元1015。其他命令可以被发送到集线器1030或 ppu 1000的其他单元,例如一个或更多个复制引擎、视频编码器、视频解码器、电源管理单元等(未明确显示)。换言之,i/o单元1005被配置为在ppu 1000的各种逻辑单元之间路由通信。
[0141]
在一个实施例中,由主机处理器执行的程序在缓冲区中对命令流进行编码,该缓冲区将工作负载提供给ppu 1000以进行处理。工作负载可以包括若干指令和要由那些指令处理的数据。缓冲区是可由主机处理器和 ppu 1000两者访问(例如,读/写)的存储器中的区域。例如,i/o单元1005 可以配置为访问经由在互连1002传输的存储器请求连接到互连1002的系统存储器中的缓冲区。在至少一个实施例中,主机处理器将命令流写入缓冲区,然后将指示命令流开始的指针发送给ppu 1000。前端单元1015接收指向一个或更多个命令流指针。前端单元1015管理一个或更多个流,从流中读取命令并将命令转发到ppu 1000的各个单元。
[0142]
前端单元1015耦合到调度器单元1020,该调度器单元1020配置各种gpc 1050以处理由一个或更多个流定义的任务。调度器单元1020配置为跟踪与调度器单元1020管理的各种任务有关的状态信息。状态可以指示任务被分配给哪个gpc 1050,任务是活跃的还是非活跃的,与任务相关联的优先级等等。调度器单元1020管理在一个或更多个gpc 1050上执行的多个任务。
[0143]
调度器单元1020耦合到工作分配单元1025,该工作分配单元1025 配置为分派任务以在gpc 1050上执行。工作分配单元1025可以跟踪从调度器单元1020接收到的多个调度任务。在一个实施例中,工作分配单元 1015管理每个gpc 1050的待处理任务池和活跃任务池。待处理任务池可以包括多个时隙(例如32个时隙),这些时隙包含分配给要由特定的gpc1050处理的任务。活跃任务池可包括用于由gpc 1050主动处理的任务的多个时隙(例如4个时隙)。随着gpc 1050完成任务的执行,该任务将从 gpc 1050的活动任务池中逐出,并且从待处理任务池中选择其他任务中的一个,并安排其在gpc 1050上执行。如果活跃任务在gpc 1050上已处于空闲状态,例如在等待数据依赖性解决时,则活跃任务可以从gpc 1050中驱逐并返回到待处理任务池,同时选择了待处理任务池中的另一个任务并调度在gpc 1050上执行。
[0144]
工作分配单元1025经由xbar 1070与一个或更多个gpc 1050通信。 xbar 370是互连网络,其将ppu 1000的许多单元耦合到ppu 1000的其他单元。例如,xbar 1070可以配置为将工作分配单元1025耦合到特定的gpc1050。虽然没有明确显示,一个或更多个ppu 1000的其他单元也可以通过集线器1030连接到xbar 1070。
[0145]
任务由调度器单元1020管理,并由工作分配单元1025分配给gpc1050。gpc 1050配置为处理任务并产生结果。结果可以由gpc 1050中的其他任务消耗,通过xbar 1070路由到不同的gpc 1050或存储在存储器 1004中。结果可以通过分区单元1080写到存储器1004中,其实现了用于向存储器1004写入数据或从存储器1004读取数据的存储器接口。结果可
以经由nvlink 1010传输到另一ppu 1000或cpu。在一个实施例中,ppu1000包括u个分区单元1080,其等于耦合到ppu 1000的分离且不同的存储器设备1004的数量。分区单元1080在下文结合图11b更详细地描述。
[0146]
在一个实施例中,主机处理器执行驱动器核心,该驱动程序核心实现应用程序编程接口(api),该应用程序编程接口使在主机处理器上执行的一个或更多个应用程序能够调度操作以在ppu 1000上执行。在一个实施例中,多个计算应用程序由ppu 1000同时执行,并且ppu 1000为多个计算应用程序提供隔离、服务质量(qos)和独立的地址空间。应用程序可以生成指令(例如,api调用),该指令使驱动器核心生成一个或更多个任务以供ppu 1000执行。驱动器核心将任务输出至由ppu 1000处理的一个或更多个流。每个任务可以包括一个或更多个相关线程组,本文中称为线程束(warp)。在一个实施例中,线程束包括可以并行执行的32个相关线程。协作线程可以指代多个线程,包括用于执行任务并且通过共享存储器交换数据的指令。根据一些实施例的线程、协作线程和诸如协作线程阵列 (cta)和协作组阵列(cga)的线程的分层包在美国申请17/691,621中有更详细的描述,其全部内容通过引用整体并入本文。根据一些实施例,共享存储器在美国申请no.17/691,690中进行了描述,该申请的全部内容在此引入作为参考。
[0147]
图11a示出了根据一个实施例的图10的ppu 1000的gpc 1050。如图11a中所示,每个gpc 1050包括用于处理任务的多个硬件单元。在一个实施例中,每个gpc 1050包括管线管理器1110、预光栅操作单元(prop) 1115、光栅引擎1125、工作分配交叉开关(wdx)1180、存储器管理单元 (mmu)1190和一个或更多个数据处理集群(dpc)1120。应当理解,图 11a的gpc 1050可以包括代替图11a中所示的单元或除了图11a中所示的单元之外的其他硬件单元。
[0148]
在一个实施例中,gpc 1050的操作由管线管理器1110控制。管线管理器1110管理一个或更多个dpc 1120的配置,以处理分配给gpc 1050 的任务。在一个实施例中,管线管理器1110可以配置一个或更多个dpc1120中的至少一个以实现图形渲染管线的至少一部分、神经网络和/或计算管线。例如,关于图形渲染管线,dpc 1120可以配置为在可编程流式多处理器(sm)1140上执行顶点着色器程序。管线管理器1110可以也配置为将从工作分配单元1025接收的分组路由到gpc 1050内的适当逻辑单元。例如,可以将一些分组路由到prop 1115和/或光栅引擎1125中的固定功能硬件单元,而可以将其他分组路由到dpc 1120以由图元引擎1135或 sm 1140进行处理。
[0149]
prop单元1115配置为将由光栅引擎1125和dpc 1120生成的数据路由到光栅操作(rop)单元,结合图11b更详细地描述。prop单元1115 可以也配置为执行用于颜色混合的优化、组织像素数据、执行地址转换等等。
[0150]
包括在gpc 1050中的每个dpc 1120包括m管线控制器(mpc) 1130、图元引擎1135和一个或更多个sm 1140。mpc 1130控制dpc 1120 的操作,将从管线管理器1110接收的分组路由到dpc 1120中的适当单元。例如,将与顶点相关联的分组可以路由到图元引擎1135,图元引擎1135配置为从存储器1004中获取与顶点关联的顶点属性。相反地,可以将与着色器程序相关联的分组发送到sm 1140。
[0151]
sm 1140包括可编程流式处理器,其配置为处理由多个线程表示的任务。每个sm 1140是多线程的并且配置为同时执行来自特定线程组的多个线程(例如32个线程)。在一个
实施例中,sm 1140实现simd(单指令、多数据)架构,其中将一组线程(例如,线程束)中的每个线程配置为基于相同的指令集来处理不同的数据集。线程组中的所有线程执行相同指令。在另一个实施例中,sm 1140实现simt(单指令、多线程)架构,其中一组线程中的每个线程配置为基于相同指令来处理不同的数据集,但是其中线程组中的各个线程允许在执行期间发散。在一个实施例中,为每个线程束维护程序计数器、调用栈和执行状态,从而当线程束中的线程发散时,实现线程束和线程束内的串行执行之间的并发性。在另一个实施例中,为每个单独的线程维护程序计数器、调用栈和执行状态,从而使得在线程束内和线程束之间的所有线程之间具有相等的并发性。当为每个单独的线程维持执行状态,为了最大化效率可以收敛并并行地执行执行相同指令的线程。下文结合图12a更详细地描述sm 1140。
[0152]
mmu 1190在gpc 1050和分区单元1080之间提供接口。mmu 1190 可以提供虚拟地址到物理地址的转换、存储器保护以及存储器请求的仲裁。在一个实施例中,mmu 1190提供一个或更多个转换后备缓冲区(tlb),用于执行虚拟地址到存储器1004中的物理地址的转换。
[0153]
图11b示出了根据一个实施例的图10的ppu 1000的存储器分区单元1080。如图11b所示,存储器分区单元1080包括光栅操作(rop)单元1150、二级(l2)高速缓存1160和存储器接口1170。存储器接口1170 耦合到存储器1004。存储器接口1170可以实现32、64、128、1024位数据总线,或者类似的实现方式用于高速数据传输。在一个实施例中,ppu1000包括u个存储器接口1170,每对分区单元1080一个存储器接口1170,其中每对分区单元1080连接到对应的存储器设备1004。例如,ppu 1000 可以连接至多达y个存储器设备1004,例如高带宽存储器堆栈或图形双数据速率版本5同步动态随机存取存储器,或其他类型的持久存储。
[0154]
在一个实施例中,存储器接口1170实现hbm2存储器接口,并且y 等于u的一半。在一个实施例中,hbm2存储器堆栈与ppu 1000一起位于相同的物理封装上,与传统的gddr5sdram系统相比,可提供大量功率并节省面积。在一个实施例中,每个hbm2堆栈包括四个存储器管芯,且y=4,hbm2堆栈包括每个管芯两个128位通道,用于总共8个通道和 1024位的数据总线宽度。
[0155]
在一个实施例中,存储器1004支持单错误校正双错误检测(secded) 错误校正码(ecc)以保护数据。ecc为对数据损坏敏感的计算应用程序提供更高的可靠性。在ppu 1000处理非常大的数据集和/或长时间运行应用程序的大规模集群计算环境中,可靠性尤其重要。
[0156]
在一个实施例中,ppu 1000实现了多级存储器层次结构。在一个实施例中,存储器分区单元1080支持统一存储器以为cpu和ppu 1000存储器提供单个统一虚拟地址空间,从而实现虚拟存储器系统之间的数据共享。在一个实施例中,追踪ppu 1000对位于其他处理器上的存储器的访问频率,以确保将存储器页面移动到更频繁地访问页面的ppu 1000的物理存储器。在一个实施例中,nvlink 1010支持地址转换服务,其允许ppu 1000直接访问cpu的页表,并通过ppu 1000提供对cpu存储器的完全访问。
[0157]
在一个实施例中,复制引擎在多个ppu 1000之间或ppu 1000与cpu 之间传输数据。复制引擎可以为未被映射到页表中的地址生成页面错误。存储器分区单元1080然后可以为页面错误提供服务,将地址映射到页表中,之后复制引擎执行传输。在传统系统中,为多个处理器之间的多个复制引擎操作固定(即不可分页)存储器,从而实质上减少了可用存
储器。在硬件页面故障的情况下,可以将地址传递给复制引擎,而无需担心是否驻留存储器页,并且复制过程是透明的。
[0158]
来自存储器1004或其他系统存储器的数据可以由存储器分区单元 1080获取,并将其存储在l2高速缓存1160中,l2高速缓存1160位于芯片上并且在各种gpc 1050之间共享。如图所示,每个存储器分区单元1080 包括与对应的存储器设备1004相关联的l2高速缓存1160的一部分。然后在gpc 1050内的各个单元中可以实现较低级别的高速缓存。例如,sm1140中的每个可以实现一级(l1)高速缓存。l1高速缓存是专用于特定 sm 1140的私有存储器。从l2高速缓存1160中可以获取数据并将其存储在每个l1高速缓存中,用于在sm 1140的功能单元中进行处理。l2高速缓存1160耦合到存储器接口1170和xbar 1070。
[0159]
rop单元1150执行与像素颜色有关的图形光栅操作,诸如颜色压缩、像素混合等。rop单元1150结合光栅引擎1125也实现深度测试,从光栅引擎1125的剔除引擎接收与像素片段相关联的样本位置的深度。针对在与片段关联的样本位置的深度缓冲区中的相应深度测试深度。如果该片段通过了针对该样本位置的该深度测试,则rop单元1150更新深度缓冲区,并将该深度测试的结果发送给光栅引擎1125。将意识到,分区单元1080的数量可以不同于gpc 1050的数量,因此,可以将每个rop单元1150耦合到每个gpc 1050。rop单元1150追踪从不同gpc 1050接收到的包,并且确定rop单元1150生成的结果是否要通过xbar 1070路由到的gpc1050。尽管在图11b中rop单元1150包括在存储器分区单元1080内,但在其他实施例中,rop单元1150可以在存储器分区单元1080之外。例如,rop单元1150可以驻留在gpc 1050或其他单元中。
[0160]
图12a示出了根据一个实施例的图11a的流式多处理器1140。如图 12a所示,sm 1140包括指令高速缓存1205、一个或更多个调度器单元 1210、寄存器文件1220、一个或更多个处理核心1250、一个或更多个特殊功能单元(sfu)1252、一个或更多个加载/存储单元(lsu)1254、互连网络1280、共享存储器/l1高速缓存1270。
[0161]
如上所述,工作分配单元1025调度任务以在ppu 1000的gpc 1050 上执行。任务被分配给gpc 1050内部的特定dpc 1120,并且如果任务与着色器程序相关联,则将该任务分配给sm 1140。调度器单元1210从工作分配单元1025接收任务并管理分配给sm 1140的一个或更多个线程块的指令调度。调度器单元1210调度线程块以作为并行线程的线程束来执行,其中,每个线程块包括至少一个线程束。在一个实施例中,每个线程束包括32个线程。调度器单元1210可以管理多个不同的线程块,将不同的线程块分配给不同的线程束,然后在每个时钟周期内将来自多个不同的协作组的指令分派给各种功能单元(例如,核心1250、sfu 1252和lsu 1254)。
[0162]
协作组阵列(cga)提供用于组织通信线程组的编程模型,其允许开发者表达线程正在通信的粒度,从而能够表达更丰富、更有效的并行分解。协作启动api支持线程块之间的同步以执行并行算法。常规编程模型提供了用于同步协作线程的单一、简单的构造:跨线程块的所有线程的屏障(例如,syncthreads()函数)。但是,程序员经常在小于线程块粒度的情形下来定义线程组,并在所定义的组内进行同步,以实现更高的性能、设计灵活性以及以集合组范围功能接口的形式实现软件重用。
[0163]
协作组阵列使程序员能够以子块(即,小到单个线程)和多块粒度明确定义线程组,并在线程上执行集合操作,例如对协作组进行同步。该编程模型支持跨软件边界的干净
组合,从而库和实用程序功能可以在其本地环境中安全地同步,而不必进行关于收敛的假设。协作组阵列图元使协作并行的新图案成为可能,包括生产者-消费者并行,机会主义并行以及整个线程块网格上的全局同步。根据一些实施例的诸如协作线程阵列 (cta)和协作组阵列(cga)的分层线程组在美国申请no.17/691,621 中更详细地描述,其全部内容通过引用全文并入本文。
[0164]
分派(dispatch)单元1215配置为将指令发送到功能单元中的一个或更多个。在本实施例中,调度器单元1210包括两个分派单元1215,该两个分派单元1215使得来自相同线程束的两个不同指令能够在每个时钟周期被调度。在另一个实施例中,每个调度器单元1210可以包括单个分派单元1215或附加分派单元1215。
[0165]
每个sm 1140包括寄存器文件1220,该寄存器文件1220为sm 1140 的功能单元提供了一组寄存器。在一个实施例中,寄存器文件1220在每个功能单元之间划分,从而为每个功能单元分配寄存器文件1220的专用部分。在另一个实施例中,寄存器文件1220在由sm 1140执行的不同线程束之间划分。寄存器文件1220为连接到功能单元的数据路径的操作数提供临时存储。
[0166]
每个sm 1140包括多个处理核心1250。在一个实施例中,sm 1140 包括大量(例如128个等)不同的处理核心1250。每个核心1250可以包括全管线、单精度、双精度和/或混合精度处理单元,其包括浮点算术逻辑单元和整数算术逻辑单元。在一个实施例中,浮点算术逻辑单元实现用于浮点算术的ieee 754-2008标准。
[0167]
张量核心配置为执行矩阵运算,并且,在一个实施例中,一个或更多个张量核心包括在核心1250中。特别地,张量核心配置为执行深度学习矩阵算术,例如用于神经网络训练和推理的卷积运算。在一个实施例中,每个张量核心在4
×
4矩阵上操作并且执行矩阵乘法和累加运算d=a
×
b+ c,其中a、b、c和d是4
×
4矩阵。
[0168]
在一个实施例中,矩阵乘法输入a和b是16位浮点矩阵,而累加矩阵c和d可以是16位浮点或32位浮点矩阵。张量核心对16位浮点输入数据进行32位浮点累加运算。16位浮点乘法需要64个运算,并得到全精度乘积,然后使用32位浮点加法与其他中间乘积累加起来,以进行4
×4ꢀ×
4矩阵乘法。实际上,张量核心用于执行由这些较小元件构成的更大的二维或更高维度的矩阵运算。api(诸如cuda c++api)公开专门的矩阵加载、矩阵乘法和累加以及矩阵存储操作,以有效地使用来自cuda-c++ 程序的张量核心。在cuda级别,线程束级别接口假定跨越所有32个线程束线程的16
×
16大小的矩阵。
[0169]
在一些实施例中,转置硬件被包括在处理核心1250或另一个功能单元(例如,sfu 1252或lsu 1254)中,并且被配置为生成由对角线存储的矩阵数据和/或从对角线生成原始矩阵和/或转置矩阵。对角线存储的矩阵数据。转置硬件可以在共享存储器1270内部提供给sm 1140的寄存器文件 1220加载路径。
[0170]
在一些实施例中,gmma状态机硬件电路1251操作以将操作数加载到执行mma运算的处理核心的输入。电路1251可以以与关于状态机 702所描述的方式类似的方式操作,以控制一组线程束的协作mma运算,其中各个线程束分别在sm的不同分区上执行。图12b示出了sm电路到四个子分区1291、1292、1293和1294的逻辑划分。
[0171]
在一个示例中,可以从dram中取出对角线存储的矩阵数据并将其存储在共享存储器1270中。当使用对角线存储的矩阵数据执行处理的指令被处理时,设置在共享存储器
1270的路径中的转置硬件并且寄存器文件 1220可以提供原始矩阵、转置矩阵、压缩原始矩阵和/或压缩转置矩阵。直到指令之前的最后存储,可以保持由对角线存储的单个矩阵数据,并且由指令指定的矩阵类型根据需要在寄存器文件1220中生成。
[0172]
每个sm 1140也包括执行特殊功能(例如,属性评估、倒数平方根等)的多个sfu 1252。在一个实施例中,sfu 1252可以包括配置为遍历分层树数据结构的树遍历单元(例如ttu 1143)。在一个实施例中,sfu 1252 可以包括配置为执行纹理映射过滤操作的纹理单元(例如纹理单元1142)。在一个实施例中,纹理单元配置为从存储器1004中加载纹理映射(例如,纹理像素的2d阵列)和采样纹理映射,以产生采样的纹理值以供由sm1140执行的着色器程序使用。在一个实施例中,将纹理映射存储在共享存储器/l1高速缓存1170中。纹理单元使用mip映射(mip-maps)(例如,细节级别不同的纹理映射)来实现纹理操作(诸如过滤操作)。在一个实施例中,每个sm 1140包括两个纹理单元。
[0173]
每个sm 1140也包括实现共享存储器/l1高速缓存1270与寄存器文件1220之间的加载和存储操作的多个lsu 1254。每个sm 1140包括互连网络1280,其将每个功能单元连接到寄存器文件1220,并且lsu 1254连接到寄存器文件1220、共享存储器/l1高速缓存1270。在一个实施例中,互连网络1280是交叉开关,其可以配置为将任何功能单元连接到寄存器文件1220中的任何寄存器,并且将lsu 1254连接到寄存器文件1220和共享存储器/l1高速缓存1270中的存储器位置。
[0174]
共享存储器/l1高速缓存1270是片上存储器的阵列,其允许sm 1140 与图元引擎1135之间以及sm 1140中的线程之间的数据存储和通信。在一个实施例中,共享存储器/l1高速缓存1270包括128kb的存储容量,并且位于从sm 1140到分区单元1180的路径中。共享存储器/l1高速缓存 1270可以用于高速缓存读取和写入。共享存储器/l1高速缓存1270、l2高速缓存1160和存储器中1004的一个或更多个是后备存储。
[0175]
将数据高速缓存和共享存储器功能组合到单个存储器块中,为两种类型的存储器访问提供了最佳的全局性能。容量由不使用共享存储器的程序使用或将其用作高速缓存。例如,如果共享存储器配置为使用一半容量,并且纹理和加载/存储操作可以使用剩余容量。在共享存储器/l1高速缓存 1270内的集成使共享存储器/l1高速缓存1270能够用作用于流传输数据的高吞吐量管线,同时提供对频繁重用的数据的高带宽和低延迟访问。
[0176]
在本公开的上下文中,sm或“流式多处理器”是指按照授予诺德奎斯特(nordquist)的usp7,447,873中所述架构的处理器,包括对其的改进和进展,并且例如在多代nvidia gpu中实现。例如,sm可以包括多个处理引擎或核心,这些处理引擎或核心被配置为同时执行多个线程,这些线程排列在多个单指令多数据(simd)组(例如,线程束)中,其中每个线程在同一个simd组在不同的输入对象上执行包括一系列指令的相同数据处理程序,并且在同一个simd组中的不同线程使用不同的处理引擎或核心来执行。sm通常还可以提供具有多个通道的本地寄存器文件,其中每个处理引擎或核心被配置为访问通道的不同子集;指令发布逻辑,被配置为选择simd组之一并将相同数据处理程序的指令之一并行发布到多个处理引擎中的每一个,其中每个处理引擎与每个其他处理引擎并行地执行相同指令,每个其他处理引擎使用可对其访问的本地寄存器文件通道的子集。sm通常还包括被配置为启动一个或更多个simd组的执行的核心接口逻辑。如图所示,此类sm已被构建为提供快速的本地共享存储器,从而在sm上执行的cta的所有线程之间实现数据共享/重用和同
nvlink 1010高速通信链路可以实现为物理nvlink互连或使用与nvlink 1010相同的协议的片上或片上互连。
[0184]
在本说明书的上下文中,单个(single)半导体平台可以指代制造在管芯或芯片上的唯一的统一的基于半导体的集成电路。应该注意的是,术语单个半导体平台也可以指具有增强的连接性的多芯片模块,其模拟芯片上的操作并且相对于利用传统总线实现做出实质性改进。当然,各种电路或器件也可以根据用户的需要单独放置或以半导体平台的各种组合放置。或者,并行处理模块1325可以实现为电路板基板,并且每个ppu 1000和 /或存储器1004可以是封装器件。在一个实施例中,cpu 1330、开关1355 和并行处理模块1325位于单个半导体平台上。
[0185]
在一个实施例中,每个nvlink 1010的信令速率为20到25吉比特/ 秒并且每个ppu 1000包括六个nvlink 1010接口(如图13a所示,每个 ppu 1000包括五个nvlink 1010接口)。每个nvlink 1010在每个方向上提供25gb/秒的数据传输速率,六个链路提供1000gb/秒。当cpu 1330 还包括一个或更多个nvlink 1010接口时,nvlink 1010可专门用于如图 13a所示的ppu到ppu通信,或ppu到ppu和ppu到cpu的某种组合。
[0186]
在一个实施例中,nvlink 1010允许从cpu 1330直接加载/存储/原子访问每个ppu 1000的存储器1004。在一个实施例中,nvlink 1010支持一致性操作,允许从存储器1004读取的数据存储在高速缓存中cpu 1330 的层次结构,减少cpu 1330的高速缓存访问延迟。在一个实施例中, nvlink 1010包括对地址转换服务(ats)的支持,允许ppu 1000直接访问cpu 1330内的页表。一个或更多个nvlinks 1010也可以配置为在低功率模式下运行。
[0187]
图13b示出了示例性系统1365,其中可以实现各种先前实施例的各种架构和/或功能。示例性系统1365可以被配置为实现本技术中公开的方法(例如,图1a-1c、2、6或11a中的tmau)。
[0188]
如图所示,提供了一种系统1365,包括至少一个中央处理单元1330,该中央处理单元1330连接到通信总线1375。通信总线1375可以使用任何合适的协议来实现,例如pci(外围组件互连)、pci-express、agp(加速图形端口)、hypertransport或任何其他总线或点对点通信协议。系统1365 还包括主存储器1340。控制逻辑(软件)和数据存储在可以采取随机存取存储器(ram)形式的主存储器1340中。
[0189]
系统1365还包括输入设备1360、并行处理系统1325和显示设备 1345,例如传统的crt(阴极射线管)、lcd(液晶显示器)、led(发光二极管)、等离子显示器等。可以从输入设备1360接收用户输入,例如键盘、鼠标、触摸板、麦克风等。前述模块和/或设备中的每一个甚至可以位于单个半导体平台上以形成系统1365。或者,根据用户的需要,各种模块也可以单独或以半导体平台的各种组合放置。
[0190]
此外,系统1365可以耦合到网络(例如,电信网络、局域网(lan)、无线网络、广域网(wan)如互联网、对等网络、有线网络或等)通过网络接口1335用于通信目的。
[0191]
系统1365还可以包括辅助存储器(未示出)。辅助存储器包括例如硬盘驱动器和/或可移动存储驱动器,代表软盘驱动器、磁带驱动器、压缩盘驱动器、数字通用磁盘(dvd)驱动器、记录设备、通用串行总线(usb) 闪存。可移动存储驱动器以众所周知的方式从可移动存储单元读取和/或写入到可移动存储单元。
[0192]
计算机程序或计算机控制逻辑算法可以存储在主存储器1340和/或辅助存储器
中。这样的计算机程序在被执行时使系统1365能够执行各种功能。存储器1340、存储器和/或任何其他存储器是计算机可读介质的可能示例。
[0193]
各种先前附图的架构和/或功能可以在通用计算机系统、电路板系统、专用于娱乐目的的游戏控制台系统、专用系统和/或任何其他所需系统的上下文中实现。例如,系统1365可以采用台式计算机、膝上型计算机、平板计算机、服务器、超级计算机、智能电话(例如,无线手持设备)、个人数字助理(pda)、数码相机、车辆、头戴式显示器、手持电子设备、移动电话设备、电视、工作站、游戏机、嵌入式系统和/或任何其他类型的逻辑。
[0194]
应用程序可以通过由诸如cpu之类的主处理器执行的应用来实现。在一个实施例中,设备驱动程序可以实现应用编程接口(api),该api定义了可以由应用程序使用的各种功能,以便生成用于显示的图形数据。设备驱动程序是一种软件程序,包括控制ppu 1000操作的多个指令。api为程序员提供了一种抽象,使程序员能够利用诸如ppu 1000之类的专用图形硬件来生成图形数据无需程序员使用ppu 1000的特定指令集。应用程序可以包括一个api调用,该api调用被路由到ppu 1000的设备驱动程序。设备驱动程序解释api调用并执行各种操作以响应api称呼。在某些情况下,设备驱动程序可以通过在cpu上执行指令来执行操作。在其他情况下,设备驱动程序可以至少部分地通过利用cpu和ppu 1000之间的输入/输出接口在ppu 1000上启动操作来执行操作。在一个实施例中,设备驱动程序被配置为实现图形处理管线1400利用ppu 1000的硬件。
[0195]
可以在ppu 1000内执行各种程序,以实现应用程序处理的各个阶段。例如,设备驱动程序可以启动ppu 1000上的内核以在一个sm 1140(或更多个sm 1140)上执行一个阶段的处理。设备驱动程序(或由ppu 1000执行的初始内核)也可以启动ppu 1000上的其他内核以执行处理的其他阶段。如果应用程序处理包括图形处理管线,则图形处理管线的一些阶段可以在固定单元硬件上实现,例如在ppu 1000内实现的光栅化器或数据组装器。应该理解的是,从一个在由sm 1140上的后续内核处理之前,内核可以由一个或更多个介入的固定功能硬件单元处理。
[0196]
此处引用的所有专利、专利申请和出版物均以引用方式并入以用于所有目的,如同明确阐述一样。
[0197]
尽管本发明已经结合目前被认为是最实用和优选的实施例进行了描述,但应理解本发明不限于所公开的实施例,相反,旨在涵盖各种包括在所附权利要求的精神和范围内的修改和等效布置。

技术特征:
1.一种处理器,包括:多个核心,每个核心包括数据路径;以及工作分配器电路,其被配置为将多个线程束分配给所述多个核心,所述多个线程束包括多个线程,所述多个线程协作以执行矩阵乘法和累加mma指令以基于输入矩阵确定结果矩阵,其中每个核心执行所述mma指令以在所述每个核心的所述数据路径的输出处生成所述结果矩阵的一个或更多个元素。2.根据权利要求1所述的处理器,还包括寄存器文件和互连交换机,所述互连交换机被配置为将所述输入矩阵的操作数从任何所述多个线程束的任何线程的所述寄存器文件的一部分复制到所述多个核心中的任何核心的所述数据路径的输入。3.根据权利要求1所述的处理器,其中所述处理器还包括共享存储器和到外部存储器的接口,并且所述互连交换机还被配置为将所述输入矩阵的操作数从所述共享存储器的一部分复制到所述多个核心中的任何核心的所述数据路径的输入。4.根据权利要求1所述的处理器,还包括状态机电路,所述状态机电路被配置为协调所述mma指令的执行以生成所述结果矩阵。5.根据权利要求4所述的处理器,还包括寄存器文件、共享存储器和互连交换机,并且其中所述状态机电路还被配置为将所述输入矩阵的操作数从所述共享存储器的一部分或任何所述多个线程束的任何线程的所述寄存器文件的一部分中的至少一个复制到所述多个核心中的任何核心的所述数据路径的输入。6.根据权利要求5所述的处理器,其中所述状态机电路还被配置为响应于所述多个线程束中的所有线程束满足同步屏障而启动所述输入矩阵的操作数的所述复制。7.根据权利要求6所述的处理器,其中所述状态机电路还被配置为向所述多个线程束中的所有线程束发送所述mma指令的结束信号。8.根据权利要求7所述的处理器,其中所述状态机电路还被配置为更新第二同步屏障以向所述多个线程束中的所有线程束发送所述mma指令的结束信号。9.根据权利要求7所述的处理器,其中所述状态机电路还被配置为在所述启动所述输入矩阵的操作数的所述复制和向所述多个线程束发送所述mma指令的结束信号之间,更新一个或更多个附加的同步屏障,以向所述多个线程束发送计算所述结果矩阵的相应部分的完成信号。10.根据权利要求6所述的处理器,其中由所述多个线程束执行的指令流包括所述mma指令和在所述指令流中布置在所述mma指令之后的mma同步指令,所述mma同步指令向所述多个线程束指示一个或更多个先前mma指令的完成。11.根据权利要求1所述的处理器,包括多个流式多处理器,其中所述多个流式多处理器中的流式多处理器包括所述多个核心和所述工作分配器电路。12.根据权利要求1所述的处理器,其中为了计算所述结果矩阵的特定行的元素,输入矩阵的相同部分通过将每次读取操作从共享存储器获得的所述相同部分的数据提供给所述多个核心中的一个或更多个核心,而被提供给所述一个或更多个核心。13.根据权利要求12所述的处理器,其中所述计算使用从相应共享存储器中读取的第一输入矩阵和读取的第二输入矩阵的部分,以及相应寄存器文件中的第三输入矩阵。
14.根据权利要求13所述的处理器,其中所述结果矩阵的相应部分被写入每个线程的所述相应寄存器文件。15.根据权利要求12所述的处理器,其中所述读取的第一输入矩阵和所述读取的第二输入矩阵的部分随后被加载到所述多个核心的所述数据路径的输入,而不被存储在所述多个线程束的寄存器文件中。16.根据权利要求12所述的处理器,其中读取所述第一输入矩阵或所述第二输入矩阵的指令包括识别所述存储器中的数据的位置和/或布局的描述符,并且其中所述处理器还包括状态机电路,所述状态机电路被配置为根据描述符获得所述第一输入矩阵或所述第二输入矩阵。17.根据权利要求12所述的处理器,其中所述处理器还包括转置电路,所述转置电路被配置为在所述数据被写入所述共享存储器和/或寄存器文件之前转置从所述存储器读取的所述数据。18.根据权利要求12所述的处理器,其中指令的序列还使得要被读取的所述第一输入矩阵或要被读取的第二输入矩阵的相应不同部分中的至少一个被多播到相应核心。19.根据权利要求1所述的处理器,其中所述数据路径包括张量核心。20.一种方法,包括:接收包括矩阵乘法和累加mma指令的指令流,以基于输入矩阵确定结果矩阵;将多个线程束分配给多个核心,每个核心包括数据路径,每个线程束包括执行来自所述指令流的指令的多个线程;以及由所述多个核心中的每个核心执行所述mma指令,以在所述每个核心的所述数据路径的输出处生成所述结果矩阵的一个或更多个元素。21.根据权利要求19所述的方法,还包括由状态机电路协调所述mma指令的所述执行以生成所述结果矩阵。22.根据权利要求20所述的方法,还包括由所述状态机电路将所述输入矩阵的操作数从任何所述多个线程束的任何线程的共享存储器的一部分或任何所述多个线程束的任何线程的寄存器的一部分中的至少一个复制到所述多个核心中的任何核心的所述数据路径的输入。

技术总结
本公开涉及具有一组线程束的高效矩阵乘法和加法。本说明书描述了在图形处理单元(GPU)和其他处理器中实现矩阵乘法和加法(MMA)运算的技术。该实施方式通过使每个线程能够共享其相应的寄存器文件以供与该组线程束中的其他线程相关联的数据路径访问,为多个线程束的线程提供在生成结果矩阵中的协作。状态机电路控制在异步计算单元上执行的线程束之间的MMA执行。一组MMA(GMMA)指令提供要作为参数提供的描述符,其中该描述符可以包括关于要加载到共享存储器和/或数据路径中的输入数据的大小和格式的信息。据的大小和格式的信息。据的大小和格式的信息。


技术研发人员:J
受保护的技术使用者:辉达公司
技术研发日:2022.09.21
技术公布日:2023/9/20
版权声明

本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

航空之家 https://www.aerohome.com.cn/

航空商城 https://mall.aerohome.com.cn/

航空资讯 https://news.aerohome.com.cn/

分享:

扫一扫在手机阅读、分享本文

评论

相关推荐