适用于神经网络的高效矩阵格式的制作方法

文档序号:22739357发布日期:2020-10-31 09:21阅读:230来源:国知局
适用于神经网络的高效矩阵格式的制作方法

该技术涉及数据集的压缩和解压缩,以用于紧凑存储和通信,更具体地涉及压缩稀疏矩阵数据,以便随后以转置和/或非转置形式进行解压缩。该技术还涉及稀疏矩阵数据的压缩和解压缩,以用于例如深度学习、机器学习和人工智能系统等。该技术还涉及在深度神经网络(dnn)中生成、存储和/或使用压缩的和解压缩的稀疏矩阵数据的图形处理单元(gpu)。



背景技术:

大规模并行处理系统,诸如gpu(图形处理单元),包括许多高性能处理单元,这些处理单元可以同时并行执行算术运算。大量的并行处理单元使其非常适合并行处理大型数据集。这些系统虽然可以使用并行处理加快处理大型数据集,但是对大型数据集执行计算的巨大成本是内存延迟和带宽。

数据压缩可以用来减少内存延迟和传输延迟。数据压缩器减小了用于存储和/或通信的数据大小。数据解压器可用于恢复数据以供进一步处理和用于其他用途。数据压缩可以是有损的,也可以是无损的。有损编码方法使用不精确的近似和/或去除不想要或不需要的数据。mp3音频、h.265视频和jpeg图像就是有损编码的例子。这种压缩技术消除了对人类感知没有太大影响的更详细的信息(例如,考虑一下更长的故事的“删节版”),因此数据可以存储在减小的内存空间中,并在更小的带宽下更快地传输。相反,无损编码方法将数据压缩成一种格式,从这种格式可以恢复所有原始数据,而不会丢失信息。无损(“无删节”)编码通常用于数据表示文本或数学属性的应用中,每个细节都有不同。无损压缩可以使用多种不同的技术用于在更小的空间中表示相同数量的数据。

一种类型的常用大型数据集是所谓的“稀疏矩阵”,其可以从无损压缩中获益。稀疏矩阵广泛用于许多应用中,诸如机器学习、人工智能和深度神经网络等。基本上,当一个矩阵包含许多零值时(例如,零值比非零值多得多),它就是“稀疏的”。由于稀疏矩阵包含相对较少的非零值,因此稀疏矩阵是数据压缩的天然候选。

为了有效地存储和处理稀疏矩阵,可以使用只存储非零项的压缩数据结构(存储格式)。已经提出了各种压缩存储格式:

·坐标(coo)格式将行索引和列索引以及所有非零项的值明确地分别存储在行数组、列数组和数据数组中。

·压缩稀疏行(csr)格式保留了与coo相同的列数组和数据数组,但将行索引压缩为指针元素,该指针元素是列/数据中所有行的起始位置。

·对角线(dia)格式沿对角线方向(从左上角到右下角)存储非零。数组偏移量记录每个对角线相对于主对角线的偏移量。

参见例如赵等人的“桥接深度学习和稀疏矩阵格式选择之间的差距(bridgingthegapbetweendeeplearningandsparsematrixformatselection)”,奥地利维也纳2018年2月24-28日的第18届ppopp会议(acm2018);在mathkernellibrary<software.intel.com/en-us/mkl-developer-reference-c-sparse-blas-diagonal-matrix-storage-format>上的“稀疏blas对角矩阵存储格式(sparseblasdiagonalmatrixstorageformat)”。

对于许多压缩/解压缩技术,在紧凑性和时间之间存在权衡。就像仔细地打包一个旅行袋以尽可能多地装东西要花费更长时间一样,压缩稀疏矩阵数据文件以实现最大压缩可能也需要更长的时间。但与旅行包的类比不同,与压缩程度较低的数据文件相比,高度压缩的稀疏矩阵数据文件进行解压缩可能需要长得多的时间。随着数据大小和分析需求的增加,需要高效地按需数据解压缩的解决方案。例如,需要这样的解决方案,其以这种格式提供压缩数据,这种格式能够有效地生成例如取决于数据将如何被使用的几个不同版本的解压缩数据。



技术实现要素:

示例实施例提供了一种用于矩阵数据的无损数据压缩器和解压器(“编解码器”)。示例实施例提供了一种使用矩阵数据生成、存储和/或执行操作的系统和方法,该矩阵数据使用对角线存储格式进行压缩。对角线存储格式允许容易地从对角线存储格式生成原始矩阵、转置矩阵、紧凑(compacted)原始矩阵和/或紧凑转置矩阵。对角线存储格式的示例实施例包括沿矩阵的每个对角线依次排列的非零元素的数组和非零元素的索引。非零元素的索引可以在映射中提供,该映射例如指示非零元素的位置的位图。在某些示例实施例中,映射的行可以循环移位,非零元素的索引可以从循环移位后的位图确定。

示例实施例提供了一种处理系统(例如gpu),被配置为执行从内存中加载用于从共享内存中检索以对角线存储格式存储的矩阵数据的指令,并将数据解压缩为另一种格式。例如,内存加载指令可以包括将以对角线存储格式存储的矩阵数据转换为密集矩阵或密集转置矩阵,并将密集矩阵或密集转置矩阵和元数据写入寄存器中。

根据实施例,提供了一种数据解压器。解压器包括输入电路和解码器,输入电路被配置为接收压缩数据文件,其包括:(a)沿着稀疏矩阵对角线的非零值的流和(b)指示非零值的稀疏矩阵位置的掩码。解码器被配置为使用掩码来用流中的非零值填充转置密集矩阵。

根据一些示例实施例,解码器可以被配置为填充转置密集矩阵,而不存储中间矩阵数据。

根据另一个实施例,提供了一种处理系统,被配置为执行存储在内存中的负载矩阵指令,以及基于非零值的流和掩码生成密集矩阵和元数据。指令可以检索压缩数据,压缩数据包括:(a)沿矩阵对角线的非零值的流和(b)指示流中的非零值的矩阵位置的掩码。在一些实施例中,生成的密集矩阵是由非零值的流和元数据所表示的矩阵的转置矩阵,生成的密集矩阵存储在寄存器中,和/或是由非零值的流和包括稀疏度大于0.5的数据的掩码所表示的矩阵。

根据另一个实施例,提供了一种由至少一个可编程多线程处理器执行的方法。所述方法包括:从内存接收压缩矩阵数据,所述压缩矩阵数据包括沿矩阵对角线的连续非零值的数组和指示非零值的位置的掩码;基于连续非零值的数组和掩码生成密集矩阵和/或密集转置矩阵;并将生成的矩阵或转置矩阵存储在内存中。

根据另一个实施例,提供了一种由至少一个处理器执行的方法,该至少一个处理器执行存储在内存中的指令。该方法包括:从内存接收压缩矩阵数据,该压缩矩阵数据包括(a)沿矩阵对角线的非零值的流和(b)指示该流中非零值的矩阵位置的索引数据;以及执行多个线程,以基于索引数据确定非零值的矩阵坐标和/或转置矩阵坐标,其中每个线程确定不同非零值的坐标。

附图说明

下面结合附图对示例性非限制性实施例的具体实施方式进行理解,其中:

图1a示出了示例非限制性的数据压缩和解压缩。

图1b示出了根据本说明书公开的各个实施例的示例处理系统的框图,该处理系统包括用于压缩和/或解压缩稀疏矩阵数组的压缩器和解压器。

图2a示出了训练神经网络以识别某些动物的示例。

图2b示出了神经网络中的神经元,它接收来自其他神经元的n个输入,并接收偏置值。

图3a示出了矩阵和转置矩阵。

图3b和图3c示出了矩阵和转置矩阵的相应对角线。

图4示出了用于获得矩阵的位掩码的过程。

图5a示出了用对角线表示矩阵的示例非限制性方法。

图5b示出了编码器的示例非限制性示意性表示,该编码器可以生成对角线存储格式的压缩数据。

图6示出了从由对角线存储的矩阵生成矩阵的示例非限制性方法。

图7示出了示例非限制性的并行处理系统。

图8示出了将对角线格式转换为原始矩阵和/或转置矩阵的示例非限制性方法。

图9a和图9b示出了使用多个线程将对角线格式转换为原始矩阵和/或转置矩阵的示例非限制性实现方式。

图10a和图10b示出了使用多个线程将对角线格式转换为原始矩阵和/或转置矩阵的另一个示例非限制性实现方式。

图11a示出了示例非限制性地使用对角矩阵和元数据压缩以执行矩阵乘法指令。

图11b示出了解码器的示例非限制性示意性表示,解码器可以从对角线存储格式的数据生成解压缩数据。

图12a-图12c示出了针对每行具有4个元素和2个非零值的矩阵的用对角线的矩阵表示。

图13示出了根据实施例的并行处理单元。

图14a示出了根据实施例的图13的并行处理单元内的通用处理集群。

图14b示出了根据实施例的图13的并行处理单元的内存分区单元。

图15a示出了根据实施例的图14a的流式多处理器。

图15b是根据实施例的使用图13的并行处理单元(ppu)实现的处理系统的概念图。

图15c示出了示例性系统,其中可以实现前面各种实施例的各种体系架构和/或功能。

图16是根据实施例的由图13的ppu实现的图形处理管线的概念图。

具体实施方式

本文的示例非限制性技术提供了数据压缩器和解压器,它们以按对角线顺序存储非零值的格式压缩和解压缩矩阵数据。这种压缩格式允许无损压缩。解压器可以使用压缩数据有效地生成不同版本的数据。例如,一个实施例的解压器可以选择性地恢复原始稀疏矩阵,或者产生该稀疏矩阵的转置版本。因此,本文的示例非限制性技术提供了数据解压器,它可以解压缩数据来恢复原始数据、生成不同压缩格式的原始数据、和/或提供原始数据的经修改版本。不同的压缩格式可以是使处理系统高效地对其执行计算的格式。原始数据的经修改版本可以包括按不同顺序提供的原始数据。例如经修改的表示可以包括转置矩阵,该转置矩阵将原始矩阵的行重新排序为转置矩阵的列。

本文的示例非限制性技术还提供了一种格式的压缩数据,解压器可以从该格式的压缩数据提取信息用于执行运算,而不需要重构由压缩数据所表示的原始数据。例如,对于某些操作,解压器可以选择性地恢复原始稀疏矩阵和/或该稀疏矩阵的转置版本的索引或非零值和索引,而不生成原始矩阵和/或转置矩阵。

本文的示例非限制性技术还提供了处理系统(如gpu),其被配置为执行从内存加载的指令,其可以将压缩数据解压缩为请求数据的操作所需的格式。例如,对于某些操作,从内存加载的指令可以检索压缩矩阵数据,将该数据转换为一种或更多种不同的格式(例如,压缩格式、解压格式和/或数据重新布置的格式),并将转换后的数据存储在寄存器中。

图1a示出了示例非限制性数据压缩和解压缩或“编解码器”系统100。编解码器系统100可包括压缩器10和多个不同的解压器20(这些解压器均可在相同的“编解码系统”100或解压器20中提供)。压缩器10可以被配置为将稀疏矩阵数组压缩为压缩数据文件102。解压器20a-20d可以被配置为从相同的压缩数据文件102生成不同的解压缩数据的数据集。

压缩器10接收稀疏矩阵数组104,并生成对角线存储格式的压缩数据文件102。在一个示例实施例中,对角线存储格式包括掩码和对角线排序的非零值的流。掩码提供用于确定非零值在解压缩数据(如原始稀疏矩阵数组或转置稀疏矩阵数组)中的位置的数据。在一个示例中,掩码可以是位掩码,其中1(或0)指示非零值在稀疏矩阵数组中的位置。

掩码和对角线排序的非零值可以存储在内存中,供解压器20a-20d检索和/或传输给解压器20a-20d。

解压器20a-20d可以被配置为对压缩数据进行解压缩,并生成与稀疏矩阵数组104对应的数据集106。在一些示例实施例中,可以使用生成的数据集106执行运算(例如线性代数运算)。在一些示例实施例中,可以使用从压缩数据(例如,非零值和/或非零值的矩阵索引)中提取的信息执行运算(例如,线性代数运算),而无需重构稀疏矩阵数组104。

如图1a所示,解压器20a接收压缩数据文件102(其包括掩码和非零值),并生成与提供给压缩器10的稀疏矩阵数组104相同(或实质上相同)的稀疏矩阵数组106a。解压器20b使用该相同的压缩数据文件102生成紧凑矩阵数组106b,它对应于提供给压缩器10的稀疏矩阵数组104但以“紧凑的”形式表示。解压器20c使用该相同的压缩数据文件102导出转置稀疏矩阵数组106c,它对应于提供给压缩器10的稀疏矩阵数组104的转置版本。解压器20d使用该相同的压缩数据文件102导出紧凑转置矩阵数组106d,它对应于提供给压缩器10的稀疏矩阵数组的转置版本。

在一些示例实施例中,矩阵数组的“紧凑的”版本106b、106d提供的数据格式与对角线存储格式不同,但提供的数据仍然小于原始稀疏矩阵数组104。例如,紧凑格式可以是一种使用数据执行计算而无需完全解压缩数据的格式。在一个示例中,紧凑版本提供了“密集矩阵数组”(大多数元素是非零的),它对应于稀疏矩阵数组。密集矩阵数组可以包括非零值和零值和/或按行或列顺序存储值。

在一些示例实施例中,解压器20可以被配置为对压缩数据进行解压缩,并以密集、坐标、压缩稀疏行、压缩稀疏列、ellpack-itpack格式(ell)、混合存储格式和/或其他格式生成数据集。密集矩阵格式可以以列主序(column-major)格式存储在内存中,并且可以由行号、列号和指向包括矩阵元素的数据数组的指针来表示。坐标矩阵格式(coo)可以由矩阵中的若干非零元素、指向以行主序(row-major)格式保持非零值的数据数组的指针、指向包含非零值的行索引的整数数组的指针、以及指向包含非零值的列索引的整数数组的指针来表示。压缩稀疏行格式(csr)可以由矩阵中的若干非零元素、指向非零值的数据数组的指针、指向包含非零值的压缩行索引的整数数组的指针、以及指向包含非零值的列索引的整数数组的指针来表示。压缩稀疏列格式(csc)可以由矩阵中的若干非零元素、指向非零值的数据数组的指针、指向包含非零值的行索引的整数数组的指针、以及指向包含非零值的压缩列索引的整数数组的指针来表示。ellpack-itpack格式(ell)可以表示m×n稀疏矩阵a,每行最多k个非零元素,使用两个维度为m×k的密集数组存储,第一个数组包含矩阵中的非零元素的值,第二个数组包含相应的列索引。其他格式可包括块压缩稀疏行格式(bsr)或扩展bsr格式(bsrx)。

由于转置运算将原始矩阵数组的对角线映射到转置矩阵数组的对角线,因此使用对角线存储格式104的系统100的优点是它能够高效地重构原始稀疏矩阵数组106a和稀疏矩阵数组的转置版本106c。对角存储只需要非零和掩码的一个副本,从中可以推导出和/或重构原始矩阵数组和转置矩阵数组的不同版本。

在某些实施例中,解压器可以生成紧凑稀疏矩阵数组106b、转置稀疏矩阵数组106c和/或紧凑转置矩阵数组106d,而无需生成可包括原始矩阵数组的中间结果。

示例非限制性处理系统

图1b示出了示例处理系统100的框图,处理系统100包括处理器实现的压缩器10和处理器实现的解压器20,用于压缩和/或解压缩稀疏矩阵数组。压缩器10和/或解压器20可以以cpu和/或gpu的形式提供,执行存储在非暂时性内存中的指令。在一些其他示例中,压缩器10和/或解压器20可在硬件中作为内存控制器的一部分提供,内存控制器例如高速缓存控制器,其可操作地耦合在高速缓存内存与cpu和/或gpu之间。

内存150可以存储稀疏矩阵数组104。压缩器10可以被配置为从内存150中访问稀疏矩阵数组数据104,并将稀疏矩阵数组数据压缩为压缩的对角线存储格式102,其包括例如对角顺序的掩码和非零值。

压缩数据102可以存储在内存中,和/或传送到能够对压缩数据进行解压缩以从其恢复有用信息的系统。

例如,解压器20(可与压缩器10位于相同或不同的位置,并且可包括用于实现压缩器的相同或不同的cpu、gpu和/或硬件)接收压缩数据102(例如,对角线顺序的掩码和非零值),并解压缩数据。解压缩的数据可以被存储到内存150'和/或被进一步提供给处理系统(例如,在cpu或gpu中)进行进一步处理。如图1b所示,解压器20生成的解压缩数据可包括稀疏矩阵数组106a、紧凑稀疏矩阵数组106b、转置稀疏矩阵数组106c和/或紧凑转置矩阵数组106d。

命令cpu/gpu140'生成请求解压缩数据,其可指示解压器20需要生成的一种或更多种不同的数据格式。在某些示例中,多个解压器或解压缩操作可以并行操作,以将压缩数据解压缩为多种不同的数据格式106a、106b、106c、106d。

在某些实施例中,可以在内存150'内部将解压器20提供到cpu/gpu140'的寄存器文件加载路径。在一个示例中,压缩数据102可存储在内存150'中,当使用矩阵数据执行运算的指令被接收到时,内存150'和cpu/gpu140'的寄存器文件之间的路径中设置的解压器20可以提供运算所需的不同的数据格式106a、106b、106c、106d中的一个或更多个。直到指令之前的最后一个存储之前,压缩数据102可一直保持压缩状态,并且运算所需的一种或更多种数据格式根据需要在寄存器文件中生成。

深度神经网络

在某些示例中,根据本说明书公开的各个实施例,压缩器10和/或解压器20的实现方式可用于机器学习应用,以存储、传输和/或处理存储在矩阵中的大量数据。矩阵数据在不同阶段进行压缩和解压缩,以减少系统存储和/或通信资源,并提高计算速度。

作为一个示例,深度神经网络(dnn)模型包括许多连接节点的多个层(如感知器、玻尔兹曼机、径向基函数、卷积层等),其可以用大量的输入数据进行训练,以快速、高精度地解决复杂问题。

图2a示出了对神经网络的训练以识别某些动物。该神经网络包括输入层42、多个隐藏层44和输出层46。训练过程调整神经网络中神经元连接的权重,以便在输出层46对提供给输入层42的数据做出正确的决策。所示的神经网络可以在训练期间生成稀疏矩阵(例如,系数的权重),也可以在运算期间生成稀疏矩阵(例如,记录活动的发生或计数的观察结果、数据的准备等)。参见例如brownlee的“用于机器学习的稀疏矩阵的简单介绍(agentleintroductiontosparsematricesformachinelearning)”,http://machinelearningmastery.com/sparse-matrices-for-machine-learning/;(辉达公司)cuda的cusparse库的“稀疏线性代数(sparselinearalgebra)http://developer.nvidia.com/cusparse;辉达技术报告nvr-2008-004(2008年12月)中bell等人的“cuda上的高效稀疏矩阵向量乘法(efficientsparsematrix-vectormultiplicationoncuda)。

更详细地说,神经元是神经网络的基本单元。图2b示出了神经元48接收来自其他神经元的n个输入和偏差值。神经元的每个输入都乘以相应的权重值w。权重表示神经元之间连接的强度。神经元还可包括不从任何其他神经元接收输入的偏差输入。权重值b应用于偏差输入。加权后的输入和偏差相加以提供用于向神经网络提供非线性的激活函数g(z)被应用于加权后的输入与偏差之和。神经元的输出可以表示为在训练过程中产生的加权后的输入和偏差会导致大量的稀疏矩阵数据,其必须恰当地表示、存储和访问。

例如,在训练期间,数据在前向传播阶段流经dnn,直到生成指示与输入相对应的标签的预测。前向传播中的运算包括将权重矩阵乘以激活矩阵。权重矩阵对应用于层n和层n+1中的神经元之间的连接的权重进行建模。层n+1的激活矩阵是来自层n的运算的输出。

分析正确标签与预测标签之间的误差,并在反向传播阶段期间对每个特征调整权重,直到dnn正确标记训练数据集中的输入和其他输入。反向传播最小化了正确标签和预测标签之间的误差。反向传播包括通过网络的层将误差传播回去,调整到各个神经元的输入的权重,并做出另一个决策。

反向传播生成激活的梯度,告诉错误的程度和移动的方向,以便生成正确的预测。梯度越高,函数的斜率就越陡,网络的学习速度也就越快。当斜率为零时,网络停止学习。在反向传播中生成梯度包括将激活乘以转置的权重矩阵。如下面将更详细地讨论的,矩阵a的转置是矩阵at,其通过将矩阵a的行转为矩阵at的列来形成。

可以对数千个图像进行前向传播和反向传播,每次迭代都会得到神经网络的经修正的权重。

一旦dnn经过训练,就可以部署dnn,并在称为推理(inference)的过程中使用它来识别和分类对象或图案。推理(dnn从给定的输入中提取有用信息的过程)的例子包括识别存入atm机的支票上的手写数字,识别照片中朋友的图像,给超过五千万个用户提供电影推荐,识别和分类在无人驾驶汽车中的不同类型的汽车、行人、和道路危险,或者实时翻译人类语言。

在图2a的例子中,可以提供许多相互连接的层,包括输入层42、输出层46和多个中间隐藏层44。在一个示意性的例子中,dnn模型的第一层将输入图像分解成不同的部分并查找边缘。额外的层44可以将边缘组装起来,以寻找更高级别的图案,如线条和角之类的基本图案,并识别动物的某些部位,如翅膀、眼睛和尾巴。最后几层可以为输入图像生成标签,用于识别对象。输出层46可以生成输出。

如上所讨论的,前向传播和反向传播包括执行矩阵乘法运算,涉及矩阵a和转置矩阵at。将矩阵a转置成转置矩阵可能会花费时间。此外,由于神经网络较大,权重和激活矩阵可能会非常大,并超过并行处理系统的某些内存层处的可用内存,如l1或l2高速缓存内存。虽然在较高的内存层(如主内存)上有更多的内存可用,但是从这种较高的内存层访问数据会消耗更多的时间。为了克服这些挑战和其他挑战,示例非限制实施例提供了表示稀疏矩阵的方法,用于以对角线存储格式存储和/或生成矩阵,从对角线存储格式可以有效地提取原始矩阵和/或转置矩阵。

稀疏矩阵

如上所讨论的,由神经网络处理的工作量可能会非常大,并且可包括稀疏数据,这意味着矩阵中的许多值为零。类似地,表示训练和推理过程中神经网络特征的矩阵可包括稀疏矩阵数据。

大型稀疏矩阵是个难处理的问题,因为它们会占用大量的存储空间,并且在执行针对密集矩阵设计的运算时会造成延迟。因此,当使用稀疏矩阵存储和执行运算时,可以使用专门的数据表示来利用矩阵的稀疏性以减少存储需求和内存延迟。

示例实施例提供了用于使用用于存储稀疏矩阵的对角线格式生成、存储和/或执行运算的系统和技术。示例非限制性对角线存储格式包括非零矩阵元素和指示非零元素在原始矩阵中的位置的掩码。数据是沿着矩阵对角线的连续的非零。例如,8×8矩阵的对角线被定义为集合元素(i,j),使得i-j=k(mod8)。对于k=0,…,k=7,矩阵有8条对角线,其中k=0是主对角线。示例非限制性实施例的对角存储的优点是,由于转置运算可用于将原始矩阵的对角线映射到转置矩阵的对角线,因此示例非限制性解码器重构稀疏矩阵的原始版本或矩阵的转置版本是相当高效的。

对角存储只需要非零和掩码的一个副本(例如,8×8稀疏矩阵的8字节)。示例非限制性实施例包括将对角存储应用于0.5或更大稀疏度的8×8矩阵,但对角存储不限于此。示例实施例可应用于4:8稀疏度的矩阵,这是0.5稀疏度的特殊情况。对角存储不限于任何特定稀疏度、稀疏模式和/或特定块大小。

现有的方法要么需要非零的两个副本,要么需要大量元数据。对于掩码,对角存储在总共8字节的4位内是最优的,对于非零(假设为半精度的数据),对角存储在总共64字节内是最优的。

对角存储将使dnn和其他应用中稀疏权重所需的数据存储量几乎减少2x(2倍)。

虽然示例非限制性的实施例结合神经网络进行了描述,但是本文的技术通常更适用于使用稀疏矩阵和/或转置矩阵的任何应用。例如,本文的技术可以在高性能计算(hpc)应用的上下文中使用。作为一个具体的例子,本文的技术可以用于飞机周围的计算流的上下文,其中矩阵包括稀疏数据和/或转置矩阵。

压缩和解压缩概述

对于二维的n:m结构化稀疏矩阵(其中m个元素的每一列和每一行只有n个非零值),使用m×n存储空间(加上元数据)存储紧凑矩阵的单个版本,但能够从该存储简单地生成矩阵的紧凑+转置版本和矩阵的紧凑+非转置版本是期望的。除了适当的元数据(生成或存储)外,矩阵的这些版本还可以直接馈送到稀疏矩阵相乘-累加(mma)指令。

现有的解决前向传播步骤(fprop)和反向传播步骤期间减少梯度(dgrad)问题的方法,需要同一紧凑权重矩阵的非转置版本和转置版本,并且并没有提供所需的节省存储或不扩展较大的矩阵。

作为示例,一种方法是存储紧凑矩阵的两个副本。缺点是,这需要的存储空间是单个副本的两倍,因此在考虑了元数据之后,对于50%的密集矩阵,净存储空间节省比零还要少。

另一种方法是提供查找表,它利用了这样一个事实:对于给定的块,存在有限数量的可能的2维结构化稀疏模式。例如,只有90个可能的2维2:44×4块,它们的转置信息可以存储在查找表中。缺点是该方法不能扩展到更大的块(比如对于2维4:88×8块,有数百万种可能性)。

对角存储

在示例非限制性实施例中,矩阵对角线内的值在转置期间保持不变,而且,转置运算等价于矩阵对角线的重新排序。例如,考虑如图3a所示的大小为m=8的正方形稀疏矩阵a。

矩阵a的转置是矩阵at,其是通过将矩阵a的行变换为矩阵at的列而形成的。由于矩阵a是稀疏的,它的转置at也是稀疏的。如图3a所示,矩阵a的行作为转置矩阵at的列被提供。

矩阵a和转置矩阵at都包括从各自矩阵的第一行开始的八个对角线。假设图3a矩阵是国际象棋棋盘,则象和后可以沿这些对角线移动,除非在示例非限制性实施例中,对角线都具有相同数量的条目,则因此“换位(wrap)”到矩阵的相对侧(这些走法并不符合国际象棋中规则)。在图3a中,为了便于说明,零值显示为空,但它们实际上包括00hex(即,在本例中,每个值都是一个字节长,包括两个4位二进制半字节)。因此,如图3b以及后面的附图所示,图3a稀疏矩阵的矩阵a的对角线(即,象和王后可以在国际象棋棋盘上移动但会“换位”的路径)包括:

d0=[00,00,00,00,00,00,00,00];(不需要换位)

d1=[00,00,00,00,00,00,00,00];(换位到左边最低的方格)

d2=[02,00,24,35,00,00,00,00];(如图3b所示换位)

d3=[00,14,00,00,00,00,00,00];(换位到第6行)

d4=[00,15,00,00,00,00,00,00];(换位到第5行)

d5=[05,00,27,30,41,00,00,74];(如图3c所示换位)

d6=[00,00,00,00,00,00,00,00];(换位到第三行)

d7=[00,10,00,00,00,00,00,00];(换位到第二行)

图3a、图3b、图3c右侧示出的转置矩阵at对角线包括:

d0=[00,00,00,00,00,00,00,00];

d1=[10,00,00,00,00,00,00,00];

d2=[00,00,00,00,00,00,00,00];

d3=[30,41,00,00,74,05,00,27];

d4=[00,00,00,00,00,15,00,00];

d5=[00,00,00,00,14,00,00,00];

d6=[00,00,02,00,24,35,00,00];和

d7=[00,00,00,00,00,00,00,00]。

由这个例子可以看出,矩阵a与转置矩阵at的对角线d0恰好相同,即,都是零。矩阵a中的其他对角线在转置矩阵at的其他位置处提供,但零值元素和非零值元素的顺序保持不变。

例如,如图3b所示,矩阵a对角线d2=[02,00,24,35,00,00,00,00]对应于转置矩阵at的对角线d6=[00,00,02,00,24,35,00,00]。转置矩阵at的对角线d6包括元素02、24和35,其顺序与原始的未转置矩阵中的顺序相同(关于相同的零值位置)。不同之处在于,矩阵a的对角线d2现在从列(m-d)%m→(8-2)%8=d6开始,它的元素已经循环向下移动了d=2个位置。

作为另一实施例,如图3c所示,矩阵a的对角线d5=[05,00,27,30,41,00,00,74]对应于转置矩阵at的对角线d3=[30,41,00,00,74,05,00,27]。转置矩阵at的对角线d3包括非零元素05、27、30、41和74,其顺序与未转置矩阵中的顺序相同(关于相同的零值位置)。矩阵a的对角线d5,在转置矩阵at中,从列(m-d)%m→(8-5)%8=3开始,其元素已循环向下移动了d=5个位置。

为了以对角线格式存储稀疏矩阵,在示例非限制性实施例中使用了两种数据结构:

1)向量d,它包含依次沿着一系列对角线的紧凑的非零值(即,对角线上的所有零值都被删除,因此数据表示是“紧凑的,意思是通过删除零值使其更紧凑)。向量的大小取决于非零值的数量。

d=[02,24,35,14,15,05,27,30,41,74,10]

2)大小为m×m的位掩码m,其指示矩阵a的每一行中每个位置的零/非零状态(换句话说,由于向量d不包括可以从其明确确定矩阵中每个非零元素位置的信息,所以使用额外的掩码来指定每个非零值的矩阵位置)。例如,十六进制的位掩码可以包括以下值:

m=0x4213091220000001

图4示出了用于确定矩阵a的位掩码m的十六进制表示的示例非限制性过程。位用于指示矩阵中的每个元素位置是零值元素还是非零值元素。在掩码中,“0”表示零值元素,“1”表示非零值元素。每组4位被转换为十六进制值,其中从右向左读取这些位。

通过向量d和位掩码m,可以计算矩阵的行中的值的前缀和(并与上述数据一起存储,或在运行时由上述数据生成)。这将指示紧凑的输出中每个对角线的值将位于何处。

使用该存储的或生成的数据,示例非限制性实施例的示例非限制性解码器可以根据用例(例如,应用的需要)生成四个可能输出中的任一个:

1)原始矩阵a;

2)紧凑矩阵ac和元数据am;

3)转置矩阵at;和/或

4)转置紧凑矩阵atc和元数据atm。

在某些示例非限制性实现中,紧凑矩阵和元数据可能已准备好输入到稀疏矩阵相乘累加指令。

本申请公开的方法不限于结构化稀疏性或任何特定的块大小。该方法可以应用在2:8稀疏度、4:16稀疏度、8:16稀疏度,甚至在没有结构的情况下,一般密度为25%或50%密集度。在某些实施例中,与稀疏矩阵相乘累加的交互可能需要合规稀疏模式。

在一些示例非限制性实现中,存储格式不限于稀疏矩阵,还可以应用于密集度大于50%的矩阵。具有这些较高密集度的矩阵可能需要较高的开销才能从存储的数据中获得矩阵或转置矩阵。

用对角线表示矩阵的方法和系统

图5a示出了用对角线表示矩阵的示例非限制性方法50。该方法可以由处理器(例如,一个或更多个cpu和/或gpu)执行,该处理器执行存储在非暂时性存储器和/或基于硬件的处理电路中的软件指令。在一些示例非限制性实现方式中,该方法可以由软件和/或硬件编码器执行。

方法50包括接收矩阵数据52。可以响应于从内存中访问矩阵数据的命令接收矩阵数据。矩阵数据可以包括稀疏矩阵,其中大多数元素为零。在一些实施例中,矩阵数据可以包括密集矩阵,其中大多数元素是非零。如果矩阵数据被压缩,该方法可以包括将矩阵数据解压缩为执行运算所需的格式。

该方法包括生成对角线存储格式,具体包括:步骤54,从接收到的矩阵数据中提取非零值的流;步骤56,为数据加索引,以用于确定数组中的非零值的位置。该数组依次列出了沿着矩阵的每个对角线的非零矩阵值。数组的大小将取决于矩阵中非零值的数量。

索引数据提供了针对每个非零值指定和/或确定非零值位于以下中的位置所需的信息:(1)矩阵、(2)紧凑矩阵、(3)转置矩阵和/或(4)转置紧凑矩阵。在一个例子中,位掩码,其具有对应于矩阵的每个元素的位,可以指示矩阵的每个位置是零值还是非零值。可以预处理位掩码,以指示压缩格式中非零值的位置。索引数据可以仅针对非零值生成。可以使用惯例,以使得位掩码中位的顺序与该(或某)矩阵中的位置有预先确定的对应关系。

例如,索引数据可以指示每个非零值的对角线编号或其他标识符,以及各自的非零值在所标识的对角线中位于何处。在一个例子中,索引数据指示每个非零值的对角线编号和矩阵行号。索引数据可用于重构原始矩阵、紧凑矩阵、转置矩阵和/或转置紧凑矩阵。

在一些示例非限制性实现中,通过简单的按位求和运算,位掩码被预处理成函数s和函数q,函数s指示每个对角线上的非零的个数,函数q指示对角线的起点。利用这两个函数,可以确定原始矩阵、紧凑矩阵、转置矩阵和/或转置紧凑矩阵的非零元素的位置。

如下面将更详细讨论的,函数s是循环移位后的位掩码的列和,s(k)是第k条对角线上的非零的数量,q(k)是s的前缀和,其提供了矩阵值d的数组中第k条对角线的起点。前缀和是数量序列的累加和,由yi=yi-1+xi表示。给定大小为n的数组,数组arr[n]的前缀和是另一个大小相同的数组,其中前缀和数组的值由prefix_arr[i]=arr[0]+arr[1]+arr[2]+…+arr[i]确定。使用函数s和q,针对位掩码中的每一列j形成长度为s(j)的向量,位掩码提供具有非零元素的行的索引。

在一些示例非限制性实现中,索引数据可指示每个非零元素的行号和每个非零元素的对角线编号。

在某些示例非限制性实现中,索引数据可包括循环移位行号位的掩码。循环移位后的掩码中的列对应于矩阵中的对角线。

本方法可以包括:步骤58,存储数组和索引数据和/或使用数组和索引数据执行计算操作。数组和索引数据可以存储在共享内存/l1高速缓存、l2高速缓存和/或本地内存(例如,动态随机存取存储器)中。计算操作(例如矩阵相乘指令)可以配置为通过直接使用数组和索引数据来执行这些运算,而不需要对数据进行解压缩以生成原始矩阵、紧凑矩阵、转置矩阵和/或转置紧凑矩阵。例如,用对角线存储格式存储的第一矩阵可以乘以用对角线存储格式存储的第二矩阵,而不需要对数据进行解压缩,以生成用对角线存储格式存储的第三矩阵。该运算可包括矩阵乘法运算,但不限于此。

编码器的示例示意性表示

图5b示出了基于硬件的编码器的示例非限制性示意性表示,这种编码器可以生成对角线存储格式的压缩数据。图5b中系统的输出是位掩码,它指示输入矩阵中非零元素的位置,以及按对角线顺序的非零值的数组。在其他示例中,可以生成其他元数据(而不是位掩码)来指定原始矩阵和/或转置矩阵的非零元素的位置,和/或从其确定矩阵和/或转置矩阵中非零元素的位置。

图5b示出了示例移位寄存器(例如,分配在高速缓存内存中),它允许硬件逻辑电路扫描矩阵并生成掩码和非零值的数组。可以使用其他更多的并行电路来减少扫描矩阵的时间。

数据的流包括按行序的矩阵元素值(如a、b、c)。比较器接收输入数据的流并生成指示输入数据的流中的零元素和非零元素的位的流。在一个例子中,比较器可以包括多个或(or)门,如果元素的所有位的值都为零,则每个或门输出“0”或“假”,如果元素的值为非零,则每个或门输出“1”或“真”(即,则值中的任何位都已设置)。

数据的流还被提供给拣选器(sorter)或选择器,配置为将矩阵的元素拣选或选择为各自的对角线(d0、d1、d2、…dn)。非零提取电路可以丢弃或抑制零元素,只将非零值发送至多路复用器。多路复用器可以按适当的顺序组合每个对角线上的非零值,以产生按对角线顺序的非零值的流。例如,可以控制多路复用器以先输出对角线0上的所有非零值,然后再输出下一个对角线上的非零元素,以此类推,直到输出所有对角线上的非零值为止。

压缩数据文件,其包括生成的位掩码和非零值的数组,可存储在内存中,和/或被传送到处理系统以进行进一步处理。如果需要,可以采用进一步的无损压缩技术,例如通过消除冗余信息以进一步减小压缩数据文件的大小。

解压缩方法和系统

图6示出了用于解压缩压缩矩阵表示的示例非限制性方法60,以例如从对角线存储的矩阵生成几种不同格式中的任一种格式的矩阵。该方法可以由一个或更多个处理器(例如cpu和/或gpu)执行,该处理器执行存储在非暂时性内存和/或基于硬件的处理电路中的软件指令。在一些示例非限制性实现中,该方法可以由软件和/或硬件解码器执行。在一些示例实施例中,可以在并行处理操作环境(如cuda)中使用张量核心执行解压缩。在一些示例实施例中,方法60的一个或更多个操作可以包括在来自内存指令和/或算术运算指令的负荷中。

该方法包括步骤62:接收由对角线存储的压缩矩阵数据。由对角线存储的压缩矩阵数据可以包括非零值的数组和用于确定数组中非零值的位置或定位的索引数据。

可以响应于对由对角线存储的矩阵数据表示的矩阵或转置矩阵执行计算操作(如矩阵乘法运算)的请求,接收由对角线存储的压缩矩阵数据。这样的请求可以包括字段或运算码,其指定所需或要求的输出矩阵的格式。

该方法包括步骤64:针对数组中的每个非零值,确定矩阵和/或转置矩阵中的位置。由于矩阵的对角线内的值在转置期间被保持不变,因此可以使用相同的索引数据来确定每个非零值在矩阵和转置矩阵中的位置。在某些示例非限制实现中,针对数组中的每个非零值,确定紧凑矩阵和/或转置紧凑矩阵中的位置。在一些示例非限制性实现中,每个非零值的矩阵位置可以由函数s和函数q确定,函数s指示每个对角线上的非零的数目,函数q指示对角线的起始点。

该方法包括步骤66:生成矩阵和/或转置矩阵。矩阵或转置矩阵是通过将每个非零值放置在经确定的位置,并将零放置在矩阵的所有其他位置而生成的。生成的矩阵和/或转置矩阵可以是未压缩的矩阵或具有关联元数据的紧凑矩阵。

该方法包括步骤68:生成的矩阵、具有元数据的紧凑矩阵、转置矩阵和/或具有元数据的转置紧凑矩阵可以被存储在内存中,或可以用于执行计算操作(如矩阵乘法运算)。计算操作可以使用整个生成的矩阵、矩阵的一部分和/或非零值及其位置而不需要生成整个矩阵。

在一些示例实施例中,步骤66中的生成矩阵和/或转置矩阵可包括:确定原始矩阵、转置矩阵、密集矩阵(例如,未转置矩阵)和/或密集转置矩阵中非零值的位置,而不生成原始矩阵、转置矩阵、密集矩阵和/或密集转置矩阵。非零值及所确定的其在特定矩阵中的位置可用于执行操作,而无需生成完整的矩阵。

在某些示例实施例中,可以在不生成和/或存储中间结果、一个或更多个中间矩阵和/或整个矩阵(例如,原始矩阵、转置矩阵和/或密集原始矩阵)的情况下,确定转置矩阵、密集矩阵和/或密集转置矩阵的至少一部分。

在某些例子中,密集矩阵可以由对角线存储的矩阵数据生成,而无需生成和/或存储原始矩阵。在某些例子中,可以从对角线存储的矩阵数据生成转置矩阵,而不生成和/或存储原始的未转置矩阵。在某些例子中,可由对角线存储的矩阵数据生成转置密集矩阵,而无需生成和/或存储原始的未转置矩阵和/或转置矩阵。

用于分配线程来计算以对角线格式存储的非零元素的目的地索引的示例实现

在一些示例非限制实现中,确定每个非零元素的目的地索引的任务可以分配给并行处理系统中的不同线程。图7示出了示例非限制性并行处理系统。虽然图7示出了并行处理系统组件的特定布置,但本公开的实施例并不限于所示的并行处理系统的布置。在一些示例实施例中,图7所示的并行处理系统是流式多处理器(sm)440,其参照图14a和图15a进行讨论。

并行处理系统可配置为控制多个线程块的执行,每个线程块中有多个线程束(warp)。每个线程束包括多个线程(例如,32个线程)。

每个线程都可以使用芯片上的寄存器独立地处理和存储数据。线程块中的线程可以通过共享内存协作和交换数据。该线程可以通过全局内存与其他线程块和/或其他处理系统(例如cpu)中的线程交换数据。

确定非零矩阵值的数组中的每个元素的目的地索引可以由线程束的不同线程执行。如图7所示,一个线程束的线程0到k-1中的每一个都可以接收对角线格式的矩阵数据。线程0到k-1中的每一个可以接收数组d的不同元素,数组d包括沿着矩阵的每个对角线的非零矩阵值和索引数据。线程可以确定原始矩阵、转置矩阵、原始密集矩阵和/或转置密集矩阵的非零元素的目的地,而不需要生成和/或存储中间结果(例如,未转置稀疏矩阵、未转置密集矩阵和/或转置密集矩阵)。

线程可以基于索引数据确定数组d的元素的坐标,并将数组d的元素和坐标存储在各自的寄存器中。针对矩阵或转置矩阵,可以确定坐标。线程可以并行执行计算。寄存器中的结果可以提供密集矩阵或密集转置矩阵。在某些例子中,所确定的非零值的矩阵坐标和/或转置矩阵坐标可用于执行运算(例如线性代数运算),而无需重构矩阵或转置矩阵。

提供给寄存器的索引数据可以包括数组s、数组q以及矩阵的移位位掩码中非零元素的行位置,数组s指示矩阵的移位位掩码的列和,数组q指示s的前缀和。每个线程可以计算分配的元素的对角线编号和行号。在一个示例中,提供给寄存器的索引数据可包括提供位图中非零元素的列位置和行位置的索引数据,其中位图具有大于零的行循环移位行号位。

每个线程束可被分配为确定不同矩阵或大型矩阵的不同块的以对角线格式存储的非零元素的目的地索引。类似地,不同的线程块可以被分配为确定不同矩阵或大型矩阵的不同块的以对角线格式存储的非零元素的目的地索引。一个或更多个线程束中的线程和/或一个或更多个线程束可以并行执行。

用对角线表示的矩阵的更详细示例

用对角线存储矩阵

大小为n的正方形矩阵中的对角线是a[i,j]元素的集合,使得i-j=kmodn。对角线在矩阵转置下是不变的,即转置将矩阵的对角线映射为转置矩阵的对角线。具体地说,大小为n的矩阵具有用0,…,n-1索引的n条对角线。转置矩阵的第k条对角线是原始矩阵的第(n-1-k)条对角线的映像。第k条对角线上的元素被循环移位第(n-1-k)条对角线上的k个元素。换句话说,转置矩阵中的元素a[j,(k+j)modn]等于原始矩阵中的元素a[(k+j)modn,j]。

如果矩阵是稀疏的,并且每条对角线都以其元素的索引表示,则为了得到转置矩阵的第k条对角线,将k(modn)添加到对角线n-1-k的元素的索引中。

考虑8×8矩阵的示例,其中每行最多有4个非零元素。矩阵可以由32个非零的向量d和64位掩码m表示,64位掩码m标记矩阵中的非零。每行可以有一个字节。这种表示接近最优。有162(=8+28+56+70)个可能的行,其中最多4个非零。每行最多4个非零的8×8矩阵的总数是162^8。这个数的对数,58是唯一标识这个类型矩阵所需要的最小位数。

综上所述,对于[4,8]稀疏性,相对于64(32×2)b的数据,开销是8b或是12.5%。这个开销比最优少了6位。

将对角线格式转换为原始矩阵并进行转置

现在将示出如何使用数组d(其列出沿对角线最多32个非零)和矩阵掩码m来构造8×8矩阵a和a∧t。图8示出了将对角线格式转换为原始矩阵和/或转置矩阵的示例非限制性方法。

图8中示出的操作可以由一个或更多个处理器(例如cpu和/或gpu)执行,这些处理器执行存储在非暂时性内存和/或一个或更多个基于硬件的处理电路中的软件指令。在某些示例非限制性实现中,操作可以由软件和/或硬件解码器执行。在一些示例实施例中,可以使用并行处理操作环境(如cuda)中的张量核心执行操作。在一些示例实施例中,图8所示的一个或更多个操作可以包括在来自内存指令和/或算术运算指令中的负载中。

将列出矩阵中的非零值的向量d的第k个元素分配给线程束的线程k,并将该元素上的目的地索引的计算分配给该线程(步骤80)。

首先,m的第i行向左循环移位i位(步骤82)。那么只有当在原始矩阵a中的第i行的第j个元素为非零时,m[i,j]才为1。

然后,使用m对cidx[i,j]函数执行计算,该函数等于m的第i行的第j个非零的列号,i=0,…,7,j=0,…,3(步骤84)。最后遵循每行最多有4个非零元素的事实。cidx[i,j]将用于稀疏矩阵乘法(hmm)指令。类似地,将针对转置矩阵at,计算ridx[i,j]。

然后,将m的列求和作为行向量s(步骤86)。s[j]将为对角线j上的非零的个数,令q为s的前缀和,则q[j]将为向量d中对角线j的起点(步骤88)。

该方法包括,对于m中的每一列j,形成长度为s[j]的向量,s[j]是具有项1的行的索引,令其为r[j,i],i=0,…,s[j]–1(步骤90)。

使用q和r,我们可以计算a和/或at的元素的坐标,其应该被赋值d的值(步骤92):

a[r[j,i],j+r[j,i]]=d[q[j]+i],i=0,...,s[j]-1;和

at[r[j,i]+j,r[j,i]]=d[q[j]+i],i=0,...,s[j]–1。

计算函数r:

分别针对掩码m的每一列j计算函数r[j,i]。m的一列可以表示为字节。字节b的r返回b中1的位置列表。由于k=q[j]+i最多一次假设值为0到31,r[j,i]可以表示为idx[k]。这意味着线程束中的每个线程都将计算j[k]和idx[k],这是为a或at赋予正确值所必需的。

引入阶梯函数j[k],该函数在d中对角线的每段上执行一个步骤。换句话说,j(k)告知d的元素的对角线编号被分配给线程k。idx[k]指示d中的非零元素k的行号。

计算j(k)和idx[k]后,可将上述置换等式简化为:

a[idx[k],j[k]+idx[k]]=d[k];

at[idx[k]+j[k],idx[k]]=d[k]。

这种表示将是由对角线表示的一对稀疏矩阵直接转换为密集的8×8矩阵和索引函数的基础,稀疏矩阵和索引函数是cuda9或其他cuda版本中稀疏矩阵乘法和累加(例如,fp16hmma)或线程束矩阵乘法和累加(wmma)指令所需的。wmma允许将值加载或初始化为张量核心的特殊格式,执行矩阵乘法-累加(mma)步骤,并将值存储回内存。在程序执行过程中,多个张量核心可以被整个线程束同时使用。这允许线程束以非常高的吞吐量执行16×16×16的mma。在某些实施例中,可以将用于从对角线存储的矩阵数据生成原始矩阵、转置矩阵、紧凑原始矩阵和/或紧凑转置矩阵的指令放入矩阵乘法指令中。

图9a和图9b示出了使用多个线程将对角线格式转换为原始矩阵和/或转置矩阵的示例非限制性实现。图9a和图9b示出了依次沿每条对角线接收的紧凑非零值的向量d的多个线程,以及指示矩阵a的每一行中每个位置的零/非零状态的矩阵位掩码m。在所示的示例中,假设向量d包括32个元素,但本公开的实施例不限于此。

确定向量d中每个非零元素的目的地索引的任务被分配给不同的线程。每个线程执行操作来确定矩阵a(如图9a所示)或转置矩阵at(如图9b所示)中的非零元素坐标。参考图8讨论的方法操作可以由每个线程执行。在一些例子中,单个线程可以为矩阵a和转置矩阵at两者提供坐标。

在图9a中,线程0确定向量d中第一个元素在矩阵a中的行和列。线程31确定向量d中第32个元素在矩阵a中的行和列。

在图9b中,线程0确定向量d中第一个元素在转置矩阵at中的行和列。线程31确定向量d中第32个元素在转置矩阵a中的行和列。

计算可以并行执行,结果可以存储在与线程相关联的寄存器中。

图10a和图10b示出了使用多个线程将对角线格式转换为原始矩阵和/或转置矩阵的另一个示例非限制实现。图10a和图10b示出了依次沿每条对角线接收紧凑非零值的向量d的多个线程,指示分配给线程k的d的元素的行号的向量idx[k],以及指示分配给线程k的d的元素的对角线编号的向量j[k]。

确定向量d中每个非零元素的目的地索引的任务被分配给不同的线程。每个线程执行操作来确定矩阵a(如图10a所示)或转置矩阵at(如图10b所示)中的非零元素坐标。每个线程确定指示元素k在d中的行号的idx(k),以及指示元素k在d中的对角线编号的j(k)。这些值用于确定元素k在矩阵a和/或转置矩阵at中的坐标。在一些例子中,单个线程可将坐标提供至矩阵a和转置矩阵at两者。

转换为8×4密集矩阵

图11a示出了由对角矩阵和元数据压缩来执行矩阵乘法指令的示例非限制性使用。矩阵a大小是16×16,每一列和每一行最多有n=8个非零值,k=16个非零值。矩阵a乘以矩阵b以得到矩阵c。矩阵a可以用四个块来表示,在这个特定示例中,矩阵a的每个8×8块的密集度是4:8。

如图11a所示,矩阵a可以被压缩并使用288个字节进行存储。四个块中的每一个使用64个字节存储非零值和使用8个字节存储掩码。与使用存储未压缩矩阵a所需的512字节相比,这种压缩节省了7/16内存。以对角线格式存储的矩阵a的每个块都可以解压缩为与矩阵a相对应的密集8×4矩阵或与转置矩阵at相对应的密集4×8矩阵(参见图11a中的act00、act10、act01和act11)。

矩阵乘法和累加(mma)运算可由c+=a*b定义。mma运算可以包括将矩阵与a*b相加,这可以是之前的mma运算(例如,c+=a*b)的结果。c=a*b可以是mma的特例。mma运算可以包括将矩阵a和b从内存加载到寄存器中。来自前一运算的矩阵c可以存储在来自前一个运算的寄存器中。当加载操作完成时,每个线程中的目的地寄存器保存所加载的矩阵的一段。

加载矩阵a和/或b可包括将存储在内存中的数据解压缩为mma运算所需的格式。例如,加载操作可包括将以对角线格式存储的一个或更多个矩阵解压缩为密集矩阵(例如,密集矩阵ac或转置密集矩阵act)。

接下来,对所加载的矩阵执行矩阵乘法和加法(可选地)。当运算完成时,每个线程中的目的地寄存器保存所得到的矩阵c的一段。接下来,所得到的矩阵c被存储回内存。或者,所得到的矩阵c可以在下一次mma运算中与所相乘的矩阵相加。

如前所讨论的,对于使用稀疏矩阵乘法和累加(hmma)指令,由对角线表示的d可以转换为密集的8×4矩阵ac和4×8act矩阵。

定义两个函数:

cidx(i,j)=第i行的第j列处的非零之前第i行的非零的个数;以及

ridx(i,j)=第j列的第i行处的非零之前第j列的非零的个数。

从ridx和cidx函数的定义:

ac[idx[k],cidx[j[k]+idx[k]]]=d[k];和

act[ridx[j[k]+idx[k]],idx[k]]=d[k]。

列索引函数cidxi和ridxi是cidx和ridx的逆函数,将被用于选择b和c的匹配元素。

扩展至其他密集

逐对角线存储不限于4:8稀疏度,它可用于任何类型的稀疏度。在一些示例实施例中,稀疏度可以被限制为0.5稀疏度。只改变数组d的大小。对于a的每一行有3个或更多非零的情况,元数据(掩码m)的大小接近最小。

在一些示例实施例中,逐对角线存储可以扩展到2:8稀疏度。在2:8稀疏度的情况下,64位掩码可以替换为48位向量m2,但是s、q、r和其他函数的计算需要另一个步骤。m2是8对向量,每行一对。每对的第一个元素和第二个元素表示每行中的第一个非零和第二个非零的列。

可以使用公式m[i,m2[i,0]+i]=1和m[i,m2[i,1]]=1来从m2计算掩码m。将d转换为ac和act的所有其他操作与0.5稀疏度情况下相同。

扩展到大矩阵

对于一个16×16矩阵,具有稀疏度0.5的8×8的块,所有操作将由4个线程束在每个块上独立完成。

dlsm指令

在某些示例实施例中,内存加载指令可包括将检索到的压缩矩阵数据转换为所需格式。例如,内存加载指令可以包括从共享内存中检索以对角线存储格式存储的矩阵数据,将该数据解压缩为另一种格式(例如,密集矩阵或密集转置矩阵),并将解压缩的数据写入寄存器。dlsm指令是内存加载指令的示例,它可以从对角线存储的压缩矩阵数据提供密集矩阵。

dlsm将来自共享内存的由对角线存储的四个4:8矩阵加载到寄存器文件中。指令的结果是被写入寄存器中(类似于ldsm指令)的16×8密集矩阵和指向与a的元素相对应的矩阵b的行的元数据,正如shmma指令中所述。

对于矩阵a的每一个块,假设由对角线压缩的块和元数据被加载到共享内存(smem)。dlsm指令将每个块分散到寄存器中作为8×4矩阵。所有4个矩阵将形成16×8矩阵。每个块由32个线程(线程束)彼此独立加载,块中的每个非零一个线程。

压缩元素的目的地的地址使用前面部分描述的函数计算,并在这里总结。

·m是8字节掩码(共64位),表示块中的非零。

·计算cidx(i,j)=在第i行的第j列处的非零之前的第i行中1的数量。这个函数告诉了a中的非零在矩阵ac中的列号(块号00,…,11在这里跳过)。

·然后计算cidxi(i,j),cidx的反函数。cidxi(i,j)=第i行中第j个非零的列号。函数cidxi将用作shmma指令的元数据。

·如果需要at矩阵,则使用cidx和cidxi的行变量ridx和ridxi。

·然后计算出在ac中找到向量d的元素的地址所需的索引。计算包括:将m的第i行向左循环移位i位;计算函数s(j)=m的列和;计算函数q(j)=s的前缀和;计算函数r[i,j]=第j列中第i个非零的行号;以及计算函数j(k),其指示元素d[k]的对角线编号。

解码器的示例示意性表示

图11b示出了解码器的示例非限制性示意性表示,解码器可以从对角线存储格式的数据生成解压缩数据。图11b中的系统的输出生成原始矩阵和/或转置矩阵中非零元素的行值和列值。

如图11b所示,移位电路接收位掩码,该位掩码指示矩阵中非零元素的位置,并生成循环移位后的位掩码。移位电路被配置为将位掩码的行循环移位行号位。循环移位后的位掩码中的列对应于原始矩阵中的行。在一个例子中,多路解复用器(de-mux)可以接收比特流,并发送各自的行移位电路,这些行移位电路配置为将位移位行号位。多路复用器可以将移位后的行重构为表示循环移位后的位掩码的比特流。

移位后的掩码被提供给多个电路,这些电路被配置为确定非零值的行号和对角线编号。如图11b所示,每个非零值可以提供给不同的电路,其确定非零值的行号和列号。行号提取电路可以确定移位后的掩码中与非零值对应的行,对角线编号提取电路可以确定移位掩码中与非零值对应的列号。这些值用于确定该非零值在原始矩阵和/或转置矩阵中的行号和列号。

非零元素在原始矩阵中的行号由行号提取单元确定的行号提供。非零元素在原始矩阵中的列号由加法器提供,该加法器组合行号提取单元确定的行和对角线编号提取电路确定的对角线。

非零元素在转置矩阵中的行号由加法器提供,该加法器组合由行号提取单元确定的行与对角线编号提取电路确定的对角线。非零元素在转置矩阵中的列号由行号提取单元确定的行提供。

非零元素在原始矩阵和/或转置矩阵中的行值和列值可用于重构原始矩阵和/或转置矩阵,和/或,原始矩阵和/或转置矩阵的重构紧凑版本。

2:4情况的说明

图12a-图12c示出了针对每行具有4个元素和2个非零值的矩阵的对角线的矩阵表示。

图12a示出了具有元数据的矩阵a和紧凑矩阵ac,其中元数据可用于稀疏矩阵乘法和累加指令。紧凑矩阵ac元素包括a,b/c,d/e,f/g,h,紧凑矩阵的元数据包括2,1/1,2/2,1/1,2=6,9,6,9。

紧凑转置矩阵act可以由元素c,g/a,e/b,f/d,h表示,紧凑矩阵的元数据包括2,0/3,1/3,1/2,0。

对角线存储包括提取矩阵a中非零元素的数组d,如图12b所示,数组d=[f,h,a,g,b,d,c,e]列出了从对角线d0开始,每条矩阵对角线的非零元素。矩阵a的每条对角线,每条对角线从矩阵的第0行开始。

图12c示出了位掩码nnz_mask和循环移位后的位掩码nnz_mask。位掩码nnz_mask用表示矩阵a中非零元素位置的1和表示矩阵a中零值元素的0生成。矩阵位图的十六进制表示为0x6969。

接下来,位掩码nnz_mask的行被循环移位。具体地说,位掩码nnz_mask的第i行被向左循环移位i位。循环移位后,第0行不变,第1行向左移位1后为0011,第2行向左移位2后为1001,第3行向左移位3后为1100。循环移位后的矩阵位图的十六进制表示为0x6c93。移位后的位掩码nnz_mask的每一列对应于原始矩阵的对角线。

移位后的nnz_mask的列和为2222,用向量s=[2,2,2,2]表示。s(j)表示对角线j上的非零的个数,因此,s(0)=2指示对角线0上的非零的个数为2。

列和的前缀为2468,由向量q表示。q(j)将是向量d中对角线j的起点。q[0]=0,q[1]=2,q[2]=4,q[3]=6。

索引函数格式:对角线编号(m掩码中的列号),然后是沿该对角线(m掩码的列)的非零元素的行号。

0:23

1:03

2:01

3:12

根据索引函数格式,计算函数r[i,j]=第j列中第i个非零的行号。r[0,0]=2,r[0,1]=3,r[1,0]=0,r[1,1]=3,r[2,0]=0,r[2,1]=1,r[3,0]=1和r[3,1]=2。

用q和r计算被赋予d的值的矩阵或转置矩阵中元素的坐标。原始矩阵的对角线j中元素的坐标由以下提供:

a[r[j,i],r[j,i]+j]=d[q[j]+i],其中j=列号,i=0,...,s[j]–1,和q[j]+i=k。

====重构原始矩阵:

a[r[0,0],r[0,0]+0]=ac[q[0]+0]或a[2,2]=d[0]=f

a[r[0,1],r[0,1]+0]=ac[q[0]+1]或a[3,3]=d[1]=h

a[r[1,0],r[1,0]+1]=ac[q[1]+0]或a[0,1]=d[2]=a

a[r[1,1],r[1,1]+1]=ac[q[1]+1]或a[3,0]=d[3]=g

a[r[2,0],r[2,0]+2]=ac[q[2]+0]或a[0,2]=d[4]=b

a[r[2,1],r[2,1]+2]=ac[q[2]+1]或a[1,3]=d[5]=d

a[r[3,0],r[3,0]+3]=ac[q[3]+0]或a[1,0]=d[6]=c

a[r[3,1],r[3,1]+3]=ac[q[3]+1]或a[2,1]=d[7]=e

原始矩阵中元素的坐标由以下提供:

at[r[j,i]+j,r[j,i]]=d[q[j]+i],其中j=列号,i=0,...,s[j]–1,和q[j]+i=k。

===重构转置矩阵:

at[r[0,0]+0,r[0,0]]=ac[q[0]+0]或a[2,2]=d[0]=f

at[r[0,1]+0,r[0,1]]=ac[q[0]+1]或a[3,3]=d[1]=h

at[r[1,0]+1,r[1,0]]=ac[q[1]+0]或a[1,0]=d[2]=a

at[r[1,1]+1,r[1,1]]=ac[q[1]+1]或a[0,3]=d[3]=g

at[r[2,0]+2,r[2,0]]=ac[q[2]+0]或a[2,0]=d[4]=b

at[r[2,1]+2,r[2,1]]=ac[q[2]+1]或a[3,1]=d[5]=d

at[r[3,0]+3,r[3,0]]=ac[q[3]+0]或a[0,1]=d[6]=c

at[r[3,1]+3,r[3,1]]=ac[q[3]+1]或a[1,2]=d[7]=e

4:8稀疏度的说明

针对具有8行、8列和32个非零值的矩阵,示出了函数s、q和r的计算的实现。已核查

./spmm_by_diagonals

====num_rows8num_cols8nnz32

====makerandomcsrmatrix:requestednnz:32assignednnz:32dims:8×8

====创建的稀疏矩阵的nnz_mask:3c743c3c5a6c1e56

01010110

00011110

01101100

01011010

00111100

00111100

01110100

00111100

====循环移位后的nnz_mask:1e1d87c3d2b13c56

01010110

00111100

10110001

11010010

11000011

10000111

00011101

00011110

====移位后的nnz_mask的列和:403020603050504

====列和的前缀407090f12171c20

索引函数格式:对角线编号,后面是沿该对角线的非零值的行号

0:2345

1:034

2:12

3:012367

4:167

5:01567

6:03457

7:2456

====按行进行测试已完成。

索引函数格式提供了在矩阵a中:

对角线0有四个非零元素,位于第2、3、4和5行;

对角线1有三个非零元素,位于第0、3和4行;

对角线2有两个非零元素,位于第1和2行;

对角线3有六个非零元素,位于第0、1、2、3、6和7行;

对角线4有三个非零元素,位于第1、6和7行;

对角线5有五个非零元素,位于第0、1、5、6和7行;

对角线6有五个非零元素,位于第0、3、4、5和7行;和

对角线7有四个非零元素,位于第2、4、5和6行。

索引函数格式和数组d(包括非零元素)可用于使用以下方程确定矩阵和/或转置矩阵:

a[r[j,i],r[j,i]+j]=d[q[j]+i],其中j=列号,i=0,...,s[j]–1,和q[j]+i=k;和

at[r[j,i]+j,r[j,i]]=d[q[j]+i],其中j=列号,i=0,...,s[j]–1,和q[j]+i=k。

一种并行处理架构,用于使用对角线存储格式生成数据和/或从使用对角线存储格式的数据中提取矩阵和/或转置矩阵

现在将根据用户的需要,阐述关于实现上述框架所采用的各种可选架构和特征的更多说明性信息。应该强烈注意,下列信息是为了说明目的而阐述的,不应被解释为以任何方式进行限制。下列任何特征都可以与所描述的其他特征合并,或可以不排除这些特征。

图13示出了根据一个实施例的并行处理单元(ppu)300。在一个实施例中,ppu300是在一个或更多个集成电路器件上实现的多线程处理器。ppu300是设计用于并行处理许多线程的延迟隐藏体系架构。线程(即,执行线程)是被配置为由ppu300执行的指令集的实例。在一个实施例中,ppu300是图形处理单元(gpu),其被配置为实现用于处理三维(3d)图形数据的图形渲染管线,以便生成用于在显示装置(诸如液晶显示(lcd)设备)上显示的二维(2d)图像数据。在其他实施例中,ppu300可以用于执行通用计算。尽管为了说明的目的本文提供了一个示例性并行处理器,但应特别指出的是,该处理器仅出于说明目的进行阐述,并且可使用任何处理器来补充和/或替代该处理器。

一个或更多个ppu300可以被配置为加速数千个高性能计算(hpc)、数据中心和机器学习应用。ppu300可被配置为加速众多深度学习系统和应用,包括自动驾驶汽车平台、深度学习、高精度语音、图像和文本识别系统、智能视频分析、分子模拟、药物研发、疾病诊断、天气预报、大数据分析、天文学、分子动力学模拟、金融建模、机器人技术、工厂自动化、实时语言翻译、在线搜索优化和个性化用户推荐,等等。

如图13所示,ppu300包括输入/输出(i/o)单元305、前端单元315、调度器单元320、工作分配单元325、集线器330、交叉开关(xbar)370、一个或更多个通用处理集群(gpc)350以及一个或更多个分区单元380。ppu300可以经由一个或更多个高速nvlink310互连连接到主机处理器或其他ppu300。ppu300可以经由互连302连接到主机处理器或其他外围设备。ppu300还可以连接到包括多个存储器设备304的本地存储器。在一个实施例中,本地存储器可以包括多个动态随机存取存储器(dram)设备。dram设备可以被配置为高带宽存储器(hbm)子系统,其中多个dram裸晶(die)堆叠在每个设备内。

nvlink310互连使得系统能够扩展并且包括与一个或更多个cpu结合的一个或更多个ppu300,支持ppu300和cpu之间的高速缓存一致性,以及cpu主控。数据和/或命令可以由nvlink310通过集线器330发送到ppu300的其他单元或从其发送,例如一个或更多个复制引擎、视频编码器、视频解码器、电源管理单元等(未明确示出)。结合图15b更详细地描述nvlink310。

i/o单元305被配置为通过互连302从主机处理器(未示出)发送和接收通信(例如,命令、数据等)。i/o单元305可以经由互连302直接与主机处理器通信,或通过一个或更多个中间设备(诸如内存桥)与主机处理器通信。在一个实施例中,i/o单元305可以经由互连302与一个或更多个其他处理器(例如,一个或更多个ppu300)通信。在一个实施例中,i/o单元305实现外围组件互连高速(pcie)接口,用于通过pcie总线进行通信,并且互连302是pcie总线。在替代的实施例中,i/o单元305可以实现其他类型的已知接口,用于与外部设备进行通信。

i/o单元305对经由互连302接收的数据包进行解码。在一个实施例中,数据包表示被配置为使ppu300执行各种操作的命令。i/o单元305按照命令指定将解码的命令发送到ppu300的各种其他单元。例如,一些命令可以被发送到前端单元315。其他命令可以被发送到集线器330或ppu300的其他单元,诸如一个或更多个复制引擎、视频编码器、视频解码器、电源管理单元等(未明确示出)。换句话说,i/o单元305被配置为在ppu300的各种逻辑单元之间和之中路由通信。

在一个实施例中,由主机处理器执行的程序在缓冲区中对命令流进行编码,该缓冲区向ppu300提供工作量用于处理。工作量可以包括要由那些指令处理的许多指令和数据。缓冲区是存储器中可由主机处理器和ppu300两者访问(例如,读/写)的区域。例如,i/o单元305可以被配置为经由通过互连302传输的存储器请求访问连接到互连302的系统存储器中的缓冲区。在一个实施例中,主机处理器将命令流写入缓冲区,然后向ppu300发送指向命令流开始的指针。前端单元315接收指向一个或更多个命令流的指针。前端单元315管理一个或更多个流,从流读取命令并将命令转发到ppu300的各个单元。

前端单元315耦合到调度器单元320,其配置各种gpc350以处理由一个或更多个流定义的任务。调度器单元320被配置为跟踪与由调度器单元320管理的各种任务相关的状态信息。状态可以指示任务被指派给哪个gpc350,该任务是活动的还是不活动的,与该任务相关联的优先级等等。调度器单元320管理一个或更多个gpc350上的多个任务的执行。

调度器单元320耦合到工作分配单元325,其被配置为分派任务以在gpc350上执行。工作分配单元325可以跟踪从调度器单元320接收到的若干调度的任务。在一个实施例中,工作分配单元325为每个gpc350管理待处理(pending)任务池和活动任务池。待处理任务池可以包括若干时隙(例如,32个时隙),其包含被指派为由特定gpc350处理的任务。活动任务池可以包括若干时隙(例如,4个时隙),用于正在由gpc350主动处理的任务。当gpc350完成任务的执行时,该任务从gpc350的活动任务池中逐出,并且来自待处理任务池的其他任务之一被选择和调度以在gpc350上执行。如果gpc350上的活动任务已经空闲,例如在等待数据依赖性被解决时,那么活动任务可以从gpc350中逐出并返回到待处理任务池,而待处理任务池中的另一个任务被选择并调度以在gpc350上执行。

工作分配单元325经由xbar(交叉开关)370与一个或更多个gpc350通信。xbar370是将ppu300的许多单元耦合到ppu300的其他单元的互连网络。例如,xbar370可以被配置为将工作分配单元325耦合到特定的gpc350。虽然没有明确示出,但ppu300的一个或更多个其他单元也可以经由集线器330连接到xbar370。

任务由调度器单元320管理并由工作分配单元325分派给gpc350。gpc350被配置为处理任务并生成结果。结果可以由gpc350内的其他任务消耗,经由xbar370路由到不同的gpc350,或者存储在存储器304中。结果可以经由分区单元380写入存储器304,分区单元380实现用于从存储器304读取数据和向存储器304写入数据的存储器接口。结果可以通过nvlink310发送到另一个ppu304或cpu。在一个实施例中,ppu300包括数目为u的分区单元380,其等于耦合到ppu300的独立且不同的存储器设备304的数目。下面将结合图14b更详细地描述分区单元380。

在一个实施例中,主机处理器执行实现应用程序编程接口(api)的驱动程序内核,其使得能够在主机处理器上执行一个或更多个应用程序以调度操作用于在ppu300上执行。在一个实施例中,多个计算应用由ppu300同时执行,并且ppu300为多个计算应用程序提供隔离、服务质量(qos)和独立地址空间。应用程序可以生成指令(例如,api调用),其使得驱动程序内核生成一个或更多个任务以由ppu300执行。驱动程序内核将任务输出到正在由ppu300处理的一个或更多个流。每个任务可以包括一个或更多个相关线程组,本文称为线程束。在一个实施例中,线程束包括可以并行执行的32个相关线程。协作线程可以指代包括执行任务的指令并且可以通过共享存储器交换数据的多个线程。结合图5a更详细地描述线程和协作线程。

图14a示出了根据一个实施例的图13的ppu300的gpc350。如图14a所示,每个gpc350包括用于处理任务的多个硬件单元。在一个实施例中,每个gpc350包括管线管理器410、预光栅操作单元(prop)415、光栅引擎425、工作分配交叉开关(wdx)480、存储器管理单元(mmu)490以及一个或更多个数据处理集群(dpc)420。应当理解,图14a的gpc350可以包括代替图14a中所示单元的其他硬件单元或除图14a中所示单元之外的其他硬件单元。

在一个实施例中,gpc350的操作由管线管理器410控制。管线管理器410管理用于处理分配给gpc350的任务的一个或更多个dpc420的配置。在一个实施例中,管线管理器410可以配置一个或更多个dpc420中的至少一个来实现图形渲染管线的至少一部分。例如,dpc420可以被配置为在可编程流式多处理器(sm)440上执行顶点着色程序。管线管理器410还可以被配置为将从工作分配单元325接收的数据包路由到gpc350中适当的逻辑单元。例如,一些数据包可以被路由到prop415和/或光栅引擎425中的固定功能硬件单元,而其他数据包可以被路由到dpc420以供图元引擎435或sm440处理。在一个实施例中,管线管理器410可以配置一个或更多个dpc420中的至少一个以实现神经网络模型和/或计算管线。

prop单元415被配置为将由光栅引擎425和dpc420生成的数据路由到光栅操作(rop)单元,结合图14b更详细地描述。prop单元415还可以被配置为执行颜色混合的优化,组织像素数据,执行地址转换等。

光栅引擎425包括被配置为执行各种光栅操作的若干固定功能硬件单元。在一个实施例中,光栅引擎425包括设置引擎、粗光栅引擎、剔除引擎、裁剪引擎、精细光栅引擎和瓦片聚合引擎。设置引擎接收变换后的顶点并生成与由顶点定义的几何图元关联的平面方程。平面方程被发送到粗光栅引擎以生成图元的覆盖信息(例如,瓦片的x、y覆盖掩码)。粗光栅引擎的输出被发送到剔除引擎,其中与未通过z-测试的图元相关联的片段被剔除,并且未剔除的片段被发送到裁剪引擎,其中位于视锥体之外的片段被裁剪掉。那些经过裁剪和剔除后留下来的片段可以被传递到精细光栅引擎,以基于由设置引擎生成的平面方程生成像素片段的属性。光栅引擎425的输出包括例如要由在dpc420内实现的片段着色器处理的片段。

包括在gpc350中的每个dpc420包括m管线控制器(mpc)430、图元引擎435和一个或更多个sm440。mpc430控制dpc420的操作,将从管线管理器410接收到的数据包路由到dpc420中的适当单元。例如,与顶点相关联的数据包可以被路由到图元引擎435,图元引擎435被配置为从存储器304提取与顶点相关联的顶点属性。相反,与着色程序相关联的数据包可以被发送到sm440。

sm440包括被配置为处理由多个线程表示的任务的可编程流式处理器。每个sm440是多线程的并且被配置为同时执行来自特定线程组的多个线程(例如,32个线程)。在一个实施例中,sm440实现simd(单指令、多数据)体系架构,其中线程组(例如,warp)中的每个线程被配置为基于相同的指令集来处理不同的数据集。线程组中的所有线程都执行相同的指令。在另一个实施例中,sm440实现simt(单指令、多线程)体系架构,其中线程组中的每个线程被配置为基于相同的指令集处理不同的数据集,但是其中线程组中的各个线程在执行期间被允许发散。在一个实施例中,为每个线程束维护程序计数器、调用栈和执行状态,当线程束内的线程发散时,使线程束和线程束中的串行执行之间的并发成为可能。在另一个实施例中,为每个单独的线程维护程序计数器、调用栈和执行状态,从而在线程束内和线程束之间的所有线程之间实现相等的并发。当为每个单独的线程维护执行状态时,执行相同指令的线程可以被收敛并且并行执行以获得最大效率。下面结合图15a更详细地描述sm440。

mmu490提供gpc350和分区单元380之间的接口。mmu490可以提供虚拟地址到物理地址的转换、存储器保护以及存储器请求的仲裁。在一个实施例中,mmu490提供用于执行从虚拟地址到存储器304中的物理地址的转换的一个或更多个转换后备缓冲器(tlb)。

图14b示出了根据一个实施例的图13的ppu300的存储器分区单元380。如图14b所示,存储器分区单元380包括光栅操作(rop)单元450、二级(l2)高速缓存460和存储器接口470。存储器接口470耦合到存储器304。存储器接口470可以实现用于高速数据传输的32、64、128、1024位数据总线等。在一个实施例中,ppu300合并了u个存储器接口470,每对分区单元380有一个存储器接口470,其中每对分区单元380连接到对应的存储器设备304。例如,ppu300可以连接到多达y个存储器设备304,诸如高带宽存储器堆叠或图形双数据速率版本5的同步动态随机存取存储器或其他类型的持久存储器。

在一个实施例中,存储器接口470实现hbm2存储器接口,并且y等于u的一半。在一个实施例中,hbm2存储器堆叠位于与ppu300相同的物理封装上,提供与常规gddr5sdram系统相比显著的功率高和面积节约。在一个实施例中,每个hbm2堆叠包括四个存储器裸晶并且y等于4,其中hbm2堆叠包括每个裸晶两个128位通道,总共8个通道和1024位的数据总线宽度。

在一个实施例中,存储器304支持单错校正双错检测(secded)纠错码(ecc)以保护数据。对于对数据损毁敏感的计算应用程序,ecc提供了更高的可靠性。在大型集群计算环境中,ppu300处理非常大的数据集和/或长时间运行应用程序,可靠性尤其重要。

在一个实施例中,ppu300实现多级存储器层次。在一个实施例中,存储器分区单元380支持统一存储器以为cpu和ppu300存储器提供单个统一的虚拟地址空间,使得虚拟存储器系统之间的数据能够共享。在一个实施例中,跟踪ppu300对位于其他处理器上的存储器的访问频率,以确保存储器页面被移动到更频繁地访问该页面的ppu300的物理存储器。在一个实施例中,nvlink310支持地址转换服务,其允许ppu300直接访问cpu的页表并且提供由ppu300对cpu存储器的完全访问。

在一个实施例中,复制引擎在多个ppu300之间或在ppu300与cpu之间传输数据。复制引擎可以为未映射到页表的地址生成页面错误。然后,存储器分区单元380可以服务页面错误,将地址映射到页表中,之后复制引擎可以执行传输。在常规系统中,针对多个处理器之间的多个复制引擎操作固定存储器(例如,不可分页),其显著减少了可用存储器。由于硬件分页错误,地址可以传递到复制引擎而不用担心存储器页面是否驻留,并且复制过程是否透明。

来自存储器304或其他系统存储器的数据可以由存储器分区单元380取回并存储在l2高速缓存460中,l2高速缓存460位于芯片上并且在各个gpc350之间共享。如图所示,每个存储器分区单元380包括与对应的存储器设备304相关联的l2高速缓存460的一部分。然后可以在gpc350内的多个单元中实现较低级高速缓存。例如,每个sm440可以实现一级(l1)高速缓存。l1高速缓存是专用于特定sm440的专用存储器。来自l2高速缓存460的数据可以被获取并存储在每个l1高速缓存中,以在sm440的功能单元中进行处理。l2高速缓存460被耦合到存储器接口470和xbar370。

rop单元450执行与诸如颜色压缩、像素混合等像素颜色相关的图形光栅操作。rop单元450还与光栅引擎425一起实现深度测试,从光栅引擎425的剔除引擎接收与像素片段相关联的样本位置的深度。测试与片段关联的样本位置相对于深度缓冲区中的对应深度的深度。如果片段通过样本位置的深度测试,则rop单元450更新深度缓冲区并将深度测试的结果发送给光栅引擎425。将理解的是,分区单元380的数量可以不同于gpc350的数量,并且因此每个rop单元450可以耦合到每个gpc350。rop单元450跟踪从不同gpc350接收到的数据包并且确定由rop单元450生成的结果通过xbar370被路由到哪个gpc350。尽管在图14b中rop单元450被包括在存储器分区单元380内,但是在其他实施例中,rop单元450可以在存储器分区单元380之外。例如,rop单元450可以驻留在gpc350或另一个单元中。

图15a示出了根据一个实施例的图14a的流式多处理器440。如图15a所示,sm440包括指令高速缓存505、一个或更多个调度器单元510、寄存器文件520、一个或更多个处理核心550、一个或更多个特殊功能单元(sfu)552、一个或更多个加载/存储单元(lsu)554、互连网络580、共享存储器/l1高速缓存570。

如上所述,工作分配单元325调度任务以在ppu300的gpc350上执行。任务被分配给gpc350内的特定dpc420,并且如果该任务与着色器程序相关联,则该任务可以被分配给sm440。调度器单元510接收来自工作分配单元325的任务并且管理指派给sm440的一个或更多个线程块的指令调度。调度器单元510调度线程块以作为并行线程的线程束执行,其中每个线程块被分配至少一个线程束。在一个实施例中,每个线程束执行32个线程。调度器单元510可以管理多个不同的线程块,将线程束分配给不同的线程块,然后在每个时钟周期期间将来自多个不同的协作组的指令分派到各个功能单元(即,核心550、sfu552和lsu554)。

协作组是用于组织通信线程组的编程模型,其允许开发者表达线程正在进行通信所采用的粒度,使得能够表达更丰富、更高效的并行分解。协作启动api支持线程块之间的同步性,以执行并行算法。常规的编程模型为同步协作线程提供了单一的简单结构:跨线程块的所有线程的栅栏(barrier)(例如,syncthreads()函数)。然而,程序员通常希望以小于线程块粒度的粒度定义线程组,并在所定义的组内同步,以集体的全组功能接口(collectivegroup-widefunctioninterface)的形式使能更高的性能、设计灵活性和软件重用。

协作组使得程序员能够在子块(例如,像单个线程一样小)和多块粒度处明确定义线程组并且执行集体操作,诸如协作组中的线程上的同步性。编程模型支持跨软件边界的干净组合,以便库和效用函数可以在他们本地环境中安全地同步,而无需对收敛进行假设。协作组图元启用合作并行的新模式,包括生产者-消费者并行、机会主义并行以及跨整个线程块网格的全局同步。

分派单元515被配置为向一个或更多个功能单元传送指令。在该实施例中,调度器单元510包括两个分派单元515,其使得能够在每个时钟周期期间调度来自相同线程束的两个不同指令。在替代实施例中,每个调度器单元510可以包括单个分派单元515或附加分派单元515。

每个sm440包括寄存器文件520,其提供用于sm440的功能单元的一组寄存器。在一个实施例中,寄存器文件520在每个功能单元之间被划分,使得每个功能单元被分配寄存器文件520的专用部分。在另一个实施例中,寄存器文件520在由sm440执行的不同线程束之间被划分。寄存器文件520为连接到功能单元的数据路径的操作数提供临时存储器。

每个sm440包括l个处理核心550。在一个实施例中,sm440包括大量(例如128个等)不同的处理核心550。每个核心550可以包括完全管线化的、单精度、双精度和/或混合精度处理单元,其包括浮点运算逻辑单元和整数运算逻辑单元。在一个实施例中,浮点运算逻辑单元实现用于浮点运算的ieee754-2008标准。在一个实施例中,核心550包括64个单精度(32位)浮点核心、64个整数核心、32个双精度(64位)浮点核心和8个张量核心(tensorcore)。

张量核心被配置为执行矩阵运算,并且在一个实施例中,一个或更多个张量核心被包括在核心550中。具体地,张量核心被配置为执行深度学习矩阵运算,诸如用于神经网络训练和推理的卷积运算。在一个实施例中,每个张量核心在4×4矩阵上运算并且执行矩阵乘法和累加运算d=a×b+c,其中a、b、c和d是4×4矩阵。

在一个实施例中,矩阵乘法输入a和b是16位浮点矩阵,而累加矩阵c和d可以是16位浮点或32位浮点矩阵。张量核心在16位浮点输入数据以及32位浮点累加上运算。16位浮点乘法需要64次运算,产生全精度的积,然后使用32位浮点与4×4×4矩阵乘法的其他中间积相加来累加。在实践中,张量核心用于执行由这些较小的元素建立的更大的二维或更高维的矩阵运算。api(诸如cuda9c++api)公开了专门的矩阵加载、矩阵乘法和累加以及矩阵存储运算,以便有效地使用来自cuda-c++程序的张量核心。在cuda层面,线程束级接口假定16×16尺寸矩阵跨越线程束的全部32个线程。

在一些实施例中,转置硬件被包括在处理核心550或另一功能单元(例如,sfus552或lsus554)中,并被配置为生成由对角线存储的矩阵数据和/或从由对角线存储的矩阵数据生成原始矩阵和/或转置矩阵。转置硬件可以在共享存储器570内部提供至sm440的寄存器文件520加载路径。

在一个示例中,由对角线存储的矩阵数据可以从dram取出并存储在共享存储器570中。在使用由对角线存储的矩阵数据执行处理的指令被处理时,设置在共享内存570和寄存器文件520的路径中的转置硬件可以提供原始矩阵、转置矩阵、紧凑原始矩阵和/或紧凑转置矩阵。可以维持由对角线存储的单个矩阵数据,直到指令之前的最后存储,并且在寄存器文件520中按需生成由指令指定的矩阵类型。

每个sm440还包括执行特殊函数(例如,属性评估、倒数平方根等)的m个sfu552。在一个实施例中,sfu552可以包括树遍历单元,其被配置为遍历分层树数据结构。在一个实施例中,sfu552可以包括被配置为执行纹理图过滤操作的纹理单元。在一个实施例中,纹理单元被配置为从存储器304加载纹理图(例如,纹理像素的2d阵列)并且对纹理图进行采样以产生经采样的纹理值,用于在由sm440执行的着色器程序中使用。在一个实施例中,纹理图被存储在共享存储器/l1高速缓存470中。纹理单元实现纹理操作,诸如使用mip图(即,不同细节层次的纹理图)的过滤操作。在一个实施例中,每个sm440包括两个纹理单元。

每个sm440还包括n个lsu554,其实现共享存储器/l1高速缓存570和寄存器文件520之间的加载操作和存储操作。每个sm440包括将每个功能单元连接到寄存器文件520以及将lsu554连接到寄存器文件520、共享存储器/l1高速缓存570的互连网络580。在一个实施例中,互连网络580是交叉开关,其可以被配置为将任何功能单元连接到寄存器文件520中的任何寄存器,以及将lsu554连接到寄存器文件和共享存储器/l1高速缓存570中的存储器位置。

共享存储器/l1高速缓存570是片上存储器阵列,其允许数据存储和sm440与图元引擎435之间以及sm440中的线程之间的通信。在一个实施例中,共享存储器/l1高速缓存570包括128kb的存储容量并且在从sm440到分区单元380的路径中。共享存储器/l1高速缓存570可以用于高速缓存读取和写入。共享存储器/l1高速缓存570、l2高速缓存460和存储器304中的一个或更多个是后备存储。

将数据高速缓存和共享存储器功能组合成单个存储器块为两种类型的存储器访问提供最佳的总体性能。该容量可由程序用作不使用共享存储器的高速缓存。例如,如果将共享存储器配置为使用一半容量,则纹理和加载/存储操作可以使用剩余容量。在共享存储器/l1高速缓存570内的集成使共享存储器/l1高速缓存570起到用于流式传输数据的高吞吐量管线的作用,并且同时提供对频繁重用数据的高带宽和低延迟的访问。

当被配置用于通用并行计算时,与图形处理相比,可以使用更简单的配置。具体地,图3所示的固定功能图形处理单元被绕过,创建了更简单的编程模型。在通用并行计算配置中,工作分配单元325将线程块直接指派并分配给dpc420。块中的线程执行相同的程序,使用计算中的唯一线程id来确保每个线程生成唯一结果,使用sm440执行程序并执行计算,使用共享存储器/l1高速缓存570以在线程之间通信,以及使用lsu554通过共享存储器/l1高速缓存570和存储器分区单元380读取和写入全局存储器。当被配置用于通用并行计算时,sm440还可以写入调度器单元320可用来在dpc420上启动新工作的命令。

ppu300可以被包括在台式计算机、膝上型计算机、平板电脑、服务器、超级计算机、智能电话(例如,无线、手持设备)、个人数字助理(pda)、数码相机、运载工具、头戴式显示器、手持式电子设备等中。在一个实施例中,ppu300包含在单个半导体衬底上。在另一个实施例中,ppu300与一个或更多个其他器件(诸如附加ppu300、存储器304、精简指令集计算机(risc)cpu、存储器管理单元(mmu)、数字-模拟转换器(dac)等)一起被包括在片上系统(soc)上。

在一个实施例中,ppu300可以被包括在图形卡上,图形卡包括一个或更多个存储器设备304。图形卡可以被配置为与台式计算机的主板上的pcie插槽接口。在又一个实施例中,ppu300可以是包含在主板的芯片集中的集成图形处理单元(igpu)或并行处理器。

示例性计算系统

具有多个gpu和cpu的系统被用于各种行业,因为开发者在应用(诸如人工智能计算)中暴露和利用更多的并行性。在数据中心、研究机构和超级计算机中部署具有数十至数千个计算节点的高性能gpu加速系统,以解决更大的问题。随着高性能系统内处理设备数量的增加,通信和数据传输机制需要扩展以支持该增加带宽。

图15b是根据一个实施例的使用图13的ppu300实现的处理系统500的概念图。示例性系统500可以被配置为实现本申请公开的方法(例如,图5、图6或图8所示的方法)。处理系统500包括cpu530、交换机555和多个ppu300中的每一个以及相应的存储器304。nvlink310提供每个ppu300之间的高速通信链路。尽管图15b中示出了特定数量的nvlink310和互连302连接,但是连接到每个ppu300和cpu530的连接的数量可以改变。交换机555在互连302和cpu530之间接口。ppu300、存储器304和nvlink310可以位于单个半导体平台上以形成并行处理模块525。在一个实施例中,交换机555支持两个或更多个在各种不同连接和/或链路之间接口的协议。

在另一个实施例(未示出)中,nvlink310在每个ppu300和cpu530之间提供一个或更多个高速通信链路,并且交换机555在互连302和每个ppu300之间进行接口。ppu300、存储器304和互连302可以位于单个半导体平台上以形成并行处理模块525。在又一个实施例(未示出)中,互连302在每个ppu300和cpu530之间提供一个或更多个通信链路,并且交换机555使用nvlink310在每个ppu300之间进行接口,以在ppu300之间提供一个或更多个高速通信链路。在另一个实施例(未示出)中,nvlink310在ppu300和cpu530之间通过交换机555提供一个或更多个高速通信链路。在又一个实施例(未示出)中,互连302在每个ppu300之间直接地提供一个或更多个通信链路。可以使用与nvlink310相同的协议将一个或更多个nvlink310高速通信链路实现为物理nvlink互连或者片上或裸晶上互连。

在本说明书的上下文中,单个半导体平台可以指在裸晶或芯片上制造的唯一的单一的基于半导体的集成电路。应该注意的是,术语单个半导体平台也可以指具有增加的连接的多芯片模块,其模拟片上操作并通过利用常规总线实现方式进行实质性改进。当然,根据用户的需要,各种电路或器件还可以分开放置或以半导体平台的各种组合来放置。可选地,并行处理模块525可以被实现为电路板衬底,并且ppu300和/或存储器304中的每一个可以是封装器件。在一个实施例中,cpu530、交换机555和并行处理模块525位于单个半导体平台上。

在一个实施例中,每个nvlink310的信令速率是20到25千兆位/秒,并且每个ppu300包括六个nvlink310接口(如图15b所示,每个ppu300包括五个nvlink310接口)。每个nvlink310在每个方向上提供25千兆位/秒的数据传输速率,其中六条链路提供300千兆位/秒。当cpu530还包括一个或更多个nvlink310接口时,nvlink310可专门用于如图15b所示的ppu到ppu通信,或者ppu到ppu以及ppu到cpu的某种组合。

在一个实施例中,nvlink310允许从cpu530到每个ppu300的存储器304的直接加载/存储/原子访问。在一个实施例中,nvlink310支持一致性操作,允许从存储器304读取的数据被存储在cpu530的高速缓存分层结构中,减少了cpu530的高速缓存访问延迟。在一个实施例中,nvlink310包括对地址转换服务(ats)的支持,允许ppu300直接访问cpu530内的页表。一个或更多个nvlink310还可以被配置为以低功率模式操作。

图15c示出了示例性系统565,其中可以实现各种先前实施例的各种体系架构和/或功能。示例性系统565可以被配置为实现本申请公开的方法(例如,图5、图6或图8所示的方法)。

如图所示,提供系统565,其包括连接到通信总线575的至少一个中央处理单元530。通信总线575可以使用任何合适的协议来实现,诸如pci(外围组件互连)、pci-express、agp(加速图形端口)、超传输或任何其他总线或一个或更多个点对点通信协议。系统565还包括主存储器540。控制逻辑(软件)和数据被存储在主存储器540中,主存储器540可以采取随机存取存储器(ram)的形式。

系统565还包括输入设备560、并行处理系统525和显示设备545,例如常规crt(阴极射线管)、lcd(液晶显示器)、led(发光二极管)、等离子显示器等。可以从输入设备560(例如键盘、鼠标、触摸板、麦克风等)接收用户输入。前述模块和/或设备中的每一个甚至可以位于单个半导体平台上以形成系统565。可选地,根据用户的需要,各个模块还可以分开放置或以半导体平台的各种组合来放置。

此外,系统565可以出于通信目的通过网络接口535耦合到网络(例如,电信网络、局域网(lan)、无线网络、广域网(wan)(诸如因特网)、对等网络、电缆网络等)。

系统565还可以包括辅助存储(未示出)。辅助存储610包括例如硬盘驱动器和/或可移除存储驱动器、代表软盘驱动器、磁带驱动器、光盘驱动器、数字多功能盘(dvd)驱动器、记录设备、通用串行总线(usb)闪存。可移除存储驱动器以众所周知的方式从可移除存储单元读取和/或写入可移除存储单元。

计算机程序或计算机控制逻辑算法可以存储在主存储器540和/或辅助存储中。这些计算机程序在被执行时使得系统565能够执行各种功能。存储器540、存储和/或任何其他存储是计算机可读介质的可能示例。

各种在先附图的体系架构和/或功能可以在通用计算机系统、电路板系统、专用于娱乐目的的游戏控制台系统、专用系统和/或任何其他所需的系统的上下文中实现。例如,系统565可以采取台式计算机、膝上型计算机、平板电脑、服务器、超级计算机、智能电话(例如,无线、手持设备)、个人数字助理(pda)、数字相机、运载工具、头戴式显示器、手持式电子设备、移动电话设备、电视机、工作站、游戏控制台、嵌入式系统和/或任何其他类型的逻辑的形式。

虽然上面已经描述了各种实施例,但是应该理解,它们仅以示例的方式呈现,而不是限制。因此,优选实施例的宽度和范围不应受任何上述示例性实施例的限制,而应仅根据所附权利要求及其等同物来限定。

图形处理管线

在一个实施例中,ppu300包括图形处理单元(gpu)。ppu300被配置为接收指定用于处理图形数据的着色程序的命令。图形数据可以被定义为一组图元,例如点、线、三角形、四边形、三角形带等。典型地,图元包括指定图元的多个顶点(例如,在模型空间坐标系中)的数据以及与图元的每个顶点相关联的属性。ppu300可以被配置为处理图元以生成帧缓冲区(例如,用于显示器的像素中的每一个的像素数据)。

应用程序将场景的模型数据(例如,顶点和属性的集合)写入存储器(诸如系统存储器或存储器304)。模型数据定义可能在显示器上可见的对象中的每一个。然后应用程序对驱动程序内核进行api调用,其请求要被渲染和显示的模型数据。驱动程序内核读取模型数据并将命令写入一个或更多个流以执行操作来处理模型数据。这些命令可以参考要在ppu300的sm440上实现的不同着色程序,包括顶点着色、外壳着色、域着色、几何着色和像素着色中的一个或更多个。例如,sm440中的一个或更多个可以被配置为执行顶点着色程序,其处理由模型数据定义的多个顶点。在一个实施例中,不同的sm440可以被配置为同时执行不同的着色程序。例如,sm440的第一子集可以被配置为执行顶点着色程序,而sm440的第二子集可以被配置为执行像素着色程序。sm440的第一子集处理顶点数据以产生经处理的顶点数据,并将经处理的顶点数据写入l2高速缓存460和/或存储器304。在经处理的顶点数据被光栅化(例如,从三维数据转换成屏幕空间中的二维数据)以产生片段数据之后,sm440的第二子集执行像素着色以产生经处理的片段数据,然后将其与其他经处理的片段数据混合并被写入存储器304中的帧缓冲区。顶点着色程序和像素着色程序可以同时执行,以管线方式处理来自同一场景的不同数据,直到该场景的所有模型数据已经被渲染到帧缓冲区。然后,帧缓冲区的内容被传送到显示控制器以在显示设备上显示。

图16是根据一个实施例的由图13的ppu300实现的图形处理管线600的概念图。图形处理管线600是被实现以从3d几何数据生成2d计算机生成图像的处理步骤的抽象流程图。众所周知,管线架构可以通过将操作分成多个阶段来更高效地执行长延迟操作,其中每个阶段的输出耦合到下一个连续阶段的输入。因此,图形处理管线600接收从图形处理管线600的一个阶段传送到下一阶段的输入数据601,以生成输出数据602。在一个实施例中,图形处理管线600可表示由api定义的图形处理管线。作为选择,图形处理管线600可以在先前附图和/或一个或更多个任何后续附图的功能和架构的上下文中实现。

如图16所示,图形处理管线600包括包含多个阶段的管线架构。这些阶段包括但不限于数据组装阶段610、顶点着色阶段620、图元组装阶段630、几何着色阶段640、视口缩放、剔除和裁剪(viewportscale,cull,andclip,vscc)阶段650、光栅化阶段660、片段着色阶段670和光栅操作阶段680。在一个实施例中,输入数据601包括命令,其配置处理单元以实现图形处理管线600的阶段,并配置几何图元(例如,点、线、三角形、四边形、三角形带或扇形等)以由这些阶段处理。输出数据602可以包括像素数据(即,颜色数据),其被复制到存储器中的帧缓冲区或其他类型的表面数据结构中。

数据组装阶段610接收输入数据601,其指定用于高阶表面、图元等的顶点数据。数据组装阶段610收集临时存储或队列中的顶点数据,诸如通过从主机处理器接收包括指向存储器中的缓冲区的指针的命令并从该缓冲区读取顶点数据。顶点数据然后被传送到顶点着色阶段620以进行处理。

顶点着色阶段620通过对顶点中的每一个执行一次一组操作(例如,顶点着色器或程序)来处理顶点数据。顶点可以例如被指定为与一个或更多个顶点属性(例如,颜色、纹理坐标、表面法线等)相关联的4坐标向量(例如,<x,y,z,w>)。顶点着色阶段620可以操纵各个顶点属性,诸如位置、颜色、纹理坐标等。换句话说,顶点着色阶段620对与顶点相关联的顶点坐标或其他顶点属性执行操作。这些操作通常包括光照操作(例如,修改顶点的颜色属性)和变换操作(例如,修改顶点的坐标空间)。例如,可以使用对象坐标空间中的坐标来指定顶点,其通过将坐标乘以矩阵进行变换,该矩阵将坐标从对象坐标空间转换到世界空间或归一化设备坐标(normalized-device-coordinate,ncd)空间。顶点着色阶段620生成被传送到图元组装阶段630的经变换的顶点数据。

图元组装阶段630收集由顶点着色阶段620输出的顶点并且将顶点分组成几何图元以由几何着色阶段640处理。例如,图元组装阶段630可以被配置为将每三个连续顶点分组为用于传送到几何着色阶段640的几何图元(例如,三角形)。在一些实施例中,特定顶点可以被重新用于连续几何图元(例如,三角形带中的两个连续三角形可以共享两个顶点)。图元组装阶段630将几何图元(例如,相关联的顶点的集合)传送到几何着色阶段640。

几何着色阶段640通过对几何图元执行一组操作(例如,几何着色器或程序)来处理几何图元。曲面细分(tessellation)操作可以从每个几何图元生成一个或更多个几何图元。换言之,几何着色阶段640可以将每个几何图元细分为两个或更多个几何图元的更精细的网格,以由图形处理管线600的其余部分进行处理。几何着色阶段640将几何图元传送到视口scc阶段650。

在一个实施例中,图形处理管线600可以在流式多处理器和顶点着色阶段620、图元组装阶段630、几何着色阶段640、片段着色阶段670和/或与其相关联的硬件/软件内操作,可顺序地执行处理操作。一旦顺序处理操作完成,在一个实施例中,视口scc阶段650可以利用数据。在一个实施例中,由图形处理管线600中的阶段的一个或更多个处理的图元数据可以被写入高速缓存(例如,l1高速缓存、顶点高速缓存等)中。在这种情况下,在一个实施例中,视口scc阶段650可以访问高速缓存中的数据。在一个实施例中,视口scc阶段650和光栅化阶段660被实现为固定功能电路。

视口scc阶段650执行几何图元的视口缩放、剔除和裁剪。正被渲染的每个表面都与抽象相机位置相关联。相机位置表示正观看该场景的观看者的位置并定义了包围该场景的对象的视锥体。视锥体可以包括观看平面、后平面和四个裁剪平面。完全位于视锥体之外的任何几何图元都可被剔除(例如丢弃),因为这些几何图元将不会对最终渲染的场景做出贡献。部分位于视锥体内并且部分位于视锥体外的任何几何图元可以被裁剪(例如,转换为被包围在视锥体内的新的几何图元)。此外,可以基于视锥体的深度来对每个几何图元进行缩放。然后将所有可能可见的几何图元传送到光栅化阶段660。

光栅化阶段660将3d几何图元转换成2d片段(例如,能够用于显示等)。光栅化阶段660可以被配置为利用几何图元的顶点来设置一组平面方程,从中可以内插各种属性。光栅化阶段660还可以计算多个像素的覆盖掩码,其指示像素的一个或更多个样本位置是否拦截几何图元。在一个实施例中,还可以执行z测试以确定几何图元是否被已经被光栅化的其他几何图元遮挡。光栅化阶段660生成片段数据(例如,与每个被覆盖像素的特定样本位置相关联的内插顶点属性),其被传送到片段着色阶段670。

片段着色阶段670通过对片段中的每一个执行一组操作(例如,片段着色器或程序)来处理片段数据。片段着色阶段670可以生成片段的像素数据(例如,颜色值),诸如通过使用片段的内插纹理坐标执行光照操作或采样纹理图。片段着色阶段670生成像素数据,其被发送到光栅操作阶段680。

光栅操作阶段680可对像素数据执行各种操作,诸如执行阿尔法测试、模板测试(stenciltest)以及将像素数据与对应于与像素相关联的其他片段的其他像素数据混合。当光栅操作阶段680已经完成对像素数据(例如,输出数据602)的处理时,可以将像素数据写入渲染目标,诸如帧缓冲区、颜色缓冲区等。

应当领会,除上述阶段中的一个或更多个以外或代替上述阶段中的一个或更多个,一个或更多个额外的阶段可以被包括在图形处理管线600中。抽象图形处理管线的各种实现方式可以实现不同的阶段。此外,在一些实施例中,上述阶段中的一个或更多个可以从图形处理管线中排除(诸如几何着色阶段640)。其他类型的图形处理管线被认为是在本公开的范围内所构想的。此外,图形处理管线600的任何阶段可以由图形处理器(诸如ppu300)内的一个或更多个专用硬件单元来实现。图形处理管线600的其他阶段可以由可编程硬件单元(诸如ppu300的sm440)来实现。

图形处理管线600可以经由由主机处理器(诸如cpu)执行的应用程序来实现。在一个实施例中,设备驱动程序可以实现应用程序编程接口(api),其定义可以被应用程序利用以生成用于显示的图形数据的各种功能。设备驱动程序是软件程序,其包括控制ppu300的操作的多个指令。api为程序员提供抽象,其允许程序员利用专用图形硬件(诸如ppu300)来生成图形数据而不要求程序员利用ppu300的特定指令集。应用程序可以包括被路由到ppu300的设备驱动程序的api调用。设备驱动程序解释api调用并执行各种操作以响应api调用。在一些情况下,设备驱动程序可以通过在cpu上执行指令来执行操作。在其他情况下,设备驱动程序可以至少部分地通过利用cpu和ppu300之间的输入/输出接口在ppu300上启动操作来执行操作。在一个实施例中,设备驱动程序被配置为利用ppu300的硬件来实现图形处理管线600。

可以在ppu300内执行各种程序以便实现图形处理管线600的各个阶段。例如,设备驱动程序可以启动ppu300上的内核以在一个sm440(或多个sm440)上执行顶点着色阶段620。设备驱动程序(或由ppu400执行的初始内核)还可启动ppu400上的其他内核以执行图形处理管线600的其他阶段,诸如几何着色阶段640和片段着色阶段670。另外,图形处理管线600的阶段中的一些可以在固定单元硬件(诸如在ppu400内实现的光栅器或数据组装器)上实现。应当领会,在被sm440上的后续内核处理之前,来自一个内核的结果可以由一个或更多个中间固定功能硬件单元处理。

一些实施例的示例技术优势

某些示例实施例提供了改进从压缩矩阵数据生成原始矩阵和/或转置矩阵。

与常规的存储矩阵和生成转置矩阵的方法相比,本发明的方法和系统的示例实施例使用更少的存储、提高传输时间和/或减少计算时间。与常规方法不同,使用对角线存储格式时不需要存储和/或传输原始矩阵和转置矩阵两者,因为可以很容易地从对角线存储格式生成原始矩阵、转置矩阵、紧凑原始矩阵和/或紧凑转置矩阵。此外,对角线存储格式的优点也适用于大型矩阵。

根据上述教导,本发明可以进行许多修改和变型。因此,应当理解,在所附权利要求的范围内,本发明可以以本文具体描述的之外的方式实践。

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