掌桥专利:专业的专利平台
掌桥专利
首页

加速实时光线追踪的三角形可见性测试

文献发布时间:2024-04-18 19:58:26


加速实时光线追踪的三角形可见性测试

相关专利和申请的交叉引用

本申请要求2021年9月16日提交的美国临时专利申请第63/245,155号的优先权,其全部内容通过引用并入本文。此外,同时提交的美国申请第17946235(6610-126)号“微网格,用于计算机图形的结构化几何体(Micro-Meshes,A Structured Geometry ForComputer Graphics)”、美国申请第17946515(6610-125)号“用于光线和路径追踪的位移微网格(Displaced Micro-meshes for Ray and path Tracing)”和美国申请第17946563(6610-129)号“位移微网格压缩(Displaced MicroMesh Compression)”中的每个申请的全部内容通过引用并入本文。

技术领域

本技术涉及计算机图形,尤其涉及光线追踪器。更具体地,该技术涉及计算机图形处理的硬件加速,包括光线追踪。本文的示例非限制性技术还涉及针对可见性的高效光线相交测试。

背景技术和发明内容

光线追踪是指将光线投射到场景中,并确定该光线是否以及在何处与场景的几何体相交。此基本光线追踪可见性测试是以计算机图形学中各种渲染算法和技术为基础的基本图元。通常,光线追踪是一种渲染方法,其中光线用于确定场景中各种元素的可见性。光线追踪用于各种渲染算法中,算法包括例如路径追踪和Metropolis光传输。在示例算法中,光线追踪通过对遍历场景的光传输进行建模来模拟光的物理现象以使用光线光学计算所有全局效应(包括例如来自发亮表面的反射)。在这样的光线追踪的用法中,当光线遍历三维场景从潜在的多个光源传播到视点时,可能会尝试追踪成百上千的光线中的每一个。通常,遍历场景相对于眼睛追踪此类光线,并针对场景中所有几何体(geometry)的数据库进行测试。可以从光到眼睛向前追踪光,或者从眼睛到光反向追踪光,或者可以追踪光线以查看从虚拟相机开始并从眼睛开始的路径是否具有清晰的视线。该测试可以确定最近的相交(以便确定从眼睛可见的东西),也可以追踪从物体表面朝向光源的光线,以确定是否有任何干涉会阻止光到空间中该点的透射。因为光线与现实中的光的光线相似,所以它们提供了许多现实效果,而这些效果是使用许多其他3D图形技术无法实现的。由于来自场景中每个光源的每个照明光线在遍历场景中的每个对象时都经过评估,因此得到的图像看起来就像是在现实中拍摄的一样。因此,这些光线追踪方法长期以来一直在专业图形应用程序(例如设计和电影)中使用,其中在基于光栅的渲染方面它们占据了主导地位。

光线追踪可用于确定沿光线是否有任何东西可见(例如,测试几何图元上的阴影点与光源上的点之间的遮挡物),还可用于评估反射(例如,可能涉及执行遍历以确定沿视线的最近可见表面,以便在流处理器上运行的软件可以评估与所命中的事物相对应的材质着色功能——其反过来根据相交的对象的材料属性又可以向场景中发射一个或更多个附加光线)以确定沿光线返回向眼睛的光。在经典的怀特德(Whitted)风格光线追踪中,光线是从视点通过像素网格射入场景的,但是其他路径遍历也是可能的。通常,对于每条光线,找到最接近的对象。然后,可以通过将光线从相交点发射到场景中的每个光源并发现它们之间是否存在任何对象来确定该相交点是被照明还是处于阴影中。不透明的对象会挡住光,而透明的对象会减弱光。可以从相交点产生其他光线。例如,如果相交表面是发亮的或镜面的,则在反射方向上产生光线。光线可以接受相交的第一个对象的颜色,然后对它的相交点进行阴影测试。递归地重复此反射过程,直到达到递归限制或后续反弹的潜在贡献降至阈值以下。光线也可以在透明固体对象的折射方向上生成,然后再次递归地进行评估。因此,光线追踪技术允许图形系统依据物理规律开发正确的反射和阴影,其并不经受扫描变换技术的限制和伪像。

光线追踪的主要挑战通常是速度。光线追踪要求图形系统为每一帧计算和分析照射在构成场景的每个表面上(并可能被其反射)的数百万条光光线中的每一条。

现代GPU 3D图形管线如此快地渲染着色的、纹理映射的表面的原因之一是它们有效地使用了相干性。在常规的扫描变换中,假定所有内容都可以通过公共图像平面中的公共窗口查看并向下投影到单个有利点。每个三角形或其他图元通过图形管线发送,并覆盖一定数量的像素。可以针对从该三角形渲染的所有像素共享所有相关计算。因此,对应于遍历窗口的相干视线的像素的矩形图块可以对应于在同一流处理器中以锁步方式运行的线程组。假定落在三角形的边之间的所有像素都是运行相同着色器并从相同纹理获取相邻纹理像素组的相同材质。相反,在光线追踪中,光线可能在公共点(光源或虚拟相机镜头)处开始或结束,但是当它们在场景中传播并与不同的材质相交时,它们会迅速发散。例如,每条光线执行搜索以找到最接近的对象。可以执行对结果的一些高速缓存和共享,但是由于每条光线都可能命中不同的对象,因此不存在GPU传统上已经与纹理映射的、着色的三角形结合利用的那种相干性(例如,共同的优势点、窗口和图像平面没有用于光线追踪)。与其他图形方法相比,这使光线追踪在计算上更具挑战性,因此在交互基础上执行起来要困难得多。

在2010年,NVIDIA利用NVIDIA GPU和其他高度并行架构的高度并行性来开发OptiX

OptiX

大多数光线追踪器的基本任务是针对场景中的所有图元(在一个实施例中通常为三角形)测试光线,并报告最接近的命中(根据沿光线测量的距离)或仅报告所遇到的第一个(不一定是最接近的)命中,具体取决于用例。朴素贝叶斯算法将是O(n)暴力搜索。但是,由于任意复杂度的3D场景中有大量的图元,因此对于光线追踪器而言,测试场景中的每个几何图元与给定光线的相交通常是无效或不可行的。

通过预处理场景几何体并预先构建合适的加速数据结构,然而,可以将平均情况的复杂度降低到O(log n)。加速数据结构(例如包围体层次结构或BVH)允许快速确定哪些包围体可以忽略,哪些包围体可以包含相交的几何图元,哪些相交的几何图元对于可视化很重要,而哪些则不重要。使用简单的体(例如盒子)包含更复杂的对象可提供计算和存储器效率,这有助于使光线追踪实时进行。

图1A-1C示出了在包括几何网格120的包围体110的背景下的光线追踪相交测试。图1A示出了在虚拟空间中包括包围体110和115的光线102。为了确定光线102是否与在网格120中的几何体相交,可以直接针对光线102测试每个几何图元(例如三角形)。但是,为了加速该过程(因为对象可能包含成千上万的几何图元),首先针对包围体110和115测试光线102。如果光线102不与包围体相交,则它不与包围体内部的任何几何体相交,并且出于该光线的目的,可以忽略该包围体内部的所有几何体。因为在图1A中,光线102错过了包围体110,所以不需要针对相交测试该包围体内的网格120的任何几何体。虽然包围体115被光线102相交,但是包围体115不包含任何几何体,因此不需要进一步的测试。

另一方面,如果诸如图1B所示的光线104之类的光线与包含几何体的包围体110相交,则该光线可能会或可能不会与包围体内部的几何体相交,因此需要对几何体本身执行进一步的测试以找到可能的相交。因为图1B和图1C中的光线104、106与包含几何体的包围体110相交,所以需要执行进一步的测试以确定包围体内部是否有任何(和哪些)图元被相交。在图1B中,进一步测试与图元的相交将表明,即使光线104遍历包围体110,它也不会与包围体所包围的任何几何体相交(或者,如上所述,包围体110可以进一步按体积细分,以便可以使用包围体相交测试来揭示光线不与任何几何体相交,或更具体地,光线可以与哪些几何图元相交)。

图1C示出了光线与包围体110相交并且包含光线106与其相交的几何体的情况。为了执行实时光线追踪,相交测试器测试相交的包围体110内的每个几何图元,以确定光线是否与该几何图元相交。

现代光线追踪器最常使用的加速数据结构或加速结构(“AS”)是包围体层次结构(BVH),其包括嵌套的轴向对齐的包围盒。BVH的叶节点包含要测试相交的图元(例如三角形)。BVH通常由图形或树结构数据表示来表示。

BVH AS以将有助于帮助快速确定可能与每个特定光线相交的对象或场景的那个部分并快速拒绝光线不会与之相交的场景的大部分的方式来表示和/或引用对象或场景的3D模型。BVH数据结构表示具有包围体的场景或对象,并将包围体细分为越来越小的包围体,这些包围体终止于包含几何图元的叶节点。包围体是分层的,这意味着最上层将其下的层包围起来,该下层将其下的层包围起来,依此类推。在一个实施例中,叶节点可以潜在地与包围体层次结构中的其他叶节点重叠。在光线追踪中,当使用这样的AS时,寻找光线的最近(或阴影,任何)交点的搜索通常是n个对象的O(log n)阶。例如,通常用于现代光线追踪加速数据结构的包围体层次结构(BVH)类型通常具有O(log n)搜索行为。

NVIDIA的RTX平台包括光线追踪技术,该技术可为内容创作者和游戏开发者带来实时的电影品质的渲染。请参阅https://developer.nvidia.com/rtx/raytracing。在包括NVIDIA RT Cores在内的许多或大多数示例实现方式中,图1A-1C中所示的AS的包围体使用轴对齐的包围盒(“AABB”),该包围盒可以紧凑地存储(它们只能使用六个值来指定)并有效地针对光线相交进行测试。当光线追踪器向下遍历BVH树时,它会从搜索中消除非相交的包围盒,并将相交的包围盒细分为越来越小的体,直到遇到包围几何体的叶节点包围盒。针对AABB包围盒的光线包围体相交测试往往并不昂贵。如果光线与叶节点包围盒相交,则相交的叶节点包围盒所包围的底层几何将使用光线几何相交测试进行测试。如果光线不与叶节点包围体相交,则需要针对光线测试叶节点包围体内的底层几何体。如图1A-1C所示,AABB的层次结构提高来单个AABB包围盒测试的剔除效果。这样可以进行有效遍历并快速缩小感兴趣的几何体。

即使在使光线追踪更快和更高效方面已取得了进步,但仍然希望进一步提高可以执行光线追踪的速度。

附图说明

图1A-1C示出了示例简化的光线追踪测试,以确定光线是否通过包含几何体的包围体,并且光线是否与包围体内的几何体相交。

图2示出了根据一些实施例的具有硬件加速的示例非限制性光线追踪图形系统。

图3示出了可以在一些实施例中使用的示例图像和对应的可见性掩模。

图4A示出了根据一些实施例的两个示例微网格。

图4B示出了根据一些实施例的覆盖有微网格的栅格的对象。

图5示出了根据一些实施例的应用于示例可见性掩模的叶切口。

图6A-6F示出了根据一些示例实施例的树叶的分支和对应的高分辨率可见性纹理(图6A-6B)、不同分辨率的示例对应微网格(图6C-6D),以及减少可见性掩模的2位映射的示例。

图7是可用于一些实施例的具有阴影掩模和半透明映射(map)的半透明苔藓纹理。

图8示出了根据实施例的示例三角形微网格和可用于遍历微网格的空间填充曲线。

图9A示出了根据一些实施例的对应于重心坐标的示例标记。

图9B示出了根据一些实施例的用于基于重心坐标计算可见性掩模内的索引的示例代码段。

图10A-10C示出了根据一些实施例的可见性掩模和位移映射的使用。

图11A是根据一些实施例的示例非限制光线追踪图形管线的流程图。

图11B是根据一些实施例的示例非限制性基于硬件的光线追踪操作的流程图。

图12A和12B示出了根据一些实施例的更详细的光线追踪管线。

图13示出了根据一些实施例的包括树遍历单元(TTU)的简化的示例非限制性遍历协处理器。

图14示出了根据一些实施例的可见性掩模块的格式。

图15示出了根据一些实施例的三角形块的格式。

图16示出了根据一些实施例的用于全局和局部寻址的存储器布局。

图17示出了根据一些实施例的实例节点的格式。

图18示出了根据一些实施例的用于指定可见性掩模的光线标志的格式。

图19示意性地示出了根据一些实施例的图2所示的树遍历单元中的一些组件之间的侧接口。

图20示出了根据一些实施例的可见性掩模潜在命中RAM的示例内容。

图21示出了根据一些实施例的用于解析与可见性掩模相关的光线标志的过程的示例流程图。

图22示出了根据一些实施例的示例三角形范围堆栈条目。

图23是示出根据一些实施例的示例可见性掩模分辨率和编码的表格。

图24示出了根据一些实施例的GPU的示例并行处理单元。

图25A示出了根据一些实施例的图24的并行处理单元内的示例通用处理集群(GPC),其中通用处理集群中的每个流式多处理器耦合到硬件光线追踪加速设备。

图25B示出了图24的并行处理单元的示例存储器分区单元。

图26示出了图25A的示例流式多处理器。

图27A是使用图24的并行处理单元(PPU)实现的处理系统的示例概念图。

图27B是其中可以实现各种先前实施例的各种架构和/或功能的示例性系统的框图。

具体实施方式

Nvidia RTX技术的已经高效的光线追踪能力可以通过提高在遍历加速结构(AS)期间发生的光线图元相交的相交点的可见性状态确定的效率而甚至更加改进,该NvidiaRTX技术针对分层布置的包围盒提供光线的硬件加速测试,该包围盒包围场景中的对象几何体以及底层对象几何体。

本公开的某些示例实施例提供了一种光线追踪协处理器硬件设备,该硬件设备能够实现硬件加速的光线追踪,对光线-图元相交(例如,光线-三角形相交)获得的命中点处的像素进行更有效的可见性状态确定。示例实施例提供了一种可见性掩模(VM),它提供了更频繁地确定相交点(也称为“命中点”)的可见性状态,而不需要光线追踪硬件协处理器设备依赖于处理器(例如,流式多处理器)。

实施例提供了针对几何图元在协处理器硬件设备中使用间接引用的可见性掩模执行在线可见性测试,该可见性掩模基于包含来自光线-图元相交的重心命中点的子区域(例如,覆盖在三角形几何图元上的微三角形网格中的微三角形)被索引。它减少或消除了对AHS调用的需要。

示例系统框图

图2示出了示例实时光线交互式追踪图形系统200,其使用包括如下所述构造的加速数据结构的场景或对象的三维(3D)数据来生成图像。

系统200包括输入设备210、处理器220、图形处理单元(GPU)230、存储器240和显示器250。图2所示的系统可以采用任何形状因子,包括但不限于个人计算机、智能手机或其他智能设备、视频游戏系统、可穿戴虚拟或增强现实系统、基于云的计算系统、车载图形系统、片上系统(SoC)等。

处理器220可以是多核中央处理单元(CPU),该多核中央处理单元可操作为,作为对输入设备210的实时交互响应执行应用程序,其输出包括用于在显示器250上显示的图像。显示器250可以是任何种类的显示器,例如固定显示器、头戴式显示器(例如显示器眼镜或护目镜),其他类型的可穿戴显示器、手持显示器、车载显示器等。例如,处理器220可以基于从输入设备210接收的输入来执行应用程序(例如,操纵杆、惯性传感器、环境光传感器等),并指示GPU 230生成显示应用程序进展的图像以在显示器250上显示。

基于应用程序在处理器220上的执行,处理器可以发布指令以供GPU 230使用存储在存储器240中的3D数据来生成图像。GPU 230包括用于加速实时图像生成的专用硬件。例如,由于GPU执行重复和高度并行的特殊计算任务(例如多边形扫描变换)的能力比常规软件驱动的CPU快得多,因此GPU 230能够实时处理数千或数百万个图形图元(多边形)的信息。例如,与处理器220不同,处理器220可以具有多个核,其中该核具有一次可以处理几个软件线程的许多高速缓存存储器,GPU 230可以包括成百上千个正在并行运行的处理核或“流式多处理器”(SM)232。

在一个示例实施例中,GPU 230包括多个可编程高性能处理器,其可以被称为“流式多处理器”(“SM”)232,以及包括图形图元引擎234和光栅引擎236的基于硬件的图形管线。GPU 230的这些组件被配置为使用称为“扫描变换光栅化”的技术执行实时图像渲染,以在二维显示器250上显示三维场景。在光栅化中,将3D场景的几何体构建块(例如,点、线、三角形、四边形、网格等)映射到显示器的像素(通常经由帧缓冲存储器)。

GPU 230将3D模型的几何体构建块(即,诸如三角形之类的多边形图元)变换为2D图像的像素,并为每个像素分配初始颜色值。图形管线可以通过定义或调整像素的颜色值,将阴影、透明度、纹理和/或颜色效果应用于图像的各部分。可以对最终像素值进行抗混叠、滤波并提供给显示器250以进行显示。多年来,许多软件和硬件的进步已经使用光栅化技术以实时图形所需的帧率(即每秒30至60帧)以在一个或更多个显示器250上的高显示分辨率(例如4096×2160像素或更高)改善了主观图像质量。

为了使GPU 230能够以有效的方式实时地执行光线追踪,GPU提供了耦合到一个或更多个SM 232的一个或更多个“TTU”238。TTU 238包括被配置为执行(或加速)光线追踪算法中常用的操作的硬件组件。TTU 238的目标是将光线追踪中使用的操作加速到一定程度,该程度将光线追踪的功能带给实时图形应用程序(例如游戏),从而实现高质量的阴影、反射和全局照明。由TTU 238产生的结果可以与在GPU 230中执行的其他与图形有关的操作一起使用或作为其替代而使用。

更具体地,SM 232和TTU 238可以协作以将光线投射到3D模型中,并确定该光线是否以及在何处与模型的几何体相交。光线追踪直接模拟在虚拟环境或场景中行进的光线。光线相交的结果与表面纹理、观察方向和/或照明条件一起用于确定像素颜色值。由与TTU238配合使用的SM 232进行的光线追踪允许计算机生成的图像以与真实世界的照片或视频无法区分开的方式捕获阴影、反射和折射。由于部分地由于需要追踪大量的光线,因此光线追踪技术比光栅化在计算上更加密集,因此TTU 238能够在硬件中加速该过程中某些计算量更大的方面。

给定BVH 242,TTU 238执行树搜索,其中光线访问的树中的每个节点针对每个后代分支或叶子都有包围体,并且光线仅访问相应包围体与之相交的后代的分支或叶子。以这种方式,TTU 238仅显式地测试少量图元的相交,即驻留在被光线相交的叶节点中的图元。在示例非限制性实施例中,TTU 238加速树遍历(包括光线-体测试)和光线-图元测试。作为遍历的一部分,它还可以处理至少一级实例变换,将光线从世界空间坐标变换为实例网格的坐标系。在示例非限制性实施例中,TTU 238以MIMD方式完成所有这些操作,这意味着一旦在TTU内部就独立地处理光线。

在示例非限制性实施例中,TTU 238作为SM(流式多处理器)232的服务方(协处理器)运行。换句话说,示例非限制性实施例中的TTU 238不是独立运行,而是遵循SM 232的命令,以比SM 232自己执行更高效地执行某些与计算密集的光线追踪相关的任务。在其他实施例或体系结构中,TTU 238可以具有更多或更少的自治权。

在所示的示例中,TTU 238通过SM 232指令接收命令,并将结果写回到SM寄存器文件。对于许多用例,TTU 238可以为光线追踪查询提供服务,而无需与SM 232进一步交互。更复杂的查询(例如,涉及经过阿尔法测试的三角形,除三角形以外的其他图元或多于预定数目的实例化级别)可能需要多次往返(尽管本文的技术通过为TTU 238提供增强的能力以自动执行光线-包围体相交测试而无需向调用SM寻求帮助,从而为某些类型的几何体减少了此类“往返”的需求)。除了追踪光线,TTU 238还能够执行更一般的空间查询,其中AABB或两个AABB之间的伸出的体代替了光线。因此,尽管TTU 238特别适合于加速与光线追踪有关的任务,但是它也可以用于执行除光线追踪之外的任务。

因此,TTU 238会针对广范围的包围体自主地执行对每条光线的测试,并且可以剔除不与该光线相交的任何包围体。遍历协处理器从包围(bound)场景中所有内容的根节点开始,针对较小(可能重叠)的子包围体测试每条光线,这些子包围体又反过来包围BVH的后代分支。光线跟随光线所命中的包围体的子指针到其他节点,直到到达BVH的叶节点或末端节点(体积)为止。

一旦TTU 238遍历加速数据结构以到达与光线相交并包含几何图元的终端或“叶”节点(可以由一个或更多个包围体表示),它将执行加速的光线-图元相交测试,以确定光线是否与该图元相交(并因此与该图元定义的对象表面相交)。光线-图元测试可以提供有关与光线相交的图元的其他信息,这些信息可用于确定着色和可视化所需的表面的材料属性。通过加速数据结构的递归遍历使遍历协处理器能够发现与光线相交的所有对象图元,或者发现与光线相交的最接近(从视点的角度来看)的图元(在某些情况下,这是从沿光线的视点唯一可见的图元)。参见例如Lefrancois等人的NVIDIA Vulkan光线追踪教程(NVIDIA Vulkan Ray Tracing Tutorial),2019年12月,https://developer.nvidia.com/rtx/raytracing/vkray。

如上所述,TTU 238加速遍历所通过的一种方式是通过实施光线三角形相交测试,该测试可以在没有SM或着色器干预的情况下确定几何图元的可见性。但是当几何体在图元中使用透明或半透明时,光线是否与该几何体相交的确定无法仅通过光线三角形测试来做出。

透明度的一个经典示例是使用单个三角形作为几何图元来表示叶子,其实际形状由一些图像或一些纹理映射图像捕获。与通过使用许多三角形来明确描述叶子的形状相比,单个三角形可以显著更紧凑地表示该叶子。但是当该三角形相交时,在本公开的实施例之前的系统中,必须调用着色器来确定该命中是不透明的还是透明的。图3在其上部的行中显示了示例树叶和铁丝网围栏部分,当表示为各自的几何图元时,它们将分别包括不透明区域和透明区域两者,从而迫使本公开实施例之前的系统中的TTU返回给SM以确定图元上的命中的可见性状态。

在Microsoft DXR规范中,潜在透明的几何体指向任何命中着色器(AHS)。AHS读取相交点属性并执行计算,可选地包括纹理查找,以便它最终可以指示是应忽略还是接受命中。AHS也可用于不透明几何体。然而,所使用的着色器类型并不限于AHS。

当本公开的实施例之前的系统中的TTU与标记为阿尔法(alpha)的几何体相交时,参照传统的阿尔法通道测试和像素剔除,或者需要AHS,它停止对该光线的遍历并返回命中信息给SM以在AHS中进行处理(除了在某些情况下,可以基于对应的光线标志和/或存储在较早遍历的相交管理单元(IMU)中的信息来忽略相交)。

AHS的执行可能是昂贵的。由于延迟原因,停止光线在TTU上的遍历并执行到SM的往返行程也是代价高昂的,还因为它会产生线程发散,从而降低TTU内的资源利用率。经过阿尔法测试的几何体的性能下降可能很显著,这也是一些开发人员选择为某些用例关闭透明度的原因。

本公开的实施例试图通过在光线遍历期间向TTU 228提供对与被光线相交的几何图元相关联的可见性掩模244的访问,来消除或至少减少TTU必须进行AHS调用来确定可见性的性能损失。在一些实施例中,可见性掩模244被包括在BVH 242中,但在其他实施例中,它们可以与BVH分开存储。

可见性掩模(VM)

可由TTU访问的可见性掩模(VM)用于表示三角形内各个区域的不同可见性。这允许TTU在TTU内执行可见性测试,否则会在SM中运行的AHS中发生。因此,VM不仅可以减少AHS调用的次数,而且在某些用例中还可以完全消除它们。

图3在图中的上部行中示出了铁丝网围栏部分的图像和几个叶子的图像的示例VM(底行)。

在一些实施例中,VM可以应用于通用三角形,有效地将它们视为微网格。当不使用位移时,任何三角形的重心坐标系都可能足以供VM使用。在一些实施例中,VM是使用微网格生成的。更具体地,示例VM使用跨三角形的微网格。微网格是计算机图形学中几何的结构化表示,并且是微区域的栅格。微网格细分图案可以是整个三角形的任何划分(例如,改变整个三角形的分辨率、具有非线性间距、非三角形区域等)。根据一些实施例,微网格由创建微三角形的2

图4A示出了左侧示例中大小n=4(256个微三角形)的示例微网格和右侧示例中大小n=5(1024个微三角形)的示例微网格。在一些实施方式中,VM可以包括6400万个微三角形(n=13)。VM中微三角形的数量可以被认为代表VM的分辨率。图23中的表格显示了不同细分级别(或顺序)的VM分辨率。

为了渲染场景中的对象,该对象的几何体被在微网格的栅格上生成的VM覆盖。图4B示出了一个示例对象,其表面覆盖有三角形微网格的栅格,其中每个三角形微网格被细分为多个微三角形。本公开的实施例不限于VM中的微三角形的最大数量,并且在一些实施例中,VM中的微三角形的数量甚至可以高于6400万。

为了从微网格或微网格的栅格生成VM,每个微三角形都被分配了可见性状态。在一些实施例中,每个微三角形具有关联的可见性状态,其将微三角形区域分类为不透明、半透明或透明。

例如,当在BVH的光线遍历期间,光线与具有关联VM的几何图元相交时,相交点(也称为“命中点”)的重心坐标用于在微网格内进行索引,以查找与相交点对应的微三角形区域的可见性状态。如果它是不透明的,则命中是有效命中并被提交。如果它被屏蔽为透明,则命中被忽略。如果它是半透明的,则调用AHS来确定如何处理相交。在本公开的实施例的VM之前,任何光线图元相交(除非在相应的光线标志和/或来自先前遍历的信息提供相交被忽略的情况下)将导致TTU停止当前光线的遍历并且返回至SM以进行AHS调用。注意半透明状态在本公开中有时被称为“阿尔法”,并且有时被称为“未知”,因为不透明/透明是未知的。

图5显示了枫叶,其轮廓由VM 502近似。在所示实施例中,被枫叶完全覆盖的微三角形是不透明的(例如,504),没有被枫叶覆盖的部分的微三角形是透明的(例如506),而部分被枫叶覆盖的微三角形是半透明的(例如508)。在一些其他实施例中,VM可以根据可见性状态的不同分类对各个微三角形进行分类。

在微网格和VM用于光线追踪的示例实施例中,区域502可以对应于在光线三角形相交中测试的几何图元。然后,该实现将基于覆盖在区域502上的微网格识别相交点出现的微三角形。然后可使用所识别的微三角形来查找VM中的索引以获得在交点处的区域502的场景细节。例如,场景细节可以与对应于如图5所示的枫叶的掩模在识别出的微三角形处的特征有关。

在示例实施例中,访问索引仅需要覆盖几何图元502的微网格的内在参数化,而不需要存储描述主题三角形(例如,几何图元502)和主题三角形内的点之间的映射的额外数据。在示例实施例中,访问索引所需的所有信息是(1)点或等效的小区域(例如,微三角形)位于微网格中的位置和(2)小区域有多大。这与需要消耗大量存储和带宽的纹理坐标的纹理映射等形成对比。换句话说,与需要纹理坐标等的方法相比,在示例实施例中,相交点的重心坐标直接用于访问VM,从而避免了与附加坐标相关联的存储和带宽的附加成本并提供了对场景信息的更快访问。

与微网格一起使用的VM可以是每个微三角形一个、两个或某个其他数量的位的位掩模。VM的存储要求对应于图23所示表格中总结的微三角形计数,随VM的分辨率而变化。每个微三角形1位的VM将每个相应的微三角形标记为不透明或透明,并且在光线追踪期间不需要软件干预(例如,在SM上运行的AHS)。

VM可以是高分辨率的,例如图6A-6B中所示,其中在左侧图6A中所示的叶子分支在右侧图6B中所示的高分辨率VM中表示。如果存储器消耗是实现的关注点,则VM的分辨率可能大大降低。降低分辨率通常是最有效的压缩形式。通过降低分辨率,可以保留完整的渲染保真度,因为仍会为任何未解析的可见性状态调用着色器。图6C显示了提供64:1压缩的两个128位的VM 602和604,而图6D显示了提供1024:1压缩的两个32位的VM 606和608。当如图6B所示的1位的掩模如图6C-6D所示被下采样时,可以看出掩模的区域代表原始掩模的不透明和透明的混合的区域。这些区域在图6D中显示为灰色(例如,微三角形610)。请注意,在较低分辨率的VM图6D中,除了两个VM的轮廓外,还显示了掩模的微三角形。

当使用经下采样的VM时,AHS可以用于以与原始掩模相同的保真度解析可见性。例如,如果光线与如图6D中所示的“灰色”微三角形相交,则调用AHS以确定该微三角形的可见性状态结果。在显示的两个降低分辨率的示例中,大多数微三角形要么不透明,要么透明。这意味着大多数时候光线相交不需要调用软件来解析相交。

2位的可见性掩模编码四种状态,这又提供了一些解释的灵活性。在示例实施例中,2位VM的四种状态被定义为透明、未知透明、未知不透明和不透明。

为了渲染一些光线追踪的效果,不需要精确的分辨率。例如,可以使用较低分辨率的代理解析软阴影。为了便于使用此类代理,可以重新映射四状态VM。在这些状态的一个重新映射中,未知透明与透明相关联,而未知不透明与不透明相关联,并且在这样做时将每个微三角形2位的VM解释为每个微三角形1位的映射不需要软件回退,因为没有未知状态。在四种状态的第二种解释中,当被击中的微三角形被归类为未知中的任何一个时,调用软件。在后一种设置中,大多数光线在没有软件帮助的情况下被解析,但保真度/准确性对于恰好相交的任何所谓的未知微三角形得以保留。图6E-6F中示出了这两个重新映射。图6E表示具有透明、未知和不透明三种可见性状态的备选2位映射,而图6F显示具有透明和不透明两种可见性状态的对应映射。可以看出,在图6E的VM底部,指定为未知可见性状态(以灰色显示)的微三角形的集群(cluster)已被重新映射到一些透明微三角形(显示为明亮)和一些不透明(显示为黑色)。

2位编码也可用于加速半透明对象的光线追踪。这些对象是透明、不透明和半透明的混合,其中只有半透明部分需要软件来解析。在渲染像不需要软件来追踪的阴影等的低频/模糊效果时,此类材料也有助于简化。在图7A-7B中,用示例说明了阴影和半透明映射。图7A显示了一个半透明的苔藓纹理,图7B针对其在上方显示了阴影掩模以及在下方显示了半透明映射。这表明2位的4态实现可以强制未知可见性状态的区域为透明或不透明。如下所述,这可以在每条光线的基础上完成。例如,光线可以被指定为阴影光线(因此不关心半透明度),因此使用阴影映射(图7B,上部)强制所有未知区域为不透明或透明。

为了性能效率和减少所需存储器的大小,重要的是VM被有效地编码。除了减少VM占用的存储器量的大小外,还应该能够高效地访问它。在一些实施例中,游程长度编码用于编码值序列。需要从VM到序列的映射,因为序列是列表,一维数字列表,而VM是掩模值的三角形图像。如果序列在空间上是连贯的,游程长度编码会更有效。如果一个值在空间上靠近序列中的下一个值,则图像的一维遍历更加连贯。如果考虑正方形图像,则对应于希尔伯特(Hilbert)或莫顿(Morton)空间填充曲线的两个遍历顺序会产生必要的效率。希尔伯特遍历顺序可能更连贯,而莫顿顺序的计算成本更低。计算成本很重要,因为频繁的操作采用二维坐标并产生相应掩模值的索引。

对于像一些示例实施例中的微网格的规则三角形区域,可以使用高度连贯的遍历顺序。图8中所示的遍历在本质上类似于希尔伯特曲线(例如,希尔伯特曲线通常为矩形栅格定义),但设计为计算更简单。所示的遍历路径可以被认为是三角形希尔伯特曲线。如图所示,可以为微网格的细分级别的层次结构的各个级别设计相同的遍历路径。例如,在1、2、3和4级,三角形(即外三角形)分别细分为4、16、64和256个微三角形。在示例实施例中,所示的遍历路径使计算能够从索引(在VM中)到离散的重心坐标,并且从重心坐标到索引是廉价的。

首先建立一些标签和术语以帮助描述。图9A示出了重心坐标和离散的重心坐标。变量u、v、w用作重心坐标。三角形内的任何位置都可以使用三个值中的两个来定位,因为坐标是非负的并且和为一。如果三角形的面积本身为1.0,则u、v、w等于通过连接被定位的点与三角形三个顶点形成的三个子三角形的面积。如果三角形的面积较大或较小,则u、v、w表示比例面积。坐标也可以解释为从边到其相对顶点的垂直距离,也从0到1变化。

术语离散重心坐标用于指代和解决微网格中的各个微三角形。微三角形使用三元组命名,其中有效值随分辨率而变化。在图9A中,显示了沿每条边具有四个分段的微网格,总共有16个微三角形。每个微三角形都有一个名称(标签),其中元组的成员总和为二或三。任何一对这样的三角形在其中一个元组成员中将相差1。还请注意,网格由成排的u、v或w常数的微三角形组成。右侧示出的三角形微网格中显示了微三角形标签,而左侧示出的三角形微网格中显示了相应的顶点标签。

在对微网格进行编码时,遍历微网格的微三角形。根据一些实施例的用于遍历微网格的前四代空间填充曲线的图示在图8中示出。四种遍历模式中的每一种都显示了通过同一三角形的不同分辨率级别的遍历。虽然在图8中仅示出了前四代(级别)的遍历曲线,但应当理解,具有更多级别的微网格的层次结构(每个级别提供不同的细节水平(或换句话说,不同的分辨率))可以用于为诸如三角形几何图元的几何图元编码VM。根据一个实施例,微网格栅格的层次结构对于层次结构的每个级别可以具有四次方的分辨率增加。例如,图8显示了三角形区域,其中各个级别的三角形微网格数分别为4、16、64和256。

图9B示出了用于基于命中点的重心坐标来确定存储器中的数据结构的索引的一些代码示例。命中点坐标作为“bary2index()”函数的输入提供,该函数提供数据结构的索引作为其输出。在示例函数中,提供了坐标中的两个(u和v),因为可以从提供的两个坐标计算出第三个坐标w。该函数还需要定义微网格的细分级别的级别参数。

bary2index()调用quantizeBary()函数以确定对应于作为浮点重心坐标返回的命中点的离散重心坐标。或者,bary2index()调用quantizeBaryClamp()函数,该函数执行浮点到重心坐标的离散转换,另外还执行钳位操作。钳位操作用于将一侧略微位于三角形外侧的命中点钳位到同一侧的三角形内部——而如果没有钳位,则计算可能会将命中点绕到三角形的另一侧。

材质和VM的重用

计算机图形渲染系统经常使用材质系统,其中材质由组合在一起的各种属性组成。材质属性包括控制反光度、反照率颜色以及阿尔法和位移的纹理映射。传统的阿尔法纹理自然映射到VM。被光线相交的三角形(例如几何图元)使用纹理坐标引用传统纹理。这些辅助坐标定义了三角形和纹理映射之间的映射。创建纹理坐标是图形渲染系统的内容创建管线中的一个重要负担。与传统的纹理映射不同(传统的纹理映射具有复杂的标头等,要在可能会阻碍实时操作的开销级别上进行设置),VM使用三角形的固有坐标系——重心坐标。因此,VM不需要创建纹理坐标。根据计算机图形系统中的示例实施例确定可见性状态的好处是,由于避免了创建纹理坐标的成本而可以实现的实质性性能改进。

在一些实施例中,诸如纹理和VM的资源被分组成材质。当渲染对象的实例时,通常会将可能不同的材质与每个对象实例相关联。因为VM可以表示有助于定义对象的可见性的材质属性,所以示例实施例中包含一种机制以将不同材质(例如,VM组)与光线追踪实例相关联。在上述一些示例实施例中,三角形直接引用其相关联的VM。相比之下,在一些其他实施例中,将VM视为材质属性,每个三角形通过VM数组中的索引引用其相关联的资源。给定的材质具有关联的VM数组。当使用材质调用实例时,相应的VM数组被绑定到该实例。因此,不同材质的描述是VM重用的一个示例。

另一种形式的重用源于常见的CAD构建技术,其中对象组件是彼此的精确镜像。表示对象的三角形网格通常是这样定向的,即从外部看时所有三角形都具有相同的顶点顺序。顶点围绕它们定义的三角形按顺时针(或逆时针)顺序组织。模型构建中使用的镜像操作自然会改变顶点顺序,使镜像三角形看起来朝向相反的方向。为了恢复一致的三角形朝向,镜像的顶点顺序被颠倒。然而,因为VM寻址是从顶点排序派生的,为了纠正镜像操作,必须知道顶点顺序何时被修改了。VM可以跨普通实例和镜像实例重用,因为映射/掩模寻址考虑了镜像。

利用位移映射(DM)的操作

在一些实施例中,VM和/或为其定义VM的几何另外与“位移映射”相关联,位移映射使得TTU除了确定与命中点处的几何相关联的可见性状态之外,还确定在命中点处的该几何体的相对位置,而不会将命中点信息返回给SM以在那里解析。位移映射在____________提交的题为“用于光线和路径追踪的位移微网格(Displaced Micro-meshes for Ray andPath Tracing)”的美国申请No._____________(代理人卷号:6610-125)中有所描述,其全部内容通过引用并入本文。

可选地并且除了VM之外,一些示例实施例还使用DM来渲染几何图元。图10A、10B和10C分别示意性地图示了被位移映射的微三角形、可见性掩模的微三角形和由组合的DM和VM定义的微网格。也就是说,图10C中所示的微网格同时应用了图10A中所示的位移和图10B中所示的可见性掩模。

压缩VM

一些示例实施例使用直接存储为未压缩的空间填充曲线。在这些实施例中,使用具有不同分辨率的“未知”可见性状态来提供压缩。对于三角形微网格等规则三角形区域(例如图4A),可以使用高度连贯的遍历顺序,例如上面关于图8描述的顺序。遍历路径在本质上类似于希尔伯特曲线,但计算起来更简单。从索引到离散重心坐标以及从坐标到索引的计算成本低廉(参见图9B)。前四级细分的索引顺序在图8中示出。

在一些其他实施例中,游程长度编码或另一种编码方案可用于根据诸如图8所示的空间填充遍历曲线来压缩VM。游程长度编码等可被应用于空间填充曲线,例如图8中的曲线。在__________提交的题为“微网格,用于计算机图形的结构化几何体(Micro-Meshes,AStructured Geometry For Computer Graphics)”的美国专利申请No.__________(代理人案卷:6610-126),提供了VM的游程长度编码的更详细描述,其已通过引用并入。

示例光线追踪过程

图11A示出了可以由SM 232执行并由TTU 238加速的示例性光线追踪着色管线1100。光线追踪着色管线1100由SM 232调用光线生成1110并向TTU 238发出相应的光线追踪请求来开始。光线追踪请求识别投射到场景中的单条光线,并要求TTU 238搜索具有SM232也指定的加速数据结构的相交。TTU 238遍历(图11A的框1120)加速数据结构以确定光线与体细分以及加速数据结构所表示的相关三角形之间的相交或潜在相交。潜在的相交可以通过在加速数据结构中找到与光线相交的包围体来识别。非相交包围体的后代不需要检查。

对于相交的包围体内的三角形,TTU 238光线-图元测试块1320(见图13)执行相交1130过程以确定光线是否与图元相交。在一些实施例中,该操作包括引用与图元相关联的VM。TTU 238将相交信息返回给SM 232,SM 232可以响应于相交确定执行“任何命中”着色操作1230。例如,SM 232可以对相交的图元执行(或让其他硬件执行)纹理查找,并基于适当的纹理像素的值决定如何为可视化光线的像素着色。由于TTU 238可以按任意顺序返回与场景中的不同几何体的多个相交点,因此SM 232会追踪此类结果。

图11B是概述了TTU 238如上所述与SM 232协同执行的示例光线追踪操作的流程图。图11B的操作由TTU 238与和其交互的SM 232配合进行。因此,TTU 238可以从SM 232接收对光线的识别并且遍历状态,该遍历状态枚举该光线必须遍历的一个或更多个BVH中的一个或更多个节点。TTU 238确定光线与BVH数据结构的哪个包围体相交(“光线-完成体(ray-complet)”测试1172)。TTU 238随后还可以确定光线是否与相交的包围体中的一个或更多个图元相交以及相交了哪些三角形(“光线-图元测试”1178)–或如果TTU自身执行起来很复杂,SM 232也可以用软件执行此测试。在示例非限制性实施例中,完成体指定包围体层次结构的根或内部节点(即,体积),包围盒层次结构具有为其他完成体的子项或每个完成体单一类型的叶节点。

首先,TTU 238检查光线的遍历状态。如果TTU 238为光线维持的堆叠是空的,则遍历完成。如果堆栈顶上有条目,则遍历协处理器238向存储子系统发出请求以检索该节点。然后,遍历协处理器238执行包围盒测试1172以确定BVH数据结构的包围体是否与SM 232指定的特定光线相交(步骤1172、1174)。如果包围盒测试确定包围体不与光线相交(步骤1174中为“否”),则无需执行任何进一步的可视化测试,并且TTU 238可以将此结果返回给发出请求的SM 232。这是因为,如果光线错过包围体(如图1A中的包围体110所示),则光线将错过被测试的包围体内的所有其他较小的包围体以及该包围体包含的任何图元。

如果由TTU 238执行的包围盒测试显示包围体与光线相交(在步骤1174中为“是”),则TTU确定是否可以将包围体细分为较小的包围体(步骤1176)。在一个示例实施例中,TTU 238本身不必执行任何细分。而是,BVH中的每个节点都有一个或更多个子项(其中每个子项是BVH中的叶或分支)。对于每个子项,都有一个或更多个包围体和指向分支或叶节点的指针。当光线使用TTU 238处理节点时,它正在针对该节点的子项的包围体进行自我测试。光线只将那些其代表性包围体被命中的分支或叶子的堆栈条目推入其堆栈。在示例实施例中,当光线获取节点时,它不会针对该节点的包围体进行测试,而是针对该节点的子节点的包围体进行测试。TTU 238按由光线配置确定的顺序将其包围体被光线命中的节点推到光线的遍历堆栈上。例如,可以按节点在存储器中出现的顺序,或它们沿着光线的长度出现的顺序或其他某种顺序将节点推到遍历堆栈上。如果存在包围体的进一步细分(在步骤1176中为“是”),则访问包围体的那些进一步细分,并且对每个所得到的细分的包围体执行包围盒测试,以确定哪些细分的包围体与光线相交而哪些不与光线相交。在该递归过程中,一些包围体可以通过测试1174来消除,而其他包围体可以导致通过TTU 238递归地应用步骤1172-1176来对进一步的细分进行相交测试。

一旦TTU 238确定与光线相交的包围体是叶节点(步骤1176中为“否”),则TTU 238和/或SM 232执行图元(例如,三角形)相交测试1178以确定光线是否与相交的包围体中的图元相交,以及光线与哪些图元相交。因此,TTU 238执行相交的后代分支节点的深度优先遍历,直到到达叶节点为止。TTU 238处理叶节点。如果叶节点是图元范围,则TTU 238或SM232将它们相对于光线进行测试。如果叶节点是实例节点,则TTU 238或SM 232应用实例变换。如果叶节点是项范围,则TTU 238将它们返回给请求的SM 232。在示例非限制性实施例中,SM 232可以命令TTU 238执行不同种类的光线-图元相交测试并根据来自应用程序(或在其上运行该应用程序的软件栈)的操作报告不同的结果,并由SM中继到TTU。例如,SM 232可以命令TTU 238报告相交测试揭示的最近的可见图元,或报告与光线相交的所有图元,而不管它们是否是最近的可见图元。SM 232可以将这些不同的结果用于不同类型的可视化。或者,一旦TTU 238已经报告了光线-完成体测试结果,SM 232即可自行执行光线-图元相交测试。TTU 238处理完叶节点后,可能会有其他分支节点(较早推送到光线的堆栈上的分支节点)要测试。

示例由TTU 238和SM 232实例化管线实现

以下描述示例实施例中的TTU 238如何执行实例化和相关的变换。

图12A的光线追踪管线流程图的更详细的图示出了代表性用例的组件之间的数据流和交互:针对包含几何图元的场景追踪光线,并在硬件中处理实例变换。在一个示例非限制性实施例中,图12A的光线追踪管线本质上是软件定义的(在示例实施例中,这意味着其由SM 232确定),但是广泛使用了由TTU 238的硬件加速。关键组件包括SM 232(以及其余的计算管线)、TTU 238(其充当SM的协处理器)以及L1高速缓存和下游存储器系统,TTU从这些组件中获取BVH和三角形数据。

图12A中所示的管线示出了可以由开发系统提前执行包围体层次结构创建1202。还示出了在示例实施例中,作为着色(可以包括照明和纹理),由SM 232或其他软件执行或控制的光线创建和分布1204。示例管线包括分别由TTU 238执行的“顶层”BVH树遍历1206、光线变换1214、“底层”BVH树遍历1218和光线/三角形(或其他图元)相交1226。不必按所示顺序执行这些操作,如TTU 238和SM 232之间的握手确定了TTU 238的工作方式和顺序。

SM 232一次向TTU 238呈现一条或更多条光线。SM 232呈现给TTU 238用于遍历的每条光线都可以包括光线的几何参数、遍历状态以及光线的光线标志、模式标志和光线操作信息。在示例实施例中,光线操作(RayOp)提供或包括辅助算术和/或逻辑测试,以抑制、覆盖和/或允许相交的存储。(见美国专利号10,867,429)。遍历堆栈也可以由SM 232使用,以将某些状态信息传送给TTU 238,以便在遍历中使用。新的光线查询可以从显式遍历堆栈开始。但是,对于某些查询,可以提供少量的堆栈初始化器以开始给定类型的新查询,例如:从完成体开始的遍历;光线与一定范围的三角形的相交;光线与一定范围的三角形的相交,然后从完成体开始进行遍历;针对给定三角形从三角形缓冲区获取的顶点,等等。在一些实施例中,使用堆栈初始化器代替显式堆栈初始化可提高性能,因为堆栈初始化器需要较少的流处理器寄存器并减少了需要从流处理器传输到TTU的参数数量。

在图12A所示的示例中,TTU 238执行顶层树遍历1206和底层树遍历1218。在示例实施例中,BVH的两层遍历使能对动态场景变化进行快速光线追踪响应。

在一些实施例中,在进入顶层树遍历或在顶层树遍历中,在BVH中遇到指定顶层变换的可选实例节点1205。实例节点1205(如果存在的话)向TTU指示以实例节点1205为根的子树被对齐到替代的世界空间坐标系,其中在实例节点1205中定义来自世界空间的变换。在标题为“采用替代世界空间变换的光线追踪硬件加速(Ray Tracing HardwareAcceleration with Alternative World Space Transforms)”的美国专利第11,282,261号中描述了顶层实例节点及其用途,其通过引用整体并入本文。

加速结构(TLAS)的顶层包含世界空间坐标中的几何体,加速结构的底层(BLAS)包含对象空间坐标中的几何体。TTU分别为TLAS遍历和BLAS遍历维护光线状态和堆栈状态,因为它们是有效的独立遍历。

如上所述,SM向TTU通知BVH中的位置,用于在启动新的光线查询时开始光线遍历,或者通过在发送到TTU的光线查询中包括堆栈初始化完成体来重新启动光线查询。堆栈初始化完成体包括指向要遍历的子树的根的指针。

光线变换1214通过将可以在第一坐标空间(例如,世界空间)中的顶层遍历中使用的光线变换到底层遍历的BVH的不同坐标空间(例如,对象空间),提供从顶层树遍历1206到底层树遍历1218的适当迁移。在先前的文献中描述了使用两层遍历的示例BVH遍历技术,例如,参见Woop,“用于动态场景的光线追踪硬件架构(A Ray Tracing HardwareArchitecture for Dynamic Scenes)”,萨尔兰德大学,2004年,但是实施例不限于此。

示例顶层树遍历

TTU 238进行的顶层树遍历1206从L1高速缓存1212接收完成体,并向光线变换1214提供实例以进行变换,或向SM 232提供未命中(miss)/结束输出1213以用于由SM进行最接近命中着色器1215处理(此块还可以基于非叶节点/无命中条件来递归地操作)。在顶层树遍历1206中,下一完成体获取步骤1208从存储器和/或高速缓存层次结构中获取针对步骤1210中的光线相交要测试的下一个完成体,并且在所获取的完成体中的包围体上进行光线-包围体相交测试。

如上所述,实例节点将一个BVH连接到处于不同坐标系中的另一个BVH。当相交的包围体的子项是实例节点时,光线变换1214能够从L1高速缓存1216中检索适当的变换矩阵。TTU 238使用适当的变换矩阵将光线变换到子BVH的坐标系。已经通过引用并入的专利号为10,025,879的美国专利描述了将树中的第一组节点连接到第二组节点的变换节点,其中第一组节点和第二组节点位于不同的坐标系中。示例实施例中的实例节点可以类似于美国专利第10,025.879号中的变换节点。替代地,在图12B中所示的TTU 238的非实例化模式中,TTU不执行“底”层树遍历1218,并且非实例化的树BVH遍历由框1208、1210例如仅使用一个堆栈来执行。TTU 238可以基于它从BVH和/或查询类型中读取的内容在图12A的实例化操作和图12B的非实例化操作之间切换。例如,特定的查询类型可能会限制TTU仅使用非实例化操作。在这种查询中,任何相交的实例节点都将返回给SM。

在一些非限制性实施例中,在获取下一个完成体之前,对所获取的完成体中的每个包围体执行步骤1210中的光线-包围体相交测试。其他实施例可以使用其他技术,例如以深度优先的方式遍历顶层遍历BVH。已经通过引用并入的美国专利第9,582,607号描述了可以在示例实施例中使用的一个或更多个完成体的结构和内容。美国专利第9,582,607号也描述了完成体的示例遍历。

当确定包围体与光线相交时,针对随后的与光线的相交测试和遍历,对相交的包围体的子包围体(或对其的引用)进行追踪。在示例实施例中,一个或更多个堆栈数据结构用于追踪随后要测试与光线的相交的子包围体。在一些示例实施例中,可以使用小尺寸的遍历堆栈来追踪要通过顶层树遍历1206的操作遍历的完成体,和要针对相交进行测试的图元,并且可以使用较大的局部栈数据结构来追踪底层树遍历1218中的遍历状态。

示例底层树遍历

在底层树遍历1218中,下一完成体获取步骤1222在步骤1224中从存储器和/或高速缓存层次结构1220中获取要针对光线相交进行测试的下一个完成体,并在获取的完成体中的包围体上进行光线-包围体相交测试。如上所述,底层树遍历可以包括具有与在较上层树遍历中遍历的包围体处于不同的坐标系中的包围体的完成体。底层树遍历还从L1高速缓存中接收完成体,并且可以基于非叶/无命中条件在自身内部递归地或迭代地进行操作,并且还伴随基于未命中/结束检测的顶层树遍历1206。随着将光线变换到检索到的较低层完成体的坐标系中,可以确定光线与较低层BVH中的包围体的相交。然后将在较低层的树遍历中找到的与光线相交的叶包围体提供给光线/三角形相交1226。

底层树遍历1218的叶输出被提供给光线/三角形相交1226(其具有L0高速缓存访问以及通过L1高速缓存1228检索三角形的能力)。L0完成体和三角形高速缓存可以是TTU238内部的小型只读高速缓存。当到达某些叶节点而没有遍历实例化的BVH时,光线/三角形相交1226也可以从顶层树遍历1206接收叶输出。

在已经处理完图元范围内的所有图元之后,相交管理单元检查结果队列的状态,并制作数据包以发送到堆栈管理单元和/或光线管理单元,用于更新光线的属性和遍历状态,设置光线的下一个遍历步骤和/或将光线返回到SM 232(如有必要的话)。如果结果队列包含在处理图元范围期间找到的不透明或阿尔法相交,则相交管理单元将结果队列中最近的不透明相交的参数长度(t)发信号给光线管理单元,以记录为光线tmax从而缩短光线。为了更新遍历状态以设置光线的下一个遍历步骤,相交管理单元会向堆栈管理单元发送信号,告知结果队列中是否存在来自图元范围的不透明相交,结果队列中是否存在一个或更多个阿尔法相交,结果队列是否已满,是否在图元范围中找到了尚未返回到SM并且不存在于结果队列中的其他阿尔法相交,以及在SM消耗结果队列的内容之后要针对光线进行测试的图元范围中的下一个阿尔法图元的索引(根据结果队列中当前图元范围,具有最高存储器顺序的阿尔法图元之后的范围中的下一个图元的索引)。

当堆栈管理单元1340从相交管理单元1322接收到分组时,堆栈管理单元1340检查该分组以确定完成遍历步骤并开始下一个所需的下一动作。如果来自相交管理单元1322的分组指示在图元范围内发现了不透明的相交,并且光线模式位指示一旦找到了任何相交,光线将完成一次遍历,则堆栈管理单元1340将光线及其结果队列返回到SM,其中遍历状态指示遍历已完成(完成标志设置和/或空的顶层和底层堆栈)。如果来自相交管理单元1322的分组(packet)指示结果队列中存在不透明或阿尔法相交,以及在还没有返回到SM的图元范围的处理期间结果队列中不存在光线遇到的图元范围中的剩余的阿尔法相交,则堆栈管理单元1340将光线和结果队列返回到SM,其中遍历状态被修改为设置剔除不透明位,以防止在来自图元范围的最高阿尔法图元相交在光线的结果队列中返回到SM之后进一步处理图元范围中的不透明图元和前进到第一阿尔法图元的图元范围起始索引。如果来自相交管理单元1322的分组指示当光线处理图元范围时未发现不透明或阿尔法相交,则堆栈管理单元1340从活动遍历堆栈中弹出顶部堆栈条目(对应于完成的图元范围)。如果来自堆栈管理单元1340的分组指示或结果队列中存在不透明的相交和光线模式位不指示一旦已经找到任何相交和/或结果队列中存在阿尔法相交则光线将完成遍历中的任一个,但是在尚未返回给SM的结果队列中不存在的图元范围中未找到剩余阿尔法相交,则堆栈管理单元1340将顶部的堆栈条目(对应于完成的图元范围)弹出活动遍历堆栈并修改结果队列的内容,以指示结果队列中存在的所有相交都来自完成处理的图元范围。

如果活动堆栈是底部堆栈,而底部堆栈为空,则堆栈管理单元1340将活动堆栈设置为顶部堆栈。如果顶部堆栈是活动堆栈,并且活动堆栈为空,则堆栈管理单元1340将光线及其结果队列返回到SM,其中遍历状态指示遍历已完成(完成标志设置和/或空的顶层和底层堆栈)。如果活动堆栈包含一个或更多个堆栈条目,则堆栈管理单元1340检查顶部堆栈条目并开始下一遍历步骤。在标题为“保守水密光线三角形相交(Conservative WatertightRay Triangle Intersection)”的美国专利第10,825,230号和标题为“处理乱序的不透明和阿尔法光线/图元相交的方法(Method for Handling Out-of-Order Opaque and AlphaRay/Primitive Intersections)”的美国专利第10,740,952号中描述了与光线相交的图元和/或图元范围的测试以及将结果返回到SM 232,在本文中通过引用方式将以上两者并入本文。

示例非限制性TTU 238硬件实现

图13示出了TTU 238的示例简化框图,包括被配置为执行如上所述的加速遍历操作的硬件。在一些实施例中,TTU 238可以使用短堆栈遍历和支持的叶节点图元的相交测试以及阿尔法图元和不支持的叶节点图元(项)的中间遍历返回来执行包围体层次结构的深度优先遍历。TTU 238包括用于确定光线是否与包围体相交的专用硬件和用于确定光线是否与树数据结构的图元相交的专用硬件。

更详细地,TTU 238包括相交管理块1322、光线管理块1330和堆栈管理块1340。这些块中的每一个(以及图13中的所有其他块)可以构成通过逻辑门、寄存器、硬件嵌入式查找表或其他组合逻辑等实现的专用硬件。

光线管理块1330负责管理关于由SM 232向光线管理块指定的光线的信息以及执行关于该光线的操作。堆栈管理块1340与遍历逻辑1312一起工作以管理关于BVH加速数据结构的遍历的信息并执行与遍历BVH加速数据结构相关的操作。遍历逻辑1312由光线-完成体测试块1310的结果指导,光线-完成体测试块1310测试由光线管理块1330指示的光线与由BVH表示的体细分之间的相交,根据需要使用实例变换。光线-完成体测试块1310经由作为TTU 238的一部分的L0完成体高速缓存1352从存储器240检索关于BVH的附加信息。光线-完成体测试块1310的结果通知遍历逻辑1312是否需要进一步递归遍历。当遍历逻辑1312从BVH的一层向另一层遍历时,堆栈管理块1340维护堆栈以追踪状态信息,其中当遍历逻辑更深入地遍历BVH时,堆栈管理块1340将项目推送到堆栈上,并且当遍历逻辑在BVH中向上遍历时,堆栈管理块1340将项目从堆栈中弹出。堆栈管理块1340能够在SM请求的任何时间向请求SM 232提供状态信息(例如,中间或最终结果)。

相交管理块1322根据需要使用实例变换来管理关于光线和图元之间的相交的信息并执行关于该相交的操作。光线图元测试块1320根据需要经由作为TTU 238的一部分的L0图元高速缓存1354从存储器240检索关于几何的信息。相交管理块1322被光线图元测试的相交测试的结果通知并且变换块1320执行。因此,光线图元测试和变换块1320向相交管理块1322提供相交结果,相交管理块1322向请求的SM 232报告几何命中和相交。在一些实施例中,光线图元测试和变换块1320和相交管理块1322协作以确定当VM与该图元相关联时相交图元的可见性。

堆栈管理单元1340检查遍历状态以确定需要检索什么类型的数据以及哪个数据路径(完成体或图元)将使用它。在包括一个或更多个光线-完成体测试块1310和一个或更多个遍历逻辑块1312的TTU 238的光线完整测试路径中确定包围体的相交。完成体指定包围体的根节点或内部节点。因此,一个完成体可以为光线-完成体测试定义一个或更多个包围体。在这里的示例实施例中,一个完成体可以定义多个“子”包围体(无论它们是否代表叶节点),这些“子”包围体不一定每个都有后代,但是TTU将为了光线包围体相交并行地测试它们,以确定是否需要测试与多个包围体关联的几何图元的相交。

TTU 238的光线-完成体测试路径识别光线与哪些包围体相交。与光线相交的包围体需要进一步处理以确定与相交的包围体关联的图元是否相交。在包括一个或更多个光线图元测试和变换块1320和一个或更多个相交管理块1322的光线图元测试路径中确定图元的相交。

TTU 238从一个或更多个SM 232接收查询以执行树遍历操作。该查询可以请求光线是否与BVH数据结构中的包围体和/或图元相交。查询可以识别光线(例如,光线的原点、方向和长度)和BVH数据结构和遍历状态(短堆栈),其包括引用该光线将访问的一个或更多个边界体层次结构中的节点的一个或更多个条目。该查询还可以包括关于光线在遍历期间如何处理特定类型的相交的信息。光线信息可以存储在光线管理块230中。存储的光线信息(例如,光线长度)可以基于光线图元测试的结果来更新。

TTU 238可以请求从TTU 238外部的存储器检索在查询中识别的BVH数据结构。BVH数据结构的检索部分可以高速缓存在TTU 238内的零级(L0)高速缓存1350中,因此信息可用于其他时间一致的TTU操作,从而减少存储器1340访问。光线-完成体测试所需的BVH数据结构的部分可以存储在L0完成体高速缓存1352中,并且光线图元测试所需的BVH数据结构的部分可以存储在L0图元高速缓存1354中。在VM与至少一些图元相关联的实施例中,用于从存储器检索的BVH的部分的VM也可以提供给TTU 238。

在请求的遍历步骤所需的完成体信息在完成体高速缓存1352中可用之后,光线-完成体测试块1310确定与光线相交的包围体。在执行此测试时,光线可以从包围体层次结构的坐标空间变换到相对于完成体定义的坐标空间。光线针对与完成体的子节点关联的包围盒进行测试。在示例性非限制性实施例中,光线没有针对完成体自己的包围盒进行测试,因为(1)TTU 238在测试引用该完成体的父包围盒子时,其先前针对类似的包围盒测试了光线,并且(2)完成体包围盒的目的是定义局部坐标系,在该坐标系内子包围盒可以以压缩形式表示。如果光线与任何子包围盒相交,则结果被推送到遍历逻辑以确定相应的子指针将被推送到遍历堆栈的顺序(进一步的测试可能需要遍历逻辑1312向下遍历到BVH的下一层)。递归地重复这些步骤,直到遇到BVH的相交叶节点。

光线-完成体测试块1310可以向遍历逻辑1312提供光线-完成体相交。使用光线-完成体测试的结果,遍历逻辑1312创建堆栈条目以被推送到堆栈管理块1340。堆栈条目可以指示需要由光线-完成体测试块1310进一步测试光线相交的内部节点(即,包括一个或更多个子节点的节点)和/或在需要由光线图元测试和变换块1320测试光线相交的相交叶节点中识别的三角形。光线-完成体测试块1310可以在堆栈中识别的内部节点上重复遍历以确定光线相交的BVH中的所有叶节点。光线-完成体测试块1310执行的精确测试将在示例性非限制性实施例中由模式位、光线操作(见下文)和命中的剔除来确定,并且TTU 238可以将中间结果以及最终结果返回给SM 232。

光线-图元相交测试

再次参考图13,TTU 238还具有加速相交测试的能力,该相交测试确定光线是否与特定几何体或图元相交。对于某些情况,几何体足够复杂(例如,由曲线或与例如顶点相反的其他抽象构造定义),以至于TTU 238在某些实施例中可能无法帮助进行光线-图元相交测试。在这种情况下,TTU 238只需向SM 232报告光线-完成体相交测试结果,而SM 232自己执行光线-图元相交测试。在其他情况下(例如,三角形),TTU 232可以自行执行光线-三角形相交测试,从而进一步提高整个光线追踪过程的性能。为了完整起见,以下描述了TTU238可以如何执行或加速光线-图元相交测试。

如上所述,发现被光线相交的叶节点标识(包围)可能被光线相交或不被光线相交的图元。一个选项是TTU 238向SM 232提供例如在相交叶节点中识别的几何体范围以供进一步处理。例如,SM 232可以基于TTU 238作为TTU遍历BVH的结果而提供的信息自行确定所识别的图元是否与光线相交。为了从SM 232卸载此处理并从而使用TTU 238的硬件加速它,堆栈管理(SMU)块1340可以发出对光线-图元和变换(RTT)块1320的请求以为了对TTU的光线-完成体测试(RCT)块1310所识别的相交叶节点内的图元执行光线-图元测试。在一些实施例中,SM 732可以向RTT块1320发出对光线-图元测试的请求以测试特定范围的图元,而不管该几何体范围是如何被识别的。

在确保所请求的光线-图元测试所需的图元数据在图元高速缓存1354中可用之后,RTT块1320可以使用存储在光线管理(RMU)块1330中的光线信息来确定与光线相交的图元。RTT块1320向IMU块1322提供被确定为与光线相交的图元的识别。

IMU块1322可以将光线-图元测试的结果返回给SM 232。光线-图元测试的结果可以包括相交图元的标识符、相交距光线原点的距离以及关于相交图元的属性的其他信息。在一些实施例中,IMU块1322可以基于来自RTT块1320的先前相交结果来修改现有的光线-图元测试(例如,通过修改光线的长度)。

IMU块1322还可以追踪不同类型的图元。例如,不同类型的三角形包括在相交时会阻挡光线的不透明三角形和在相交时可能会或可能不会阻挡光线或可能需要SM额外处理的阿尔法三角形。光线是否被透明三角形阻挡可以例如取决于映射到三角形上的一个或更多个纹理、纹理占据的三角形的面积以及纹理修改三角形的方式。例如,某些实施例中的透明度(例如,彩色玻璃)需要SM 232追踪透明对象的命中,所以它们可以按光线参数顺序进行分类和着色,并且通常不会实际阻挡光线。同时,阿尔法“修剪”允许根据映射到图元上的纹理的形状修剪图元的形状——例如,从三角形中切出叶子形状。(请注意,在光栅图形中,透明度通常称为“阿尔法混合”,而修剪称为“阿尔法测试”)。在一些实施例中,尝试使用本公开上文和下文的VM来确定被命中的透明三角形或阿尔法三角形的可见性。在其他实施例中,TTU 238可以将透明命中推送到存储器中的队列以供SM 232稍后处理,并且通过向纹理单元发送请求来直接处理经修剪的三角形。每个三角形可以包括指示三角形类型的指示符。IMU块1322被配置为维护用于追踪不同类型的相交三角形的结果队列。例如,结果队列可以在一个队列中存储一个或更多个相交的不透明三角形标识符,而在另一队列中存储一个或更多个透明三角形标识符。

对于不透明的三角形,不太复杂的几何体的光线相交可以在TTU 238中完全确定,因为不透明三角形块的区域阻挡光线穿过三角形的表面。一些实施例提供使用VM来解析透明三角形和阿尔法三角形的可见性,如上文和下文所述。VM使透明三角形和阿尔法三角形在TTU 238上可见。对于没有关联的VM或禁用VM的透明三角形,在一些实施例中不能在TTU238中完全确定光线相交,因为TTU 238基于三角形的几何体执行相交测试,并且可能无法访问三角形的纹理和/或纹理占用的三角形的区域(在其他实施例中,TTU可以通过图形管线的纹理映射块被提供纹理信息)。对于不使用VM的三角形,为了完全确定三角形是否相交,关于光线-图元和变换块1320确定相交的透明三角形的信息可以被发送到SM 232,以供SM完全确定三角形是否影响沿光线的可见性。

SM 232可以解析光线是否和与透明三角形相关联的纹理相交和/或光线是否将被纹理阻挡。在某些情况下,SM 232可以基于该确定向TTU 238发送修改后的查询(例如,如果光线被纹理阻挡,则缩短光线)。在一个实施例中,TTU 238可以被配置为将确定为与光线相交的所有三角形返回给SM 232以供进一步处理。因为将每个三角形相交返回给SM 232以供进一步处理在接口和线程同步方面代价大,所以TTU 238可以配置为隐藏三角形,这些三角形相交但被证明能够被隐藏而不会对结果场景产生功能影响。例如,因为向TTU 238提供了三角形类型信息(例如,三角形是不透明的还是透明的),TTU 238可以使用三角形类型信息来确定被另一个相交的不透明三角形沿着光线遮挡的相交三角形,因此其不需要被包含在结果中,因为它们不会影响沿光线的可见性。如果TTU 238知道三角形沿着光线被不透明三角形遮挡,则被遮挡的三角形可以从结果中隐藏而不影响结果场景的可视化。

相交管理块1322可以包括结果队列,用于存储与三角形ID相关联的命中和关于光线命中三角形的点的信息。当确定光线与不透明三角形相交时,可以将三角形的标识和相交点与光线原点的距离存储在结果队列中。如果确定光线与另一个不透明三角形相交,则如果相交点与光线原点的距离大于已存储在结果队列中的相交不透明三角形的距离,则可以从结果中省略另一个相交的不透明三角形。如果相交点与光线原点的距离小于结果队列中已经存储的相交不透明三角形的距离,则另一个相交不透明三角形可以替换结果队列中存储的不透明三角形。在测试了查询的所有三角形之后,可以将存储在结果队列中的不透明三角形信息和相交信息发送到SM 232。

在一些实施例中,一旦不透明三角形相交被识别,则相交管理块1322可以缩短存储在光线管理块1330中的光线,使得相交的不透明三角形后面(沿着光线)的包围体(其可以包括三角形)不会被识别为与光线相交。

对于没有关联的VM或VM的使用被禁用的三角形,相交管理块1322可以将关于相交的透明三角形的信息存储在单独的队列中。所存储的关于相交的透明三角形的信息可以被发送到SM 232以供SM解析光线是否和与三角形关联的纹理相交和/或纹理是否阻挡光线。SM可以将该确定的结果返回给TTU 238和/或基于该确定修改查询(例如,如果光线被纹理阻挡则缩短光线)。

BVH中的VM信息

为了使TTU 238能够使用VM,在一些实施例中,BVH包括提供给TTU 238的VM信息。BVH中包括的VM信息包括可见性掩模块、具有VM信息的三角形块,以及具有VM信息的实例节点。

在一些实施例中,如图14所示的可见性掩模块1400是128B高速缓存行大小的存储器块1402。VM本身被编码为1或2位的可见性状态的序列,由一个或更多个可见块内的空间填充曲线(例如,如图8所示的遍历路径)排序。几何图元或对象的VM可能具有数百万个1位或2位的可见性状态,因此可能占用多个高速缓存行。所有状态都布置在缓冲区中,使得知道缓冲区的开始、每个可见性状态的大小和索引,可以访问适用于命中点的可见性状态等。图14示出了未压缩的VM块。在一些实施例中,可能没有用于排列VM的对齐要求,并且多个更小的VM可以共享同一块。VM块中没有存储有关访问VM的信息。相反,三角形块(如下所述)包含访问可见性块内的位并在必要时对位进行解码所需的所有信息。例如,三角形块中的VM类型字段1516(如下所述)指定VM是以1位可见性状态还是2位可见性状态编码的。从这个意义上说,VM块只是一桶必须被正确索引的位或可见性状态。

示例实施例包括三角形块压缩模式,其可用于支持为其定义了VM的三角形几何图元(“VM三角形”)。在一些实施例中,另一种三角形块压缩模式可用于支持具有运动的VM三角形。存储在三角形块中的VM相关内容对于非运动和运动情况可以是相同的。与VM相关联的压缩三角形1500的格式在图15中示出。

由于VM在三角形块中与三角形分开存储,所以提供指针以在VM块存储内找到VM的开始。三角形块格式1500中的最后一行数据指定块中三角形的可见性掩模缓冲区从何处开始,并且其他三角形的起点也被指定为距块中第一个三角形的偏移量。三角形块中的第一个三角形的开始被编码在三角形块1500中的基础VM偏移字段1502中。块中的其他三角形使用可能较低精度的偏移量,该偏移量是从该基础开始的逻辑增量编码。从逻辑上讲,这意味着基础VM偏移1502的较低N位与每三角形的VM偏移量的放置。那些每三角形的偏移量的精度由位于VM信息部分1504中的每块的精度字段1506编码。每三角形的偏移量被编码在可变长度可见性掩模数组1510中的每三角形的VM偏移字段1512中。

VM偏移量本身的大小可以是52位或43位,其被编码。它是由每块的VM对齐位1508编码的。如果是52位,则偏移量是位寻址指针(在49位的地址空间中)。如果是43位,则它是64字节对齐的指针。64字节对齐的指针可用于改进是自然64字节对齐的更大VM的压缩。占用少于64B存储的较小VM(例如,1位的0到4级,或2位的0到3级),可以紧密打包到单个可见性掩模块中并使用52位的位可寻址指针以了解起始位置(参见图23中的表格)。在位可寻址和64字节对齐可寻址之间切换的能力提供了使用任何大小的VM,以及在使用小型VM时将多个VM布置在同一高速缓存行上。请注意,虽然某些VM可以具有数百万个区域的可见性状态,但有些可能只有少量(例如,甚至低至一个—当考虑具有1位或2位的编码的0级可见性掩模时)。

具有单独的可见性掩模的替代设计是将位编码在三角形块内,或作为三角形块的扩展。对于可能只需要64位信息的较低级别,此类分配更容易。即便如此,这样做的一个主要缺点是无法在对其进行编码的三角形块之外重用该VM。重用VM是减少VM使用的存储量的有效方法。

为了能够获取三角形上的重心命中点并查找VM,需要关于VM的信息。VM的级别存储在每三角形的VM级别字段1514中。级别字段1514允许指定0和最大值之间的级别。在一些实施例中,相同的VM级别字段1514用于通过使用第一预定值来指定针对三角形禁用VM。在一些实施例中,VM级别字段1514还可以使用第二预定值来用于指定VM是相当于0级VM的直接被编码的VM状态。例如,在一些实施例中,VM级别字段1514是一个4位字段,任何值0-13都被解释为一个级别,而值15(即全1)被解释为针对三角形禁用VM,并且值14被解释为指示相当于0级VM的直被接编码的VM状态。

当VM被直接编码并在VM级别字段1514中如此指示时,VM类型字段1516和VM孔径字段(aperture field)1518(如下所述)的位可用于直接编码2位的可见性状态。直接编码的VM用于每个实例都不会改变的非调色板/材质VM。VM偏移量不用于直接编码的VM,因为没有间接的状态查找。

使用VM的级别,重心命中点可以转换为该级别的特定区域(例如,微三角形),其沿着空间填充曲线的索引也是VM内可见性状态的索引。每三角形的VM类型字段1516编码VM是1位VM还是2位VM。这不仅会影响VM内的位索引,还会影响访问VM时从VM获取的位数。

VM孔径字段1518对VM使用全局/绝对地址还是本地/实例相关地址进行编码。对于实例相关地址,VM偏移量被添加到每个实例的VM基址指针(如下所述)。这允许实现VM的材质或调色板样式。图16显示了一个示例存储器布局,其示出了如何使用VM基址指针和每三角形的VM孔径字段1518可以存储VM以供全局重用以及使用调色板样式。

实例节点1700被修改和扩展以支持VM处理,如图17所示。在实例节点1700中,字段1702和1704提供对VM的支持。

在一些实施例中,实例节点存储基址指针,其指示局部(即,每个实例)可见性掩模在上文关于图16描述的局部孔径中的开始位置,以及其是否存在。一些实施例可以支持多种类型的实例节点,一些支持VM而另一些不支持VM。在一些实施例中,例如,在实例节点的扩展报头中,‘double’字段指示实例节点是128B而不是默认的64B。如果实例节点是128B双实例节点,它可以包括VM基址指针1702,当VM三角形的孔径被设置为局部时(如上所述),该指针可选地添加到三角形块中的VM偏移量。

强制VM(force-VM,fvm)字段1706(被指定为实例节点1700中的ext字段1704的一部分,并且在下面也称为“VM模式字段”)在每个实例的基础上用于修改在此实例引用的BLAS中VM三角形的处理。如果非零,force-VM字段1706将底部光线(即遍历BVH的BLAS的光线)的VM光线标志强制为force-VM字段1706的值。与VM相关的光线标志的描述在下面提供。请注意,force-VM字段1706放置在下部64B中允许使用字段1706,而不管实例节点的类型是否允许定义VM基址指针字段1702。

指定VM的每实例的能力使得各个实例的不同VM能够在存储器中存储和访问。这使得能够通过改变其可见性状态将不同种类的材质或调色板样式应用到同一个三角形。换句话说,这种基于实例的能力可以为同一几何三角形交换不同的VM。这很有用,例如,当为不同的可见性状态重用几何体时。例如,考虑一棵树,该树具有为树叶存储的几何体,在一个实例中,使用第一VM将第一类型的叶子(例如,枫树)应用到该树叶。示例实施例可以使用第二可见性掩模将第二类型的叶子(例如,白杨)应用于不同实例中的相同树叶。

VM的遍历光线标志

例如,如图18所示的光线数据结构1800中的光线标志用于控制单个光线的遍历。这允许可编程行为,如标题为“树遍历的查询特定行为修改(Query-Specific BehavioralModification of Tree Traversal)”的美国专利No.10,867,429中所述,其内容通过引用整体并入。光线标志通常能够根据随光线传入的值和与确定通过或失败结果的子包围盒一起存储的值来执行操作,其中这些操作可以是逻辑的或数字的。这个想法是提供一些可编程的行为,这些行为不仅可以改变每条光线,而且可以改变每个包围盒,并且当存在标志1808-1810时,可以改变每个VM三角形。

光线操作或rayOp字段1806连同rayOp参数字段1808和1810以及一个或更多个光线标志提供可编程行为。两个与VM相关的光线标志(“VM光线标志”或“光线VM模式标志”),“vm_f”1802和“vm_p”1804,在示例实施例中已经被指定为改变如何处理VM三角形。光线遍历的行为可以根据光线-完成体测试(RCT)单元1310中完成的rayOp测试的结果进行编程。如果rayOp测试产生“通过”结果,则使用“vm_p”字段1804。如果rayOp测试产生“失败”结果,则使用“vm_f”字段1802。

在一些实施例中,每个标志1802-1804是2位的并且编码以下行为:0=默认:未知-不透明或未知-透明被视为阿尔法;1=force-2-state:未知-透明被视为透明,未知-不透明被视为不透明;2=忽略-vm;3=保留。默认值给出“默认”行为,其中2位VM编码3态行为(不透明、半透明、透明)。force-2-state值允许选择从不返回到SM进行AHS调用,即使对于3态的VM。

光线标志允许针对每条光线指定行为。上述实例节点fore-VM字段1706允许这些标志的每实例行为覆盖。例如,对于开发人员知道距离相机足够远的树几何体的某些实例,VM可以配置为仅使用2态行为,因为可能需要将控制权转移到SM的成本很高的3态行为,可能无法提供任何可感知的图像保真度改进来证明潜在的性能损失是合理的。

光线标志可以使例如阴影光线的遍历行为不同于主光线的遍历行为。例如,参考图7A-7B中所示的具有相关联阴影掩模和半透明掩模的半透明苔藓几何体,对于阴影光线,二态行为可能更高效,但对于主光线或反射光线,图像保真度可能需要完整的三态或四态行为。阴影光线可以停留在TTU上,而无需潜在昂贵的往返SM的更复杂遍历测试,因为二态行为通过将它们分类为阴影光线的完全不透明或完全透明来近似所有模糊的掩模区域。

注意,强制VM标志1706提供了用存储在实例节点中的指令覆盖光线模式标志(例如,上面提到的标志1804和1806)。实例可以强制VM解释为仅两个状态或四个状态,或完全忽略VM(通过在强制VM标志1706中设置适当的预设值),而不管光线标志1802-1804。这可以允许开发人员指定这样的事情,例如对于远处的半透明苔藓实例,不使用半透明信息。通过设置强制VM标志1706以将VM解释为两种状态而不是为该远处对象存储在存储器中的更详细的四种状态,开发人员可以改变光线遇到远处对象的遍历行为,同时在不重复的情况下重复使用已经在存储器中的更详细的VM,并且可能同时用作对象的更近实例的四-状态表示。

设置为忽略VM的强制VM标志1706可以用于可视化效果。例如,如果VM是近似的但在一定距离内(在开发人员看来)足够好,则开发人员可以提供超过预定距离(例如10英尺)的任何东西来使用VM,因为已经足够好。但是,如果需要从非常近的视图获得比VM提供的更好的树叶等细节,对于这种情况,可以忽略VM并且可以提供返回到SM以在相交点上执行阿尔法测试。

应当注意,rayOp也可以具有对它们的距离限定。距离限定允许这样的行为,例如远处的对象可以被隐藏并且近处的对象可以被看见,并且可以基于光线是动态的,而不是在构建时确定这是相机应该在的位置(例如,在构建时确定特定实例远离相机的假定位置)。

图21示出了根据一些实施例的用于应用fvm标志1706和光线标志1804-1806的示例过程2100。如果在操作2101确定fvm标志1706被设置为忽略VM(例如,值2),则在操作2108应用一个或更多个其他模式标志(可能剔除),随后应用cullAlpha和/或cullOpaque 2110,然后执行光线-图元相交测试2112。

如果在操作2101确定fvm标志1706没有被设置为忽略VM,则在操作2102确定VM级别。如果VM级别字段被设置为这样指示的预定值(例如,值=14),则在操作2104获取对应的直接编码的VM,并且在进行到操作2108之前应用VM模式标志(1804或1806)。如果VM级别字段1702具有有效级别值,则在操作2114执行RTT相交测试,随后在操作2116执行相应的VM查找并在操作2118应用VM模式标志1804或1806。在操作2118之后,at和ot模式标志(modeAlphaPass/Fail和modeOpaquePass/Fail)被应用,其可以包括在操作2120处的可能剔除和在操作2122处的cullAlpha。光线标志的应用,包括modeAlphaPass/Fail和modeOpaquePass/Fail标志,在标题为“树遍历的查询特定行为修改(Query-SpecificBehavioral Modification of Tree Traversal)”的美国专利第10,867,429号中有所描述。

具有VM的图元的高级遍历行为

通常,在BVH的遍历期间,VM三角形(即,为其定义了VM的图元/三角形)表现为标准三角形图元,直到检测到光线命中该三角形—即,光线在其t-范围内与三角形相交。对于不透明的三角形,如果该命中是目前为止最接近的,则该命中将被存储并且遍历将继续。对于阿尔法三角形,如果该命中到目前为止最接近光线原点,则该命中将返回给SM以调用AHS。对于VM三角形,该命中导致对VM进行索引查找以确定它应该是不透明的、透明的还是半透明的,然后如果不透明则提交/存储它,如果阿尔法/半透明/未知则返回它,或者如果透明,忽略/丢弃它。

在一些实施例中,VM查找作为第二通路(second pass)通过光线-三角形测试(RTT)单元1320来完成。RTT 1320处理三角形测试、实例变换以及还有VM查找。

第一通路(first pass)通过RTT确定光线是否命中三角形并记录与该三角形相关的VM信息。该信息通过触发VM块的提取的堆栈管理单元(SMU)1340。在一些实施例中,信息通过SMU 1340中的侧堆栈条目而不是通过主堆栈。

第一通路通过RTT 1320使用光线和三角形执行光线-三角形测试并且在三角形相交时获得重心命中点。IMU 1322确定命中是否应该被存储为最近的命中。来自第一通路的一些信息被存储,使得在第二通路中可以访问该信息并为IMU 1322中的该三角形重放。

来自第一通路的信息可以存储在TTU中的VM潜在命中RAM中,其示例结构和内容如图20所示。在第一通路期间,当确定相交的三角形是VM三角形时,在应用相交光线中包含的任何VM模式标志(其可能表示忽略VM或将其视为VM或强制其进入两个状态,且如果它不是直接被编码的VM)之后,来自第一通路命中的VM相关信息存储在潜在命中RAM中。

在一些实施例中,如果是最接近的命中则需要存储的所有信息都被存储。三角形ID、命中所在的距离t、重心命中点、三角形是否背面、是否被视为阿尔法、被命中的三角形块的地址等,是一些信息。此外,还可以存储一些可以在第二通路中使用以潜在地改变行为的模式标志。因此,命中的RAM(例如,在RTT 1320中)存储要在第二通路中使用的信息。

第一通路还计算重心命中点,然后经由量化和索引映射(参见图9B中所示的示例代码)将其转换为存储在VM内的可见性状态。

VM图元的实例变换通路

实例变换通路不是所有VM三角测试所必需的。但是,它确实允许在每个实例的基础上发生不同的行为。通过在实例节点1700内提供VM基址指针1702,不同的实例可以使用具有不同可见性掩模的相同三角存储器。通过提供非零强制-VM(fvm)字段1706,VM光线标志1802和1804可以在每个实例的基础上设置。

当用有效的非零fvm字段1706处理实例节点1700时,底部光线的VM光线标志(vm_p,vm_f)1802-1804都被设置为FVM字段1706的值并且存储在光线管理单元(RMU)1330。当实例节点具有有效的VM基址指针字段1702时,它被存储在相交管理单元(IMU)1322中。

VM图元的相交通路

此次通路通过RTT 1320和IMU 1322的目的是在存储器中选择三角形范围内最早的VM三角形作为候选潜在命中。执行可见性测试和处理可见性测试的结果所需的所有命中信息、VM元信息和查询字段在相交通路期间存储。

当击中VM三角形时,RTT 1320应用适当的VM光线标志——vm_p1804或vm_f 1806。如果该光线标志具有“忽略VM”的值,则忽略该三角形的VM内容。根据三角形块内指定的阿尔法字段,它的可见性是阿尔法或不透明的。参见图21,其示出了在一些实施例中关于如何将模式标志和VM级别值应用于VM三角形的流程图(例如,当VM级别值不是用于忽略VM的值时)。

如果应用的光线标志1804或1806不具有“忽略VM”的值,则重心命中坐标被转换成可见性掩模内的命中微三角形的索引。请参见图9B,用于确定重心坐标的示例代码。bary2index转换首先将重心离散化(参见图9A),然后从离散重心转换为索引。可以实现重心的离散量化的两个版本。第一个是quantizeBary,适用于保证重心不超过三角形的边界(即u+v<=1.0f)的光线-三角形相交实现。第二个是quantizeBaryClamp,适用于光线-三角形相交实现,其中重心可能超过三角形的边界(即u+v>1.0f),即使是像1ULP这样的小量。

RTT 1320使用该重心导出的索引和VM类型(例如,字段1516;1位或2位的编码)来计算用于查找的局部存储器偏移量。后来,在IMU 1322中,根据VM孔径,这个局部偏移量要么与VM基址指针结合以提供全局地址,要么如果它已经是全局地址则按原样使用。

RTT 1320向IMU 1322发送命中信息以及VM类型1516、VM孔径1518、光线标志(阿尔法、不透明和VM模式标志)和cullAlpha位。

注意,该特征正交于运动三角形。从两个关键点创建运动插值三角形的第一次运动通路照常进行,在第二通路通过相交管线时,此处的行为适用于VM。

在IMU 1322内,主相交状态RAM(PISR)保存在遍历期间遇到的当前最近命中的命中信息。但是,由于在执行光线-三角形相交测试时不知道VM三角形的可见性,因此被命中的VM三角形无法存储在PISR中,不会潜在覆盖已知可见性的命中。在一些实施例中添加了额外的RAM——VM潜在命中RAM(VM PHR)参见图20——以存储必要的VM元信息、VM三角形的标准命中信息和必要的光线标志。在随后的可见性测试之后,从VM PHR读取有关命中的信息并通过IMU 1322播放,就好像它是正常的不透明命中、阿尔法命中或未命中一样。

当VM三角形的命中信息到达IMU 1322时,IMU将该信息存储在VM PHR内并将VM查找地址发送到SMU 1340以存储在与主堆栈分开实现的额外堆栈条目中。如果三角形具有局部孔径,则在发送到SMU 1340之前将存储的VM基址指针添加到由RTT 1320提供的地址。

如果命中的VM三角形在存储器顺序上比当前存储的VM命中早,则新的VM命中信息覆盖现有的存储命中。如果命中的阿尔法三角形在存储器顺序上比当前存储的VM命中更早,则阿尔法三角形优先。在这种情况下,IMU 1322向SMU 1340发送一个信号,指示应该使额外的堆栈条目无效。

在三角形范围已被完全处理之后,IMU 1322向SMU 1340发送堆栈更新包。如果在VM PHR中有有效的VM命中,则该包被制作成所有字段为空或为零以指示不应更新现有堆栈条目,并且遍历不应终止。在从IMU 1322接收到更新包后,如果SMU 1340有带有有效VM信息的额外堆栈,它会向三角调度器发送激活以启动VM查找通路。

直接被编码VM的相交通路

直接被编码的VM被不同地对待。与非直接被编码的VM三角形一样,如果VM光线标志的值为“忽略VM”,则忽略三角形的VM内容,并使用三角形的阿尔法位。否则,直接从三角形块中获取可见性状态。

此时应用VM光线标志。如果VM光线标志的值为“强制二态”,RTT 1320将把所有未知-不透明和未知-透明可见性状态分别视为不透明和透明。已知可见性后,RTT会将此三角形视为具有阿尔法、不透明或透明可见性的非VM三角形。在这种情况下,没有VM信息被转发到IMU 1322,并且不需要第二通路。如果状态是透明的,IMU只会看到不透明命中、阿尔法命中或未命中。

VM可见性测试通路

在该通路通过RTT 1320和IMU 1322(上面提到的第二通路)期间,命中微三角形的可见性状态从存储器中读取并应用于存储在VM PHR中的三角形。VM三角形——现在具有已知的可见性——由IMU 1322再次处理以确定它是否应该存储为潜在的最近命中(不透明)、丢弃(透明),或者是否需要来自SM的AHS调用(阿尔法/未知/半透明)。

在从SMU 1340接收到激活后,三角形调度器(在IMU或SMU中)查询SMU 1340以读取其顶部堆栈条目。当SMU 1340有带有有效VM信息的额外堆栈时,该VM信息被视为有效的顶部堆栈条目。三角形调度器使用额外堆栈内的地址来制作对L0高速缓存1350的请求。当三角形调度器读取VM信息时,额外堆栈被标记为无效。

当存储器在高速缓存1350内准备就绪时,包含可见性块和微三角形索引的请求被转发到RTT 1320。与三角形测试不同,该请求不从RMU 1330内的RAM中读取。

RTT 1320查找可见性块内的可见性状态,并使用到IMU 1322的单独的侧接口1904(参见图19)将该信息转发到IMU 1322,以避免冲突并允许更低的延迟。参见图19中的“可见性掩模结果”线1904。

在从RTT 1320接收到可见性状态后,IMU 1322使用存储的查询信息将可见性状态适当地变换为正确的可见性。首先,应用VM光线标志(例如,标志1804-1806)。此时,VM光线标志是默认的(可见性状态(未知-不透明和未知-透明)都映射到阿尔法可见性)或强制二状态(可见性状态(未知-不透明和未知-透明)分别映射到不透明和透明)。

在应用VM光线标志之后,三角形的可见性是已知的。例如,它是阿尔法、不透明或透明的。如果是阿尔法或不透明,则应用适当的阿尔法三角形或不透明三角形光线标志(操作2108),这可以改变三角形的可见性。应用三角形光线标志后,如果生成的可见性为阿尔法并且堆栈条目指示要剔除阿尔法三角形,则三角形被剔除。

此时,在命中点处的三角形的可见性是已知的,并且三角形由IMU 1322处理,就好像它开始时具有该可见性一样。因此,IMU 1322可以将此命中存储在PISR中或将其丢弃为不是潜在的最接近命中。

如果它是未命中点或透明点,则三角形命中被忽略。如果它是不透明的命中点,则三角形可以被提交。如果它是阿尔法/半透明/未知命中点,则其被返回给SM。如果PISR中已存储不透明命中,则首先返回该不透明命中,并在重新启动查询时重新实体化阿尔法可见性(alpha-by-visibility)三角形。如果没有已存储的不透明命中,则可以立即返回阿尔法三角形。

如果在范围内有剩余的阿尔法或VM三角形,则到SMU的更新包被设置为将三角形范围堆栈条目的开始提前到当前三角形之后。此操作还可以在三角形范围堆栈条目中设置剔除不透明字段,因为根据定义,必须在完成任何可见性测试之前处理范围内的所有不透明三角形,因此不需要再次测试。这是为了防止在不透明三角形被击中时发生无限循环,并且必须在存储由可见性状态确定的阿尔法角形之前返回它。

如果在该范围内没有剩余的阿尔法或VM三角形,那么到SMU 1340的更新包被设置为弹出堆栈条目。

在从IMU 1322接收到堆栈更新包后,SMU 1340更新堆栈。

三角形范围堆栈条目具有两个基于可见性的剔除位。cullOpaque位表示三角形范围内的所有不透明三角形都将被立即剔除,而cullAlpha位表示对阿尔法三角形也是如此。上面描述了剔除不透明行为的原因:在处理具有不透明和阿尔法三角形二者的三角形范围时避免无限循环。剔除阿尔法行为的原因是堆栈条目创建的优化,其允许自动弹出保证在返回至SM时不会消耗堆栈条目的条目。该保证仅在只有不透明三角形时才成立。完成体中可能存在一个位来指示范围没有阿尔法三角形,并且cull-alpha位强制执行该行为。

当不使用VM时,如果cullOpaque位和cullAlpha位都被设置,那么该范围内的所有三角形都可以被剔除。TTU使用cullOpaque位和cullAlpha位的同时设置来指示三角形范围应该返回给SM。

对于VM三角形,可以同时设置两个剔除位而不打算将三角形范围返回到SM。如果要在两个剔除位都设置的情况下处理三角形范围,则会剔除所有不透明三角形和阿尔法三角形,但必须评估任何命中的VM三角形的可见性。如果在这种情况下命中VM三角形,则只有在生成的可见性为阿尔法时才会剔除它。

为了允许三角形范围具有两个设置的位并且仍然在TTU 238内被处理,被称为不返回机制的机制被实现如下所述。

为了保存堆栈上的位,隐式状态和显式状态都用于指示处理的每个三角形范围被指定为不返回或允许返回的三角形范围。允许返回的范围功能如下:如果两个剔除位均已设置,则三角形范围将作为三角形范围返回到SM。即使设置了两个剔除位,但不返回三角形范围也不会作为三角形范围返回到SM。

三角形范围堆栈条目2200可以以两种类型提供:“第一”和“后续”。参见图22。后续条目类型直接编码不返回位2202,其可在制作堆栈时由遍历逻辑(TL)单元1312设置。第一条目类型可以包括显式位。如果不使用显式位,则每当将要处理的三角形范围从SMU 1340发送到三角形调度器时设置隐式位。每当光线被激活以开始遍历并且堆栈顶部是被设置为返回的“第一”条目时,它也会被设置。因为“第一”条目总是在返回时立即返回,所以它们不会自然地出现作为刚刚发射的光线上的顶部堆栈条目。

示例GPU架构

现在将描述示例说明性架构,其中并入了本申请中公开的具有减少误报的有效光线遍历。以下信息仅供说明之用,不应被解释为以任何方式进行限制。在排除或不排除所描述的其他特征的情况下,可以任选地结合以下任何特征。

图24示出了根据实施例的并行处理单元(PPU)2400。在实施例中,PPU 2400是多线程处理器,其在一个或更多个集成电路设备上实现。PPU 2400是被设计为并行处理许多线程的延迟隐藏架构。线程(例如,执行线程)是一组被配置为由PPU 2400执行的指令的实例化。在实施例中,PPU 2400是图形处理单元(GPU),被配置为实现用于处理三维(3D)图形数据的图形渲染管线,以便生成二维(2D)图像数据,用于在如液晶显示器(LCD)设备的显示设备上显示。在其他实施例中,PPU 2400可被用于执行通用计算。在一些其他实施例中,PPU2400被配置为在深度学习应用或其他高性能计算应用中实现大型神经网络。

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

如图24所示,PPU 2400包括输入/输出(I/O)单元2405、前端单元2415、调度器单元2420、工作分配单元2425、集线器2430、交叉杆(Xbar)2470、一个或更多个通用处理集群(GPC)2450以及一个或更多个分区单元2480。PPU 2400可以通过一个或更多个高速NVLink2410互连与主机处理器或其他PPU 2400连接。PPU 2400可以通过互连2402连接到主机处理器或其他外围设备。PPU 2400也可以连接到由若干存储器设备2404组成的存储器。在实施例中,存储器2404可以包括一些动态随机存取存储器(DRAM)设备。DRAM设备可被配置为高带宽存储器(HBM)子系统,每个设备内堆叠有多个DRAM模具。

NVLink 2410互连使系统能够扩展并包括一个或更多个PPU 2400与一个或更多个CPU的组合,支持PPU 2400与CPU之间的高速缓存一致性,以及CPU主控。数据和/或命令可由NVLink 2410通过集线器2430传输到PPU 2400的其他单元(如一个或更多个复制引擎、视频编码器、视频解码器、电源管理单元等(未明确示出))/从PPU 2400的其他单元传输数据和/或命令。NVLink 1510将结合图27A和图27B进行更详细的描述。

I/O单元2405被配置为通过互连2402发送和接收来自主机处理器(未示出)的通信(例如,命令、数据等)。I/O单元2405可以通过互连2402直接与主机处理器通信或通过一个或更多个中间设备,如存储器桥。在实施例中,I/O单元2405可以通过互连2402与一个或更多个其他处理器,例如一个或更多个PPU 2400通信。在实施例中,I/O单元1005实现了用于通过PCIe总线进行通信的外围元件互连快递(PCIe)接口,并且互连2402是PCIe总线。在替代实施例中,I/O单元2405可以实现用于与外部设备通信的其他类型的知名接口。

I/O单元2405对通过互连2402接收的分组进行解码。在实施例中,该分组表示被配置为使PPU 2400执行各种操作的命令。I/O单元2405将解码后的命令传输到PPU 2400的各种其他单元,因为这些命令可能指定。例如,一些命令可以被传输到前端单元2415。其他命令可以被传输到集线器2430或PPU 2400的其他单元,例如一个或更多个复制引擎、视频编码器、视频解码器、电源管理单元等(未明确示出)。换句话说,I/O单元2405被配置为在PPU2400的各种逻辑单元之间路由通信。

在实施例中,由主机处理器执行的程序在缓冲区中编码指令流,该缓冲区向PPU2400提供工作负载以进行处理。工作负载可以包括几个指令和要由这些指令处理的数据。缓冲区是存储器中的区域,该区域可由主机处理器和PPU 2400二者访问(例如,读/写)。例如,I/O单元2405可以被配置为经由通过互连2402传输的存储器请求访问连接到互连2402的系统存储器中的缓冲区。在实施例中,主机处理器将命令流写入缓冲区,然后将命令流的起点的指针传输给PPU 2400。前端单元2415接收指向一个或更多个命令流的指针。前端单元2415管理一个或更多个流,从流中读取命令并将命令转发给PPU 2400的各个单元。

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

调度器单元2420被耦合到工作分配单元2425,该工作分配单元被配置为在GPC2450上分派任务以执行。工作分配单元2425可以追踪从调度器单元2420收到的多个预定任务。在实施例中,工作分配单元2425为每个GPC 2450管理待定任务池和活动任务池。待定任务池可以包括包含被分配到由特定GPC 2450处理的任务的多个槽(例如,32个槽)。活动任务池可包括多个槽(例如,4个槽),用于正在由GPC 2450积极处理的任务。随着GPC 2450完成任务的执行,该任务被从GPC 2450的活动任务池中驱逐,并且从待定任务池中选择其他任务之一并安排在GPC 2450上执行。如果活动任务在GPC 2450上一直处于空闲状态,例如在等待数据依赖被解决的时候,则活动任务可以从GPC 2450中被驱逐并返回到待定任务池中,同时待定任务池中的另一个任务被选择并安排在GPC 2450上执行。

工作分配单元2425通过XBar 2470与一个或更多个GPC 2450进行通信。XBar 2470是将PPU 2400的许多单元耦合到PPU 2400的其他单元的互连网络。例如,XBar 2470可以被配置为将工作分配单元2425耦合到特定的GPC 2450。尽管没有明确示出,PPU 2400的一个或更多个其他单元也可以通过集线器2430连接到XBar 2470。

任务由调度器单元2420管理并由工作分配单元2425分派给GPC 2450。GPC 2450被配置为处理该任务并产生结果。该结果可由GPC 2450内的其他任务消耗,通过XBar 2470路由到不同的GPC 2450,或存储在存储器2404中。结果可以通过分区单元2480写入存储器2404,分区单元实现了存储器接口,用于向/从存储器2404读写数据。结果可以通过NVLink2410传输到另一个PPU 2404或CPU。在实施例中,PPU 2400包括U个分区单元2480,该数量等于耦合到PPU 2400的独立和不同的存储器设备2404的数量。下面将结合图27B更详细地描述分区单元2480。

在实施例中,主机处理器执行驱动内核,该驱动内核实现应用编程接口(API),使在主机处理器上执行的一个或更多个应用程序能够调度在PPU 2400上执行的操作。在实施例中,多个计算应用程序由PPU 2400同时执行,PPU 2400为多个计算应用程序提供隔离、服务质量(QoS)和独立地址空间。应用程序可以生成指令(例如,API调用),导致驱动内核生成一个或更多个任务供PPU 2400执行。驱动器内核将任务输出到正在由PPU 2400处理的一个或更多个流。每个任务可以包括一个或更多个相关线程组,在此称为线程束。在实施例中,线程束包括可并行执行的32个相关线程。

图25A示出了根据一个实施例的图24的PPU 2400的GPC 2450。如图25A所示,每个GPC 2450包括用于处理任务的若干硬件单元。在实施例中,每个GPC 2450包括管线管理器2510,预光栅操作单元(PROP)2515,光栅引擎2525,工作分配交叉杆(WDX)2580,存储器管理单元(MMU)2590,和一个或更多个数据处理集群(DPC)2520。可以理解的是,图25A的GPC2450可以包括其他硬件单元以代替或补充图25A所示的单元。

在一个实施例中,GPC 2450的操作由管线管理器2510控制。管线管理器2510管理一个或更多个DPC 2520的配置以处理分配给GPC 2450的任务。在实施例中,管线管理器2510可以配置一个或更多个DPC 2520中的至少一个以实现图形渲染管线、神经网络和/或计算管线的至少一部分。例如,关于图形渲染管线,DPC 2520可以被配置为在可编程流多处理器(SM)2540上执行顶点着色器程序。管线管理器2510也可以被配置为将从工作分配单元2425收到的分组路由到GPC 2450内的适当逻辑单元。例如,一些分组可以被路由到PROP2515和/或光栅引擎2525中的固定功能硬件单元,而其他分组可以被路由到DPC 2520以便由图元引擎2535或SM 2540处理。

PROP单元2515被配置为将由光栅引擎2525和DPC 2520产生的数据路由到光栅操作(ROP)单元,如结合图25B更详细地描述的。PROP单元2515也可以被配置为执行用于颜色混合的优化,组织像素数据,执行地址转换等。

包括在GPC 2450中的每个DPC 2520包括M-管线控制器(MPC)2530、图元引擎2535和一个或更多个SM 2540。MPC 2530控制DPC 2520的操作,将从管线管理器2510收到的分组路由到DPC 2520的适当单元。例如,与顶点相关联的分组可以被路由到图元引擎2535,其被配置为从存储器2404中获取与顶点相关联的顶点属性。相反,与着色器程序相关联的分组可以被传输到SM 2540。

SM 2540包括可编程流处理器,其被配置为处理由若干线程表示的任务。每个SM2540是多线程的,并被配置为并发地执行来自特定线程组的多个线程(例如,32个线程)。在一个实施例中,SM 2540实现了SIMD(单指令、多数据)架构,其中一组线程(例如,线程束)中的每个线程被配置为基于相同的指令集处理不同的数据集。线程组中的所有线程执行相同的指令。在另一个实施例中,SM 2540实现了SIMT(单指令、多线程)架构,其中线程组中的每个线程被配置为基于同一组指令处理不同的数据集,但线程组中的单个线程在执行期间允许发散。在实施例中,为每个线程束保持程序计数器、调用堆栈和执行状态,当线程束内的线程发生发散时,实现线程束之间的并发和线程束内的串行执行。在另一个实施例中,为每个单独的线程维护程序计数器、调用堆栈和执行状态,使所有线程之间、线程束内和线程束之间的并发性相等。当为每个单独的线程维护执行状态时,执行相同指令的线程可以被收敛并并行执行以获得最大效率。下面将结合图26更详细地描述SM 2540。

MMU 2590在GPC 2450和分区单元2480之间提供接口。MMU 2590可提供将虚拟地址转换为物理地址、存储器保护和存储器请求的仲裁。在实施例中,MMU 2590提供一个或更多个转换旁观缓冲区(TLB),用于执行虚拟地址到存储器1504中的物理地址的转换。

图25B示出了根据实施例的图24的PPU 2400的存储器分区单元2480。如图25B所示,存储器分区单元2480包括光栅操作(ROP)单元2550、二级(L2)高速缓存2560和存储器接口2570。存储器接口2570与存储器2404耦合在一起。存储器接口2570可以实现32位、64位、128位、1024位数据总线,或类似的,用于高速数据传输。在一个实施例中,PPU 2400集成了U个存储器接口2570,每对分区单元2480有一个存储器接口2570,其中每对分区单元2480连接到相应的存储器设备2404。例如,PPU 2400可以连接到多达Y个存储器设备2404,例如高带宽存储器堆栈或图形双数据率、版本5、同步动态随机存取存储器,或其他类型的持久性存储。

在实施例中,存储器接口2570实现了HBM2存储器接口,并且Y等于U的一半。在实施例中,HBM2存储器堆栈位于与PPU 2500相同的物理封装上,与传统的GDDR5 SDRAM系统相比,提供大量的功率和区域节省。在实施例中,每个HBM2堆栈包括四个存储器裸片,Y等于4,HBM2堆栈包括每个裸片的两个128位通道,总共8个通道,数据总线宽度为1024位。

在实施例中,存储器2404支持单错纠错双错检测(SECDED)纠错码(ECC)以保护数据。ECC为对数据损坏敏感的计算应用提供更高的可靠性。可靠性在大规模集群计算环境中尤其重要,在这种环境中,PPU 2400处理非常大的数据集和/或长时间运行应用程序。

在实施例中,PPU 2400实现了多级存储器层次结构。在实施例中,存储器分区单元2480支持统一的存储器,以便为CPU和PPU 2400存储器提供单一的统一的虚拟地址空间,实现虚拟存储器系统之间的数据共享。在实施例中,追踪PPU 2400对位于其他处理器上的存储器的访问频率,以确保存储器页被移动到访问页更频繁的PPU 2400的物理存储器。在实施例中,NVLink 2410支持地址转换服务,允许PPU 2400直接访问CPU的页表并提供PPU2400对CPU存储器的完全访问。

在实施例中,复制引擎在多个PPU 1000之间或PPU 2400和CPU之间传输数据。复制引擎可以为未映射到页表的地址产生页故障。然后,存储器分区单元2480可以为页故障提供服务,将地址映射到页表中,之后复制引擎可以执行传输。在传统系统中,针对用于多个处理器之间的多个复制引擎操作,存储器被钉住(例如,不可翻页),这大大减少了可用存储器。通过硬件页故障,可以将地址传递给复制引擎,而不必担心存储器页是否驻留,并且复制过程是透明的。

来自存储器2404或其他系统存储器的数据可以由存储器分区单元2480取回并存储在L2高速缓存2560中,该高速缓存位于片上并在各个GPC 2450之间共享。如所示,每个存储器分区单元2480包括与相应的存储器设备2404相关联的L2高速缓存2560的一部分。然后,较低级别的缓存可以在GPC 2450内的各种单元中实现。例如,每个SM 2540可以实现一级(L1)高速缓存。L1高速缓存是专用于特定SM 2540的私有存储器。来自L2高速缓存2560的数据可以被取回并存储在每个L1高速缓存中,以便在SM 2540的功能单元中处理。L2高速缓存2560被耦合到存储器接口2570和XBar 2470。

ROP单元2550执行与像素颜色相关的图形光栅操作,例如颜色压缩、像素混合等。ROP单元2550还与光栅引擎2525一起实现深度测试,从光栅引擎2525的剔除引擎接收与像素片段相关联的样本位置的深度。该深度与深度缓冲区中与该片段相关联的采样位置的相应深度进行测试。如果该片段通过了针对样本位置的深度测试,则ROP单元2550更新深度缓冲区,并将深度测试的结果传输给光栅引擎2525。可以理解的是,分区单元2480的数量可以与GPC 2450的数量不同,因此,每个ROP单元2550可以耦合到每个GPC 2450。ROP单元2550追踪从不同的GPC 2450收到的分组,并确定由ROP单元2550产生的结果通过Xbar 2470被路由到哪个GPC 2450。尽管在图25B中ROP单元2550被包括在存储器分区单元2480内,在其他实施例中,ROP单元2550可以在存储器分区单元2480之外。例如,ROP单元2550可以驻留在GPC2450或其他单元中。

图26A说明了根据实施例的图25A的流式多处理器2540。如图26A所示,SM 2540包括指令高速缓存2605、一个或更多个调度器单元2610、寄存器文件2620、一个或更多个处理核心2650、一个或更多个特殊功能单元(SFU)2652、一个或更多个加载/存储单元(LSU)2654、互连网络2680、共享存储器/L1缓存2670。

如上所述,工作分配单元2425分派任务以在PPU 2400的GPC 2450上执行。任务被分配到GPC 2450内的特定DPC 2520,并且如果任务与着色器程序相关联,则任务可被分配到SM 2540。调度器单元2610从工作分配单元2425接收任务并管理指派给SM 2540的一个或更多个线程块的指令调度。调度器单元2610将线程块作为并行线程的线程束来调度执行,其中每个线程块由至少一个线程束组成。在实施例中,每个线程束包括32个线程。调度器单元2610可以管理多个不同的线程块,将不同的线程块分配到不同的线程束,然后在每个时钟周期内将指令从多个不同的合作组分派到各个功能单元(例如,核心2650、SFU 2652和LSU 2654)。

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

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

每个SM 2540包括多个处理核心2650。在一个实施例中,SM 2540包括大量(例如,128等)不同的处理核心2650。每个核心2650可以包括全管线、单精度、双精度和/或混合精度处理单元,其中包括浮点算术逻辑单元和整数算术逻辑单元。在实施例中,浮点算术逻辑单元实现了IEEE 754-2008的浮点算术标准。

张量核心被配置为执行矩阵运算,并且在实施例中,一个或更多个张量核心被包括在核心2650中。特别是,张量核心被配置为执行深度学习矩阵运算,例如用于神经网络训练和推理的卷积运算。在实施例中,每个张量核心对4x4矩阵进行操作,并执行矩阵乘法和累积操作D=AxB+C,其中A、B、C和D是4x4矩阵。

在实施例中,矩阵乘法输入A和B是16位浮点矩阵,而累积矩阵C和D可以是16位浮点或32位浮点矩阵。张量核心对带有32位浮点累积的16位浮点输入数据进行操作。16位浮点乘法需要64次操作,并产生全精度乘积,然后用32位浮点加法与其他中间乘积进行4x4x4矩阵乘法的累积。在实践中,张量核心被用来执行更大的二维或更高维度的矩阵操作,由这些较小的元素建立起来。API,如CUDA C++API,提供了专门的矩阵加载、矩阵乘法和累积以及矩阵存储操作,以便从CUDA-C++程序中高效地使用Tensor核心。在CUDA层面,线程束级接口假定16x16大小的矩阵横跨线程束的所有32个线程。

在一些实施例中,转置硬件包括在处理核心2650或另一功能单元(例如,SFU 2652或LSU 2654)中,并被配置为生成由对角线存储的矩阵数据和/或从由对角线存储的矩阵数据生成原始矩阵和/或转置矩阵。转置硬件可以在共享存储器2670内部提供给SM 2540的注册文件2620加载路径。

在一个示例中,由对角线存储的矩阵数据可以从DRAM取回并存储在共享存储器2670中。随着使用由对角线存储的矩阵数据执行处理的指令被处理,布置在共享存储器2670和寄存器文件2620的路径中的转置硬件可以提供原始矩阵、转置矩阵、压缩的原始矩阵和/或压缩的转置矩阵。直到指令前的最后一次存储,可以保持由对角线存储的单一矩阵数据,并且由指令指定的矩阵类型在寄存器文件2620中根据需要生成。

每个SM 2540还包括多个SFU 2652,其执行特殊功能(例如,属性评估、倒数平方根等)。在实施例中,SFU 2652可以包括被配置为遍历分层树数据结构的树形遍历单元(例如,TTU 2543)。在实施例中,SFU 2652可以包括纹理单元(例如,纹理单元2542),配置为执行纹理图过滤操作。在实施例中,纹理单元被配置为从存储器2404加载纹理图(例如,纹理的2D阵列),并对纹理图进行采样,以产生采样纹理值,用于由SM 2540执行的着色器程序。在实施例中,纹理图被存储在共享内存/L1高速缓存2570中。纹理单元实现纹理操作,如使用mip-map(例如,不同细节水平的纹理图)的过滤操作。在实施例中,每个SM 2540包括两个纹理单元。

每个SM 2540还包括多个LSU 2654,其在共享存储器/L1高速缓存2670和寄存器文件2620之间实现加载和存储操作。每个SM 2540包括互连网络2680,其将每个功能单元连接到寄存器文件2620,并且将LSU 2654连接到寄存器文件2620、共享存储器/L1高速缓存2670。在实施例中,互连网络2680是交叉杆,其可被配置为将任何功能单元连接到寄存器文件2620中的任何寄存器并将LSU 2654连接到寄存器文件2620和共享存储器/L1高速缓存2670中的存储器位置。

共享存储器/L1高速缓存2670是片上存储器的阵列,其允许SM 2540和图元引擎2535之间以及SM 2540中的线程之间的数据存储和通信。在实施例中,共享存储器/L1高速缓存2670包括128KB的存储容量,并处于从SM 2540到分区单元2480的路径中。共享存储器/L1高速缓存2670可用于缓存读和写。共享存储器/L1高速缓存2670、L2高速缓存2560和存储器2404中的一个或更多个是后备存储。

将数据高速缓存和共享存储器功能结合到单个存储器块中,为两种类型的存储器访问提供最佳的整体性能。该容量可被不使用共享存储器的程序作为缓存使用。例如,如果共享存储器被配置为使用一半的容量,纹理和加载/存储操作可以使用剩余的容量。在共享存储器/L1高速缓存2670内的集成使共享存储器/L1高速缓存2670能够作为流化数据的高吞吐量管线,同时提供对经常重用的数据的高带宽和低延迟的访问。

在本公开的上下文中,SM或“流式多处理器”是指如USP7,447,873对Nordquist所述的架构的处理器,包括其改进和进步,并且例如在许多代NVIDIA GPU中实现。例如,SM可以包括多个处理引擎或核心,其被配置为并发地执行布置在多个单指令多数据(SIMD)组(例如线程束)中的多个线程,其中SIMD组中相同的线程执行由不同输入对象上的指令序列组成的相同数据处理程序,而SIMD组中相同的线程使用不同的处理引擎或核心执行。SM通常还可以提供(a)具有多个通道的本地寄存器文件,其中每个处理引擎或核心被配置为访问通道的不同子集;以及指令发布逻辑,被配置为选择SIMD组之一并将同一数据处理程序的指令之一并行地发布给多个处理引擎中的每一个,其中每个处理引擎使用其可访问的本地寄存器文件通道的子集与其他处理引擎并行地执行同一指令。SM通常进一步包括核心接口逻辑,其被配置为启动一个或更多个SIMD组的执行。如图所示,这种SM被构造成提供快速的本地共享存储器,使数据共享/重用和在SM上执行的CTA的所有线程之间同步。

当配置为通用的并行计算时,与图形处理相比,可以使用更简单的配置。具体而言,图25A中所示的固定功能的图形处理单元被绕过,这创建了更简单的编程模型。在通用并行计算配置中,工作分配单元2425直接向DPC 2520指派和分发线程块。块中的线程执行相同的程序,在计算中使用唯一的线程ID以确保每个线程产生唯一的结果,使用SM 2540执行程序并进行计算,使用共享存储器/L1高速缓存2670在线程之间进行通信,使用LSU 2654通过共享存储器/L1高速缓存2670和存储器分区单元2480读写全局存储器。当配置为通用并行计算时,SM 2540也可以写入调度器单元2420可以用来启动DPC 2520上的新工作的命令。

PPU 2400可以包括在台式计算机、笔记本电脑、平板计算机、服务器、超级计算机、智能手机(例如,无线、手持设备)、个人数字助理(PDA)、数字相机、车辆、头戴式显示器、手持电子设备等中。在实施例中,PPU 2400体现在单个半导体衬底上。在另一个实施例中,PPU2400与一个或更多个其他装置,例如额外的PPU 2400、存储器2404、简化指令集计算机(RISC)CPU、存储器管理单元(MMU)、数模转换器(DAC)等一起被包括在系统芯片(SoC)中。

在一个实施例中,PPU 2400可以被包括在包括一个或更多个存储器装置2404的图形卡上。图形卡可以被配置为与台式计算机的主板上的PCIe插槽连接。在另一个实施例中,PPU 2400可以是包括在主板芯片组中的集成图形处理单元(iGPU)或并行处理器。

示例性计算系统

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

图27A是根据实施例的使用图24的PPU 2400实现的处理系统2700的概念图。该示例性系统2700可以被配置为实现本申请中公开的方法。处理系统2700包括CPU 2730、交换机2755和多个PPU 2400各自和各自的存储器2404。NVLink 2410在每个PPU 2400之间提供高速通信链接。尽管在图27A中说明了NVLink 2410和互连2402的特定数量的连接,但每个PPU 2400和CPU 2730的连接数量可能有所不同。交换机2755在互连2402和CPU 2730之间进行接口。PPU 2400、存储器2404和NVLinks 2410可以位于单个半导体平台上,以形成并行处理模块2725。在实施例中,交换机2755支持两个或更多个协议,以在各种不同的连接和/或链接之间进行接口。

在另一个实施例(未示出)中,NVLink 2410在每个PPU 1000和CPU 2730之间提供一个或更多个高速通信链路,并且交换机2755在互连2402和每个PPU 2400之间接口。PPU2400、存储器2404和互连2402可以位于单个半导体平台上,以形成并行处理模块2725。在另一个实施例中(未示出),互连2402在每个PPU 2400和CPU 2730之间提供一个或更多个通信链路,并且交换机2755在每个PPU 1000之间使用NVLink 2410进行接口,以在PPU 2400之间提供一个或更多个高速通信链路。在另一个实施例中(未显示),NVLink 2410通过交换机2755在PPU 2400和CPU 2730之间提供一个或更多个高速通信链路。在另一个实施例中(未显示),互连2402直接在每个PPU 2400之间提供一个或更多个通信链接。一个或更多个NVLink 2410高速通信链路可以实现为物理NVLink互连或使用与NVLink 2410相同协议的芯片上或裸片上互连。

在本描述的上下文中,单个半导体平台可以指在裸片或芯片上制造的唯一的基于半导体的单元集成电路。应该注意的是,术语单个半导体平台也可以指具有增加的连接性的多芯片模块,其模拟片上操作,并比利用传统的总线实现有实质性的改进。当然,各种电路或设备也可以根据用户的愿望,分别位于半导体平台或各种组合中。另外,并行处理模块2725可以作为电路板基板来实现,每个PPU 2400和/或存储器2404可以是封装的器件。在实施例中,CPU 2730、交换机2755和并行处理模块2725位于单个半导体平台上。

在实施例中,每个NVLink 2410的信令速率为20至25吉比特/秒,并且每个PPU2400包括六个NVLink 2410接口(如图27A所示,每个PPU2400包括五个NVLink 2410接口)。每个NVLink 2410在每个方向提供25千兆字节/秒的数据传输率,六个链路提供2400千兆字节/秒。如图27A所示,NVLinks 2410可以完全用于PPU-to-PU的通信,或者当CPU 2730也包括一个或更多个NVLink 2410接口时,用于PPU-to-PU和PPU-to-CPU的一些组合。

在实施例中,NVLink 2410允许从CPU 2730直接加载/存储/原子访问到每个PPU的2400存储器2404。在实施例中,NVLink 2410支持一致性操作,允许从存储器2404读取的数据存储在CPU 2730的高速缓存层次结构中,这减少了CPU 2730的高速缓存访问延时。在实施例中,NVLink2410包括对地址转换服务(ATS)的支持,允许PPU 2400直接访问CPU 2730内的页表。一个或更多个NVLinks 2410也可被配置为在低功耗模式下运行。

图27B示出了示例性系统2765,在该系统中可以实现前面各种实施例的各种架构和/或功能。示例性系统2765可以被配置为实现本申请中公开的方法。

如图所示,提供的系统2765包括连接到通信总线2775的至少一个中央处理单元2730。通信总线2775可以使用任何合适的协议实现,例如PCI(外围组件互联)、PCI-Express、AGP(加速图形端口)、超级传输(HyperTransport)或任何其他总线或点对点通信协议。该系统2765还包括主存储器2740。控制逻辑(软件)和数据存储在主存储器2740中,它可以采取随机存取存储器(RAM)的形式。

系统2765还包括输入设备2760、并行处理系统2725和显示设备2745,例如传统的CRT(阴极光线管)、LCD(液晶显示器)、LED(发光二极管)、等离子显示器或类似物。用户输入可以从输入设备2760接收,例如,键盘、鼠标、触摸板、麦克风等。上述每个模块和/或设备甚至可以位于单个半导体平台上以形成系统2765。另外,各种模块也可以根据用户的愿望分别位于半导体平台上或在各种组合中。

进一步地,系统2765可以通过网络接口2735耦合到网络(例如,电信网络、局域网(LAN)、无线网络、广域网(WAN)例如互联网、对等网络、有线网络或类似的网络)以用于通信目的。

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

计算机程序或计算机控制逻辑算法可以存储在主存储器2740和/或二级存储中。这样的计算机程序,当被执行时,使系统2765能够执行各种功能。存储器2740、存储和/或任何其他存储是计算机可读介质的可能例子。

前面各图的结构和/或功能可以在一般计算机系统、电路板系统、专用于娱乐的游戏机系统、特定应用系统和/或任何其他所需系统的上下文中实现。例如,系统2765可以采取台式计算机、笔记本电脑、平板电脑、服务器、超级计算机、智能手机(例如,无线、手持设备)、个人数字助理(PDA)、数码相机、车辆、头戴显示器、手持电子设备、移动电话设备、电视、工作站、游戏机、嵌入式系统和/或任何其他类型的逻辑的形式。

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

可以在PPU 2400内执行各种程序,以实现应用程序的各个处理阶段。例如,设备驱动器可以在PPU 2400上启动内核以在一个SM 2540(或多个SM 2540)上执行一个阶段的处理。设备驱动程序(或由PPU 2400执行的初始内核)也可以在PPU 2400上启动其他内核以执行处理的其他阶段。如果应用程序处理包括图形处理管线,则图形处理管线的一些阶段可以在固定单元硬件上实现,例如在PPU 2400内实施的光栅器或数据组装器上实现。可以理解的是,来自内核的结果在被SM 2540上的后续内核处理之前,可以由一个或更多个介入的固定功能硬件单元处理。

应用本文公开的一种或更多种技术生成的图像可以显示在监视器或其他显示设备上。在一些实施例中,显示设备可以直接耦合到生成或渲染图像的系统或处理器。在其他实施例中,显示设备可以例如经由网络间接地耦合到系统或处理器。此类网络的示例包括因特网、运动电信网络、WIFI网络以及任何其他有线和/或无线联网系统。当显示设备间接耦合时,由系统或处理器生成的图像可以通过网络流传输到显示设备。这种流传输允许例如在服务器上或在数据中心中执行渲染图像的例如视频游戏或其他应用程序,并且渲染的图像可以被传送到与服务器或数据中心物理上分离的一个或更多个用户设备(例如计算机、视频游戏控制台、智能手机、其他移动设备等)上并在其上显示。因此,本文公开的技术可以应用于增强流传输的图像并增强流传输图像的服务,例如NVIDIA GeForce Now(GFN)、Google Stadia等。

此外,应用本文公开的一种或更多种技术生成的图像可以用于训练、测试或证明用于识别现实世界中的对象和环境的深度神经网络(DNN)。这样的图像可以包括道路、工厂、建筑物、城市环境、农村环境、人类、动物以及任何其他物理对象或真实世界环境的场景。这样的图像可以用于训练、测试或认证在机器或机器人中使用的DNN,以操纵、处理或修改现实世界中的物理对象。此外,此类图像可用于训练、测试或认证在自主车辆中使用的DNN,以在现实世界中导航和移动车辆。另外,应用本文公开的一种或更多种技术生成的图像可以用于向这些机器、机器人和车辆的用户传达信息。

此外,应用本文公开的一种或更多种技术生成的图像可用于显示或传达关于虚拟环境的信息,例如元宇宙、全宇宙(Omniverse)或真实环境的数字孪生体。此外,应用本文公开的一种或更多种技术生成的图像可用于在各种设备上显示或传达信息,包括个人计算机(例如笔记本电脑)、物联网(IoT)设备、手持设备(例如智能手机)、车辆、机器人或任何包括显示器的设备。

此处引用的所有专利、专利申请和出版物均通过引用而并入,以达到所有目的,如同明确规定的那样。

如同明确提出一样,以上引用的所有专利和出版物均以引用方式并入。尽管已经结合当前被认为是最实际和优选的实施例描述了本发明,但是应当理解,本发明不限于所公开的实施例,相反,本发明旨在覆盖包括在所附权利要求书的精神和范围内的各种修改和等同布置。

相关技术
  • 一种基于动态场景的实时光线追踪加速结构的方法
  • 一种基于动态场景的实时光线追踪加速结构的方法
技术分类

06120116489072