用于在渲染图形时预加载纹理的技术的制作方法

文档序号:23753733发布日期:2021-01-29 14:40阅读:68来源:国知局
用于在渲染图形时预加载纹理的技术的制作方法
用于在渲染图形时预加载纹理的技术
[0001]
相关申请的交叉引用
[0002]
本申请要求于2019年7月22日提交的美国临时申请号62/876,957的优先权,其全部内容通过引用并入本文。
技术领域
[0003]
本公开涉及计算机图形、纹理映射,并且更具体地,涉及用于从存储器中获取纹理以进行图形处理的系统和方法。


背景技术:

[0004]
智能电视,便携式电话和其他智能设备,视频游戏系统,运输用户界面(诸如汽车和飞机平视显示器),智能眼镜和虚拟现实护目镜,以及许多其他设备都具有生成3d计算机图形的能力。用户通常希望他们的计算机图形系统能够实时生成任意复杂场景的逼真图像。降低场景复杂性的一种常用方法是将其建模为附加图像映射到的表面。就像画布上的油画一样,渲染的3d模型可看起来包含许多复杂的元素(例如,巴黎圣母院利用的阴影和灯光,树木的数千片叶子,砖墙中的数百块砖,或会议室桌子的精致木纹),而无需为每个此类元素建模。基本地,将显示这种复杂性的图像虚拟地粘贴或映射到被渲染模型的表面上。附加图像通常被称为“纹理”,而将纹理应用于模型表面的过程称为“纹理映射(texture mapping)”。
[0005]
通常,预先捕获或创建纹理并将其存储在存储器中。当图形系统渲染表面时,它会从存储器中获取(fetch)必要的纹理图像数据(纹理元素或“纹理像素”),并使用映射过程将纹理图像应用于该表面,以适当地缩放和过滤图像。由于纹理本身可以是丰富、复杂的图像,因此通常将其压缩以减少存储要求。图形处理“纹理映射器”通常包括在从存储器中获取纹理图像后对其进行解压缩的能力。此外,取决于用途,纹理通常可以以各种不同的格式存储。
[0006]
例如,某些先前的图形系统提供了特殊的纹理高速缓存和表面存储器,用于以提供更高效访问的特殊内部格式存储纹理。作为一个示例,根据用于编程某些nvidia产品的nvidia cuda编程指南v10.1.105版本,cuda阵列(针对纹理获取而优化的不透明存储器布局)是一维、二维或三维的,并且由元素组成,每个元素具有1、2或4个分量,它们可以是不同分辨率的有符号或无符号的整数值或浮点值。在某些示例性非限制性nvidia图形系统中,cuda阵列能够由内核通过纹理获取或表面读取和写入来访问。纹理对象或纹理引用(texture reference)根据被获取的一片纹理存储器指定纹理。维度指定纹理是否使用一个纹理坐标作为一维阵列被寻址,使用两个纹理坐标作为二维阵列被寻址,还是使用三个纹理坐标作为三维阵列被寻址。阵列的元素是纹理像素。纹理的宽度、高度和深度是指每个维度中阵列的大小。在这样的实现中,纹理获取本身可以提供线性滤波或“mip贴图”,其可以包括重新采样以将纹理映射到要在其上显示纹理的表面的特定位置。
[0007]
以不同格式存储纹理以便更高效地访问也是有利的。参见例如美国专利号7,916,
149,其通过引用并入本文。特别地,所谓的“间距线性(pitch linear)”格式是用于存储纹理的通用格式。在这种“间距线性”格式中,纹理像素被顺序地存储在存储器中,即纹理像素被顺序地存储在矩形纹理区域的给定行(“间距”)中,然后纹理像素被顺序地存储在下一行中,依此类推。以这种格式,每个纹理像素行这样被存储在顺序增加的存储位置中。如果跨每行水平访问纹理像素,则这种“间距线性”布局是很好的。但是,典型的访问模式通常具有2d(或用于3d纹理的3d)空间位置。因此,在时间上紧密间隔的访问可能会沿任何方向(而不仅仅是水平方向)前进到附近的纹理像素。由于通常取决于观察者的视点,因此通常无法预先确定该空间局部性的方向。因此,当观察者四处移动时,相同的纹理将具有不同的空间局部性模式。
[0008]
作为替代,纹理像素数据可以以“块线性(block linear)”格式存储在计算机可读介质中。在“块线性”格式中,存储器在逻辑上被组织为多个块,这些块是特定实现的特定页面大小(例如,高速缓存行大小)的函数。纹理像素以xy(z)块顺序存储。在每个块内,纹理像素被顺序地存储在存储器中,即给定块中的纹理像素被顺序地存储,然后下一个块中的纹理像素被顺序地存储,依此类推。以这种格式,每个纹理像素块被这样被存储在顺序增加的存储位置中。在示例性块线性格式中,存储器的页面在32个顺序行中包含8个连续的4字节纹理像素(例如32字节)。块线性格式的存储器访问成本(例如,延迟)与页面边界的总数成比例。
[0009]
使用这种“线性块”格式来进一步减少分页惩罚的一种方式是组织或定义这种块为存储器“瓦片(tile)”。瓦片内的所有纹理像素都驻留在相同的物理或虚拟存储器页面中。这种瓦片划分(tiling)可以减少穿越存储器页面的惩罚。参见例如
[0010]
https://developer.nvidia.com/gpugems/gpugems2/gpugems2_chapter12.html电子版的《gpu gems 2》第12章(nvidia 2005)。
[0011]
尽管传统和向后兼容性可能是问题,但是上述方法已经受到技术和概念上的进步的显著影响。特别地,图形处理单元(gpu)现在在其结构和操作上是不限于图形处理的更通用的高性能计算设备。由于这些和其他原因,过去的专用纹理高速缓存很少使用和有用。取而代之的是,使用多个高速缓存存储器级别(在某些方面类似于cpu高速缓存存储器体系架构)的更通用的存储器体系架构已越来越多地用于减少高性能gpu的存储器延迟。
[0012]
更详细地,随着处理器速度的提高,处理器延迟的其他方面,例如存储器访问延迟和芯片内通信延迟,变得更加显著。并行处理器(诸如现代高性能图形处理单元(gpu))具有多个快速处理核心,因此通常甚至更显著地受存储器访问延迟等的影响。现代gpu朝向越来越显著的存储器访问延迟的趋势可能会损害新的多处理器gpu的性能扩展。例如,在最近发布的gpu中,据估计,整个处理单元的整体计算功率提高了50%,而根据工作负载的不同,性能平均只能提高32-39%。随着更大芯片的制造,处理器的延迟限制在整个系统性能损失中所占的比例预计将继续增加。
[0013]
对执行图形处理的gpu的存储器访问要求可与执行典型cpu工作负载的cpu的存储器访问要求显著不同。由于纹理可能非常大,因此上述纹理访问由于存储器延迟而受到的影响最大,并且它们通常还构成典型图形工作负载中的动态随机存取存储器(dram)读取流量最大组块。纹理处理单元和/或其他处理器可以从存储器加载纹理(也称为“纹理映射”),从而可以提供采样的纹理值以用于着色器和图像渲染中。由于纹理映射单元中没有足够的
延迟隐藏或纹理映射单元没有其他能力来防止纹理检索延迟引起瓶颈,因此在工作负载中遇到长存储器访问时,处理器可能无法达到其最佳性能。例如,大于1000个时钟周期的存储器延迟异常值并不少见。处理器的这种减慢通常可能导致存储器子系统的利用率不足,并使存储器系统无法获得请求。
[0014]
常规系统采用许多技术来减轻由于长存储器访问延迟而导致的性能下降。此类技术包括管线化(在cpu和gpu环境中)和数据预取(主要在cpu环境中)。但是,这些常规技术可能不足以解决与获取现代图形处理的大而变化的纹理相关的延迟。因此,需要改进的低延迟系统和技术来访问图形处理系统中的纹理。


技术实现要素:

[0015]
示例性实施例纠正了上述用于纹理处理的技术的一些缺陷。
[0016]
示例性实施例提供了一种用于显示场景的方法。该方法包括:在使用所存储的纹理的第一块对场景执行纹理映射的同时,由处理器生成预取请求,以从存储器层次结构的第一级存储器中检索所存储的纹理的第二块的全部或部分;响应于所述预取请求,从所述第一级存储器中检索所述第二块的全部或部分;将所检索到的第二块的全部或部分存储在存储器层次结构的第二级存储器的区域中,其中第二级存储器的所述区域可由处理器和另一处理器访问,并且其中第二级存储器是存储器层次结构中的第一级存储器和第三级存储器之间的中间级存储器;使用所检索到的第二块的全部或部分对场景执行纹理映射;以及将场景渲染到显示设备。在一些示例性实现中,可以由处理器执行使用第一块的对场景的纹理映射,并且可以由所述另一处理器执行使用第二块的对场景的纹理映射。
[0017]
另一示例性实施例提供了一种用于显示场景的并行处理系统。该系统包括多个处理器,包括至少第一级高速缓存存储器和第二级高速缓存存储器的高速缓存层次结构,显示接口,以及被配置为向多个处理器提供对片外存储器的访问的存储器接口。多个处理器和与高速缓存层次结构相关联的控制电路被配置为,在使用所存储的纹理的第一块对场景执行纹理映射的同时,由来自多个处理器的第一处理器生成预取请求,以从包括高速缓存层次结构的存储器层次结构中检索所存储的纹理的第二块的全部或部分。多个处理器和与高速缓存层次结构相关联的控制电路还被配置为:响应于预取请求,通过存储器接口从片外存储器检索所请求的第二块的全部或部分;将所检索到的第二块的全部或部分存储在第二级高速缓存存储器的区域中,其中第二级高速缓存存储器的所述区域可由来自多个处理器的第一处理器和第二处理器访问,并且其中第二级高速缓存存储器是片外存储器和第一级高速缓存存储器之间的中间级存储器;使用所检索到的第二块的全部或部分对场景执行纹理映射;通过显示界面将场景渲染到显示设备。
[0018]
示例性实施例提供一种片上系统(soc),其包括至少一个中央处理单元(cpu)和连接至所述cpu的至少一个并行处理单元(ppu)。每个ppu包括多个多处理器,多个特殊功能单元,包括至少第一级高速缓存存储器和第二级高速缓存存储器的高速缓存层次结构,以及被配置为提供对片外存储器的访问的存储器接口。
[0019]
与高速缓存层次结构相关联的多个特殊功能单元和控制电路被配置为响应于从多处理器之一接收到的指令来执行多个操作。所述操作包括:在使用所存储的纹理的第一块对场景进行纹理映射的同时,由来自多个特殊功能单元的第一特殊功能单元生成预取请
求,以从包含高速缓存层次结构的存储器层次结构中检索所存储的纹理的第二块的全部或部分。所述操作还包括:响应于预取请求,通过存储器接口从片外存储器检索所请求的第二块的全部或部分;将检索到的第二块的全部或部分存储在第二级高速缓存存储器的区域中,其中所述第二级高速缓存存储器的区域可由来自多个特殊功能单元的第一特殊功能单元和第二特殊功能单元访问,并且其中第二级高速缓存存储器是片外存储器和第一级高速缓存存储器之间的中间级存储器,使用检索到的第二块的全部或部分来对场景进行纹理映射,并通过显示界面将场景渲染到显示设备。
附图说明
[0020]
图1a是根据某些示例性实施例的提供改进的纹理渲染的系统的框图。
[0021]
图1b示出了到处理器核心的示例性纹理分配。
[0022]
图1c示意性地示出了根据间距线性格式在存储器中组织的纹理。
[0023]
图1d示意性地示出了根据块线性格式在存储器中组织的纹理。
[0024]
图1e示出了根据一些示例性实施例的存储器中的纹理数据组块的虚拟地址与该组块的渲染时间之间的关系。
[0025]
图1f提供了根据一些示例性实施例的存储器中组织的纹理数据及其与在屏幕上渲染的纹理的关系的另一示例性图示。
[0026]
图1g示出了根据一些示例性实施例的纹理、组块和块之间的关系。
[0027]
图2a是根据一些示例性实施例的可以在图1a的系统中使用的图形处理单元的框图。
[0028]
图2b示出了根据一些示例性实施例的由处理器和/或gpu的纹理处理单元执行以预取纹理数据的过程的流程图。
[0029]
图2c示出了根据一些示例性实施例的响应于由图2b所示的处理器和/或gpu的纹理处理单元发起的预取而由存储器层次结构执行的过程的流程图。
[0030]
图3示出了根据一个实施例的并行处理单元。
[0031]
图4a示出了根据一个实施例的在图3的并行处理单元内的通用处理集群。
[0032]
图4b示出了根据一个实施例的图3的并行处理单元的存储器分区单元。
[0033]
图5a示出了根据一个实施例的图4a的流式多处理器。
[0034]
图5b是根据一个实施例的使用图3的并行处理单元(ppu)实现的处理系统的概念图。
[0035]
图5c示出了在其中可以实现各种先前实施例的各种架构和/或功能的示例性系统。
[0036]
图6是根据一个实施例的由图3的ppu实现的图形处理管线的概念图。
具体实施方式
[0037]
本发明的实施例通过减少图形处理期间与访问存储器中的纹理数据相关联的存储器访问延迟来提供更高效的纹理映射。尽管管线技术可以减少各种应用程序中与纹理访问相关联的减慢效果,但通常情况下,对于与某些纹理访问相关联的较长延迟,管线技术提供的延迟隐藏不足。常规的预取技术(例如cpu使用的预取技术)对于具有多个处理器的环
境中的纹理处理可能不够有效。示例性实施例提供了改进的纹理预取技术和系统,其在图形处理期间产生了改进的存储器利用率和/或减少的有效存储器延迟,从而产生了改进的系统性能。
[0038]
某些示例性实施例提高了gpu中的存储器利用率和/或减少了有效存储器延迟。例如,通过推测性地将尚未由任何处理单元实际请求的数据提取到中间高速缓存(诸如2级(l2)高速缓存)中,可以实现这些改进。在处理单元实际请求数据之前的推测性获取(speculative fetching)在本文中被称为“预取(prefetching)”,并且发起这种推测性获取的请求被称为“预取请求(prefetching request)”。更具体地,某些示例性实施例提供了将纹理信息的另一个(例如,下一个顺序)块的部分或全部预取到gpu的l2高速缓存中,而当前加载的纹理信息块被纹理处理单元和/或gpu的其他处理单元使用和处理。这种推测性预取有时可以获取纹理数据,这些纹理数据最终并未实际被使用或需要(例如,像nascar进站维修人员获取了一套新轮胎,以防赛车手在比赛结束前需要换轮胎),但是当预取的数据被调用和需要以用于纹理映射时,可以有效地减少从存储器中检索新的纹理数据的等待时间。
[0039]
尽管推测性预取主要在cpu环境中是已知的,但在纹理检索环境中应用此类技术的挑战涉及如何预测纹理映射器接下来或将来将需要哪些纹理映射数据。由于多种因素,纹理映射通常不是一个完全可预测的过程。即这与nascar维修人员确切知道驾驶员在下一次更换轮胎时需要什么轮胎不同,可能很难预测当纹理映射器完成对已经从存储器中检索到的纹理数据的处理后,下一步它将需要纹理数据的哪些块。因此,过去对纹理信息的预取/推测性加载的尝试不一定表明对高度并行的图形工作负载有用。缺乏表明的成功至少部分归因于在预测或推断纹理映射访问模式方面的困难。导致挑战的原因是,纹理存储器访问的高度可变,其取决于诸如视点、表面方向之类的因素。避免由于高速缓存颠簸(thrashing)和/或无关的(extraneous)dram流量而导致的性能下降的需求增加了复杂性。
[0040]
某些示例性实施例以频繁存储器访问模式(诸如,例如全屏绘制)为目标以提高效率。这些示例性实施例,尽管它们可以在许多类型的纹理映射的显示器中改善系统性能,在改善与全屏绘制相关的纹理访问方面也特别有效。全屏绘制在游戏应用程序中很常见,但在许多其他应用程序中也会发生。全屏绘制涉及将图像渲染到整个屏幕,通常是由应用程序中包含的特定指令引起的。在许多游戏和其他应用程序中,当执行全屏绘制时,消耗存储在存储器中的纹理数据的方式涉及特定模式的存储器地址遍历。示例性实施例的纹理预取技术利用了这种存储器地址遍历模式。
[0041]
例如,纹理的全屏绘制实际上可以由间距线性纹理格式最有效地服务,因为通常可以指望全屏绘制以按水平行升序的顺序访问每个纹理像素。但是,在无法事先预测空间局部性的全屏绘制以外的环境中,也可以使用相同的纹理。作为示例,考虑其中场景包含虚拟计算机显示器(即,虚拟现实显示器内的显示器)的虚拟现实场景。用户可以根据视点以各种不同的方向(例如,从侧面或甚至上下颠倒)观看场景中虚拟显示器。但是用户然后可以移动他的观看方向和位置以正面观看虚拟显示器以填充整个观看视锥体(viewing frustum)。在此简单示例中,可以通过以块线性格式存储纹理来提高效率,但是块线性格式可能不是纹理所有用途的最有效存储表示(例如,当它在虚拟现实显示器的整个屏幕上显示时)。
[0042]
在某些示例性实施例中,在执行纹理数据的预取时,使用来自纹理标头(header)的信息在每纹理的基础上动态地计算要从其预取数据的块的偏移。动态计算允许系统针对不同大小的纹理使用单独的偏移。
[0043]
在某些示例性实施例中,发出预取请求的处理单元可以与随后使用预取数据并因此从中受益的处理单元不同。
[0044]
此外,在某些示例性实施例中,包括预取请求节流(throttling)机制以确保存储器层次结构不会被预取所压倒。另外,可以执行请求去重(deduplication)以提高预取的效率。如纹理单元和/或其他处理单元所见,这些优化可以导致减小存储器延迟,并且还可以提高高速缓存命中率。
[0045]
在使用示例性实施例的实验中,以实质上改善系统性能的方式预取以块线性布局存储的纹理信息。尽管存储器中的纹理信息的块线性布局(下面关于图1d描述)和由块线性布局实现的关联地址计算提供了一定的效率,但是实施例不限于纹理的块线性布局的使用。
[0046]
用于纹理预取的系统
[0047]
图1a示出了根据一些示例性实施例的被配置为执行纹理预取的系统100的示意性框图,该纹理预取减少了与存储器访问延迟效应相关的性能下降。系统100可以是包括一个或更多个中央处理单元(cpu)104和/或图形处理单元(gpu)102的片上系统(soc)。
[0048]
gpu 102可以经由主机接口110从cpu 104接收指令和数据。gpu 102经由图形存储器控制器105访问图形存储器114,并且还可以经由主机接口110和系统存储器控制器106从系统存储器108请求数据。系统存储器108可以在系统中的多个处理单元(例如,cpu 104和gpu 102)之间共享。存储在图形存储器114中的图形数据(诸如,例如帧缓冲器信息),可以经由显示控制器116在显示器118上显示。
[0049]
gpu 102包括多个处理核心122和多个纹理处理单元120。处理核心可以包括可以运行大量并行线程的并行处理处理器单元。处理核心从系统100中的cpu 104或其他处理器接收并执行指令。
[0050]
gpu 102还包括高速缓存层次结构124。高速缓存层次结构124包括两级或更多级的高速缓存存储器。高速缓存层次结构可以被构造为使得每个较高级别的高速缓存存储器服务于下一个较低级别的两个或更多个高速缓存存储器。例如,二级高速缓存存储器(即“l2高速缓存”)126可以被两个或更多个一级高速缓存存储器(即“l1高速缓存”)128访问。在本公开中,高速缓存层次结构124与图形存储器114相结合并且系统存储器108被称为“存储器层次结构”。在gpu 102的操作期间,当试图访问一条数据时,特定处理核心122可以首先搜索其l1高速缓存,然后是l2高速缓存,然后是图形存储器114或系统存储器108。
[0051]
这类似于厨师在去商店之前搜索他们的食品储藏室以检索食谱所需的特定食材。如果该物品在食品储藏室中,则厨师可以立即使用。如果该物品不在食品储藏室中,则厨师必须派人到商店取货,这需要时间。如果商店没有库存,则商店必须向分销商订购,这会花费更多时间。因此,与从家中的本地食品储藏室中获取食材相关的“延迟”或时间延时非常低,但是您的食品储藏室中也没有足够的空间来存储您可能需要的所有东西,此外,如果存放在食品储藏室中,其中一些物品可能变质或失去新鲜度。从商店获取此类物品可能值得额外的延迟。不过,对于厨师来说,提前计划可能会有所帮助,这样他们在开始烹饪之前便
拥有所有必需的食材。
[0052]
就像上面的食品储藏室类比一样,与对存储器层次结构中的各个级别的访问相关联的存储器访问延迟是不同的。例如,特定核心122以比l2高速缓存126中的数据更少的延迟来访问其l1高速缓存128中的数据。与访问l2高速缓存相比,访问图形存储器114或系统存储器108会显著产生更多的时钟周期。
[0053]
纹理处理单元120是专用处理单元,用于处理要渲染到要显示的图像中的场景上的纹理信息。例如,在执行与将图像渲染到显示器相关的图形处理(例如,图形处理管线)时,核心122可以依靠纹理处理单元120来执行该图像的纹理映射。每个gpu 102可以包括一个或更多个纹理处理单元120。纹理处理单元120可以不限于纹理映射,并且还可以执行除与纹理信息有关的那些以外的处理任务。
[0054]
纹理信息包括定义图像的纹理和图像中的各个对象的度量。纹理信息可以包括关于图像的各个区域中的颜色或强度的空间布置的信息。可以通过图像处理来计算纹理数据。通常,与要在显示屏幕上显示的图像相关的纹理信息太大而无法存储在gpu上的片上存储器中,因此通常存储在外部存储器(例如片外存储器)中,例如系统存储器108或图形存储器114(例如,系统存储器108中的纹理数据130或图形存储器114中的纹理数据132)。
[0055]
如上所述,从系统存储器中检索纹理信息通常会导致较长的延迟,从而导致系统效率低下。在某些情况下,此类延迟可能在数千个时钟周期中。在示例性实施例中,纹理单元120、处理核心122和/或高速缓存存储器层次结构124可以配置有附加电路,以执行纹理数据的预取,以便减少与纹理数据访问相关的延迟。下面关于图2a等提供关于gpu 102的配置的描述,以提供根据示例性实施例的预取。图3和相关的描述提供了关于可对应于gpu 102的示例性并行处理单元(ppu)的更详细的信息。
[0056]
图1b示出了将整个显示屏幕区域140逻辑划分为矩形图块的示例,以使得要在屏幕140上渲染的纹理信息可以分布在多个纹理单元120中。所示示例示出了占据屏幕140的区域的纹理信息144。在图1b中以三种不同的填充图案示出了纹理信息。当指示gpu 102将对象(诸如对象142)渲染到屏幕时,gpu 102的一个或更多个处理核心122可以以所示的方式分配对象142的纹理映射。也就是说,可以以所示方式将对象142的纹理映射分配给四个(t1-t4)纹理处理单元120中的每一个。例如,如图1b所示,每个纹理处理单元120将纹理144施加到对象142的一个或更多个表面的相应部分。
[0057]
纹理信息144在纹理处理单元t1-t4之间的分布可以由gpu中的核心处理单元(例如,核心处理单元120)控制。在某些示例性实施例中,从核心处理单元到纹理处理单元的指令可以包括描述纹理144、要被纹理映射的对象142以及要由该纹理处理单元纹理映射的对象142的一部分的信息。由核心处理单元提供给纹理处理单元的纹理信息144可以包括用于纹理信息144的标头,其描述纹理的大小和坐标、纹理信息存储在存储器中的块的大小等。基于纹理标头中的信息、对象信息以及与对象的分配部分有关的信息,每个纹理处理单元可以确定要检索的纹理信息,以对分配给它的对象部分执行纹理映射。
[0058]
如图1b中可看到的,在对特定场景的纹理映射期间,可以向每个纹理处理单元t1-t4分配同一对象的多个部分以及分别分配纹理的相应部分。可以通过屏幕区域上的纹理处理单元的图块划分(tiling)模式以及纹理的位置、大小和形状以及要进行纹理映射的对象或场景来确定分配。
[0059]
图1b中所示的纹理处理器的分配模式是一个示例,而不是限制性的。在示例性实施例中,可以根据任何分配模式在任意数量的两个或更多个纹理处理单元之间分配纹理信息。示例性实施例不限于屏幕区域上的纹理处理单元的任何图块划分模式或任何特定的纹理或场景/对象特性。
[0060]
图1c示出了根据间距线性格式在存储器中组织的示例性非限制性纹理154。例如,示出了一个16x16纹理像素区域,其中在纹理内部指示的数字表示存储纹理像素的相应虚拟存储器地址(或虚拟存储器地址的偏移)。纹理像素的大小(以字节为单位)可从纹理到纹理不同,取决于诸如纹理分辨率的细节水平。特定纹理中纹理像素的大小(以字节为单位)可以在该纹理的标头中指示。
[0061]
根据在存储器中存储纹理信息的间距线性格式,从纹理的顶部到底部的每行纹理像素以从存储器区域的左上角开始,然后从左到右水平延伸,然后再开始存储下一行纹理像素(例如,从左到右,从上到下)的方式布局。图1c示出了以间距线性方式布置在存储器中的纹理154的纹理像素0-255。即,纹理154的每行纹理像素(如其可被映射到显示屏幕上的渲染图像中)被存储在虚拟存储器中的行中。存储纹理154的存储器例如可以是外部存储器,诸如系统存储器108或图形存储器114。
[0062]
图1d示出了根据块线性格式在存储器中组织的纹理156。如在图1c中一样,图1d也示出了示例16
×
16像素区域屏幕布局,其中纹理156内部的数字表示纹理像素中指定的各个虚拟存储器地址(或相对于虚拟存储器地址的偏移)。块线性格式针对许多2d和3d访问模式进行了优化。如图1d所示,对应于存储器中纹理156布置的第一行和第二行的纹理像素0-15和16-31分别为屏幕上的4x4纹理像素矩形区域(“块”)。在示例块线性布局中,存储器中的每行纹理像素对应一个4x4块,存储器中每四个连续行的纹理像素对应一个8x8块。在图1c和图1d中,存储器布局中的每个16纹理像素行由可区分的填充图案表示。
[0063]
图1e示出了由全屏绘制产生的纹理请求。所示的示例模式示出了随时间推移保存纹理信息的存储器块的虚拟地址。x轴表示从左到右时间增加,y轴表示从下到上虚拟地址增加。每个阴影区域代表被访问的存储器的组块(chunk),图形中的阴影区域的位置表示其时间位置及其关于对全屏访问纹理数据开始的虚拟地址。每个组块由一个或更多个连续的块组成。整体上,图1e展示了为绘制全屏而访问的纹理数据。
[0064]
组块152表示处理屏幕的纹理的纹理单元当前正在使用的虚拟地址空间。如图所示,与每个组块152相关联的偏移是每个块的高度150(例如,以纹理像素为单位)。即,每个组块的高度(例如,以纹理像素为单位)可用于表示连续请求的组块之间的偏移。在一些示例性实施例中,组块可以具有一个块的高度。
[0065]
图1f提供了根据一些示例性实施例的在存储器中组织的纹理数据及其与在屏幕上渲染的纹理的关系的另一示例图示。该图示出了存储器中的每行纹理信息160如何根据块线性布局映射到组块158。
[0066]
图1g进一步图形化地示出了,在一些示例性实施例中,纹理表面160包括多个组块,例如组块158,并且每个组块包括多个块,例如,在图1d中所示的纹理的块线性布局中示出的块。在所示的示例中,每行纹理信息160对应于相应的组块。
[0067]
图2a是根据一些示例性实施例的可以在图1a的系统中使用的gpu的框图。例如,gpu 200可以对应于图1a所示的gpu 102。
[0068]
gpu 200包括处理核心201(处理核心201a和处理核心201b),纹理处理单元202(纹理单元a 202a和纹理单元b 202b),高速缓存层次结构204和到图形存储器(例如图形存储器114)和/或外部存储器(诸如系统存储器,例如系统存储器108)的接口210。
[0069]
在高速缓存层次结构204中,每个l1高速缓存206可以由处理核心和纹理单元访问。例如,处理核心201a和纹理单元a 202a可访问l1高速缓存206a,处理核心201b和纹理单元b 202b可访问l1高速缓存206b。处理器核心201或纹理单元202可以访问l2高速缓存208以获取在l1高速缓存206中找不到的数据。如果在l2高速缓存208中找不到该数据,则外部存储器(例如片外存储器,诸如系统存储器或图形存储器)可以通过接口210访问以获得数据。
[0070]
示例性实施例使每个纹理单元在处理第一纹理信息块时(或者在其获取第一纹理信息块之后并且在完成对该第一纹理信息块的处理之前),从第二纹理信息块预取数据的全部或部分。对纹理信息块的处理可以包括使用该纹理信息块来对对象和/或场景进行纹理映射。预取逻辑214(例如,预取逻辑214a和214b)块包括用于计算要预取的纹理信息块的地址的硬件电路。基于当前正在处理的块的地址和偏移来计算要预取的块的地址。纹理预取逻辑214还可以实现请求去重,以减少传输到l2高速缓存的重复的预取请求的数量。
[0071]
根据示例性实施例,从外部存储器预取的纹理信息215被存储在l2高速缓存208中,而不是被提供给请求纹理处理单元和/或处理核心。l2高速缓存中的预取的纹理信息215可用于连接到该l2高速缓存的多个纹理处理单元和/或多个处理器核心。配置为存储预取信息的纹理预取逻辑216硬件电路可以位于与l2高速缓存208相关联的控制电路中。
[0072]
待处理(pending)预取请求计数器218也与纹理预取逻辑216电路相关联。待处理预取计数器218保持对未完成的纹理预取请求212的数量的计数。也就是说,根据一个实施例,在l2高速缓存中,当从l2高速缓存电路向外部存储器发送纹理预取请求时,计数器递增,并且当接收到与该请求相对应的纹理信息并将其存储在l2高速缓存中时,计数器递减。结合待处理预取请求计数器218,纹理预取逻辑可以实现节流机制,以在待处理预取请求的计数超过预定义阈值时默默丢弃传入的预取请求。纹理预取逻辑216也可以实现请求去重,以减少被发送到外部存储器的重复的预取请求的数量。至少在一些实施例中,去重和/或节流可以是必需的,以便有效地执行纹理的预取,同时不会压倒存储器系统和与多余的预取请求互连的系统。
[0073]
根据一些实施例,gpu 200可以对应于例如在图3中示出并且关于图3至图6描述的ppu 300。核心处理器201可以对应于流式多处理器(sm)440,并且纹理处理单元202可以对应于特殊功能单元(sfu)552。在这样的实施例中,关于过程220和240所描述的纹理预取可以在例如关于图6描述的图形管线的处理期间执行。
[0074]
示例性纹理预取方法
[0075]
图2b示出了根据某些示例性实施例的过程220的流程图,处理器通过该过程请求纹理信息以进行处理。过程220可以由核心处理单元和/或纹理处理单元执行。在一些示例性实施例中,过程220由图2a所示的预取逻辑214执行(例如,在预取逻辑电路214a和/或214b中)。为了清楚起见,以下关于纹理处理单元202a和核心处理单元201a描述过程220,但是过程220不限于这些处理单元。
[0076]
在进入过程220之后,在处理纹理信息块n的同时,在操作222处,纹理处理单元
202a确定纹理信息块n+k以从中预取数据。k是表示为块大小的倍数的偏移大小(也称为预取偏移)。每个块n和n+k可以是较大纹理信息a的一个块(例如,块由图1d所示的纹理156中的像素/纹理像素0-15组成)。根据示例性实施例,纹理处理单元202a响应于由核心处理单元(例如,核心处理单元201a或另一核心处理单元201b)将块n的处理分配给它,开始块n的处理。例如,核心处理单元201a可以将指令分配给纹理处理单元202a以处理块n。纹理处理单元202a可以响应于其自身的请求或者由核心处理单元做出的请求,从存储器层次结构中接收针对块n的纹理信息。
[0077]
在块n的处理期间,纹理处理单元确定块n+k以从中预取数据。在一些实施例中,每个纹理处理单元被配置为从紧接的下一个块预取数据到该纹理处理单元当前正对其进行处理的块。然而,在一些实施例中,可以使用除了紧接的下一个块之外的其他块来从中预取。
[0078]
根据示例性实施例,确定要预取的数据可能需要确定该块的地址的偏移(以字节为单位)。在采用块线性地址映射布局的示例性实施例中,偏移是组块的大小(以字节为单位)。组块的大小是块的大小的倍数。在这样的实施例中,块和组块结构是块线性地址映射的直接结果,其用于存储现代游戏所使用的许多纹理。在这样的实施例中,可以基于当前块的地址和偏移来确定下一块的地址,并且类似地用于下一个组块。
[0079]
块和组块的大小对于所有纹理可能不是相同的,并且可以是纹理的固有属性。因此,可能需要基于每纹理动态地计算偏移。此外,如果同时使用多个纹理,则可以为每个活动纹理保持单独的偏移。
[0080]
每个纹理可以包括标头(“纹理标头”),其存储关于该纹理的某些种类的信息,诸如,例如其高度、宽度、细节水平、数据类型等。在一些示例性实施例中,纹理标头(和/或来自标头的参数值)已在纹理单元中可用,用于在任何给定时间点处于活动状态的所有纹理。通过访问相应标头中描述特定纹理的参数,一些示例性实施例将针对特定块线性纹理的组块的大小计算为:
[0081]
size
chunk
=width
texture
*height
chunk
*bytes_per_texel
[0082]
offset-size or prefetch-offset=scaling factor*size
chunk
[0083]
因此,在运行时可以使用纹理处理单元和/或处理核心中可用的信息经济地计算偏移大小。例如,可以将偏移计算为以字节为单位的偏移大小(offset-size)。可以使用缩放因子f,通过将其乘以组块的大小来得到预取偏移(prefetch-offset)的微调值。例如,较小的gpu可能会受益于小于1的f值。缩放因子的默认值可以为1。
[0084]
在计算出偏移之后,基于当前在纹理处理单元中正在处理的块和计算出的偏移,确定要预取的块或块的部分的地址。例如,可以通过将偏移添加到来自当前块的数据的地址中来确定要预取的块或下一个块的部分的地址。当正在当前块(属于当前组块)上工作的纹理单元已被表明可以提高许多工作负载/应用程序(例如游戏应用程序)的性能时,预取属于下一个组块的地址(即,属于下一个组块中的块或块的部分的地址)到l2高速缓存。
[0085]
在操作224处,可选地,可以执行检查以确定预期的预取请求是否是重复的。可以利用纹理处理单元中可用的信息来经济地执行该可选检查。例如,针对所计算出的要预取的下一个块或块的部分的地址来测试跟踪由纹理处理单元请求的预定数量的紧接在前的预取的身份的寄存器。如果确定下一个块或块的部分与任何最近预取的请求匹配(例如,确
定预期的预取请求是重复的),则将当前确定的用于预取的下一个块或块的部分丢弃226,并且重复操作222以确定要预取的另一个块或块的部分(即,确定另一个请求),其不是已经被预取的块或块的部分的重复。
[0086]
当在可选操作224处确定所确定的用于预取的下一个块或块的部分不是重复的时,过程220进行到操作228。例如,当对块n+k的全部或部分的预取请求被确定为不是重复的时,则在操作228处,针对来自块n+k的数据生成纹理预取请求。该预取请求可以包括将其与纹理获取请求区分开的预取指示。根据示例性实施例,预取请求(例如预取请求212)包括标头,该标头具有将其标识为预取请求的一个或更多个位,以及包括所请求的纹理信息块的地址或偏移。在一些实施例中,预取请求标头还可以包括该纹理的唯一标识符或地址(例如,该纹理中的第一块的地址)。
[0087]
所生成的预取请求被发送到存储器层次结构。可以以类似于将获取请求从纹理单元发送到存储器层次结构的方式来执行该发送。
[0088]
下面关于过程240描述所生成的对存储器层次结构中的块n+k的整个或部分的预取请求的处理。
[0089]
在使用块n完成纹理处理(例如,纹理映射)之后,过程220进行到操作230。在操作230处,纹理处理单元202a从纹理a接收要处理的下一个纹理块(例如,例如来自表面纹理156的另一个块)的全部或部分。该下一个纹理块可以通过响应于从核心处理单元接收到的一个或更多个指令而进行的一个或更多个存储器访问来获得。该下一个块可以不是紧随(根据存储器访问模式)由纹理处理单元202a刚刚完成处理的块中的块n之后的块,并且可以是相同纹理a中的任何其他块m。纹理处理单元202a可以已经从l2高速缓存208获得了块m,其中它可以在被另一个纹理处理单元预取之后被存储。
[0090]
在一些示例性实施例中,在操作222处,在生成预取请求之前,进行关于纹理映射是否是特定类型的渲染的一部分的确定。在这样的实施例中,可以响应于所述确定来生成预取请求。例如,如果确定纹理映射是全屏绘制操作的一部分,则生成预取请求,并完成预取过程220和240。如果确定是纹理映射不是全屏绘制的一部分,则不执行预取。该确定可以基于指令类型。该确定可以不限于上述全屏绘制的确定。
[0091]
图2c示出了根据一些示例性实施例的响应于由图2b所示的处理器发起的预取,由存储器层次结构执行的过程240的流程图。过程240可以全部或部分在与l2高速缓存208和/或高速缓存层次结构204相关联的纹理预取逻辑电路216中执行。
[0092]
在操作242处,针对从纹理处理单元接收的每个预取请求,过程240可以开始。来自纹理处理单元的预取请求的生成和发送在上面关于图2b进行了描述。
[0093]
在操作244,可选地,确定接收到的预取请求是否是已经接收和/或已经服务的预取请求的重复。为了避免将多个预取请求发送到相同的目标地址,一些实施例包括预取去重方案,其中如果由于早先对同一高速缓存行的读取而已经发送了一预取请求,则不发送第二预取请求(例如,对于到同一128b/256b对齐地址的多个读取请求,仅将一个预取请求发送到与128b/256b对齐读取地址相距字节偏移数的地址)。该去重可以节省带宽(例如,请求带宽和/或数据带宽)。
[0094]
如果确定预取请求为重复的,则在操作246处,丢弃接收到的预取请求。如果确定该请求不是重复的请求,则过程240进行到操作248。
[0095]
在操作248-250处,可选地,确定所接收到的预取请求是否将待处理的预取请求的数量增加到超过预定阈值。即,在接收到预取请求并且可选地确定它不是重复的之后,在操作248处,递增跟踪当前待处理的预取请求的数量的计数器。然后,在操作250处,确定递增的待处理的预取请求的计数是否超过预定阈值。如果待处理的请求超过阈值,则在操作246处,该请求被丢弃。
[0096]
操作248-250的节流技术提供了场景的解决方案,其中由于过多的访问请求,存储器系统可能已经是性能的限制因素。在这种情况下,最好不要让推测性预取请求进一步加重存储器系统的负担。因此,如果这样的未完成扇区的数量高于某阈值,上述节流方案利用关于具有未完成的填充请求的高速缓存扇区的可用信息来动态地丢弃预取请求。
[0097]
如果待处理的请求未超过阈值,则过程240进行到操作252。
[0098]
在操作252处,预取请求被发送到外部(例如,片外)存储器。在一些实施例中,从l2高速缓存发送到外部存储器的对获取请求和预取请求的访问请求可能彼此不可区分。在这样的实施例中,l2高速缓存电路可以跟踪所请求和接收到的纹理块,使得可以根据每个块是针对获取请求还是预取请求被接收,而在l2高速缓存处适当地处理接收到的块。在一些其他实施例中,从l2高速缓存发送的对预取请求的访问请求可以与所发送的对获取请求的访问请求区分开。在一些实施例中,在l2高速缓存处从外部存储器接收的存储器块可以伴随有指示其是否与预取请求有关的标头信息。
[0099]
在操作254处,在l2高速缓存处从预取块接收所请求的数据。l2高速缓存控制电路可以以任何方式区分对与预取相关联的纹理块的请求和与获取请求相关联的那些。关于操作252描述了可以执行这种区分的一些示例性技术。
[0100]
在操作256处,鉴于接收到所请求的预取块(或其部分)的数据,待处理请求计数器递减。
[0101]
在操作258处,部分或完全预取的块存储在l2高速缓存中。根据一些实施例,与采用获取请求的情况不同,预取的块-数据不被提供给l1高速缓存或请求纹理处理单元。预取的块-数据仅存储在l2高速缓存中。请求预取的块数据的处理器或其他处理器随后可以通过获取请求来检索存储在l2高速缓存中的预取的块数据并将其存储在l1高速缓存中。尽管在一些实施例中,在完成预取时,除了l2高速缓存之外,预取的数据还可以存储在l1高速缓存和/或发布了预取请求的纹理处理单元中,但是这样的实施例可能比不将预取的数据存储在l1高速缓存或纹理处理单元中的实施例的效率低。
[0102]
在操作258之后,预取操作完成。
[0103]
用于视频降噪的并行处理架构
[0104]
现在将根据用户的需求,阐述关于可用于实现前述框架的各种可选架构和特征的更多说明性信息。应该特别注意的是,以下信息是出于说明目的而阐述的,不应以任何方式解释为限制。下面的任何特征可以可选地合并或不排他地合并所描述的其他特征。
[0105]
图3示出了根据一个实施例的并行处理单元(ppu)300。在一个实施例中,ppu 300是在一个或更多个集成电路器件上实现的多线程处理器。ppu 300是设计用于并行处理许多线程的延迟隐藏体系架构。线程(即,执行线程)是被配置为由ppu 300执行的指令集的实例。在一个实施例中,ppu 300是图形处理单元(gpu),其被配置为实现用于处理三维(3d)图形数据的图形渲染管线,以便生成用于在显示装置(诸如液晶显示(lcd)设备)上显示的二
维(2d)图像数据。在其他实施例中,ppu 300可以用于执行通用计算。尽管为了说明的目的本文提供了一个示例性并行处理器,但应特别指出的是,该处理器仅出于说明目的进行阐述,并且可使用任何处理器来补充和/或替代该处理器。
[0106]
一个或更多个ppu 300可以被配置为加速数千个高性能计算(hpc)、数据中心和机器学习应用。ppu 300可被配置为加速众多深度学习系统和应用,包括自动驾驶汽车平台、深度学习、高精度语音、图像和文本识别系统、智能视频分析、分子模拟、药物研发、疾病诊断、天气预报、大数据分析、天文学、分子动力学模拟、金融建模、机器人技术、工厂自动化、实时语言翻译、在线搜索优化和个性化用户推荐,等等。
[0107]
如图3所示,ppu 300包括输入/输出(i/o)单元305、前端单元315、调度器单元320、工作分配单元325、集线器330、交叉开关(xbar)370、一个或更多个通用处理集群(gpc)350以及一个或更多个分区单元380。ppu 300可以经由一个或更多个高速nvlink 310互连连接到主机处理器或其他ppu 300。ppu 300可以经由互连302连接到主机处理器或其他外围设备。ppu 300还可以连接到包括多个存储器设备304的本地存储器。在一个实施例中,本地存储器可以包括多个动态随机存取存储器(dram)设备。dram设备可以被配置为高带宽存储器(hbm)子系统,其中多个dram裸晶(die)堆叠在每个设备内。
[0108]
nvlink 310互连使得系统能够扩展并且包括与一个或更多个cpu结合的一个或更多个ppu 300,支持ppu 300和cpu之间的高速缓存一致性,以及cpu主控。数据和/或命令可以由nvlink 310通过集线器330传输到ppu 300的其他单元或从其传输,例如一个或更多个复制引擎、视频编码器、视频解码器、电源管理单元等(未明确示出)。结合图5b更详细地描述nvlink 310。
[0109]
i/o单元305被配置为通过互连302从主机处理器(未示出)传输和接收通信(例如,命令、数据等)。i/o单元305可以经由互连302直接与主机处理器通信,或通过一个或更多个中间设备(诸如存储器桥)与主机处理器通信。在一个实施例中,i/o单元305可以经由互连302与一个或更多个其他处理器(例如,一个或更多个ppu 300)通信。在一个实施例中,i/o单元305实现外围组件互连高速(pcie)接口,用于通过pcie总线进行通信,并且互连302是pcie总线。在替代的实施例中,i/o单元305可以实现其他类型的已知接口,用于与外部设备进行通信。
[0110]
i/o单元305对经由互连302接收的数据包进行解码。在一个实施例中,数据包表示被配置为使ppu 300执行各种操作的命令。i/o单元305按照命令指定将解码的命令传输到ppu 300的各种其他单元。例如,一些命令可以被传输到前端单元315。其他命令可以被传输到集线器330或ppu 300的其他单元,诸如一个或更多个复制引擎、视频编码器、视频解码器、电源管理单元等(未明确示出)。换句话说,i/o单元305被配置为在ppu 300的各种逻辑单元之间和之中路由通信。
[0111]
在一个实施例中,由主机处理器执行的程序在缓冲区中对命令流进行编码,该缓冲区向ppu 300提供工作量用于处理。工作量可以包括要由那些指令处理的许多指令和数据。缓冲区是存储器中可由主机处理器和ppu 300两者访问(例如,读/写)的区域。例如,i/o单元305可以被配置为经由通过互连302传输的存储器请求访问连接到互连302的系统存储器中的缓冲区。在一个实施例中,主机处理器将命令流写入缓冲区,然后向ppu 300传输指向命令流开始的指针。前端单元315接收指向一个或更多个命令流的指针。前端单元315管
理一个或更多个流,从流读取命令并将命令转发到ppu 300的各个单元。
[0112]
前端单元315耦合到调度器单元320,其配置各种gpc 350以处理由一个或更多个流定义的任务。调度器单元320被配置为跟踪与由调度器单元320管理的各种任务相关的状态信息。状态可以指示任务被指派给哪个gpc 350,该任务是活动的还是不活动的,与该任务相关联的优先级等等。调度器单元320管理一个或更多个gpc 350上的多个任务的执行。
[0113]
调度器单元320耦合到工作分配单元325,其被配置为分派任务以在gpc 350上执行。工作分配单元325可以跟踪从调度器单元320接收到的若干调度的任务。在一个实施例中,工作分配单元325为每个gpc 350管理待处理(pending)任务池和活动任务池。待处理任务池可以包括若干时隙(例如,32个时隙),其包含被指派为由特定gpc 350处理的任务。活动任务池可以包括若干时隙(例如,4个时隙),用于正在由gpc 350主动处理的任务。当gpc 350完成任务的执行时,该任务从gpc 350的活动任务池中逐出,并且来自待处理任务池的其他任务之一被选择和调度以在gpc 350上执行。如果gpc 350上的活动任务已经空闲,例如在等待数据依赖性被解决时,那么活动任务可以从gpc 350中逐出并返回到待处理任务池,而待处理任务池中的另一任务被选择并调度以在gpc 350上执行。
[0114]
工作分配单元325经由xbar(交叉开关)370与一个或更多个gpc 350通信。xbar370是将ppu 300的许多单元耦合到ppu 300的其他单元的互连网络。例如,xbar 370可以被配置为将工作分配单元325耦合到特定的gpc 350。虽然没有明确示出,但ppu 300的一个或更多个其他单元也可以经由集线器330连接到xbar 370。
[0115]
任务由调度器单元320管理并由工作分配单元325分派给gpc 350。gpc 350被配置为处理任务并生成结果。结果可以由gpc 350内的其他任务消耗,经由xbar 370路由到不同的gpc 350,或者存储在存储器304中。结果可以经由分区单元380写入存储器304,分区单元380实现用于从存储器304读取数据和向存储器304写入数据的存储器接口。结果可以通过nvlink310传输到另一ppu 304或cpu。在一个实施例中,ppu 300包括数目为u的分区单元380,其等于耦合到ppu 300的独立且不同的存储器设备304的数目。下面将结合图4b更详细地描述分区单元380。
[0116]
在一个实施例中,主机处理器执行实现应用程序编程接口(api)的驱动程序内核,其使得能够在主机处理器上执行一个或更多个应用程序以调度操作用于在ppu 300上执行。在一个实施例中,多个计算应用由ppu 300同时执行,并且ppu 300为多个计算应用程序提供隔离、服务质量(qos)和独立地址空间。应用程序可以生成指令(例如,api调用),其使得驱动程序内核生成一个或更多个任务以由ppu 300执行。驱动程序内核将任务输出到正在由ppu 300处理的一个或更多个流。每个任务可以包括一个或更多个相关线程组,本文称为线程束(warp)。在一个实施例中,线程束包括可以并行执行的32个相关线程。协作线程可以指代包括执行任务的指令并且可以通过共享存储器交换数据的多个线程。结合图5a更详细地描述线程和协作线程。
[0117]
图4a示出了根据一个实施例的图3的ppu 300的gpc 350。如图4a所示,每个gpc 350包括用于处理任务的多个硬件单元。在一个实施例中,每个gpc 350包括管线管理器410、预光栅操作单元(prop)415、光栅引擎425、工作分配交叉开关(wdx)480、存储器管理单元(mmu)490以及一个或更多个数据处理集群(dpc)420。应当理解,图4a的gpc 350可以包括代替图4a中所示单元的其他硬件单元或除图4a中所示单元之外的其他硬件单元。
[0118]
在一个实施例中,gpc 350的操作由管线管理器410控制。管线管理器410管理用于处理分配给gpc 350的任务的一个或更多个dpc 420的配置。在一个实施例中,管线管理器410可以配置一个或更多个dpc 420中的至少一个来实现图形渲染管线的至少部分。例如,dpc 420可以被配置为在可编程流式多处理器(sm)440上执行顶点着色程序。管线管理器410还可以被配置为将从工作分配单元325接收的数据包路由到gpc 350中适当的逻辑单元。例如,一些数据包可以被路由到prop 415和/或光栅引擎425中的固定功能硬件单元,而其他数据包可以被路由到dpc 420以供图元引擎435或sm 440处理。在一个实施例中,管线管理器410可以配置一个或更多个dpc 420中的至少一个以实现神经网络模型和/或计算管线。
[0119]
prop单元415被配置为将由光栅引擎425和dpc 420生成的数据路由到光栅操作(rop)单元,结合图4b更详细地描述。prop单元415还可以被配置为执行颜色混合的优化,组织像素数据,执行地址转换等。
[0120]
光栅引擎425包括被配置为执行各种光栅操作的若干固定功能硬件单元。在一个实施例中,光栅引擎425包括设置引擎、粗光栅引擎、剔除引擎、裁剪引擎、精细光栅引擎和图块聚合引擎。设置引擎接收变换后的顶点并生成与由顶点定义的几何图元关联的平面方程。平面方程被传输到粗光栅引擎以生成图元的覆盖信息(例如,图块的x、y覆盖掩码)。粗光栅引擎的输出被传输到剔除引擎,其中与未通过z-测试的图元相关联的片段被剔除,并且未剔除的片段被传输到裁剪引擎,其中位于视锥体之外的片段被裁剪掉。那些经过裁剪和剔除后留下来的片段可以被传递到精细光栅引擎,以基于由设置引擎生成的平面方程生成像素片段的属性。光栅引擎425的输出包括例如要由在dpc 420内实现的片段着色器处理的片段。
[0121]
包括在gpc 350中的每个dpc 420包括m管线控制器(mpc)430、图元引擎435和一个或更多个sm 440。mpc 430控制dpc 420的操作,将从管线管理器410接收到的数据包路由到dpc 420中的适当单元。例如,与顶点相关联的数据包可以被路由到图元引擎435,图元引擎435被配置为从存储器304提取与顶点相关联的顶点属性。相反,与着色程序相关联的数据包可以被传输到sm 440。
[0122]
sm 440包括被配置为处理由多个线程表示的任务的可编程流式处理器。每个sm 440是多线程的并且被配置为同时执行来自特定线程组的多个线程(例如,32个线程)。在一个实施例中,sm 440实现simd(单指令、多数据)体系架构,其中线程组(例如,warp)中的每个线程被配置为基于相同的指令集来处理不同的数据集。线程组中的所有线程都执行相同的指令。在另一实施例中,sm 440实现simt(单指令、多线程)体系架构,其中线程组中的每个线程被配置为基于相同的指令集处理不同的数据集,但是其中线程组中的各个线程在执行期间被允许发散。在一个实施例中,为每个线程束维护程序计数器、调用栈和执行状态,当线程束内的线程发散时,使线程束和线程束中的串行执行之间的并发成为可能。在另一实施例中,为每个单独的线程维护程序计数器、调用栈和执行状态,从而在线程束内和线程束之间的所有线程之间实现相等的并发。当为每个单独的线程维护执行状态时,执行相同指令的线程可以被收敛并且并行执行以获得最大效率。下面结合图5a更详细地描述sm 440。
[0123]
mmu 490提供gpc 350和分区单元380之间的接口。mmu 490可以提供虚拟地址到物
理地址的转换、存储器保护以及存储器请求的仲裁。在一个实施例中,mmu 490提供用于执行从虚拟地址到存储器304中的物理地址的转换的一个或更多个转换后备缓冲器(tlb)。
[0124]
图4b示出了根据一个实施例的图3的ppu 300的存储器分区单元380。如图4b所示,存储器分区单元380包括光栅操作(rop)单元450、二级(l2)高速缓存460和存储器接口470。存储器接口470耦合到存储器304。存储器接口470可以实现用于高速数据传输的32、64、128、1024位数据总线等。在一个实施例中,ppu 300合并了u个存储器接口470,每对分区单元380有一个存储器接口470,其中每对分区单元380连接到对应的存储器设备304。例如,ppu 300可以连接到多达y个存储器设备304,诸如高带宽存储器堆叠或图形双数据速率版本5的同步动态随机存取存储器或其他类型的持久存储器。
[0125]
在一个实施例中,存储器接口470实现hbm2存储器接口,并且y等于u的一半。在一个实施例中,hbm2存储器堆叠位于与ppu 300相同的物理封装上,提供与常规gddr5 sdram系统相比显著的功率高和面积节约。在一个实施例中,每个hbm2堆叠包括四个存储器裸晶并且y等于4,其中hbm2堆叠包括每个裸晶两个128位通道,总共8个通道和1024位的数据总线宽度。
[0126]
在一个实施例中,存储器304支持单错校正双错检测(secded)纠错码(ecc)以保护数据。对于对数据损毁敏感的计算应用程序,ecc提供了更高的可靠性。在大型集群计算环境中,ppu 300处理非常大的数据集和/或长时间运行应用程序,可靠性尤其重要。
[0127]
在一个实施例中,ppu 300实现多级存储器层次。在一个实施例中,存储器分区单元380支持统一存储器以为cpu和ppu 300存储器提供单个统一的虚拟地址空间,使得虚拟存储器系统之间的数据能够共享。在一个实施例中,跟踪ppu 300对位于其他处理器上的存储器的访问频率,以确保存储器页面被移动到更频繁地访问该页面的ppu 300的物理存储器。在一个实施例中,nvlink 310支持地址转换服务,其允许ppu 300直接访问cpu的页表并且提供由ppu 300对cpu存储器的完全访问。
[0128]
在一个实施例中,复制引擎在多个ppu 300之间或在ppu 300与cpu之间传输数据。复制引擎可以为未映射到页表的地址生成页面错误。然后,存储器分区单元380可以服务页面错误,将地址映射到页表中,之后复制引擎可以执行传输。在常规系统中,针对多个处理器之间的多个复制引擎操作固定存储器(例如,不可分页),其显著减少了可用存储器。由于硬件分页错误,地址可以传递到复制引擎而不用担心存储器页面是否驻留,并且复制过程是否透明。
[0129]
来自存储器304或其他系统存储器的数据可以由存储器分区单元380获取并存储在l2高速缓存460中,l2高速缓存460位于芯片上并且在各个gpc 350之间共享。如图所示,每个存储器分区单元380包括与对应的存储器设备304相关联的l2高速缓存460的部分。然后可以在gpc 350内的多个单元中实现较低级高速缓存。例如,每个sm 440可以实现一级(l1)高速缓存。l1高速缓存是专用于特定sm 440的专用存储器。来自l2高速缓存460的数据可以被获取并存储在每个l1高速缓存中,以在sm 440的功能单元中进行处理。l2高速缓存460被耦合到存储器接口470和xbar 370。
[0130]
rop单元450执行与诸如颜色压缩、像素混合等像素颜色相关的图形光栅操作。rop单元450还与光栅引擎425一起实现深度测试,从光栅引擎425的剔除引擎接收与像素片段相关联的样本位置的深度。测试与片段关联的样本位置相对于深度缓冲区中的对应深度的
深度。如果片段通过样本位置的深度测试,则rop单元450更新深度缓冲区并将深度测试的结果传输给光栅引擎425。将理解的是,分区单元380的数量可以不同于gpc 350的数量,并且因此每个rop单元450可以耦合到每个gpc 350。rop单元450跟踪从不同gpc 350接收到的数据包并且确定由rop单元450生成的结果通过xbar 370被路由到哪个gpc 350。尽管在图4b中rop单元450被包括在存储器分区单元380内,但是在其他实施例中,rop单元450可以在存储器分区单元380之外。例如,rop单元450可以驻留在gpc 350或另一单元中。
[0131]
图5a示出了根据一个实施例的图4a的流式多处理器440。如图5a所示,sm 440包括指令高速缓存505、一个或更多个调度器单元510、寄存器文件520、一个或更多个处理核心550、一个或更多个特殊功能单元(sfu)552、一个或更多个加载/存储单元(lsu)554、互连网络580、共享存储器/l1高速缓存570。
[0132]
如上所述,工作分配单元325调度任务以在ppu 300的gpc 350上执行。任务被分配给gpc 350内的特定dpc 420,并且如果该任务与着色器程序相关联,则该任务可以被分配给sm 440。调度器单元510接收来自工作分配单元325的任务并且管理指派给sm 440的一个或更多个线程块的指令调度。调度器单元510调度线程块以作为并行线程的线程束执行,其中每个线程块被分配至少一个线程束。在一个实施例中,每个线程束执行32个线程。调度器单元510可以管理多个不同的线程块,将线程束分配给不同的线程块,然后在每个时钟周期期间将来自多个不同的协作组的指令分派到各个功能单元(即,核心550、sfu 552和lsu 554)。
[0133]
协作组是用于组织通信线程组的编程模型,其允许开发者表达线程正在进行通信所采用的粒度,使得能够表达更丰富、更高效的并行分解。协作启动api支持线程块之间的同步性,以执行并行算法。常规的编程模型为同步协作线程提供了单一的简单结构:跨线程块的所有线程的栅栏(barrier)(例如,syncthreads()函数)。然而,程序员通常希望以小于线程块粒度的粒度定义线程组,并在所定义的组内同步,以集体的全组功能接口(collective group-wide function interface)的形式使能更高的性能、设计灵活性和软件重用。
[0134]
协作组使得程序员能够在子块(例如,像单个线程一样小)和多块粒度处明确定义线程组并且执行集体操作,诸如协作组中的线程上的同步性。编程模型支持跨软件边界的干净组合,以便库和效用函数可以在他们本地环境中安全地同步,而无需对收敛进行假设。协作组图元启用合作并行的新模式,包括生产者-消费者并行、机会主义并行以及跨整个线程块网格的全局同步。
[0135]
分派单元515被配置为向一个或更多个功能单元传送指令。在该实施例中,调度器单元510包括两个分派单元515,其使得能够在每个时钟周期期间调度来自相同线程束的两个不同指令。在替代实施例中,每个调度器单元510可以包括单个分派单元515或附加分派单元515。
[0136]
每个sm 440包括寄存器文件520,其提供用于sm 440的功能单元的一组寄存器。在一个实施例中,寄存器文件520在每个功能单元之间被划分,使得每个功能单元被分配寄存器文件520的专用部分。在另一实施例中,寄存器文件520在由sm 440执行的不同线程束之间被划分。寄存器文件520为连接到功能单元的数据路径的操作数提供临时存储器。
[0137]
每个sm 440包括l个处理核心550。在一个实施例中,sm 440包括大量(例如128个
等)不同的处理核心550。每个核心550可以包括完全管线化的、单精度、双精度和/或混合精度处理单元,其包括浮点运算逻辑单元和整数运算逻辑单元。在一个实施例中,浮点运算逻辑单元实现用于浮点运算的ieee 754-2008标准。在一个实施例中,核心550包括64个单精度(32位)浮点核心、64个整数核心、32个双精度(64位)浮点核心和8个张量核心(tensor core)。
[0138]
张量核心被配置为执行矩阵运算,并且在一个实施例中,一个或更多个张量核心被包括在核心550中。具体地,张量核心被配置为执行深度学习矩阵运算,诸如用于神经网络训练和推理的卷积运算。在一个实施例中,每个张量核心在4
×
4矩阵上运算并且执行矩阵乘法和累加运算d=a
×
b+c,其中a、b、c和d是4
×
4矩阵。
[0139]
在一个实施例中,矩阵乘法输入a和b是16位浮点矩阵,而累加矩阵c和d可以是16位浮点或32位浮点矩阵。张量核心在16位浮点输入数据以及32位浮点累加上运算。16位浮点乘法需要64次运算,产生全精度的积,然后使用32位浮点与4
×4×
4矩阵乘法的其他中间积相加来累加。在实践中,张量核心用于执行由这些较小的元素建立的更大的二维或更高维的矩阵运算。api(诸如cuda9c++api)公开了专门的矩阵加载、矩阵乘法和累加以及矩阵存储运算,以便有效地使用来自cuda-c++程序的张量核心。在cuda层面,线程束级接口假定16
×
16尺寸矩阵跨越线程束的全部32个线程。
[0140]
每个sm 440还包括执行特殊函数(例如,属性评估、倒数平方根等)的m个sfu 552。在一个实施例中,sfu 552可以包括树遍历单元,其被配置为遍历分层树数据结构。在一个实施例中,sfu 552可以包括被配置为执行纹理映射过滤操作的纹理单元。在一个实施例中,纹理单元被配置为从存储器304加载纹理映射(例如,纹理像素的2d阵列)并且对纹理映射进行采样以产生经采样的纹理值,用于在由sm 440执行的着色器程序中使用。在一个实施例中,纹理映射被存储在共享存储器/l1高速缓存470中。纹理单元实现纹理操作,诸如使用mip图(即,不同细节层次的纹理映射)的过滤操作。在一个实施例中,每个sm 440包括两个纹理单元。
[0141]
每个sm 440还包括n个lsu 554,其实现共享存储器/l1高速缓存570和寄存器文件520之间的加载和存储操作。每个sm 440包括将每个功能单元连接到寄存器文件520以及将lsu 554连接到寄存器文件520、共享存储器/l1高速缓存570的互连网络580。在一个实施例中,互连网络580是交叉开关,其可以被配置为将任何功能单元连接到寄存器文件520中的任何寄存器,以及将lsu 554连接到寄存器文件和共享存储器/l1高速缓存570中的存储器位置。
[0142]
共享存储器/l1高速缓存570是片上存储器阵列,其允许数据存储和sm 440与图元引擎435之间以及sm 440中的线程之间的通信。在一个实施例中,共享存储器/l1高速缓存570包括128kb的存储容量并且在从sm 440到分区单元380的路径中。共享存储器/l1高速缓存570可以用于高速缓存读取和写入。共享存储器/l1高速缓存570、l2高速缓存460和存储器304中的一个或更多个是后备存储。
[0143]
将数据高速缓存和共享存储器功能组合成单个存储器块为两种类型的存储器访问提供最佳的总体性能。该容量可由程序用作不使用共享存储器的高速缓存。例如,如果将共享存储器配置为使用一半容量,则纹理和加载/存储操作可以使用剩余容量。在共享存储器/l1高速缓存570内的集成使共享存储器/l1高速缓存570起到用于流式传输数据的高吞
吐量管线的作用,并且同时提供对频繁重用数据的高带宽和低延迟的访问。
[0144]
当被配置用于通用并行计算时,与图形处理相比,可以使用更简单的配置。具体地,图3所示的固定功能图形处理单元被绕过,创建了更简单的编程模型。在通用并行计算配置中,工作分配单元325将线程块直接指派并分配给dpc 420。块中的线程执行相同的程序,使用计算中的唯一线程id来确保每个线程生成唯一结果,使用sm 440执行程序并执行计算,使用共享存储器/l1高速缓存570以在线程之间通信,以及使用lsu 554通过共享存储器/l1高速缓存570和存储器分区单元380读取和写入全局存储器。当被配置用于通用并行计算时,sm 440还可以写入调度器单元320可用来在dpc 420上启动新工作的命令。
[0145]
ppu 300可以被包括在台式计算机、膝上型计算机、平板电脑、服务器、超级计算机、智能电话(例如,无线、手持设备)、个人数字助理(pda)、数码相机、运载工具、头戴式显示器、手持式电子设备等中。在一个实施例中,ppu 300包含在单个半导体衬底上。在另一实施例中,ppu 300与一个或更多个其他器件(诸如附加ppu 300、存储器304、精简指令集计算机(risc)cpu、存储器管理单元(mmu)、数字-模拟转换器(dac)等)一起被包括在片上系统(soc)上。
[0146]
在一个实施例中,ppu 300可以被包括在图形卡上,图形卡包括一个或更多个存储器设备304。图形卡可以被配置为与台式计算机的主板上的pcie插槽接口。在又一个实施例中,ppu 300可以是包含在主板的芯片集中的集成图形处理单元(igpu)或并行处理器。
[0147]
示例性计算系统
[0148]
具有多个gpu和cpu的系统被用于各种行业,因为开发者在应用(诸如人工智能计算)中暴露和利用更多的并行性。在数据中心、研究机构和超级计算机中部署具有数十至数千个计算节点的高性能gpu加速系统,以解决更大的问题。随着高性能系统内处理设备数量的增加,通信和数据传输机制需要扩展以支持该增加带宽。
[0149]
图5b是根据一个实施例的使用图3的ppu 300实现的处理系统500的概念图。示例性系统500可以被配置为实现图2b-图2c中所示的方法220和240和/或图1a和图2a中任何一个所示的系统。处理系统500包括cpu 530、交换机555和多个ppu 300中的每一个以及相应的存储器304。nvlink 310提供每个ppu 300之间的高速通信链路。尽管图5b中示出了特定数量的nvlink 310和互连302连接,但是连接到每个ppu 300和cpu 530的连接的数量可以改变。交换机555在互连302和cpu 530之间接口。ppu 300、存储器304和nvlink 310可以位于单个半导体平台上以形成并行处理模块525。在一个实施例中,交换机555支持两个或更多个在各种不同连接和/或链路之间接口的协议。
[0150]
在另一实施例(未示出)中,nvlink 310在每个ppu 300和cpu 530之间提供一个或更多个高速通信链路,并且交换机555在互连302和每个ppu 300之间进行接口。ppu 300、存储器304和互连302可以位于单个半导体平台上以形成并行处理模块525。在又一个实施例(未示出)中,互连302在每个ppu 300和cpu 530之间提供一个或更多个通信链路,并且交换机555使用nvlink 310在每个ppu 300之间进行接口,以在ppu 300之间提供一个或更多个高速通信链路。在另一实施例(未示出)中,nvlink 310在ppu 300和cpu 530之间通过交换机555提供一个或更多个高速通信链路。在又一个实施例(未示出)中,互连302在每个ppu 300之间直接地提供一个或更多个通信链路。可以使用与nvlink 310相同的协议将一个或更多个nvlink 310高速通信链路实现为物理nvlink互连或者片上或裸晶上互连。
[0151]
在本说明书的环境中,单个半导体平台可以指在裸晶或芯片上制造的唯一的单一的基于半导体的集成电路。应该注意的是,术语单个半导体平台也可以指具有增加的连接的多芯片模块,其模拟片上操作并通过利用常规总线实现方式进行实质性改进。当然,根据用户的需要,各种电路或器件还可以分开放置或以半导体平台的各种组合来放置。可选地,并行处理模块525可以被实现为电路板衬底,并且ppu 300和/或存储器304中的每一个可以是封装器件。在一个实施例中,cpu 530、交换机555和并行处理模块525位于单个半导体平台上。
[0152]
在一个实施例中,每个nvlink 310的信令速率是20到25千兆位/秒,并且每个ppu 300包括六个nvlink 310接口(如图5b所示,每个ppu 300包括五个nvlink 310接口)。每个nvlink 310在每个方向上提供25千兆位/秒的数据传输速率,其中六条链路提供300千兆位/秒。当cpu 530还包括一个或更多个nvlink 310接口时,nvlink 310可专门用于如图5b所示的ppu到ppu通信,或者ppu到ppu以及ppu到cpu的某种组合。
[0153]
在一个实施例中,nvlink 310允许从cpu 530到每个ppu 300的存储器304的直接加载/存储/原子访问。在一个实施例中,nvlink 310支持一致性操作,允许从存储器304读取的数据被存储在cpu 530的高速缓存分层结构中,减少了cpu 530的高速缓存访问延迟。在一个实施例中,nvlink 310包括对地址转换服务(ats)的支持,允许ppu 300直接访问cpu 530内的页表。一个或更多个nvlink 310还可以被配置为以低功率模式操作。
[0154]
图5c示出了示例性系统565,其中可以实现各种先前实施例的各种体系架构和/或功能。
[0155]
如图所示,提供系统565,其包括连接到通信总线575的至少一个中央处理单元530。通信总线575可以使用任何合适的协议来实现,诸如pci(外围组件互连)、pci-express、agp(加速图形端口)、超传输或任何其他总线或一个或更多个点对点通信协议。系统565还包括主存储器540。控制逻辑(软件)和数据被存储在主存储器540中,主存储器540可以采取随机存取存储器(ram)的形式。
[0156]
系统565还包括输入设备560、并行处理系统525和显示设备545,例如常规crt(阴极射线管)、lcd(液晶显示器)、led(发光二极管)、等离子显示器等。可以从输入设备560(例如键盘、鼠标、触摸板、麦克风等)接收用户输入。前述模块和/或设备中的每一个甚至可以位于单个半导体平台上以形成系统565。可选地,根据用户的需要,各个模块还可以分开放置或以半导体平台的各种组合来放置。
[0157]
此外,系统565可以出于通信目的通过网络接口535耦合到网络(例如,电信网络、局域网(lan)、无线网络、广域网(wan)(诸如因特网)、对等网络、电缆网络等)。
[0158]
系统565还可以包括辅助存储(未示出)。辅助存储610包括例如硬盘驱动器和/或可移除存储驱动器、代表软盘驱动器、磁带驱动器、光盘驱动器、数字多功能盘(dvd)驱动器、记录设备、通用串行总线(usb)闪存。可移除存储驱动器以众所周知的方式从可移除存储单元读取和/或写入可移除存储单元。
[0159]
计算机程序或计算机控制逻辑算法可以存储在主存储器540和/或辅助存储中。这些计算机程序在被执行时使得系统565能够执行各种功能。存储器540、存储和/或任何其他存储是计算机可读介质的可能示例。
[0160]
各种在先附图的体系架构和/或功能可以在通用计算机系统、电路板系统、专用于
娱乐目的的游戏控制台系统、专用系统和/或任何其他所需的系统的环境中实现。例如,系统565可以采取台式计算机、膝上型计算机、平板电脑、服务器、超级计算机、智能电话(例如,无线、手持设备)、个人数字助理(pda)、数字相机、运载工具、头戴式显示器、手持式电子设备、移动电话设备、电视机、工作站、游戏控制台、嵌入式系统和/或任何其他类型的逻辑的形式。
[0161]
虽然上面已经描述了各种实施例,但是应该理解,它们仅以示例的方式呈现,而不是限制。因此,优选实施例的宽度和范围不应受任何上述示例性实施例的限制,而应仅根据所附权利要求及其等同物来限定。
[0162]
图形处理管线
[0163]
在一个实施例中,ppu 300包括图形处理单元(gpu)。ppu 300被配置为接收指定用于处理图形数据的着色程序的命令。图形数据可以被定义为一组图元,例如点、线、三角形、四边形、三角形带等。典型地,图元包括指定图元的多个顶点(例如,在模型空间坐标系中)的数据以及与图元的每个顶点相关联的属性。ppu 300可以被配置为处理图元以生成帧缓冲区(例如,用于显示器的像素中的每一个的像素数据)。
[0164]
应用程序将场景的模型数据(例如,顶点和属性的集合)写入存储器(诸如系统存储器或存储器304)。模型数据定义可能在显示器上可见的对象中的每一个。然后应用程序对驱动程序内核进行api调用,其请求要被渲染和显示的模型数据。驱动程序内核读取模型数据并将命令写入一个或更多个流以执行操作来处理模型数据。这些命令可以参考要在ppu 300的sm 440上实现的不同着色程序,包括顶点着色、外壳着色、域着色、几何着色和像素着色中的一个或更多个。例如,sm 440中的一个或更多个可以被配置为执行顶点着色程序,其处理由模型数据定义的多个顶点。在一个实施例中,不同的sm 440可以被配置为同时执行不同的着色程序。例如,sm 440的第一子集可以被配置为执行顶点着色程序,而sm 440的第二子集可以被配置为执行像素着色程序。sm 440的第一子集处理顶点数据以产生经处理的顶点数据,并将经处理的顶点数据写入l2高速缓存460和/或存储器304。在经处理的顶点数据被光栅化(例如,从三维数据转换成屏幕空间中的二维数据)以产生片段数据之后,sm 440的第二子集执行像素着色以产生经处理的片段数据,然后将其与其他经处理的片段数据混合并被写入存储器304中的帧缓冲区。顶点着色程序和像素着色程序可以同时执行,以管线方式处理来自同一场景的不同数据,直到该场景的所有模型数据已经被渲染到帧缓冲区。然后,帧缓冲区的内容被传送到显示控制器以在显示设备上显示。
[0165]
图6是根据一个实施例的由图3的ppu 300实现的图形处理管线600的概念图。图形处理管线600是被实现以从3d几何数据生成2d计算机生成图像的处理步骤的抽象流程图。众所周知,管线架构可以通过将操作分成多个阶段来更高效地执行长延迟操作,其中每个阶段的输出耦合到下一个连续阶段的输入。因此,图形处理管线600接收从图形处理管线600的一个阶段传送到下一阶段的输入数据601,以生成输出数据602。在一个实施例中,图形处理管线600可表示由api定义的图形处理管线。作为选择,图形处理管线600可以在先前附图和/或一个或更多个任何后续附图的功能和架构的环境中实现。
[0166]
如图6所示,图形处理管线600包括包含多个阶段的管线架构。这些阶段包括但不限于数据组装阶段610、顶点着色阶段620、图元组装阶段630、几何着色阶段640、视口缩放、剔除和裁剪(viewport scale,cull,and clip,vscc)阶段650、光栅化阶段660、片段着色阶
段670和光栅操作阶段680。在一个实施例中,输入数据601包括命令,其配置处理单元以实现图形处理管线600的阶段,并配置几何图元(例如,点、线、三角形、四边形、三角形带或扇形等)以由这些阶段处理。输出数据602可以包括像素数据(即,颜色数据),其被复制到存储器中的帧缓冲区或其他类型的表面数据结构中。
[0167]
数据组装阶段610接收输入数据601,其指定用于高阶表面、图元等的顶点数据。数据组装阶段610收集临时存储或队列中的顶点数据,诸如通过从主机处理器接收包括指向存储器中的缓冲区的指针的命令并从该缓冲区读取顶点数据。顶点数据然后被传送到顶点着色阶段620以进行处理。
[0168]
顶点着色阶段620通过对顶点中的每一个执行一次一组操作(例如,顶点着色器或程序)来处理顶点数据。顶点可以例如被指定为与一个或更多个顶点属性(例如,颜色、纹理坐标、表面法线等)相关联的4坐标向量(例如,<x,y,z,w>)。顶点着色阶段620可以操纵各个顶点属性,诸如位置、颜色、纹理坐标等。换句话说,顶点着色阶段620对与顶点相关联的顶点坐标或其他顶点属性执行操作。这些操作通常包括光照操作(例如,修改顶点的颜色属性)和变换操作(例如,修改顶点的坐标空间)。例如,可以使用对象坐标空间中的坐标来指定顶点,其通过将坐标乘以矩阵进行变换,该矩阵将坐标从对象坐标空间转换到世界空间或归一化设备坐标(normalized-device-coordinate,ncd)空间。顶点着色阶段620生成被传送到图元组装阶段630的经变换的顶点数据。
[0169]
图元组装阶段630收集由顶点着色阶段620输出的顶点并且将顶点分组成几何图元以由几何着色阶段640处理。例如,图元组装阶段630可以被配置为将每三个连续顶点分组为用于传送到几何着色阶段640的几何图元(例如,三角形)。在一些实施例中,特定顶点可以被重新用于连续几何图元(例如,三角形带中的两个连续三角形可以共享两个顶点)。图元组装阶段630将几何图元(例如,相关联的顶点的集合)传送到几何着色阶段640。
[0170]
几何着色阶段640通过对几何图元执行一组操作(例如,几何着色器或程序)来处理几何图元。曲面细分(tessellation)操作可以从每个几何图元生成一个或更多个几何图元。换言之,几何着色阶段640可以将每个几何图元细分为两个或更多个几何图元的更精细的网格,以由图形处理管线600的其余部分进行处理。几何着色阶段640将几何图元传送到视口scc阶段650。
[0171]
在一个实施例中,图形处理管线600可以在流式多处理器和顶点着色阶段620、图元组装阶段630、几何着色阶段640、片段着色阶段670和/或与其相关联的硬件/软件内操作,可顺序地执行处理操作。一旦顺序处理操作完成,在一个实施例中,视口scc阶段650可以利用数据。在一个实施例中,由图形处理管线600中的阶段的一个或更多个处理的图元数据可以被写入高速缓存(例如,l1高速缓存、顶点高速缓存等)中。在这种情况下,在一个实施例中,视口scc阶段650可以访问高速缓存中的数据。在一个实施例中,视口scc阶段650和光栅化阶段660被实现为固定功能电路。
[0172]
视口scc阶段650执行几何图元的视口缩放、剔除和裁剪。正被渲染的每个表面都与抽象相机位置相关联。相机位置表示正观看该场景的观看者的位置并定义了包围该场景的对象的视锥体。视锥体可以包括观看平面、后平面和四个裁剪平面。完全位于视锥体之外的任何几何图元都可被剔除(例如丢弃),因为这些几何图元将不会对最终渲染的场景做出贡献。部分位于视锥体内并且部分位于视锥体外的任何几何图元可以被裁剪(例如,转换为
被包围在视锥体内的新的几何图元)。此外,可以基于视锥体的深度来对每个几何图元进行缩放。然后将所有可能可见的几何图元传送到光栅化阶段660。
[0173]
光栅化阶段660将3d几何图元转换成2d片段(例如,能够用于显示等)。光栅化阶段660可以被配置为利用几何图元的顶点来设置一组平面方程,从中可以内插各种属性。光栅化阶段660还可以计算多个像素的覆盖掩码,其指示像素的一个或更多个样本位置是否拦截几何图元。在一个实施例中,还可以执行z测试以确定几何图元是否被已经被光栅化的其他几何图元遮挡。光栅化阶段660生成片段数据(例如,与每个被覆盖像素的特定样本位置相关联的内插顶点属性),其被传送到片段着色阶段670。
[0174]
片段着色阶段670通过对片段中的每一个执行一组操作(例如,片段着色器或程序)来处理片段数据。片段着色阶段670可以生成片段的像素数据(例如,颜色值),诸如通过使用片段的内插纹理坐标执行光照操作或采样纹理映射。片段着色阶段670生成像素数据,其被传输到光栅操作阶段680。
[0175]
光栅操作阶段680可对像素数据执行各种操作,诸如执行阿尔法测试、模板测试(stencil test)以及将像素数据与对应于与像素相关联的其他片段的其他像素数据混合。当光栅操作阶段680已经完成对像素数据(例如,输出数据602)的处理时,可以将像素数据写入渲染目标,诸如帧缓冲区、颜色缓冲区等。
[0176]
应当领会,除上述阶段中的一个或更多个以外或代替上述阶段中的一个或更多个,一个或更多个额外的阶段可以被包括在图形处理管线600中。抽象图形处理管线的各种实现方式可以实现不同的阶段。此外,在一些实施例中,上述阶段中的一个或更多个可以从图形处理管线中排除(诸如几何着色阶段640)。其他类型的图形处理管线被认为是在本公开的范围内所构想的。此外,图形处理管线600的任何阶段可以由图形处理器(诸如ppu300)内的一个或更多个专用硬件单元来实现。图形处理管线600的其他阶段可以由可编程硬件单元(诸如ppu 300的sm 440)来实现。
[0177]
图形处理管线600可以经由由主机处理器(诸如cpu)执行的应用程序来实现。在一个实施例中,设备驱动程序可以实现应用程序编程接口(api),其定义可以被应用程序利用以生成用于显示的图形数据的各种功能。设备驱动程序是软件程序,其包括控制ppu 300的操作的多个指令。api为程序员提供抽象,其允许程序员利用专用图形硬件(诸如ppu 300)来生成图形数据而不要求程序员利用ppu 300的特定指令集。应用程序可以包括被路由到ppu 300的设备驱动程序的api调用。设备驱动程序解释api调用并执行各种操作以响应api调用。在一些情况下,设备驱动程序可以通过在cpu上执行指令来执行操作。在其他情况下,设备驱动程序可以至少部分地通过利用cpu和ppu 300之间的输入/输出接口在ppu 300上启动操作来执行操作。在一个实施例中,设备驱动程序被配置为利用ppu 300的硬件来实现图形处理管线600。
[0178]
可以在ppu 300内执行各种程序以便实现图形处理管线600的各个阶段。例如,设备驱动程序可以启动ppu 300上的内核以在一个sm 440(或多个sm 440)上执行顶点着色阶段620。设备驱动程序(或由ppu 400执行的初始内核)还可启动ppu 400上的其他内核以执行图形处理管线600的其他阶段,诸如几何着色阶段640和片段着色阶段670。另外,图形处理管线600的阶段中的一些可以在固定单元硬件(诸如在ppu 400内实现的光栅器或数据组装器)上实现。应当领会,在被sm 440上的后续内核处理之前,来自一个内核的结果可以由
一个或更多个中间固定功能硬件单元处理。
[0179]
机器学习
[0180]
在处理器(诸如ppu 300)上开发的深度神经网络(dnn)已经用于各种使用情况:从自驾车到更快药物开发,从在线图像数据库中的自动图像字幕到视频聊天应用中的智能实时语言翻译。深度学习是一种技术,它建模人类大脑的神经学习过程,不断学习,不断变得更聪明,并且随着时间的推移更快地传送更准确的结果。一个孩子最初是由成人教导,以正确识别和分类各种形状,最终能够在没有任何辅导的情况下识别形状。同样,深度学习或神经学习系统需要在物体识别和分类方面进行训练,以便在识别基本物体、遮挡物体等同时还有为物体分配情景时变得更加智能和高效。
[0181]
在最简单的层面上,人类大脑中的神经元查看接收到的各种输入,将重要性水平分配给这些输入中的每一个,并且将输出传递给其他神经元以进行处理。人造神经元或感知器是神经网络的最基本模型。在一个示例中,感知器可以接收一个或更多个输入,其表示感知器正被训练为识别和分类的对象的各种特征,并且在定义对象形状时,这些特征中的每一个基于该特征的重要性赋予一定的权重。
[0182]
深度神经网络(dnn)模型包括许多连接节点(例如,感知器、玻尔兹曼机器、径向基函数、卷积层等)的多个层,其可以用大量输入数据来训练以快速高精度地解决复杂问题。在一个示例中,dnn模型的第一层将汽车的输入图像分解为各个部分,并查找基本图案(诸如线条和角)。第二层组装线条以寻找更高水平的图案,诸如轮子、挡风玻璃和镜子。下一层识别运载工具类型,最后几层为输入图像生成标签,识别特定汽车品牌的型号。
[0183]
一旦dnn被训练,dnn就可以被部署并用于在被称为推理(inference)的过程中识别和分类对象或图案。推理的示例(dnn从给定输入中提取有用信息的过程)包括识别沉积在atm机中的支票存款上的手写数字、识别照片中朋友的图像、向超过五千万用户提供电影推荐、识别和分类不同类型的汽车、行人和无人驾驶汽车中的道路危险、或实时翻译人类言语。
[0184]
在训练期间,数据在前向传播阶段流过dnn,直到产生预测为止,其指示对应于输入的标签。如果神经网络没有正确标记输入,则分析正确标签和预测标签之间的误差,并且在后向传播阶段期间针对每个特征调整权重,直到dnn正确标记该输入和训练数据集中的其他输入为止。训练复杂的神经网络需要大量的并行计算性能,包括由ppu 300支持的浮点乘法和加法。与训练相比,推理的计算密集程度比训练更低,是一个延迟敏感过程,其中经训练的神经网络应用于它以前没有见过的新的输入,以进行图像分类、翻译语音以及通常推理新的信息。
[0185]
神经网络严重依赖于矩阵数学运算,并且复杂的多层网络需要大量的浮点性能和带宽来提高效率和速度。采用数千个处理核心,针对矩阵数学运算进行了优化,并传送数十到数百tflops的性能,ppu 300是能够传送基于深度神经网络的人工智能和机器学习应用所需性能的计算平台。
[0186]
一些实施例的示例性技术优势
[0187]
某些示例性实施例通过减少图形处理期间用于纹理信息访问的存储器访问延迟来提供改进的系统性能。
[0188]
如上所述,诸如管线化之类的常规延迟隐藏技术可能不足以缓解由于在图形处理
期间访问纹理映射等而导致的相对较长的延迟而导致的性能下降。同样,大多数已经针对cpu应用的常规预取技术也可能不适用于高度并行的gpu和具有与典型cpu工作负载不同的存储和访问特性的纹理信息。因此,通过减少用于纹理信息的存储器访问延迟来提供改进的系统性能,本发明的某些实施例使得能够保留由较快处理器提供的更多处理速度改进,而不是由于长的存储器访问延迟而导致性能下降。
[0189]
在某些示例性实施例中,在纹理单元和l2高速缓存处所需的附加电路在某些示例性实施例中被经济有效地结合到纹理处理单元的电路和l2高速缓存控制电路中,从而提供了一种有效的技术,通过其可以提高与纹理访问相关联的速度。此外,通过针对某些频繁的存储器访问模式进行优化,示例性实施例加速了至少一些存储器访问。
[0190]
虽然在示例性实施例中通过对纹理映射的更有效的存储器访问实现的加速在许多类型的应用程序中是有帮助的,但是该加速在具有非常快速的屏幕改变和/或动作的游戏以及时间高度关键的应用程序中可能特别有用,例如但不限于汽车显示器(例如,自主驾驶汽车显示器等)等。
[0191]
根据上述教导,本发明的许多修改和变化是可能的。因此,应当理解,在所附权利要求的范围内,可以以不同于本文具体描述的方式实践本发明。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1