CN114332320A - 用于在光线跟踪系统中进行递归处理的存储器分配 - Google Patents
用于在光线跟踪系统中进行递归处理的存储器分配 Download PDFInfo
- Publication number
- CN114332320A CN114332320A CN202111098799.9A CN202111098799A CN114332320A CN 114332320 A CN114332320 A CN 114332320A CN 202111098799 A CN202111098799 A CN 202111098799A CN 114332320 A CN114332320 A CN 114332320A
- Authority
- CN
- China
- Prior art keywords
- shader
- data
- instance
- parent
- registers
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T15/00—3D [Three Dimensional] image rendering
- G06T15/06—Ray-tracing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T15/00—3D [Three Dimensional] image rendering
- G06T15/005—General purpose rendering architectures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T1/00—General purpose image data processing
- G06T1/60—Memory management
Landscapes
- Engineering & Computer Science (AREA)
- Computer Graphics (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Image Generation (AREA)
Abstract
本发明涉及用于在光线跟踪系统中进行递归处理的存储器分配。描述了用于处理光线的光线跟踪系统和方法。针对光线执行父着色器。父着色器包括调用子着色器的着色器递归指令。暂停针对光线执行父着色器。在存储器堆中存储父着色器的中间数据,其中,中间数据包括状态数据和有效载荷数据。存储中间数据包括分配存储器堆中的寄存器的第一集合以用于存储有效载荷数据,以及分配存储器堆中的寄存器的第二集合以用于存储状态数据。当父着色器准备好恢复时,从存储器堆读取父着色器的中间数据,并且恢复针对光线执行父着色器。
Description
技术领域
本公开涉及分配存储器以在光线跟踪系统中进行递归处理。
背景技术
光线跟踪是一种计算渲染技术,其用于通过从渲染场景图像的视点在场景中跟踪光路(“光线”)来渲染场景的图像。光线可以被建模为源自该视点,并通过渲染空间的采样位置进入场景。被渲染图像的每个像素可对应于渲染空间的一个或多个采样位置。源自该视点的光线被称为“一次光线”。图1示出了在光线跟踪系统中如何处理光线。在步骤S102中,针对一个或多个一次光线执行光线生成着色器以便处理(多个)光线。“着色器”(可以被称为“着色器程序”)是一种软件模块,该软件模块包括可以在处理单元上执行的一个或多个计算机可读指令。由着色器执行的功能是灵活的,并且由编写着色器代码的程序员定义。当光线横越场景时,其可能与场景内的一个或多个物体相交。可以对光线和其相交的物体之间的相交建模以创建逼真的视觉效果。例如,针对一次光线执行的第一着色器(“光线生成着色器”)可以包括指令(“TraceRay”指令),所述指令在步骤S104中使得执行相交测试过程,从而找到光线与场景中的一个或多个物体的一个或多个交点。相交测试过程可以在硬件或软件中执行,但通常在硬件中(例如,使用固定功能电路)执行,因为通常认为处理效率比相交测试过程的功能的灵活性更重要。在步骤S106中,响应于找到光线与物体的交点,针对该交点执行着色器。在步骤S106中执行(或“运行”)的着色器可以是在Vulkan和DirectX光线跟踪规范中定义的最近命中着色器、错过着色器、相交着色器或任何命中着色器。程序员编写着色器程序以定义系统如何对相交做出反应。在步骤S106中执行的着色器可以包括TraceRay指令,该指令使得向场景中发射一个或多个额外光线(称为“二次光线”),例如,以表示光线从相交物体的反射或光线通过物体的折射(例如,如果物体是透明的或半透明的)。作为另一示例,着色器程序可以使得向场景中发射一个或多个光线,以用于确定物体是否处于交点处的阴影中。因此,所述方法可以从步骤S106返回到步骤S104,如在图1中表示为“TraceRay”的虚线所示。当(在步骤S104中)找到二次光线的相交时,则可以(在步骤S106中)执行另一个着色器。以此方式,当在步骤S106中执行的着色器中包括TraceRay指令时,所述方法在步骤S106与S104之间递归地进行。
光线由定义光线起点、光线方向、最大剔除距离(“Tmax”)和最小剔除距离(“Tmin”)的数据来描述。光线伴有用户定义的有效载荷,当光线与场景中的几何形状相互作用时,所述有效载荷是可修改的,并且对于TraceRay指令的调用者是可见的。此外,根据Vulkan和DirectX光线跟踪规范,在步骤S106中执行的着色器可以包括一个或多个“CallShader”指令,该指令使得另一个着色器被执行。因此,一个着色器可以调用另一着色器,使得该方法可以在不同着色器之间递归地进行,如图1中表示为“CallShader”的虚线所示。当一次光线的所有着色器都已完成时,提供一次光线的输出。此输出可以是渲染值(例如像素颜色),其将用于对应于一次光线的像素。以此方式,确定了表示场景的图像的像素的渲染值。
Vulkan和DirectX是用于3D图形处理的应用程序编程接口(API),其具有光线跟踪扩展,该光线跟踪扩展定义程序员如何能够使用光线跟踪系统来渲染3D场景的图像。这些API已经开创了着色器递归的概念以用于光线跟踪系统中。如上所述,当在着色器内实施的指令使得一个或多个其它着色器被调用时,发生着色器递归。被调用着色器(其可以被称为“子”着色器)被处理为与函数调用类似,其中控制将最终返回到调用着色器(其可以被称为“父”着色器)。有效载荷数据可以从父着色器被传递到子着色器,并且子着色器可以通过更新有效载荷数据来与父着色器反向通信。
当使用着色器递归时,维持父着色器的一些中间数据,因此当子着色器已完成其执行时,父着色器可以继续其执行。可以在光线跟踪系统中并行处理许多光线。此外,为了获得逼真的渲染结果,光线跟踪系统可以允许大的递归深度,例如高达31的最大递归深度。因此,父着色器的中间数据的寿命可能非常长,并且在任何给定时间,可能存在许多正维持中间数据的着色器。
发明内容
提供本发明内容是为了介绍在以下详细描述中进一步描述的一些概念。本发明内容不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于限制所要求保护的主题的范围。
提供了一种在光线跟踪系统中处理光线的方法,所述方法包括:
针对光线执行父着色器,其中,所述父着色器包括调用子着色器的着色器递归指令;
暂停针对所述光线执行所述父着色器;
将所述父着色器的中间数据存储在存储器堆中,其中,所述中间数据包括状态数据和有效载荷数据,其中,所述存储中间数据包括分配所述存储器堆中的寄存器的第一集合以用于存储有效载荷数据,以及分配所述存储器堆中的寄存器的第二集合以用于存储状态数据;以及
当所述父着色器准备好恢复时,从所述存储器堆读取所述父着色器的中间数据,并且恢复针对所述光线执行所述父着色器。
所述方法还可以包括在暂停所述父着色器的同时针对所述光线执行所述子着色器。
着色器递归指令可以指示子着色器的有效载荷数据。针对所述光线执行所述子着色器可以更新所指示的有效载荷数据的至少一些。所述方法还可以包括将对所述存储器堆的寄存器的子集的控制从父着色器传递至子着色器,其中,寄存器的子集可以存储所指示的有效载荷数据。所指示的有效载荷数据可以是父着色器已经从光线的祖父着色器接收的传入有效载荷对象,其中,针对所述光线执行所述子着色器可以直接更新传入有效载荷对象。针对光线执行子着色器可能不更新父着色器本地的有效载荷对象。所指示的有效载荷数据可以是父着色器已经针对光线生成的本地有效载荷对象,其中,针对光线执行子着色器可以更新本地有效载荷对象。
可以通过执行任务来针对多个光线执行着色器,其中,该任务可以包括与针对其执行所述着色器的多个光线对应的多个实例。存储器堆中的寄存器可以被分配用于存储按实例数据或按任务数据。按实例数据可以包括状态数据和有效载荷数据中的一者或两者,并且其中,按任务数据可以包括状态数据。
存储器堆中的各组连续按实例寄存器可以被分配用于存储任务的实例的按实例数据的子集,其中,特定组的连续按实例寄存器可以被分配用于存储任务的每个实例的按实例数据的相应特定子集。
按实例数据的每个子集可以包括相应特定类型的数据,使得第一类型的按实例数据可以针对任务的实例存储在存储器堆中的第一组连续按实例寄存器中,并且第二类型的按实例数据可以针对任务的实例存储在存储器堆中的第二组连续按实例寄存器中。
可以通过执行父任务来执行父着色器,并且可以通过执行子任务来执行子着色器,并且其中,各组连续按实例寄存器中的一组可以包括被分配用于存储父任务的每个实例的子有效载荷数据的按实例寄存器,并且其中,子任务可以通过访问各组连续按实例寄存器中的所述一组来访问子有效载荷数据。
可以存在四组连续按实例寄存器,其中:
各组连续按实例寄存器的第一组可以包括被分配用于存储任务的每个实例的光线起点和方向数据的按实例寄存器,
各组连续按实例寄存器的第二组可以包括被分配用于存储任务的每个实例的临时寄存器数据的按实例寄存器,
各组连续按实例寄存器的第三组可以包括被分配用于存储任务的每个实例的父有效载荷数据的按实例寄存器,以及
各组连续按实例寄存器的第四组可以包括被分配用于存储任务的每个实例的子有效载荷数据的按实例寄存器。
所述方法还可以包括:确定在循环操作中使用临时寄存器数据的第一子集;以及确定在循环操作中不使用临时寄存器的第二子集;其中,各组连续按实例寄存器的一组可以包括被分配用于存储任务的每个实例的临时寄存器数据的第一子集的按实例寄存器,并且其中,各组连续按实例寄存器的另一组可以包括被分配用于存储任务的每个实例的临时寄存器数据的第二子集的按实例寄存器。
提供了一种被配置成处理光线的光线跟踪系统,其中,所述光线跟踪系统包括:
处理逻辑;以及
存储器堆;
其中,所述处理逻辑被配置成:
针对光线执行父着色器,其中,所述父着色器包括调用子着色器的着色器递归指令;
暂停针对所述光线执行所述父着色器;
识别待存储在所述存储器堆中的所述父着色器的中间数据,其中,所述中间数据包括状态数据和有效载荷数据,
分配所述存储器堆中的寄存器的第一集合以用于存储有效载荷数据;
分配所述存储器堆中的寄存器的第二集合以用于存储状态数据;
使得根据所述寄存器的第一集合和所述寄存器的第二集合的分配在所述存储器堆中存储所述中间数据;以及
当所述父着色器准备好恢复时,从所述存储器堆读取所述父着色器的中间数据,并且恢复针对所述光线执行所述父着色器。
着色器递归指令可以指示子着色器的有效载荷数据,并且其中,处理逻辑还可以被配置成将对存储器堆的寄存器的子集的控制从父着色器传递到子着色器,其中,寄存器的子集可以存储所指示的有效载荷数据。
处理逻辑可以被配置成通过执行任务针对多个光线执行着色器,其中,任务可以包括与针对其执行着色器的多个光线对应的多个实例。
存储器堆中的寄存器可以被分配用于存储按实例数据或按任务数据。
可以提供一种在光线跟踪系统中处理任务的方法,其中,每个任务包括与相应的一个或多个光线对应的一个或多个实例,所述方法包括:
执行父任务,该父任务调用子任务并且向子任务指示有效载荷数据;
将父任务的中间数据存储在存储器堆中,其中,中间数据包括一条或多条状态数据和一条或多条有效载荷数据,其中,所述存储中间数据包括动态地分配存储器堆中的寄存器以用于存储状态数据或有效载荷数据;以及
当父着色器准备好恢复时,从存储器堆读取父任务的中间数据,并且恢复执行父任务。
可以提供一种被配置成执行本文所述的任一种方法的光线跟踪系统。
可以提供一种使用集成电路制造系统制造本文所述的光线跟踪系统的方法,所述方法包括:
使用布局处理系统处理所述光线跟踪系统的计算机可读描述,以便生成包含所述光线跟踪系统的集成电路的电路布局描述;以及
使用集成电路生成系统来根据电路布局描述制造光线跟踪系统。
本文所述的光线跟踪单元和光线跟踪系统可以包含在集成电路上的硬件中。可以提供一种在集成电路制造系统中制造如本文所述的光线跟踪单元或光线跟踪系统的方法。可以提供一种集成电路定义数据集,该集成电路定义数据集当在集成电路制造系统中处理时将系统配置成制造如本文所述的光线跟踪单元或光线跟踪系统。可以提供一种非暂态计算机可读存储介质,该非暂态计算机可读存储介质上存储有光线跟踪单元或光线跟踪系统的计算机可读描述,该计算机可读描述当在集成电路制造系统中处理时,使集成电路制造系统制造包含光线跟踪单元或光线跟踪系统的集成电路。
可以提供一种集成电路制造系统,所述集成电路制造系统包括:非暂态计算机可读存储介质,其上存储有如本文所述的光线跟踪单元或光线跟踪系统的计算机可读描述;布局处理系统,其被配置成处理所述计算机可读描述,以便生成包含光线跟踪单元或光线跟踪系统的集成电路的电路布局描述;以及集成电路生成系统,其被配置成根据所述电路布局描述制造光线跟踪单元或光线跟踪系统。
可以提供一种用于执行本文所述的任一种方法的计算机程序代码。可以提供一种非暂态计算机可读存储介质,其上存储有计算机可读指令,所述计算机可读指令当在计算机系统处执行时使所述计算机系统执行本文所述的任一种方法。
如对本领域的技术人员显而易见的,上述特征可以适当地组合,并且可以与本文所述的示例的任何方面组合。
附图说明
参考附图以举例的方式描述本发明。在附图中:
图1示出了在光线跟踪系统中递归地处理光线的方法;
图2示出了根据本文所述的示例的光线跟踪系统;
图3是根据本文所述的示例的在光线跟踪系统中递归地处理光线的方法的流程图;
图4示出了用于存储状态数据和有效载荷数据的存储器堆;
图5示出了三个着色器的序列以说明当光线跟踪过程行进通过三个着色器的序列时如何将中间数据存储在存储器堆中;
图6a示出了按实例数据的子集;
图6b示出了能够如何分配存储器堆中的连续组的按实例寄存器以用于存储任务的实例的按实例数据的子集;
图7示出了实施光线跟踪单元的计算机系统;以及
图8示出了用于生成包含如本文所述的光线跟踪系统的集成电路的集成电路制造系统。
附图示出了各种示例。技术人员将理解,附图中所示的元素边界(例如,框、框的组,或其他形状)表示边界的一个示例。在一些示例中,情况可能是一个元素可以被设计为多个元素,或者多个元素可以被设计为一个元素。在适当的情况下,贯穿各附图使用共同的附图标记来指示类似的特征。
具体实施方式
通过示例的方式给出以下描述,以使本领域的技术人员能够制造和使用本发明。本发明不限于本文中描述的实施例,并且对所公开的实施例的各种修改对于本领域的技术人员而言将是显而易见的。仅通过示例的方式描述实施例。
如上文背景技术部分所述,着色器递归可以用于光线跟踪系统中,使得父着色器调用子着色器。当父着色器执行着色器递归指令时,父着色器调用子着色器。术语“着色器递归指令”在本文中用于指调用另一着色器的着色器中的任何指令。着色器递归指令的示例是:(i)“TraceRay”指令,其使得光线被发射并且使得针对发射的光线执行相交测试,其中将基于针对发射的光线的相交测试的结果执行着色器;以及(ii)“CallShader”指令,其直接调用待执行的另一着色器(具有可调用着色器类型)而不执行任何光线遍历(即,相交测试)。在一些实施方式中,调用“任何命中”着色器的指令可以是着色器递归指令,例如,DirectX光线跟踪规范将这些指令称为“ReportHit”指令,Vulkan光线跟踪规范将这些指令称为“OpReportIntersctionKHR”指令。所有这些类型的着色器递归指令都导致调用子着色器。当着色器递归指令作为父着色器的一部分执行以由此调用子着色器时,维持父着色器的一些中间数据,使得当子着色器完成其执行时,可以恢复父着色器。
尽管可以将中间数据存储在片上资源中(即,在其上实现光线跟踪单元的芯片上),但与在非递归光线跟踪系统中通常实现的情况相比,这些片上资源的量必然急剧增加,或者预期光线跟踪系统的性能将受到影响。因此,至少一些中间数据(例如,大多数或全部中间数据)可以存储在片外存储器中。具体而言,具有有限处理资源的装置(例如,移动装置)往往没有足够的片上存储容量来将中间数据存储在片上,因此中间数据将倾向于存储在片外存储器中。
在本文所述的示例中,通过执行任务针对多个光线执行着色器,其中,任务包括与针对其执行着色器的多个光线对应的多个实例。可以在SIMD处理单元上执行任务,使得对于任务的每个实例并行执行着色器程序的指令。
可以在光线跟踪单元上将父任务保持在“解除调度等待状态”中,同时执行其所有子任务(对应于子着色器)和进一步的后裔任务,而不是将父任务(对应于父着色器)的所有中间数据写入存储器(例如,“动态随机存取存储器”-DRAM)。当任务保持在“解除调度等待状态”时,其中间数据可以存储在着色器容易访问的缓冲器、高速缓存或寄存器中,和/或着色器可以保持被配置成处理该任务。然而,预期用于处理一次光线的整个“光线处理”操作(包括执行递归着色器)需要相当长的一段时间(可能在10,000个处理周期的量级)。如果此整个过程在任务处于“解除调度等待状态”时完成,将难以并行运行足够的任务来实现目标光线遍历性能。除此之外,初始任务中的每个实例可以与希望启动不同着色器程序的不同图元相交。因此,并非在其子任务被执行时将父任务保持在解除调度等待状态,而是在着色器递归指令被执行时,将父任务的中间数据写入存储器(例如,DRAM存储器)并且暂停父任务(即,暂时在光线跟踪单元上结束其执行)。可以将中间数据存储在片上资源(即,在其上实现光线跟踪单元的芯片上的存储器)中。也就是说,在这些示例中,这种片上资源的量可能需要大于通常在非递归光线跟踪系统中实现的量,或者光线跟踪系统的性能预期将受到影响。因此,至少一些中间数据(例如,大多数或全部中间数据)可以存储在片外存储器中。具体而言,具有有限处理资源的装置(例如,移动装置)往往没有足够的片上存储容量来将中间数据存储在片上,因此中间数据将倾向于存储在片外存储器中。当其子任务已完成时,可以从存储器读回父任务的中间数据,并且可以恢复执行父任务。当父任务恢复时,光线跟踪单元重新调度父任务,以从其暂停的点继续其执行。
针对父任务存储的中间数据可以包括:(i)状态数据,(ii)有效载荷数据,和(iii)任务信息。
状态数据表示关于父任务在其执行暂停点处的状态的信息。例如,状态数据可以包括存储在临时寄存器(其可以是按实例临时寄存器或按任务临时寄存器)中的任何数据,在任务恢复时需要访问这些数据。举一些示例,这些临时寄存器可以存储交点索引和/或重心。作为另一示例,如果从相关联的交点投射多个光线以对某种形式的光散射建模,则当着色器暂停时,某种形式的材料性质可以被存储为与单个交点相关联的未来光线投射的状态数据,例如,因为可能的情况是一次仅投射一个光线。材料性质可以是例如折射率、不透明度、表面法线。
有效载荷数据是与正被处理的各个光线有关的按实例数据。具体而言,有效载荷数据包括用于光线的应用程序定义的有效载荷对象。例如,每个光线(即,每个实例)可以具有应用程序定义的光线有效载荷。子着色器能够修改(即,更新)由父着色器提供的有效载荷数据。有效载荷的大小取决于应用程序(通常为三个或四个双字(“dword”)的量级,例如,以存储像素颜色,所述像素颜色具有每通道32位值(例如,以浮点格式)的三个或四个通道,但是可能大于或小于此)。有效载荷数据的大小不是固定的。
任务信息旨在存储关于要重新调度哪个着色器程序、在哪个程序偏移处恢复程序的信息,并定义初始光线被打包到任务中的顺序。换句话说,父任务的任务信息指示要如何恢复执父任务的,例如指定要恢复父着色器程序的程序计数器,以及指定关于光线与任务的实例之间的映射的信息(例如,使用光线ID)。
当暂停执行父任务时,存储父任务的中间状态数据的简单方法是将三种类型的数据(状态数据、有效载荷数据和任务信息)存储在存储器的三个分开的分配中,其中每个存储器分配允许存储“最坏情况”量的相应类型的数据。
然而,根据本文所述的示例,通过将用于存储状态数据的存储器分配和用于存储有效载荷数据的存储器分配视为统一存储器堆或“池”中的寄存器组,更灵活地管理存储器分配。在本文所述的示例中,存储器的“堆”是已为特定目的保留的连续片外存储器的一部分,在此情况下,所述特定目的是存储状态数据和有效载荷数据。在堆的哪些寄存器用于存储状态数据与堆的哪些寄存器用于存储有效载荷数据之间不存在固定分割。换句话说,状态数据和有效载荷数据使用相同的地址空间。可以动态地分配存储器堆的寄存器以用于存储状态数据或有效载荷数据。换句话说,在有效载荷数据与状态数据之间共享存储器堆,使得可以将任何类型的数据(有效载荷或状态数据)分配给堆中的任何寄存器。
在配置递归光线跟踪系统时,尝试优化用于存储用于暂停任务的中间数据的存储器的量(即,存储器占用)。具有用于有效载荷数据和状态数据的统一空间意味着存储器占用优化的问题变成寄存器减少问题(或“寄存器分配”问题)。这意味着我们可以更好地利用可用存储器来存储着色器的中间数据,因为状态数据的数据量和有效载荷数据的数据量对于不同的着色器可以不同。具体而言,所保存的状态数据和光线有效载荷数据的量取决于针对经过着色器递归指令的父着色器需要维持什么。一些着色器可能具有待与相对少量的有效载荷数据一起维持的相对大量的状态数据,例如,当跟踪阴影光线时,有效载荷数据可以仅包括“命中”或“错过”的布尔指示。相比之下,一些其它着色器可能具有相对少量的状态数据和相对大量的有效载荷数据。通过具有用于存储状态数据和有效载荷数据两者的统一存储器堆,状态数据与有效载荷数据之间的区别在分配存储器方面是模糊的。状态数据与光线有效载荷数据之间的区别是数据所代表的内容及其使用方式,而不是其存储方式。例如,从给定子任务的角度来看,父任务的状态数据不能由子任务修改,而父任务的有效载荷数据可以由子任务(或孙任务,或某种其他后裔任务,例如曾孙任务)修改。
在一些示例中,父任务的中间数据的任务信息部分可以存储在与状态数据和有效载荷数据相同的存储器堆中。然而,在其它示例中,父任务的中间数据的任务信息部分可以存储在单独的存储器堆中。在本文所述的示例中,任务信息由固定功能硬件管理,并且预期其不会由软件,例如由着色器程序本身访问。例如,任务信息可以是用以保持跟踪给定光线的递归堆栈的最小量的信息。在一些示例中,与状态数据和有效载荷数据不同,任务信息数据不与dword边界对齐,因此可以更紧密地打包任务信息数据。
如上所述,Vulkan和DirectX光线跟踪规范定义不同类型的着色器,包括“光线生成”着色器、“最近命中”着色器、“错过”着色器、“相交”着色器和“任何命中”着色器。光线生成着色器是针对一次光线运行的,并且可以包括着色器递归指令,例如,调用一个或多个另外(子)着色器的TraceRay指令。最近命中着色器是针对整个光线遍历过程期间发现的最近意图(committed)命中(即,最近相交)运行的。当光线与三角形的几何形状相交时,就说发生了“命中”。然而,光线可能并不总是与三角形相互作用。例如,三角形可能具有透明部分。当确定光线与三角形相互作用,使得可能需要采取进一步动作时,就说命中是“意图的”。例如,当光线与不透明三角形相交时,或与部分透明三角形的部分或完全不透明部分相交时,就发生意图命中。因此,最近命中着色器将仅针对光线运行一次。当相交测试模块208找到光线与不透明三角形的交点时,这自动地提供“意图”命中;而当找到与非不透明图元的交点时,运行“任何命中”着色器以确定是否认定该命中。当针对光线的相交测试未发现意图命中时,运行错过着色器。当相交测试模块208找到与“程序图元”的交点时,运行相交着色器。程序图元可以具有复杂形状。程序图元可以表示为具有简单几何形状的包围体积,例如框(例如,AABB)或球体,其限定程序图元的形状,使得相交测试模块能够对包围体积的形状执行相交测试。将几何形状提交到光线跟踪系统的应用程序限定程序图元的包围体积(框或其它简单边界几何形状)。例如,AABB可以由应用程序利用三维中(例如,在包括程序图元的物体的实例空间中)的最小分量值和最大分量值限定。响应于相交测试模块找到与程序图元的包围体积的交点,运行相交着色器以确定光线是否与程序图元的形状相交。相交测试模块可以在固定功能硬件中实施,而着色器(例如,相交着色器)在软件中实施,因此程序员可以通过编写合适的相交着色器来定义如何找到与具有特定形状的程序图元的交点,而不必单纯地用相交测试模块被配置成处理的简单图元形状(例如,三角形)来定义程序图元的该特定形状。
光线生成着色器、最近命中着色器和错过着色器可以包括TraceRay指令。然而,“任何命中”着色器和相交着色器不能包括TraceRay指令或CallShader指令。
图2示出了包括光线跟踪单元204和存储器206的光线跟踪系统202。例如,存储器206可以是动态随机存取存储器(DRAM)。光线跟踪单元204包括相交测试模块208和处理逻辑210。相交测试模块208被配置成执行光线与几何形状的相交测试。几何形状可以与加速结构的节点相关联,并且可以表示场景内的区域(例如,诸如轴对齐包围盒(AABB)的包围体积),或者几何形状可以是表示待渲染的场景内的物体的表面的图元,例如三角形图元。相交测试模块208可以在硬件中,例如在固定功能电路中实施,使得它能够(例如,在延时和功耗方面)高效率地执行相交测试。处理逻辑210被配置成执行计算机代码,例如,着色器程序(或其它程序)的指令。因此,由处理逻辑210执行的功能由处理逻辑210执行的程序定义,而不是在处理逻辑210的硬件中定义。光线跟踪单元204可以包括图2中未示出的其它部件,例如,用于生成加速结构以表示场景内的物体的模块。存储器206包括存储器堆212,该存储器堆是已被保留以用于存储状态数据和有效载荷数据的连续存储器的一部分。光线跟踪单元204可以在集成电路上实施。光线跟踪单元204可以在芯片上实施,并且存储器206可以不物理地位于与光线跟踪单元相同的芯片上,并且可以被称为“外部存储器”或“芯片外存储器”。存储器也可以被称为“系统存储器”,并且其可以用于存储用于系统中的其它处理单元,例如中央处理单元(CPU)的数据。在光线跟踪单元204与存储器206之间传递的数据在光线跟踪系统202内的通信总线上行进。与在光线跟踪单元204中执行其它操作的速度相比,将数据写入到存储器206以及从存储器206读取数据是消耗相对大量功率的缓慢操作。因此,减少在光线跟踪单元204与存储器206之间传递的数据量(就减少光线跟踪系统202的延迟和功耗而言)可能是有益的。数据在存储器206与光线跟踪单元204之间传递的速率可以被称为“存储器带宽”。
图3示出了在光线跟踪系统202中处理一个或多个光线的方法的流程图。在参考图3描述的示例中,通过执行包括多个实例的任务来并行处理多个光线,其中每个实例对应于待针对其执行着色器(即,相同着色器)的光线。然而,应当指出,在其它示例中,不一定并行处理光线。
在步骤S302中,参数“n”被设置为零。参数n用于指示在递归链接的着色器序列内的当前活动的着色器的层级。例如,当n=0时,这意味着光线生成着色器是活动的,以用于处理一次光线。
在步骤S304中,在处理逻辑210上执行着色器n的指令。具体而言,在此第一迭代中,针对光线执行父着色器。在该示例中,父着色器包括调用子着色器的着色器递归指令。如上所述,着色器递归指令的两个示例是TraceRay指令和CallShader指令。
在步骤S306中,处理逻辑210确定着色器的执行是否已达到着色器递归指令。如果否,则方法进行到步骤S308,在此,处理逻辑210确定着色器的执行是否已达到着色器程序的结束,即,是否仍有更多着色器的指令要执行。如果不是(即,如果仍有更多着色器n的指令要执行),则方法进行回到步骤S304,并且继续执行着色器n的指令。
当着色器n到达着色器递归指令时,则方法从步骤S306进行到步骤S310。在步骤S310中,暂停(即暂时结束)针对光线执行父着色器(即,着色器n)。以此方式,响应于执行着色器递归指令而暂停执行父着色器。着色器递归指令指示子着色器的有效载荷数据。
在步骤S312中,将父着色器(即,着色器n)的中间数据存储在存储器堆中。具体而言,将父着色器的状态数据和有效载荷数据存储在存储器堆212中。父着色器的任务信息可以存储在存储器206内的单独堆(图2中未示出)中。在一些示例中,父着色器的一些有效载荷数据和/或一些状态数据可以存储在小的片上存储器中,而父着色器的其余有效载荷数据和状态数据存储在存储器堆212中。父着色器和子着色器都知道数据的格式以及可以在片上存储器中存储多少数据,使得父着色器和子着色器都知道向/从哪里存储/读取数据。存储器堆212用于保持状态并且可能使其部分(即,被分配以用于存储有效载荷数据的寄存器)由子着色器更新。着色器使用存储器堆212来保存信息(即,状态数据和有效载荷数据)以在步骤S306中达到的着色器递归指令之后使用。由于父着色器已被暂停(即,在处理逻辑210上结束),父着色器的当前状态(包括状态数据和有效载荷数据)被保留,因此当父着色器恢复时,可以恢复父着色器的该状态,使得可以恢复执行父着色器。
步骤S312涉及分配存储器堆212中的寄存器的第一集合以用于存储有效载荷数据,以及分配存储器堆212中的寄存器的第二集合以用于存储状态数据。换言之,步骤S312可以包括执行存储器堆212中的用于存储有效载荷数据的寄存器的第一集合的第一分配,以及执行存储器堆212中的用于存储状态数据的寄存器的第二集合的第二分配。所分配的寄存器的第一集合和所分配的寄存器的第二集合可以单独地可寻址。根据寄存器的第一集合和寄存器的第二集合的分配在存储器堆212中存储中间数据。可以在执行步骤S312时,动态地(即实时)执行存储器堆212中的用于存储状态数据或有效载荷数据的寄存器的分配。在此示例中,不存在存储器堆212的用于存储状态数据或有效载荷数据的寄存器的固定分配;相反,存储器堆212的寄存器表示存储器206的地址空间的统一连续部分,其可以用于存储暂停着色器(例如暂停任务)的状态数据和有效载荷数据。
图4示出了能够如何分配存储器堆212内的寄存器的示例。在此示例中,针对包括多个实例的任务存储着色器数据和有效载荷数据。堆212的一些寄存器402被分配用于存储按实例数据,并且堆212的一些其它寄存器404被分配用于存储按任务数据。“按实例数据”是与任务的特定实例相关并且能够由其使用的数据;而“按任务数据”是与任务的任何实例相关并且能够由其使用的数据。有效载荷数据是按实例数据,因为一条有效载荷数据是任务的特定实例特有的。实例的有效载荷数据的示例是与对应于实例的光线相关联的累积颜色值。状态数据可以是按实例数据或按任务数据,因为若干条状态数据是任务的特定实例特有的,而其它条状态数据与任务的所有实例相关。实例的按实例状态数据的示例是相交三角形内的当前重心坐标。按任务状态数据的示例是循环的固定长度中的迭代计数。存储器堆212中的寄存器的总数是固定的,但在堆212内,将寄存器分配为用于存储按实例数据(例如,寄存器402)或用于存储按任务数据(例如,寄存器404)是灵活的,并且可以被实时动态地确定。在图4所示的示例中,将按实例寄存器402分配为存储器堆212内的第一连续寄存器块,并且将按任务寄存器404分配为存储器堆212内的第二连续寄存器块。在一些其它示例中,在按实例寄存器与按任务寄存器之间可能存在固定的划分。
如上所述,着色器n的任务信息数据可以存储在存储器206内的单独的存储器堆中。
在步骤S312中存储了着色器n(即,父着色器)的中间数据之后,然后在步骤S314中,n递增,即n的值变为n+1。这意味着子着色器现在是活动的。该方法接着回到步骤S304,在此,执行子着色器的指令。以此方式,针对光线执行子着色器。
如上所述,着色器递归指令指示子着色器的有效载荷数据。换句话说,着色器递归指令可以包括指向有效载荷数据存储在存储器堆212中的位置的指针。以此方式,所指示的有效载荷数据可以存储在存储器堆212的寄存器的子集中,并且对寄存器的子集的控制从父着色器传递到子着色器。执行子着色器可以更新存储器堆212中的所指示的有效载荷数据。如果着色器递归指令是TraceRay指令,那么有效载荷数据是定义与子着色器处理光线相关的数据的光线有效载荷数据。如果着色器递归指令是CallShader指令,那么有效载荷数据可以是子着色器可以更新的任何类型的数据,但不一定与光线相关。
该方法从步骤S304针对子着色器以与上文针对父着色器所述的相同方式继续进行。如果子着色器包括着色器递归指令,则可以再次执行围绕步骤S310至S314的循环,使得为光线调用孙着色器。这种递归可以持续直到最大递归深度,在该处防止任何进一步的递归(图3中未示出)。API可以定义最大递归深度。例如,最大递归深度可以是31。
在某个点,该方法将针对子着色器执行步骤S308,例如当n=1时,并且将确定已到达子着色器的结束,使得从步骤S308采取“是”路线。从父着色器提供给子着色器的有效载荷可能已经通过执行子着色器或通过执行为子着色器的后裔的任何着色器而被修改。接着,该方法进行到步骤S316,在此确定是否n=0。换句话说,确定初始父着色器当前是否是活动的。
如果n不等于零,则方法从步骤S316进行到步骤S318,其中n的值递减,即n的值变为n-1。例如,这可能意味着n现在等于零,即,这可能意味着父着色器现在是活动的并且准备好恢复。
在步骤S320中,处理逻辑210读取着色器n(例如,如果n=0,则为父着色器)的中间数据。例如,从存储器堆212读取着色器n的状态数据和有效载荷数据,并且还可以从存储器206读取着色器n的任务信息。然后,该方法可以返回到步骤S304,以便执行着色器n的更多指令,即,在调用子着色器的着色器递归指令之后,执行父着色器的指令。以此方式,恢复针对光线执行父着色器。使用着色器n的任务信息,使得处理逻辑210能够确定待执行的父着色器程序的下一指令的程序计数器(其将对应于在调用子着色器的着色器递归指令之后的父着色器程序中的下一指令)。
然后,该方法可以如上文所述从步骤S304继续进行。当该方法到达步骤S316且n确实等于零时(即,初始父着色器活动时),则如步骤S322中所示,用于光线的处理完成。换句话说,或者初始(父)着色器不包括任何递归,并且已从步骤S306直接进行到步骤S308,然后进行到步骤S316和S322,或者父着色器确实包括递归,并且通过在到达步骤S316和S322之前尽需要多次通过步骤S304-S308进行来执行所有子着色器。此时,光线跟踪系统202可能已经确定渲染空间中的采样位置的渲染值,该渲染值可以是例如正被渲染的图像的像素的像素颜色值。光线跟踪系统可以处理更多的光线,直到确定正被渲染的图像的所有像素值为止。如上所述,可以并行地处理光线。
图5示出了三个着色器的序列以说明当光线跟踪过程行进通过三个着色器的序列时如何将中间数据存储在存储器堆中,所述三个着色器包括光线生成着色器502、最近命中着色器504(其是光线生成着色器502的子女)和错过着色器506(其是最近命中着色器504的子女)。光线生成着色器不具有传入有效载荷,即它们不从父(或“调用”)着色器接收有效载荷,因为光线生成着色器是针对一次光线执行的第一着色器,因此它们没有父母。因此,如图5的示例所示,光线生成着色器502不具有传入有效载荷。然而,它确实生成局部有效载荷,在图5中表示为有效载荷A。
当执行光线生成着色器502的TraceRay指令时,则暂停执行光线生成着色器502,并且如图5中所示,有效载荷A和定义光线生成着色器502的当前状态的状态数据被存储在存储器堆212中。光线生成着色器502的TraceRay指令调用最近命中着色器504,并且光线生成着色器502的本地有效载荷(有效载荷A)与TraceRay指令一起被提供给子着色器(即,最近命中着色器504)。因此,在此示例中,最近命中着色器504的传入有效载荷是有效载荷A。
最近命中着色器504可以生成其自身的本地有效载荷,在图5中表示为效载荷B。执行最近命中着色器504可以修改其传入有效载荷(即,有效载荷A)。当执行最近命中着色器504的TraceRay指令时,则暂停执行最近命中着色器504,并且如图5中所示,除了有效载荷A和定义光线生成着色器502的当前状态的状态数据之外,有效载荷B和定义最近命中着色器504的当前状态的状态数据存储在存储器堆212中。最近命中着色器504的TraceRay指令调用错过着色器506,并且将最近命中着色器504的传入有效载荷(有效载荷A)或最近命中着色器504的本地有效载荷(有效载荷B)与TraceRay指令一起提供给子着色器(即,错过着色器506)。因此,在此示例中,错过着色器506的传入有效载荷是有效载荷A或有效载荷B。
图5所示的示例中的错过着色器506不生成其自身的本地有效载荷,并且不包括着色器递归指令。执行错过着色器506可以修改其传入有效载荷,其可以是有效载荷A或有效载荷B。当错过着色器506完成时,最近命中着色器504可以恢复。当最近命中着色器504完成时,接着光线生成着色器502可以恢复。当光线生成着色器502完成时,接着可能已经确定渲染值。
应注意,仅最近命中着色器、错过着色器、任何命中着色器和可调用着色器具有传入有效载荷。最近命中着色器、错过着色器、任何命中着色器或可调用着色器将具有由使得着色器被调用的着色器递归指令(例如,TraceRay或CallShader指令)提供的此有效载荷对象(即,传入有效载荷)。还应注意,任何命中着色器不能执行着色器递归指令,但它们确实继承并且能够潜在地修改传入有效载荷。
本地光线有效载荷是本地变量,其可以存在于光线生成着色器、最近命中着色器、错过着色器或可调用着色器中。此外,包括CallShader指令的着色器可以具有本地有效载荷。这些着色器中可以有任何数目的这些变量(即,本地有效载荷),并且它们中的任一个都可以被传递到用于着色器递归指令的指令调用。
如参考图5中所示的最近命中着色器504所述,传入有效载荷(例如,有效载荷A)可以被直接传递到调用错过着色器506的最近命中着色器504的着色器递归指令。以此方式,错过着色器506具有对其传入有效载荷的读写访问,所述传入有效载荷是与光线生成着色器502相关联的本地光线有效载荷对象。从最近命中着色器504是错过着色器506(其是子着色器)的父着色器,使得光线生成着色器502是祖父着色器的角度来看,父着色器(例如,最近命中着色器504)可以向其子着色器(例如,错过着色器506)提供父着色器(例如,最近命中着色器504)已经从光线的祖父着色器(例如,光线生成着色器502)接收的传入有效载荷对象(例如,有效载荷A),并且针对光线执行子着色器(例如,错过着色器506)可以直接更新传入有效载荷对象(例如,有效载荷A)。在这种情况下,针对光线执行子着色器(例如,错过着色器506)不会更新父着色器(例如,最近命中着色器504)本地的有效载荷对象(例如,有效载荷B)。
在另一示例中,如参考图5中所示的最近命中着色器504所述,本地有效载荷(例如,有效载荷B)可以被传递到调用错过着色器506的最近命中着色器504的着色器递归指令。以此方式,错过着色器506具有对其传入有效载荷的读写访问,所述传入有效载荷是与最近命中着色器504相关联的本地光线有效载荷对象。再次,从最近命中着色器504是错过着色器506(其是子着色器)的父着色器,使得光线生成着色器502是祖父着色器的角度来看,父着色器(例如,最近命中着色器504)可以向其子着色器(例如,错过着色器506)提供父着色器(例如,最近命中着色器504)已经针对光线生成的本地有效载荷对象(例如,有效载荷B),并且针对光线执行子着色器(例如,错过着色器506)可以更新本地有效载荷对象(例如,有效载荷B)。
错过着色器506不知道其“传入光线有效载荷”是哪个着色器本地的。它可以是与其父母(例如,最近命中着色器504)相关联的本地光线有效载荷,或者可以是与其父母的父母相关联的本地光线有效载荷,或者其父母的父母的父母,等等。
允许子着色器直接更新其祖父着色器或曾祖父着色器(或任何祖先着色器)本地的有效载荷,在减少在光线跟踪单元204与存储器206之间传递的数据量方面,可以比仅允许子着色器更新其父着色器本地的有效载荷效率更高。如上所述,在光线跟踪单元204与存储器206之间传递数据是相对缓慢的过程,该过程与可以在光线跟踪单元204上执行的其它操作相比消耗相对大量的功率。此外,允许子着色器直接更新其祖父着色器或曾祖父着色器(或任何祖先着色器)本地的有效载荷可以大大减小存储器堆212的存储器占用。例如,存储器堆212可以分成主要区段和辅助区段,其中主要区段由主要着色器(例如,光线生成着色器)使用,并且其中辅助区段由辅助着色器(例如,最近命中、错过或可调用着色器)使用。在任何给定时间,与工作中(in flight)的主要着色器相比,可能有多得多的辅助着色器在工作中,因此,辅助区段中任何小的节省都可以在整个存储器堆212的大小(即,存储器占用)方面具有很大的节省。例如,如果所有着色器在其TraceRay调用中使用“传入有效载荷”(而不是本地有效载荷),则这意味着存储器堆212的辅助区段仅需要存储状态数据,而不需要存储有效载荷数据。
在一些示例中,例如,当存在多个光线等待跟踪时,一个任务的“状态数据”可能成为另一任务的“有效载荷数据”。例如,如果父任务调用多个子任务,则子任务中的一个的“状态数据”可以是子任务中的不同一个的“有效载荷数据”。以此方式,被视为第一子任务的状态数据可能被视为第二子任务的有效载荷数据,并且可以由第二子任务编辑。例如,如果着色器502调用多个TraceRay以调用多个辅助着色器,则每个都将具有其自身的本地有效载荷,并且每个辅助着色器都会将其它本地有效载荷视为状态数据。因此,使状态数据和有效载荷数据在同一存储器空间中(例如,在存储器堆212中)避免了在调用接受不同有效载荷的单独的着色器递归指令时,对四处移动数据的任何需要。
在一些示例中,可以分配按实例寄存器402,使得所有按实例数据都针对任务的第一实例存储在按实例寄存器402的第一连续群组中,并且然后所有按实例数据都针对任务的第二实例存储在按实例寄存器402的第二连续群组中,等等。然而,在下文参考图6a和图6b描述的其它示例中,可以对按实例寄存器402进行分组和交织,以用于存储来自任务的不同实例的按实例数据。例如,并不是存储一个实例的所有按实例数据并且然后存储下一实例的所有按实例数据等等,而是将按实例数据分成子集(或“组”),所述子集可以存储在存储器堆212中的按实例寄存器的不同组中。例如,任务内的不同实例的第一特定类型的按实例数据可以存储在连续存储器位置中,然后任务内的不同实例的第二特定类型的有效载荷数据可以存储在下一连续存储器位置中。例如,按实例数据可以分为四个子集:(i)起点和方向数据,(ii)临时寄存器数据,(iii)父有效载荷数据,和(iv)子有效载荷数据。
按实例寄存器402被分组成具有公共分组因子的组。分组因子指示在转到下一实例的按实例数据之前,使用多少寄存器来存储实例的按实例数据。以此方式,任务内的实例的按实例数据以交织方式存储在寄存器中。如上所述,按实例数据可以包括有效载荷数据和/或状态数据。
图6a示出了光线的按实例数据,所述按实例数据已被分组成四个子集以存储在编号为0到14的十五个按实例寄存器中。第一子集包括光线的起点和方向数据,并且六个按实例寄存器可以被分配用于存储此起点和方向数据,因此第一子集的分组因子(“GF”)为六。第二子集包括来自用于光线的临时寄存器的数据,并且在此示例中,两个按实例寄存器被分配用于存储此临时寄存器数据,因此,第二子集的分组因子(“GF”)是二。第三子集包括用于光线的父有效载荷数据(其可被称为“传入有效载荷”数据),并且在此示例中,三个按实例寄存器被分配用于存储此父有效载荷数据,因此第三子集的分组因子(“GF”)为三。第四子集包括用于光线的子有效载荷数据(其是提供给子着色器且可由该子着色器修改的有效载荷数据),并且在此示例中,存储器堆212中的四个按实例寄存器被分配用于存储此子有效载荷数据,因此第四子集的分组因子(“GF”)为四。
图6b示出了能够如何分配存储器堆212中的连续组的按实例寄存器以用于存储任务的实例的按实例数据的子集。编译器可以控制对按实例寄存器的分组和交织。特定组的连续按实例寄存器被分配用于存储任务的每个实例的按实例数据的相应特定子集,使得任务的不同实例的按实例数据的子集被交织。图6b示出了在用于存储按实例数据的连续存储器块402内从左到右增加的寄存器的存储器地址。在此示例中,任务包括十六个实例。应当注意,在其它示例中,任务可以包括不同数目的实例,并且通常可以包括超过十六个实例,例如,略举数例,任务可以包括32、64、128或256个实例。
依次为十六个实例中的每一个存储按实例数据的第一子集(在该示例中包括要存储在六个寄存器中的起点和方向数据)。如图6b中所示,第一组按实例寄存器602用于存储任务的每个实例的起点和方向数据。具体而言,在第一组按实例寄存器602中表示为“O.X”、“O.Y”、“O.Z”、“D.X”、“D.Y”和“D.Z”的前六个寄存器用于存储第一实例(实例“I0”)的起点和方向数据。第一组按实例寄存器602的存储器地址空间中的接下来六个寄存器用于存储第二实例(实例“I1”)的起点和方向数据。这些分配针对每个实例依次继续,直到任务中的所有实例都使其起点和方向数据被分配以存储在第一组按实例寄存器602中为止。还如图6b中所示,第二组按实例寄存器604用于存储任务的每个实例的临时寄存器数据。具体而言,在第二组按实例寄存器604中表示为“R0”和“R1”的前两个寄存器用于存储第一实例(实例“I0”)的临时寄存器数据。第二组按实例寄存器604的存储器地址空间中的接下来两个寄存器用于存储第二实例(实例“I1”)的临时寄存器数据。这些分配针对每个实例依次继续,直到任务中的所有实例都使其临时寄存器数据被分配以存储在第二组按实例寄存器604中为止。还如图6b中所示,第三组按实例寄存器606用于存储任务的每个实例的父有效载荷数据。具体而言,在第三组按实例寄存器606中表示为“P0”、“P1”和“P2”的前三个寄存器用于存储第一实例(实例“I0”)的父有效载荷数据。第三组按实例寄存器606的存储器地址空间中的接下来三个寄存器用于存储第二实例(实例“I1”)的父有效载荷数据。这些分配针对每个实例依次继续,直到任务中的所有实例都使其父有效载荷数据被分配以存储在第三组按实例寄存器606中为止。还如图6b中所示,第四组按实例寄存器608用于存储任务的每个实例的子有效载荷数据。具体而言,在第四组按实例寄存器608中表示为“C2”、“C3”、“C4”和“C5”的前四个寄存器用于存储第一实例(实例“I0”)的子有效载荷数据。在此示例中,实例的子有效载荷数据包括分别存储在六个寄存器中的6个dword数据(表示C0到C5),其中寄存器C0和C1是片上寄存器,并且寄存器C2到C5处于存储器堆212中,如图6b所示。第四组按实例寄存器608的存储器地址空间中的接下来四个寄存器用于存储第二实例(实例“I1”)的子有效载荷数据。这些分配针对每个实例依次继续,直到任务中的所有实例都使其子有效载荷数据被分配以存储在第四组按实例寄存器608中为止。
根据图6a和图6b中所示的按实例寄存器的分配,按实例数据的每个子集包括相应的特定类型的数据,使得第一类型的按实例数据针对任务的实例存储在存储器堆中的第一组连续按实例寄存器中,并且第二类型的按实例数据针对任务的实例存储在存储器堆中的第二组连续按实例寄存器中。
如上所述,第四组连续按实例寄存器608包括被分配用于存储父任务的每个实例的子有效载荷数据的按实例寄存器。子任务将通过访问第四组连续按实例寄存器608从按实例寄存器608访问子有效载荷数据。子任务可以在不必访问其它按实例数据的情况下,作为从存储器堆212的连续存储器块获取的数据来访问此数据。可能并非所有寄存器都需要由每个任务访问,因此,通过基于该数据的类型将任务的实例的按实例数据的子集分开,可以从任务的存储器堆的连续存储器位置提取相关数据,而无需提取任务不需要的很多(如有的话)其他数据。应当注意,通常存在可以从存储器提取的最小量的存储器(其可以被称为存储器“突发串”大小),并且此最小量的存储器可能大于单个实例的数据的子集中的一个中的数据量。
在其它示例中,可以其它方式形成各组按实例寄存器。例如,临时寄存器数据可以针对不同类型的临时寄存器数据分成不同子集。例如,编译器可以确定需要在循环内访问哪些临时寄存器,然后这些临时寄存器可以被视为单独的组。换句话说,可以确定在循环操作中使用临时寄存器数据的第一子集,并且可以确定在循环操作中不使用临时寄存器数据的第二子集。在这种情况下,各组连续按实例寄存器中的一组可以包括被分配用于存储任务的每个实例的临时寄存器数据的第一子集的按实例寄存器,各组连续按实例寄存器中的另一组可以包括被分配用于存储任务的每个实例的临时寄存器数据的第二子集的按实例寄存器。这将允许任务为循环的每次迭代上的任务需要的临时寄存器(而不是不需要的临时寄存器)获取数据。
图7示出了可以在其中实现本文所述的光线跟踪系统的计算机系统。计算机系统包括CPU 702、存储器206、光线跟踪单元204和其他装置704,诸如显示器706、扬声器708和相机710。存储器206包括存储器堆212。计算机系统的部件可通过通信总线712彼此通信。
图2的光线跟踪系统被示出为包括若干功能块。这仅是示意性的,并不旨在限定此类实体的不同逻辑元件之间的严格划分。每个功能块可以任何合适的方式提供。应理解,本文中描述为由光线跟踪系统形成的中间值不需要由光线跟踪系统在任何时间点物理地生成,并且可以只表示方便描述由光线跟踪系统在其输入与输出之间执行的处理的逻辑值。
本文所述的光线跟踪系统可以包含在集成电路上的硬件中。本文所述的光线跟踪系统可以被配置成执行本文所述的任一种方法。一般来讲,上文所述的功能、方法、技术或部件中的任一者可在软件、固件、硬件(例如,固定逻辑电路系统)或其任何组合中实施。本文可以使用术语“模块”、“功能”、“部件”、“元件”、“单元”、“块”和“逻辑”来概括地表示软件、固件、硬件或其任何组合。在软件实现方式的情况下,模块、功能、部件、元件、单元、块或逻辑表示程序代码,所述程序码在处理器上执行时执行指定任务。本文所述的算法和方法可以由执行码的一个或多个处理器执行,所述码使处理器执行算法/方法。计算机可读存储介质的示例包括随机存取存储器(RAM)、只读存储器(ROM)、光盘、闪存存储器、硬盘存储器以及可以使用磁性、光学和其它技术来存储指令或其它数据并且可以由机器存取的其它存储器装置。
如本文中所使用的术语计算机程序代码和计算机可读指令是指供处理器执行的任何种类的可执行代码,包含以机器语言、解释语言或脚本语言表达的代码。可执行代码包含二进制代码、机器代码、字节代码、定义集成电路的代码(例如硬件描述语言或网表),以及用例如C、Java或OpenCL等编程语言码表达的代码。可执行代码可以是例如任何种类的软件、固件、脚本、模块或库,当在虚拟机或其他软件环境中被适当地执行、处理、解释、编译、运行时,这些软件、固件、脚本、模块或库使支持可执行代码的计算机系统的处理器执行由该代码指定的任务。
处理器、计算机或计算机系统可以是任何种类的装置、机器或专用电路,或其集合或一部分,它具有处理能力使得可以执行指令。处理器可以是或包括任何种类的通用或专用处理器,诸如CPU、GPU、NNA、片上系统、状态机、媒体处理器、专用集成电路(ASIC)、可编程逻辑阵列、现场可编程门阵列(FPGA)等。计算机或计算机系统可以包括一个或多个处理器。
本发明还意图涵盖限定如本文中所描述的硬件的配置的软件,例如硬件描述语言(HDL)软件,用于设计集成电路或用于配置可编程芯片以执行所要功能。也就是说,可以提供一种计算机可读存储介质,其上编码有集成电路定义数据集形式的计算机可读程序代码,所述集成电路定义数据集当在集成电路制造系统中处理(即,运行)时,将所述系统配置成制造被配置成执行本文所描述的任一种方法的光线跟踪系统,或者制造包括本文所描述的任何设备的光线跟踪系统。集成电路定义数据集可以是例如集成电路描述。
因此,可提供一种在集成电路制造系统处制造如本文所描述的光线跟踪系统的方法。此外,可提供一种集成电路定义数据集,所述集成电路定义数据集当在集成电路制造系统中处理时使得执行制造光线跟踪系统的方法。
集成电路定义数据集可以是计算机代码的形式,例如作为网表,用于配置可编程芯片的代码,作为定义适合于在集成电路中以任何级别制造的硬件描述语言,包含作为寄存器传输级(RTL)代码,作为高级电路表示法(诸如Verilog或VHDL),以及作为低级电路表示法(诸如,OASIS(RTM)和GDSII)。在逻辑上定义适合于在集成电路中制造的硬件的更高级表示法(诸如RTL)可以在计算机系统上处理,该计算机系统被配置用于在软件环境的上下文中生成集成电路的制造定义,该软件环境包括电路元件的定义和用于组合这些元件以便生成由该表示法定义的集成电路的制造定义的规则。如通常软件在计算机系统处执行以便定义机器的情况一样,可能需要一个或多个中间用户步骤(例如,提供命令、变量等),以便将计算机系统配置为生成集成电路的制造定义,以执行定义集成电路以便生成所述集成电路的制造定义的代码。
现在将参考图8描述在集成电路制造系统处处理集成电路定义数据集以便将该系统配置为制造光线跟踪系统的示例。
图8示出了集成电路(IC)制造系统802的示例,其被配置为制造如本文的任一示例中所述的光线跟踪系统。特别地,IC制造系统802包括布局处理系统804和集成电路生成系统806。IC制造系统802被配置为接收IC定义数据集(例如,定义如本文的任一示例中所述的光线跟踪系统),处理IC定义数据集,并根据IC定义数据集来生成IC(例如,其包含如本文的任一示例中所述的光线跟踪系统)。IC定义数据集的处理将IC制造系统802配置为制造包含如本文的任一示例中所述的光线跟踪系统的集成电路。
布局处理系统804被配置为接收和处理IC定义数据集以确定电路布局。根据IC定义数据集确定电路布局的方法在本领域中是已知的,并且例如可以涉及合成RTL代码以确定要生成的电路的门级表示,例如就逻辑部件(例如NAND、NOR、AND、OR、MUX和FLIP-FLOP部件)而言。通过确定逻辑部件的位置信息,可以根据电路的门级表示来确定电路布局。这可以自动完成或者在用户参与下完成,以便优化电路布局。当布局处理系统804确定了电路布局时,它可以将电路布局定义输出到IC生成系统806。电路布局定义可以是例如电路布局描述。
IC生成系统806根据如本领域已知的电路布局定义生成IC。例如,IC生成系统806可以实现生成IC的半导体器件制造工艺,其可以包括光刻和化学处理步骤的多步骤序列,在此期间,在由半导体材料制成的晶片上逐渐形成电子电路。电路布局定义可呈掩模的形式,其可以在光刻工艺中用于根据电路定义来生成IC。替代性地,提供至IC生成系统806的电路布局定义可以是计算机可读代码的形式,IC生成系统806可以使用该代码形成用于生成IC的适当掩模。
由IC制造系统802执行的不同处理可以全部在一个位置实现,例如,由一方。替代性地,IC制造系统802可以是分布式系统,使得过程中的一些可以在不同位置执行,且可以由不同各方执行。例如,以下阶段中的一些可以在不同位置和/或由不同方来执行:(i)合成表示IC定义数据集的RTL代码,以形成要生成的电路的门级表示;(ii)基于门级表示来生成电路布局;(iii)根据电路布局来形成掩模;以及(iv)使用掩模来制造集成电路。
在其它示例中,在集成电路制造系统处对集成电路定义数据集的处理可以将系统配置为制造光线跟踪系统,而无需处理IC定义数据集以确定电路布局。例如,集成电路定义数据集可以定义例如FPGA的可重新配置的处理器的配置,并且对所述数据集进行的处理可以将IC制造系统配置成(例如,通过将配置数据加载到FPGA)生成具有所述定义的配置的可重新配置的处理器。
在一些实施例中,集成电路制造定义数据集当在集成电路制造系统中处理时,可以使集成电路制造系统生成如本文所述的装置。例如,由集成电路制造定义数据集以上文参考图8描述的方式对集成电路制造系统进行配置,可以制造出如本文所述的装置。
在一些示例中,集成电路定义数据集可以包括在数据集处定义的硬件上运行的软件,或者与在数据集处定义的硬件组合运行的软件。在图8所示的示例中,IC生成系统可以进一步由集成电路定义数据集配置成在制造集成电路时根据在集成电路定义数据集中定义的程序代码将固件加载到所述集成电路上,或者以其它方式向集成电路提供与集成电路一起使用的程序代码。
与已知的实现方式相比,在本申请中阐述的概念在装置、设备、模块和/或系统中(以及在本文中实现的方法中)的实现方式可以引起性能改进。性能改进可以包括计算性能提高、延迟减少、处理量增大和/或功耗降低中的一个或多个。在制造此类装置、设备、模块和系统(例如,在集成电路中)期间,可以在性能改进与物理实施方式之间进行折中,从而改进制造方法。例如,可以在性能改进与布局面积之间进行权衡,从而匹配已知实施方式的性能,但使用更少的硅。例如,这可以通过以串行方式重复使用功能块或在装置、设备、模块和/或系统的元件之间共享功能块来完成。相反,在本申请中阐述的引起装置、设备、模块和系统的物理实施方式的改进(诸如硅面积减小)的概念可以针对性能提高进行折中。例如,这可以通过在预定义面积预算内制造模块的多个实例来完成。
申请人据此独立地公开了本文中所描述的每个单独的特征以及两个或更多个此类特征的任意组合,到达的程度使得此类特征或组合能够根据本领域的技术人员的普通常识基于本说明书整体来实行,而不管此类特征或特征的组合是否解决本文中所公开的任何问题。鉴于前文描述,本领域的技术人员将清楚,可以在本发明的范围内进行各种修改。
Claims (20)
1.一种在光线跟踪系统中处理光线的方法,所述方法包括:
针对光线执行父着色器,其中,所述父着色器包括调用子着色器的着色器递归指令;
暂停针对所述光线执行所述父着色器;
将所述父着色器的中间数据存储在存储器堆中,其中,所述中间数据包括状态数据和有效载荷数据,其中,所述存储中间数据包括分配所述存储器堆中的寄存器的第一集合以用于存储有效载荷数据,以及分配所述存储器堆中的寄存器的第二集合以用于存储状态数据;以及
当所述父着色器准备好恢复时,从所述存储器堆读取所述父着色器的中间数据,并且恢复针对所述光线执行所述父着色器。
2.根据权利要求1所述的方法,还包括在暂停所述父着色器的同时针对所述光线执行所述子着色器。
3.根据权利要求1或2所述的方法,其中,所述着色器递归指令指示所述子着色器的有效载荷数据。
4.根据权利要求3所述的方法,还包括在暂停所述父着色器的同时针对所述光线执行所述子着色器,并且其中,针对所述光线执行所述子着色器更新至少一些所指示的有效载荷数据。
5.根据权利要求3所述的方法,还包括将对所述存储器堆的寄存器的子集的控制从所述父着色器传递至所述子着色器,其中,所述寄存器的子集存储所指示的有效载荷数据。
6.根据权利要求3所述的方法,还包括在暂停所述父着色器的同时针对所述光线执行所述子着色器,并且其中,所指示的有效载荷数据是所述父着色器已经从所述光线的祖父着色器接收的传入有效载荷对象,其中,针对所述光线执行所述子着色器直接更新所述传入有效载荷对象。
7.根据权利要求6所述的方法,其中,针对所述光线执行所述子着色器不更新所述父着色器本地的有效载荷对象。
8.根据权利要求3所述的方法,还包括在暂停所述父着色器的同时针对所述光线执行所述子着色器,并且其中,所指示的有效载荷数据是所述父着色器针对所述光线生成的本地有效载荷对象,其中,针对所述光线执行所述子着色器更新所述本地有效载荷对象。
9.根据权利要求1或2所述的方法,其中,通过执行任务针对多个光线执行着色器,其中,所述任务包括与针对其执行所述着色器的多个光线对应的多个实例。
10.根据权利要求9所述的方法,其中,所述存储器堆中的寄存器被分配用于存储按实例数据或按任务数据。
11.根据权利要求10所述的方法,其中,所述按实例数据包括状态数据和有效载荷数据中的一者或两者,并且其中,所述按任务数据包括状态数据。
12.根据权利要求10所述的方法,其中,所述存储器堆中的各组连续按实例寄存器被分配用于存储所述任务的实例的按实例数据的子集,其中,特定组的连续按实例寄存器被分配用于存储所述任务的每个实例的按实例数据的相应特定子集。
13.根据权利要求12所述的方法,其中,所述按实例数据的每个子集包括相应特定类型的数据,使得第一类型的按实例数据针对所述任务的实例存储在所述存储器堆中的第一组连续按实例寄存器中,并且第二类型的按实例数据针对所述任务的实例存储在所述存储器堆中的第二组连续按实例寄存器中。
14.根据权利要求12所述的方法,其中,通过执行父任务来执行所述父着色器,并且通过执行子任务来执行所述子着色器,并且其中,所述各组连续按实例寄存器中的一组包括被分配用于存储所述父任务的每个实例的子有效载荷数据的按实例寄存器,并且其中,所述子任务通过访问所述各组连续按实例寄存器中的所述一组来访问所述子有效载荷数据。
15.根据权利要求12所述的方法,其中,存在四组连续按实例寄存器,其中:
所述各组连续按实例寄存器的第一组包括被分配用于存储所述任务的每个实例的光线起点和方向数据的按实例寄存器,
所述各组连续按实例寄存器的第二组包括被分配用于存储所述任务的每个实例的临时寄存器数据的按实例寄存器,
所述各组连续按实例寄存器的第三组包括被分配用于存储所述任务的每个实例的父有效载荷数据的按实例寄存器,以及
所述各组连续按实例寄存器的第四组包括被分配用于存储所述任务的每个实例的子有效载荷数据的按实例寄存器。
16.根据权利要求12所述的方法,还包括:
确定在循环操作中使用临时寄存器数据的第一子集;以及
确定在循环操作中不使用临时寄存器数据的第二子集;
其中,所述各组连续按实例寄存器的一组包括被分配用于存储所述任务的每个实例的临时寄存器数据的第一子集的按实例寄存器,并且
其中,所述各组连续按实例寄存器的另一组包括被分配用于存储所述任务的每个实例的临时寄存器数据的第二子集的按实例寄存器。
17.一种被配置成处理光线的光线跟踪系统,其中,所述光线跟踪系统包括:
处理逻辑;以及
存储器堆;
其中,所述处理逻辑被配置成:
针对光线执行父着色器,其中,所述父着色器包括调用子着色器的着色器递归指令;
暂停针对所述光线执行所述父着色器;
识别待存储在所述存储器堆中的所述父着色器的中间数据,其中,所述中间数据包括状态数据和有效载荷数据,
分配所述存储器堆中的寄存器的第一集合以用于存储有效载荷数据;
分配所述存储器堆中的寄存器的第二集合以用于存储状态数据;
使得根据所述寄存器的第一集合和所述寄存器的第二集合的分配在所述存储器堆中存储所述中间数据;以及
当所述父着色器准备好恢复时,从所述存储器堆读取所述父着色器的中间数据,并且恢复针对所述光线执行所述父着色器。
18.根据权利要求17所述的光线跟踪系统,其中,所述着色器递归指令指示所述子着色器的有效载荷数据,并且其中,所述处理逻辑还被配置成将对所述存储器堆的寄存器的子集的控制从所述父着色器传递到所述子着色器,其中,所述寄存器的子集存储所指示的有效载荷数据。
19.根据权利要求17或18所述的光线跟踪系统,其中,所述处理逻辑被配置成通过执行任务来针对多个光线执行着色器,其中,所述任务包括与针对其执行所述着色器的多个光线对应的多个实例。
20.一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质上存储有计算机可读指令,所述计算机可读指令当在计算机系统上执行时,使所述计算机系统执行在光线跟踪系统中处理光线的方法,所述方法包括:
针对光线执行父着色器,其中,所述父着色器包括调用子着色器的着色器递归指令;
暂停针对所述光线执行所述父着色器;
将所述父着色器的中间数据存储在存储器堆中,其中,所述中间数据包括状态数据和有效载荷数据,其中,所述存储中间数据包括分配所述存储器堆中的寄存器的第一集合以用于存储有效载荷数据,以及分配所述存储器堆中的寄存器的第二集合以用于存储状态数据;以及
当所述父着色器准备好恢复时,从所述存储器堆读取所述父着色器的中间数据,并且恢复针对所述光线执行所述父着色器。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
GB2015137.9 | 2020-09-24 | ||
GB2015137.9A GB2599124A (en) | 2020-09-24 | 2020-09-24 | Memory allocation for recursive processing in a ray tracing system |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114332320A true CN114332320A (zh) | 2022-04-12 |
Family
ID=73139043
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111098799.9A Pending CN114332320A (zh) | 2020-09-24 | 2021-09-18 | 用于在光线跟踪系统中进行递归处理的存储器分配 |
Country Status (4)
Country | Link |
---|---|
US (1) | US20220114780A1 (zh) |
EP (1) | EP3975127A1 (zh) |
CN (1) | CN114332320A (zh) |
GB (1) | GB2599124A (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
GB2599188B (en) | 2021-03-23 | 2022-10-12 | Imagination Tech Ltd | Intersection testing in a ray tracing system |
GB2599183B (en) * | 2021-03-23 | 2022-10-12 | Imagination Tech Ltd | Intersection testing in a ray tracing system |
Family Cites Families (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7969434B2 (en) * | 2006-09-19 | 2011-06-28 | Caustic Graphics, Inc. | Method, apparatus, and computer readable medium for accelerating intersection testing in ray-tracing rendering |
US8174524B1 (en) * | 2007-05-23 | 2012-05-08 | Pixar | Ray hit coalescing in a computer rendering program |
US9104500B1 (en) * | 2011-09-29 | 2015-08-11 | Emc Corporation | Lock-free job scheduler for multi-processor systems |
US9087394B1 (en) * | 2014-02-13 | 2015-07-21 | Raycast Systems, Inc. | Computer hardware architecture and data structures for packet binning to support incoherent ray traversal |
US10262456B2 (en) * | 2015-12-19 | 2019-04-16 | Intel Corporation | Method and apparatus for extracting and using path shading coherence in a ray tracing architecture |
US10332303B2 (en) * | 2016-04-26 | 2019-06-25 | Imagination Technologies Limited | Dedicated ray memory for ray tracing in graphics systems |
US20170372448A1 (en) * | 2016-06-28 | 2017-12-28 | Ingo Wald | Reducing Memory Access Latencies During Ray Traversal |
GB2566514B (en) * | 2017-09-15 | 2020-01-08 | Imagination Tech Ltd | Resource allocation |
US10957095B2 (en) * | 2018-08-06 | 2021-03-23 | Intel Corporation | Programmable ray tracing with hardware acceleration on a graphics processor |
KR102151444B1 (ko) * | 2019-04-11 | 2020-09-03 | 주식회사 실리콘아츠 | Mimd 기반의 t&i 스케줄링을 이용한 레이 트레이싱 장치 |
US11670035B2 (en) * | 2020-03-15 | 2023-06-06 | Intel Corporation | Apparatus and method for performing non-local means filtering using motion estimation circuitry of a graphics processor |
US11508112B2 (en) * | 2020-06-18 | 2022-11-22 | Nvidia Corporation | Early release of resources in ray tracing hardware |
US11238640B2 (en) * | 2020-06-26 | 2022-02-01 | Advanced Micro Devices, Inc. | Early culling for ray tracing |
US11704859B2 (en) * | 2020-08-20 | 2023-07-18 | Sony Interactive Entertainment LLC | System and method for accelerated ray tracing |
-
2020
- 2020-09-24 GB GB2015137.9A patent/GB2599124A/en active Pending
-
2021
- 2021-09-18 CN CN202111098799.9A patent/CN114332320A/zh active Pending
- 2021-09-22 EP EP21198329.1A patent/EP3975127A1/en active Pending
- 2021-09-24 US US17/484,597 patent/US20220114780A1/en active Pending
Also Published As
Publication number | Publication date |
---|---|
GB2599124A9 (en) | 2022-09-14 |
GB202015137D0 (en) | 2020-11-11 |
EP3975127A1 (en) | 2022-03-30 |
GB2599124A (en) | 2022-03-30 |
US20220114780A1 (en) | 2022-04-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11625885B2 (en) | Graphics processor with non-blocking concurrent architecture | |
EP3726382A1 (en) | Deep learning thread communication | |
EP3975127A1 (en) | Memory allocation for recursive processing in a ray tracing system | |
US11934867B2 (en) | Techniques for divergent thread group execution scheduling | |
CN115588068A (zh) | 带有并行光线测试的光线相交电路 | |
CN114341805A (zh) | 纯函数语言神经网络加速器系统及结构 | |
US20230016927A1 (en) | Scheduling processing in a ray tracing system | |
US20230023323A1 (en) | Intersection testing in a ray tracing system | |
US20220301255A1 (en) | Intersection Testing in Ray Tracing Systems Using Hierarchical Acceleration Structures With Implicitly Represented Nodes | |
EP3975128A1 (en) | Memory allocation in a ray tracing system | |
US20230334750A1 (en) | Methods and hardware logic for loading ray tracing data into a shader processing unit of a graphics processing unit | |
US11810238B2 (en) | Hierarchical acceleration structures for use in ray tracing systems | |
EP3929877A1 (en) | Hierarchical acceleration structures for use in ray tracing systems | |
US20230144553A1 (en) | Software-directed register file sharing | |
CN116894757A (zh) | 用于将光线跟踪数据加载到图形处理单元的着色器处理单元中的方法和硬件逻辑 | |
CN116894758A (zh) | 用于从图形处理单元的着色器处理单元写入光线跟踪数据的方法和硬件逻辑 | |
CN116433462A (zh) | 构建用于光线跟踪的加速结构 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |