用于高效访问多维数据结构和/或其他大型数据块的方法和装置与流程
未命名
09-21
阅读:88
评论:0

用于高效访问多维数据结构和/或其他大型数据块的方法和装置
1.相关申请的交叉引用
2.本技术涉及以下共同转让的共同未决的美国专利申请,将这些专利申请中的每一个的全部内容通过引用合并:
3.2022年3月10日提交的题目为“协作组阵列(cooperative group arrays)”的美国申请no.17/691,621;
4.2022年3月10日提交的题目为“分布式共享存储器(distributed shared memory)”的美国申请no.17/691,690;
5.2022年3月10日提交的题目为“虚拟化处理器中的硬件处理资源(virtualizing hardware processing resources in a processor)”的美国申请no.17/691,759;
6.2022年3月10日提交的题目为“跨多个计算引擎的程序化控制的数据多播(programmatically controlled data multicasting across multiple compute engines)”的美国申请no.17/691,288;
7.2022年3月10日提交的题目为“具有异步事务支持的硬件加速的同步(hardware accelerated synchronization with asynchronous transaction support)”的美国申请no.17/691,296;
8.2022年3月10日提交的题目为“处理器和存储器中的快速数据同步(fast data synchronization in processors and memory)”的美国申请no.17/691,303;
9.2022年3月10日提交的题目为“高效矩阵乘法和与一组线程束相加(efficient matrix multiply and add with a group of warps)”的美国申请no.17/691,406;
10.2022年3月10日提交的题目为“用于处理器中的线程组的可扩展负载均衡的技术(techniques for scalable load balancing of thread groups in a processor)”的美国专利申请no.17/691,872;
11.2022年3月10日提交的题目为“不需要硬件复位的处理组件之间的执行软件的灵活迁移(flexible migration of executing software between processing components without need for hardware reset)”的美国申请no.17/691,808;以及
12.2022年3月10日提交的题目为“用于高效访问多维数据结构和/或其他大数据块的方法和装置(method and apparatus for efficient access to multidimensional data structures and/or other large data blocks)”的美国专利申请no.17/691,422。
技术领域
13.该技术通常涉及提高处理器的处理效率和减少处理器的功耗。更具体地,本文的技术涉及用于由并行处理器处理存储器访问数据块的专用电路。
背景技术:
14.大规模并行高性能计算处理系统——包含许多并行操作的计算处理核心的系
for efficiently transfer data to a processor)”的美国专利no.11,080,051号中描述的诸如cuda ldgsts(异步全局到共享存储器复制)指令之类的指令,通过分路l1高速缓存和/或寄存器文件并将从主存储器检索的数据直接写入到共享存储器,改善了与将数据从全局存储器传输到nvidia架构中的流式多处理器(sm)的共享存储器的数据移动相关的延迟。然而,需要进一步改进用于将数据移入和移出共享存储器的方法,以更有效地管理存储器访问需求并提高整体数据处理效率,同时仍能在人工智能(ai)、深度学习(dl)等领域实现更高的数学吞吐量以及可以有利地利用并行执行的其他应用程序。
附图说明
21.以下对示例性非限制性说明性实施例的详细描述应结合附图阅读:
22.图1示出了根据一些示例实施例的包括并行处理单元的gpu架构,其中每个流式多处理器被耦合到张量存储器访问单元(“tmau”),其为存储器地址计算和移动多维数据结构或数据块进/出几种类型的存储器提供专门的硬件电路。
23.图2示出了根据一些示例实施例的当从外部存储器加载数据块到共享存储器时,在流式多处理器、耦合到流式多处理器的张量存储器访问单元电路、外部存储器和流式多处理器的本地共享存储器之间的交互。
24.图3a和3b(统称为图3)示出了根据一些示例实施例的可应用于存储在外部存储器中并且由张量存储器访问单元访问的张量寻址的张量参数。
25.图4a和4b(统称为图4)示出了根据一些示例实施例的诸如出界(out-of-bounds)条件的各方面,所述出界条件是当从外部存储器读取张量数据时,由张量存储器访问单元可以检测到的出界。
26.图5a和5b(统称为图5)示出了根据一些示例实施例的用于访问数据的示例描述符。
27.图6是根据一些示例实施例的张量存储器访问单元中的存储器访问请求处理管线的示意图。
28.图7a示出了根据一些示例实施例的影响张量存储器访问单元读取张量数据的示例参数。
29.图7b示出了根据一些实施例的张量存储器访问单元处理的示例高级伪代码。
30.图7c示出了表示流式多处理器使用tmau来加载和存储用于gemm(通用矩阵乘法)计算的张量数据的示例高级伪代码。
31.图8a-8k(统称为图8)示出了根据一些示例实施例的示例数据加载模式的使用,特别是图块(tile)模式和图像到列模式。
32.图9a-9d(统称为图9)示出了根据一些示例实施例的可由张量存储器访问单元处理的数据混杂(swizzling)的示例。
33.图10示出了根据一些实施例的gpu的示例并行处理单元。
34.图11a示出了根据一些实施例的图10的并行处理单元内的示例通用处理集群(gpc),其中通用处理集群中的每个流式多处理器被耦合到张量存储器访问单元。
35.图11b示出了图10的并行处理单元的示例存储器分区单元。
36.图12示出了图11a的示例流式多处理器。
37.图13a是使用图10的并行处理单元(ppu)实现的处理系统的示例概念图。
38.图13b是示例性系统的框图,其中可以实现各种先前实施例的各种架构和/或功能。
具体实施方式
39.示例非限制性实施例的详细描述
40.本公开中描述的示例非限制性技术在具有紧密耦合的专用硬件电路的并行处理系统中提供流式多处理器(sm)或其他并行处理器核心,用于将数据移入和移出存储器。例如,所公开的技术使每个并行处理器核心被紧密耦合到张量存储器访问单元(tmau)硬件电路,用于在并行处理器核心的共享存储器和外部存储器(例如并行处理系统的存储器全局存储器)之间移动大数据块。
41.许多计算应用程序需要在全局存储器和并行处理器核心(例如sm)的计算核心之间进行非常大(例如,兆字节或甚至千兆字节)的数据移动。通常情况下,以具有非顺序访问模式的复杂多维结构的方式排列在全局存储器中的数据必须在被sm使用之前传输到sm本地的共享存储器或其他存储器(smem)。例如,当一个或更多个sm上运行的多个线程执行两个非常大的矩阵(例如在dl应用等中使用的矩阵)的乘法时,这两个矩阵的数据需要在一个或更多个sm可以对数据进行操作之前从全局存储器复制到该一个或更多个sm的共享存储器中。
42.访问全局存储器中的这种多维结构通常需要大量的计算开销。这种计算开销的原因可能包括复杂的地址计算、出界条件的处理、解决smem读/写存储库冲突等。这种类型的开销可能会对在sm上执行的内核的性能产生负面影响并引发重要的软件开发成本。这种计算开销在dl等应用程序中通常很明显,例如在卷积内核中。典型的卷积内核访问多维数据结构(可以表示张量或其他信息集的矩阵),这些数据结构可以根据全局存储器中不同类型的标准布局进行排列。dl内核中与地址计算相关的性能损失可能归因于寄存器文件(rf)带宽消耗、额外的rf容量需求、出界条件处理、有限指令高速缓存容量、指令调度挑战等。各种dl网络上的性能试验显示平均性能损失超过10%。此外,在dl软件成本方面,一些开发人员估计高达90%的开发人员时间用于编写和测试数据访问代码。开发人员时间花在指令调度的复杂性、寄存器分配的挑战、为不同的图块大小定制内核的需要等方面上。与内核相关的地址计算复杂度会影响内核的功能正确性和性能优化。
43.为了解决概述的问题,本公开的示例实施例提供耦合到sm的专用存储器访问单元。对于其中专用存储器访问单元包括有助于张量或其他多维数据结构数据移动的能力的一些实施例,它也可以被称为张量存储器访问单元(tmau)。然而,tmau可以移动的数据的类型不限于张量数据,使用该数据的目标计算核心不必是张量核心,而可以是任何类型的处理核心。
44.tmau的关键设计目标是为耦合的一个或更多个sm提供高效的数据传输机制,以在存储器位置之间移动大量数据,例如,全局存储器位置和共享存储器位置。通过将大量相关数据访问操作从一个或更多个sm上运行的内核卸载到tmau,tmau可以使一个或更多个sm在计算上更加高效。与依赖于每个线程加载/存储指令(操作数据量相对较小)的内核不同,tmau被配置为接受对更大数据块或其他数据结构的请求。通过向tmau发出一个请求,可以
传输多个千字节或兆字节的数据供一个或更多个sm后续使用。另外,尽管对tmau的请求可以由运行在单个sm上的单个线程发出,但获取的数据可以由执行在该sm上或多个sm上的多个线程使用。
45.根据本公开中描述的技术的装置可以以比依靠sm计算要复制的数据中的存储器地址并跟踪复制大量数据块的进度的技术更快的速率馈送sm核心数学单元。示例非限制性实施例提供导致数据传输和存储器访问开销减少的块数据传输技术。减少的数据传输和存储器访问开销可以显著降低多处理器(例如,sm级别)的能耗并提高处理效率。打个比方,考虑一位负责在餐厅烤牛排和排骨的流水线厨师。该流水线厨师可以非常快速地烧烤和摆盘牛排和排骨。但在繁忙的餐厅里,流水线厨师通常也不负责离开他们的工作岗位以从餐厅的大型步入式冰箱中取肉、将肉切成份、去除肉中的脂肪等。相反,流水线厨师依靠他们的学徒(助理)厨师做这项工作。然后,流水线厨师可以专注于只有他们能做的事情;根据客户的订单将牛排和排骨烤至完美。
46.上面提到的ldgsts指令通过将数据从全局存储器移动到sm的共享存储器并且没有对l1高速缓存和/或寄存器文件的中间写入来减少数据访问延迟。然而,使用该指令,大型数据块的移动需要sm执行大量复杂的地址计算,然后才能向存储器系统发出存储器访问请求。与sm执行的ldgsts指令相比,tmau使sm能够通过一条指令异步传输更大的数据块,还能将相关地址计算等从sm上的线程卸载到tmau。此外,与通过ldgsts指令或其他常规加载/存储指令完成的每个并行执行线程发出其自己的指令以从全局存储器获取数据的小部分(例如,图块)相比,tmau启用了线程组中的单个线程,例如协作线程阵列(“cta”),以发出指令以获取数据以供组中的所有其他线程访问。
47.tmau可以被认为类似于直接存储器访问(dma)引擎,因为tmau可以独立于请求处理器来处理对全局存储器的读取和写入。关键的区别在于tmau能够了解和遍历多维数据布局,而dma通常处理线性排列的数据。此外,在一个示例实施例中,tmau不要求请求处理器在对存储器访问的请求中包括存储器地址。tmau可以替代地基于由请求处理核心提供的多维结构的坐标生成适当的存储器地址。
48.在一个实施例中,每个tmau被紧密耦合到sm,并且在一些实施例中,每个tmau以一对一的关系耦合到相应的sm。与特定sm的紧密耦合可以使tmau能够以更少的争用更有效地服务存储器访问请求,而不是它必须服务来自多个处理器的请求。与从驱动程序接收命令的dma引擎相比,每个tmau从耦合的sm接收存储器访问请求。在一些实施例中,与仅限于从全局存储器读取的dma引擎相比,tmau可以将数据从全局存储器复制到共享存储器、从共享存储器复制到全局存储器、从全局存储器源地址复制到全局存储器目标地址和/或从共享(本地)存储器源地址到共享(本地)存储器目标地址。在共享存储器内复制时,耦合到第一sm的tmau可以在第一sm的共享/本地存储器和gpu中任何其他sm的共享/本地存储器之间移动数据。例如,在一个实施例中tmau可以将数据从第一sm本地的分布式共享存储器复制到另一sm本地的分布式共享存储器。
49.tmau还可以包括检测超出张量边界的数据读取的能力。在一些实施例中,与sm上的每个线程从全局存储器加载数据量的技术相反,tmau可以为耦合的sm中的任意的线程数量或线程组加载数据。此外,响应于来自请求sm的对数据块的单个请求,tmau能够生成多个请求,每个请求针对所请求块的相应(不同)部分。
50.在另一个实施例中,单个tmau可以服务多个sm,其中每个sm可以向单个tmau发送独立的请求。在该实施例中,以硬件实现的仲裁器可以操作以接受来自多个sm的请求并将请求连续地转发到单个tmau。单个tmau通过将数据传输到相应请求sm的本地共享存储器来服务从不同sm接收到的请求。
51.包括tmau电路的并行处理系统
52.图1示意性地示出了根据一些非限制性实施例的并行处理单元,例如gpu。如图1所示,gpu 100包括多个处理器。在一些实施例中,多个处理器包括多核处理器,例如流式多处理器(sm)、102a
…
102n(统称为102)。每个sm 102包括多个处理核心,例如功能单元104a
…
104m(统称为104)。在一些实施例中,这些功能单元104可以执行各种不同类型的计算,例如浮点32位精度算术、浮点16位精度算术、不同精度的整数算术等。此外,这些功能单元104中的一些可以包括张量核,这些张量核被设计为在n
×
n矩阵上每个时钟周期承载多个gemm,包含用于浮点乘法和加法的浮点值。gpu中的sm数量和sm中功能单元的数量不受限制。sm中的每个功能单元104可以访问该sm的寄存器文件106、l1高速缓存108和该sm的共享/本地存储器110。在一些实施例中,如图1中所示的实施例,l1高速缓存108可以是共享/本地存储器110的一部分。在一些其他实施例中,l1高速缓存和共享存储器110可以彼此分离。此外,在一些实施例中,共享存储器110可以是在其他sm上执行的线程也可以访问的分布式共享存储器(dsmem)布置的一部分。标题为“分布式共享存储器(distributed shared memory)”的美国申请no.17/691,690描述了分布式共享存储器,其全部内容通过引用并入本文。
53.多个sm 102可以通过全局存储器接口114访问gpu 100外部的全局存储器116。全局存储器116可以包括分层高速缓存存储器(例如,l2高速缓存和/或l3高速缓存)和动态随机存取存储器(dram)。在一些示例中,全局存储器116可以包括存储器管理单元(mmu)、x-bar或分层交叉开关互连网络、存储器分区单元和/或参照图10、11a和11b描述的存储器。
54.每个sm 102中诸如功能单元104的多个核被配置为并行处理多个线程。线程(例如,执行线程)是被配置为由功能单元104在特定数据集上执行的一组指令或内核的实例化。线程块的线程可以并发执行,且多个线程块可以并发执行。在一些实施例中,使用单指令多数据(simd)指令发布技术来支持大量线程的并行执行而未提供多个独立指令单元。在其他实施例中,单指令多线程(simt)技术用于支持大量通用同步线程的并行执行,通过使用被配置为向一组核心发出指令的公共指令单元。
55.每个功能单元104可以经由互连网络连接到高速缓存存储器108、共享存储器110和寄存器文件104,例如,具有一个或更多个读取和/或写入交叉开关的分层交叉开关。共享存储器110和可以是l1高速缓存的高速缓冲存储器108在sm 102的功能单元104附近提供低延迟片上存储器。寄存器文件106可以包括可通过软件分配给多个功能单元104的不同功能单元的数据寄存器和/或由sm 102执行的不同线程束。寄存器文件106为sm上的功能单元104提供临时存储。
56.gpu 100可以支持多个地址空间,包括本地的、共享的和全局的,以支持线程的数据可见性。包括常量和纹理的其他只读地址空间可以被支持。每个线程具有其自己的每个线程的本地或私有存储器,其可以通过寄存器的分配来控制(参见例如美国专利no.8,555,035和美国专利no.7,634,621,其通过引用并入本文,如明确阐述了一样)。
57.相同线程块或不同线程块中的每个线程可以使用分层高速缓存存储器访问全局
存储器116。同一线程块中的每个线程可以访问共享存储器110的分配部分,这可以被认为是按块(per-clock)共享存储器。每个执行线程块可以具有共享存储器110的分配部分。共享存储器110是软件管理的高速缓存,用于从全局存储器加载数据,从而减少执行线程的片外存储器访问次数。软件显式分配和访问共享存储器110。线程块中的线程被同步(例如,在将数据从全局存储器协作加载到共享存储器之后)以避免关键资源使用冲突。
58.当线程块中的多个线程预期使用来自全局存储器116的相同数据时,共享存储器110可用于存储该数据,使得各个线程对全局存储器116对相同数据的请求数为减少。共享存储器110还可用于通过以合并模式从全局存储器116加载和存储数据,然后在共享存储器110中对其重新排序以改进线程对数据的访问,从而避免未合并的存储器访问。
59.在一些例如图1中所示的那些实施例中,在共享存储器110包括l1高速缓存108的情况下,共享存储器可以被称为统一存储器或统一高速缓存。统一高速缓存可以在用于l1高速缓存和共享存储器的同一片上存储器(例如sram)中提供,并包括一种机制,用于分配多少统一存储器专用于l1高速缓存,相比于共享存储器用于每个内核调用。在一些示例中,统一高速缓存还可以包括动态可配置的寄存器文件(例如,寄存器文件106)。有关统一高速缓存系统及其如何配置的更多信息,请参见以下参考文献,这些参考文献通过引用并入本文,如同明确阐述一样:美国专利申请公开号no.2018/0322078;以及2019年5月cuda c编程指南,pg-02829-001_v10.1|https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#shared-memory。
60.多个sm 102a-102n可以通过多个tmau 112a-112n(统称为112)访问全局存储器116。每个sm 102紧密耦合到相应的tmau 112,该tmau112被配置为通过全局存储器接口114访问全局存储器116。在一些实施例中,sm 102和tmau 112之间的紧密耦合是一对一的,并且每个sm具有其自己的专用tmau 112,但实施例不限于此。通过向存储器子系统还有全局存储器116发出请求,每个tmau 112具有对相应紧密耦合的sm 102的共享存储器110和l1高速缓存108的读/写访问。在一些实施例中,tmau112除了对其耦合的sm的共享存储器110的读取/写入访问权限,还有通过向存储器子系统发出请求来对其他sm上的共享存储器的读取和/或写入访问权限。可以被一个sm的tmau用来访问另一个sm上的共享存储器的分布式共享存储器在已通过引用并入的美国申请no.17/691,690中有所描述。此外,tmau可以在大容量全局存储器和可由在一个或更多个sm上执行的协作组阵列(cga)访问的线性共享全局存储器之间传输多维数据结构或其他数据。
61.当在一个或更多个功能单元104上运行的软件需要存储在全局存储器116中的数据时,软件使用从存储器“加载(load)”命令启动线程。从存储器加载命令可以从全局存储器116加载数据并将数据存储在共享存储器110中,使其对所有线程(例如,线程块中的所有线程)可见。数据存入共享存储器后,线程可以多次访问数据。
62.每个tmau 112使相应sm中的处理核心的电路能够继续应用程序内核的数学和其他处理,同时地址计算和存储器访问操作被外包给紧密耦合的专用于地址计算和存储器访问的电路。如下所述,耦合到sm 102并具有其自己的硬件电路以计算存储器地址并读取和写入共享存储器和全局存储器的tmau 112能够通过外包给tmau可以访问任何类型的数据来使耦合的sm 102改进整体应用程序内核性能。在访问通常消耗数百甚至更多时钟周期的大型多维数据结构或数据块的情况下,将此类数据访问外包并异步进行处理sm的能力提供
了特别显著的性能改进。
63.图2示出了根据一些实施例的全局存储器116的sm 102、耦合到sm102的tmau 112、共享存储器110和l2高速缓存202在由运行在sm 102上的线程进行的存储器访问期间的示例交互。
64.当在sm 102上运行的线程需要访问数据块时,sm确定全局存储器中数据块的访问参数,并且在操作204,通过传输单个存储器访问请求来命令tmau 112,获取数据块。需要从sm提供给tmau的访问参数的类型可以基于所请求的数据块是否是张量而不同,如下文详细描述的。如下文更详细描述的,对非张量块数据的请求,除了所请求数据的全局存储器地址和共享存储器地址之外,还可以包括要加载的块的大小。对张量数据的请求包括指向张量描述符的指针、与被请求的块相关联的位置坐标以及共享存储器地址。
65.在一些情况下,来自sm的请求可以请求大小大于可以通过单个加载/存储请求从全局存储器请求和/或获得的数据。例如,存储器子系统可能只处理最大为一个l2高速缓存行的大小的请求。因此,响应于从sm接收到的请求大量数据(大于对存储器子系统的单个请求所允许的最大大小的数据结构或块)的单个存储器访问请求,tmau 112形成并发出多个存储器访问请求以获取请求的全部数据。tmau 112与发出请求的sm 102异步操作,并继续在操作206生成多个存储器访问请求,每个访问请求对于所请求的数据中的相应子块具有相应不同的地址。多个存储器访问请求从tmau 112传输到l2高速缓存202。
66.操作208表示来自l2高速缓存202(或全局存储器)的对由操作206发送的多个存储器访问请求中的每一个的响应。子块可以在操作210中和/或由tmau 112在操作212中写入到共享存储器110。操作212和214可以提供同步请求sm 102和数据请求的完成状态。例如,在将每个子块写入共享存储器时,tmau可以递增计数器。在一些实施例中,从tmau产生的每个子块请求包括共享存储器中的计数器地址,并且计数器的更新(递增)可以由共享存储器执行。sm可以监视计数器以确定何时将整个请求的数据块写入共享存储器。在一些实施例中,从sm发送的请求包括地址计数器地址,并且sm包括专用于监控计数器同步的硬件。
67.在操作206发出对数据的存储器访问请求和随后在操作214与写入共享存储器的数据同步之间,可能经过许多时钟周期。特别是对于大量数据的请求,这个间隔可能是几千个时钟周期。然而,由于sm 102可以在单个请求204中向tmau 112请求整个数据块,然后继续处理指令,同时tmau 112异步且独立于sm 112,通过向全局存储器(例如,通过l2高速缓存202)发出一个或更多个请求来获取数据,可以提高sm的处理效率。通过将获得数据结构或块的大量数据所需的大量地址计算以及大量数据的各个子块的加载和存储的相关坐标委托给tmau中的硬件,sm的功耗可以也会减少。
68.与本公开的实施例相比,当使用上述ldgsts指令时,sm,或者更具体地是各个线程,计算要加载的每个子块的地址,并且将各个指令直接发布到全局存储器(例如,通过l2 202)。sm然后必须自身与相应子块的共享存储器110同步。由于每个线程针对每个数据块发出相应的请求,该请求被限制为由存储器系统处理的请求的最大大小,因此可以将大量请求从sm传输到存储器子系统。大量请求的产生,以及关于各个线程请求的每个块的同步sm和共享存储器在处理方面以及在功耗方面都带来了显著的开销。与ldgsts指令和其他先前技术的方式相比,这里公开的实施例使sm上的线程组中的一个线程能够从tmau请求组中所有线程的全部数据,并且还启用线程继续与tmau一起异步处理其任务,直到由tmau完成请
求的传输。
69.访问张量
70.尽管tmau 112可用于访问任何类型的数据块布置,但在一些实施例中,tmau包括特定于张量的能力。例如,在诸如深度学习(dl)的应用中,大量数据可能存储在张量中。张量可以是任何维度,从诸如一维数组的一维张量到诸如n维数组的n维张量,其中n是正数。虽然在一些实施例中,仅支持维度1-5的张量,但根据一些其他实施例,张量的大小和维度仅受存储器限制,并且tmau 112不对可以由sm作为块来请求的张量的大小和/或维度施加限制。
71.tmau电路使内核开发人员能够通过使用在计算上比存储器地址更简单的坐标(例如,二维张量中的(x,y))来访问张量内的子块。在向外部存储器发出请求之前,tmau会将坐标转换为一个或更多个相应的存储器地址。
72.图3a-3b(统称为图3)示出了可以由sm用以访问张量数据的参数。图3a示出了存储在全局存储器中的三维张量302。张量302可以由在计算机系统中的cpu、gpu或其他处理器上执行的进程写入全局存储器。本公开的一些实施例提供在gpu的一个或更多个sm上执行的线程以读取和/或写入位于全局存储器中的张量302。
73.张量302由sm以尺寸小于整个张量的块(诸如,例如,框306)的形式访问。图3a所示的张量参数包括张量的维数、每个维度的大小、每个维度的步幅以及张量中的元素大小。张量内要访问的块以块的每个维度的大小为特征。块的维数与张量的维数相同。张量可能具有沿某些维度的填充,如填充张量304内的张量302上方和右侧的区域所示。填充可以通过张量定义中的张量步幅来指示,其中特定维度上的张量的步幅是定义为特定维度中张量的大小加上该维度中填充的大小。请注意,可以使用不同大小的块访问相同的张量。在实施例中,对于每个张量,所有需要的参数都在“张量描述符”中定义,该“张量描述符”结合了张量和访问块属性。在发出对tmau的存储器访问请求之前,所需的参数必须在描述符中定义。
74.张量描述符是在全局存储器中定义的并且可以由其在全局存储器中的地址唯一识别的数据结构。它可以在内核执行之前在主机端定义,也可以在内核运行时在gpu上定义。典型的张量访问模式假设从同一个张量加载多个块。为块的每个新tmau请求从全局存储器加载张量描述符将是低效的,因为全局存储器延迟会对性能产生负面影响。因此,在一些实施例中,tmau具有专用的描述符高速缓存(参见图6)以便利用在sm上运行的许多内核中的时间张量访问一致性。
75.图3b示出了二维填充张量308。该图示出了张量中的“元素”310、张量内的块312以及与所示维度相关的填充314。定义张量高度h和宽度w,以及元素大小310。张量308在x方向上用填充314填充。因此,x方向上的张量步幅包括填充的宽度。块312是内核所需的数据,也有自己的高度(块高度)和宽度(块宽度)。sm可以通过仅通过其在张量坐标系中的坐标(坐标对x,y)提供块的原点316来访问块312。
76.图4a-4b(统称为图4)示出了在访问外部存储器中的张量时由tmau处理的运算的一些方面。如图4a示出了要从张量308(在该示例中为二维张量)读取的块可以位于块的锚在张量内的许多不同位置处。如图所示,一些锚位置可能导致框包含超出张量308范围的存储器区域。
77.图4b示出了出界情况可能发生在张量308的许多区域中。例如,该图示出了相应的
框位置,其中框的左侧、块的右侧、块的顶部和右侧,块的顶部或整个块可以超出外部存储器中张量的界限。
78.tmau必须适当地处理所请求的块可能跨越全局存储器中的张量边界的出界条件。图4b示出了请求块到达2d张量之外的一些示例。如果任何请求的元素位于张量之外,则它的值可能会被强制为零或一些其他的预定义的特殊常量(例如,非数字(nan)值)。
79.处理出界访问的方式取决于具体应用。在最简单的情况下,零被分配给位于张量之外的元素。典型的例子是卷积滤波器应用于图像边界附近的像素,其中一些滤波器位置可能在图像之外。
80.在更复杂的应用中,可能需要用专用的非零常数填充出界元素。一个例子是深度学习神经网络中归一化层与后续卷积层的融合。归一化层在卷积处理之前对每个元素应用偏差和缩放。出界元素必须设置为零,卷积过滤才能正常工作;但是,由于归一化,它们被分配了偏差值。为了处理这种情况,可以对tmau进行编程以分配和识别一个特殊的非数字(nan)常量来指示出界访问。当全局存储器中的张量数据写入共享存储器时,tmau可能会将特殊的nan常量写入共享存储器位置。可能需要内核来检查全局存储器中的每个元素是否等于这个特殊常量。如果检测到特殊常数,则将零分配给元素,否则将应用比例和偏差。这种处理可能仅在dl的训练阶段与浮点格式相关。特殊的nan编码是特定于格式的,并且基于张量描述符格式设置。参见例如于2021年10月8日提交的标题为“神经网络数据替换(neural network data replacement)”的美国专利申请no.17/497,507,其全部内容通过引用并入本文。
81.图5a-5b(统称为图5)在二维张量和对应块的上下文中示出了由tmau用来高效访问存储器中的张量的参数分组。tmau唯一地识别张量内的块所需的参数分为三组:一组描述整个张量的“张量描述符”参数,一组通常描述张量内的块的“访问描述符”参数,以及标识特定块的tmau“指令参数”。张量描述符参数和访问描述符参数如图5a所示,tmau指令参数如图5b所示。
82.如图5a所示,在一个实施例中,张量描述符参数包括张量高度、张量宽度、张量步幅和元素大小。张量步幅表示张量大小(高度或宽度)加上特定维度中的填充。访问描述符参数包括块高度、块宽度和出界值。张量高度、张量宽度、张量步幅、块高度和块宽度是按张量的维度指定的。如图5b所示,tmau指令参数仅包括块的起始坐标(例如,(x,y))。因此,n维向量的起始坐标将是一个n维元组。
83.tmau处理路径
84.图6示意性地示出了根据一些实施例的tmau的示例数据处理路径。在图6中,tmau 612被如包括在sm 602内的所示。然而,应当理解,在一些实施例中,tmau 612虽然没有物理上地位于sm 602内,但可以被紧密耦合到sm 602。
85.存储器输入/输出控制器(mioc)604在sm 602和tmau 612的请求处理管线之间提供接口。tmau 612通过mioc 604接收由sm发出的存储器访问请求。接收到的存储器访问请求被输入到内部请求队列606。在一些实施例中,队列606中的请求以先入先出(fifo)顺序处理。然而,在其他实施例中,可以基于请求的一个或更多个特征来选择队列中的请求以进行进一步处理,例如请求类型、读取或写入请求的大小、请求的数据类型、要访问的存储空间等。
86.可以在请求队列606中接收两类请求:张量(具有张量描述符)和非张量(线性存储器,没有张量描述符)。请求可以是不同的请求类型,例如加载、存储、归约、预取等。对于张量数据的每个请求,tmau都需要指向描述符的指针,该描述符提供有关要访问的张量的必要信息。而在一些实施例中,请求队列606是接收两种类型的请求的单个队列,而在其他实施例中,相应的队列可以为每种类型的请求提供服务。在一些实施例中,tmau可以仅处理对张量数据的请求,并且在一些其他实施例中,可以仅处理对仅非张量块数据的请求。
87.出于性能原因,在tmau被配置为接收对张量数据的存储器访问请求的一些实施例中,tmau维护描述符高速缓存608以保存最近使用的张量描述符。因为通用访问模式通常涉及被时间上接近地接收的许多请求访问相同的张量描述符,所以描述符高速缓存可以提供减少的延迟。高速缓存可以由张量描述符的全局地址标记。每个接收到的存储器访问请求都可以指定相关张量描述符的全局地址。高速缓存通过接口连接到通用高速缓存控制器(gcc)622。在处理内部请求队列606中的当前请求时,tmau可以检查下一个请求的描述符是否驻留在高速缓存608中。如果不是(即,如果它是未命中),则向gcc发出描述符加载请求以便将描述符从全局存储器预取到高速缓存608。这种并行处理有助于隐藏描述符预取的延迟。
88.当从队列606中选择请求以在tmau 602中处理时,如果该请求是针对张量的,则将所选择的请求发送到设置块610。当在设置块610中接收到存储器访问请求时,设置块610从描述符高速缓存608获得相应的描述符。设置块610收集和/或计算用于请求处理的必要参数。尽管存储器访问所需的许多参数是可用于(是包含在)描述符中的,但在存储器访问请求中会收到一些其他参数。例如,设置单元电路可以被配置为执行类似于下面参考图8的表1中所示的逻辑,以根据张量描述符填充地址计算等所需的参数。它还检查请求输入参数的正确性。如上所述,通过提供要从相应张量描述符获得的多个存储器访问请求所使用的参数,以及通过提供来自sm的存储器访问请求仅携带对特定请求唯一的参数,对于从sm到tmau的存储器访问请求的带宽利用率被优化。存储器访问请求所特有的参数,例如块的坐标或地址,可以作为请求的直接参数携带。设置块被配置为在参数上执行计算和错误检查。如果参数不满足预定义的tmau要求,则会生成错误并丢弃请求。设置块与请求生成器716并行操作,提供用于设置生成请求的管线,从而减少时延。
89.请求生成器616是主tmau引擎。对于张量数据的请求,它通过迭代多维坐标、将坐标映射到地址、校验出界条件、计算共享存储器地址、计算全局存储器地址和生成对存储器子系统的请求,来从设置块接收相关参数并遍历张量空间。请求生成器根据需要向存储器系统生成尽可能多的请求以加载/存储张量数据块,同时遵守由存储器子系统处理的存储器请求的最大大小。通常,存储器子系统对在存储器子系统处接收的每个请求强加一个高速缓存行的最大大小(例如,一个l2高速缓存行(line)的大小)。请求生成器优化请求以提高存储器子系统的效率。请求生成器616的处理通过专用硬件提供了对整个块的访问请求的自动生成,从而减少了电力使用。说明请求生成器内的处理的高级示例伪代码在图7b中示出。
90.对数据的请求经由通用网络接口控制器(gnic)接口614传输到存储器子系统,并且在响应完成电路618中跟踪每个请求。该跟踪使得能够与sm进行异步处理。在gnic响应处理器620处接收对请求的响应,其与请求跟踪电路618通信以跟踪从请求生成器716发送的
每个请求的完成状态。
91.如果从sm接收的存储器访问请求是针对不是张量的块数据的,则在一些实施例中,可以绕过描述符高速缓存608将请求发送到请求生成器616。如图6所示,例如,对非张量块数据的请求可以绕过描述符高速缓存608和设置单元610从队列604路由到请求生成器。然而,在一些实施例中,在请求生成器616中处理之前可以从队列606引导这样的请求到设置单元610。从sm接收到的对大的非张量数据块的请求可以包括该块的全局存储器地址、该块的共享存储器地址和该块在字节数上的大小。对于从sm接收到的对大的非张量数据块的请求,请求生成器616可以自动生成对存储器子系统的请求序列,其中每个请求是针对所请求块的较小子块的。请求生成器根据从sm接收的请求中包含的块的全局存储器地址计算子块的全局存储器地址,子块的大小可以根据由存储器子系统处理的请求的最大大小来确定。请求完成跟踪电路618以与上面关于张量数据块描述的相同的方式跟踪对子块的存储器请求和从存储器子系统接收的响应。
92.图7a和图7b示出了示例参数,图7b中所示的块704使用这些参数跟踪tmau的电路何时读取张量数据结构702。图7a示出了在tmau的硬件中实现的一部分处理逻辑的图7b所示的示例高级伪代码中使用的包括锚、基和当前元素的参数的示例。图7c示出了示例高级伪代码,其中sm调用tmau中的张量加载操作以将数据从全局存储器复制到共享存储器,然后将结果数据写入全局存储器。
93.图7b中的伪代码是响应于从其耦合的sm接收请求以从全局存储器中的张量获得块而由tmau执行的一些处理步骤的高级示例。伪代码被安排在五个嵌套的循环中,其中每个循环对应于张量数据空间的五个坐标轴中相应的一个。尽管该示例是针对五维张量数据空间的,但一些实施例可以支持用于n维张量数据空间的n个嵌套循环,其中n可以是任何正整数。
94.当前元素在最内层循环内通过指定五个维度(坐标c0、c1、c2、c3和c4)中的每一个中的计算坐标,当前元素将被加载到的共享存储器中的地址,以及当前元素的全局地址来处理。获得当前元素后,全局存储器地址和下一个元素的共享存储器地址是通过将全局地址增加张量的元素大小,并将共享存储器地址增加一个预定义的共享存储器地址增量(共享存储器地址增量可以在张量描述符中定义,并且可以基于为张量定义的元素大小)。最内层循环内的处理包括由tmau执行的用于复制张量数据的例如检查出界条件等的处理。
95.最内层循环通过从所请求的块在维度0(blockstart0)中的坐标开始并且将维度0中的当前坐标c0增值维度0的遍历步幅来提供沿维度0(维度为维度0-4)的对元素的迭代(“tensordescriptor.traversalstride[0]”)到维度0坐标,该坐标超过维度0中的盒大小(“blockstart0+tensordescriptor.boxsize[0]”;超出了块边界)。
[0096]
当最内层循环(该循环遍历维度0中的张量元素)退出时,下一个外部维度(即维度1)的基本全局地址会增加为维度0定义的张量步幅(“baseglobaladdr[1]+=tensordescriptor.tensorstride[0]”)。这有效地将全局地址推进到下一个切片。每个维度的基本全局地址最初是根据与请求块的锚元素对应的全局地址确定的。
[0097]
如图7b所示,以与上述针对维度0所描述的方式类似的方式,每个循环提供在相应维度中迭代由起始块坐标、沿该维度的遍历步幅和该维度的框大小确定的次数。应该注意的是,每个维度的遍历步幅和盒大小在张量的张量描述符中定义。
[0098]
通过在硬件中执行从全局存储器中的张量复制数据块所涉及的处理,tmau可以显著减少sm上用于数据移动的计算负载,从而提高sm的处理效率并且还降低了sm的功耗。
[0099]
图7b中的上述伪代码提供了高级执行逻辑并省略了与某些方面相关的细节,例如高效的l2请求生成、混杂和处理在读取和/或写入张量中由tmau执行的出界条件。
[0100]
除了l2请求生成(对全局存储器的请求)之外,tmau跟踪返回数据以便报告tmau事务完成。tmau必须有专门的计数器来跟踪发出的l2请求。每次将请求发送到l2高速缓存时,计数器递增。当数据从l2高速缓存返回时,计数器递减。一旦计数器达到零值,整个块就被加载到共享存储器中,并且tmau可以报告事务完成。出于效率目的,tmau可以使用单个计数器来跟踪一组多个背靠背交易并报告该组中最后一个交易的完成情况。在一些实施例中,计数器可以保持在共享存储器中的预定义位置中。sm可以包括监视计数器的同步电路,并且可以基于计数器实现同步屏障等。
[0101]
图7c示出了由在sm上运行的内核执行的具有隐式gemm的卷积滤波器的示例伪代码。如上所述,gemm通常定义为操作c=αab+βc,其中a和b作为矩阵输入,α和β作为标量输入,c作为被输出覆盖的预先存在矩阵。普通矩阵乘积ab是gemm,其中α等于1,β等于0。许多dl应用等都需要此类计算。可以利用tmau的高效矩阵乘法和加法实现示例在标题为“具有线程束组的有效矩阵乘法和加法(efficient matrix multiply and add with a group of warps)”的美国申请no.17/691,406中描述,其全部内容通过引用并入本文。
[0102]
内核获得指向三个张量的张量描述符的指针:激活张量、权重张量和输出张量,以及这些张量中的每一个的大小信息。在gemm计算中,激活张量、权重张量和输出张量可以分别表示为矩阵a、b和c。当内核向tmau发出后续存储器访问请求(tensorblockload())时,内核为tmau提供了指向激活张量、权重张量和输出张量的张量描述符的指针。
[0103]
该逻辑被组织为一系列嵌套循环,从而通过在最内层循环的每次迭代中复制相应块来复制每个张量的块序列。在最内层循环的每次迭代中,内核向耦合的tmau发出相应的tensorblockload请求,以从激活张量和权重张量中的每一个中加载块。tensorblockload请求将张量在全局存储器中的地址(由sm确定)和共享存储器中的地址作为参数,全局存储器中的张量数据将写入该地址。嵌套循环的排列使得外部三个循环通过垂直、水平和通道方式迭代,最内层循环通过卷积滤波器迭代。
[0104]
nhwc(n(维度)、高度、宽度、通道)布局被假设用于激活张量并且knwc布局用于权重张量。代码遍历w和h维度。它为通道(c维)和卷积滤波器的每个r和s位置累积。简单起见,通过n和k维的迭代未示出。对于给定的[c,s,r],tmau将数据块从全局存储器加载到共享存储器。负载是针对激活和权重张量两者完成的。将两个矩阵的数据加载到共享存储器后,sm可能会调用gemm计算(computegemm())。在一些实施例中,gemm计算由专用硬件电路执行,并且结果被累加到输出矩阵中。矩阵乘法在共享存储器中计算。
[0105]
在使用加载在共享存储器中的张量数据完成数学运算后,tmau由sm上的内核通过发出请求(tensorblockstore())并提供来自gemm的结果存储在其中的输出矩阵的地址,并且该结果要写入其中的共享存储器中的地址,以将来自共享存储器缓冲区的结果保存到全局存储器中的张量。
[0106]
支持张量加载模式
[0107]
tmau支持张量的多种存储器布局。例如,三维图像张量可能具有张量布局格式
ndhwc,其中最里面的维度c表示通道的数量(例如,在图像张量中,每个通道可以表示一种颜色),d、h、w维度分别对应于深度、高度和宽度维度,而n表示张量的批量大小。
[0108]
除了支持多种张量布局格式之外,tmau还支持以非交错模式或以交错模式存储在全局存储器中的张量。在交错模式下,tmau可以支持多种切片大小(例如16字节切片、32字节大小等)。在一些实施例中,张量的张量描述符可以指定该张量在全局存储器中是处于非交错模式还是处于交错模式,并且还指定处于交错模式的切片的大小。
[0109]
此外,在一些实施例中,tmau支持多于一种张量加载模式。例如,可以支持图块模式和图像到列(也称为“im2col”)模式作为张量数据加载模式。
[0110]
由于诸如在隐式通用矩阵乘法(gemm)实现中不需要数据复制并因此提供显著的存储器带宽节省等原因,图块模式在某些情况下是优选的。另一方面,在某些情况下,性能可能会因为图块量化效应而损失。图块模式是一种通用的tmau加载模式,可广泛用于不同的dl和高性能计算(hpc)应用程序。上面关于图7a和图7b描述了用于图块模式的张量遍历的示例。。
[0111]
im2col模式主要用于基于隐式gemm的卷积内核。如果选择了im2col模式,则tmau在从全局存储器中加载张量块时会进行图像到列的转换。这给张量遍历算法增加了额外的复杂性。
[0112]
在图块模式中,张量参数boxsize[]唯一地定义张量空间中的包围盒(boundingbox)大小,该张量空间保存tmau响应于来自sm的指令而应该加载的所有元素。boxsize[]的每个元素都指定了沿相应维度的包围盒大小:boundingbox[i]=boxsize[i]。来自sm的tmau存储器访问请求中指定的坐标唯一地定义了包围盒在张量空间中的位置。
[0113]
在im2col模式中,包围盒大小和位置被不同地定义。包围盒维度的数量比张量描述符中的张量维度少一。此模式下不使用boxsize[],而是在张量描述符中有替代参数来支持im2col模式。该替代参数包括:rangendhw、rangec、boxbasecornerdhw、boxfarcornerdhw。boxbasecornerdhw和boxfarcornerdhw定义了dhw(深度、高度、宽度)空间中的包围盒大小和位置。boxbasecornerdhw指定包围盒原点的初始坐标,即盒子的左上角。boxfarcornerdhw指定相对右下角的初始位置。角点的位置被定义为从相应张量角点起的有符号偏移。因此,可以在张量边界的内部和外部指定包围盒角。
[0114]
包围盒角的位置受卷积滤波器大小和所选膨胀因子的影响。角坐标可以计算为滤波器大小的一半乘以膨胀因子。选择包围盒角的精度以提供广泛的卷积内核大小和膨胀因子。基于实际应用分析,较小维度的张量可能需要更高的精度。例如,使用3d张量的语音处理应用程序可能需要高达8k的膨胀因子,而使用4d或5d张量的图像处理应用程序需要可达128的小得多的膨胀因子。
[0115]
boxbasecornerdhw和boxfarcornerdhw使用以下公式定义包围盒大小:boundingbox{d,h,w}=tensorsize{d,h,w}-boxbasecorner{d,h,w}+boxfarcorner{d,h,w}。对于c维度,大小由rangec参数定义。
[0116]
图8a说明包围盒如何依赖于boxbasecorner{d,h,w}、boxfarcorner{d,h,w}设置。这个例子表明,数据结构中可以使用多种类型的边界,并且在im2col模式下,可以避免量化。
[0117]
在图块模式中,要加载的元素数量取决于boxsize[]参数。当tmau遍历特定维度时,它使用boxsize[]中的相应值来确定要加载多少元素。在im2col模式中,rangendhw用于确定沿ndhw维度加载多少元素,而rangec用于确定维度c。单个tmau请求可能需要tmau遍历一批(n维度)中的多个图像以便于加载请求的数量的元素。当tmau在多个图像的遍历过程中从当前图像切换到下一个图像时,可能会跳过rangec参数定义的范围之外的通道。
[0118]
在图块模式中,tmau请求坐标指定张量空间中的包围盒位置(原点)。在im2col模式下,沿c和n维的坐标类似于图块模式使用;但是,沿w、h、d维度的坐标指定了张量空间中卷积滤波器的基本位置(左上角)。为了正确处理,tmau要求滤波器的基本位置始终定义在包围盒内。此外,必须在tmau请求中指定这些尺寸的坐标偏移。偏移允许相对于张量指定块的位置,因此仅使用最少的字节数。偏移被添加到滤波器基础位置坐标以确定加载操作必须从此处启动的张量空间中的起始位置。相同的偏移用于相对于boxbasecornerdhw中指定的初始坐标的定位包围盒。根据上面定义的表格,将偏移应用于坐标子集。偏移被定义为具有可变精度的无符号整数。精度取决于张量维度,并根据包围盒坐标精度的早期调整进行选择。
[0119]
在一些实施例中,所有偏移(offset)都打包在单个寄存器内的16位中。偏移的数量取决于张量维度;因此,精度可能会相应地变化。在典型的卷积内核中,一旦计算出滤波器基础,就可以将其重用于具有不同坐标偏移的多个tmau请求。重用次数取决于卷积滤波器的大小。例如,对于3x3滤波器,会针对同一滤波器基础位置发出九个请求。
[0120]
对于交错布局,c坐标必须根据通道切片而不是单个通道来指定。这适用于图块和im2col模式。
[0121]
下面的表1示出了用于在tmau中,更具体地,在设置块中实现的逻辑的高级示例伪代码,以基于接收到的tmau请求中标识的张量描述符配置张量和访问参数。
[0122][0123]
[0124]
表1:示例伪代码用于初始化负载张量(维度3d-5d)
[0125]
以下示例说明了im2col模式的使用。将3x3卷积滤波器应用于nhwc张量(64x14x9x64)。每个请求沿n、h、w维度加载64个元素,沿c加载8个元素。
[0126]
在第一示例中,如图8b所示,滤波器可以跨出张量边界,访问可以定义为零或常数值的周围填充(边界)。张量描述符参数设置如下:tensorsize[0]=64;tensorsize[1]=9;tensorsize[2]=14;tensorsize[4]=64;rangendhw=64;rangec=8;boxbasecornerw=-1;boxbasecornerh=-1;boxfarcornerw=-1;boxfarcornerh=-1。图8b示出了对坐标(7,7,4,0)和不同坐标偏移值:(0,0)、(1,1)、(2,2)的请求的处理。此示例显示加载张量的不同边界区域。它们被定义为偏移。请求者向tmau指定边界区域以及需要加载多少元素(例如,一系列元素——在本例中64)。这可以指定为张量描述符中的参数。可以在指令级提供的另一个参数可以指定用于加载请求的块的起始位置。tmau知道它必须从指定的起始位置开始加载张量元素,加上偏移保持在所示的矩形内并加载特定数量的数据。
[0127]
在下一个示例中,滤波器被配置为必须保持在张量边界内,因此张量上不需要填充/边界。张量描述符参数设置如下:rangendhw=64;rangec=8;boxbasecornerw=0;boxbasecornerh=0;boxfarcornerw=-2;boxfarcornerh=-2。如图8c示出了对坐标(7,7,4,0)和不同坐标偏移值:(0,0)、(1,1)、(2,2)的请求的处理。
[0128]
为了比较,在下一个示例中说明了图块模式中类似卷积情况的处理。单个tmau请求可能会在所有滤波器位置加载卷积计算所需的所有像素。为了实现这一点,必须加载额外的光晕像素。光晕像素的数量取决于滤波器的大小。
[0129]
在下一个示例中,将3x3卷积滤波器应用于nhwc张量(64x14x8x64)。滤波器可以超出张量边界,访问可以定义为零或常数值的周围填充(边界)。单个请求沿h、w维度加载10x10的图块,沿c加载8个元素。每个加载的10x10图块具有2个光环行(halo row)和2个列。张量描述符(tensor descriptor)参数设置如下:tensorsize[0]=64;tensorsize[1]=8;tensorsize[2]=14;tensorsize[4]=64;boxsize[0]=8;boxsize[1]=10;boxsize[2]=10;boxsize[3]=1。对于任何给定的滤波器位置,只有一个8x8图块用于卷积计算。如图8d示出了对具有坐标(0,-1,-1,0)的请求的处理。需要负w、h块坐标来访问具有零或常数(填充)的张量出界的像素。显示的8x8图块用于处理不同的滤波器位置:(0,0)、(1,1)、(2,2)。
[0130]
下面的例子与前面的例子类似,但滤波器必须保持在张量边界内,并且不允许填充/边界。单个tmau请求沿h、w维度加载8x8图块,沿c维度加载8个元素。每个加载的8x8图块具有2个光环行和2个列。张量描述符参数设置如下:boxsize[0]=8;boxsize[1]=8;boxsize[2]=8;boxsize[3]=1。对于任何给定的滤波器位置,使用6x6图块进行卷积计算。在任何给定时间,只有36个像素用于数学运算。这小于最佳的64像素。这是可能影响整体性能的图块量化效果的示例。如图8e示出了对具有坐标(0,0,0,0)的tmau请求的处理。将w、h块坐标设置为零可防止超出张量边界。显示的6x6图块用于处理不同的滤波器位置:(0,0)、(1,1)、(2,2)。
[0131]
张量描述符traversalstride参数影响图块模式和im2col模式。在图块模式下,traversalstride越大,负载访问的张量位置的数量就越小,从而减少了加载元素的总数。在im2col模式下,为了比较,沿ndhw维度加载的元素的数量不依赖于沿这些维度的traversalstride:它等于张量描述符rangendhw参数。但是,与图块模式一样,沿w、h和d维
度遍历的元素数量受基于公式ceil(boundingbox{d,h,w}/traversalstride{d,h,w})的traversalstride影响。
[0132]
图8f示出了im2col模式下的traversalstride处理。将3x3卷积滤波器应用于nhwc张量(64x14x9x64),其traversalstride等于2。每个请求加载n、h、w维度上的32个元素,以及c维度上的16个元素。张量描述符参数设置如下:tensorsize[0]=64;tensorsize[1]=9;tensorsize[2]=14;tensorsize[4]=64;traversalstride=2;rangendhw=32;fangec=16;boxbasecornerw=-1;boxbasecornerh=-1;boxfarcornerw=-1;boxfarcornerh=-1。如图8b示出了对具有坐标(7,7,5,0)和不同坐标偏移值:(0,0)、(1,1)、(2,2)的请求的处理。请注意,在此示例中,像素是从包围盒的顶行加载的,而不是从底行加载的。它们也从第一列和最后一列加载。
[0133]
图8g示出了稍微修改的示例,其中沿w和h维度的张量大小减少了一个像素:nhwc(64x13x8x64)。请注意,在此示例中像素是从包围盒的顶部行和底部行加载的。但是,它们不是从最后一列加载的。
[0134]
下一个例子,如图8h所示,示出了图块模式中的traversalstride处理。将3x3卷积滤波器应用于nhwc张量(64x14x8x64),其traversalstride等于2。与traversalstride等于1的早期示例类似(图8d),单个tmau请求可以通过加载额外的光环像素来为所有卷积滤波器位置提供像素。
[0135]
在一些实施例中,tmau可能不具有用于卷积膨胀处理的专用硬件,并且其他tmau电路可以为该特征提供必要的支持。然而,选择im2col坐标偏移和包围盒角坐标的精度以提供广泛的卷积内核大小和膨胀因子。如图8i说明了膨胀因子如何影响3x3卷积滤波器的包围盒设置。请注意,膨胀会影响盒子的位置,但不会影响大小。
[0136]
图8j示出了如何在im2col模式中处理2的膨胀因子。将3x3卷积滤波器应用于nhwc张量(64x14x9x64)。每个请求在n、h、w维度加载64个元素,在c维度加载16个元素。张量描述符参数设置如下:tensorsize[0]=64;tensorsize[1]=9;tensorsize[2]=14;tensorsize[4]=64;rangendhw=64;rangec=16;boxbasecornerw=-2;boxbasecornerh=-2;boxfarcornerw=-2;boxfarcornerh=-2。如图8j示出了对具有坐标(7,6,3,0)和不同坐标偏移值:(0,0)、(2,2)、(4,4)的请求的处理。
[0137]
图8k示出了与图8j相似的示例,以图块模式处理。单个tmau请求可以通过加载额外的光环像素为所有卷积滤波器位置提供像素。光环像素的数量取决于滤波器大小和膨胀因子。将3x3卷积滤波器应用于nhwc张量(64x14x8x64)。单个请求沿h、w维度加载12x12图块,沿c维度加载8个元素。每个加载的12x12图块具有4个光环行和4个列。张量描述符参数设置如下:tensorsize[0]=64;tensorsize[1]=8;tensorsize[2]=14;tensorsize[4]=64;boxsize[0]=8;boxsize[1]=12;boxsize[2]=12;boxsize[3]=1。对于任何给定的滤波器位置,只有一个8x8图块用于卷积计算。如图8k示出了对具有坐标(0,-2,-2,0)的请求的处理。需要负的w、h块坐标以访问使用零或常数(填充)的张量出界的像素。所示的8x8图块用于处理不同的滤波器位置:(0,0)、(2,2)、(4,4)。
[0138]
支持张量数据混杂
[0139]
在许多应用中,tmau以与它们在全局存储器中的布局相同的顺序将数据加载到共享存储器中。但是,有些应用程序需要额外的数据移动以避免性能下降。这可以实现为依赖
于应用程序的优化。tmau支持非混杂模式,其中数据以与全局存储器中相同的排列方式写入共享存储器,以及混杂模式,其中数据根据预定义的或可配置的混杂模式写入共享存储器,即导致数据的排列方式与全局存储器中的不同。当tmau处理存储器访问请求时,它可能会生成多个外部存储器请求,并且对于每个生成的外部存储器请求,它都可以为目标共享存储器生成对应的目标地址和混杂模式。在实现中可以使用两种用于跟踪目标地址和混杂模式的选项——或者通过包含请求和响应的存储器系统发送所有信息,或者将信息存储在sm中的跟踪表中,并将相应的索引通过包含请求和响应的存储器系统发送到该表中。在任何一种情况下,存储器系统响应都可以使用该信息来确定在目标共享存储器中写入数据的地址和模式。
[0140]
在一些实施例中,l2高速缓存线被组织在四个32b扇区中。共享存储器以8存储库为一组进行组织,总共4个组。将高速缓存行中的四个扇区映射到特定的存储库组具有灵活性:任何扇区都可以映射到任何组,每组一个扇区。此外,可以在扇区内交换16b半扇区。这为将16b数量映射到4个存储库的子组提供了额外的灵活性。
[0141]
数据在全局存储器中以特定顺序组织;但是,它可能与应用程序在共享存储器中访问数据的顺序不匹配。很好的例子是行优先矩阵组织与列优先访问。当访问共享存储器时,数据组织的这种差异可能会导致存储库冲突。为了避免这个问题,数据可以通过共享存储器存储库的混排加载到共享存储器。l2高速缓存行扇区根据保证避免读取和写入的存储库冲突的预定义的模式映射到共享存储器存储库组和子组。tmau支持基于特定张量布局的多种模式。反过来,数据使用者必须了解这些模式并相应地访问数据。
[0142]
在一些实施例中,tmau可以混杂被加载到按照行组织的共享存储器中的数据。在示例中,共享存储器按行组织,其中每行为128b(128字节)并具有唯一的地址。可以在8x8表中对共享存储器库混杂模式进行编码,其中每个条目代表128b数据块内的16b子块的存储库子组id。根据目标共享存储器地址(行id)的最后3位从表中选择适当的行。注意,这些位取自cta共享存储器区域内的逻辑地址。其是该区域基地址的偏移。它不一定与共享存储器物理地址相同。
[0143]
在图9a中,示出了用于swizzle_128b模式的示例库分配表。
[0144]
图9b-9d示出了根据图9a的库分配表的用于swizzle_128b模式的全局和共享存储器中的示例数据布局。图9b显示了全局存储器中具有1x10x10x64(即n=1、h=10、w=10和c=64)维度的4维nhwc张量。2b/通道和64通道占用128b。每个枚举单元,有时也称为像素,代表8个通道(16b)。图像902的w和h大小都为10并且包括光环像素906以支持沿着8x8图像图块的3x3卷积滤波器904。在处理过程中,卷积滤波器一次左-右和上-下迭代地移动一个像素。单元在图9a-d中按它们存储在全局存储器中的顺序枚举。通道范围以不同的填充图案呈现。
[0145]
图9c示出了在全局存储器中h=0和1的图9b所示张量的一部分。图9c中的单元的每一行代表单个128b的l2高速缓存线。图9d示出了根据实施例的相同数据如何存储在共享存储器中。每行代表分布在存储器存储库中的128b数据。数据根据swizzle_128b模式的表进行混杂。在图9d的右边,从gmma应用程序的角度显示了滤波器位置r=0、s=-0的数据视图。gmma一定知道存储库混杂和步幅以在16个8x8图块中提供正确的数据。
[0146]
该混杂适应其中数据存储在全局存储器中的顺序与该数据存储在共享存储器中
的顺序不同的实施方式。当数据从全局存储器移动到共享存储器时,在一些实施例中,tmau提供对数据的加扰,因为对于一些应用,sm垂直读取数据(例如,在数据列中)。此外,在写入共享存储器时,tmau会考虑共享存储器中的存储器存储库布局,以优化sm对该数据的后续读取访问。在图示的示例中,共享存储器被规划在存储库中,特别是在8个存储库中。在任何给定的时钟,每个存储库都被读取,但只能读取来自任何给定存储库的小部分数据。在图中,每个填充图案表示根据张量的混杂模式写入共享存储器中不同存储库的数据。如果要从共享存储器中读取来自h=0w=0-7的数据,并且如果共享存储器中的该数据以与全局存储器中相同的方式排列,则在避免库冲突的同时读取该数据需要8个时钟周期。因此,如图9d左侧所示,来自h=0w=0-7的数据分布在共享存储器中的所有八个库(bank)中,以便所有这些数据(即来自h=0w=0-7的数据)在8个存储库上并行地被读取。这增加了每个时钟的数据吞吐量。
[0147]
在图9d的右侧,最右侧的列示出了当w=0时每个h的8x8图块,指示h=0、w=0和h=1、w=0的图块(分别枚举图块0和80)在共享存储器中被写入的位置的箭头。类似地,在从右侧数第二列中,示出了当w=1时每个h的8x8图块,指示共享存储器中h=0、w=1和h=1、w=1的图块(分别枚举图块0和80)被写入的位置的箭头。根据预先配置的表格(例如tmau中的如图9a所示的表格)执行混杂。
[0148]
在一些实施例中,gmma是gpu张量核心中的固定功能硬件单元,其被配置为执行矩阵对矩阵的乘法到累加器中。例如,两个16x16矩阵可以通过gmma相乘成累加矩阵。在一些实施例中,gmma可以被限制为小于预定义大小的矩阵。当两个矩阵要相乘时,gmma,在示例实施例中,是由tmau馈送的数据的使用者。当在sm上运行的计算内核中需要矩阵-矩阵乘法时,内核请求可以请求tmau将两个矩阵中的每一个的数据复制到共享存储器中,然后发出矩阵-矩阵乘法请求到gmma。作为响应,gmma可以使用已由tmau加载到共享存储器的数据执行其乘法运算。如果使用混杂,内核可以根据混杂模式信息读取共享存储器中的数据,执行其计算,然后将结果写回至共享存储器。混杂根据预先配置的表格,例如tmau中的图9a中所示的表格,来执行。
[0149]
在一些实施例中,gmma电路可以被配置为从如图9d右侧所示的8x8像素图块中的共享存储器读取数据。为了获得位置r=0、s=0的数据(见图9b在全局存储器中未混杂图像中r=0s=0的指示),位置r=0s=0的所有通道0-63需要从共享存储器中读取。对于由gmma读取的第一个8x8像素图块,如图9d右侧处的右上角图块所示,对于位置r=0,s=0像素,通道c=0-7,h=0,w=0-7被读取。由于如图9d所示数据在共享存储器中混杂在一起,包括r=0、s=0在内的八个位置的所有通道0-63可以在八个时钟周期内被读取。
[0150]
gmma操作可以使用3x3卷积滤波器904由卷积内核在诸如图9b所示的图像902上调用。对于每个位置,r=0s=0等,滤波器需要对3x3盒执行矩阵乘法,其中该位置是如图9b右下所示的左上位置。但是,gmma电路可能会在每次读取时读取8x8图块。
[0151]
多播支持
[0152]
tmau为程序化多播提供支持,其中单个tmau生成加载请求,但数据被传递到多个目标(例如,sm)。例如,响应于来自在第一个sm上执行的内核的加载请求,耦合到第一个sm的tmau请求来自全局存储器的张量数据或其他数据块,并且除了将其写入第一个sm的共享存储器(在一些实施例中,请求sm不需要接收请求的数据),还将其写入一个或更多个其他
sm的共享存储器。为了支持这一点,请求tmau的特征是被提供了接收cta的列表。在一些实施例中,接收的cta id可以被编码在16位掩码中,其中每个位对应于特定的cta id。在一些实施例中,具有多播选项的数据请求发起tmau多播请求。目标cta的掩码可以被编码在提供给指令的目标地址中。
[0153]
每个接收方cta需要检测事务完成。完成检测可以基于到达/等待同步机制。例如,每个接收到的数据包可以包括对应到达/等待结构位置的共享存储器地址,并且可以根据接收到的数据字节数更新结构中的计数器。接收器cta可以基于计数器上的屏障等来实现同步。
[0154]
为了支持抢占,tmau跟踪接收到的数据包以便检测事务的完成。在典型情况下,所有簿记都在tmau内本地安排。然而,在多播情况下,请求的tmau必须考虑所有接收方的事务完成。因此,可以跨多个tmau建立额外的确认机制。每次tmau接收到数据时,它都必须将事件传达给请求的tmau。请求的tmau占所有接收器接收到的数据包的总数。可以使用tmau实现的示例多播实现方式在标题为“跨多个计算引擎的程序控制数据多播(programmatically controlled data multicasting across multiple compute engines)”的美国申请no.17/691,288中描述,其全文通过引用并入本文。
[0155]
预取支持
[0156]
除了加载张量数据之外,tmau还支持数据预取请求以将数据从全局存储器dram预取到l2高速缓存。这提供了减少张量加载延迟和提高整体性能的机会。对于延迟影响多个cta执行的多播操作,预取可能特别有利。预取请求处理类似于其他加载操作的,但tmau不必执行任何类型的完成跟踪等。对于张量数据,预取请求处理有点类似于加载操作,其中张量描述符和坐标定义了如何处理请求。然而,对于张量数据的预取请求,tmau可能无法处理共享存储器/全局对齐和以扇区或高速缓存行粒度处理请求。
[0157]
存储和归约请求
[0158]
tmau存储请求将数据块从共享存储器复制到全局存储器。共享存储器中的数据以线性地址空间顺序处理;但是,目标存储器被视为多维张量。最大维度与加载请求相同。
[0159]
与tmau加载一样,向tmau存储请求提供张量描述符指针、共享存储器基地址和目标块在张量空间中的坐标。存储请求在图块和im2col两种模式下都可以执行。存储请求还可以支持交错布局,并且可以指定共享存储器库混杂模式。可以支持遍历步幅的存储。在一些实施例中,存储操作还可以支持使用zfill/cfill处理出界条件。此外,在某些实施例中,tmau支持将数据从共享存储器复制到全局存储器或从共享存储器复制到共享存储器的带归约存储。支持的归约操作可能包括,但不限于,and、add、xor、min、max、dec、or和inc中的任何一个。
[0160]
无描述符请求
[0161]
广泛的应用程序执行不需要了解底层数据布局的存储器到存储器事务。在这种情况下,数据被视为预定大小的块的顺序阵列。在一些实施例中,例如,可以为tmau操作配置16b的默认块大小。对非张量数据块的存储器访问请求比对张量的请求要简单得多,并且在一些实施例中,只需要源地址、目标地址和块数来执行传输。所有这些参数都可以在指令级别指定(即在对tmau的请求中提供),而无需存储在全局存储器中的相关张量描述符。这简化了编程模型,因为对于此类存储器访问请求,可以消除张量描述符定义的步骤。如果要传
输的块数为零,则这些指令作为空操作(nop)处理。
[0162]
tmau支持用于无描述符数据传输(也称为非张量数据请求)的专用指令。此类指令可用于将数据从全局存储器复制到共享存储器、共享存储器复制到全局存储器以及共享存储器复制到共享存储器。在另一个实施例中,可以实现全局到全局的复制。此外,另一条指令通过将从共享存储器到全局存储器或从共享存储器到共享存储器的数据复制来进行归约。支持的归约操作可以包括,但不限于,and、add、xor、min、max、dec、or和inc中的任何一个。tmau支持从dram到l2的无描述符数据预取请求。
[0163]
同步和事务完成
[0164]
tmau支持请求完成事件。在一些实施例中,到达/等待屏障被用作完成检测机制。每个tmau加载请求都需要屏障结构所在的共享存储器地址。tmau在每个l2请求中都包含此地址。当数据到达目标sm时,屏障结构会相应更新。tmau本身不参与屏障更新。此机制可用于单播和多播请求。
[0165]
此外,tmau支持可用于检测所有先前发出的tmau请求的完成的专用指令。
[0166]
tmau的编程模型
[0167]
tmau被设计成在全局和共享存储器之间移动大块的张量或其他数据。单个tmau加载请求可以带来千字节、兆字节甚至更大量的数据,这些数据可以由多个线程和cta处理。类似地,大型线程阵列生成的大块的共享存储器数据可以通过单个tmau存储操作以张量或其他形式保存到全局存储器中。
[0168]
tmau请求的标量性质与cuda编程范例的多线程性质没有很好地对齐。因此,一些实施例提供了直观且无中断的编程模型,该模型可以与cuda环境集成以供在应用程序中使用tmau。该编程模型为程序开发提供了灵活性,并且对于应用程序开发人员来说直观且易于学习。
[0169]
在典型的dl应用中,期望tmau以迭代方式使用。多个cta通过访问不同的图块来遍历存储在全局存储器中的张量。在每次迭代中,张量块(block)(图块(tile))被提取和处理。对于每个块,应用程序通过计算多维坐标来确定张量空间中的块位置。此外,应用程序必须计算用于存储这些块的共享存储器地址。
[0170]
tmau指令的标量特性使得统一数据路径(udp)和统一寄存器文件(urf)成为高效的执行场所。这不仅适用于tmau指令,也适用于生成必要指令参数的周围代码。这种方法将消除代码执行冗余、节省寄存器文件(rf)容量、带宽、节省功耗和自由矢量数据路径。由于tmau相关代码的迭代特性,将迭代参数保持在urf中很重要。任何urf/rf加载/存储都会导致性能损失和额外的功耗。
[0171]
在一些实施例中,提供了一种机制,该机制帮助编译器识别附近代码块的单线程束语义并通过cuda和ptx(并行线程执行指令集架构)来表达。修改添加了“.one”修饰符。在以下代码中,建议的修饰符强制选择单个线程来执行:
[0172]
_warpsync.exclusive.one mask,l1;
[0173]
《code block executed by single thread》
[0174]
执行线程是从掩码定义的活动线程集合中选择的。每次执行代码块时一致地选择相同的线程是很重要的。请注意,_warpsync.exclusive会导致所有线程在代码块执行之前和之后同步。所提出的编程模型可以简化代码分析,为udp执行提供生成tmau相关代码的机
会,并将相关数据保留在urf中。
[0175]
cuda级模型位于ptx结构之上,其中一致地选择单个线程用于代码块执行。在以下代码中,__one_sync(mask)函数提供了所需的功能:
[0176]
if(__one_sync(mask)){
[0177]
《code block executed by single thread》
[0178]
}//no
‘
else’clause
[0179]
在一些实施例中,基于tmau的访问是通过一组函数来实现的。定义了四个c样式组以涵盖以下情况:带有l2描述符的图块负载、不带张量描述符的图块负载、带有张量描述符的im2col负载和不带张量描述符的im2col负载。这些函数可以将张量描述符指针、共享存储器目标地址、到达/等待屏障的共享存储器地址、访问块起点的张量坐标集、管线结构和可选的张量描述符作为输入参数。im2col组还期望卷积内核内的坐标偏移。
[0180]
在示例实施例中,在sm上执行的内核可以向tmau发出存储器访问请求,以使用以下形式的张量复制指令在全局和共享存储器之间复制张量,诸如:
[0181]
copy_tensor.mode.dimensionality.destination,source{.multicast}{reduction_op}
[0182]
descriptor coordinates smem_data_address{smem_barrier_addr}
[0183]
{im2col_coordinate_offsets}multicast_destinations
[0184]
where mode={tiles,im2col},dimensionality={1d-5d},destination={shared,global},source={shared,global}.multicast,reduction_op={.and,.add,.xor,.min,.max,.dec,.or,.inc}.
[0185]
对tmau的存储器访问请求以将张量数据预取到l2高速缓存可以通过以下形式的张量预取指令发出,诸如:
[0186]
prefetch_tensor.mode.dimensionality descriptor coordinates
[0187]
im2col_coordinate_offsets}
[0188]
where mode={tiles,im2col}and dimensionality={1d-5d}.
[0189]
对tmau的存储器访问请求以在全局和共享存储器之间复制非张量数据块可以通过以下形式的块复制指令发出,诸如:
[0190]
copy_block.destination,source{.multicast}{reduction_op}destination_address{barrier_addr}source_address multicast_destinations number_blocks
[0191]
where destination={shared,global},source={shared,global},multicast,and reduction_op={.and,.add,.xor,.min,.max,.dec,.or,.inc}.
[0192]
对tmau的存储器访问请求以将非张量数据块从全局存储器预取到l2高速缓存可以通过以下形式的块预取指令发出,诸如:prefetch_block address number_blocks。
[0193]
使用tmau的并行处理gpu架构示例
[0194]
现在将描述其中并入本技术中公开的tmau的示例说明性架构。以下信息仅用于说明目的,不应解释为以任何方式进行限制。在排除或不排除所描述的其他特征的情况下,可以任选地结合以下任何特征。
[0195]
图10示出了根据一个实施例的并行处理单元(ppu)1000。在一个实施例中,ppu 1000是在一个或更多个集成电路设备上实现的多线程处理器。ppu 1000是一种延迟隐藏架
构,旨在并行处理多个线程。线程(例如,执行线程)是被配置为由ppu 1000执行的一组指令的实例化。在一个实施例中,ppu 1000是被配置为实现图形渲染管线的图形处理单元(gpu)处理三维(3d)图形数据以生成二维(2d)图像数据,用于在诸如液晶显示(lcd)设备的显示设备上显示。在其他实施例中,ppu 1000可用于执行通用计算。在一些其他实施例中,ppu 1000被配置为在深度学习应用或其他高性能计算应用中实现大型神经网络。
[0196]
一个或更多个ppu 1000可配置为加速数千个高性能计算(hpc)、数据中心和机器学习应用程序。ppu 1000可配置为加速众多深度学习系统和应用程序,包括自主车辆平台、深度学习、高精度语音、图像和文本识别系统、智能视频分析、分子模拟、药物发现、疾病诊断、天气预报、大数据分析、天文学、分子动力学模拟、金融建模、机器人、工厂自动化、实时语言翻译、在线搜索优化和个性化用户推荐等。
[0197]
如图10中所示,ppu 1000包括输入/输出(i/o)单元1005、前端单元1015、调度器单元1020、工作分配单元1025、集线器1030、交叉开关(xbar)1070、一个或更多个通用处理集群(gpc)1050和一个或更多个分区单元1080。ppu 1000可以通过一个或更多个高速nvlink互连1010连接到主机处理器或其他ppu 1000。ppu 1000可以通过互连1002连接到主机处理器或其他外围设备。ppu 1000也可以连接到包括多个存储器设备1004的存储器。在一个实施例中,存储器设备1004可以包括多个动态随机存取存储器(dram)设备。dram设备可配置为高带宽存储器(hbm)子系统,并且在每个设备内堆叠有多个dram裸芯。
[0198]
nvlink 1010互连使系统能够扩展,并包括与一个或更多个cpu结合的一个或更多个ppu 1000,支持ppu 1000和cpu之间的缓存相干以及cpu主控。nvlink 1010通过集线器1030将数据和/或命令传输到ppu 1000的其他单元,例如一个或更多个复制引擎、视频编码器、视频解码器、电源管理单元等(未明确示出)。nvlink 1010结合图13a和图13b更详细地描述。
[0199]
i/o单元1005被配置为通过互连1002从主处理器(未示出)发送和接收通信(例如,命令、数据等)。i/o单元1005可以通过以下方式与主处理器直接通信互连1002或通过一个或更多个中间设备,例如存储器桥。在一个实施例中,i/o单元1005可以经由互连1002与一个或更多个其他处理器,例如一个或更多个ppu 1000通信。在一个实施例中,i/o单元1005实现外围组件高速互连(pcie)接口用于通过pcie总线进行通信,并且互连1002是pcie总线。在替代实施例中,i/o单元1005可以实现用于与外部设备通信的其他类型的众所周知的接口。
[0200]
i/o单元1005对通过互连1002接收的包进行解码。在一个实施例中,包表示被配置为使ppu 1000执行各种操作的命令。i/o单元1005将解码的命令发送到ppu 1000的各种其他单元,如命令可以指定的。例如,一些命令可以被发送到前端单元1015。其他命令可以被发送到集线器1030或ppu 1000的其他单元,例如一个或更多个复制引擎、视频编码器、视频解码器、电源管理单元等(未明确显示)。换言之,i/o单元1005被配置为在ppu 1000的各种逻辑单元之间路由通信。
[0201]
在一个实施例中,由主机处理器执行的程序在缓冲区中对命令流进行编码,该缓冲区将工作负载提供给ppu 1000以进行处理。工作负载可以包括若干指令和要由那些指令处理的数据。缓冲区是可由主机处理器和ppu 1000两者访问(例如,读/写)的存储器中的区域。例如,i/o单元1005可以配置为访问经由在互连1002传输的存储器请求连接到互连1002
的系统存储器中的缓冲区。在至少一个实施例中,主机处理器将命令流写入缓冲区,然后将指示命令流开始的指针发送给ppu 1000。前端单元1015接收指向一个或更多个命令流指针。前端单元1015管理一个或更多个流,从流中读取命令并将命令转发到ppu 1000的各个单元。
[0202]
前端单元1015耦合到调度器单元1020,该调度器单元1020配置各种gpc 1050以处理由一个或更多个流定义的任务。调度器单元1020配置为跟踪与调度器单元1020管理的各种任务有关的状态信息。状态可以指示任务被分配给哪个gpc 1050,任务是活跃的还是非活跃的,与任务相关联的优先级等等。调度器单元1020管理在一个或更多个gpc 1050上执行的多个任务。
[0203]
调度器单元1020耦合到工作分配单元1025,该工作分配单元1025配置为分派任务以在gpc 1050上执行。工作分配单元1025可以跟踪从调度器单元1020接收到的多个调度任务。在一个实施例中,工作分配单元1015管理每个gpc 1050的待处理任务池和活跃任务池。待处理任务池可以包括多个时隙(例如32个时隙),这些时隙包含分配给要由特定的gpc1050处理的任务。活跃任务池可包括用于由gpc 1050主动处理的任务的多个时隙(例如4个时隙)。随着gpc 1050完成任务的执行,该任务将从gpc 1050的活动任务池中逐出,并且从待处理任务池中选择其他任务中的一个,并安排其在gpc 1050上执行。如果活跃任务在gpc 1050上已处于空闲状态,例如在等待数据依赖性解决时,则活跃任务可以从gpc1050中驱逐并返回到待处理任务池,同时选择了待处理任务池中的另一个任务并调度在gpc 1050上执行。
[0204]
工作分配单元1025经由xbar 1070与一个或更多个gpc 1050通信。xbar 1070是互连网络,其将ppu 1000的许多单元耦合到ppu 1000的其他单元。例如,xbar 1070可以配置为将工作分配单元1025耦合到特定的gpc 1050。虽然没有明确显示,一个或更多个ppu 1000的其他单元也可以通过集线器1030连接到xbar 1070。
[0205]
任务由调度器单元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更详细地描述。
[0206]
在一个实施例中,主机处理器执行驱动器核心,该驱动程序核心实现应用程序编程接口(api),该应用程序编程接口使在主机处理器上执行的一个或更多个应用程序能够调度操作以在ppu 1000上执行。在一个实施例中,多个计算应用程序由ppu 1000同时执行,并且ppu 1000为多个计算应用程序提供隔离、服务质量(qos)和独立的地址空间。应用程序可以生成指令(例如,api调用),该指令使驱动器核心生成一个或更多个任务以供ppu 1000执行。驱动器核心将任务输出至由ppu 1000处理的一个或更多个流。每个任务可以包括一个或更多个相关线程组,本文中称为线程束(warp)。在一个实施例中,线程束包括可以并行执行的32个相关线程。协作线程可以指代多个线程,包括用于执行任务并且通过共享存储器交换数据的指令。根据一些实施例的线程、协作线程和诸如协作线程阵列(cta)和协作组
阵列(cga)的线程的分层包在提交于2022年3月10日的标题为“协作组阵列(cooperative group arrays)”的美国申请no.17/691,621中有更详细的描述,其全部内容通过引用并入本文。
[0207]
图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中所示的单元之外的其他硬件单元。
[0208]
在一个实施例中,gpc 1050的操作由管线管理器1110控制。管线管理器1110管理一个或更多个dpc 1120的配置,以处理分配给gpc 1050的任务。在一个实施例中,管线管理器1110可以配置一个或更多个dpc1120中的至少一个以实现图形渲染管线的至少一部分、神经网络和/或计算管线。例如,关于图形渲染管线,dpc 1120可以配置为在可编程流式多处理器(sm)1140上执行顶点着色器程序。管线管理器1110可以也配置为将从工作分配单元1025接收的分组路由到gpc 1050内的适当逻辑单元。例如,可以将一些分组路由到prop 1115和/或光栅引擎1125中的固定功能硬件单元,而可以将其他分组路由到dpc 1120以由图元引擎1135或sm1140进行处理。
[0209]
prop单元1115配置为将由光栅引擎1125和dpc 1120生成的数据路由到光栅操作(rop)单元,结合图11b更详细地描述。prop单元1115可以也配置为执行用于颜色混合的优化、组织像素数据、执行地址转换等等。
[0210]
包括在gpc 1050中的每个dpc 1120包括m管线控制器(mpc)1130、图元引擎1135和一个或更多个sm 1140。mpc 1130控制dpc 1120的操作,将从管线管理器1110接收的分组路由到dpc 1120中的适当单元。例如,将与顶点相关联的分组可以路由到图元引擎1135,图元引擎1135配置为从存储器1004中获取与顶点关联的顶点属性。相反地,可以将与着色器程序相关联的分组发送到sm 1140。
[0211]
sm 1140包括可编程流式处理器,其配置为处理由多个线程表示的任务。每个sm 1140是多线程的并且配置为同时执行来自特定线程组的多个线程(例如32个线程)。在一个实施例中,sm 1140实现simd(单指令、多数据)架构,其中将一组线程(例如,线程束)中的每个线程配置为基于相同的指令集来处理不同的数据集。线程组中的所有线程执行相同指令。在另一个实施例中,sm 1140实现simt(单指令、多线程)架构,其中一组线程中的每个线程配置为基于相同指令来处理不同的数据集,但是其中线程组中的各个线程允许在执行期间发散。在一个实施例中,为每个线程束维护程序计数器、调用栈和执行状态,从而当线程束中的线程发散时,实现线程束和线程束内的串行执行之间的并发性。在另一个实施例中,为每个单独的线程维护程序计数器、调用栈和执行状态,从而使得在线程束内和线程束之间的所有线程之间具有相等的并发性。当为每个单独的线程维持执行状态,为了最大化效率可以收敛并并行地执行执行相同指令的线程。下文结合图12更详细地描述sm 1140。
[0212]
mmu 1190在gpc 1050和分区单元1080之间提供接口。mmu 1190可以提供虚拟地址到物理地址的转换、存储器保护以及存储器请求的仲裁。在一个实施例中,mmu 1190提供一个或更多个转换后备缓冲区(tlb),用于执行虚拟地址到存储器1004中的物理地址的转换。
[0213]
图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同步动态随机存取存储器,或其他类型的持久存储。
[0214]
在一个实施例中,存储器接口1170实现hbm2存储器接口,并且y等于u的一半。在一个实施例中,hbm2存储器堆栈与ppu 1000一起位于相同的物理封装上,与传统的gddr5 sdram系统相比,可提供大量功率并节省面积。在一个实施例中,每个hbm2堆栈包括四个存储器管芯,且y=4,hbm2堆栈包括每个管芯两个128位通道,用于总共8个通道和1024位的数据总线宽度。
[0215]
在一个实施例中,存储器1004支持单错误校正双错误检测(secded)错误校正码(ecc)以保护数据。ecc为对数据损坏敏感的计算应用程序提供更高的可靠性。在ppu 1000处理非常大的数据集和/或长时间运行应用程序的大规模集群计算环境中,可靠性尤其重要。
[0216]
在一个实施例中,ppu 1000实现了多级存储器层次结构。在一个实施例中,存储器分区单元1080支持统一存储器以为cpu和ppu 1000存储器提供单个统一虚拟地址空间,从而实现虚拟存储器系统之间的数据共享。在一个实施例中,跟踪ppu 1000对位于其他处理器上的存储器的访问频率,以确保将存储器页面移动到更频繁地访问页面的ppu 1000的物理存储器。在一个实施例中,nvlink 1010支持地址转换服务,其允许ppu 1000直接访问cpu的页表,并通过ppu 1000提供对cpu存储器的完全访问。
[0217]
在一个实施例中,复制引擎在多个ppu 1000之间或ppu 1000与cpu之间传输数据。复制引擎可以为未被映射到页表中的地址生成页面错误。存储器分区单元1080然后可以为页面错误提供服务,将地址映射到页表中,之后复制引擎执行传输。在传统系统中,为多个处理器之间的多个复制引擎操作固定(即不可分页)存储器,从而实质上减少了可用存储器。在硬件页面故障的情况下,可以将地址传递给复制引擎,而无需担心是否驻留存储器页,并且复制过程是透明的。
[0218]
来自存储器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。
[0219]
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或其他单元中。
[0220]
图12示出了根据一个实施例的图11a的流式多处理器1140。如图12所示,sm 1140包括指令高速缓存1205、一个或更多个调度器单元1210、寄存器文件1220、一个或更多个处理核心1250、一个或更多个特殊功能单元(sfu)1252、一个或更多个加载/存储单元(lsu)1254、互连网络1280、共享存储器/l1高速缓存1270。
[0221]
如上所述,工作分配单元1025调度任务以在ppu 1000的gpc 1050上执行。任务被分配给gpc 1050内部的特定dpc 1120,并且如果任务与着色器程序相关联,则将该任务分配给sm 1140。调度器单元1210从工作分配单元1025接收任务并管理分配给sm 1140的一个或更多个线程块的指令调度。调度器单元1210调度线程块以作为并行线程的线程束来执行,其中,每个线程块被分配至少一个线程束。在一个实施例中,每个线程束执行32个线程。调度器单元1210可以管理多个不同的线程块,将线程束分配给不同的线程块,然后在每个时钟周期内将来自多个不同的协作组的指令分派给各种功能单元(例如,核心1250、sfu 1252和lsu 1254)。
[0222]
协作组是用于组织通信线程组的编程模型,其允许开发者表达线程正在通信的粒度,从而能够表达更丰富、更有效的并行分解。协作启动api支持线程块之间的同步以执行并行算法。常规编程模型提供了用于同步协作线程的单一、简单的构造:跨线程块的所有线程的屏障(例如,syncthreads()函数)。但是,程序员经常在小于线程块粒度的情形下来定义线程组,并在所定义的组内进行同步,以实现更高的性能、设计灵活性以及以集合组范围功能接口的形式实现软件重用。
[0223]
协作组使程序员能够以子块(即,小到单个线程)和多块粒度明确定义线程组,并执行集合操作,例如对协作组中的线程进行同步。该编程模型支持跨软件边界的干净组合,从而库和实用程序功能可以在其本地环境中安全地同步,而不必进行关于收敛的假设。协作组图元使协作并行的新图案成为可能,包括生产者-消费者并行,机会主义并行以及整个线程块网格上的全局同步。根据一些实施例的诸如协作线程阵列(cta)和协作组阵列(cga)的分层线程组在美国申请no.17/691,621中更详细地描述,已通过引用并入本文。
[0224]
调度单元1215配置为将指令发送到功能单元中的一个或更多个。在本实施例中,调度器单元1210包括两个调度单元1215,该两个调度单元1215使得来自相同线程束的两个不同指令能够在每个时钟周期被调度。在另一个实施例中,每个调度器单元1210可以包括单个调度单元1215或附加调度单元1215。
[0225]
每个sm 1140包括寄存器文件1220,该寄存器文件1220为sm 1140的功能单元提供了一组寄存器。在一个实施例中,寄存器文件1220在每个功能单元之间划分,从而为每个功能单元分配寄存器文件1220的专用部分。在另一个实施例中,寄存器文件1220在由sm 1140执行的不同线程束之间划分。寄存器文件1220为连接到功能单元的数据路径的操作数提供临时存储。
[0226]
每个sm 1140包括多个处理核心1250。在一个实施例中,sm 1140包括大量(例如
128个等)不同的处理核心1250。每个核心1250可以包括全管线、单精度、双精度和/或混合精度处理单元,其包括浮点算术逻辑单元和整数算术逻辑单元。在一个实施例中,浮点算术逻辑单元实现用于浮点算术的ieee 754-2008标准。在一个实施例中,核心1250包括64个单精度(32位)浮点核心、64个整数核心、32个双精度(64位)浮点核心和8个张量核心。
[0227]
张量核心配置为执行矩阵运算,并且,在一个实施例中,一个或更多个张量核心包括在核心1250中。特别地,张量核心配置为执行深度学习矩阵算术,例如用于神经网络训练和推理的卷积运算。在一个实施例中,每个张量核心在4
×
4矩阵上操作并且执行矩阵乘法和累加运算d=a
×
b+c,其中a、b、c和d是4
×
4矩阵。
[0228]
在一个实施例中,矩阵乘法输入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大小的矩阵。
[0229]
在一些实施例中,转置硬件被包括在处理核心1250或另一个功能单元(例如,sfu 1252或lsu 1254)中,并且被配置为生成由对角线存储的矩阵数据和/或从对角线生成原始矩阵和/或转置矩阵。对角线存储的矩阵数据。转置硬件可以在共享存储器1270内部提供给sm 1140的寄存器文件1220加载路径。
[0230]
在一个示例中,可以从dram中取出对角线存储的矩阵数据并将其存储在共享存储器1270中。当使用对角线存储的矩阵数据执行处理的指令被处理时,设置在共享存储器1270的路径中的转置硬件并且寄存器文件1220可以提供原始矩阵、转置矩阵、压缩原始矩阵和/或压缩转置矩阵。直到指令之前的最后存储,可以保持由对角线存储的单个矩阵数据,并且由指令指定的矩阵类型根据需要在寄存器文件1220中生成。
[0231]
每个sm 1140也包括执行特殊功能(例如,属性评估、倒数平方根等)的多个sfu 1252。在一个实施例中,sfu 1252可以包括配置为遍历分层树数据结构的树遍历单元(例如ttu 1143)。在一个实施例中,sfu1252可以包括配置为执行纹理映射过滤操作的纹理单元(例如纹理单元1142)。在一个实施例中,纹理单元配置为从存储器1004中加载纹理映射(例如,纹理像素的2d阵列)和采样纹理映射,以产生采样的纹理值以供由sm 1140执行的着色器程序使用。在一个实施例中,将纹理映射存储在共享存储器/l1高速缓存1170中。纹理单元使用mip映射(mip-maps)(例如,细节级别不同的纹理映射)来实现纹理操作(诸如过滤操作)。在一个实施例中,每个sm 1140包括两个纹理单元。
[0232]
每个sm 1140也包括实现共享存储器/l1高速缓存1270与寄存器文件1220之间的加载和存储操作的多个lsu 1254。每个sm 1140包括互连网络1280,其将每个功能单元连接到寄存器文件1220,并且lsu 1254连接到寄存器文件1220、共享存储器/l1高速缓存1270。在一个实施例中,互连网络1280是交叉开关,其可以配置为将任何功能单元连接到寄存器文件1220中的任何寄存器,并且将lsu 1254连接到寄存器文件1220和共享存储器/l1高速缓存1270中的存储器位置。在示例实施例中,lsu 1254包括tmau 112。然而,在某些实施例中,tmau 112可以与lsu分离。每个tmau 112可以被紧密耦合在单个sm或更多个sm上。在
tmau 112与多个sm紧密耦合的实施例中,仲裁器可以接收来自sm的请求并将其连续转发到tmau 112。
[0233]
共享存储器/l1高速缓存1270是片上存储器的阵列,其允许sm 1140与图元引擎1135之间以及sm 1140中的线程之间的数据存储和通信。在一个实施例中,共享存储器/l1高速缓存1270包括128kb的存储容量,并且位于从sm 1140到分区单元1180的路径中。共享存储器/l1高速缓存1270可以用于高速缓存读取和写入。共享存储器/l1高速缓存1270、l2高速缓存1160和存储器中1004的一个或更多个是后备存储。
[0234]
将数据高速缓存和共享存储器功能组合到单个存储器块中,为两种类型的存储器访问提供了最佳的全局性能。容量由不使用共享存储器的程序使用或将其用作高速缓存。例如,如果共享存储器配置为使用一半容量,并且纹理和加载/存储操作可以使用剩余容量。在共享存储器/l1高速缓存1270内的集成使共享存储器/l1高速缓存1270能够用作用于流传输数据的高吞吐量管线,同时提供对频繁重用的数据的高带宽和低延迟访问。
[0235]
在本公开的上下文中,sm或“流式多处理器”是指按照授予诺德奎斯特(nordquist)的usp7,447,873中所述架构的处理器,包括对其的改进和进展,并且例如在多代nvidia gpu中实现。例如,sm可以包括多个处理引擎或核心,这些处理引擎或核心被配置为同时执行多个线程,这些线程排列在多个单指令多数据(simd)组(例如,线程束)中,其中每个线程在同一个simd组在不同的输入对象上执行包括一系列指令的相同数据处理程序,并且在同一个simd组中的不同线程使用不同的处理引擎或核心来执行。sm通常还可以提供具有多个通道的本地寄存器文件,其中每个处理引擎或核心被配置为访问通道的不同子集;指令发布逻辑,被配置为选择simd组之一并将相同数据处理程序的指令之一并行发布到多个处理引擎中的每一个,其中每个处理引擎与每个其他处理引擎并行地执行相同指令,每个其他处理引擎使用可对其访问的本地寄存器文件通道的子集。sm通常还包括被配置为启动一个或更多个simd组的执行的核心接口逻辑。如图所示,此类sm已被构建为提供快速的本地共享存储器,从而在sm上执行的cta的所有线程之间实现数据共享/重用和同步。
[0236]
当配置用于通用并行计算时,与图形处理相比,可以使用更简单的配置。特别地,绕过固定功能图形处理单元,从而创建了更加简单的编程模型。在至少一个实施例中,在通用并行计算配置中,工作分配单元直接将线程的块分配和分布给dpc 1120。块中的线程执行相同的程序,在计算中使用唯一的线程id以确保每个线程生成唯一的结果,使用sm 1140执行程序并执行计算,使用共享存储器/l1高速缓存1270在线程之间进行通信,以及使用lsu 1254通过共享存储器/l1高速缓存1270和存储器分区单元1080来读写全局存储器。当被配置用于通用并行计算时,sm 1140向调度器单元1020写入可以用来在dpc 1120上启动新工作的命令。
[0237]
ppu 1000被包括在台式计算机、膝上型计算机、平板电脑、服务器、超级计算机、智能电话(例如,无线、手持设备)、个人数字助理(pda)、数码相机、车辆、头戴式显示器、手持式电子设备等中或与之耦合。在一个实施例中,ppu 1000被实现在单个半导体基板上。在另一个实施例中,ppu 1000与一个或更多个其他设备(例如附加的ppu 1000、存储器1004、精简指令集计算机(risc)cpu,一个或更多个存储器管理单元(mmu)、数模转换器(dac)等)一起被包括在片上系统(soc)中。
1000的存储器1004。在一个实施例中,nvlink 1010支持一致性操作,允许从存储器1004读取的数据存储在高速缓存中cpu1330的层次结构,减少cpu 1330的高速缓存访问延迟。在一个实施例中,nvlink 1010包括对地址转换服务(ats)的支持,允许ppu 1000直接访问cpu 1330内的页表。一个或更多个nvlinks 1010也可以配置为在低功率模式下运行。
[0246]
图13b示出了示例性系统1365,其中可以实现各种先前实施例的各种架构和/或功能。示例性系统1365可以被配置为实现本技术中公开的方法(例如,图1、2、6或11a中的tmau)。
[0247]
如图所示,提供了一种系统1365,包括至少一个中央处理单元1330,该中央处理单元1330连接到通信总线1375。通信总线1375可以使用任何合适的协议来实现,例如pci(外围组件互连)、pci-express、agp(加速图形端口)、hypertransport或任何其他总线或点对点通信协议。系统1365还包括主存储器1340。控制逻辑(软件)和数据存储在可以采取随机存取存储器(ram)形式的主存储器1340中。
[0248]
系统1365还包括输入设备1360、并行处理系统1325和显示设备1345,例如传统的crt(阴极射线管)、lcd(液晶显示器)、led(发光二极管)、等离子显示器等。可以从输入设备1360接收用户输入,例如键盘、鼠标、触摸板、麦克风等。前述模块和/或设备中的每一个甚至可以位于单个半导体平台上以形成系统1365。或者,根据用户的需要,各种模块也可以单独或以半导体平台的各种组合放置。
[0249]
此外,系统1365可以耦合到网络(例如,电信网络、局域网(lan)、无线网络、广域网(wan)如互联网、对等网络、有线网络或等)通过网络接口1335用于通信目的。
[0250]
系统1365还可以包括辅助存储器(未示出)。辅助存储器包括例如硬盘驱动器和/或可移动存储驱动器,代表软盘驱动器、磁带驱动器、压缩盘驱动器、数字通用磁盘(dvd)驱动器、记录设备、通用串行总线(usb)闪存。可移动存储驱动器以众所周知的方式从可移动存储单元读取和/或写入到可移动存储单元。
[0251]
计算机程序或计算机控制逻辑算法可以存储在主存储器1340和/或辅助存储器中。这样的计算机程序在被执行时使系统1365能够执行各种功能。存储器1340、存储器和/或任何其他存储器是计算机可读介质的可能示例。
[0252]
各种先前附图的架构和/或功能可以在通用计算机系统、电路板系统、专用于娱乐目的的游戏控制台系统、专用系统和/或任何其他所需系统的上下文中实现。例如,系统1365可以采用台式计算机、膝上型计算机、平板计算机、服务器、超级计算机、智能电话(例如,无线手持设备)、个人数字助理(pda)、数码相机、车辆、头戴式显示器、手持电子设备、移动电话设备、电视、工作站、游戏机、嵌入式系统和/或任何其他类型的逻辑。
[0253]
应用程序可以通过由诸如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的硬件。
[0254]
可以在ppu 1000内执行各种程序,以实现应用程序处理的各个阶段。例如,设备驱动程序可以启动ppu 1000上的内核以在一个sm 1140(或更多个sm 1140)上执行一个阶段的处理。设备驱动程序(或由ppu 1000执行的初始内核)也可以启动ppu 1000上的其他内核以执行处理的其他阶段。如果应用程序处理包括图形处理管线,则图形处理管线的一些阶段可以在固定单元硬件上实现,例如在ppu 1000内实现的光栅化器或数据组装器。应该理解的是,从一个在由sm 1140上的后续内核处理之前,内核可以由一个或更多个介入的固定功能硬件单元处理。
[0255]
以上引用的所有专利和印刷出版物在此以引用方式并入,如同明确阐述一样。
[0256]
尽管本发明已经结合目前被认为是最实用和优选的实施例进行了描述,但应理解本发明不限于所公开的实施例,相反,旨在涵盖各种包括在所附权利要求的精神和范围内的修改和等效布置。
技术特征:
1.一种并行处理器,包括:存储器接口;多个处理器;以及多个存储器访问硬件电路,每个存储器访问硬件电路被耦合到所述多个处理器中的处理器并且被配置为:从耦合的处理器接收对多维数据结构的存储器访问请求,所述存储器访问请求指定所述多维数据结构的坐标;以及响应于所述存储器访问请求,至少将所述多维数据结构的所述坐标转换为所述多维数据结构的多个存储器地址,并使用所述多个存储器地址异步传输所述多维数据结构的至少一部分。2.如权利要求1所述的并行处理器,其中所述异步传输是从通过所述存储器接口访问的外部存储器中的位置到所述外部存储器中的另一位置。3.如权利要求1所述的并行处理器,其中所述异步传输在通过所述存储器接口访问的外部存储器中的位置和所述耦合的处理器的共享存储器中的位置之间进行。4.如权利要求3所述的并行处理器,其中耦合到所述处理器的所述存储器访问硬件电路被配置成对耦合到所述存储器访问硬件电路的所述处理器的共享存储器和对所述外部存储器的读取和写入。5.如权利要求3所述的并行处理器,其中至少所述坐标定义存储在所述外部存储器中的所述多维数据结构内的数据块的位置。6.如权利要求5所述的并行处理器,其中耦合到所述处理器的所述存储器访问硬件电路进一步被配置为通过从用于所述多维数据结构的先前存储的描述符中获得所述多维数据结构的基地址来执行所述转换。7.如权利要求6所述的并行处理器,其中耦合到所述处理器的所述存储器访问硬件电路包括设置电路,所述设置电路被配置为在执行所述转换之前将先前存储的描述符从所述外部存储器预取到所述存储器访问硬件电路中的描述符高速缓存中。8.如权利要求6所述的并行处理器,其中耦合到所述处理器的所述存储器访问硬件电路进一步被配置为:在所述多维数据结构的读取期间检测所述外部存储器中的所述多维数据结构的出界的存储器位置。9.如权利要求6所述的并行处理器,其中耦合到所述处理器的所述存储器访问硬件电路进一步被配置为:在所述耦合的处理器的所述共享存储器中的所述位置的写入期间以预定值对所述外部存储器中的所述多维数据结构的出界的存储器位置进行编码。10.如权利要求5所述的并行处理器,其中耦合到所述处理器的所述存储器访问硬件电路进一步被配置为:通过将所述至少一部分从所述外部存储器直接写入到所述处理器的所述共享存储器中,从所述处理器的所述共享存储器直接写入到所述外部存储器中,或从所述外部存储器中的第一位置直接写入到所述外部存储器中的第二位置处来执行所述异步传输。11.如权利要求5所述的并行处理器,其中耦合到所述处理器的所述存储器访问硬件电路进一步被配置为:不管所请求的所述数据块的大小,响应于在单个消息中接收的所述存储器访问请求,来执行所述异步传输。
12.如权利要求5所述的并行处理器,其中耦合到所述处理器的所述存储器访问硬件电路进一步被配置为:确定所述数据块是否是存储在所述外部存储器中的张量中的一部分或者所述数据块是否包括所述外部存储器中的非张量数据。13.如权利要求5所述的并行处理器,其中耦合到所述处理器的所述存储器访问硬件电路进一步被配置为:读取来自所述外部存储器的数据的所述至少一部分并将所述数据块以混杂形式写入所述共享存储器。14.如权利要求13所述的并行处理器,其中耦合到所述处理器的所述存储器访问硬件电路进一步被配置为:根据预定的混杂模式将所述数据的所述至少一部分以所述混杂形式写入所述共享存储器。15.如权利要求14所述的并行处理器,其中耦合到所述处理器的所述存储器访问硬件电路进一步被配置为:根据对于请求所接收的响应中包括的信息来确定所述预定的混杂模式,以执行来自所述外部存储器的所述数据的所述至少一部分的所述读取。16.如权利要求5所述的并行处理器,其中耦合到所述处理器的所述存储器访问硬件电路进一步被配置为以所述块模式访问所述外部存储器。17.如权利要求5所述的并行处理器,其中耦合到所述处理器的所述存储器访问硬件电路进一步被配置为以所述图像到列模式访问所述外部存储器。18.如权利要求5所述的并行处理器,其中耦合到所述处理器的所述存储器访问硬件电路包括请求队列、描述符高速缓存、设置电路、请求生成电路和请求完成跟踪电路。19.如权利要求5所述的并行处理器,其中耦合到所述处理器的所述存储器访问硬件电路进一步被配置为:针对数据的所述至少一部分中的数据的每个子块,更新所耦合的相应处理器的所述共享存储器中的计数器,其中所述相应处理器包括同步电路,所述同步电路被配置为监控所述计数器的预定值。20.如权利要求5所述的并行处理器,其中耦合到所述处理器的所述存储器访问硬件电路进一步被配置为:读取所述外部存储器中的所述至少一部分并将所述至少一部分写入到所述多个处理器的组中的每一个处理器的共享存储器中的位置。21.如权利要求3所述的并行处理器,其中所述存储器访问请求是从所述外部存储器到所述共享存储器的加载操作或者从所述共享存储器到所述外部存储器的存储操作。22.如权利要求1所述的并行处理器,其中所述异步传输包括归约操作。23.如权利要求1所述的并行处理器,其中所述异步传输包括多播操作。24.如权利要求1所述的并行处理器,其中每个所述处理器包括具有不同计算能力和/或精度的多个并行处理核心,所述多个并行处理核心访问公共指令高速缓存存储器。25.如权利要求1所述的并行处理器,还包括仲裁器硬件电路,其中所述存储器访问硬件电路通过所述仲裁器硬件电路被耦合到所述处理器和至少另一个处理器。26.一种在包括多个处理器的并行处理器中执行的方法,所述方法包括:由耦合到所述多个处理器中的处理器的存储器访问硬件电路,从所耦合的多处理器,接收指定多维数据结构的坐标的存储器访问请求,其中所述存储器访问硬件电路是多个存储器访问电路之一,每个存储器访问电路被耦合到相应的所述处理器之一;以及响应于所述存储器访问请求,至少将所述多维数据结构的所述坐标转换为所述多维数据结构的多个存储器地址并使用所述多个存储器地址,异步传输所述多维数据结构的至少
一部分。27.一种存储器访问硬件电路,包括:到外部存储器的接口;存储器输入/输出接口,用于接收来自处理器的存储器访问请求;至少一个存储器接口,其到一个或更多个其他处理器和所述处理器中的每一个处的相应共享存储器;以及处理管线,其被配置为:从所述处理器接收指定多维数据结构的坐标的存储器访问请求,其中所述存储器访问硬件电路是多个存储器访问电路之一,每个所述存储器访问电路被耦合到相应的所述处理器之一;以及响应于所述存储器访问请求,至少将所述多维数据结构的所述坐标转换为所述多维数据结构的多个存储器地址并使用所述多个存储器地址,异步传输所述多维数据结构的至少一部分。
技术总结
本公开涉及用于高效访问多维数据结构和/或其他大型数据块的方法和装置。并行处理单元包括多个处理器,每个处理器被耦合到存储器访问硬件电路。每个存储器访问硬件电路被配置为从耦合的处理器接收指定多维数据结构的坐标的存储器访问请求,其中存储器访问硬件电路是多个存储器访问电路之一,每个存储器访问电路被耦合到相应的处理器之一;以及,响应于存储器访问请求,将多维数据结构的坐标转换为多维数据结构的多个存储器地址,并使用多个存储器地址异步传输多维数据结构的至少一部分以便由耦合的处理器处理。存储器位置可以在耦合的处理器的共享存储器和/或外部存储器中。处理器的共享存储器和/或外部存储器中。处理器的共享存储器和/或外部存储器中。
技术研发人员:A
受保护的技术使用者:辉达公司
技术研发日:2022.10.14
技术公布日:2023/9/20
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
飞机超市 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/
上一篇:三通铜管的制作方法 下一篇:一种装配式建筑钢结构焊板除锈装置的制作方法