鲁棒且高效的多处理器-协处理器接口转让专利

申请号 : CN201910457272.7

文献号 : CN110858387A

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : R·巴比奇J·伯吉斯J·肖凯特T·卡拉斯S·莱内I·利亚马斯G·穆特乐W·P·纽霍尔

申请人 : 辉达公司

摘要 :

本发明提供了一种鲁棒且高效的多处理器-协处理器接口,具体地提供了用于在GPU中的流式多处理器和加速协处理器之间使用的高效且鲁棒的多处理器-协处理器接口的系统和方法。根据示例性实现,为了使用协处理器执行特定操作的加速,所述多处理器:发出一系列写入指令以将用于操作的输入数据写入协处理器可访问的存储位置,发出操作指令以使协处理器执行特定操作;然后发出一系列读取指令以从协处理器可访问的存储位置读取操作的结果数据到多处理器可访问的存储位置。

权利要求 :

1.一种由多处理器执行以在通信地耦合的协处理器上执行操作的方法,所述方法包括:建立与所述协处理器的连接;

发出多个写入指令,以将所述操作的输入数据写入协处理器可访问的存储位置;

发出操作指令,以使所述协处理器使用所述输入数据执行所述操作;

发出多个读取指令,以从协处理器可访问的存储位置读取所述操作的结果数据到多处理器可访问的存储位置;以及关闭所述连接。

2.根据权利要求1所述的方法,还包括阻塞,直到所述建立连接完成为止。

3.根据权利要求2所述的方法,其中直到建立连接完成为止的所述阻塞是仅阻塞所述建立和所述关闭之间的指令。

4.根据权利要求2所述的方法,还包括:

在所述关闭之后,等待所述结果数据被写入一个或更多个所述多处理器可访问的存储位置;以及在所述等待之后,在多处理器可访问的存储位置中消耗所述结果数据。

5.根据权利要求4所述的方法,还包括在所述关闭和所述等待所述结果数据被写入之间的一个或更多个其他指令。

6.根据权利要求5所述的方法,其中,所述一个或更多个其他指令包括至少另一指令序列,所述另一指令序列包括建立到所述协处理器的第二连接的指令和关闭所述第二连接的指令。

7.根据权利要求4所述的方法,其中所述等待包括在记分板上等待。

8.根据权利要求1所述的方法,其中所述操作指令是所述多个写入指令和所述多个读取指令之间的唯一处理指令。

9.根据权利要求8所述的方法,其中所述操作指令包括从能够在所述协处理器上执行的多个操作之中立即识别所述操作。

10.根据权利要求8所述的方法,其中所述操作指令不包括任何操作数。

11.根据权利要求2所述的方法,还包括:发出宏起始指令,其中所述宏起始指令使得预定数量的指令要在所述宏起始指令之后执行而不干预抢占。

12.根据权利要求11所述的方法,其中,基于所述宏起始指令的操作数来确定所述预定数量。

13.根据权利要求11所述的方法,其中所述宏起始指令使得针对预定数量的后续指令禁用中断。

14.根据权利要求11所述的方法,其中所述宏起始指令包括所述阻塞,直到所述建立连接完成为止。

15.根据权利要求1所述的方法,其中所述操作使所述协处理器执行多个子操作,并且其中所述方法还包括一个或更多个所述多处理器可访问的存储位置以时间交错的方式从所述子操作中的各个子操作接收数据。

16.根据权利要求1所述的方法,其中所述输入数据从所述多处理器中的寄存器写入所述协处理器的本地存储器。

17.一种系统,包括多处理器和通信地耦合的协处理器,其中所述多处理器被配置为:建立与所述协处理器的连接;

发出多个写入指令,以将所述操作的输入数据写入协处理器可访问的存储位置;

发出操作指令,以使所述协处理器执行所述操作;

发出多个读取指令,以从协处理器可访问的存储位置读取所述操作的结果数据到多处理器可访问的存储位置;以及关闭所述连接。

说明书 :

鲁棒且高效的多处理器-协处理器接口

[0001] 相关申请的相交引用
[0002] 本申请涉及以下共同转让的美国专利和专利申请,其全部内容通过引用并入本文:2014年12月8日提交的标题为“树状数据结构的短堆栈遍历(Short Stack Traversal of Tree Data Structures)”的美国申请No.14/563,872;标题为“基于块的层次包围盒(Block-Based Bounding Volume Hierarchy)”的美国专利No.9,582,607;标题为“用于基于块的层次包围盒的相对编码(Relative Encoding For A Block-Based Bounding Volume Hierarchy)”的美国专利No.9,552,664;2015年3月18日提交的标题为“光束追踪(Beam Tracing)”的美国专利No.9,569,559;标题为“基于多个局部坐标系的树状数据结构(Tree Data Structures Based on a Plurality of Local Coordinate
[0003] Systems)”的美国专利No.10,025,879;2015年6月11日提交的标题为“基于块的几何数据无损压缩(Block-Based Lossless Compression of Geometric Data)”的美国申请No.14/737,343;以及以下与其同时提交的美国申请:
[0004] ·(卷号:6610-0032/18-AU-0127)标题为“用于在没有着色器干预的情况下在交点上进行连续的层次包围盒遍历的方法(Method for Continued Bounding Volume Hierarchy Traversal On Intersection Without Shader Intervention)”;
[0005] ·(卷号:6610-0033/18-AU-0128),标题为“用于数据路径调度的高速缓存请求的有效分组的方法(Method for Efficient Grouping of Cache Requests for Datapath Scheduling)”;
[0006] ·(卷号:6610-0035/18-SC-0144)标题为“树遍历的特定于查询的行为修改(Query-Specific Behavioral Modification of Tree Traversal)”;
[0007] ·(卷号:6610-0036/18-SC-0145)标题为“保守水密射线三角交点(Conservative Watertight Ray Triangle Intersection)”;
[0008] ·(卷号:6610-0037/18-SC-0149)标题为“用于处理无序不透明和阿尔法射线/图元交点的方法(Method for Handling Out-of-Order Opaque and Alpha Ray/Primitive Intersections)”;以及
[0009] ·(卷号:6610-0039/18-AU-0170)标题为“硬件中树遍历机制的前向进展和可编程超时的方法(Method for Forward Progress and Programmable Timeouts of Tree Traversal Mechanisms in Hardware)”。

技术领域

[0010] 本技术涉及多处理器-协处理器接口。在一个特定应用中,该技术涉及计算机图形处理的硬件加速,包括但不限于光线追踪。更具体地,本文的示例性非限制性技术涉及基于硬件的遍历协处理器,其有效地遍历加速数据结构,例如,用于实时光线追踪。

背景技术

[0011] 如果你在你之前环顾视觉场景,你会注意到你看到的一些最有趣的视觉效果是由光线与表面相互作用产生的。这是因为光是我们看到的唯一东西。我们看不到对象-我们看到的是对象反射或折射的光。我们可以看到的大多数对象都反射光(对象的颜色由对象反射哪部分光和吸收哪部分光确定)。闪亮的表面,诸如金属表面、光泽表面、陶瓷、液体表面和其他各种对象(甚至是人眼的角膜)都可以作为镜面反射光的镜子。例如,闪亮的金属表面将以与其碰撞(hit)表面时相同的角度反射光。对象还可以通过防止光线到达相对于光源为对象后面的其他表面来投射阴影。如果你环顾四周,你会注意到反射的数量和种类以及阴影的数量、种类和长度取决于许多因素,包括场景中光的数量和类型。单个点光源(例如单个遥远的灯泡)将产生单次反射和硬阴影。面光源(诸如窗户或光板)产生不同种类的反射高光和更柔和的阴影。多个光通常会产生多个反射和更复杂的阴影(例如,三个分离的点光源将产生三个阴影,这些阴影可以根据光相对于对象的位置而重叠)。
[0012] 如果你在调查场景时移动你的头部,你会注意到反射在位置和形状上发生变化(阴影也一样)。通过改变你的视点,你可以改变你的眼睛检测到的光线的不同角度。这种情况瞬间发生-你移动你的头部则立即改变视觉场景。
[0013] 喝一杯茶的简单行为是复杂的视觉体验。在你反射房间内的每个光之前,桌子上有光泽的陶瓷杯的各个光泽表面,杯子为每个光投下阴影。杯子中茶的移动表面本身是反光的。你可以看到茶叶表面上的光的小反射图像,甚至是茶叶表面部分的较小反射,在该处液体向上弯曲以与杯壁相交。杯壁还将阴影投射到杯子中的液体表面上。将杯子举到你的嘴处会导致这些反射和阴影随着你的视点的变化而移动和闪烁,并且随着液体表面因运动而变得波动而移动和闪烁。
[0014] 我们认为这些复杂的反射和阴影是理所当然的。我们的大脑擅长解码阴影和反射的位置、大小和形状,并将它们用作视觉线索。这部分地是我们如何辨别对象相对于彼此的位置、我们如何区分一个对象与另一个对象以及我们如何了解对象的构成。不同的对象表面反射不同。硬金属的镜面(镜子类型)反射创建反射对象的图像,而粗糙表面的漫反射负责颜色并以更柔和的方式照亮对象。根据光照的类型,阴影可以是柔和的、漫射的或硬的和不同的,阴影的长度和方向将取决于光线相对于对象和我们眼睛的角度。
[0015] 初学艺术家通常不会尝试显示反射或阴影。他们倾向于绘制没有阴影、没有反射或高光的平面场景。过去的计算机图形也是如此。
[0016] 在过去的30年中,实时计算机图形已经取得了巨大的进步。随着20世纪80年代功能强大的图形处理单元(GPU)的发展,通过提供3D硬件图形管线,实时响应于用户输入基于纹理映射的多边形图元生成3D图形显示成为可能。这种实时图形处理器建立在称为扫描变换光栅化的技术之上,该技术是从单个点或透视图确定可见性的手段。使用这种方法,三维对象从几何图元构成的表面建模,通常是多边形(诸如三角形)。扫描变换过程建立图元多边形顶点并将其投影到视图平面上,并填充图元边缘内部的点。参见例如Foley,Van Dam,Hughes等,计算机图形:原理与实践(Computer Graphics:Principles and Practice)(第2版,Addison-Wesley 1995和第三版,Addison-Wesley 2014)。
[0017] 长期以来,硬件一直用于确定每个多边形表面应如何着色和纹理映射,以及光栅化着色的、纹理映射的多边形表面以供显示。典型的三维场景通常由数百万个多边形构成。快速的现代GPU硬件可以实时响应于用户输入有效地处理用于每个显示帧(每1/30或1/60秒)的数百万个图元。得到的图形显示已经用于各种实时图形用户界面,包括但不限于增强现实、虚拟现实、视频游戏和医学成像。但传统上,这种交互式图形硬件尚无法准确地建模和描绘反射和阴影。
[0018] 一些已经在该基本扫描变换光栅化方法上构建了其他技术,以允许实时图形系统在渲染阴影和反射时实现一定量的真实感。例如,纹理映射有时用于模拟3D场景中的反射和阴影。通常完成其的一种方法是从不同视角变换、投影和光栅化对象,将光栅化结果写入纹理映射,并对纹理映射进行采样以提供反射映射、环境映射和阴影。虽然这些技术已被证明是有用且适度成功的,但它们并不是在所有情况下都能很好地工作。例如,所谓的“环境映射”通常可能需要假设环境距离对象无限远。另外,环境映射对象通常可能无法反射自身。参见例如http://developer.download.nvidia.com/CgTutorial/cg_tutorial_chapter07.html。这些限制的结果是因为传统的计算机图形硬件-虽然足够快以实现出色的多边形渲染-但却无法执行精确逼真的反射和阴影所需的光可视化。有些人将反射和阴影的光栅/纹理近似比作AM收音机的视觉等效物。
[0019] 存在另一种图形技术,其确实执行了用于反射和阴影的物理上真实的可见性确定。它被称为“光线追踪”。光线追踪是在20世纪60年代末开发出来的,并在20世纪80年代得到了改进。参见例如Apple,“一些用于固体的着色机器渲染的技术(Some Techniques for Shading Machine Renderings of Solids)”(SJCC 1968)第27-45页;Whitted,“用于着色显示的改进的照明模型(An Improved Illumination Model for Shaded Display)”第343-349页,ACM通讯第23卷第6期(1980年6月);以及Kajiya,“渲染方程(The Rendering Equation)”,计算机图形学(SIGGRAPH 1986会议记录,第20卷,第143-150页)。从那时起,光线追踪已经用于非实时图形应用,例如设计和电影制作。任何看过“多莉去哪儿(Finding Dory)”(2016)或其他皮克斯动画电影的人都看到了计算机图形的光线追踪方法的结果-即逼真的阴影和反射。参见例如Hery等人,“在皮克斯处迈向双向路径追踪(Towards Bidirectional Path Tracing at Pixar)”(2016)。
[0020] 光线追踪是在各种渲染算法中使用的图元,包括例如路径追踪和梅特波利斯(Metropolis)光照传输。在示例算法中,光线追踪通过对穿过场景的光传输进行建模以使用射线光学计算所有全局效果(包括例如来自闪亮表面的反射)来模拟光的物理学。在光线追踪的这种使用中,当光线从可能多个光源到视点穿过三维场景时,可以尝试追踪数百或数千个光线中的每一个。通常,这些光线穿过场景相对于眼睛进行追踪,并针对场景中所有几何形状的数据库进行测试。光线可以从光向前追踪到眼睛,或从眼睛向后追踪到光,或者可以追踪它们以查看从虚拟相机开始以及从眼睛开始的路径是否具有清晰的视线。该测试确定最近的交点(以便确定眼睛可见的是什么)或者从对象表面朝向光源追踪光线以确定空间中是否存在阻止光传输到该点的任何干预。因为光线与现实中的光线相似,所以它们提供了许多真实的效果,使用过去三十年来实现的基于光栅的实时3D图形技术是不可能实现该效果的。因为来自场景内每个光源的每个照射光线在穿过场景中的每个对象时被评估,所以得到的图像看起来好像是在现实中拍摄的。因此,这些光线追踪方法长期以来一直用于专业图形应用,例如设计和电影,其中它们已经成为基于光栅的渲染的主导。
[0021] 光线追踪的主要挑战通常是速度。光线追踪要求图形系统针对每个帧计算和分析入射到构成场景的每个表面(并且可能由其反射)的数百万条光线中的每一条。过去,这种大量的计算复杂性是不可能实时执行的。
[0022] 现代GPU 3D图形管线在渲染着色的纹理映射表面处如此快速的一个原因是它们有效地使用了相干性。在传统的扫描变换中,假设所有一切都通过公共图像平面中的公共窗口观察并向下投射到单个有利点。每个三角形或其他图元通过图形管线发送并覆盖一些像素。可以为从该三角形渲染的所有像素共享所有相关计算。因此,对应于穿过窗口的相干视线的像素的矩形图块可以对应于在同一流式处理器中以锁步方式运行的线程组。假设落在三角形边缘之间的所有像素被假设是运行相同着色器的相同材料,并从相同纹理获取相邻的纹素组。相反,在光线追踪中,光线可以在公共点(光源或虚拟相机镜头)处开始或结束,但是当它们在场景中传播并与不同材料相互作用时,它们很快发散。例如,每条光线执行搜索以找到最近的对象。可以执行一些高速缓存和结果共享,但由于每条光线可能会碰到不同的对象,因此GPU传统上利用的、与纹理映射、着色三角形有关的相干性类型不存在(例如,不存在一个共同的有利点、窗口和图像平面用于光线追踪)。这使得光线追踪在计算上比其他图形方法更具挑战性-因此在交互的基础上执行起来要困难得多。
[0023] 已经进行了许多研究以使得追踪光线的过程更加有效和及时。参见例如,Glassner,光线追踪介绍(Ray Tracing Introduction)(Academic Press Inc.,1989)。因为光线追踪中的每条光线本质上独立于其余光线进行评估,所以光线追踪被称为“令人尴尬地平行”。参见例如 等人,实时渲染在章节9.8.2,412页(第三版.CRC出版社2008)。如上所述,光线追踪涉及针对场景中的所有对象和表面有效地测试每条光线。
称为“加速数据结构”和相关过程的优化允许图形系统在加速数据结构上使用“分而治之(divide-and-conquer)”的方法来建立光线碰撞的表面以及光线未碰撞的表面。每条光线以个性化的方式遍历加速数据结构。这意味着将更多处理器专用于光线追踪可以提供近乎线性的性能提升。随着图形处理系统的并行性的增加,一些人开始设想可以实时执行光线追踪的可能性。例如,2000年中期在萨尔州大学的工作产生了一个早期的用于交互式光线追踪的专用硬件系统,其为使用几何着色器、顶点着色器和光照着色器提供了一定程度的可编程性。参见Woop等人的“RPU:用于实时光线追踪的可编程光线处理单元(RPU:A Programmable Ray Processing Unit for Real Time Ray Tracing)”(ACM 2005)。作为另一示例,先进的渲染技术基于源自ARM1的AR250/350渲染处理器阵列开发了“RenderDrive(渲染器驱动)”,并通过自定义管线进行增强,以用于光线/三角形相交和SIMD向量和纹理数学,但没有固定功能遍历逻辑。参见例如http://www.graphicshardware.org/previous/www_2001/presentations/Hot3D_Daniel_Hall.pdf。
[0024] 然后,在2010年,NVIDIA利用NVIDIA GPU和其他高度并行架构的高并行度来开发OptiXTM光线追踪引擎。参见Parker等人的“OptiX:通用光线追踪引擎(OptiX:A General Purpose Ray Tracing Engine)”(ACM Transactions on Graphics,Vol.29,No.4,Article TM66,July 2010)。除了API(应用程序编程接口)的改进之外,OptiX 提供的一项改进是改进用于查找光线和场景几何形状之间的交点的加速数据结构。这种加速数据结构通常是由光线追踪遍历算法使用的空间或对象分层,以有效地搜索可能与给定光线相交的图元。
OptiXTM提供了许多不同的加速结构类型,可供应用程序选择。节点图中的每个加速结构可以是不同的类型,允许高质量静态结构与动态更新的静态结构的组合。
[0025] OptiXTM可编程光线追踪管线提供了显着的进步,但是通常仍然无法在相对便宜的计算平台上为复杂的3D场景提供对用户输入的实时交互响应。从那时起,NVIDIA一直在开发用于光线追踪的硬件加速能力。参见例如US9,582,607;US 9,569,559;US20160070820以及US20160070767。
[0026] 鉴于用于响应于例如用户输入渲染任意复杂度的高质量图像的真实交互式实时光线追踪图形处理系统的巨大潜力,进一步的工作是可能的并且是期望的。

附图说明

[0027] 图1示出了示例性非限制性光线追踪图形系统。
[0028] 图2A示出了示例性镜面对象。
[0029] 图2B示出了包围盒(Bounding Volume)内的示例性对象。
[0030] 图2C示出了图2B的包围盒的示例性盒细分。
[0031] 图2D、图2E和图2F示出了包围盒的盒细分的示例性进一步水平,以创建层次包围盒(BVH)。
[0032] 图2G示出了由图元表面组成的对象的示例部分,在这种情况下是三角形。
[0033] 图3A-图3C示出了用于确定光线是否穿过包含几何形状的包围盒以及光线是否与几何形状相交的示例性简化光线追踪测试。
[0034] 图4示出了示例性光线追踪流程图。
[0035] 图5A-图5C示出了示例性不同的光线-图元相交场景。
[0036] 图6A和图6B示出了纹理映射如何影响光线-图元相交结果的示例。
[0037] 图7A和图7B示出了光线实例变换。
[0038] 图8A示出了示例性非限制性层次包围盒(BVH)。
[0039] 图8B示出了图形或树状的示例性加速数据结构。
[0040] 图9示出了包括树遍历单元(TTU)的简化示例性非限制遍历协处理器。
[0041] 图10A示出了示例性非限制性光线追踪着色管线流程图。
[0042] 图10B和图10C示出了更详细的光线追踪管线。
[0043] 图11A示出了根据一些示例性实施例的多处理器(例如,GPU的流式多处理器)使用多处理器-协处理器接口来执行协处理器(例如,遍历加速器)上的目标操作的示例过程。
[0044] 图11B示出了响应于由图11A的多处理器执行的过程可以在协处理器上执行的过程的流程图。
[0045] 图12示出了根据一些示例性实施例的活动流程图,其进一步示出了当使用关于图11A描述的多指令序列时,多处理器和协处理器上的指令和执行的动作之间的时间关系。
[0046] 图13是根据一些示例性实施例的示出在多处理器-协处理器接口处的指令级抢占的流程图。
[0047] 图14A是根据一些示例性实施例的发出关于图11A描述的多指令序列的适应形式的过程的流程图。
[0048] 图14B和图14C示出了根据一些示例性实施例的从协作处理器输出的结果,其用于在子组线程中返回到多处理器寄存器的一组线程。
[0049] 图15示出了根据一些示例性实施例的包括多处理器和协处理器之间的接口的系统。
[0050] 图16示出了用于生成图像的示例性流程图。
[0051] 图17示出了示例性并行处理单元(PPU)。
[0052] 图18示出了示例性存储器分区单元。
[0053] 图19示出了图17的并行处理单元内的示例通用处理集群(GPC)。
[0054] 图20是由图19的GPC实现的图形处理管线的概念图。
[0055] 图21和图22示出了示例性流式多处理器。
[0056] 图23是使用图17的PPU实现的处理系统的概念图。
[0057] 图24展开图23以示出另外的互连设备。

具体实施方式

[0058] 本文的技术提供硬件能力,其将光线追踪加速到这样的程度,即它将光线追踪的能力带到游戏和其他交互式实时计算机图形,最初在阴影和反射中实现高效质量并最终实现全局照明。在实践中,这意味着通过相同图形渲染系统上的软件可能达到的数量级的因子或更高的因子来加速光线追踪。
[0059] 更详细地,示例性非限制性技术提供了用于加速光线追踪的专用硬件。在非限制性实施例中,硬件协处理器(本文称为“遍历协处理器”或在一些实施例中称为“树遍历单元”或“TTU”)加速支持交互式光线追踪的某些过程,包括光线-包围盒相交测试、光线-图元相交测试和光线“实例”变换。
[0060] 在一些非限制性实施例中,遍历协处理器对加速数据结构执行查询,以用于在潜在大规模并行流式多处理器(SM)上运行的进程。遍历协处理器遍历加速数据结构以发现关于给定光线如何与加速数据结构描述或表示的对象交互的信息。对于光线追踪,与例如在运行不同类型的线程(例如,顶点线程和像素线程)的逻辑管线阶段之间执行一次操作的固定功能单元相比,遍历协处理器是可调用的。
[0061] 在一些非限制性实施例中,加速数据结构包括递归地封装越来越小的包围盒细分的包围盒的层次(层次包围盒或BVH)。最大容量的包围盒可以称为“根节点”。包围盒的这种层次的最小细分(“叶节点”)包含项目(item)。项目可以是定义对象表面的图元(例如,诸如三角形的多边形)。或者,项目可以是球体,其包含作为项目存在的全新级别的世界,因为它尚未添加到BVH(想想猫身上的衣领魅力来自“黑衣人”,其中包含它里面的整个微型星系)。如果项目包括图元,则遍历协处理器针对图元测试光线,以确定与光线相交的对象表面以及沿着光线可见的对象表面。
[0062] 遍历协处理器针对宽范围的包围盒执行每条光线的测试,并且可以剔除不与该光线相交的任何包围盒。从界定场景中所有一切的根节点开始,遍历协处理器针对较小(可能重叠)的子包围盒测试每条光线,这又界定了BVH的后代分支。光线跟随光线碰撞其他节点的包围盒的子指针,直到达到BVH的叶或终端节点(盒)。一旦遍历协处理器遍历加速数据结构以到达包含几何图元的终端或“叶”节点,它就执行加速的光线-图元相交测试,其确定光线是否与该图元相交(因此与图元定义的对象表面相交)。光线图元测试可以提供有关与光线相交的图元的附加信息,其可用于确定着色和可视化所需的表面的材料属性。通过加速数据结构的递归遍历使得遍历协处理器能够发现与光线相交的所有对象图元,或者与光线相交的最接近的(从视点的角度看)图元(在某些情况下,它是沿着光线的视点唯一可见的图元)。
[0063] 遍历协处理器还加速每条光线从世界空间到对象空间的变换,以获得图元的越来越精细的包围盒封装,并减少场景上的那些图元的复制。在场景中不同位置、方向和比例下多次复制的对象可以在场景中表示为实例节点,其将世界空间BVH中的包围盒和叶节点与可以应用于世界空间光线的变换相关联,以将其变换为对象坐标空间,以及表示为指向对象空间BVH的指针。这避免了在世界空间中多次复制对象空间BVH数据,从而节省了存储器和相关的存储器访问。实例变换通过将光线变换为对象空间而不是要求将几何形状或层次包围盒变换为世界(光线)空间来提高效率,并且还与图形处理执行的以使图元可视化的附加的传统光栅化过程兼容。
[0064] 因此,目前公开的某些非限制性实施例提供了遍历协处理器,3D图形处理管线中的一个或一组流式多处理器SM的新子单元。为了理解遍历协处理器在整体图片中适合的位置,理解大多数或所有现代光线追踪器所采用的算法的一些基本原理可能会有所帮助。但是应该指出的是,本文的技术提供了一种通用能力,用于为在GPU中运行的线程确定沿着指定方向从给定点开始的最近的可见事物,或者两个点之间是否有任何东西。这种能力的一个常见用例是在开始追踪来自已经在三角形上光栅化的点的光线的过程中使用传统扫描变换技术。所公开的技术可以但不一定取代或替代扫描变换技术,并且通常可以增强它并且与扫描变换技术结合使用以增强图像的照片般真实的反射、阴影和其他效果。
[0065] 光线追踪技术
[0066] 通常,光线追踪是一种渲染方法,其中光线用于确定场景中各种元素的可见性。光线追踪可用于确定沿光线是否有任何对象可见(例如,测试几何图元上的阴影点与光源上的点之间的遮挡物),并且还可用于评估反射(例如,可以涉及执行遍历以确定沿着视线的最近的可见表面,使得在流式处理器上运行的软件可以评估与被碰撞的内容相对应的材料着色功能-这反过来可以根据相交的对象的材料特性发射一条或更多条附加光线到场景中),以确定沿着光线返回眼睛的光。在经典的Whitted式光线追踪中,光线从视点通过像素网格射入场景,但其他路径遍历也是可能的。通常,针对每条光线,找到最近的对象。然后可以通过将光线从其射到场景中的每个光源并且发现其间是否有任何对象来确定该交点被照亮或处于阴影中。不透明对象阻挡光线,而透明对象则会使光线衰减。其他光线可以从交点产生。例如,如果相交表面是有光泽的或镜面的,则在反射方向上产生光线。光线可以接受相交的第一个对象的颜色,而其又测试阴影的交点。递归地重复该反射过程,直到达到递归限制或后续反弹的潜在贡献低于阈值。也可以在透明固体对象的折射方向上产生光线,并再次递归地评估。参见上文引用的 等人。因此,光线追踪技术允许图形系统开发物理上正确的反射和阴影,其不遭受扫描变换技术的限制和伪影。
[0067] 遍历协处理器
[0068] 遍历协处理器执行的基本任务是针对场景中的所有图元(在一个实施例中通常是三角形)测试光线,并报告最接近的碰撞(根据沿光线测量的距离)或简单地报告遇到的第一(不一定最近)碰撞,这取决于用例。简捷算法将是O(n)强力搜索。然而,通过预先处理场景几何形状并提前构建合适的加速数据结构,可以将平均情况复杂度降低到O(log n)。在光线追踪中,当使用加速数据结构时,找到光线最接近(或针对阴影任何)交点的时间通常是n个对象的阶数O(log n)。例如,通常用于现代光线追踪加速数据结构的类型的层次包围盒(BVH)通常具有O(log n)搜索行为。
[0069] 层次包围盒
[0070] 现代光线追踪器最常使用的加速数据结构是包括嵌入的轴对齐包围盒(AABB)的层次包围盒(BVH)。BVH的叶节点包含要相交测试的图元(例如,三角形)。BVH通常由图形或树形结构数据表示来表示。在这种情况下,遍历协处理器可以称为“树遍历单元”或“TTU”。
[0071] 给定BVH,光线追踪相当于树搜索,其中光线所访问的树中的每个节点具有用于每个后代分支或叶的包围盒,并且光线仅访问其相应包围盒与光线相交的后代分支或叶。通过这种方式,只有少数图元必须明确地进行相交测试,即那些驻留在与光线相交的叶节点中的图元。在示例性非限制性实施例中,遍历协处理器加速树遍历(包括光线-盒测试)和光线-图元测试两者。作为遍历的一部分,遍历协处理器还可以处理“实例变换”-将光线从世界空间坐标系变换为实例网格(对象空间)的坐标系,例如,以便避免将图元顶点变换到世界空间的计算复杂性。它可以以MIMD(多指令,多数据)方式实现,这意味着在遍历协处理器内部一次独立地处理光线。
[0072] 示例的非限制性实时交互式光线追踪系统
[0073] 图1示出了用于使用场景或一个或更多个对象的三维(3D)数据生成图像的示例的实时光线交互式追踪图形系统100。系统100包括输入设备110、一个或更多个处理器120、一个或更多个图形处理单元(GPU)130、存储器140和一个或更多个显示器150。图1中所示的系统可以采用任何形状因素,包括但不限于个人计算机、智能手机或其他智能设备、视频游戏系统、可穿戴虚拟或增强现实系统、基于云的计算系统、车载图形系统,片上系统(SoC)等。
[0074] 处理器120可以是多核中央处理单元(CPU),其可操作以实时交互式响应于输入设备110而执行应用程序,其输出包括用于在显示器150上显示的图像。显示器150可以是任何种类的显示器,例如固定显示器、头戴式显示器(诸如显示器眼镜或护目镜)、其他类型的可穿戴显示器、手持显示器、车载显示器等。例如,处理器120可以基于从输入设备110(例如,操纵杆、惯性传感器、环境光传感器等)接收的输入执行应用程序,并指示GPU 130生成示出应用程序进展的图像以在显示器150上显示。
[0075] 基于处理器120上的应用程序的执行,处理器可以发出用于GPU 130的指令,以使用存储在存储器140中的3D数据生成图像。GPU 130包括用于实时加速图像生成的专用硬件。例如,GPU 130能够实时处理用于数千或数百万个图元(多边形)的信息,这是由于GPU能够比传统软件-驱动的CPU更快地执行重复和高度并行的专用计算任务,例如多边形扫描变换。例如,与处理器120不同,其可具有多个核心,具有可一次处理少量软件线程的大量高速缓存存储器,GPU 130可包括数百或数千个处理核心或并行运行的“流式多处理器”(SM)132。
[0076] 在一个示例性实施例中,GPU 130包括多个可编程流式多处理器(SM)132,以及包括图元引擎134和光栅引擎136的基于硬件的图形管线。GPU 130的这些组件被配置为使用称为“扫描变换光栅化”的技术执行实时图像渲染,以在二维显示器150上显示三维场景。在光栅化中,3D场景的几何构建块(例如,点、线、三角形、四边形、网格等)被映射到显示器的像素(通常通过帧缓冲存储器)。
[0077] GPU 130将3D模型的几何构建块(即,诸如三角形之类的多边形图元)变换为2D图像的像素,并为每个像素分配初始颜色值。图形管线可以通过定义或调整像素的颜色值来将着色、透明度、纹理和/或颜色效果应用于图像的部分。最终像素值可以经过抗锯齿、过滤并提供给显示器150以供显示。多年来,许多软件和硬件的改进使用光栅化技术以一个或更多个显示器150上的高显示分辨率(例如4096x 2160像素或更高)在实时图形(即每秒30至60帧)所需的帧速率下提高了主观图像质量。
[0078] 遍历协处理器添加到架构
[0079] 为了使GPU 130能够以高效的方式实时地执行光线追踪,向GPU提供了耦合到一个或更多个SM 132的遍历协处理器138。遍历协处理器138包括被配置为执行通常在光线追踪算法中利用的操作的硬件组件。遍历协处理器138的目标是将光线追踪中使用的操作加速到这样的程度,即它将光线追踪的能力带到实时图形应用(例如,游戏)中,从而实现高质量的阴影、反射和全局照明。如下面更详细讨论的,遍历协处理器138的结果可以与GPU 130中执行的其他图形相关操作一起使用或作为其替代。
[0080] 在所示的示例性架构中,称为“遍历协处理器”138的新硬件组件用于加速某些任务,包括但不限于光线追踪。光线追踪是指将光线投射到场景中,并确定该光线是否以及在哪儿与场景的几何形状相交。这种基本的光线追踪可见性测试是计算机图形学中作为各种渲染算法和技术基础的基础图元。例如,光线追踪可以与光栅化和z缓冲一起使用或作为光栅化和z缓冲的替代,用于采样场景几何形状。它还可以用作环境映射和阴影纹理的替代(或与之结合),以产生比通过纹理技术或其他光栅“黑客”实现的更逼真的反射、折射和阴影效果。为了克服可以通过光栅化实现的图像质量的限制,系统100还可以使用光线追踪技术生成整个图像或图像的部分。光线追踪也可以用作基本图元,以精确地模拟基于物理的渲染算法中的光传输,例如路径追踪、光子映射、Metropolis光传输和其他光传输算法。
[0081] 更具体地,SM 132和遍历协处理器138可以协作,以将光线投射到3D模型中并确定该光线是否以及在何处与模型的几何形状相交。光线追踪直接模拟穿过虚拟环境或场景的光。光线相交的结果与表面纹理、观察方向和/或光照条件一起用于确定像素颜色值。由与遍历协处理器138一起工作的SM 132执行的光线追踪允许计算机生成的图像以与现实世界的照片或视频无法区分的方式捕获阴影、反射和折射。由于光线追踪技术部分地由于需要追踪的大量光线而比光栅化更加计算密集,因此遍历协处理器138能够在硬件中加速该过程的某些计算密集度更高的方面。
[0082] 在本文的示例非限制性技术中,遍历协处理器138加速光线盒测试和光线图元测试两者。作为遍历的一部分,它还可以处理至少一级实例变换,将光线从世界空间坐标系变换为实例网格的坐标系。在示例非限制性实施例中,遍历协处理器138以MIMD方式完成所有这些操作,这意味着在遍历协处理器内部独立地处理光线一次。
[0083] 在示例非限制性实施例中,遍历协处理器138作为SM(流式多处理器)132的服务方(协处理器)操作。换句话说,在示例非限制性实施例中,遍历协处理器138不独立地操作,而是遵循SM 132的命令以比SM 132自身执行更有效地执行某些计算密集的光线追踪相关任务。
[0084] 在所示的示例中,遍历协处理器138通过SM 132指令接收命令并将结果写回SM寄存器文件。对于许多常见用例(例如,具有至多一级实例化的不透明三角形),遍历协处理器138可以服务于光线追踪查询而无需与SM 132进一步交互。更复杂的查询(例如,除了三角形或多级实例化之外涉及经过α测试的三角形、图元),可能需要多次往返。除了追踪光线之外,遍历协处理器138还能够执行更一般的空间查询,其中AABB或两个AABB(我们称之为“波束”)之间的挤压盒(extruded volume)取代光线。因此,虽然遍历协处理器138特别适合于加速与光线追踪相关的任务,但它也可用于执行除光线追踪之外的任务。
[0085] 除了遍历协处理器138之外,用于支持图1的系统100的示例非限制性技术还为多个单元提供了额外的加速光线追踪增强以及用于BVH构建的大量努力。BVH构建不需要是硬件加速的(尽管在一些非限制性实施例中可以是),而是可以使用在SM 132和/或CPU 120和/或其他开发系统上(例如,在应用程序开发期间)运行的高度优化的软件例程来实现。以下说明描述了遍历协处理器138的软件可见行为、与周围单元(SM 132和存储器子系统)的接口以及作为完整光线追踪解决方案的一部分的附加特征,例如对SM 132组和存储器高速缓存系统的某些增强等。
[0086] 如上所述,遍历协处理器138允许快速遍历加速数据结构(例如,BVH)以确定数据结构中哪些图元(例如,用于生成场景的三角形)与查询数据结构(例如,光线)相交。为了处理在每个场景中进行相交测试的大量光线和图元,某些示例性实施例在SM 132和遍历协处理器138之间提供高效且鲁棒的多处理器-协处理器接口160。
[0087] 例如,某些实施例的多处理器-协处理器接口160使得流式处理器能够通过使用一系列较短指令而不是具有多个操作数的单个宽指令来有效且鲁棒地在遍历协处理器上运行加速结构遍历。不使用“单个宽指令”的动机是,对于大多数处理器设计,特别是通常围绕固定长度指令构建的RISC架构而言,这将是一种侵略性且代价高的变化。某些实施例有助于避免系统低效率,例如每指令完成时间长,这在操作涉及从有限池中分配资源时尤其相关。某些实施例提高了系统实现线程的指令级抢占(preemption)的能力。
[0088] 遍历加速数据结构
[0089] 加速光线追踪的好方法是使用加速数据结构。加速数据结构以有助于快速确定特定光线很可能与之相交的对象的哪个部分以及快速地拒绝光线不会与之相交的场景的大部分的方式表示对象或场景的3D模型。层次包围盒(BVH)数据结构是一种类型的加速数据结构,其可以帮助减少要测试相交的数量。BVH数据结构表示具有包围盒的场景或对象,并将包围盒细分为越来越小的包围盒,其终止于包含几何图元的叶节点。包围盒是分层的,这意味着最高级别(level)包含它下面的级别,该级别包含它下面的下一级别,依此类推。在一个实施例中,叶节点可能潜在地与层次包围盒中的其他叶节点重叠。
[0090] 为了说明层次包围盒如何工作,图2A-图2G示出了递归地细分为越来越小层次的包围盒的茶壶。图2A示出了茶壶对象,图2B示出了包围整个茶壶的包围盒202(在这种情况下是盒子、立方体或长方体)。可以通过其顶点有效地限定的包围盒202提供对象的空间位置的指示,并且通常尺寸略大于对象。
[0091] 加速结构构造的第一阶段获取所引用几何形状的包围盒。这是通过对对象中的每个几何图元执行包围盒程序来实现的,该包围盒程序返回其输入图元的保守轴对齐包围盒,例如图2B中所示的盒202。使用这些包围盒作为加速结构的基本图元,提供了针对任意用户定义的几何形状(包括单个结构内的几种类型的几何形状)追踪光线的必要抽象。因为在图2B中,包围盒202大于并且完全包含茶壶,不与包围盒相交的光线不能与茶壶相交,尽管与包围盒相交的光线可能或可能不与茶壶相交。因为包围盒202容易由其在3D空间中的顶点的x,y,z坐标定义,并且光线由其在3D空间中的x,y,z坐标定义,所以用于确定光线是否与包围盒202相交的光线-包围盒测试是简单的(尽管可以使用一些变换来调整到不同的坐标系,如下面将解释的)。
[0092] 图2C示出了细分为较小的内含(contained)包围盒的包围盒202。虽然为了说明的目的而在此示出的细分方案是所谓的8进制细分或“八叉树”,其中每个盒被细分为八个统一尺寸的较小盒,许多其他空间层次和细分方案是已知的,例如二进制树、四进制树、k-d树、二进制空间分区(BSP)树和层次包围盒(BVH)树。参见例如USP 9,582,607。
[0093] 图2C中所示的每个细分的包围盒可以进一步细分。图2D示出了图2C的细分盒204中的一个被进一步细分以提供额外细分的封装的包围盒。如图2D所示,一些细分的包围盒包括茶壶的部分而一些不包括。不包含茶壶的部分的盒不会进一步细分,因为进一步的细分不提供关于茶壶的进一步空间信息。已经细分的包含茶壶的至少一部分的包围盒可以进一步递归地细分-就像Seuss博士的帽子里的猫回来啦(1958年)的帽子里出现的一连串越来越小的猫一样。包含几何形状的包围盒202内的空间的部分被递归地细分,以允许遍历协处理器138使用盒细分来有效地发现几何形状相对于任何给定光线的位置。可以注意到,虽然盒的空间细分或主动细分是可能的,但许多实现将创建提前定义盒和子盒的层次结构。在这种情况下,构建器通常可以从各个三角形向上构建层次,而不是从整个场景向下构建。
向上构建意味着你不需要确定某个细分的盒是否包含任何内容,因为根据定义它包含在盒细分层次中位于其下面的内容。
[0094] 图2E示出了另外的这样的包围盒204细分为另一个较小的内含包围盒206,该包围盒206在该示例中仅包含茶壶的壶嘴加上茶壶的壁上的另一个表面,并且图2F示出了将包围盒206附加细分为更小的内含细分208,该细分208封装茶壶的壶嘴的末端。取决于构建BVH的方式,可以根据需要不断更进一步细分包围盒208-并且遍历协处理器138使图1系统100能够有效地将BVH向下遍历到任何任意细分级别。递归细分的数量和配置将取决于被建模的3D对象的复杂性和配置以及其他因素,例如期望的分辨率、对象距视点的距离等。
[0095] 在某些细分级别(对于BVH的不同部分可以是不同级别),遍历协处理器138遇到构成被建模的封装对象的几何形状。使用树的类比,连续的盒细分是树干、分枝、树枝和细枝,并且最终在树的尖端即叶上显示几何形状。在这种情况下,图2G显示了由几何图元的示例性网格定义的茶壶壶嘴的表面。所示的几何图元是三角形,但是可以使用其他几何图元,例如四边形、线条、矩形、二次曲面、补丁或熟悉现有技术的人所知的其他几何图元(在一个实施例中,这样的其他类型的图元可以表示为或变换为三角形)。网格中的几何图元表示被建模的对象的3D表面的形状。此处示出的示例是网格,但是所包围的几何形状可以包括不连续的几何形状,例如可能未连接的粒子。在示例性非限制性实施例中,遍历协处理器138还利用该几何形状加速光线相交测试,以快速确定任何给定光线碰撞哪个三角形。确定光线-图元相交包含将每个图元的顶点的空间xyz坐标与光线的xyz坐标进行比较,以确定图元定义的光线和表面是否占据相同的空间。光线-图元相交测试可能是计算密集型的,因为可能要测试许多三角形。例如,在图2G所示的网格中,仅茶壶的壶嘴由超过一百个三角形组成-尽管在一些实现方式中可以更有效地进一步进行盒细分,从而限制在任何此类“叶节点”到类似16或更少的东西的三角形的数量。
[0096] 如上所述,光线追踪程序确定场景的什么几何图元与光线相交。然而,由于3D场景中的大量图元,测试每个几何图元的相交可能不是有效或可行的。加速数据结构(例如BVH)允许快速确定哪些包围盒可以被忽略,哪些包围盒可以包含相交的几何图元,以及哪些相交的几何图元对于可视化而言是重要的而哪些不是。
[0097] 光线相交测试
[0098] 图3A-图3C示出了应用于包括三角形网格320的图2G包围盒208的光线追踪。图3A示出了包括包围盒310和315的虚拟空间中的光线302。为了确定光线302在网格320中是否与一个或更多个三角形相交,每个三角形可以直接针对光线302进行测试。但是为了加速该过程(因为该对象可以包含数千个三角形),首先针对包围盒310和315测试光线302。如果光线302不与包围盒相交,则它不与包围盒内部的任何三角形相交,并且可以针对该光线忽略包围盒内部的所有三角形。因为在图3A中,光线302未碰撞(miss)了包围盒310,所以不需要对该包围盒内的网格320的三角形进行相交测试。虽然包围盒315与光线302相交,但是包围盒315不包含任何几何形状,因此不需要进一步的测试。
[0099] 另一方面,如果光线(诸如图3B中所示的光线304)与包含几何形状的包围盒310相交,则光线可能与或可能不与包围盒内的几何形状相交,因此需要对几何形状本身执行进一步的测试以找到可能的相交。因为图3B和图3C中的光线304、306与包含几何形状的包围盒310相交,所以需要执行进一步的测试以确定包围盒内部的任何(以及哪些)图元是否相交。在图3B中,对与图元的相交的进一步测试将指示即使光线304穿过包围盒310,它也不与包围盒所包围的任何图元相交(或者,如上所述,包围盒310可以进一步进行盒细分,以便可以使用包围盒相交测试来揭示光线不与任何几何形状相交,或者更具体地,光线可以与哪些图元相交)。
[0100] 图3C示出了包围盒310与光线306相交并且包含与光线306相交的几何形状的情况。遍历协处理器138测试光线306和各个图元之间的相交,以确定光线与哪些图元相交。
[0101] 光线追踪操作
[0102] 图4是概述遍历协处理器138如上所述与一个或更多个SM 132协作执行的示例性光线追踪操作的流程图。图4的操作由遍历协处理器138和与其交互的SM 132协作执行。因此,遍历协处理器138可以从SM 132接收光线的标识,并且遍历状态列举光线必须穿过的一个或更多个BVH中的一个或更多个节点。遍历协处理器138确定光线与BVH数据结构的哪些包围盒(“光线-complet”测试512)相交,并随后确定光线是否与相交的包围盒中的一个或更多个图元相交以及与哪些三角形相交(“光线-图元测试”520)。在示例性非限制性实施例中,“complets”(压缩小树)指定层次包围盒的根节点或内部节点(即,盒),其具有子项(child),子项是其他complet或每个complet的单个类型的叶节点。
[0103] 首先,遍历协处理器138检查光线的遍历状态。如果遍历协处理器138保持用于光线的堆栈为空,则遍历完成。如果堆栈顶部存在条目,则遍历协处理器138向存储器子系统发出请求以检索该节点。然后,遍历协处理器138执行包围盒测试512以确定BVH数据结构的包围盒是否与SM 132指定的特定光线相交(步骤512、514)。如果包围盒测试确定包围盒未与光线相交(步骤514中为“否”),则不需要对可视化执行任何进一步测试,并且遍历协处理器138可以将该结果返回到请求SM 132。这是因为如果光线未碰撞包围盒(如图3A中关于包围盒310),则光线将不会碰撞被测试的包围盒内的所有其他更小包围盒以及包围盒包含的任何图元。
[0104] 如果由遍历协处理器138执行的包围盒测试显示包围盒与光线相交(步骤514中为“是”),则遍历协处理器确定包围盒是否可以细分为更小的包围盒(步骤518)。在一个示例性实施例中,遍历协处理器138本身不一定执行任何细分。相反,BVH中的每个节点具有一个或更多个子节点(其中每个子节点是BVH中的叶或分支)。对于每个子节点,都有一个包围盒和一个指向分支或叶节点的指针。当光线使用遍历协处理器138处理节点时,它正在针对节点的子节点的包围盒测试自身。光线只将堆栈条目推送到其堆栈上,用于那些其代表性包围盒被碰撞的分支或叶。当光线在示例性实施例中获取节点时,它不测试节点的包围盒-它针对节点的子节点的包围盒进行测试。遍历协处理器138按照由光线配置确定的顺序将其包围盒被光线碰撞的节点推送到光线的遍历堆栈上。例如,可以按照节点在存储器中出现的顺序或者按照它们沿着光线的长度出现的顺序或以某种其他顺序将节点推送到遍历堆栈。如果存在包围盒的进一步细分(步骤518中为“是”),则访问包围盒的那些进一步细分,并且对每个得到的细分包围盒执行包围盒测试,以确定哪个细分包围盒与光线相交以及哪个不与光线相交。在该递归过程中,可以通过测试514消除一些包围盒,而其他包围盒可以导致通过遍历协处理器138递归地应用步骤512-518来对越来越进一步的细分进行相交测试。
[0105] 一旦遍历协处理器138确定与光线相交的包围盒是叶节点(步骤518中为“否”),遍历协处理器执行图元(例如,三角形)相交测试520,以确定光线是否与相交的包围盒中的图元相交以及光线与哪些图元相交。因此,遍历协处理器138执行相交的后代分支节点的深度优先遍历,直到到达叶节点。遍历协处理器138处理叶节点。如果叶节点是图元范围,则遍历协处理器138针对光线测试它们。如果叶节点是实例节点,则遍历协处理器138应用实例变换。如果叶节点是项目范围,则遍历协处理器138将它们返回到请求SM 132。在示例性非限制性实施例中,SM 132可以命令遍历协处理器138执行不同种类的光线-图元相交测试并取决于来自应用程序(或应用程序在其上运行的软件堆栈)的操作报告不同的结果,并由SM中继到TTU。例如,SM 132可以命令遍历协处理器138报告由相交测试揭示的最近的可见图元,或者报告与光线相交的所有图元,而不管它们是否是最近的可见图元。SM 132可以将这些不同的结果用于不同类型的可视化。一旦遍历协处理器138完成处理叶节点,就可以有其他分支节点(先前推送到光线的堆栈上)进行测试。
[0106] 多个相交
[0107] 更详细地,如图3C所示,任何给定的光线可以与包围盒内的多个图元相交。给定图元内的光线相交是否对可视化产生影响取决于该图元的属性和位置以及SM 132正在执行的可视化过程。例如,图元可以是不透明的、透明的或部分透明的(即半透明的)。不透明的图元将阻挡光线穿过图元,因为眼睛无法透过图元的不透明表面看到。透明图元将允许光线通过(因为眼睛可以透过透明图元看到),但情况可能更复杂。例如,透明图元可能具有镜面特性,这会导致光线的某些部分反射(考虑来自窗玻璃的反射),光线的其余部分通过。其他透明图元用于提供纹理映射到的表面。例如,树的每个个体的叶可以由透明图元建模,叶的图像被纹理映射到该透明图元上。
[0108] 图5A-图5C示出了使用三个三角形的示例的一些场景,这三个三角形被假设在相同的包围盒中并且每个三角形与光线相交。图5A示出了朝向这三个三角形的光线,其中光线相对于不透明的视点遇到第一个三角形。因为“前方”(从眼睛的光线方向看)相交的三角形是不透明的,所以三角形将阻挡光线,因此光线也不会到达其他三角形,即使光线在空间上与它们相交。在该示例中,在识别出不透明三角形的相交之后,可以忽略(剔除)从视点看的不透明三角形“后面”的三角形,因为“前”不透明三角形沿着光线隐藏了用户视图中的其他三角形。在图5A-图5C中用虚线表示剔除。在这种情况下,遍历协处理器138可能仅需要向SM 132报告第一不透明三角形的标识。
[0109] 图5B示出了指向相同三个三角形的光线,但是现在最近的可见三角形是部分透明的而不是不透明的。因为最近的可见相交三角形是至少部分透明的,所以光线可以穿过它以碰撞它后面的不透明三角形。在这种情况下,不透明的三角形将通过部分透明的三角形可见,但会阻挡用户沿着光线的第三三角形的视野。本文,遍历协处理器138可以向SM 132报告两个前面三角形的标识,但是不报告第三个被剔除的三角形,即使光线在空间上与该第三三角形相交。在本文发现顺序可能很重要。在α和不透明三角形的情况下,如果首先发现不透明,则遍历协处理器138将不透明三角形返回到具有遍历状态的SM 132,该遍历状态将在α三角形处重新开始测试。虽然本文暗示α意味着透明,但它实际上意味着“将我返回到SM 132并让SM决定如何处理它。”例如,可以根据纹理或函数修剪α三角形,以便三角形的部分被切掉(即,不存在、不透明)。遍历协处理器138不知道SM 132将如何处理α三角形(即,它不处理与修剪的三角形不同的透明三角形)。因此,α三角形可能阻挡或可能不阻挡或着色沿着光线从点到达它们之外的光,并且在示例性实施例中,它们需要SM 132干预来处理/确定那些事物。
[0110] 图5C示出了光线遇到的前两个三角形是部分透明的场景。因为第一和第二相交三角形是至少部分透明的,所以光线将穿过第一和第二三角形以照射在也相交的第三不透明三角形上。因为第三个相交的三角形是不透明的,它将阻挡光线,并且光线不会照射在第三个三角形后面的任何其他三角形上,即使它们可能在空间上与光线相交。在这种情况下,遍历协处理器138可以将所有三个三角形报告给SM 132,但不需要报告不透明三角形后面的任何其他三角形,因为不透明三角形阻挡光线到达那些附加三角形。
[0111] 然而,在一些模式中,SM 132可能需要知道与光线相交的所有三角形的身份,而不管它们是不透明的还是透明的。在那些模式中,遍历协处理器138可以简单地执行相交测试并返回光线在空间上与之相交的所有三角形的身份(在这种模式中,遍历协处理器将返回图5A-图5C中所示的所有三种情形的相同相交结果),并允许SM 132对其进行分类-或者在某些情况下命令遍历协处理器138对这些相同的三角形进行更多测试。
[0112] 如下面将更详细讨论的,当光线与不透明三角形相交时,遍历协处理器138可以在某些操作中被编程以将被测光线的长度减小到不透明三角形相交的位置,因此它将不报告相交三角形“后面”的任何三角形。当确定部分透明三角形与光线相交时,遍历协处理器138将返回光线照射到的更完整的三角形列表以用于可视化,并且请求SM 132可以执行进一步处理以基于例如三角形的任何纹理或其他属性确定光线是否将被阻挡、传递或部分传递以及部分反射。在示例性实施例中,遍历协处理器138不能访问三角形的纹理属性,因此不会尝试确定关于那些属性的可视化。
[0113] 纹理或其他表面修改
[0114] 例如,图6A和图6B示出了透明三角形610,其具有应用于三角形的叶的纹理615。人们可以想到一个由树脂玻璃制成的三角形,上面有一片叶贴花。如图6A所示,光线620在所施加的纹理615之外的点处与透明三角形610相交。因为光线620与所施加的纹理615外部的三角形相交,所以纹理将不会阻挡光线620并且光线将会不受阻挡地穿过透明三角形610。这就像是能够透过未经叶贴花覆盖的树脂玻璃三角形的部分看到。注意,在一个示例性实施例中,SM 132进行可见性确定,因为遍历协处理器138不一定能够访问关于叶贴花的信息。遍历协处理器138通过向SM返回光线与之相交的三角形的识别以及关于该三角形的属性的信息来帮助SM 132。
[0115] 在图6B中,光线630与施加纹理615的透明三角形相交。SM 132将基于纹理615将阻挡光线630还是允许光线630通过来确定遍历协处理器138的后续遍历是否是必要的。如果光线630被纹理615阻挡,则透明三角形610后面的其他三角形(其可能已经与光线630相交)将被纹理阻挡并且不会有助于沿着光线的可视化。在本文的示例性非限制性实施例中,遍历协处理器138不能访问纹理信息,因此它不会尝试加速该确定。遍历协处理器138可以例如将光线和对象内的各种三角形之间的所有相交返回到请求SM 132,然后SM可以使用图元引擎134进行进一步的光线追踪可视化确定。在其他示例性实施例中,遍历协处理器138可以通过与纹理映射单元和图元引擎134内的3D图形管线的其他部分交互来加速这些测试中的一些或全部,以进行必要的可视化确定。
[0116] 协调变换
[0117] 图2A-图3C仅涉及单个对象,即茶壶。正如你现在所在的房间包含多个对象一样,大多数3D场景都包含许多对象。例如,包含茶壶的3D场景可能还包含杯子、碟子、牛奶罐、勺子、糖碗等,所有这些都放在桌子上。在3D图形中,这些对象中的每一个通常是独立建模的。然后,图形系统100使用来自处理器120的命令将所有模型以期望的位置、方向和尺寸放在公共场景中以便可视化(就像你将设置和安排用于供应茶的桌子一样)。这意味着SM 132可以命令遍历处理器138相对于场景中的多个对象分析相同的光线。然而,当放入公共场景时这些对象中的每一个将在位置、方向和大小上被变换的事实被遍历协处理器138考虑并加速。在非限制性示例性实施例中,从世界到对象空间的变换与世界空间包围盒一起存储在世界空间BVH中。遍历协处理器138通过将光线从世界(场景)空间变换到对象空间来加速变换过程,以便执行图4所示的测试。特别是,由于几何形状从对象空间到世界(场景)空间的变换是计算密集的,该变换留给图形管线图元引擎134和/或光栅引擎136以作为光栅化的一部分来执行。相反,遍历协处理器138将给定的光线从世界空间变换到由加速数据结构定义的每个对象的坐标系,并在对象空间中执行其测试。
[0118] 图7A和图7B示出了遍历协处理器138如何将相同的光线变换到三个不同的对象空间。图7A示出了桌子上的三个对象:杯子、茶壶和水罐。这三个对象和一个桌子包含一个存在于世界空间中的场景。也在世界空间中定义的光线从视点发出并与三个对象中的每一个相交。
[0119] 图7B示出了在对象空间中定义的三个对象中的每一个。这三个对象中的每一个都由存在于相应对象空间中的相应模型定义。在示例性非限制性实施例中,遍历协处理器138在针对对象执行相交测试之前将光线变换到每个对象的对象空间中。为了遍历协处理器138执行相交测试的目的,该“实例变换”节省了将每个对象的几何形状和加速数据结构的相关盒细分从对象空间变换到世界空间的计算工作量。
[0120] 请求SM 132在一个对象隐藏另一个对象,在另一个对象上投射阴影和/或朝向另一个对象反射光的情况下追踪哪些对象相对于每个个体光线位于哪些其他对象前面并且解析可见性。请求SM 132可以使用遍历处理器138来加速这些测试中的每一个。
[0121] 示例性树形BVH加速数据结构
[0122] 图8A和图8B示出了3D场景(图8A)和相应的树形数据结构(图8B)的递归细分的包围盒,其可以由遍历协处理器138访问并且用于由遍历协处理器执行的硬件加速的操作。包围盒的划分可以用分层树形数据结构表示,其中图2B中所示的大包围盒由树的父节点表示,而较小的包围盒由父节点包含的树的子节点表示。最小的包围盒表示为树中的叶节点,并标识包含在这些最小包围盒内的一个或更多个几何图元。
[0123] 树形数据结构可以存储在遍历协处理器138外部的存储器中,并且基于SM 132向遍历协处理器138发出的查询来检索。树形数据结构包括以层次布置的多个节点。树形结构的根节点N1对应于包围所有三角形O1-O8的包围盒N1。根节点N1可以识别包围盒N1的顶点和根节点的子节点。
[0124] 在图8A中,包围盒N1被细分为包围盒N2和N3。图8B的树形结构的子节点N2和N3对应于并表示图8A中所示的包围盒N2和N3。树形数据结构中的子节点N2和N3识别空间中各个包围盒N2和N3的顶点。在该特定示例中,每个包围盒N2和N3被进一步细分。包围盒N2被细分为包含的包围盒N4和N5。包围盒N3被细分为包含的包围盒N6和N7。包围盒N7包括两个包围盒N8和N9。包围盒N8包括三角形O7和O8,并且包围盒N9包括叶包围盒N10和N11作为其子包围盒。叶包围盒N10包括图元范围(例如,三角形范围)O10,并且叶包围盒N11包括项目范围O9。图8B的树形结构的各个子节点N4、N5、N6、N8、N10和N11对应于并表示空间中的图8A的包围盒N4、N5、N6、N8、N10和N11。
[0125] 图8B树仅有三到六层深,使得盒N4、N5、N6、N8、N10和N11构成“叶节点”-即,树中没有子节点的节点。图8A示出了叶节点包围盒N4、N5、N6和N8中的每一个都包含场景中的几何形状的两个三角形。例如,盒细分N4包含三角形O1和O2;盒细分N5包含三角形O3和O4;盒细分N6包含三角形O5和O6;以及盒细分N8包含三角形O7和O8。图8B中所示的树形结构通过将它们与场景几何形状中的适当的三角形O1-O8相关联来表示这些叶节点N4、N5、N6和N7。为了访问该场景几何形状,遍历协处理器138向下遍历图8B的树形数据结构直到叶节点。通常,树的不同部分可以并且将具有不同的深度并且包含不同数量的三角形。与不包含几何形状的盒细分相关联的叶节点不需要在树形数据结构中明确地表示(即,树被“修剪”)。
[0126] 根据一些实施例,以N7为根的子树可以表示在与对应于节点N1-N3的包围盒不同的坐标空间中定义的一组包围盒或BVH。当包围盒N7与其父包围盒N3处于不同的坐标空间中时,提供遍历以N7为根的子树所必需的光线变换的实例节点N7'可以将树的其余部分连接到以N7为根的子树。实例节点N7'通过定义从N1-N3的坐标空间(例如,世界空间)到N7等的坐标空间(例如,对象空间)的变换,将对应于节点N1-N3的包围盒或BVH与对应于节点N7等的包围盒或BVH连接。
[0127] 遍历协处理器138的内部结构和操作
[0128] 图9示出了遍历协处理器138的示例性简化框图,其包括被配置为执行上述加速遍历操作的硬件(下面描述该遍历协处理器138的更详细的实现)。因为图9中所示的遍历协处理器138适于遍历诸如图8A、图8B所示的基于树的加速数据结构,所以它也可以被称为“树遍历单元”或“TTU”700(附图标记700用于指代图1中所示的遍历协处理器138的更详细的非限制性实现)。树遍历操作可以包括,例如,确定光线是否与包围盒和/或树形数据结构(例如,BVH树)的图元相交,这些测试可以涉及将光线变换到对象空间。
[0129] TTU 700包括用于确定光线是否与包围盒相交的专用硬件和用于确定光线是否与树形数据结构的图元相交的专用硬件。在一些实施例中,TTU 700可以使用采用所支持的叶节点图元的相交测试的短堆栈遍历以及α图元和不支持的叶节点图元(项目)的中间遍历返回来执行包围盒层次的深度优先遍历。将参考三角形讨论图元的相交,但也可以使用其他几何图元。
[0130] 更详细地,TTU 700包括相交管理块722、光线管理块730和堆栈管理块740。这些块中的每一个(以及图9中的所有其他块)可以构成由逻辑门、寄存器、硬件嵌入式查找表或其他组合逻辑等实现的专用硬件。
[0131] 光线管理块730负责管理关于由SM 132指定的到光线管理块的光线的信息并执行关于其的操作。堆栈管理块740与遍历逻辑712结合工作以管理关于遍历BVH加速数据结构的信息并执行与其相关的操作。遍历逻辑712由光线-complet测试块710的结果指示,该光线-complet测试块710根据需要使用实例变换测试由光线管理块730指示的光线与由BVH表示的盒细分之间的相交。光线-complet测试块710经由作为TTU 700的一部分的L0完整缓存752从存储器140中检索关于BVH的附加信息。光线-complet测试块710的结果通知遍历逻辑
712关于是否需要进一步递归遍历。当遍历逻辑712从BVH的一个级别遍历到另一个级别时,堆栈管理块740维护堆栈以追踪状态信息,当遍历逻辑遍历到BVH更深处时,堆栈管理块将项目推送到堆栈上,当遍历逻辑在BVH中向上遍历时,堆栈管理块将项目从堆栈中弹出。堆栈管理块740能够在SM请求的任何时间向请求SM 132提供状态信息(例如,中间或最终结果)。
[0132] 相交管理块722根据需要使用实例变换来管理关于光线和图元之间的相交的信息并执行与其相关的操作。光线图元测试块720经由作为TTU 700的一部分的L0图元高速缓存754根据需要从存储器140中检索关于几何形状的信息。光线-图元测试和变换块720执行的相交测试的结果通知相交管理块722。因此,光线-图元测试和变换块720向相交管理块722提供相交结果,相交管理块722向请求SM 132报告几何碰撞和相交。
[0133] 堆栈管理单元740检查遍历状态以确定需要检索什么类型的数据以及哪个数据路径(complet或图元)将消耗它。包围盒的相交在TTU 700的光线-complet测试路径中确定,包括一个或更多个光线-complet测试块710和一个或更多个遍历逻辑块712。complet指定包围盒的根节点或内部节点。因此,complet可以为光线-complet测试定义一个或更多个包围盒。TTU 700的光线-complet测试路径识别哪些包围盒与光线相交。需要进一步处理与光线相交的包围盒,以确定与相交的包围盒相关联的图元是否相交。在包括一个或更多个光线-图元测试和变换块720以及一个或更多个相交管理块722的光线-图元测试路径中确定图元的相交。
[0134] TTU 700从一个或更多个SM 132接收查询以执行树遍历操作。查询可以请求光线是否与包围盒和/或BVH数据结构中的图元相交。查询可以识别光线(例如,光线的原点、方向和长度)以及BVH数据结构和遍历状态(例如,短堆栈),其包括引用光线去访问的一个或更多个层次包围盒中的节点的一个或更多个条目。查询还可以包括关于光线在遍历期间如何处理特定类型的相交的信息。光线信息可以存储在光线管理块730中。可以基于光线-图元测试的结果更新存储的光线信息(例如,光线长度)。
[0135] TTU 700可以请求要从TTU 700外部的存储器中检索的在查询中识别的BVH数据结构。BVH数据结构的检索部分可以被高速缓存在TTU 700内的零级(L0)高速缓存750中,因此,该信息可用于其他时间相干的TTU操作,从而减少了存储器140的访问。光线-complet测试所需的BVH数据结构的部分可以存储在L0complet高速缓存752中,并且光线-图元测试所需的BVH数据结构的部分可以存储在L0图元高速缓存754中。
[0136] 在所请求的遍历步骤所需的complet信息在complet高速缓存752中可用之后,光线-complet测试块710确定与光线相交的包围盒。在执行该测试时,可以将光线从层次包围盒的坐标空间变换为相对于complet定义的坐标空间。针对与complet的子节点关联的包围盒测试光线。在示例性非限制性实施例中,不针对complet自己的包围盒测试光线,因为(1)TTU 700在测试引用该complet的父包围盒子项时,先前针对类似的包围盒测试了光线,并且(2)complet包围盒的目的是定义一个局部坐标系,其中子包围盒可以用压缩形式表示。如果光线与任何子包围盒相交,则结果被推送到遍历逻辑以确定相应的子指针将被推送到遍历堆栈的顺序(进一步测试可能需要遍历逻辑712向下遍历到BVH的下一级别)。递归地重复这些步骤,直到遇到BVH的相交叶节点。
[0137] 光线-complet测试块710可以向遍历逻辑612提供光线-complet相交。使用光线-complet测试的结果,遍历逻辑712创建要被推送到堆栈管理块740的堆栈条目。堆栈条目可以指示需要通过光线-complet测试块710进一步测试光线相交的内部节点(即,包括一个或更多个子节点的节点)和/或需要通过光线-图元测试和变换块720测试光线相交的相交叶节点中识别的三角形。光线-complet测试块710可以重复在堆栈中识别的内部节点上的遍历,以确定与光线相交的BVH中的所有叶节点。在示例性非限制性实施例中,光线-complet测试块710执行的精确测试将由模式位、光线操作(见下文)和剔除碰撞来确定,并且TTU 700可以将中间结果和最终结果返回到SM 132。
[0138] 相交的叶节点识别可能或可能不与光线相交的图元。一种选择是TTU 700向SM 132提供例如在相交的叶节点中识别的一系列几何形状以进行进一步处理。例如,SM 132自身可以基于TTU 700提供的信息确定所识别的图元是否与光线相交,作为TTU遍历BVH的结果。为了从SM 132卸载该处理并由此使用TTU 700的硬件加速它,堆栈管理块740可以发出对光线-图元和变换块720的请求以对TTU的光线-complet测试块710识别的相交叶节点内的图元执行光线-图元测试。在一些实施例中,SM 132可以发出对光线-图元测试的请求以测试特定范围的图元和变换块720,而不管如何识别该几何形状范围。
[0139] 在确保所请求的光线-图元测试所需的图元数据在图元高速缓存754中可用之后,光线-图元和变换块710可以使用存储在光线管理块730中的光线信息来确定与光线相交的图元。光线-图元测试块720将确定为与光线相交的图元的标识提供给相交管理块722。
[0140] 相交管理块722可以将光线-图元测试的结果返回给SM 132。光线-图元测试的结果可以包括相交图元的标识符,交点与光线原点的距离以及关于相交图元的属性的其他信息。在一些实施例中,相交管理块722可以基于来自光线-图元和变换块710的先前相交结果来修改现有的光线-图元测试(例如,通过修改光线的长度)。
[0141] 相交管理块722还可以追踪不同类型的图元。例如,不同类型的三角形包括在相交时阻挡光线的不透明三角形和在相交时可能阻挡或可能不阻挡光线或者可能需要SM进行额外处理的α三角形。光线是否被透明三角形阻挡可以例如取决于映射到三角形上的一个或更多个纹理、纹理占据的三角形区域(参见图6A和图6B)以及纹理修改三角形的方式。例如,在一些实施例中,透明度(例如,彩色玻璃)需要SM 132追踪透明对象碰撞,因此它们可以以光线参数顺序进行分类和着色,并且通常实际上不阻挡光线。同时,α“修剪”允许基于映射到图元上的纹理的形状来修剪图元的形状-例如,从三角形裁剪出叶形(请注意,在光栅图形中,透明度通常被称为“α混合”,并且修剪被称为“α测试”)。在其他实施例中,TTU 700可以将透明碰撞推送到存储器中的队列,以稍后由SM 132处理,并通过向纹理单元发送请求来直接处理经修剪的三角形。每个三角形可以包括指示三角形类型的指示符。相交管理块722被配置为维护用于追踪不同类型的相交三角形的结果队列。例如,结果队列可以将一个或更多个相交的不透明三角形标识符存储在一个队列中,并将一个或更多个透明三角形标识符存储在另一个队列中。
[0142] 对于不透明三角形,可以在TTU 700中完全确定光线相交,因为不透明三角形的区域阻挡光线穿过三角形的表面。对于透明三角形,在一些实施例中,在TTU 700中不能完全确定光线交点,因为TTU 700基于三角形的几何形状执行相交测试,并且可能无法访问三角形的纹理和/或由纹理占据的三角形区域(在其他实施例中,可以通过图形管线的纹理映射块向TTU提供纹理信息)。为了完全确定三角形是否相交,可以将关于光线-图元和变换块710确定的透明三角形相交的信息发送到SM 132,以便SM完全确定三角形是否影响沿着光线的可见性。
[0143] SM 132可以解决光线是否与关联于透明三角形的纹理相交和/或光线是否将被纹理阻挡。在一些情况下,SM 132可以基于该确定将修改的查询发送到TTU 700(例如,如果光线被纹理阻挡则缩短光线)。
[0144] 在一个实施例中,TTU 700可以被配置为将确定为与光线相交的所有三角形返回到SM 132以进行进一步处理。因为在接口和线程同步方面将每个三角形交点返回到SM 132以进行进一步处理是昂贵的,所以TTU 700可以被配置为隐藏三角形,该三角形是相交的但可证明能够隐藏而不会对结果场景产生功能影响。例如,因为TTU 700具有三角形类型信息(例如,三角形是不透明的还是透明的),所以TTU 700可以使用三角形类型信息来确定沿着光线被另一个相交的不透明三角形遮挡的相交三角形,因此它们不需要包括在结果中,因为它们不会影响沿光线的可见性。如上面参考图5A-图5C所讨论的,如果TTU 700知道一三角形沿着光线被一不透明三角形遮挡,则可以从结果中隐藏被遮挡的三角形而不影响所得场景的可视化。
[0145] 相交管理块722可以包括结果队列,用于存储将三角形ID和关于光线碰撞三角形的点的信息相关联的碰撞。当确定光线与不透明三角形相交时,三角形的身份和交点到光线原点的距离可以存储在结果队列中。如果确定光线与另一个不透明三角形相交,则如果交点到光线原点的距离大于已存储在结果队列中的相交的不透明三角形的距离,则可以从结果中省略另一个相交的不透明三角形。如果交点到光线原点的距离小于已存储在结果队列中的相交的不透明三角形的距离,则另一个相交的不透明三角形可以替换存储在结果队列中的不透明三角形。在测试了查询的所有三角形之后,可以将存储在结果队列中的不透明三角形信息和交点信息发送到SM 132。
[0146] 在一些实施例中,一旦识别出不透明三角形交点,相交管理块722可以缩短存储在光线管理块730中的光线,使得在相交的不透明三角形(沿着光线)后面的包围盒(可以包括三角形)不会被识别为与光线相交。
[0147] 相交管理块722可以将关于相交的透明三角形的信息存储在单独的队列中。存储的关于相交的透明三角形的信息可以被发送到SM 132以供SM解析光线是否与关联于三角形的纹理相交和/或纹理是否阻挡光线。SM可以基于该确定将该确定的结果返回到TTU 700和/或修改查询(例如,如果光线被纹理阻挡则缩短光线)。
[0148] 示例性光线追踪着色管线
[0149] 图10A示出了示例性光线追踪着色管线900,其可由SM 132执行并由TTU 700加速。光线追踪着色管线900由SM 132调用光线生成910并向TTU 700发出相应的光线追踪请求开始。光线追踪请求识别投射到场景中的单个光线,并要求TTU 700搜索具有SM 132也指定的加速数据结构的交点。TTU 700遍历(图10A的框920)加速数据结构,以确定光线与盒细分和加速数据结构所代表的关联三角形之间的交点或潜在交点。可以通过在加速数据结构中找到与光线相交的包围盒来识别潜在的交点。不需要检查非相交包围盒的后代。
[0150] 对于相交的包围盒内的三角形,TTU 700光线-图元测试块720执行相交930过程以确定光线是否与图元相交。TTU 700将交点信息返回到SM 132,其可以响应于交点确定执行“任何碰撞”着色操作940。例如,SM 132可以执行(或使其他硬件执行)针对相交图元的纹理查找,并且基于适当的纹理元素值来决定如何着色使光线可视化的像素。SM 132追踪这样的结果,因为TTU 700可以以任意顺序返回与场景中不同几何形状的多个交点。
[0151] 或者,可以进一步处理TTU 700确定相交的图元以确定950它们是否应该被着色为未碰撞960或最近的碰撞970。SM 132可以例如指示TTU 700报告指定的几何形状中的最近的碰撞,或者它可以指示TTU报告指定几何形状中的所有碰撞。例如,可以由SM 132实现针对TTU 700基于所实现的环境查找确定相交的图元的“未碰撞”着色操作(例如,通过预先计算的纹理图像的平均来近似反射表面的外观),如图6A和图6B所示。SM 132可以响应于TTU 700提供的针对特定对象几何形状的最接近的碰撞报告,基于材料评估和纹理查找来执行最接近的碰撞着色操作以确定最接近的相交图元。
[0152] 图10B更详细的光线追踪管线流程图示出了用于代表性用例的组件之间的数据流和交互:追踪包含几何图元的场景的光线,其中实例变换在硬件中处理。在一个示例性非限制性实施例中,图10B的光线追踪管线基本上是软件定义的(在示例性实施例中意味着它由SM 132确定)但是通过TTU 700广泛使用硬件加速。关键部件包括SM 132(和计算管线的其余部分)、TTU 700(用作SM的协处理器)以及L1高速缓存和下游存储器系统,TTU从中获取BVH和三角形数据。
[0153] 图10B中所示的管线示出了可以由开发系统提前执行层次包围盒创建1002。它还示出了光线创建和分发1004由示例性实施例中的SM 132或其他软件执行或控制,如着色(其可包括照明和纹理)。示例性管线包括“顶层(top level)”BVH树遍历1006、光线变换1014、“底层(bottom level)”BVH树遍历1018以及每个由TTU 700执行的光线/三角形(或其他图元)相交1026。不必按所示顺序执行,因为TTU 700和SM 132之间的握手(handshake)确定TTU 700做什么以及以什么顺序进行。
[0154] SM 132一次向TTU 700呈现一条或更多条光线。SM 132呈现给TTU 700以进行遍历的每条光线可包括光线的几何参数、遍历状态以及光线的光线标记、模式标记和光线操作信息。在示例性实施例中,光线操作(RayOp)提供或包括辅助算术和/或逻辑测试以抑制、覆盖和/或允许存储交点。SM 132还可以使用遍历堆栈来将某些状态信息传送到TTU 700以用于遍历。可以使用显式遍历堆栈启动新的光线查询。然而,对于某些查询,可以提供少量的堆栈初始化器来开始给定类型的新查询,例如:从complet开始的遍历;光线与一系列三角形的相交;光线与一系列三角形的相交,然后从complet开始的遍历;从三角形缓冲区中获取给定三角形的顶点。在一些实施例中,使用堆栈初始化器而不是显式堆栈初始化提高性能,因为堆栈初始化器需要更少的流式处理器寄存器并减少需要从流式处理器传输到TTU的参数的数量。
[0155] 在示例性实施例中,SM 132与每个查询(例如,光线)一起呈现的一组模式标记可以至少部分地控制当查询与特定类型的包围盒相交或与特定图元类型的图元相交时TTU 700将如何处理查询。SM 132提供给TTU 700的模式标记使SM和/或应用程序能够例如通过RayOp指定辅助算术或逻辑测试来抑制、覆盖或允许存储交点。模式标记可以例如使遍历行为能够根据诸如与每个包围盒和/或图元相关联的深度(或距离)、与到原点或光线的距离相关的包围盒或图元的大小等方面而改变。应用程序可以使用此功能来动态地和/或选择性地启用/禁用相交测试的对象集与特定查询集或查询组,例如,以允许在应用程序状态改变时(例如,当门打开或关闭时)使用不同版本的模型,或者提供作为光线长度的函数选择的模型的不同版本以实现细节几何形状级别的形式,或允许来自某些光线类别的特定对象集使某些图层在特定视图中可见或不可见。
[0156] 除了可以针对光线-complet交点和针对光线-图元交点单独指定模式标记集之外,光线数据结构可以指定其他与RayOp测试相关的参数,例如光线标记、光线参数和RayOp测试。TTU 700可以使用光线标记来控制遍历行为、背面剔除和各种子节点类型的处理的各个方面,这取决于可选的RayOp测试的通过/失败状态。RayOp测试增加了TTU 700容量的灵活性,但代价是复杂性。TTU 700为其正在处理的每个活动光线保留“光线槽”,并且可以在遍历期间将光线标记、模式标记和/或RayOp信息存储在TTU内的相应光线槽缓冲器中。
[0157] 在图10B所示的示例中,TTU 700执行顶层树遍历1006和底层树遍历1018。在示例性实施例中,BVH的两层遍历使得能够对动态场景变化进行快速光线追踪响应。
[0158] 光线变换1014通过变换光线提供从顶层树遍历1006到底层树遍历1018的适当过渡,其可以在第一坐标空间(例如,世界空间)中的顶层遍历到底层遍历的BVH的不同坐标空间(例如,对象空间)中使用。在先前的文献中描述了使用两层遍历的示例性BVH遍历技术,参见例如Woop,“动态场景的光线追踪硬件架构(A Ray Tracing Hardware Architecture for Dynamic Scenes)”,萨尔大学,2004,但是实施例不限于此。
[0159] 在一些实施例中,顶层遍历(在世界空间中)是在BVH中进行的,其可以响应于场景的变化而动态地重新计算(例如,通过SM 132),并且底层遍历在包围盒的BVH中进行,即使在场景发生变化时仍保持静态或基本静态。用于底层树遍历1018(在对象空间中)的BVH中的包围盒可以包含关于场景几何形状的更详细信息,而不是顶层树遍历1006中使用的相应包围盒,从而避免或至少减少响应于场景变化而修改底层遍历BVH。这有助于加速动态场景的光线追踪。
[0160] TTU 700的顶层树遍历1006从L1高速缓存1012接收complet,并且向光线变换1014提供用于变换的实例或者向SM 132提供未碰撞/结束输出1013以用于由SM(此块也可以基于非叶节点/无碰撞条件递归地操作)处理的最接近的碰撞着色器1015。在顶层树遍历1006中,下一个complet获取步骤1008从存储器和/或高速缓存层次中获取要在步骤1010中测试光线相交的下一个complet,并且在该获取的complet中的包围盒上完成光线-包围盒相交测试。
[0161] 如上所述,实例节点将一个BVH连接到处于不同坐标系中的另一个BVH。当相交的包围盒的子项是实例节点时,光线变换1014能够从L1高速缓存1016检索适当的变换矩阵。TTU 700使用适当的变换矩阵将光线变换为子BVH的坐标系。已经通过引用并入的美国专利申请No.14/697,480描述了将树中的第一组节点连接到第二组节点的变换节点,其中第一和第二组节点在不同的坐标系中。示例性实施例中的实例节点可以类似于美国申请No.14/
697,480中的变换节点。在图10C中所示的TTU 700的替代非实例化模式中,TTU不执行“底”层树遍历1018,并且非实例化的树BVH遍历由框1008、1010执行,例如,仅使用一个堆栈。TTU 
700可以基于其从BVH和/或查询类型读取的内容在图10B实例化操作和图10C非实例化操作之间切换。例如,特定查询类型可以限制TTU仅使用非实例化操作。在这样的查询中,任何相交的实例节点都将返回给SM。
[0162] 在一些非限制性实施例中,在获取下一个complet之前,对所获取的complet中的每个包围盒执行步骤1010中的光线-包围盒相交测试。其他实施例可以使用其他技术,例如以深度优先的方式遍历顶层遍历BVH。已通过引用并入的美国专利No.9,582,607描述了可以在示例性实施例中使用的一个或更多个complet结构和内容。美国专利No.9,582,607还描述了complet的示例性遍历。
[0163] 当确定包围盒与光线相交时,对相交的包围盒的子包围盒(或对它们的参考)保持追踪,以便随后测试与光线的相交和遍历。在示例性实施例中,一个或更多个堆栈数据结构用于追踪随后要测试的子包围盒与光线的相交。在一些示例性实施例中,可以使用小尺寸的遍历堆栈来追踪要由顶层树遍历1006的操作遍历的complet,以及要测试相交的图元,并且可以使用更大的本地堆栈数据结构以追踪底层树遍历1018中的遍历状态。
[0164] 在底层树遍历1018中,下一个complet获取步骤1022从存储器和/或高速缓存层次1020中获取要在步骤1024中测试光线相交的下一个complet,并在获取的complet中的包围盒上进行光线-包围盒相交测试。如上所述,底层树遍历可以包括其中的包围盒与在上层树遍历中遍历的包围盒处于不同的坐标系中的complet。底层树遍历还接收来自L1高速缓存的complet,并且可以基于无叶/无碰撞条件以及基于未碰撞/结束检测的顶层树遍历1006在其自身内递归地或迭代地操作。可以利用变换到所检索的较低层complet的坐标系的光线来确定光线与较低层BVH中的包围盒的交点。然后将发现与较低层树遍历中与光线相交的叶包围盒提供给光线/三角形交点1026。
[0165] 底层树遍历1018的叶输出被提供给光线/三角形交点1026(其具有L0高速缓存访问以及经由L1高速缓存1028检索三角形的能力)。L0 complet和三角形高速缓存可以是TTU 700内部的小的只读高速缓存。当到达某些叶节点而不遍历实例化的BVH时,光线/三角形交点1026还可以从顶层树遍历1006接收叶输出。
[0166] 在处理了图元范围中的所有图元之后,交点管理单元检查结果队列的状态并制作分组以发送到堆栈管理单元和/或光线管理单元以更新光线的属性和遍历状态,设置光线的下一个遍历步骤,和/或将光线返回到SM 132(如有必要)。如果结果队列包含在处理图元范围期间发现的不透明或α交点,则交点管理单元将结果队列中最近的不透明交点的参数长度(t)发信号到光线管理单元,以记录为光线的上限以缩短光线。要更新遍历状态以设置光线的下一个遍历步骤,交点管理单元向堆栈管理单元发送一下信号:结果队列中是否存在与图元范围的不透明交点,结果队列中是否存在一个或更多个α交点,结果队列是否已满,是否在图元范围中找到了尚未返回到SM且在结果队列中不存在的额外α交点,以及在SM消耗结果队列的内容之后要测试的光线的图元范围中的下一个α图元的索引(α图元之后范围中的下一个图元的索引,具有来自结果队列中当前图元范围的最高存储器顺序)。
[0167] 当堆栈管理单元740从交点管理单元722接收到分组时,堆栈管理单元740检查该分组以确定完成遍历步骤所需的下一个动作并开始下一个动作。如果来自交点管理单元722的分组指示在图元范围中已找到不透明交点并且光线模式位指示一旦找到任何交点则该光线将结束遍历,堆栈管理单元740将该光线及其结果队列返回到SM,遍历状态指示遍历已完成(完成标记设置和/或空顶层和底层堆栈)。如果来自交点管理单元722的分组指示结果队列中存在不透明交点或α交点,并且在图元范围(其尚未被返回到SM)处理期间图元范围中还有光线遇到的剩余α交点不存在于结果队列中,则堆栈管理单元740将光线和结果队列返回到SM,其中遍历状态被修改以设置剔除不透明位以防止进一步处理图元范围中的不透明图元并且最高α图元交点从图元范围返回到光线结果队列中的SM之后,图元范围开始索引前进到第一个α图元。如果来自交点管理单元722的分组指示当光线处理了图元范围时没有找到不透明交点或α交点,则堆栈管理单元740将堆栈顶部的条目(对应于完成的图元范围)从活动遍历堆栈中弹出。如果来自堆栈管理单元740的分组指示队列中的不透明交点或者结果队列中存在不透明交点,并且一旦找到任何交点和/或结果队列中存在α交点,则光线模式位不指示光线将完成遍历,但是在结果队列中不存在的图元范围中没有找到剩余的α交点,其尚未返回到SM,堆栈管理单元740从活动遍历堆栈弹出堆栈条目的顶部(对应于完成的图元范围)并修改结果队列的内容,以指示结果队列中存在的所有交点都来自其已完成处理的基本范围。
[0168] 如果活动堆栈是底部堆栈,并且底部堆栈是空的,则堆栈管理单元740将活动堆栈设置为顶部堆栈。如果顶部堆栈是活动堆栈,并且活动堆栈为空,则堆栈管理单元740将光线及其结果队列返回到SM,其遍历状态指示遍历已完成(完成标记设置和/或空顶层和底层堆栈)。如果活动堆栈包含一个或更多个堆栈条目,则堆栈管理单元740检查顶部堆栈条目并开始下一个遍历步骤。具有与光线的交点的图元和/或图元范围的测试以及将结果返回到SM 132在以下申请中描述:共同未决的美国申请No.16/101,148,标题为“保守的水密光线三角交点(Conservative Watertight Ray Triangle Intersection)”(卷号6610-36(18-SC-0145)),美国申请No.16/101,066,标题为“在没有着色器干预的交点上进行连续层次包围盒遍历的方法(Method for Continued Bounding Volume Hierarchy Traversal on Intersection without Shader Intervention)”(卷号6610-32(18-AU-0127))和美国申请No.16/101,196,标题为“用于处理无序的不透明和α光线/图元交点的方法(Method for Handling Out-of-Order Opaque and Alpha Ray/Primitive Intersections)”(卷号6610-37(18-AU-0149)),其全部内容通过引用并入本文。
[0169] 虽然以上公开内容在计算机图形和可视化的特定上下文中表达,但是光线追踪和所公开的遍历协处理器可以用于除图形和可视化之外的各种应用。非限制性示例性包括用于逼真声音合成的声音传播,声呐系统的模拟,光学元件和系统的设计,粒子传输模拟(例如,用于医学物理学或实验高能物理),一般波传播模拟,与LIDAR数据的比较,用于例如机器人或车辆定位等目的,OptiXTM过去已经用于其中一些应用领域。
[0170] 示例性多处理器-协处理器接口
[0171] 如上所述,由SM 132执行的TTU 700加速光线追踪着色管线900的一个方面是响应于SM 132做出的TTU查询加速光线和BVH之间的相交检测。TTU 700接收光线信息和BVH(或BVH的一部分),用于从SM 132进行相交测试。触发TTU 700以执行加速相交检测(“TTU查询”)的指令可能需要许多操作数来向TTU 700指定光线信息和BVH信息。例如,在一个实施例中,提供给TTU 700的用于加速相交检测的输入包括使用8个浮点数指定的光线(例如,每个需要3个浮点数的光线原点和方向,以及每个需要1个浮点数的光线起点和终点位置)和用相当于8个浮点(例如,1-8个堆栈条目)指定的堆栈,总共至少16个浮点。由TTU 700输出的相应结果至少包括每个相交的图元/项的标识符和每个需要1个浮点数的t值(例如,光线的当前长度),每个交点的坐标需要2个浮点数,以及更新的堆栈需要相当于8个浮点,总共至少12个浮点数。进一步,由TTU 700执行的BVH遍历的某些可配置控制,如美国申请No.16/101,180(卷号6610-0035/18-SC-0144)、标题为“树遍历的查询特定行为修改(Query-Specific Behavioral Modification of Tree Traversal)”所描述的,可能需要在触发TTU 700的指令中指定进一步的附加输入参数以执行加速相交检测。以这种方式,尽管一些典型指令可以包括标识要执行的操作的操作码和指定输入/输出参数的2-4个操作数(例如,立即数、寄存器标识符和/或存储器地址),但是示例性TTU查询指令可能需要大量的(例如,超过4个)要指定的操作数。
[0172] 理想地,用于确定TTU 700上的光线-BVH交点的TTU查询将通过采用若干目的地寄存器(“Rd0”等)、若干源寄存器(“Rs0”等)和作为立即数的请求说明符(“Imm”):“TTU Rd0,Rd1,Rd2,...,Rs0,Rs1,Rs2,...,Imm”的单个指令来启动。但这在许多系统中并不实用,因为指令编码中可能没有空间来容纳完全指定所需输入和输出所需的许多寄存器。此外,需要在指令中指定所需的寄存器的数量可以是可变的。
[0173] 容纳包含大量操作数的指令可能导致系统的低效率。宽通信路径、大队列和指令之间的长持续时间是潜在低效率的一些原因。例如,处理器之间和/或处理器与存储器之间的通信路径可能必须专门设计以适应宽指令,而这种宽通信路径可能比大多数指令所需的宽。指令队列/缓冲器可能需要大量的存储器。另外,许多多处理器是基于RISC的并且具有相对窄的固定大小指令。此外,指令中的大量输入和输出参数可能导致每指令完成时间相对较长,这至少部分是由于大量存储和加载,从而限制系统实现线程的指令级抢占的能力。
[0174] 在示例性实施例中,代替使用单个宽指令来使TTU 700执行BVH的查询遍历,提供了方法和系统,通过该方法和系统,可以使用相应的较窄指令序列来命令TTU 700执行遍历。尽管在本文档中主要关于SM 132和TTU 700之间的接口描述了相应的指令序列,但是关于指令序列的教导也适用于其他多处理器和协处理器之间的接口。此外,根据实施例的由指令序列促成的协处理器操作的类型不限于BVH的遍历,并且可以包括协处理器被配置为执行的任何类型的操作。因此,示例性实施例包括用于命令协处理器操作的较窄指令的多指令序列(例如,具有2-4个操作数的指令),作为用于命令该相同的协处理器操作的单个较宽指令(例如,具有多于4个操作数的指令)的替代。
[0175] 如本文档中所使用的“多处理器”是能够维持多个并发线程的执行的微架构状态的处理器,而与执行单元的组织或数量无关。示例性多处理器可以包括具有或不具有支持同时多线程(SMT)的多核CPU,具有支持SMT的单核CPU,以及并行处理单元(例如,NVIDIA GPU中的SM)中的各个多处理器。例如,NVIDIA GPU中的每个SM可以维持数十个线程束(warp)和/或数百个并发线程的微架构状态。
[0176] 多处理器可以支持不同类型的各种操作,用于算术、控制流、数据移动等,每个操作经由多处理器的指令集中的指令暴露。本文描述的实施例主要涉及经由单个指令暴露是不切实际的操作,其出于一个或更多个原因,例如但不限于以下:(1)操作从寄存器或其他存储器位置获取其输入但需要寄存器名称或存储器地址不能在单个指令中编码的大量输入,(2)操作在寄存器或其他存储器位置产生输出,但产生寄存器名称或存储器地址不能在单个指令中编码的大量输出,以及(3)操作需要有限且具有足够高延迟的执行资源,将操作暴露为单个指令会对可实现的性能产生负面影响或使指令调度复杂化。例如,关于上述(1)和(2),多处理器指令集架构(ISA)中支持的指令宽度可能不够将所需数量的输入寄存器和/或输出寄存器编码为用于操作的操作数。本文使用的指令的宽度指的是编码指令所需的位数,即,与宽指令相比,窄指令需要更少的位用于编码。
[0177] 实现/执行这种操作的硬件单元在本文被称为“协处理器”,而不管它被集成到多处理器中的程度。下面的许多实施例是关于TTU 700描述的,其通过加速SM的BVH遍历过程等作为SM 132的协处理器进行操作。然而,并不要求协处理器是TTU,或者甚至协处理器独立于多处理器,其程度与TTU 700独立于SM 132的程度类似。例如,尽管TTU 700基本上独立于SM 132,因为在接收到光线和BVH信息之后,TTU 700可以在没有与SM 132进一步通信的情况下检测到许多类型的光线-BVH交点,但在示例性实施例中,在执行协处理器操作期间,多处理器和协处理器不限于多处理器和协处理器之间的任何特定级别的相互通信。
[0178] 本文描述的实施例包含三种技术中的一种或更多种,以提供多处理器-协处理器接口的至少一部分。在一些实施例中,该技术可以提供GPU或其他PPU的ISA的一部分,以便将协处理器(诸如TTU)接口到GPU的SM。然而,尽管根据实施例的多处理器-协处理器接口在本文档中主要在将TTU接口到GPU中的SM的上下文中描述,但是教导不限于此,并且更一般地适用于许多其他类型的多处理器-协处理器接口。
[0179] 广泛描述的三种技术包括:(1)以满足若干非平凡要求的方式使用多指令序列以编程方式启动协处理器查询,(2)用于融合指令序列的机制,其将协处理器查询构成为单个“宏指令”,保证不间断地执行,以及(3)允许在整个查询完成之前释放为给定查询保留的协处理器资源的子集的优化。技术(1)使多处理器能够使用多指令序列与协处理器交互,而不需要具有多个操作数的宽指令,技术(2)修改多指令序列,使得多处理器指令级抢占更有效,并且技术(3)提高了协处理器资源的处理速度和利用率。
[0180] 协处理器操作的多指令序列
[0181] 一些示例性实施例提供了较窄指令的多指令序列以使协处理器执行特定操作,该特定操作可以在容纳非常宽的指令的系统中由具有许多操作数的单个宽指令引起。如上所述,在示例性实施例中,通过分别在操作之前和之后的多个写入指令(也称为“存储指令”)和读取指令(也称为“加载指令”)向协处理器提供有效执行某些多处理器操作所需的相对大量的输入和/或输出寄存器和/或存储器地址。
[0182] 根据实施例的多指令序列包括作为多处理器的指令集架构的一部分的若干指令,包括协处理器连接打开/关闭指令(例如,“CP_OPEN”/“CP_CLOSE”),协处理器等待指令(例如,“CP_WAIT”),对协处理器指令的写入(例如,“CP_WRITE”),从协处理器指令的读取(例如,“CP_READ”)和协处理器命令指令(例如,“CP_COMMAND”)。本领域技术人员将理解,本文使用的名称、标识符和操作码等仅是示例性,并不限制实施例。
[0183] 图11A示出了根据示例性实施例的多处理器使用多指令序列来对协处理器执行目标操作的示例性过程1100。连接到多处理器的处理器响应于过程1100执行目标操作和另一个过程,下面描述为过程1120。根据一些实施例,多处理器(诸如多处理器1502)和协处理器(诸如协处理器1504)可以分别执行过程1100和过程1120。
[0184] 在一些示例性实施例中,SM 132和TTU 700可以分别执行过程1100和过程1120。例如,在如上关于图1描述的实时光线追踪应用中,在CPU 120上执行的应用可以使用上述窄指令的多指令序列形成对GPU 130的光线追踪查询或类似请求。在GPU 130内,可以在SM 132上执行多指令序列,其中SM 132根据多指令序列使TTU 700执行对BVH的查询。
[0185] 过程1100中使用的示例性多指令序列可以如下:
[0186] CP_OPEN
[0187] CP_WAIT
[0188] CP_WRITE cp[0x100]R2,R3
[0189] CP_WRITE cp[0x208]R4,R5
[0190] CP_WRITE cp[0x300]R10,R11
[0191] CP_COMMAND 0x1
[0192] CP_READ R12,R13,cp[0x400]&release_when_complete(sb0)
[0193] CP_READ R16,R17,cp[0x460]&release_when_complete(sb1)
[0194] CP_CLOSE
[0195] #...
[0196] #...(可选的任意中间指令)
[0197] #...
[0198] WAIT_ON_SCOREBOARD sb0
[0199] WAIT_ON_SCOREBOARD sb1
[0200] …
[0201] #Consume results(例如,将结果存储到存储器中):
[0202] STORE[R7],R12
[0203] #...
[0204] 在步骤1102,在进入过程1100之后,多处理器开始发出上述多指令序列的指令,以便代表如在SM上调度的特定线程或线程组(例如,线程束)在协处理器上执行特定目标操作(例如,协处理器被配置为执行的预定操作;例如,如上所述的TTU查询)。在步骤1102,多处理器通过例如发出连接打开指令(例如,CP_OPEN)来请求到协处理器的连接。可以对多处理器上的一个或更多个线程进行请求。在一些实施例中,请求针对与多处理器中的活动SIMD通道相对应的一组线程(例如,线程束)。
[0205] 多处理器-协处理器接口的上下文中的“连接”是会话,在会话期间保留某些资源以用于针对其建立连接的特定目标操作的服务。例如,在接收到连接请求时,协处理器可以保留诸如存储器、协处理器处理管线上的一个或更多个执行槽等资源。资源和要保留的资源量可以是特定于实现的,并且可以是由协处理器基于预定信息(例如,线程组中的每个线程的预配置信息)或基于用连接打开请求指定的一个或更多个操作数来确定。
[0206] 在步骤1104,多处理器阻塞,直到协处理器响应连接打开请求为止。例如,多处理器发出指令(例如,上述序列中的CP_WAIT)以阻塞一个或更多个请求线程,直到连接建立完成为止。因此,在CP_OPEN之后,多处理器可以仅在已经在协处理器中获取和/或保留连接所需的资源并且已经通知连接建立已经完成之后,处理进一步的操作以执行特定目标操作。
[0207] 在步骤1106,发出一个或更多个写入指令(例如,CP_WRITE),将来自多处理器的输入数据写入存储器和/或协处理器可访问的寄存器。CP_WRITE的源数据可以来自多处理器寄存器和/或来自存储器。CP_WRITE的目的地可以是协处理器内部存储器,协处理器寄存器和/或协处理器可访问的另一个存储器。输入数据包括并且在一些实施例中可以仅包括特定操作所需的数据。也就是说,至少在一些实施例中,由一个或更多个写入指令共同指定的输入数据是由在协处理器上执行的特定目标操作所使用的整个输入数据集。
[0208] 在步骤1108,发出命令指令(例如,CP_COMMAND)以使协处理器执行特定目标操作。在一些实施例中,命令指令可以不包括任何操作数,例如当协处理器是被配置为仅执行单个协处理器操作的专用处理器(例如,仅检测光线-BVH交点的查询)并且因此对协处理器的任何调用可以解释为执行单个目标操作的请求。在一些实施例中,可以指定操作数(例如,立即数)来标识多个预定义的协处理器可执行操作之一。
[0209] 在步骤1110,发出一个或更多个读取指令(例如,CP_READ)以从协处理器执行的目标操作中读取结果数据。读取指令将结果数据从处理器可访问的存储器和/或寄存器复制到多处理器寄存器和/或存储器。根据一些实施例,一个或更多个读取指令共同包括从协处理器提供给多处理器的整个结果数据。
[0210] 由于多指令序列被配置为仅在连接建立时被阻止,因此多处理器可以以背靠背(即,发出指令而不等待先前发出的指令完成)的方式发出连接打开指令直到连接关闭指令并包括连接关闭指令之后的多指令序列中的指令。尽管这种背靠背发出可以提高执行速度,但是在命令指令启动的特定协处理器操作完成之前(也就是协处理器操作仍然在进行中),并且因此在结果数据甚至可以外写到多处理器之前,它也可能导致协处理器接收到读取指令。
[0211] 因此,当结果数据被实际写入多处理器时,每个读取指令可以配置记分板(scoreboard)条目(或其他类似技术)以向多处理器生成信号。
[0212] 记分板技术是可以用于监视何时可以执行与读取指令相关联的数据写入的技术的一个示例,并且实施例不限于此。记分板技术是一种众所周知的技术,以前在设备(诸如CDC 6600计算机)中用于执行指令。记分板可以配置为追踪每条指令的数据依赖性,并在确定与先前已发出且尚未完成的指令没有冲突时释放指令。在示例性实施例中,每个读取指令可以配置相应的记分板条目,以便在从协处理器可访问的存储器和/或寄存器中的源位置实际复制数据到多处理器存储器和/或寄存器之前,可以监视要写入多处理器的结果数据的可用性。
[0213] 在步骤1112,在发出一个或更多个读取指令之后,多处理器发出连接关闭指令。连接关闭会导致多处理器关闭与协处理器的连接,因为此时已完全指定了特定操作。
[0214] 在步骤1112和1114之间,多处理器可以可选地发出一个或更多个其他指令。当协处理器按照多处理器的命令执行特定操作时,此功能使多处理器线程或线程组能够继续执行处理或其他操作。在一些实施例中,可以在步骤1112和1114之间发出用于特定协处理器目标操作的另一个多指令序列。在接收到来自较早发出的协处理器目标操作的结果之前继续执行其他处理的这种能力提高了效率和延迟隐藏。
[0215] 在步骤1114,线程或线程组在记分板上等待。可以发出一个或更多个等待指令以使线程或线程束在记分板上阻塞。如上所述,每个读取指令可以在协处理器中的特定结果数据位置准备好时(例如,在协处理器上执行的特定操作将结果数据写入协处理器可访问存储器和/或寄存器),配置记分板条目为被触发。当由于被监视的数据位置可用于读取而触发记分板条目时,该结果数据从协处理器可访问的存储器被复制到指定的多处理器可访问的一个或更多个存储器位置和/或一个或更多个寄存器。
[0216] 在步骤1116,在已经清除在记分板上阻塞的一个或更多个等待指令中的每一个之后,多处理器可以消耗写入其可访问存储器位置和/或寄存器的结果数据。例如,线程或线程组可以通过将来自多处理器寄存器的结果数据写入存储器来消耗由协处理器执行的特定操作的结果数据。
[0217] 图11B示出了如上所述的响应于由多处理器执行的过程1100可以在协处理器上执行的过程1120的流程图。
[0218] 在步骤1122,协处理器接收连接打开请求的通知。
[0219] 在步骤1124,保留资源。资源可以包括存储器存储、寄存器和/或处理管线槽。保留用于执行针对线程或线程组的特定操作的资源可以统称为执行槽。每次可以主动使用的执行槽的数量可以取决于资源容量和可用性。
[0220] 如上所述,在发出指令之后,多处理器线程或线程组发出连接打开指令块。这确保了对于特定线程或线程组每次只有对连接打开的单个挂起请求。在一些实施例中,这还确保协处理器已经分配了存储由后续CP_WRITE发送的数据所需的资源。
[0221] 在步骤1126,协处理器通知多处理器关于连接打开。在协处理器响应于连接请求成功保留一个或更多个执行槽之后,通知多处理器资源获取成功完成。
[0222] 在操作1128,协处理器使用写入协处理器可访问存储器和/或寄存器的输入数据来执行所请求的目标操作。目标操作可以是针对其专门配置协处理器硬件的多个操作之一。在一个示例性实施例中,如上所述,协处理器可以是TTU 700,其可以包括为BVH遍历定制的硬件。在一些其他实施例中,协处理器(诸如协处理器1504)可以包括针对某些其他类型的目标操作而优化的硬件。
[0223] 在步骤1130,协处理器将结果数据写入存储器。可以通过在多处理器中实现的记分板等来监视存储器位置。当写入各个存储器位置时,记分板可以触发多处理器以(例如,在步骤1114中)将结果数据从协处理器写入的存储器位置复制到多处理器存储器和/或寄存器。
[0224] 在步骤1132,在协处理器将结果数据写入存储器之后,在协处理器上关闭连接并释放保留的资源。
[0225] 图12示出了活动流程图1200,其进一步示出了当上面关于图11A描述的多指令序列在多处理器1202上执行时,多处理器1202和协处理器1204上的指令和执行的动作之间的时间关系。过程1200可以表示上述过程1100和1120的特定示例性实现。
[0226] 在高级别,上面所示的指令序列为多处理器提供在协处理器中保留资源,指定输入参数,使用指定的输入参数在协处理器中执行操作,以及使得将结果写入多处理器可访问的寄存器或存储器。下面提供根据一些实施例的对上述多指令序列中的每个指令的语义的描述(例如,当多处理器(例如,SM 132)加速特定线程或线程组的光线相交操作时,在过程1200中使用的)。
[0227] “CP_OPEN[可选资源说明符]”指令1206使多处理器1202打开到协处理器1204的连接并保留足够的资源来完成特定操作。在一些实施例中,特别是在协处理器被配置为仅执行一种类型的目标操作(例如协处理器被配置为仅执行BVH的加速遍历)的实施例中,要接收的资源的类型和数量可能未明确指定。在这样的实施例中,多处理器可以基于隐式方面确定所需资源,例如,线程的类型和/或多处理器中当前活动的SIMD通道的数量。例如,当多处理器执行光线追踪并且一组线程中的每个线程表示相应的光线时,并且当多处理器中的n个SIMD通道当前处于活动状态时,多处理器可以确定保留用于存储n个光线的存储器或者最初请求仅保留所需的存储器的一部分。在一些实施例中,例如,其中协处理器被配置用于多于一个加速功能的实施例,CP_OPEN指令可以可选地容纳一个或更多个操作数(例如,指定为立即数),其可以用于指定由多指令序列调用的特定的协处理器操作和/或要保留的资源类型和数量。在一些实施例中,多处理器可以基于CP_OPEN的一个或更多个操作数来确定所需资源,并且可以根据其对资源的确定向协处理器请求资源保留。
[0228] 在一些实施例中,基于从多处理器接收的请求,协处理器确定要保留的资源的类型和数量。例如,基于要执行的协处理器操作的类型和/或从多处理器发信号的活动SIMD通道的数目,协处理器可以确定要保留的存储器、寄存器和/或处理管线槽。基于其对所需资源的确定和/或基于多处理器提供的信息,协处理器保留1210资源。保留可以包括确保特定资源当前可用并且不被分配给协处理器中当前未完成的操作使用。协处理器可以被配置为追踪分配给正在执行或将要响应于发出的CP_COMMAND指令而执行的每个目标操作的资源。
[0229] “CP_WAIT”指令1208使多处理器上的线程或线程组等待来自协处理器的已经分配了所请求的资源并且已经打开了连接的确认1212。也就是说,在示例性实施例中,仅当从协处理器接收到确认1212时才释放1214线程或线程组的等待状态(例如,阻塞状态)。可以通过设置标记(例如,图15中的“CP_WAIT_FLAG”)实现阻塞,在发出任何协处理器指令之前所述标记需要被检查。在示例性实施例中,如果多处理器由于一个线程或线程组已经在阻塞状态中等待,则多处理器不发出针对其他线程或线程组的连接打开指令。也就是说,在一些示例性实施例中,只有单个连接打开可能在协处理器上待决(pending)。
[0230] 作为示例,考虑CP_OPEN请求的协处理器资源由每个特定目标操作的单个“执行槽”组成,该每个特定目标操作将响应于CP_COMMAND而被执行。上述多指令序列和执行方案对于由实现方式提供的协处理器执行槽的数量以及由多处理器支持的最大并发线程数是不可知的。在此示例的简并情况下,数千个线程可以安全地共享单个执行槽而没有死锁风险。这从实施例中的配置得出,已经执行CP_OPEN并且接收到已经被授予执行槽的确认的线程被保证执行序列的剩余部分(通过CP_CLOSE)而不管任何其他线程正在做什么,给定该基本假设(诸如调度公平性)包含在多处理器和协处理器中。同样,一旦经由CP_CLOSE关闭了连接,就保证协处理器完成操作并释放相关资源而无需线程或线程组的进一步干预,假定所有允许的操作本身都保证到终止。
[0231] “CP_WRITE<协处理器目的地地址>,<源寄存器>”指令1216使多处理器将输入数据写入来自一个或更多个多处理器寄存器或存储器的协处理器“地址”。指定的协处理器地址可以指定数据RAM中在协处理器内部的物理位置和/或协处理器可访问的物理地址。在一些实施例中,指定的协处理器地址可以包括在写入协处理器以影响整体操作时数据被解释和/或变换的方式的抽象规范。在示例性光线追踪加速中,CP_WRITE指令1216和可选的后续协处理器复制1218存储包括一个或更多个光线的输入数据,用于在协处理器和多处理器之间交换信息的一个或更多个堆栈被写入协处理器-可访问的存储器和/或寄存器。
[0232] “CP_COMMAND[可选命令说明符]”指令1220启动特定目标操作,作用于由前面的CP_WRITE指令1216提供的输入数据和/或从存储器中复制由CP_WRITE指令1216写入到协处理器的协处理器寄存器的输入数据1218。在一些实施例中,例如在协处理器可配置为执行所选择的一个协处理器操作或多个协处理器操作的实施例中,要执行的特定协处理器操作1224可以由可选操作数(例如,命令说明符)指定。在光线追踪加速的当前示例中,多处理器使用协处理器来加速BVH的遍历,以通过协处理器执行的BVH遍历操作来确定光线-BVH交点。
[0233] “CP_READ<目的地寄存器>,<协处理器源地址>”指令1222使多处理器从协处理器“地址”读取输出数据并将其写入多处理器的一个或更多个寄存器。指定的协处理器地址可以指定数据RAM中在协处理器内部的物理位置和/或协处理器可访问的物理地址。在一些实施例中,指定的协处理器地址可以包括在写入多处理器时结果数据被解释和/或变换的方式的抽象规范。在示例性光线追踪加速中,可以使用一个或更多个CP_READ将检测到的一个或更多个光线-BVH交点和连续堆栈从协处理器返回到多处理器。
[0234] 根据示例性实施例,CP_READ指令1222是非阻塞的,并且当CP_READ执行时,由前面的CP_COMMAND 1220发起的操作不需要已经完成。实际上,CP_READ 1222是最终将输出数据写入指定的一个或更多个目标位置的承诺。
[0235] 示例性实施例提供了当结果数据在多处理器可访问的寄存器和/或其他存储器位置中并且准备好被消耗时,通知线程或线程组。如上所述,在一些实施例中,记分板用于在协处理器将来自协处理器执行的特定操作的结果数据写入1230到多处理器读取的位置时通知多处理器。也就是说,多处理器通过“release_when_complete”注释将显式命名记分板与CP_READ指令相关联。然后,线程或线程组在消耗结果之前等待记分板被立即释放,这允许在操作仍在进行时执行额外的工作。
[0236] “CP_CLOSE”指令1226使多处理器关闭到协处理器的连接。此时,特定协处理器操作的指定(包括输出结果数据的目的地寄存器)已完成,但协处理器正在执行的目标操作仍可在进行中。
[0237] {CP_OPEN,...,CP_CLOSE}序列中的唯一阻塞指令是CP_WAIT,其等待资源。所有后续指令可以在实现方式允许的范围内背靠背执行。实际上,它对于示例中CP_CLOSE之后的“任意中间指令(arbitrary intervening instruction)”1227有效,以包括另一个{CP_OPEN,...,CP_CLOSE}序列,其表示多个协处理器操作可以代表单个执行线程立刻在进行中。
[0238] 在一些示例性实施例中,每个连接是独立的。也就是说,协处理器在某种意义上是无状态的,即给定的操作(通过{CP_OPEN,...,CP_CLOSE}序列指定的)不会影响后来发生的协处理器操作(即CP_COMMAND指令指定的后来发生的特定协处理器命令),除非它的输出结果数据由线程或线程组直接或间接地用于影响后来发生的协处理器操作的输入,例如,通过经由CP_WRITE将这样的结果数据传递给后来发生的特定协处理器操作。
[0239] 一个或更多个WAIT_ON_SCOREBOARD指令1228是阻塞指令,其使得线程或线程组在先前的CP_READ 1226建立的特定记分板条目上等待。如上所述,记分板用于追踪定义的依赖性,并且用于当一个或更多个CP_READ指令中的每个指令将协处理器输出的结果数据写入多处理器寄存器和/或存储器时通知线程或线程组。
[0240] 活动1230示出了协处理器写入结果数据,作为由CP_COMMAND 1220在协处理器上执行所启动的特定目标操作的结果。在一些示例性实施例中,协处理器可以将结果数据写入协处理器可访问的存储器,多处理器通过指定一个或更多个CP_READ 1222指令中指定的“协处理器源地址”从其获得结果数据。
[0241] 在最后一个WAIT_ON_SCOREBOARD 1228被解除阻塞之后,线程或线程组可以消耗结果数据。在示例性光线追踪加速中,当最后一个WAIT_ON_SCOREBOARD被解除阻塞时,从协处理器返回的所有堆栈信息都将完成写入多处理器寄存器和/或存储器。然后,对线程或线程组的进一步处理可以通过存储(存储结果1232)或以其他方式消耗结果数据来进行。在示例性光线追踪加速中,消耗可以包括在确定图像特性以及确定要由协处理器处理的BVH的另一部分中的一个或更多个中使用返回的光线-BVH交点信息和连续堆栈。
[0242] 多指令序列中的指令级抢占
[0243] 为了提高应用程序性能,多处理器(诸如SM 132)可以被配置为在个体指令级抢占线程或线程组。在一些示例性实施例中,SM 132可以被配置为支持在任何点或者至少在线程或线程组的运行持续时间的实质部分期间被抢占的线程或线程组。为了随后可以以一致地恢复的方式抢占SM 132上的线程或线程组,必须保存协处理器相对于线程或线程组的状态并随后恢复。包括多指令序列的上述方案的另一个优点是可以使其与高性能多处理器的指令级抢占要求一致。
[0244] 这在示例性实施例中通过保留一系列协处理器地址来实现,所述协处理器地址提供对协处理器状态的访问,以供一个或更多个陷阱处理程序(trap handler)使用,所述陷阱处理程序负责保存和随后恢复线程状态,并且进一步要求已经在协处理器上采用CP_COMMAND启动的任何目标操作被允许在线程或线程组被抢占之前完成。
[0245] 图13包括示出根据一些示例性实施例的多处理器-协处理器接口处的指令级抢占的流程图。该流程图示出了当在线程或线程组执行关于图11A描述的多个指令序列中各个位置处发生陷阱时,在多处理器上执行的陷阱处理程序1300如何处理抢占。
[0246] 可以响应于在多处理器上或系统中的其他地方发生的中断来调用陷阱处理程序1300。当调用陷阱处理程序1300时,其确定当前正在执行的线程或线程组正在执行的多指令序列中的当前位置。当前正在执行的线程或线程组在下面称为“第一线程”,并且导致抢占的线程或线程组称为“第二线程”。
[0247] 如果第一线程的当前位置在CP_OPEN1302之前,则陷阱处理程序不对协处理器执行任何处理或状态保存,因为在多处理器和协处理器之间没有针对第一线程打开连接。因此,陷阱处理程序继续抢占1304第一线程并切换到第二线程,并且随后在第二线程完成、其时间片到期等之后切换回1306到第一线程。
[0248] 如果第一线程中的当前位置在CP_OPEN和CP_WAIT 1310之间,则陷阱处理程序可以注意到第一线程的CP_OPEN未决,但是然后可以通过发出CP_CLOSE1312立即关闭连接。陷阱处理程序然后继续抢占1314第一线程并切换到第二线程,并且随后切换回1316第一线程。当恢复第一线程的线程状态时,陷阱处理程序可以通过CP_OPEN1316重新打开代表第一线程的连接。
[0249] 如果第一线程的当前位置在CP_WAIT和CP_COMMAND 1320之间,则第一线程可能已经执行了任何数量的CP_WRITE指令。因此,陷阱处理程序1300可以在关闭连接之前通过发出CP_CLOSE 1324来由一系列CP_READ指令1322保存协处理器状态。然后陷阱处理程序继续抢占1326第一线程并切换到第二线程,并且随后切换回1328到第一线程。当恢复第一线程1330的线程状态时,陷阱处理程序通过CP_OPEN代表第一线程重新打开连接,然后通过一系列一个或更多个CP_WRITE指令恢复协处理器状态。
[0250] 如果第一线程的当前位置在CP_COMMAND和CP_CLOSE1340之间,则在序列中的该位置处,第一线程可能已经执行了任何数量的CP_READ指令。假定在执行陷阱处理程序之前允许CP_COMMAND启动的目标操作完成,则已执行的CP_READ指令将其结果写入寄存器,这可以通过陷阱处理程序以传统方式保存1342。为了使任何后续CP_READ指令产生正确的结果,陷阱处理程序必须保存1344并恢复1350协处理器状态。以与步骤1330类似的方式,为了恢复第一线程1350的线程状态,陷阱处理程序通过CP_OPEN代表第一线程重新打开连接,然后通过一系列一个或更多个CP_WRITE指令恢复协处理器状态。
[0251] 如果多指令序列的当前位置在CP_CLOSE 1360之后,则当前没有为多处理器和协处理器之间的第一线程打开连接,因此陷阱处理程序在抢占和恢复第一线程的过程中不执行协处理器状态的保存/恢复。因此,陷阱处理程序继续抢占1360第一线程并切换到第二线程,并且随后在第二线程完成、其时间片到期等之后切换回1362第一线程。
[0252] 以这种方式鲁棒地处理任意点处的抢占的特性是示例性实施例的非凡特性,如通过考虑看似微小的扰动可以看出的。例如,考虑如果省略CP_COMMAND指令以支持使操作的启动成为CP_CLOSE的副作用会发生什么。在这种方案中,不可能服务已经执行的CP_READ指令,因为假设在CP_CLOSE之前抢占,协处理器操作本身尚未启动。根据多处理器的详细信息,重放这些CP_READ指令可能不可行或涉及大量增加的复杂性。例如,简单地将目的地寄存器名称保存为协处理器状态的一部分本身不是解决方案,因为多线程处理器通常虚拟化寄存器,使得给定的寄存器名称可以对应于寄存器文件中的任何数目的物理位置,并且给定线程的名称到物理映射可能会根据其被抢占和恢复的详细信息而更改。
[0253] 此外,在一些示例性实施例中,可以由实现方式采用基本上本质上是装饰性的上述方案的一些变型,以便通过一个或更多个指令减少典型的多指令序列的长度。第一变体可以包括,如果指令编码中存在空间(可能是当支持的命令的数量小时的情况),则CP_COMMAND可以与序列中的最终CP_WRITE组合以形成组合的“CP_WRITE_AND_COMMAND”指令。类似于第一变体,第二变体包括CP_CLOSE可以与最终CP_READ组合以形成组合的“CP_READ_AND_CLOSE”指令。
[0254] 采用宏指令的简化的指令级抢占
[0255] 上面关于图11-图13描述的多指令序列说明了即使在存在抢占的情况下,示例性实施例中的多处理器-协处理器交互如何变得鲁棒。在某些示例性实施例中适用该基本接口的变型,以便消除如陷阱处理程序1300所使用的对协处理器状态的原始访问的需要。这种调整可以降低设计和验证复杂性,并且还可以更适合于协处理器,其在两个或多个多处理器之间共享。
[0256] 发明人在自适应中实现的想法是通过在子序列的持续时间内禁用中断,将关于图11A描述的多指令序列内完整的{CP_OPEN,...,CP_CLOSE}指令子序列融合为单个“宏指令”。此外,宏指令以不会被滥用或意外误用的方式实现,以使中断无限期地被禁用。这是采用宏启动指令(例如“CP_MACRO_FUSE”)来完成的,其采用多处理器配置为在没有中断的情况下执行的指令的显式计数。在本文的描述中,采用计数排除CP_MACRO_FUSE指令本身的约定,但是实施例不限于此。
[0257] 由三个“微指令”组成的宏指令将具有以下一般形式:
[0258] CP_MACRO_FUSE 3
[0259] MICRO_INST_A
[0260] MICRO_INST_B
[0261] MICRO_INST_C
[0262] 也就是说,三个微指令的宏指令包括宏启动指令
[0263] (CP_MACRO_FUSE),后面跟着三个微指令。当应用于关于图11A、图11B和图12描述的多处理器-协处理器接口时,CP_MACRO_FUSE与CP_WAIT组合以形成新的CP_MACRO_FUSE指令,以使其具有融合完全协处理器指令子序列(CP_OPEN除外)的期望效果,同时还消除了线程禁用中断的可能性,然后等待不确定的时间长度,以便分配协处理器资源并打开连接,如果CP_OPEN包含在宏指令中,就会发生这种情况。
[0264] 利用该增强,关于图11-图12描述的示例性多指令序列适用于:
[0265] CP_OPEN
[0266] CP_MACRO_FUSE 7
[0267] CP_WRITE cp[0x100]R2,R3
[0268] CP_WRITE cp[0x208]R4,R5
[0269] CP_WRITE cp[0x300]R10,R11
[0270] CP_COMMAND 0x1
[0271] CP_READ R12,R13,cp[0x400]&release_when_complete(sb0)
[0272] CP_READ R16,R17,cp[0x460]&release_when_complete(sb1)
[0273] CP_CLOSE
[0274] #...
[0275] #...(可选的任意中间指令)
[0276] #...
[0277] WAIT_ON_SCOREBOARD sb0
[0278] WAIT_ON_SCOREBOARD sb1
[0279] …
[0280] #Consume results(例如,将结果存储到存储器):
[0281] STORE[R7],R12
[0282] #...
[0283] 如上所示的适应的多指令序列包括“CP_MACRO_FUSE 7”指令,其指定在禁用中断的同时发出序列中的接下来的7个指令。接下来的7个指令包括如所指定的序列中的所有CP_WRITE、CP_COMMAND、CP_READ和CP_CLOSE指令。只有在该7个指令之后才能启用中断。因此,在适应的多指令序列中,保证整个子序列{CP_OPEN...CP_CLOSE}在没有抢占的情况下执行。
[0284] 传统技术可用于禁用中断,并随后启用中断。
[0285] 图14A包括根据一些示例性实施例的发出适应的多指令序列(即,包括CP_MACRO_FUSE指令)的过程1400的流程图。来自关于图11A描述的过程1100的唯一变化是在CP_OPEN 1402之后在步骤1404发出的CP_MACRO_FUSE指令(以及相关的中断禁用),并且在步骤1408中启用中断。在图14A中,步骤1402对应于关于图11A所描述的步骤1102,步骤1406对应于关于图11A所描述的步骤1104-1112,步骤1408对应于关于图11A所描述的步骤1114,步骤1410对应于关于图11A所描述的步骤1116。
[0286] 注意,执行多指令序列的线程或线程组仍然可以在CP_OPEN和CP_MACRO_FUSE指令之间被抢占。因此,陷阱处理程序被配置为检查这种可能性(例如,通过专用指令),然后在将控制返回到恢复的线程之前,通过CP_OPEN代表线程打开新的连接。就协处理器接口而言,这可能是陷阱处理程序唯一的剩余责任。还要注意,虽然陷阱处理程序必须通过CP_OPEN启动连接打开,但它不需要等待分配协处理器资源或实际打开连接,因为这是由在CP_MACRO_FUSE(例如,其包括连接打开上的CP_WAIT)等待的已恢复线程完成的。
[0287] CP_MACRO_FUSE指令实际上实现了通过一系列更简单的微指令完成的作为可变长度“宏指令”的协处理器指令。示例性实施例中的实现满足若干高级要求,包括以下内容:(1)宏指令必须被视为用于计算指令级抢占(CILP)目的的单个指令;(2)对于可以在ISA中表达的所有可能的宏指令,抢占延迟必须保持被界定,特别是,硬件必须保证宏指令机制不能被滥用以无限期地阻止陷阱;以及(3)宏指令必须被视为用于单步调试目的的单指令。
[0288] 如关于图11A所描述的,CP_OPEN请求分配查询所需的协处理器资源。资源可以包括用于连接的“票”以及每个线程或线程组的一个或更多个“执行槽”。CP_OPEN是非阻塞的,但它具有在SM中设置与线程或线程组关联的标记的副作用,称为“CP_WAIT_FLAG”位。注意,CP_OPEN不是协处理器宏指令的一部分。
[0289] 宏指令以宏启动指令“CP_MACRO_FUSE”开始。在CP_WAIT_FLAG被清除之前,该微指令不具有发出的资格。一旦完成,下一个N微指令也可以保证在SM可以陷入之前完成,其中N被指定为CP_MACRO_FUSE指令的立即操作数。
[0290] 宏内允许的唯一指令是CP_MACRO_FUSE(其必须开始宏)、CP_WRITE、CP_COMMAND、CP_READ和CP_CLOSE指令。
[0291] 在CP_WAIT_FLAG位被清除之前(即,直到SM从协处理器接收到已经为该线程或线程组分配了票的确认),CP_MACRO_FUSE才有资格发出。
[0292] 采用部分结果返回改进并发性
[0293] 能够并行(代表一个或更多个线程)执行多个操作的协处理器需要一定量的资源用于进行中的每个操作。示例性所需资源可以包括内部工作存储器和用于在将结果返回到主机处理器之前存储结果的空间。除非它们被过度提供(以协处理器上的区域为代价),否则这些资源可能会限制每次可以进行的操作的数量,从而限制操作结果在空闲执行单元(在协处理器和/或多处理器中,由于线程等待协处理器操作完成)中延迟的情况下的总体吞吐量。
[0294] 为了减轻这种低效率,一些示例性实施例以比单个“执行槽”更精细的粒度为特定协处理器目标操作分配协处理器资源。例如,目标操作可能包括更多数量的彼此独立的子操作或“工作项”。在SIMD多处理器中,此类工作项可能对应于线程启动操作时处于活动状态的SIMD通道。
[0295] 在这种情况下,因为工作项是独立的,其可以,并且一些示例性实施例被配置为,将结果数据写回到仅用于工作项的子集的寄存器并且在完成一组项目(以及因此目标操作)之前释放任何相关联的协处理器资源。因此,根据一些实施例,可以在关闭与线程或线程组相关联的连接之前清除保存结果数据的一些协处理器资源(例如,执行槽),从而使得能够在释放这些资源时重用这些资源。这利用了多处理器中的寄存器文件中的存储,对应于CP_WRITE指令的目的地寄存器,否则这些寄存器将被置空。请注意,不必立即写回给定CP_WRITE的所有数据;例如,在目的地寄存器是向量寄存器(每个SIMD通道具有一个寄存器)的情况下,每次仅写回通道子集的结果可能是有利的。至少在一些实施例中,唯一的要求是程序不消耗来自给定CP_WRITE的结果,直到该CP_WRITE的所有结果都存在于多处理器寄存器文件中。在记分板指示准备就绪的实施例中,这意味着在所有结果都被写回之前不应释放记分板。
[0296] 在示例性实施例中,多处理器-协处理器接口使多处理器能够命令协处理器在多达32个工作项(例如,对应于32个通道或线程束中的“线程”)上执行协处理器操作(例如,BVH的光线遍历、“TTU查询”)。该示例性实施例中的工作项可以包括光线。协处理器目标操作(例如,“TTU查询”)可以以可配置的粒度写回光线相交结果,其中默认粒度可以是8条光线。图14B和图14C示出了从协处理器输出的结果,用于将16线程组的线程以4个线程的组返回到多处理器寄存器,从而释放在协处理器上为线程组中的各个线程保留的相应执行槽,作为对于每个相应的线程完成的目标操作。如图14B所示,当整个16线程组同时将结果写入多处理器寄存器时,16个线程中的每一个使用的协处理器存储器仍然被占用,并且多处理器中的所有寄存器文件,即使被分配,也保持空闲。相比之下,如图14C所示,允许16个线程的组以4个线程的组的形式将结果返回到多处理器寄存器。当每个线程子组完成其在协处理器上的处理时,结果的时间交错返回提高了多处理器中已经分配的寄存器的利用率,同时当线程的各个子组完成协处理器各自的使用时更快地释放有价值的协处理器存储器。这显著(例如,数十个百分点)改善了处理器固定区域要求的性能,或者从另一个角度来看,减小了固定性能的面积。
[0297] 通用多处理器-协处理器接口
[0298] 如上所述,实施例不限于对应于SM 132和TTU 700之间的接口的多处理器-协处理器接口。图15示出了系统1500,其包括多处理器1502和协处理器1504之间的接口,多处理器1502可以是与SM 132不同类型的多处理器,协处理器1504可以是与TTU 700不同类型的协处理器。多处理器1502和协处理器1504可以通过通信总线1505直接通信,并且都可以访问共享存储器1506。尽管共享存储器1506示出为位于协处理器1504和多处理器1502外部,但不限于此。在一些实施例中,共享存储器1506可以位于协处理器1502内部,单独地或与协处理器的本地存储器1520集成。在一些实施例中,共享存储器1506可以是高速缓存存储器(例如,诸如TTU 700的L0/L1高速缓存)或协处理器仅能够读访问的其他存储器。
[0299] 多处理器1502被配置为同时执行多个线程1510,并且还可以被配置为命令协处理器1504执行协处理器操作1526中的一个或更多个,以加速多个线程1510中的一个或一组的处理。如上所述,在SIMD多处理器中,可以调度一组线程(例如,线程束)以同时执行。
[0300] 协处理器1504可以包括其自己的调度1524,其可以确保由多处理器提交给协处理器的工作项(即线程)的公平调度。协处理器还可以包括其本地存储器(例如,RAM)1520和寄存器1522。
[0301] 根据上述一个或更多个实施例的多处理器1502可以包括陷阱处理程序1518,其例如根据上述过程1300进行操作。多处理器1502还可以包括CP_WAIT_FLAG1516,其在执行CP_WAIT指令或CP_MACROFUSE指令时设置标记/位,并且当多处理器被通知所请求的协处理器连接被建立时被清除。多处理器可能配置为在调度线程之前检查CP_WAIT_FLAG1516,以确保特定线程或线程组仅在所需的协处理器可用时才进行到协处理器操作,并确保给定的线程或线程组在任何给定时间打开不超过一个待定连接。
[0302] 多处理器还可以包括MACROFUSE计数器1514,其可以用作计数器,用于在它们由CP_MACRO_FUSE指令禁用之后确定何时重新启用中断。例如,当多指令序列中的CP_MACRO_FUSE指令指定要执行n个指令而不允许抢占时,可以将计数器1514设置为具有n值的倒数计时器。然后,对于每个发出的指令递减计数器,直到达到0。
[0303] 共享存储器1506可以包括用于在多处理器1502和协处理器1504之间交换数据的存储器位置。在一些实施例中,协处理器可以不具有对共享存储器1506的写访问权。在一些实施例中,共享存储器1506可以包括协处理器只具有读访问权的一个或更多个级别的高速缓存存储器。
[0304] 在一些实施例中,共享存储器1506可以具有原始协处理器状态1530和记分板1532。在一些实施例中,原始协处理器状态1530可以位于协处理器本地存储器1520中。当原始协处理器状态1530在协处理器本地存储器1520中时,多处理器仍然可以根据需要访问它,例如,通过由在多处理器上执行的陷阱处理程序发出的一系列CP_READ。原始协处理器状态1530包括在抢占在多处理器上执行的线程或线程组时协处理器存储器和寄存器的状态。
[0305] 记分板1532用于在可以异步执行的目标操作完成其结果输出并且将结果写入多处理器的寄存器或存储器时通知多处理器。
[0306] 如上所述,请求数据采用用于触发线程或线程组的协处理器目标操作的命令,经由寄存器和/或共享存储器被传递到协处理器。协处理器执行目标操作,并最终将结果写回共享存储器或寄存器组。然后,多处理器将结果数据从协处理器写入的位置写入到多处理器存储器和/或寄存器,同时递减记分板以指示结果已准备好被消耗。在结果未写入共享存储器的一些示例性实施例中,协处理器可以将包含结果的一个或更多个分组通过接口发送到多处理器,其中它们被写入多处理器中的寄存器。服务于给定CP_READ的最后一个分组可以包括指示应该释放记分板的字段。最后一个分组还可以包括记分板条目的索引,因为该索引可以作为给定CP_READ的一部分由多处理器提供给协处理器。
[0307] 包括光线追踪的示例性图像生成管线
[0308] 上述光线追踪和其他能力可以以各种方式使用。例如,除了用于使用光线追踪来渲染场景之外,它们还可以与扫描变换技术结合实现,例如在扫描变换3D模型的几何构建块(即,诸如三角形的多边形图元)以用于生成用于显示的图像(例如,在图1中所示的显示器150上)的上下文中。图16示出了根据实施例的用于处理图元以提供图像的图像像素值的示例性流程图。
[0309] 如图16所示,可以响应于接收到用户输入而生成3D模型的图像(步骤1652)。用户输入可以是显示图像或图像序列的请求,诸如在与应用程序(例如,游戏应用程序)交互期间执行的输入操作。响应于用户输入,系统使用传统的GPU 3D图形管线执行场景的3D模型几何图元的扫描变换和光栅化(步骤1654)。几何图元的扫描变换和光栅化可以包括例如处理3D模型的图元以使用传统技术(诸如本领域技术人员所公知的照明、变换、纹理映射、光栅化等)来确定图像像素值,下面结合图20讨论。生成的像素数据可以写入帧缓冲器。
[0310] 在步骤1656中,可以使用TTU硬件加速从光栅化图元上的一个或更多个点追踪一个或更多个光线。可以根据本申请中公开的一种或更多种光线追踪能力来追踪光线。基于光线追踪的结果,可以修改存储在缓冲器中的像素值(步骤1658)。在一些应用中,修改像素值可以例如通过应用更逼真的反射和/或阴影来改善图像质量。使用存储在缓冲器中的修改的像素值显示图像(步骤1660)。
[0311] 在一个示例中,可以使用关于图17-图19、图21、图22、图23和/或图24描述的处理系统来实现几何图元的扫描变换和光栅化,并且可以由SM 132使用关于图9描述的TTU架构来实现光线追踪,以添加进一步的可视化特征(例如镜面反射、阴影等)。图16仅仅是非限制性示例-SM 132可以自己使用所描述的TTU而无需纹理处理或其他传统3D图形处理来产生图像,或者SM可以采用纹理处理和其他传统3D图形处理而无需所描述的TTU来产生图像。SM还可以根据应用在软件中实现任何期望的图像生成或其他功能,以提供不受纹理映射硬件、树遍历硬件或其他图形管线硬件提供的硬件加速特征界定的任何期望的可编程功能。
[0312] 包括光线追踪的示例性并行处理架构
[0313] 上面描述的TTU结构可以在示例性非限制性并行处理系统架构中实现,或者与其相关联,例如下面结合图17-图24所描述的。这种并行处理架构可用于例如实现图1的GPU 130。
[0314] 示例性并行处理架构
[0315] 图17示出了示例非限制性的并行处理单元(PPU)1700。在一个实施例中,PPU 1700是在一个或更多个集成电路器件上实现的多线程处理器。PPU 1700是设计用于并行处理许多线程的延迟隐藏架构。线程(即,执行线程)是被配置为由PPU 1700执行的指令集的实例化。在一个实施例中,PPU 1700被配置为实现用于处理三维(3D)图形数据的图形渲染管线,以便生成二维(2D)图像数据,用于在显示设备(诸如液晶显示(LCD)设备、有机发光二极管(OLED)设备、透明发光二极管(TOLED)设备、场发射显示器(FED)、场顺序显示器、投影显示器、头戴式显示器或任何其他所需显示器)上显示。在其他实施例中,PPU 1700可以用于执行通用计算。尽管为了说明的目的本文提供了一个示例性并行处理器,但应特别指出的是,该处理器仅出于说明目的进行阐述,并且可使用任何处理器来补充和/或替代该处理器。
[0316] 例如,一个或更多个PPU 1700可以被配置为加速数千个高性能计算(HPC)、数据中心和机器学习应用。PPU 1700可被配置为加速众多深度学习系统和应用,包括自动驾驶汽车平台、深度学习、高精度语音、图像和文本识别系统、智能视频分析、分子模拟、药物发现、疾病诊断、天气预报、大数据分析、天文学、分子动力学模拟、金融建模、机器人技术、工厂自动化、实时语言翻译、在线搜索优化和个性化用户推荐等。
[0317] PPU 1700可以包括在台式计算机、膝上型计算机、平板计算机、服务器、超级计算机、智能电话(例如,无线、手持设备)、个人数字助理(PDA)、数码相机、车辆、头戴式显示器、手持电子设备等中。在一个实施例中,PPU 1700体现在单个半导体衬底上。在另一个实施例中,PPU 1700与一个或更多个其他器件(例如,附加PPU 1700、存储器1704、精简指令集计算机(RISC)CPU、存储器管理单元(MMU)、数模转换器(DAC)等)一起被包括在片上系统(SoC)中。
[0318] 在一个实施例中,PPU 1700可以被包括在包括一个或更多个存储器器件1704的图形卡上。图形卡可以被配置为与台式计算机的主板上的PCIe插槽接口。在又一个实施例中,PPU 1700可以是包括在主板的芯片组中的集成图形处理单元(iGPU)或并行处理器。
[0319] 如图17所示,PPU 1700包括输入/输出(I/O)单元1705、前端单元1715、调度器单元1720、工作分配单元1725、集线器1730、交叉开关(Xbar)1770、一个或更多个通用处理集群(GPC)1750以及一个或更多个分区单元1780。PPU 1700可以经由一个或更多个高速NVLink 
1710互连连接到主机处理器或其他PPU 1700。PPU 1700可以经由互连1702连接到主机处理器或其他外围设备。PPU 1700还可以连接到包括多个存储器设备1704的本地存储器。在一个实施例中,本地存储器可以包括多个动态随机存取存储器(DRAM)器件。DRAM器件可以被配置为高带宽存储器(HBM)子系统,其中多个DRAM裸晶(die)堆叠在每个器件内。
[0320] NVLink 1710互连使得系统能够扩展并且包括与一个或更多个CPU结合的一个或更多个PPU 1700,支持PPU 1700和CPU之间的高速缓存一致性以及CPU主控。数据和/或命令可以由NVLink 1710通过集线器1730发送到PPU 1700的其他单元或从其发送,例如一个或更多个复制引擎、视频编码器、视频解码器、电源管理单元等(未明确示出)。结合图23更详细地描述NVLink 1710。
[0321] I/O单元1705被配置为通过互连1702从主机处理器(未示出)发送和接收通信(即,命令、数据等)。I/O单元1705可以经由互连1702直接与主机处理器通信,或通过一个或更多个中间设备(诸如存储器桥)与主机处理器通信。在一个实施例中,I/O单元1705可以经由互连1702与一个或更多个其他处理器(例如,一个或更多个PPU 1700)通信。在一个实施例中,I/O单元1705实现外围组件互连高速(PCIe)接口,用于通过PCIe总线进行通信,并且互连1702是PCIe总线。在替代实施例中,I/O单元1705可以实现其他类型的已知接口,用于与外部设备进行通信。
[0322] I/O单元1705对经由互连1702接收的分组进行解码。在一个实施例中,分组表示被配置为使PPU 1700执行各种操作的命令。I/O单元1705按照命令指定将解码的命令发送到PPU 1700的各种其他单元。例如,一些命令可以被发送到前端单元1715。其他命令可以被发送到集线器1730或PPU 1700的其他单元,诸如一个或更多个复制引擎、视频编码器、视频解码器、电源管理单元等(未明确示出)。换句话说,I/O单元1705被配置为在PPU 1700的各种逻辑单元之间和之中路由通信。
[0323] 在一个实施例中,由主机处理器执行的程序在缓冲区中对命令流进行编码,该缓冲区向PPU 1700提供工作量用于处理。工作量可以包括要由那些指令处理的若干指令和数据。缓冲区是存储器中可由主机处理器和PPU 1700两者访问(即,读/写)的区域。例如,I/O单元1705可以被配置为经由通过互连1702发送的存储器请求访问连接到互连1702的系统存储器中的缓冲区。在一个实施例中,主机处理器将命令流写入缓冲区,然后向PPU 1700发送指向命令流开始的指针。前端单元1715接收指向一个或更多个命令流的指针。前端单元1715管理一个或更多个流,从流读取命令并将命令转发到PPU 1700的各个单元。
[0324] 前端单元1715耦合到调度器单元1720,调度器单元1720配置各种GPC 1750以处理由一个或更多个流定义的任务。调度器单元1720被配置为追踪与由调度器单元1720管理的各种任务相关的状态信息。状态可以指示任务被指派给哪个GPC 1750,该任务是活动的还是不活动的,与该任务相关联的优先级等等。调度器单元1720管理一个或更多个GPC 1750上的多个任务的执行。
[0325] 调度器单元1720耦合到工作分配单元1725,工作分配单元1725被配置为分派任务以在GPC 1750上执行。工作分配单元1725可以追踪从调度器单元1720接收到的多个调度任务。在一个实施例中,工作分配单元1725为每个GPC 1750管理待处理(pending)任务池和活动任务池。待处理任务池可以包括多个槽(例如,32个槽),其包含被指派为由特定GPC 1750处理的任务。活动任务池可以包括多个槽(例如,4个槽),用于正在由GPC 1750主动处理的任务。当GPC 1750完成任务的执行时,该任务从GPC 1750的活动任务池中逐出,并且来自待处理任务池的其他任务之一被选择和调度以在GPC 1750上执行。如果GPC 1750上的活动任务已经空闲,例如在等待数据依赖性被解决时,那么活动任务可以从GPC 1750中逐出并返回到待处理任务池,而待处理任务池中的另一个任务被选择并调度以在GPC 1750上执行。
[0326] 工作分配单元1725经由XBar(交叉开关)1770与一个或更多个GPC 1750通信。XBar 1770是将PPU 1700的许多单元耦合到PPU 1700的其他单元的互连网络。例如,XBar 1770可以被配置为将工作分配单元1725耦合到特定的GPC 1750。虽然没有明确示出,但PPU 1700的一个或更多个其他单元也可以经由集线器1730连接到XBar 1770。
[0327] 任务由调度器单元1720管理并由工作分配单元1725分派给GPC 1750。GPC 1750被配置为处理任务并生成结果。结果可以由GPC 1750内的其他任务消耗,经由XBar 1770路由到不同的GPC 1750,或者存储在存储器1704中。结果可以经由分区单元1780写入存储器1704,分区单元1780实现用于从存储器1704读取数据和/或向存储器1704写入数据的存储器接口。结果可以经由NVLink1710发送到另一个PPU 1704或CPU。在一个实施例中,PPU 
1700包括数目为U的分区单元1780,其等于耦合到PPU 1700的独立且不同的存储器设备
1704的数目。下面将结合图18更详细地描述分区单元1780。
[0328] 在一个实施例中,主机处理器(例如,图1的处理器120)执行实现应用程序编程接口(API)的驱动程序内核,其使得能够在主机处理器上执行一个或更多个应用程序,以调度用于在PPU 1700上执行的操作。在一个实施例中,多个计算机应用程序由PPU 1700同时执行,并且PPU 1700为多个计算机应用程序提供隔离、服务质量(QoS)和独立地址空间。应用程序可以生成指令(即API调用),其使得驱动程序内核生成一个或更多个任务以由PPU 1700执行。驱动程序内核将任务输出到正在由PPU 1700处理的一个或更多个流。每个任务可以包括一个或更多个相关线程组,本文称为线程束(warp)。在一个实施例中,线程束包括可以并行执行的32个相关线程。协作线程可以指代包括用于执行任务的指令并且可以通过共享存储器交换数据的多个线程。结合图21更详细地描述线程和协作线程。
[0329] 示例性存储器分区单元
[0330] MMU 1890提供GPC 1750和分区单元1780之间的接口。MMU 1890可以提供虚拟地址到物理地址的转换,存储器保护和存储器请求的仲裁。在一个实施例中,MMU 1890提供一个或更多个转换后备缓冲器(TLB),用于执行虚拟地址到存储器1704中的物理地址的转换。
[0331] 图18示出了根据实施例的图17的PPU 1700的存储器分区单元1780。如图18所示,存储器分区单元1780包括光栅操作(ROP)单元1850、二级(L2)高速缓存1860和存储器接口1870。存储器接口1870耦合到存储器1704。存储器接口1870可以实现用于高速数据传输的
32、64、128、1024位数据总线等。在一个实施例中,PPU 1700包含U个存储器接口1870,每对分区单元1780一个存储器接口1870,其中每对分区单元1780连接到相应的存储器设备
1704。例如,PPU 1700可以连接到多达Y个存储器设备1704,例如高带宽存储器堆栈或图形双数据速率,版本5,同步动态随机存取存储器或其他类型的持久存储器。
[0332] 在一个实施例中,存储器接口1870实现HBM2存储器接口并且Y等于U的一半。在一个实施例中,HBM2存储器堆栈与PPU 1700位于相同的物理封装上,与传统的GDDR5SDRAM系统相比,其提供了相当大的功率和面积节省。在一个实施例中,每个HBM2堆栈包括四个存储器裸晶并且Y等于4,HBM2堆栈包括每个裸晶两个128位通道,总共8个通道和1024位的数据总线宽度。
[0333] 在一个实施例中,存储器1704支持单纠错双错误检测(SECDED)纠错码(ECC)以保护数据。ECC为对数据损坏敏感的计算应用程序提供更高的可靠性。可靠性在大规模集群计算环境中尤其重要,其中PPU 1700处理非常大的数据集和/或长时间运行应用程序。
[0334] 在一个实施例中,PPU 1700实现多级存储器层次。在一个实施例中,存储器分区单元1780支持统一存储器,以为CPU和PPU 1700存储器提供单个统一虚拟地址空间,从而实现虚拟存储器系统之间的数据共享。在一个实施例中,追踪PPU 1700对位于其他处理器上的存储器的访问频率,以确保将存储器页面移动到更频繁地访问页面的PPU 1700的物理存储器。在一个实施例中,NVLink 1710支持地址转换服务,允许PPU 1700直接访问CPU的页表并由PPU 1700提供对CPU存储器的完全访问。
[0335] 在一个实施例中,复制引擎在多个PPU 1700之间或在PPU 1700和CPU之间传输数据。复制引擎可以为未映射到页表的地址生成页面错误。然后,存储器分区单元1780可以服务页面错误,将地址映射到页表中,之后复制引擎可以执行该传输。在传统系统中,存储器被固定(即,不可分页)以用于多个处理器之间的多个复制引擎操作,从而大大减少了可用存储器。使用硬件页面错误,可以将地址传递给复制引擎,而不必担心存储器页面是否驻留,并且复制过程是透明的。
[0336] 来自存储器1704或其他系统存储器的数据可以由存储器分区单元1780获取并存储在L2高速缓存1860中,L2高速缓存1860位于芯片上并且在各种GPC 1750之间共享。如图所示,每个存储器分区单元1780包括与相应的存储器设备1704相关联的L2高速缓存1860的一部分。然后,可以在GPC 1750内的各种单元中实现较低级的高速缓存。例如,SM 1840中的每一个可以实现一级(L1)高速缓存。L1高速缓存是专用于特定SM1840的专用存储器。可以获取来自L2高速缓存1860的数据并将其存储在每个L1高速缓存中,以便在SM 1840的功能单元中进行处理。L2高速缓存1860被耦合到存储器接口1870和XBar 1770。
[0337] ROP单元1850执行与像素颜色有关的图形光栅操作,例如颜色压缩、像素混合等。ROP单元1850还结合光栅引擎1825实现深度测试,接收与来自光栅引擎1825的剔除引擎的像素片段相关联的样本位置的深度。针对深度缓冲器中的对应深度测试与片段关联的样本位置的深度。如果片段通过样本位置的深度测试,则ROP单元1850更新深度缓冲器并将深度测试的结果发送到光栅引擎1825。应当理解,分区单元1780的数量可以不同于GPC 1750的数量,并且因此每个ROP单元1850可以耦合到每个GPC 1750。ROP单元1850追踪从不同GPC 
1750接收的分组,并且确定由ROP单元1850生成的结果通过Xbar 1770被路由到哪个GPC 
1750。虽然ROP单元1850被包括在图18中的存储器分区单元1780内,但在其他实施例中,ROP单元1850可以在存储器分区单元1780之外。例如,ROP单元1850可以驻留在GPC 1750或另一单元中。
[0338] 示例性通用处理群集
[0339] 图19示出了根据一个实施例的图17的PPU 1700的GPC 1750。如图19所示,每个GPC 1750包括用于处理任务的多个硬件单元。在一个实施例中,每个GPC 1750包括管线管理器
1810、预光栅操作单元(PROP)1815、光栅引擎1825、工作分配交叉开关(WDX)1880、存储器管理单元(MMU)1890以及一个或更多个数据处理集群(DPC)1820。应当理解,图19的GPC 1750可以包括代替图19中所示单元的其他硬件单元或除图19中所示单元之外的其他硬件单元。
[0340] 在一个实施例中,GPC 1750的操作由管线管理器1810控制。管线管理器1810管理用于处理分配给GPC 1750的任务的一个或更多个DPC 1820的配置。在一个实施例中,管线管理器1810可以配置一个或更多个DPC 1820中的至少一个来实现图形渲染管线的至少一部分。
[0341] 包括在GPC 1750中的每个DPC 1820包括M管道控制器(MPC)1830、图元引擎1835、一个或更多个SM 1840、一个或更多个纹理单元1842以及一个或更多个TTU 700。SM 1840可以与上述SM 132类似地构造。MPC 1830控制DPC 1820的操作,将从管线管理器1810接收的分组路由到DPC 1820中的适当单元。例如,与顶点相关联的分组可以被路由到图元引擎1835,其被配置为获取与来自存储器1704的顶点相关联的顶点属性。相反,与着色器程序相关联的分组可以被发送到SM 1840。
[0342] 当被配置用于通用并行计算时,与图形处理相比,可以使用更简单的配置。具体地,图17中所示的固定功能图形处理单元被绕过,创建一个更简单的编程模型。在通用并行计算配置中,工作分配单元1725将线程块直接分配和分发给DPC 1820。块中的线程执行相同的程序,在计算中使用唯一的线程ID以确保每个线程生成唯一的结果,使用SM 1840执行程序并执行计算,使用共享存储器/L1高速缓存1970以在线程之间通信,并且使用LSU 1954以通过共享存储器/L1高速缓存1970和存储器分区单元1780读取和写入全局存储器。当配置用于通用并行计算时,SM 1840还可以写入调度器单元1720可以用来在DPC 1820上启动新工作的命令。TTU 700可以用于在通用计算的上下文中加速空间查询。
[0343] 图形渲染管线
[0344] DPC 1820可以被配置为在可编程流式多处理器(SM)1840上执行顶点着色程序,其可以采用TTU 700加速某些着色操作。管线管理器1810还可以被配置为将从工作分配单元1725接收的分组路由到GPC 1750中适当的逻辑单元。例如,一些分组可以被路由到PROP 
1815和/或光栅引擎1825中的固定功能硬件单元,而其他分组可以被路由到DPC 1820以供图元引擎1835或SM 1840处理。在一个实施例中,管线管理器1810可以配置一个或更多个DPC 1820中的至少一个以实现神经网络模型和/或计算管线。
[0345] PROP单元1815被配置为将由光栅引擎1825和DPC 1820生成的数据路由到光栅操作(ROP)单元,其结合图18更详细地描述。PROP单元1815还可以被配置为执行颜色混合的优化,组织像素数据,执行地址转换等。
[0346] 光栅引擎1825包括被配置为执行各种光栅操作的多个固定功能硬件单元。在一个实施例中,光栅引擎1825包括设置引擎、粗光栅引擎、剔除引擎、裁剪引擎、精细光栅引擎和图块聚合引擎。设置引擎接收变换后的顶点并生成与由顶点定义的几何图元相关联的平面方程。平面方程被发送到粗光栅引擎以生成图元的覆盖信息(例如,图块的x、y覆盖掩码)。粗光栅引擎的输出被发送到剔除引擎,其中与未通过z-测试的图元相关联的片段被剔除,并且未被剔除的片段被发送到裁剪引擎,其中位于视锥体之外的片段被裁剪掉。那些经过裁剪和剔除后留下来的片段可以被传递到精细光栅引擎,以基于由设置引擎生成的平面方程生成像素片段的属性。光栅引擎1825的输出包括例如要由在DPC 1820内实现的片段着色器处理的片段。
[0347] 更详细地,PPU 1700被配置为接收指定用于处理图形数据的着色器程序的命令。图形数据可以被定义为一组图元,例如点、线、三角形、四边形、三角形条等。通常,图元包括指定图元的多个顶点的数据(例如,在模型空间坐标系中)以及与图元的每个顶点相关联的属性。PPU 1700可以被配置为使用例如TTU 700作为硬件加速资源来处理图元以生成帧缓冲器(即,用于显示器的每个像素的像素数据)。
[0348] 应用程序将场景的模型数据(即,顶点和属性的集合)写入存储器(诸如系统存储器或存储器1704)。模型数据定义可在显示器上可见的每个对象。如上所述,模型数据还可以定义如上描述的一个或更多个BVH。然后,应用程序对驱动程序内核进行API调用,请求呈现和显示模型数据。驱动程序内核读取模型数据并将命令写入一个或更多个流以执行处理模型数据的操作。命令可以引用要在PPU 1700的SM 1840上实现的不同着色器程序,包括顶点着色器、外壳着色器、域着色器、几何着色器、像素着色器、光线生成着色器、光线相交着色器、光线碰撞着色器和光线未碰撞着色器中的一个或更多个(这些着色器对应于DirectX光线追踪(DXR)API定义的着色器,忽略“最近碰撞”和“任意碰撞”着色器之间的任何区别;参阅https://devblogs.nvidia.com/introduction-nvidia-rtx-directx-ray-tracing/)。例如,SM 1840中的一个或更多个可以被配置为执行顶点着色器程序,该顶点着色器程序处理由模型数据定义的多个顶点。在一个实施例中,不同的SM 1840可以被配置为同时执行不同的着色器程序。例如,SM 1840的第一子集可以被配置为执行顶点着色器程序,而SM 1840的第二子集可以被配置为执行像素着色器程序。SM 1840的第一子集处理顶点数据以产生经处理的顶点数据,并将经处理的顶点数据写入L2高速缓存1860和/或存储器1704(参见图18)。在经处理的顶点数据被光栅化(即,从三维数据变换成屏幕空间中的二维数据)以产生片段数据之后,SM 1840的第二子集执行像素着色器以产生经处理的片段数据,然后将其与其他经处理的片段数据混合并写入存储器1704中的帧缓冲器。顶点着色器程序和像素着色器程序可以同时执行,以管线方式处理来自同一场景的不同数据,直到场景的所有模型数据都已被渲染到帧缓冲器。然后,帧缓冲器的内容被发送到显示控制器以在显示设备上显示。
[0349] 图20是由图17的PPU 1700实现的图形处理管线2000的概念图。图形处理管线2000是被实现为从3D几何数据生成2D计算机生成的图像的处理步骤的抽象流程图。众所周知,管线架构可以通过将操作分成多个阶段来更有效地执行长延迟操作,其中每个阶段的输出耦合到下一个连续阶段的输入。因此,图形处理管线2000接收输入数据2001,其从图形处理管线2000的一个阶段被发送到下一个阶段以生成输出数据2002。在一个实施例中,图形处理管线2000可以表示由 API定义的图形处理管线。作为选择,图形处理管线2000可以在前面的附图和/或任何后续附图的功能和架构的上下文中实现。如上面参考图16所讨论的那样,光线追踪可用于改善由几何图元的光栅化生成的图像质量。在一些实施例中,本申请中公开的光线追踪操作和TTU结构可以应用于图形处理管线2000的一个或更多个状态,以改善主观图像质量。
[0350] 如图20所示,图形处理管线2000包括包含多个阶段的管线架构。这些阶段包括但不限于数据组装阶段2010,顶点着色阶段2020,图元组装阶段2030,几何着色阶段2040,视口缩放、剔除和裁剪(VSCC)阶段2050,光栅化阶段2060,片段着色阶段2070和光栅操作阶段2080。在一个实施例中,输入数据2001包括配置处理单元以实现图形处理管线2000的阶段的命令和由阶段处理的几何图元(例如,点、线、三角形、四边形、三角形条或扇形等)。输出数据2002可以包括被复制到帧缓冲器中的像素数据(即,颜色数据)或存储器中的其他类型的表面数据结构。
[0351] 数据组装阶段2010接收输入数据2001,其指定高阶表面的顶点数据、图元等。数据组装阶段2010在临时存储或队列中收集顶点数据,例如通过从主机处理器接收包括指向存储器中的缓冲器的指针的命令以及从缓冲器读取顶点数据。然后将顶点数据被发送到顶点着色阶段2020以进行处理。
[0352] 顶点着色阶段2020通过对每个顶点执行一次一组操作(即,顶点着色器或程序)来处理顶点数据。例如,顶点可以例如被指定为与一个或更多个顶点属性(例如,颜色、纹理坐标、表面法线等)相关联的4坐标向量(即,)。顶点着色阶段2020可以操纵各个顶点属性,例如位置、颜色、纹理坐标等。换句话说,顶点着色阶段2020对顶点坐标或与顶点相关联的其他顶点属性执行操作。这些操作通常包括照明操作(即,修改顶点的颜色属性)和变换操作(即,修改顶点的坐标空间)。例如,可以使用对象坐标空间中的坐标来指定顶点,通过将坐标乘以将坐标从对象坐标空间变换为世界空间或归一化设备坐标(NCD)空间的矩阵来进行变换。顶点着色阶段2020生成变换的顶点数据,该变换的顶点数据被发送到图元组装阶段2030。
[0353] 图元组装阶段2030收集由顶点着色阶段2020输出的顶点,并将顶点分组为几何图元,以供几何着色阶段2040处理。例如,图元组装阶段2030可被配置为将每三个连续顶点分组为几何图元(即,三角形),用于发送到几何着色阶段2040。在一些实施例中,特定顶点可以重复用于连续几何图元(例如,三角形条带中的两个连续三角形可以共享两个顶点)。图元组装阶段2030将几何图元(即,关联顶点的集合)发送到几何着色阶段2040。
[0354] 几何着色阶段2040通过对几何图元执行一组操作(即,几何着色器或程序)来处理几何图元。曲面细分操作可以从每个几何图元生成一个或更多个几何图元。换句话说,几何着色阶段2040可以将每个几何图元细分为两个或更多个几何图元的更精细网格,以供图形处理管线2000的其余部分处理。几何着色阶段2040将几何图元发送到视口SCC阶段2050。
[0355] 在一个实施例中,图形处理管线2000可以在流式多处理器和顶点着色阶段2020、图元组装阶段2030、几何着色阶段2040、片段着色阶段2070、光线追踪着色器和/或与其相关联的硬件/软件中操作,可以顺序地执行处理操作。一旦顺序处理操作完成,在一个实施例中,视口SCC阶段2050可以利用该数据。在一个实施例中,可以将由图形处理管线2000中的一个或更多个阶段处理的图元数据写入高速缓存(例如,L1高速缓存、顶点高速缓存等)。在这种情况下,在一个实施例中,视口SCC阶段2050可以访问高速缓存中的数据。在一个实施例中,视口SCC阶段2050和光栅化阶段2060被实现为固定功能电路。
[0356] 视口SCC阶段2050执行几何图元的视口缩放、剔除和裁剪。渲染的每个表面与抽象摄像机位置相关联。摄像机位置表示观看者观看场景的位置,并定义包围场景对象的视锥体。视锥体可包括观察平面,后平面和四个裁剪平面。完全在视锥体之外的任何几何图元可以被剔除(即,丢弃),因为该几何图元将不会对最终渲染场景做出贡献。可以裁剪部分位于视锥体内部并且部分位于视锥体外部的任何几何图元(即,变换为包围在视锥体内的新的几何图元)。此外,几何图元可以各自基于视锥体的深度来缩放。然后,将所有可能可见的几何图元发送到光栅化阶段2060。
[0357] 光栅化阶段2060将3D几何图元转换为2D片段(例如,能够用于显示等)。光栅化阶段2060可以被配置为利用几何图元的顶点来设置一组平面方程,从中可以插入各种属性。光栅化阶段2060还可以计算多个像素的覆盖掩码,其指示像素的一个或更多个样本位置是否拦截几何图元。在一个实施例中,还可以执行z测试以确定几何图元是否被已经被光栅化的其他几何图元遮挡。光栅化阶段2060生成片段数据(即,与每个被覆盖像素的特定样本位置相关联的内插顶点属性),其被发送到片段着色阶段2070。
[0358] 片段着色阶段2070通过对每个片段执行一组操作(即,片段着色器或程序)来处理片段数据。片段着色阶段2070可以生成片段的像素数据(即,颜色值),诸如通过使用片段的内插纹理坐标执行照明操作或采样纹理映射。片段着色阶段2070生成发送到光栅操作阶段2080的像素数据。
[0359] 光栅操作阶段2080可以对像素数据执行各种操作,诸如执行阿尔法测试,模板测试,以及将像素数据与对应于与像素相关联的其他片段的其他像素数据混合。当光栅操作阶段2080已经完成处理像素数据(即,输出数据2002)时,可以将像素数据写入渲染目标(诸如帧缓冲器、颜色缓冲器等)。
[0360] 应当理解,除了上述一个或更多个阶段之外或代替上述一个或更多个阶段,可以在图形处理管线2000中包括一个或更多个附加阶段。抽象图形处理管线的各种实现可以实现不同的阶段。此外,在一些实施例中(例如,几何着色阶段2040),可以从图形处理管线中排除上述一个或更多个阶段。其他类型的图形处理管线也考虑在本公开的范围内。此外,图形处理管线2000的任何阶段可以由图形处理器(诸如PPU 200)内的一个或更多个专用硬件单元实现。图形处理管线2000的其他阶段可以由可编程硬件单元(诸如PPU 1700的SM 1840的)实现。
[0361] 图形处理管线2000可以经由由主机处理器(诸如CPU 120)执行的应用程序来实现。在一个实施例中,设备驱动器可以实现定义可以由应用程序利用以生成用于显示的图形数据的各种功能的应用程序编程接口(API)。设备驱动程序是包括控制PPU 1700的操作的多个指令的软件程序。API为程序员提供抽象,其允许程序员利用专用图形硬件(例如PPU 1700)来生成图形数据,而不需要程序员利用PPU 1700的特定指令集。应用程序可以包括被路由到PPU 1700的设备驱动器的API调用。设备驱动器解释API调用并执行各种操作以响应API调用。在某些情况下,设备驱动器可以通过在CPU上执行指令来执行操作。在其他情况下,设备驱动器可以至少部分地通过利用CPU和PPU 1700之间的输入/输出接口在PPU 1700上启动操作来执行操作。在一个实施例中,设备驱动器被配置为利用PPU 1700的硬件来实现图形处理管线2000。
[0362] 可以在PPU 1700内执行各种程序以便实现图形处理管线2000的各个阶段。例如,设备驱动器可以在PPU 1700上启动内核,以在一个SM 1840(或多个SM 1840)上执行顶点着色阶段2020。设备驱动器(或由PPU 1800执行的初始内核)还可以在PPU 1800上启动其他内核,以执行图形处理管线2000的其他阶段,例如几何着色阶段2040和片段着色阶段2070。此外,图形处理管线2000的一些阶段可以在固定单元硬件上实现,例如在PPU 1800内实现的光栅化器或数据汇编器上。可以理解,来自一个内核的结果可以在由SM 1840上的后续内核处理之前通过一个或更多个中间固定功能硬件单元来处理。
[0363] 示例性流式多处理器
[0364] SM 1840包括被配置为处理由多个线程表示的任务的可编程流式处理器。每个SM 1840是多线程的并且被配置为同时执行来自特定线程组的多个线程(例如,32个线程,其包括线程束)。在一个实施例中,SM 1840实现SIMD(单指令、多数据)体系架构,其中线程组(即,warp)中的每个线程被配置为基于相同的指令集来处理不同的数据集。线程组中的所有线程都执行相同的指令。在另一个实施例中,SM 1840实现SIMT(单指令、多线程)体系架构,其中线程组中的每个线程被配置为基于相同的指令集处理不同的数据集,但是其中线程组中的各个线程在执行期间被允许发散。在一个实施例中,为每个线程束维护程序计数器、调用栈和执行状态,当线程束内的线程发散时,使能线程束和线程束中的串行执行之间的并发。在另一个实施例中,为每个个体线程维护程序计数器、调用栈和执行状态,使能在线程束内和线程束之间的所有线程之间的相等并发。当为每个个体线程维护执行状态时,执行相同指令的线程可以收敛并且并行执行以获得最大效率。
[0365] 图21示出了根据一个实施例的图19的流式多处理器1840。如图21所示,SM 1840包括指令高速缓存1905、一个或更多个调度器单元1910、寄存器文件1920、一个或更多个处理核心1950、一个或更多个特殊功能单元(SFU)1952、一个或更多个加载/存储单元(LSU)1954、互连网络1980、共享存储器/L1高速缓存1970。
[0366] 如上所述,工作分配单元1725分派任务以在PPU 1700的GPC 1750上执行。任务被分配给GPC 1750内的特定DPC 1820,并且如果任务与着色器程序相关联,则该任务可以被分配给SM 1840。调度器单元1910从工作分配单元1725接收任务并且管理指派给SM 1840的一个或更多个线程块的指令调度。调度器单元1910调度线程块以作为并行线程的线程束执行,其中每个线程块被分配至少一个线程束。在一个实施例中,每个线程束执行32个线程。调度器单元1910可以管理多个不同的线程块,将线程束分配给不同的线程块,然后在每个时钟周期期间将来自多个不同的协作组的指令分派到各个功能单元(即,核心1950、SFU 
1952和LSU 1954)。
[0367] 协作组是用于组织通信线程组的编程模型,其允许开发者表达线程正在通信所采用的粒度,使得能够表达更丰富、更高效的并行分解。协作启动API支持线程块之间的同步性,以执行并行算法。常规的编程模型为同步协作线程提供了单一的简单结构:跨线程块的所有线程的屏障(barrier)(即,syncthreads()函数)。然而,程序员通常希望以小于线程块粒度的粒度定义线程组,并在所定义的组内同步,以集体的全组功能接口(collective group-wide function interface)的形式使能更高的性能、设计灵活性和软件重用。
[0368] 协作组使得程序员能够在子块(即,像单个线程一样小)和多块粒度处明确定义线程组并且执行集体操作,诸如协作组中的线程上的同步性。编程模型支持跨软件边界的干净组合,以便库和效用函数可以在本地环境中安全地同步,而无需对收敛进行假设。协作组图元启用合作伙伴并行的新模式,包括生产者-消费者并行、机会主义并行以及跨整个线程块网格的全局同步。
[0369] 分派单元1915被配置为向一个或更多个功能单元发送指令。在该实施例中,调度器单元1910包括两个分派单元1915,其使得能够在每个时钟周期期间调度来自相同线程束的两个不同指令。在替代实施例中,每个调度器单元1910可以包括单个分派单元1915或附加分派单元1915。
[0370] 每个SM 1840包括寄存器文件1920,其提供用于SM 1840的功能单元的一组寄存器。在一个实施例中,寄存器文件1920在每个功能单元之间被划分,使得每个功能单元被分配寄存器文件1920的专用部分。在另一个实施例中,寄存器文件1920在由SM 1840执行的不同线程束之间被划分。寄存器文件1920为连接到功能单元的数据路径的操作数提供临时存储。图22示出了SM 1840中的寄存器文件的示例性配置。
[0371] 每个SM 1840包括L个处理核心1950。在一个实施例中,SM 1840包括大量(例如128个等)不同的处理核心1950。每个核心1950可以包括完全管线化的、单精度、双精度和/或混合精度处理单元,其包括浮点运算逻辑单元和整数运算逻辑单元。在一个实施例中,浮点运算逻辑单元实现用于浮点运算的IEEE 754-2008标准。在一个实施例中,核心1950包括64个单精度(32位)浮点核心、64个整数核心、32个双精度(64位)浮点核心和8个张量核心(tensor core)。
[0372] 张量核心被配置为执行矩阵运算,并且在一个实施例中,一个或更多个张量核心被包括在核心1950中。具体地,张量核心被配置为执行深度学习矩阵运算,诸如用于神经网络训练和推理的卷积运算。在一个实施例中,每个张量核心在4×4矩阵上运算并且执行矩阵乘法和累加运算D=A×B+C,其中A、B、C和D是4×4矩阵。
[0373] 在一个实施例中,矩阵乘法输入A和B是16位浮点矩阵,而累加矩阵C和D可以是16位浮点或32位浮点矩阵。张量核心对16位浮点输入数据进行运算并与32位浮点进行累加。16位浮点乘法需要64次运算,产生全精度的积,然后使用32位浮点与4×4×4矩阵乘法的其他中间积相加来累加。在实践中,张量核心用于执行由这些较小的元素建立的更大的二维或更高维的矩阵运算。API(诸如CUDA 9C++API)公开了专门的矩阵加载、矩阵乘法和累加以及矩阵存储运算,以便有效地使用来自CUDA-C++程序的张量核心。在CUDA层面,线程束级接口假定16×16尺寸矩阵跨越线程束的全部32个线程。
[0374] 每个SM 1840还包括执行特殊函数(例如,属性评估、倒数平方根等)的M个SFU 1952。在一个实施例中,SFU 1952可以包括树遍历单元,其被配置为遍历层次树形数据结构。在一个实施例中,SFU 1952可以包括被配置为执行纹理映射过滤操作的纹理单元。在一个实施例中,纹理单元被配置为从存储器1704加载纹理映射(例如,纹理像素的2D阵列)并且对纹理映射进行采样以产生经采样的纹理值,用于在由SM 1840执行的着色器程序中使用。在一个实施例中,纹理映射被存储在共享存储器/L1高速缓存1970中。纹理单元实现纹理操作,诸如使用mip映射(即,不同细节层次的纹理映射)的过滤操作。在一个实施例中,每个SM 1740包括两个纹理单元。
[0375] 每个SM 1840还包括N个LSU 1954,其实现共享存储器/L1高速缓存1970和寄存器文件1920之间的加载和存储操作。每个SM 1840包括互连网络1980,其将每个功能单元连接到寄存器文件1920以及将LSU 1954连接到寄存器文件1920、共享存储器/L1高速缓存1970。在一个实施例中,互连网络1980是交叉开关,其可以被配置为将任何功能单元连接到寄存器文件1920中的任何寄存器,以及将LSU 1954连接到寄存器文件和共享存储器/L1高速缓存1970中的存储器位置。
[0376] 共享存储器/L1高速缓存1970是片上存储器阵列,其允许数据存储和SM 1840与图元引擎1835之间以及SM 1840中的线程之间的通信。在一个实施例中,共享存储器/L1高速缓存1970包括128KB的存储容量并且在从SM 1840到分区单元380的路径中。共享存储器/L1高速缓存1970可以用于高速缓存读取和写入。共享存储器/L1高速缓存1970、L2高速缓存1860和存储器1704中的一个或更多个是后备存储。
[0377] 将数据高速缓存和共享存储器功能组合成单个存储器块为两种类型的存储器访问提供了最佳的总体性能。该容量可由不使用共享存储器的程序用作高速缓存。例如,如果将共享存储器配置为使用一半容量,则纹理和加载/存储操作可以使用剩余容量。在共享存储器/L1高速缓存1970内的集成使共享存储器/L1高速缓存1970起到用于流式传输数据的高吞吐量管道的作用,并且同时提供高带宽和对频繁重用数据的低延迟的访问。
[0378] 图22示出了SM 1840的一个示例性架构。如图19所示,SM 1840可以耦合到一个或更多个纹理单元1842和/或一个或更多个TTU 700。作为性能和区域之间的折衷,一个示例性非限制性实施例可以包括单个纹理单元1842和/或每组SM 1840单个TTU 700(例如,参见图19)。TTU 700可以经由存储器输入-输出中的TTU输入/输出块与SM 1840通信,并且经由专用读取接口与L1高速缓存通信。在一个示例性实施例中,TTU 700仅从主存储器读取并且不写入主存储器。
[0379] 示例性更详细的TTU架构
[0380] 如上所述,TTU 700可以是SM 1840的协处理器。与纹理处理器类似,它通过一组SM指令暴露,访问存储器作为L1高速缓存的只读客户端,并返回结果进入SM寄存器文件。与一些纹理处理器不同,对于典型查询,可能需要传入和传出TTU 700的数据量使得在一些实施例中难以在单个指令中指定所有源寄存器和目的地寄存器(并且因为大多数这样的数据每个线程是唯一的,没有纹理头和采样器的TTU模拟)。结果,在一些实施例中,TTU 700通过多指令序列编程。在一些实现中,该序列可以概念化为单个“宏指令”。
[0381] 同样像纹理单元1842,在一些实现中,TTU 700可以依赖于由软件预先填充的存储器中的某些只读数据结构。这些包括:
[0382] --一个或更多个BVH,其中每个BVH例如是轴对齐的包围盒的树,以压缩格式存储,与未压缩的表示相比,其大大减少了存储器通信量。BVH中的每个节点都存储为complet结构,其中一些实现中的大小和对齐与L1高速缓存行的大小和对齐相匹配。优选地,将给定父级的子级complet连续地存储在存储器中,并且以压缩形式存储子指针。
[0383] --零个或更多个实例节点,其提供将一个BVH的叶连接到另一个BVH的根的方式。实例节点可以是也对齐的数据结构。该结构可以包含指向子BVH的指针,影响子BVH中的背面剔除行为的标记,以及对应于从顶层BVH(通常为“世界空间”)的坐标系到子BVH(通常为“对象空间”)的坐标系的任意变换矩阵(在齐次坐标中)的前三行的矩阵。在一些实施例中,矩阵的最后一行在一些实现中隐含地为(0,0,0,1)。
[0384] --零个或更多个三角形或其他图元缓冲区,包含例如存储为每顶点坐标的三元组或以TTU 700理解的无损压缩格式存储的三角形。此外,可以为每个三角形或其他图元提供α位,指示需要由软件进行特殊处理的三角形,以确定三角形实际上是否与给定光线相交。三角形缓冲区可以组织成块。也可能存在每个三角形力-无-剔除功能位。设置时,该位表示三角形的两侧应被视为相对于剔除的前向或后向,即,不应该剔除三角形,因为光线与“后”而不是“前”相交。最简单的用例是用于表示叶的单个三角形,如果光线在背面上碰撞它,我们仍然可以看到叶。
[0385] 在一些实施例中,TTU 700是无状态的,意味着在查询之间不在TTU中维持架构状态。同时,在SM 1840上运行软件对要求继续先前的查询通常是有用的,这意味着相关状态应该由TTU 700写入寄存器,然后在寄存器中传递回TTU(通常原地)继续。该状态可以采用遍历堆栈的形式,其追踪BVH遍历的进展。
[0386] 还可以提供少量堆栈初始化器以开始给定类型的新查询,例如:
[0387] ·从complet开始遍历
[0388] ·光线与一系列三角形的交点
[0389] ·光线与一系列三角形的交点,然后从complet开始遍历
[0390] ·从三角形缓冲区中获取给定三角形的顶点
[0391] ·可选支持在“从complet开始的遍历”和“光线与一系列三角形的交点”前面的实例变换。
[0392] 顶点获取是一种简单查询,其可以由包括堆栈初始化器的请求数据指定而不是其他任何东西。其他查询类型可能需要指定光线或光束,以及堆栈或堆栈初始化器以及描述查询详细信息的各种光线标记。光线由其三坐标原点、三坐标方向以及沿光线的t参数的最小值和最大值给定。另外通过第二原点和方向给定光束。
[0393] 各种光线标记可用于控制遍历行为、背面剔除和各种子节点类型的处理的各个方面,受制于可选的rayOp测试的通过/失败状态。RayOps为TTU的容量增加了相当大的灵活性。在一些示例性实施例中,RayOps部分引入两个光线标记版本,其可以基于对光线传送的数据的指定操作和存储在complet中的数据来动态选择。为了探索这样的标记,首先要了解BVH中允许的不同类型的子节点,以及TTU 700可以返回SM的各种碰撞类型。示例性节点类型是:
[0394] ■子complet(即,内部节点)
[0395] 默认情况下,TTU 700通过下降到子complet继续遍历。
[0396] ■三角形范围,对应于三角形缓冲区内的一组连续三角形
[0397] (1)默认情况下,通过三角形相交测试并相应地缩短光线,由TTU 700本地处理光线遇到三角形范围。如果遍历完成并且三角形被碰撞,则默认行为是将三角形ID以及交点的t值和重心坐标返回到SM 1840。这是“三角”碰撞类型。
[0398] (2)默认情况下,即使遍历尚未完成,设置了α位的相交三角形也会返回到SM 1840。如果软件确定三角形实际上是透明的,则返回的遍历堆栈包含继续遍历所需的状态。
[0399] (3)在一些实施例中,光束不支持三角形相交,因此遇到的三角形范围默认返回到SM 1840作为“TriRange”碰撞类型,其包括指向与范围重叠的第一个三角形块的指针,指定范围的参数,以及与叶包围盒交点的t值。
[0400] ■项目范围,由索引(从存储在complet中的用户提供的“项目范围基础”导出)和项目计数组成。
[0401] 默认情况下,项目范围作为“ItemRange”碰撞类型返回到SM 1840,其由例如索引、计数和与叶包围盒交点的t值组成。
[0402] ■实例节点。
[0403] 在一些实施例中,TTU 700可以通过将光线变换为实例BVH的坐标系来本地处理一级实例化。可以用软件处理附加层的实例化(或每个其他层的实例化,取决于策略)。为此提供“实例节点”碰撞类型,包括指向实例节点的指针和与叶包围盒的交点的t值。在其他实现中,硬件可以处理两层、三层或更多层的实例化。
[0404] 除了节点特定的碰撞类型之外,还提供了通用的“NodeRef”碰撞类型,其包括指向父complet本身的指针,以及指示与哪个子项相交的ID和该子项与包围盒的交点的t值。
[0405] 可以针对不正确地形成查询或BVH或者遍历期间遍历遇到问题的情况提供“错误”碰撞类型。
[0406] 可以为光线或光束未碰撞场景中的所有几何形状的情况提供“无”碰撞类型。
[0407] TTU如何处理四种可能节点类型中的每一种由一组节点特定模式标记确定,该标记被设置为给定光线的查询的一部分。上面提到的“默认”行为对应于模式标记被设置为全零的情况。
[0408] 标记的替代值允许剔除给定类型的所有节点,将给定类型的节点作为NodeRef碰撞类型返回到SM,或者使用它们相应的碰撞类型将三角形范围或实例节点返回到SM,而不是在TTU 700内本地处理它们。
[0409] 可以提供附加模式标记以用于控制α三角形的处理。
[0410] 示例性计算系统
[0411] 具有多个GPU和CPU的系统被用于各种行业,因为开发者在应用(诸如人工智能计算)中暴露和利用更多的并行性。在数据中心、研究机构和超级计算机中部署了具有数十至数千个计算节点的高性能GPU加速系统,以解决更大的问题。随着高性能系统内处理设备数量的增加,通信和数据传输机制需要扩展以支持处理设备之间的增加的数据传输。
[0412] 图23是根据一个实施例的使用图17的PPU 1700实现的处理系统1900的概念图。示例性系统1900可以被配置为实现本申请中公开的一种或更多种方法。处理系统1900包括CPU 1930、交换机1910和多个PPU 1700中的每一个以及相应的存储器1704。NVLink 1710提供每个PPU 1700之间的高速通信链路。尽管图23中示出了特定数量的NVLink 1710和互连1702连接,但是到每个PPU 1700和CPU 1930的连接的数量可以改变。交换机1910在互连
1702和CPU 1930之间接口。PPU 1700、存储器1704和NVLink 1710可以位于单个半导体平台上以形成并行处理模块1925。在一个实施例中,交换机1912支持在各种不同连接和/或链路之间接口的两个或更多个协议。
[0413] 在另一个实施例(未示出)中,NVLink 1710在每个PPU 1700和CPU 1930之间提供一个或更多个高速通信链路,并且交换机1912在互连1702和每个PPU 1700之间进行接口。PPU 1700、存储器1704和互连1702可以位于单个半导体平台上以形成并行处理模块1925。
在又一个实施例(未示出)中,互连1702在每个PPU 1700和CPU 1930之间提供一个或更多个通信链路,并且交换机1912使用NVLink 1710在每个PPU 1700之间进行接口,以在PPU 1700之间提供一个或更多个高速通信链路。在另一个实施例(未示出)中,NVLink 1710在PPU1700和CPU 1930之间通过交换机1912提供一个或更多个高速通信链路。在又一个实施例(未示出)中,互连1702在每个PPU 1700之间直接地提供一个或更多个通信链路。可以使用与NVLink 1710相同的协议将一个或更多个NVLink 1710高速通信链路实现为物理NVLink互连或者片上或裸晶上互连。
[0414] 在本说明书的上下文中,单个半导体平台可以指在裸晶或芯片上制造的唯一的单一的基于半导体的集成电路。应该注意的是,术语单个半导体平台也可以指具有增加的连接的多芯片模块,其模拟片上操作并通过利用常规总线实现方式进行实质性改进。当然,根据用户的需要,各种电路或器件还可以分开放置或以半导体平台的各种组合来放置。可选地,并行处理模块1925可以被实现为电路板衬底,并且PPU 1700和/或存储器1704中的每一个可以是封装器件。在一个实施例中,CPU 1930、交换机1912和并行处理模块1925位于单个半导体平台上。
[0415] 在一个实施例中,每个NVLink 1710的信令速率是20到25千兆位/秒,并且每个PPU 1700包括六个NVLink 1710接口(如图23所示,每个PPU 1700包括五个NVLink 1710接口)。
每个NVLink 1710在每个方向上提供25千兆位/秒的数据传输速率,其中六条链路提供1700千兆位/秒的数据传输速率。当CPU 1930还包括一个或更多个NVLink 1710接口时,NVLink 
1710可专门用于如图23所示的PPU到PPU通信,或者PPU到PPU以及PPU到CPU的某种组合。
[0416] 在一个实施例中,NVLink 1710允许从CPU 1930到每个PPU 1700的存储器1704的直接加载/存储/原子访问。在一个实施例中,NVLink 1710支持一致性操作,允许从存储器1704读取的数据被存储在CPU 1930的高速缓存层次结构中,减少了CPU 1930的高速缓存访问延迟。在一个实施例中,NVLink 1710包括对地址转换服务(ATS)的支持,允许PPU 1700直接访问CPU 1930内的页表。一个或更多个NVLink 1710还可以被配置为以低功率模式操作。
[0417] 图24示出了示例性系统1965,其中可以实现各种先前实施例的各种体系架构和/或功能。示例性系统1965可以被配置为实现本申请中公开的一种或更多种方法。
[0418] 如图所示,提供系统1965,其包括连接到通信总线1975的至少一个中央处理单元1930。通信总线1975可以使用任何合适的协议来实现,诸如PCI(外围组件互连)、PCI-Express、AGP(加速图形端口)、超传输或任何其他总线或一个或更多个点对点通信协议。系统1965还包括主存储器1940。控制逻辑(软件)和数据被存储在主存储器1940中,主存储器
1940可以采取随机存取存储器(RAM)的形式。
[0419] 系统1965还包括输入设备1960、并行处理系统1925和显示设备1945,即常规CRT(阴极射线管)、LCD(液晶显示器)、LED(发光二极管)、等离子显示器等。可以从输入设备1960(例如键盘、鼠标、触摸板、麦克风等)接收用户输入。前述模块和/或设备中的每一个甚至可以位于单个半导体平台上以形成系统1965。可选地,根据用户的需要,各个模块还可以分开放置或以半导体平台的各种组合来放置。
[0420] 此外,系统1965可以出于通信目的通过网络接口1935耦合到网络(例如,电信网络、局域网(LAN)、无线网络、广域网(WAN)(诸如因特网)、对等网络、电缆网络等)。
[0421] 系统1965还可以包括辅助存储(未示出)。辅助存储610包括例如硬盘驱动器和/或可移除存储驱动器、代表软盘驱动器、磁带驱动器、光盘驱动器、数字多功能盘(DVD)驱动器、记录设备、通用串行总线(USB)闪存。可移除存储驱动器以众所周知的方式从可移除存储单元读取和/或写入可移除存储单元。
[0422] 计算机程序或计算机控制逻辑算法可以存储在主存储器1940和/或辅助存储中。这些计算机程序在被执行时使得系统1965能够执行各种功能。存储器1940、存储和/或任何其他存储是计算机可读介质的可能示例。
[0423] 各种在先附图的架构和/或功能可以在通用计算机系统、电路板系统、专用于娱乐目的的游戏控制台系统、专用系统和/或任何其他所需的系统的上下文中实现。例如,系统1965可以采取台式计算机、膝上型计算机、平板电脑、服务器、超级计算机、智能电话(例如,无线、手持设备)、个人数字助理(PDA)、数字相机、运载工具、头戴式显示器、手持式电子设备、移动电话设备、电视机、工作站、游戏控制台、嵌入式系统和/或任何其他类型的逻辑的形式。
[0424] 机器学习
[0425] 在处理器(诸如PPU 1700)上开发的深度神经网络(DNN)已经用于各种使用情况:从自驾车到更快药物开发,从在线图像数据库中的自动图像字幕到视频聊天应用中的智能实时语言翻译。深度学习是一种技术,它建模人类大脑的神经学习过程,不断学习,不断变得更聪明,并且随着时间的推移更快地传送更准确的结果。一个孩子最初是由成人教导,以正确识别和分类各种形状,最终能够在没有任何辅导的情况下识别形状。同样,深度学习或神经学习系统需要在对象识别和分类方面进行训练,以便在识别基本对象、遮挡对象等同时还有为对象分配情景时变得更加智能和高效。
[0426] 在最简单的层面上,人类大脑中的神经元查看接收到的各种输入,将重要性级别分配给这些输入中的每一个,并且将输出传递给其他神经元以进行处理。人造神经元或感知器是神经网络的最基本模型。在一个示例中,感知器可以接收一个或更多个输入,其表示感知器正被训练为识别和分类的对象的各种特征,并且在定义对象形状时,这些特征中的每一个基于该特征的重要性赋予一定的权重。
[0427] 深度神经网络(DNN)模型包括许多连接的感知器(例如节点)的多个层,其可以用大量输入数据来训练以快速高精度地解决复杂问题。在一个示例中,DLL模型的第一层将汽车的输入图像分解为各个部分,并查找基本图案(诸如线条和角)。第二层组装线条以寻找更高层的图案,诸如轮子、挡风玻璃和镜子。下一层识别运载工具类型,最后几层为输入图像生成标签,识别特定汽车品牌的型号。
[0428] 一旦DNN被训练,DNN就可以被部署并用于在被称为推理(inference)的过程中识别和分类对象或图案。推理的示例(DNN从给定输入中提取有用信息的过程)包括识别存入ATM机中的支票上的手写数字、识别照片中朋友的图像、向超过五千万用户提供电影推荐、识别和分类不同类型的汽车、行人和无人驾驶汽车中的道路危险或实时翻译人类言语。
[0429] 在训练期间,数据在前向传播阶段流过DNN,直到产生预测为止,其指示对应于输入的标签。如果神经网络没有正确标记输入,则分析正确标签和预测标签之间的误差,并且在后向传播阶段期间针对每个特征调整权重,直到DNN正确标记该输入和训练数据集中的其他输入为止。训练复杂的神经网络需要大量的并行计算性能,包括由PPU 1700支持的浮点乘法和加法。与训练相比,推理的计算密集程度比训练低,其是一个延迟敏感过程,其中经训练的神经网络应用于它以前没有见过的新的输入,以进行图像分类、翻译语音以及通常推理新的信息。
[0430] 神经网络严重依赖于矩阵数学运算,并且复杂的多层网络需要大量的浮点性能和带宽来提高效率和速度。采用数千个处理核心,针对矩阵数学运算进行了优化,并传送数十到数百TFLOPS的性能,PPU 1700是能够传送基于深度神经网络的人工智能和机器学习应用所需性能的计算平台。
[0431] 以上引用的所有专利和出版物均通过引用并入,如同明确阐述一样。虽然已经结合目前被认为是最实用和优选的实施例描述了本发明,但是应该理解,本发明不限于所公开的实施例,而是相反,旨在涵盖各种实施例。在所附权利要求的精神和范围内包括的修改和等同布置。