用于逆向图形的可微分渲染管线的制作方法

文档序号:17118664发布日期:2019-03-15 23:35阅读:239来源:国知局
用于逆向图形的可微分渲染管线的制作方法

本申请要求于2017年9月6日提交的标题为“用于逆向图形的端到端可微分渲染管线(end-to-enddifferentiablerenderingpipelineforinversegraphics)”的美国临时申请第62/554,943号(代理人案卷号nvidp1187+/17ki0185us01)的权益,其全部内容通过引用并入本文。

本发明涉及计算机生成的图形,并且更具体地,涉及用于逆向图形的可微分渲染管线。



背景技术:

逆向图形系统(inversegraphicssystem)从观察到的场景的一个或更多个图像生成三维(3d)场景模型。该3d场景模型可以包括观察到的场景中的一个或更多个3d对象模型和一个或更多个照明源,其目标是如实地再现对象模型几何和场景照明。现有技术的逆向图形系统通常使用专门的代码来执行对象模型生成和优化,所述代码被设计用于辨别特定类别的对象(例如人脸或手)的模型参数。该专用代码通常仅适用于特定的对象类别,从而限制了现有技术的逆向图形系统的适应性和通用性。因此,具有解决这些问题和/或与现有技术相关的其他问题的需求。



技术实现要素:

公开了一种用于逆向图形渲染的方法、计算机可读介质和系统。该系统被配置为接收二维空间中的图像数据,确定三维空间中几何图元的初始参数值,渲染几何图元,比较图像数据和渲染图像数据以产生差,并基于该差和导数更新初始参数值。在一个实施例中,几何图元在被渲染时产生近似于图像数据的二维空间中的渲染图像数据。在一个实施例中,系统通过以下步骤渲染几何图元:使用初始参数值为每个几何图元生成可见性函数,过滤每个可见性函数以产生相应的平滑连续的函数,为每个平滑连续的函数计算二维空间中的导数,并基于平滑连续的函数计算渲染图像数据的经着色的像素值。

该方法包括接收二维空间中的图像数据,确定三维空间中几何图元的初始参数值,渲染几何图元,比较图像数据和渲染图像数据以产生差,以及基于该差和导数更新初始参数值。在一个实施例中,几何图元在被渲染时产生近似于图像数据的二维空间中的渲染图像数据。在一个实施例中,渲染几何图元包括使用初始参数值为每个几何图元生成可见性函数,过滤每个可见性函数以产生相应的平滑连续的函数,为每个平滑连续的函数计算二维空间中的导数,并且基于平滑连续的函数计算渲染图像数据的经着色的像素值。

计算机可读介质包括指令,其当由处理单元执行时,使处理单元执行该方法。

附图说明

图1a示出了根据一个实施例的用于在逆向图形渲染系统中更新参数值的方法的流程图。

图1b示出了根据一个实施例的用于在逆向图形渲染系统中渲染几何图元的方法的流程图。

图1c示出了根据一个实施例的逆向图形渲染系统。

图1d示出了根据一个实施例的用于计算渲染估计与观察图像之间的差的过程。

图1e示出了根据现有技术的沿屏幕空间中的任意线的三角形可见性和相应的屏幕空间导数。

图1f示出了根据一个实施例的沿屏幕空间中的任意线的平滑三角形可见性和相应的屏幕空间导数。

图1g示出了根据一个实施例的沿屏幕空间中的任意线的邻接三角形的平滑可见性和相应的屏幕空间导数。

图1h示出了根据一个实施例的重叠三角形的近似可见性。

图2a示出了根据一个实施例的确定场景内的阴影(shadow)的参数。

图2b示出了根据一个实施例的用于阴影建模的技术。

图2c示出了根据一个实施例的用于样式转变的技术。

图2d示出了根据一个实施例的用于在逆向图形渲染系统中迭代地生成一组模型参数值的方法的流程图。

图2e示出了根据一个实施例的用于渲染场景中的像素的方法的流程图。

图2f示出了根据一个实施例的用于对像素进行着色的方法的流程图。

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

图4a示出了根据一个实施例的图3的并行处理单元内的通用处理集群。

图4b示出了根据一个实施例的图3的并行处理单元的存储器分区单元。

图5a示出了根据一个实施例的图4a的流式多处理器。

图5b是根据一个实施例的使用图3的ppu实现的处理系统的概念图。

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

图6是根据一个实施例的由图3的ppu实现的图形处理管线的概念图。

具体实施方式

本发明的实施例包括逆向图形系统,被配置为生成观察图像的3d场景和/或对象模型。这些模型可以包括描述观察图像中的任意几何形状、光照和纹理的参数。逆向图形系统可以包括渲染管线,被构造成为参数提供端到端的可微分性,从而允许有效地使用参数优化技术,例如梯度下降等。

可见性是由典型的现有技术渲染管线处理的对象几何的常规不连续(不可微分)属性。在一个实施例中,使用可见性过滤和平滑使可见性连续,并因此可微分。本文描述了示例性过滤和平滑技术。通过将可见性从不连续属性变换为连续属性,所公开的渲染管线可以提供端到端的可微分性。

图1a示出了根据一个实施例的用于在逆向图形渲染系统中更新参数值的方法110的流程图。尽管在处理单元和/或逆向图形渲染系统的上下文中描述了方法110,但是方法110也可以由程序、定制电路或定制电路和程序的组合来执行。例如,方法110可以由gpu(图形处理单元)、cpu(中央处理单元)或任何其他技术上可行的处理器执行。此外,本领域普通技术人员将理解,执行方法110的任何系统都在本发明的实施例的范围和精神内。

在一个实施例中,包括处理单元的逆向图形渲染系统被配置为执行方法110。此外,逆向图形渲染系统可以包括优化用于执行某些机器学习操作的专用电路。

在步骤111,逆向图形渲染系统接收二维(2d)空间中的图像数据。图像数据可以包括对象的一个或更多个图像或包含一个或更多个对象的场景。在步骤113,逆向图形渲染系统确定三维(3d)空间中的几何图元(例如,三角形)的初始参数值。当被渲染时,几何图元产生二维空间中近似于图像数据的渲染图像数据(renderedimagedata)。可以使用任何技术上可行的技术来使用几何图元推测场景几何形状。例如,在一个实施例中,场景分割用于推测场景几何形状。在另一实施例中,对象分类器用于识别和推测场景几何形状。可以使用任何技术上可行的技术来确定几何图元的初始参数值。在一个实施例中,初始参数定义一个或更多个初始3d场景和/或对象模型。

在步骤115,逆向图形渲染系统渲染几何图元。可以基于初始参数来渲染几何图元,其中可见性平滑应用于几何图元。在一个实施例中,根据结合图1b描述的步骤122到128来渲染几何图元。此外,结合渲染几何图元来计算导数。在一个实施例中,在2d空间中计算导数。

在步骤117,逆向图形渲染系统比较图像数据和渲染图像数据以产生差。该差包括图像数据和渲染图像数据之间的差的测量。在一个实施例中,该差包括像素值差的总和。例如,可以从渲染图像数据中的相应像素值减去图像数据的每个像素值;并且,每个颜色通道(例如,红、绿和蓝颜色通道)中的差的绝对值被累积并相加在一起,以产生差值。此外,在不脱离各种实施例的范围和精神的情况下,可以实现不同的比较技术。

在步骤119,逆向图形渲染系统基于差和导数更新初始参数值。例如,可以根据一个或更多个相关的导数来更新每个参数值。在一个实施例中,使用梯度下降(gradientdescent)来更新参数。在实践中,通过向减少或最小化误差的方向(与误差的梯度相反的方向)微调(nudge)参数来更新参数。给定参数x、新的更新的参数x'可以被计算为x-α*dd/dx,其中d是两个图像之间的差(即,差值),并且α控制每次迭代的步骤的长度。相同的等式可以应用于用户想要更新的所有参数。

在一个实施例中,重复步骤115、117和119,直到遇到迭代计数,或者根据指定的要求减小差(例如,差值)。指定的要求可以是,例如,差值的固定阈值、差值的固定斜率或用于指示停止迭代的任何其他技术上可行的标准。

可能需要逆向图形系统来优化成千上百万个参数(例如,几何对象和网格的顶点位置、相机位置和属性、照明细节等)。优化框架可以被配置为包括渲染管线。此外,优化框架可以使用渲染管线的导数输出来执行逆向图形的参数优化。在一个实施例中,本领域中称为tensorflowtm的机器学习框架可以被配置为执行本文描述的逆向图形技术。当然,可替代地配置任何技术上可行的优化框架以执行本文描述的技术。在一个实施例中,机器学习框架被实现为包括一个或更多个深度神经网络。

图1b示出了根据一个实施例的方法步骤122-128的流程图,包括图1a的步骤115,用于在逆向图形渲染系统中渲染几何图元。尽管在处理单元和/或逆向图形渲染系统的上下文中描述了方法步骤122-128,但是方法步骤122-128也可以由程序、定制电路或定制电路和程序的组合来执行。例如,方法步骤122-128可以由gpu、cpu或任何其他技术上可行的处理器执行。此外,本领域普通技术人员将理解,执行方法步骤122-128的任何系统都在本发明的实施例的范围和精神内。

在步骤122,逆向图形渲染系统使用初始参数值为每个几何图元生成可见性函数。给定的可见性函数包括图元可见性的样本。在步骤124,逆向图形渲染系统过滤每个可见性函数以产生相应的平滑连续函数。在一个实施例中,可见性函数的导数在几何图元的边缘处是非零的。通常,过滤给定的可见性函数产生相应的平滑连续的可见性函数,其在相关联的几何图元的边缘处是可微分的和非零的。在一个实施例中,在每个点(例如,像素位置)处,过滤包括通过积分/求和来计算周围邻域的加权平均值。此外,当两个几何图元(例如,三角形)共享公共边缘时,两个几何图元的可见性函数的导数在共享边缘处的和为零。在三角形网格中,给定三角形可以共享所有三个边缘,并且可见性函数的导数在三个边缘处总和为零。

在一个实施例中,过滤包括将具有单个像素的宽度的过滤器应用于每个可见性函数。请注意,使用跨越多个像素的过滤器的过度过滤(over-filtering)可能会导致渲染图像模糊,而使用小于像素的过滤器的不足过滤(under-filtering)可能会产生伪(spurious)导数。

在步骤126,逆向图形渲染系统针对每个平滑连续函数计算二维空间中的导数。在一个实施例中,导数指示是否应该增加或减小给定参数以减小参考图像数据和渲染图像数据之间的差。

在步骤128,逆向图形渲染系统基于平滑连续函数计算渲染图像数据的经着色的像素值(shadedpixelvalue)。在一个实施例中,平滑连续函数(连续可见性)用于估计给定样本点处的覆盖的连续期望。通过将几何图元的常规不连续可见性函数转换为平滑连续的可见性函数,使得图元的随机着色是连续的并且因此是可微分的。以这种方式,使得几何形状和几何形状的着色两者在随机(例如,子像素采样)着色的情况下是可微分的。

图1c示出了根据一个实施例的逆向图形渲染系统130。如图所示,逆向图形渲染系统130包括渲染管线140,其被配置为接收3d场景的参数132并基于3d场景的参数132生成渲染图像数据148。渲染图像数据148可包括经渲染的2d图像。在一个实施例中,渲染管线140包括可微分渲染管线,其被配置为从3d场景的参数132生成渲染像素值以及关于3d场景的参数132的渲染像素值的梯度二者。渲染管线140包括参数函数生成单元142、梯度计算单元144和像素着色引擎146。图像比较引擎138将包括2d图像数据136的参考图像或观察图像与渲染图像148进行比较以生成误差数据139。误差数据139提供2d图像数据136与渲染图像数据148之间的差的定量测量(例如,差值)。参数调整引擎134被配置为基于来自参数梯度计算单元144的参数梯度和误差数据139来优化和更新3d场景的参数132。

可以将逆向图形渲染系统130实现为用于处理单元、定制电路或其组合的编程指令。例如,逆向图形渲染系统130可以被实现为用于gpu、cpu或任何其他技术上可行的处理器的编程指令。

在一个实施例中,渲染管线被构造为包括自动生成的微分代码(differentiationcode)的一部分。可以使用自动微分系统来生成微分代码。实际上,渲染管线可以包括手动编写的源代码,其包括从输入变量计算的输出变量。自动微分系统接收手动编写的源代码、分析源代码并生成微分代码以包括对应于输出变量的导数输出。可以在微分代码中应用微分链规则以提供端到端的导数输出。任何技术上可行的技术可以由自动微分系统执行以生成微分代码。

在正常操作期间,逆向渲染系统130接收2d图像数据136并确定3d场景的参数132的初始值。确定初始值以产生渲染图像数据148作为2d图像数据136的近似。渲染管线140接收3d场景的参数132,并且参数函数生成单元142生成参数的一个或更多个函数。一些函数(诸如可见性(即,覆盖))是分段线性函数,从其无法计算有用的(即,非零)梯度。然后,参数函数生成单元142过滤每个可见性函数以产生平滑连续的函数。过滤也可以软化边缘以用于抗锯齿。经过滤的可见性函数是平滑且连续的,因此可用于计算参数的有用导数。

逆向渲染系统130可以执行对3d场景的参数132的优化、更新和渲染的多次迭代,其目标是连续迭代使得相应生成的渲染图像数据148收敛于2d图像数据136。该优化过程可以使得3d场景的参数132更接近地建模2d图像数据136中描绘的实际场景和对象几何形状。在一个实施例中,由参数调整引擎134使用梯度下降或任何其他基于导数的优化技术基于误差数据和参数导数来优化(例如,训练)3d场景的参数132。注意,可以定义成本函数以量化参数优化的程度,其中成本函数用于指导优化过程。在某些实施例中,参数调整引擎134包括一个或更多个神经网络,被配置为提取输入图像的特征并使用所提取的特征来优化3d场景的参数132。例如,参数调整引擎134可以被配置为优化3d场景的参数132以执行从一个图像到渲染图像的样式转变操作,如结合图2c更详细地描述的。

图1d示出了根据一个实施例的用于计算渲染估计图像153与观察图像155之间的差156的过程150。如图所示,模型151被渲染152以生成估计图像153。模型151包括对象和/或场景几何形状,并且可以包括照明信息。在一个实施例中,模型151由3d场景的参数132描述。差156提供估计图像153与观察图像155多么接近地匹配(或不匹配)的定量测量。在一个实施例中,计算关于模型151中的给定参数的偏导数的差156。偏导数可以用于确定是否应该增大或减小模型参数以减小差156。因为渲染管线是可微分的,所以每个模型参数可以在给定的优化迭代中独立地优化以减小差156。在一个实施例中,差156包括误差数据139。

图1e示出了根据现有技术的三角形可见性166和沿屏幕空间中的任意线162的相应的屏幕空间导数167。如图所示,线162在交叉点168(0)和168(1)处与三角形164相交。三角形可见性166是几乎在屏幕空间中的任何地方都可微分的函数。然而,实际计算三角形可见性166的导数将产生零值(在此是有效的)。零常数导数值不为依赖于导数信息的优化技术提供有用信息以指导优化。可以使用本文描述的技术,特别是关于图1f和图1g描述的技术,来解决现有技术中的这种缺陷。

图1f示出了根据一个实施例的平滑的三角形可见性176和沿屏幕空间中的任意线172的相应的屏幕空间导数177。线172在交叉点178(0)和178(1)处与三角形174相交。如图所示,三角形可见性176已被过滤和平滑,导致在交叉点178(0)和178(1)处的非零屏幕空间导数177连续可微分。更一般地,传统二进制可见性函数的尖锐不连续边缘用经过滤和平滑的可见性函数替换,从而在几何对象的边缘(例如,交叉点178)处提供连续的非零导数。在一个实施例中,在方法110的步骤115(例如,图1b的步骤124)执行过滤和平滑。可以将衰减(falloff)区域的宽度控制为一个像素的范围,以避免在渲染图像中引入视觉上明显的模糊。

图1g示出了根据一个实施例的用于邻接三角形184的平滑的可见性186以及沿屏幕空间中的任意线182的相应的屏幕空间导数187。如图所示,两个三角形184(a)和184(b)共享公共边缘185。用于平滑的三角形可见性186(a)和186(b)的函数在交叉点188(0)、188(1)、188(2)处表现出平滑的衰减。更一般地,三角形184(a)和184(b)的各个边缘处的可见性表现出平滑的衰减。平滑的三角形可见性186(a)具有对应的屏幕空间导数187(a),并且平滑的三角形可见性186(b)具有对应的屏幕空间导数187(b)。如图所示,屏幕空间导数187(a)在交叉点188(0)和188(1)周围是连续且非零的。类似地,屏幕空间导数187(b)在交叉点188(1)和188(2)周围是连续且非零的。为了避免看起来可见和边缘可见,平滑的三角形可见性186(a)和平滑的三角形可见性18b(b)被配置为在它们邻接的位置处和为零,例如在交叉点188(1)处及其周围。

在一个实施例中,实现卷积函数的像素过滤器被配置为执行过滤和平滑。对于经渲染的几何对象上的每个像素(即,点),在周围邻域中计算加权平均值。在围绕像素的恒定可见性的区域中,产生恒定的结果。然而,在边缘处,产生平滑的衰减,允许连续的非零导数。

图1h示出了根据一个实施例的重叠三角形的近似可见性。场景配置190包括相机位置处的相机192,以及相机192的视野内的三角形196。如图所示,三角形196(a)和196(b)在过滤区域194内对相机192直接可见,而三角形196(c)由三角形196(a)和196(b)遮挡(occlude)。过滤区域194包括屏幕空间191内的区域。过滤区域194由相机192到场景配置190的投影193和195界定。在一个实施例中,过滤区域194与屏幕空间191中的单个像素对齐。即,过滤区域194的宽度和高度等于单个像素的各自宽度和高度。在替代实施例中,过滤区域194可以大于或小于屏幕空间191中的单个像素。像素过滤函数被配置为对过滤区域194进行采样以基于每个三角形196的覆盖范围来计算三角形196的可见性和着色贡献。

在一个实施例中,对几何图元(例如,三角形196)进行排序(sort),并且在生成几何图元的可见性函数之前丢弃被遮挡的部分。可以根据深度或覆盖范围进行排序。例如,可以对三角形196(a)、196(b)和196(c)进行排序,在计算过滤区域194中的可见性函数之前丢弃三角形196(b)。在某些实施例中,可以通过以下方法对可见性函数进行近似:将给定像素内可见的不同三角形的覆盖范围加在一起,直到达到阈值(例如一个)为止;对于像素,不包括剩余三角形的可见性贡献。可见性函数可用于确定几何图元的着色贡献。

在一个实施例中,像素过滤函数被配置为对相关像素区域内的多个采样点进行采样。可以使用针对每个三角形的连续可微分的可见性函数来计算给定采样点处的不同三角形的覆盖贡献。以这种方式,相机位置的微小变化、三角形参数和/或其他场景参数产生可微分的输出,其可以用于梯度下降优化。在某些实施例中,可微分的输出可以包括具有来自两个或更多个不同三角形的不同颜色贡献的经着色的像素,具有用于两个或更多个不同三角形的连续可微分的可见性函数。

在一个实施例中,可以将不同三角形的可见性函数建模为连续概率,并且可以基于概率计算与两个或更多个三角形相交的给定像素的着色作为期望函数。例如,在具有两个对像素有贡献的三角形的情形中,第一三角形可以具有颜色a而第二三角形可以具有颜色b。第一三角形和第二三角形的覆盖范围被建模为相应的概率p和1-p。可以使用期望函数

e[f]=ap+b(1-p)来计算两个三角形的着色贡献。也就是说,第一三角形贡献颜色a的比例为p,第二三角形贡献颜色b的比例为1-p,以成为最终像素颜色。

传统的可见性函数被定义为包括不连续性分别可见和不可见的部分,使得这样的函数难以用于优化函数。相反,连续概率的期望函数相对于任何场景参数是可微分的,从而提供用于优化操作的梯度。

图2a示出了根据一个实施例的确定场景内的阴影的参数。场景配置220包括位于相机位置的相机222,以及投影半球226内的表面点223。表面点223位于相机220的视野内。照明器224被配置为用作场景配置220内的光源,照明阻挡器225(a)和225(b)将表面点223置于不同程度的阴影中。照明阻挡器225包括基元,例如几何基元,设置在照明器和正被渲染的给定表面点之间。更一般地,照明器和照明阻挡器可以根据场景参数来配置,其中光从照明器通过投影半球226投射到表面点223,以在相机222处产生表面点223的照明结果。因为在渲染期间未引入不连续性,表面点223的照明结果相对于场景参数仍然是可微分的。在一个实施例中,基于场景参数相对于表面点223的梯度,根据梯度下降技术计算场景参数。可以通过多次迭代来精细化(refine)参数值。

图2b示出了根据一个实施例的用于阴影建模的技术。可以通过例如移动场景中的照明器(未示出)以匹配目标场景232内的阴影情况来优化231初始估计场景230。在一个实施例中,可以应用关于图2a讨论的技术来提供场景参数优化以重新定位照明器。在一个实施例中,建模工具被配置为根据目标阴影形状和/或位置定位一个或更多个照明器。

图2c示出了根据一个实施例的用于样式转变的技术。在各种实施例中,匹配场景参数是优化目标,而不是针对目标图像优化像素值。示例性场景参数可以包括顶点、光颜色、光位置、材料光泽度等。在样式转变中,参考图像242和样式图像244被组合240以生成具有参考图像的显著特征(例如,几何形状)的样式化图像246,同时根据样式图像进行渲染。在一个示例中,初始参数可以对应于三维空间中的几何图元的参数值(例如,来自参考图像242),并且图像数据可以包括样式图像244。优化可以根据本文描述的技术进行,并且尤其是根据方法110和/或方法260进行。

在一个实施例中,该优化可以类似于其他神经网络样式转变技术。例如,可以利用呈现给配置用于图像识别的第一卷积神经网络(cnn)的结果图像来渲染场景。在一个实施例中,cnn包括深度神经网络,如本文所述。对cnn的中间响应进行采样以生成第一特征向量。将样式图像呈现给类似地配置用于图像识别的第二cnn,对中间响应进行采样以生成第二特征向量。特征向量可以被解释为每个图像的高维度嵌入。可选地,特征向量可以被解释为非线性频率分解。可以提取产生各个图像的边缘和纹理响应的cnn层(中间响应)作为特征向量。在一个实施例中,在将图像数据与渲染图像数据进行比较以产生差之前,用第一特征向量替换图像数据(例如,方法110),用第二特征向量替换渲染图像数据。示例性样式转变优化尝试将边缘和纹理(即,样式图像的高频细节)转移到参考图像。在一个实施例中,第一cnn和第二cnn在图1c的参数调整引擎134内实现。

图2d示出了根据一个实施例的用于在逆向图形渲染系统中迭代地生成一组模型参数值的方法260的流程图。尽管在处理单元和/或逆向图形渲染系统的上下文中描述了方法260,方法260还可以由程序、定制电路或定制电路和程序的组合来执行。例如,方法260可以由gpu(图形处理单元)、cpu(中央处理单元)或任何其他技术上可行的处理器执行。此外,本领域普通技术人员将理解,执行方法260的任何系统都在本发明的实施例的范围和精神内。

在一个实施例中,包括渲染管线140的逆向图形渲染系统130被配置为执行方法260。此外,逆向图形渲染系统130可以包括优化用于执行某些机器学习操作的专用电路。

在步骤261,逆向图形渲染系统130使用第一参数集渲染第一图像。在一个实施例中,使用3d场景的参数132在可微分的渲染管线(例如,渲染管线140)上执行渲染。在步骤263,逆向图形渲染系统130将第一图像(例如,渲染图像数据148)与参考图像(例如,2d图像数据136)进行比较。在一个实施例中,比较第一图像和第二图像由比较引擎138执行。比较的结果可以是指示第一图像和第二图像之间的差的误差值(例如,差值,误差数据139)。

在步骤265,如果误差不小于指定的阈值,则方法260前进到步骤267,其中逆向图形渲染系统130基于第一参数集以及第一图像和参考图像的比较来生成更新的(例如,第二、第三等)参数集。在一个实施例中,由参数调整引擎134生成更新的参数集。在步骤269,逆向图形渲染系统130使用更新的参数集渲染更新的图像。在一个实施例中,渲染管线140被配置为渲染更新的图像,包括渲染图像数据148的更新版本。返回步骤267,如果误差小于指定的阈值,则该方法终止。

在一个实施例中,在完成步骤269之后,该方法返回以通过步骤263-269迭代一次或更多次,直到满足指定的阈值。在每次迭代时,基于先前的参数集更新参数集,并且渲染新更新的图像以与参考图像进行比较。在每次迭代中,在步骤263中将更新的图像与参考图像进行比较。此外,在步骤267中,更新的参数集是基于先前的参数集,最初包括第一参数集。参数可以包括几何图元信息、阴影区信息(shadinginformation)、位置信息、纹理信息、相机位置信息、照明器位置信息等。

图2e示出了根据一个实施例的用于渲染场景中的像素的方法270的流程图。尽管在处理单元和/或逆向图形渲染系统的上下文中描述了方法270,但是方法270还可以由程序、定制电路或定制电路和程序的组合来执行。例如,方法270可以由gpu(图形处理单元)、cpu(中央处理单元)或任何其他技术上可行的处理器执行。此外,本领域普通技术人员将理解,执行方法270的任何系统都在本发明的实施例的范围和精神内。

在一个实施例中,逆向图形渲染系统130被配置为执行方法270。可以针对给定图形场景内的每个像素重复方法270以渲染场景。在一个实施例中,方法270可以实现方法260的步骤261和/或步骤269。

在步骤271,逆向图形渲染系统130以像素中心的大小射出(shoot)(即,投射)从相机原点到像素中心的锥形(cone)。在步骤272,逆向图形渲染系统130收集所有相交的三角形(即,与锥形相交的三角形)。在步骤273,逆向图形渲染系统130对相对于锥形的中心相交的三角形进行排序以生成经排序的三角形列表。根据某些实施例,步骤271-273在图1h中示出。在步骤274,逆向图形渲染系统130初始化可见性变量。例如,可见性变量可以被设置为零(例如,可见性=0),并且三角形可见性值的列表可以被设置为零(例如,三角形可见性={})。在步骤275,逆向图形渲染系统130计算可见性。在步骤276,逆向图形渲染系统130计算像素值和像素导数(梯度)值。在一个实施例中,根据表1的伪代码执行步骤275。在一个实施例中,在表1的伪代码中调用的convolve()函数提供平滑的可见性函数,如图1f和图1g所示。在某些实施例中,根据表2的伪代码执行步骤276。

表1

表2

图2f示出了根据一个实施例的用于对像素进行着色的方法280的流程图。尽管在处理单元和/或逆向图形渲染系统的上下文中描述了方法280,但是方法280还可以由程序、定制电路或定制电路和程序的组合来执行。例如,方法280可以由gpu(图形处理单元)、cpu(中央处理单元)或任何其他技术上可行的处理器执行。此外,本领域普通技术人员将理解,执行方法280的任何系统都在本发明的实施例的范围和精神内。

在一个实施例中,逆向图形渲染系统130被配置为执行方法280。在一个实施例中,方法280实现表2的伪代码的shade()调用。

在步骤281,逆向图形渲染系统130在光源l处拾取具有基于p'和l的概率密度函数的随机点p'。在步骤282,逆向图形渲染系统130从三角形上的点p到p'射出锥形,其大小与l的大小成正比。在步骤282,逆向图形渲染系统130建立以锥形为中心的线性变换余弦分布m。在步骤284,逆向图形渲染系统130初始化光可见性(light_visibility=0)和阴影可见性(shadow_visibility=0)。在步骤285,逆向图形渲染系统130计算像素的可见性。在步骤286,逆向图形渲染系统130计算像素的经着色的像素颜色。在一个实施例中,根据表3的伪代码执行步骤285。在某些实施例中,根据表4的伪代码执行步骤286。

表3

表4

现在将根据用户的期望,阐述关于采用其可以实现或不可以实现前述框架的各种可选架构和特征的更多说明性信息。应该特别注意的是,出于说明性目的阐述了以下信息,并且不应该被解释为以任何方式进行限制。任何以下特征可以任选地合并或不排除所描述的其他特征。

并行处理架构

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

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

如图3所示,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的其他单元或从其发送,例如一个或更多个复制引擎、视频编码器、视频解码器、电源管理单元等(未明确示出)。结合图5b更详细地描述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的数目。下面将结合图4b更详细地描述分区单元380。

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

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

在一个实施例中,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)单元,结合图4b更详细地描述。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(单指令、多线程)体系架构,其中线程组中的每个线程被配置为基于相同的指令集处理不同的数据集,但是其中线程组中的各个线程在执行期间被允许发散。在一个实施例中,为每个线程束维护程序计数器、调用栈和执行状态,当线程束内的线程发散时,使线程束和线程束中的串行执行之间的并发成为可能。在另一个实施例中,为每个单独的线程维护程序计数器、调用栈和执行状态,从而在线程束内和线程束之间的所有线程之间实现相等的并发。当为每个单独的线程维护执行状态时,执行相同指令的线程可以被收敛并且并行执行以获得最大效率。下面结合图5a更详细地描述sm440。

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

图4b示出了根据一个实施例的图3的ppu300的存储器分区单元380。如图4b所示,存储器分区单元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。尽管rop单元450包括在图4b中的存储器分区单元380内,但是在其他实施例中,rop单元450可以在存储器分区单元380之外。例如,rop单元450可以驻留在gpc350或另一个单元中。

图5a示出了根据一个实施例的图4a的流式多处理器440。如图5a所示,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个线程。

每个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、存储器204、精简指令集计算机(risc)cpu、存储器管理单元(mmu)、数字-模拟转换器(dac)等)一起被包括在片上系统(soc)上。

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

示例性计算系统

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

图5b是根据一个实施例的使用图3的ppu300实现的处理系统500的概念图。处理系统500可以被配置为实现图1a中所示的方法110、图1b中所示的方法步骤122-128、图2d中所示的方法260或其任何组合。处理系统500包括cpu530、交换机510和多个ppu300中的每一个以及相应的存储器304。nvlink310提供每个ppu300之间的高速通信链路。尽管图5b中示出了特定数量的nvlink310和互连302连接,但是连接到每个ppu300和cpu530的连接的数量可以改变。交换机510在互连302和cpu530之间接口。ppu300、存储器304和nvlink310可以位于单个半导体平台上以形成并行处理模块525。在一个实施例中,交换机510支持两个或更多个在各种不同连接和/或链路之间接口的协议。

在另一个实施例(未示出)中,nvlink310在每个ppu300和cpu530之间提供一个或更多个高速通信链路,并且交换机510在互连302和每个ppu300之间进行接口。ppu300、存储器304和互连302可以位于单个半导体平台上以形成并行处理模块525。在又一个实施例(未示出)中,互连302在每个ppu300和cpu530之间提供一个或更多个通信链路,并且交换机510使用nvlink310在每个ppu300之间进行接口,以在ppu300之间提供一个或更多个高速通信链路。在另一个实施例(未示出)中,

nvlink310在ppu300和cpu530之间直接地或通过交换机510提供一个或更多个高速通信链路,和/或互连302在每个ppu300和cpu530之间直接地或通过交换机510提供一个或更多个通信链路。可以使用与nvlink310相同的协议将一个或更多个nvlink310高速通信链路实现为物理nvlink互连或者片上或裸晶上互连。

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

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

在一个实施例中,nvlink310允许从cpu530到每个ppu300的存储器304的直接加载/存储/原子访问。在一个实施例中,nvlink310支持一致性操作,允许从存储器304读取的数据被存储在cpu530的高速缓存分层结构中,减少了cpu530的高速缓存访问延迟。在一个实施例中,

nvlink310包括对地址转换服务(ats)的支持,允许ppu300直接访问cpu530内的页表。一个或更多个nvlink310还可以被配置为以低功率模式操作。

图5c示出了示例性系统565,其中可以实现各种先前实施例的各种体系架构和/或功能。示例性系统565可以被配置为实现图1a中所示的方法110、图1b中所示的方法步骤122-128、图2d中所示的方法260或其任何组合。

如图所示,提供系统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中的帧缓冲区。顶点着色程序和像素着色程序可以同时执行,以管线方式处理来自同一场景的不同数据,直到该场景的所有模型数据已经被渲染到帧缓冲区。然后,帧缓冲区的内容被传送到显示控制器以在显示设备上显示。

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

如图6所示,图形处理管线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的任何阶段可以由图形处理器(诸如ppu200)内的一个或更多个专用硬件单元来实现。图形处理管线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上的后续内核处理之前,来自一个内核的结果可以由一个或更多个中间固定功能硬件单元处理。

机器学习

在处理器(诸如ppu300)上开发的深度神经网络(dnn)已经用于各种使用情况:从自驾车到更快药物开发,从在线图像数据库中的自动图像字幕到视频聊天应用中的智能实时语言翻译。深度学习是一种技术,它建模人类大脑的神经学习过程,不断学习,不断变得更聪明,并且随着时间的推移更快地传送更准确的结果。一个孩子最初是由成人教导,以正确识别和分类各种形状,最终能够在没有任何辅导的情况下识别形状。同样,深度学习或神经学习系统需要在物体识别和分类方面进行训练,以便在识别基本物体、遮挡物体等同时还有为物体分配情景时变得更加智能和高效。

在最简单的层面上,人类大脑中的神经元查看接收到的各种输入,将重要性级别分配给这些输入中的每一个,并且将输出传递给其他神经元以进行处理。人造神经元或感知器是神经网络的最基本模型。在一个示例中,感知器可以接收一个或更多个输入,其表示感知器正被训练为识别和分类的对象的各种特征,并且在定义对象形状时,这些特征中的每一个基于该特征的重要性赋予一定的权重。

深度神经网络(dnn)模型包括许多连接的感知器(例如节点)的多个层,其可以用大量输入数据来训练以快速高精度地解决复杂问题。在一个示例中,dll模型的第一层将汽车的输入图像分解为各个部分,并查找基本图案(诸如线条和角)。第二层组装线条以寻找更高级别的图案,诸如轮子、挡风玻璃和镜子。下一层识别运载工具类型,最后几层为输入图像生成标签,识别特定汽车品牌的型号。

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

在训练期间,数据在前向传播阶段流过dnn,直到产生预测为止,其指示对应于输入的标签。如果神经网络没有正确标记输入,则分析正确标签和预测标签之间的误差,并且在后向传播阶段期间针对每个特征调整权重,直到dnn正确标记该输入和训练数据集中的其他输入为止。训练复杂的神经网络需要大量的并行计算性能,包括由ppu300支持的浮点乘法和加法。与训练相比,推理的计算密集程度比训练更低,是一个延迟敏感过程,其中经训练的神经网络应用于它以前没有见过的新的输入,以进行图像分类、翻译语音以及通常推理新的信息。

神经网络严重依赖于矩阵数学运算,并且复杂的多层网络需要大量的浮点性能和带宽来提高效率和速度。采用数千个处理核心,针对矩阵数学运算进行了优化,并传送数十到数百tflops的性能,ppu300是能够传送基于深度神经网络的人工智能和机器学习应用所需性能的计算平台。

在一个实施例中,使用ppu300来实现图2c的第一cnn和第二cnn。例如,ppu300可以被配置为执行实现图1c的参数调整引擎134的代码,其可以包括图2c的第一cnn和第二cnn。

虽然上文已经描述了各种实施例,但应该理解的是,它们仅作为示例呈现,而不是限制。因此,本申请的广度和范围不应被任何上述示例性实施例限制,而应仅根据以下和随后提交的权利要求及其等同物来限定。

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