一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

用于利用重要性采样的随机拼贴照明的装置和方法与流程

2023-03-29 04:44:32 来源:中国专利 TAG:


1.本发明总体上涉及图形处理器的领域。更具体地,本发明涉及用于改进包括光线追踪和光栅化实现的图形处理的性能的装置和方法。


背景技术:

2.光线追踪是其中通过基于物理的渲染对光传输进行仿真的技术。在电影渲染中广泛使用,它被认为对于实时性能而言太过资源密集型,直到仅几年前。光线追踪中的关键操作之一是:处理被称为“光线遍历”的针对光线场景交叉的可见性查询,该可见性查询通过在包围体层级(bvh)中对节点进行遍历且使节点相交来计算光线-场景交叉。
3.光栅化是其中根据从三角形网状物创建的对象的3d模型创建屏幕对象的技术。每个三角形的顶点与不同形状和大小的其他三角形的顶点相交。每个顶点具有空间中的位置以及与颜色、纹理及其法线有关的信息,该信息用于确定对象的表面所面向的方向。光栅化单元将3d模型的三角形转换成2d屏幕空间中的像素,并且,可以基于顶点数据来给每个像素指派初始颜色值。
附图说明
4.可以结合以下附图从以下具体实施方式获得对本发明的更好理解,在附图中:图1是具有一个或多个处理器核的处理器和图形处理器的计算机系统的实施例的框图;图2a-d图示了本发明实施例所提供的计算系统和图形处理器;图3a-c图示了另外图形处理器和计算加速器架构的框图;图4是针对图形处理器的图形处理引擎的实施例的框图;图5a-b图示了包括处理元件阵列的线程执行逻辑;图6是包括处理元件阵列的线程执行逻辑的框图;图7图示了根据实施例的图形处理器执行单元指令格式;图8是包括图形流水线、媒体流水线、显示引擎、线程执行逻辑和渲染输出流水线的图形处理器的另一实施例的框图;图9a是图示了根据实施例的图形处理器命令格式的框图;图9b是图示了根据实施例的图形处理器命令序列的框图;图10图示了根据实施例的针对数据处理系统的示例性图形软件架构;图11a图示了根据实施例的可以用于制造集成电路以执行操作的示例性ip核开发系统;图11b-d图示了包括小芯片和中介层衬底的示例性封装布置;图12图示了根据实施例的可使用一个或多个ip核而制造的示例性片上系统集成电路;图13图示了可使用一个或多个ip核而制造的片上系统集成电路的示例性图形处
理器;图14图示了可使用一个或多个ip核而制造的片上系统集成电路的另外示例性图形处理器;图15图示了用于执行机器学习架构的初始训练的架构;图16图示了如何在运行时期间持续训练和更新机器学习引擎;图17图示了如何在运行时期间持续训练和更新机器学习引擎;图18a-b图示了如何在网络上共享机器学习数据;以及图19图示了用于训练机器学习引擎的方法;图20图示了节点如何交换鬼区数据以执行分布式去噪操作;图21图示了其中图像渲染和去噪操作跨多个节点而分布的架构;图22图示了用于分布式渲染和去噪的架构的另外细节;图23图示了用于执行分布式渲染和去噪的方法;图24图示了机器学习方法;图25图示了多个互连通用图形处理器;图26图示了针对机器学习实现的卷积层和全连接层的集合;图27图示了卷积层的示例;图28图示了机器学习实现中的互连节点的集合的示例;图29图示了在其内神经网络使用训练数据集进行学习的训练框架;图30a图示了模型并行结构和数据并行结构的示例;图30b图示了片上系统(soc);图31图示了包括光线追踪核和张量核的处理架构;图32图示了光束的示例;图33图示了用于执行光束追踪的装置;图34图示了光束层级的示例;图35图示了用于执行光束追踪的方法;图36图示了分布式光线追踪引擎的示例;图37-38图示了在光线追踪系统中执行的压缩;图39图示了在光线追踪架构上实现的方法;图40图示了示例性混合光线追踪装置;图41图示了用于光线追踪操作的栈;图42图示了针对混合光线追踪装置的另外细节;图43图示了包围体层级;图44图示了调用栈和遍历状态存储器;图45图示了用于遍历和交叉的方法;图46a-b图示了如何要求多个分派周期执行某些着色器;图47图示了单个分派周期如何执行多个着色器;图48图示了单个分派周期如何执行多个着色器;图49图示了用于执行光线追踪指令的架构;图50图示了用于在线程内执行光线追踪指令的方法;
图51图示了用于异步光线追踪的架构的一个实施例;图52a图示了光线遍历电路的一个实施例;图52b图示了在一个实施例中被执行以管理光线存储库的过程;图53图示了优先级选择电路系统/逻辑的一个实施例;图54和55a-b图示了在本发明一个实施例中使用的包括标记、异常和剔除数据的不同类型的光线追踪数据;图56图示了用于确定光线追踪流水线的早出(early out)的一个实施例;图57图示了优先级选择电路系统/逻辑的一个实施例;图58图示了用于光线遍历操作的示例包围体层级(bvh);图59a-b图示了另外遍历操作;图60图示了用于管理bvh栈的栈管理电路系统的一个实施例;图61a-b图示了针对光线、命中和栈而执行的示例数据结构、子结构和操作;图62图示了具有n位比较操作掩码的细节选择器的级别的实施例;图63图示了根据本发明一个实施例的加速数据结构;图64图示了包括残差值和元数据的压缩块的一个实施例;图65图示了根据本发明一个实施例的方法;图66图示了块偏移索引压缩块的一个实施例;图67a图示了根据本发明一个实施例的分层位向量编索引(hbi);图67b图示了根据本发明一个实施例的索引压缩块;以及图68图示了包括bvh压缩电路系统/逻辑和解压缩电路系统/逻辑的示例架构;图69a图示了被应用于网状物的位移函数;图69b图示了用于压缩网状物或小网状物的压缩电路系统的一个实施例;图70a图示了基础细分表面上的位移映射;图70b-c图示了相对于粗基础网状物的差向量;图71图示了根据本发明一个实施例的方法;图72-74图示了包括多个互连顶点的网状物;图75图示了用于生成网状物的曲面细分器的一个实施例;图76-77图示了其中基于网状物形成包围体的一个实施例;图78图示了共享重叠顶点的网状物的一个实施例;图79图示了在三角形之间具有共享边的网状物;图80图示了根据一个实施例的光线追踪引擎;图81图示了根据一个实施例的bvh压缩器;图82a-c图示了针对64位寄存器的示例数据格式;图83a-b图示了针对环形缓冲区的索引的一个实施例;图84a-b图示了针对生产者和消费者的示例环形缓冲区原子;图85a图示了拼贴(tiled)资源的一个实施例;图85b图示了根据本发明一个实施例的方法;图86a图示了包括按需构建器的bvh处理逻辑的一个实施例;图86b图示了针对加速结构的按需构建器的一个实施例;
图86c图示了可见底级加速结构图的一个实施例;图86d图示了不同类型的实例和遍历决策;图87图示了基于材料的剔除掩码的一个实施例;图88图示了其中在几何网状物上形成四叉树的一个实施例;图89a图示了光线追踪架构的一个实施例;图89b图示了包括小网状物压缩的一个实施例;图90图示了包括同步线程、发散派生(spawn)线程、规则派生线程和收敛派生线程的多个线程;图91图示了具有无绑定线程分派器的光线追踪架构的一个实施例;图92图示了根据一个实施例的光线追踪集群;图93-100图示了在多节点光线追踪实现中使用代理数据的实施例;图101图示了根据本发明一个实施例的方法;图102图示了0
……
1范围内的随机样本的示例曲线图;图103图示了用于实现本发明实施例的照明引擎的一个实施例;图104图示了用于重要性采样的方法的一个实施例;图105图示了与重要性采样的一个特定实施例相关联的细节;以及图106图示了根据本发明一个实施例的方法。
具体实施方式
5.在以下描述中,出于解释的目的,阐述了许多特定细节,以便提供以下描述的本发明实施例的透彻理解。然而,对本领域技术人员来说将明显的是,可以在没有这些特定细节中的一些的情况下实践本发明实施例。在其他实例中,以框图形式示出了公知结构和设备,以避免使本发明实施例的基础原理模糊。
6.示例性图形处理器架构和数据类型系统概述图1是根据实施例的处理系统100的框图。系统100可用于单处理器台式计算机系统、多处理器工作站系统或具有大量处理器102或处理器核107的服务器系统中。在一个实施例中,系统100是并入在供移动、手持式或嵌入式设备中(诸如在带有到局域或广域网的有线或无线连接性的物联网(iot)设备内)使用的片上系统(soc)集成电路内的处理平台。
7.在一个实施例中,系统100可包括以下各项、与以下各项耦合或者被集成在以下各项内:基于服务器的游戏平台;游戏控制台,包括游戏和媒体控制台;移动游戏控制台、手持式游戏控制台或在线游戏控制台。在一些实施例中,系统100是以下各项的一部分:移动电话、智能电话、平板计算设备或诸如带有低内部存储容量的膝上型计算机之类的移动因特网连接的设备。处理系统100还可包括以下各项、与以下各项耦合或者被集成在以下各项内:可穿戴设备,诸如智能手表可穿戴设备;智能眼镜(smart eyewear)或服装,其用增强现实(ar)或虚拟现实(vr)特征而增强以提供视觉、音频或触觉输出,以补充现实世界视觉、音频或触觉体验或者以其他方式提供文本、音频、图形、视频、全息图像或视频、或者触觉反馈;其他增强现实(ar)设备;或者其他虚拟现实(vr)设备。在一些实施例中,处理系统100包括电视或机顶盒设备,或者是电视或机顶盒设备的一部分。在一个实施例中,系统100可包
括以下各项、与以下各项耦合或者被集成在以下各项内:自动驾驶交通工具,诸如公共汽车、牵引车拖车、汽车、摩托车或电动自行车、飞机或滑翔机(或其任何组合)。自动驾驶交通工具可使用系统100来处理在交通工具周围感测到的环境。
8.在一些实施例中,一个或多个处理器102均包括一个或多个处理器核107以处理指令,所述指令在被执行时,执行用于系统或用户软件的操作。在一些实施例中,一个或多个处理器核107中的至少一个处理器核被配置成处理特定指令集109。在一些实施例中,指令集109可促进复杂指令集计算(cisc)、精简指令集计算(risc)或经由超长指令字(vliw)的计算。一个或多个处理器核107可处理不同指令集109,所述指令集109可包括用于促进对其他指令集的仿真的指令。处理器核107还可包括其他处理设备,诸如数字信号处理器(dsp)。
9.在一些实施例中,处理器102包括高速缓冲存储器104。取决于架构,处理器102可具有单个内部高速缓存或多个级别的内部高速缓存。在一些实施例中,在处理器102的各种组件之间共享高速缓冲存储器。在一些实施例中,处理器102还使用外部高速缓存(例如,3级(l3)高速缓存或末级高速缓存(llc))(未示出),其可在使用已知高速缓存一致性技术的处理器核107之间被共享。寄存器堆106可另外被包括在处理器102中,并且可包括用于存储不同类型的数据的不同类型的寄存器(例如,整数寄存器、浮点寄存器、状态寄存器和指令指针寄存器)。一些寄存器可以是通用寄存器,而其他寄存器可特定于处理器102的设计。
10.在一些实施例中,一个或多个处理器102与一个或多个接口总线110耦合,以在处理器102与系统100中的其他组件之间传送通信信号,诸如地址、数据或控制信号。在一个实施例中,接口总线110可以是处理器总线,诸如某一版本的直接媒体接口(dmi)总线。然而,处理器总线不限于dmi总线,并且可包括一个或多个外设组件互连总线(peripheral component interconnect bus)(例如,pci、pci express)、存储器总线或其他类型的接口总线。在一个实施例中,(一个或多个)处理器1402包括集成的存储器控制器116和平台控制器集线器130。存储器控制器116促进存储器设备与系统100的其他组件之间的通信,而平台控制器集线器(pch)130经由本地i/o总线提供到i/o设备的连接。
11.存储器设备120可以是动态随机存取存储器(dram)设备、静态随机存取存储器(sram)设备、闪速存储器设备、相变存储器设备或具有适合性能以充当进程存储器的某一其他存储器设备。在一个实施例中,存储器设备120可作为用于系统100的系统存储器进行操作,以存储数据122和指令121以供在一个或多个处理器102执行应用或进程时使用。存储器控制器116还与可选的外部图形处理器118耦合,所述外部图形处理器118可与处理器102中的一个或多个图形处理器108进行通信以执行图形和媒体操作。在一些实施例中,可由加速器112协助图形、媒体和/或计算操作,所述加速器112是可被配置成执行图形、媒体或计算操作的专门集合的协处理器。例如,在一个实施例中,加速器112是用于优化机器学习或计算操作的矩阵乘法加速器。在一个实施例中,加速器112是光线追踪加速器,其可被用于与图形处理器108协同执行光线追踪操作。在一个实施例中,可替代加速器112或与加速器112协同使用外部加速器119。
12.在一些实施例中,显示设备111可连接到(一个或多个)处理器102。显示设备111可以是如在移动电子设备或膝上型设备中的内部显示设备或者经由显示接口(例如,displayport等)附连的外部显示设备中的一个或多个。在一个实施例中,显示设备111可以是头戴式显示器(hmd),诸如供在虚拟现实(vr)应用或增强现实(ar)应用中使用的立体显
示设备。
13.在一些实施例中,平台控制器集线器130使得外设能经由高速i/o总线连接到存储器设备120和处理器102。i/o外设包括但不限于音频控制器146、网络控制器134、固件接口128、无线收发器126、触摸传感器125、数据存储设备124(例如,非易失性存储器、易失性存储器、硬盘驱动器、闪速存储器、nand、3d nand、3d xpoint等)。数据存储设备124可经由存储接口(例如,sata)或经由诸如外设组件互连总线(例如,pci、pci express)之类的外设总线进行连接。触摸传感器125可包括触摸屏传感器、压力传感器或指纹传感器。无线收发器126可以是wi-fi收发器、蓝牙收发器或诸如3g、4g、5g或长期演进(lte)收发器之类的移动网络收发器。固件接口128实现与系统固件的通信,并且可以是例如统一可扩展固件接口(uefi)。网络控制器134可实现到有线网络的网络连接。在一些实施例中,高性能网络控制器(未示出)与接口总线110耦合。在一个实施例中,音频控制器146是多通道高清晰度音频控制器。在一个实施例中,系统100包括用于将传统(例如,个人系统2(ps/2))设备耦合到系统的可选的传统i/o控制器140。平台控制器集线器130还可连接到一个或多个通用串行总线(usb)控制器142连接输入设备,诸如键盘和鼠标143组合、相机144或其他usb输入设备。
14.将领会的是,示出的系统100是示例性的而非限制性的,因为以不同方式配置的其他类型的数据处理系统也可被使用。例如,存储器控制器116和平台控制器集线器130的实例可被集成到分立的外部图形处理器(诸如,外部图形处理器118)中。在一个实施例中,平台控制器集线器130和/或存储器控制器116可在一个或多个处理器102的外部。例如,系统100可包括外部存储器控制器116和平台控制器集线器130,其可被配置为与(一个或多个)处理器102通信的系统芯片组内的存储器控制器集线器和外设控制器集线器。
15.例如,可使用电路板(“滑板(sled)”),将诸如cpu、存储器和其他组件之类的组件放置在所述滑板上,其被设计用于增加的热性能。在一些示例中,诸如处理器之类的处理组件位于滑板的顶侧上,而诸如dimm之类的近存储器位于滑板的底侧上。作为通过此设计提供的增强气流的结果,组件可比在典型系统中更高的频率和功率水平操作,由此增加性能。此外,滑板被配置成与机架中的功率和数据通信缆线盲配对,从而增强它们被快速移除、升级、重新安装和/或替换的能力。类似地,位于滑板上的各个组件(诸如处理器、加速器、存储器和数据存储驱动器)被配置成由于它们与彼此增加的间距而容易被升级。在说明性实施例中,组件另外包括硬件证明特征以证实其确实性(authenticity)。
16.数据中心可利用单个网络架构(“组构”),所述单个网络架构支持包括以太网和全路径(omni-path)的多个其他网络架构。滑板可经由光纤被耦合到交换机,所述光纤提供比典型双绞线缆线(例如,类别5、类别5e、类别6等)更高的带宽和更低的时延。由于高带宽、低时延互连和网络架构,数据中心可在使用时对在物理上解聚的资源(诸如存储器、加速器(例如,gpu、图形加速器、fpga、asic、神经网络和/或人工智能加速器等)以及数据存储驱动器)进行池化,并在按照需要的基础上将它们提供到计算资源(例如,处理器),使得计算资源能访问池化资源,如同池化资源是本地的那样。
17.电力供应或电源可将电压和/或电流提供到本文描述的系统100或任何组件或系统。在一个示例中,电力供应包括用于插入到壁装电源插座的ac到dc(交流到直流)适配器。此类ac电力可以是可再生能源(例如,太阳能)电源。在一个示例中,电源包括dc电源,诸如外部ac到dc转换器。在一个示例中,电源或电力供应包括无线充电硬件以经由接近充电场
进行充电。在一个示例中,电源可包括内部电池、交流供应、基于运动的电力供应、太阳能供应或燃料电池源。
18.图2a-2d图示了由本文描述的实施例提供的计算系统和图形处理器。图2a-2d的与本文中任何其他图的元件具有相同附图标记(或名称)的元件可以以与本文其他地方描述的元件类似的任何方式操作或起作用,但不限于此。
19.图2a是处理器200的实施例的框图,处理器200具有一个或多个处理器核202a-202n、集成存储器控制器214和集成图形处理器208。处理器200可包括另外的核,所述另外的核多达并且包括由虚线框表示的另外的核202n。处理器核202a-202n中的每个包括一个或多个内部高速缓存单元204a-204n。在一些实施例中,每个处理器核还可访问一个或多个共享高速缓存单元206。内部高速缓存单元204a-204n和共享高速缓存单元206表示处理器200内的高速缓冲存储器层级。高速缓冲存储器层级可包括每个处理器核内的至少一级的指令和数据高速缓存,以及一级或多级的共享中间级高速缓存,诸如2级(l2)、3级(l3)、4级(l4)或其他级的高速缓存,其中在外部存储器前的最高级的高速缓存被分类为llc。在一些实施例中,高速缓存一致性逻辑维持各种高速缓存单元206与204a-204n之间的一致性。
20.在一些实施例中,处理器200还可包括一组一个或多个总线控制器单元216和系统代理核210。一个或多个总线控制器单元216管理一组外设总线,诸如一个或多个pci或pci express总线。系统代理核210提供用于各种处理器组件的管理功能性。在一些实施例中,系统代理核210包括一个或多个集成存储器控制器214以管理对各种外部存储器设备(未示出)的访问。
21.在一些实施例中,处理器核202a-202n中的一个或多个处理器核包括对同时多线程的支持。在此类实施例中,系统代理核210包括用于在多线程的处理期间协调和操作核202a-202n的组件。系统代理核210可另外包括功率控制单元(pcu),所述功率控制单元(pcu)包括用于调节处理器核202a-202n和图形处理器208的功率状态的逻辑和组件。
22.在一些实施例中,处理器200另外包括用于执行图形处理操作的图形处理器208。在一些实施例中,图形处理器208与一组共享高速缓存单元206和系统代理核210耦合,所述系统代理核210包括一个或多个集成存储器控制器214。在一些实施例中,系统代理核210还包括用于将图形处理器输出驱动到一个或多个耦合的显示器的显示控制器211。在一些实施例中,显示控制器211还可以是经由至少一个互连与图形处理器耦合的单独模块,或者可被集成在图形处理器208内。
23.在一些实施例中,基于环的互连单元212被用于耦合处理器200的内部组件。然而,可使用备选互连单元,诸如点对点互连、交换互连或其他技术,其包括本领域中公知的技术。在一些实施例中,图形处理器208经由i/o链路213与环互连212耦合。
24.示例性i/o链路213表示多个种类的i/o互连中的至少一个,其包括促进各种处理器组件与诸如edram模块之类的高性能嵌入式存储器模块218之间的通信的封装上i/o互连。在一些实施例中,处理器核202a-202n中的每个和图形处理器208可使用嵌入式存储器模块218作为共享末级高速缓存。
25.在一些实施例中,处理器核202a-202n是执行相同指令集架构的同质核(homogenous core)。在另一实施例中,处理器核202a-202n在指令集架构(isa)方面是异质的(heterogeneous),其中处理器核202a-202n中的一个或多个处理器核执行第一指令集,
而其他核中的至少一个核执行第一指令集的子集或不同指令集。在一个实施例中,处理器核202a-202n在微架构方面是异质的,其中具有相对更高功耗的一个或多个核与具有更低功耗的一个或多个功率核耦合。在一个实施例中,处理器核202a-202n在计算能力方面是异质的。另外,处理器200可在一个或多个芯片上被实现,或者被实现为除其他组件外还具有所图示的组件的soc集成电路。
26.图2b是根据本文描述的一些实施例的图形处理器核219的硬件逻辑的框图。图2b的与本文中任何其他图的元件具有相同附图标记(或名称)的元件可以以与本文其他地方描述的元件类似的任何方式操作或起作用,但不限于此。有时被称为核切片的图形处理器核219可以是模块化图形处理器内的一个或多个图形核。图形处理器核219是一个图形核切片的示例,并且如本文描述的图形处理器可包括基于目标功率和性能包络的多个图形核切片。每个图形处理器核219可包括与也称为子切片的多个子核221a-221f耦合的固定功能块230,所述多个子核221a-221f包括通用和固定功能逻辑的模块化块。
27.在一些实施例中,固定功能块230包括几何/固定功能流水线231,所述几何/固定功能流水线231可例如在更低性能和或更低功率图形处理器实现中由图形处理器核219中的所有子核共享。在各种实施例中,几何/固定功能流水线231包括3d固定功能流水线(例如,如下述图3和图4中的3d流水线312)、视频前端单元、线程派生器(thread spawner)和线程分派器、以及管理统一返回缓冲器(例如,如下所述的在图4中的统一返回缓冲器418)的统一返回缓冲器管理器。
28.在一个实施例中,固定功能块230还包括图形soc接口232、图形微控制器233和媒体流水线234。图形soc接口232提供图形处理器核219与片上系统集成电路内的其他处理器核之间的接口。图形微控制器233是可编程子处理器,其可被配置成管理图形处理器核219的各种功能,其包括线程分派、调度和抢占(pre-emption)。媒体流水线234(例如,图3和图4的媒体流水线316)包括用于促进包括图像和视频数据的多媒体数据的解码、编码、预处理和/或后处理的逻辑。媒体流水线234经由对子核221-221f内的计算或采样逻辑的请求来实现媒体操作。
29.在一个实施例中,soc接口232使得图形处理器核219能够与通用应用处理器核(例如,cpu)和/或soc内的其他组件通信,所述soc内的其他组件包括诸如共享末级高速缓冲存储器、系统ram和/或嵌入式片上或封装上dram之类的存储器层级元件。soc接口232还可实现与soc内的固定功能设备(诸如,相机成像流水线)的通信,并且实现全局存储器原子的使用和/或实现全局存储器原子,所述全局存储器原子可在图形处理器核219与soc内的cpu之间被共享。soc接口232还可实现针对图形处理器核219的功率管理控制,并且实现图形核219的时钟域与soc内的其他时钟域之间的接口。在一个实施例中,soc接口232使得能够接收来自命令流播器和全局线程分派器的命令缓冲器,所述命令流播器和全局线程分派器被配置成向图形处理器内的一个或多个图形核中的每个提供命令和指令。命令和指令可在要执行媒体操作时被分派到媒体流水线234,或者在要执行图形处理操作时被分派到几何和固定功能流水线(例如,几何和固定功能流水线231、几何和固定功能流水线237)。
30.图形微控制器233可被配置成执行用于图形处理器核219的各种调度和管理任务。在一个实施例中,图形微控制器233可在子核221a-221f内的执行单元(eu)阵列222a-222f、224a-224f内的各种图形并行引擎上执行图形和/或计算工作负载调度。在该调度模型中,
在包括图形处理器核219的soc的cpu核上执行的主机软件可将工作负载提交给多个图形处理器门铃中的一个,这调用适当图形引擎上的调度操作。调度操作包括确定接下来要运行哪个工作负载、向命令流播器提交工作负载、对在引擎上运行的现有工作负载进行抢占、监视工作负载的进展、以及在工作负载完成时通知主机软件。在一个实施例中,图形微控制器233还可促进用于图形处理器核219的低功率或空闲状态,从而为图形处理器核219提供独立于操作系统和/或系统上的图形驱动器软件跨低功率状态转变来对图形处理器核219内的寄存器进行保存和恢复的能力。
31.图形处理器核219可具有多于或少于所图示的子核221a-221f,多达n个模块化子核。对于n个子核的每个集合,图形处理器核219还可包括共享功能逻辑235、共享和/或高速缓冲存储器236、几何/固定功能流水线237以及另外的固定功能逻辑238以加速各种图形和计算处理操作。共享功能逻辑235可包括与图4的共享功能逻辑420相关联的逻辑单元(例如,采样器、数学和/或线程间通信逻辑),所述逻辑单元可由图形处理器核219内的每n个子核共享。共享和/或高速缓冲存储器236可以是用于图形处理器核219内的n个子核221a-221f的集合的末级高速缓存,并且还可充当可由多个子核访问的共享存储器。几何/固定功能流水线237可代替固定功能块230内的几何/固定功能流水线231而被包括并且可包括相同或类似的逻辑单元。
32.在一个实施例中,图形处理器核219包括另外的固定功能逻辑238,其可包括供图形处理器核219使用的各种固定功能加速逻辑。在一个实施例中,另外的固定功能逻辑238包括供在仅位置着色中使用的另外的几何流水线。在仅位置着色中,存在两个几何流水线:几何/固定功能流水线238、231内的完全几何流水线;以及剔除流水线(cull pipeline),其是可被包括在另外的固定功能逻辑238内的另外的几何流水线。在一个实施例中,剔除流水线是完全几何流水线的裁减版本(trimmed down version)。完全流水线和剔除流水线可执行相同应用的不同实例,每个实例具有单独的上下文。仅位置着色可隐藏被丢弃三角形的长剔除运行,使得在一些实例中能更早完成着色。例如并且在一个实施例中,另外的固定功能逻辑238内的剔除流水线逻辑可执行与主应用并行的位置着色器,并且一般比完全流水线更快生成关键结果,因为剔除流水线仅对顶点的位置属性进行提取并着色,而不向帧缓冲器执行像素的光栅化和渲染。剔除流水线可使用所生成的关键结果来计算用于所有三角形的可见性信息,而不考虑那些三角形是否被剔除。完全流水线(其在该实例中可被称为重放流水线)可消耗可见性信息以跳过被剔除的三角形,以仅对最终被传递到光栅化阶段的可见三角形进行着色。
33.在一个实施例中,另外的固定功能逻辑238还可包括诸如固定功能矩阵乘法逻辑之类的机器学习加速逻辑,以用于包括针对机器学习训练或推理的优化的实现。
34.在每个图形子核221a-221f内包括一组执行资源,其可被用于响应于图形流水线、媒体流水线或着色器程序的请求而执行图形、媒体和计算操作。图形子核221a-221f包括多个eu阵列222a-222f、224a-224f、线程分派和线程间通信(td/ic)逻辑223a-223f、3d(例如,纹理)采样器225a-225f、媒体采样器206a-206f、着色器处理器227a-227f和共享本地存储器(slm)228a-228f。eu阵列222a-222f、224a-224f各自包括多个执行单元,所述多个执行单元是能够为图形、媒体或计算操作(包括图形、媒体或计算着色器程序)服务而执行浮点和整数/固定点逻辑运算的通用图形处理单元。td/ic逻辑223a-223f执行用于子核内的执行
单元的本地线程分派和线程控制操作,并且促进在子核的执行单元上执行的线程之间的通信。3d采样器225a-225f可将纹理或其他3d图形相关数据读取到存储器中。3d采样器可基于所配置的样本状态和与给定纹理相关联的纹理格式以不同方式读取纹理数据。媒体采样器206a-206f可基于与媒体数据相关联的类型和格式来执行类似的读取操作。在一个实施例中,每个图形子核221a-221f可交替包括统一3d和媒体采样器。在子核221a-221f中的每个子核内的执行单元上执行的线程可利用每个子核内的共享本地存储器228a-228f,以使得在线程组内执行的线程能使用片上存储器的公共池来执行。
35.图2c图示了包括被布置到多核组240a-240n中的图形处理资源的专用集合的图形处理单元(gpu)239。尽管提供了仅单个多核组240a的细节,但将领会,其他多核组240b-240n可以配备有图形处理资源的相同或类似集合。
36.如所图示的那样,多核组240a可以包括一组图形核243、一组张量核244和一组光线追踪核245。调度器/分派器241调度和分派图形线程以用于在各种核243、244、245上执行。一组寄存器堆242存储核243、244、245在执行图形线程时使用的操作数值。这些可以包括例如用于存储整数值的整数寄存器、用于存储浮点值的浮点寄存器、用于存储打包数据元素(整数和/或浮点数据元素)的向量寄存器和用于存储张量/矩阵值的贴片寄存器。在一个实施例中,贴片寄存器被实现为向量寄存器的组合集合。
37.一个或多个组合1级(l1)高速缓存和共享存储器单元247在每个多核组240a内本地存储图形数据,诸如纹理数据、顶点数据、像素数据、光线数据、包围体数据等。一个或多个纹理单元247还可以用于执行纹理操作,诸如纹理映射和采样。由多核组240a-240n的全部或子集共享的2级(l2)高速缓存253存储针对多个同时图形线程的图形数据和/或指令。如所图示的那样,l2高速缓存253可以跨多个多核组240a-240n而共享。一个或多个存储器控制器248将gpu 239耦合到存储器249,存储器249可以是系统存储器(例如,dram)和/或专用图形存储器(例如,gddr6存储器)。
38.输入/输出(i/o)电路系统250将gpu 239耦合到一个或多个i/o设备252,诸如数字信号处理器(dsp)、网络控制器或用户输入设备。片上互连可以用于将i/o设备252耦合到gpu 239和存储器249。i/o电路系统250的一个或多个i/o存储器管理单元(iommu)251将i/o设备252直接耦合到系统存储器249。在一个实施例中,iommu 251管理页表的多个集合以将虚拟地址映射到系统存储器249中的物理地址。在该实施例中,i/o设备252、(一个或多个)cpu 246和(一个或多个)gpu 239可以共享相同虚拟地址空间。
39.在一个实现中,iommu 251支持虚拟化。在该情况下,它可以管理页表的第一集合以将客户/图形虚拟地址映射到客户/图形物理地址,并管理页表的第二集合以将客户/图形物理地址映射到系统/主机物理地址(例如,在系统存储器249内)。页表的第一和第二集合中的每个的基址可被存储在控制寄存器中并且在上下文切换时被换出(例如,使得新的上下文被提供有对页表的相关集合的访问)。尽管在图2c中未图示,但核243、244、245和/或多核组240a-240n中的每个可以包括转化后备缓冲器(tlb),以对客户虚拟到客户物理转化、客户物理到主机物理转化以及客户虚拟到主机物理转化进行高速缓存。
40.在一个实施例中,cpu 246、gpu 239和i/o设备252被集成在单个半导体芯片和/或芯片封装上。所图示的存储器249可被集成在相同芯片上,或者可经由片外接口而耦合到存储器控制器248。在一个实现中,存储器249包括gddr6存储器,所述gddr6存储器共享与其他
物理系统级存储器相同的虚拟地址空间,尽管本发明的基础原理不限于此特定实现。
41.在一个实施例中,张量核244包括特别设计成执行矩阵运算的多个执行单元,所述矩阵运算是用于执行深度学习操作的基础计算操作。例如,同时矩阵乘法运算可被用于神经网络训练和推理。张量核244可使用多种操作数精度来执行矩阵处理,所述多种操作数精度包括单精度浮点(例如,32位)、半精度浮点(例如,16位)、整数字(16位)、字节(8位)和半字节(4位)。在一个实施例中,神经网络实现取出每个经渲染的场景的特征,潜在地组合来自多个帧的细节,以构造高质量的最终图像。
42.在深度学习实现中,可调度并行矩阵乘法工作以用于在张量核244上执行。神经网络的训练特别要求大量的矩阵点积运算。为了处理n x n x n矩阵相乘的内积公式,张量核244可包括至少n个点积处理元素。在矩阵相乘开始前,一个完整矩阵被加载到贴片寄存器中,并且在n个周期的每个周期,第二矩阵的至少一列被加载。每个周期,有被处理的n个点积。
43.取决于特定实现,可以以不同精度存储矩阵元素,所述不同精度包括16位字、8位字节(例如,int8)和4位半字节(例如,int4)。可为张量核244指定不同精度模式以确保最高效的精度被用于不同工作负载(例如,诸如可容许量化到字节和半字节的推理工作负载)。
44.在一个实施例中,光线追踪核245对于实时光线追踪和非实时光线追踪实现二者均使光线追踪操作加速。特别地,光线追踪核245包括光线遍历/交叉电路系统,以用于使用包围体层级(bvh)来执行光线遍历并且标识封闭在bvh体积之内的图元与光线之间的交叉。光线追踪核245还可包括用于执行深度测试和剔除(例如,使用z缓冲器或类似布置)的电路系统。在一个实现中,光线追踪核245与本文描述的图像去噪技术协同执行遍历和交叉操作,其至少一部分可在张量核244上被执行。例如,在一个实施例中,张量核244实现要执行的深度学习神经网络,包括本地存储器9010(和/或系统存储器)对由光线追踪核245生成的帧的去噪。然而,(一个或多个)cpu 246、图形核243和/或光线追踪核245还可实现去噪和/或深度学习算法的全部或一部分。
45.另外,如上所述,可采用去噪的分布式方法,其中gpu 239处于通过网络或高速互连耦合到其他计算设备的计算设备中。在该实施例中,互连的计算设备共享神经网络学习/训练数据来改进速度,利用该速度,整个系统学习对不同类型的图像帧和/或不同的图形应用执行去噪。
46.在一个实施例中,光线追踪核245处理所有bvh遍历和光线-图元交叉,从而避免图形核243以每光线数千个指令而过载。在一个实施例中,每个光线追踪核245包括用于执行包围盒测试(例如,对于遍历操作)的专用电路系统的第一集合和用于执行光线-三角形交叉测试(例如,交叉已被遍历的光线)的专用电路系统的第二集合。因此,在一个实施例中,多核组240a可仅仅启动光线探头,并且光线追踪核245独立执行光线遍历和交叉并且将命中数据(例如,命中、无命中、多次命中等)返回到线程上下文。在光线追踪核245执行遍历和交叉操作的同时,其他核243、244被释放以执行其他图形或计算工作。
47.在一个实施例中,每个光线追踪核245包括用于执行bvh测试操作的遍历单元和执行光线-图元交叉测试的交叉单元。交叉单元生成“命中”、“无命中”或“多次命中”响应,交叉单元将该响应提供到适当的线程。在遍历和交叉操作期间,其他核(例如,图形核243和张量核244)的执行资源被释放以执行其他形式的图形工作。
48.在下述的一个特定实施例中,使用了混合光栅化/光线追踪方法,其中在图形核243与光线追踪核245之间分布工作。
49.在一个实施例中,光线追踪核245(和/或其他核243、244)包括对诸如microsoft的directx光线追踪(dxr)之类的光线追踪指令集的硬件支持,所述dxr包括dispatchrays命令以及光线-生成、最接近-命中、任何-命中和未命中着色器,这些实现对每个对象指派纹理和着色器的独特集合。可由光线追踪核245、图形核243和张量核244支持的另一光线追踪平台是vulkan 1.1.85。然而,注意本发明的基础原理不限于任何特定光线追踪isa。
50.一般而言,各种核245、244、243可支持光线追踪指令集,所述光线追踪指令集包括用于光线生成、最接近命中、任何命中、光线-图元交叉、每图元和分层包围盒构造、未命中、访问和异常的指令/功能。更特定地,一个实施例包括光线追踪指令以执行以下功能:光线生成
ꢀ–ꢀ
可为每个像素、样本或其他用户定义的工作指派执行光线生成指令。
51.最接近命中
ꢀ–ꢀ
可执行最接近命中指令,以用场景内的图元来定位光线的最接近交点。
52.任何命中
ꢀ‑ꢀ
任何命中指令标识场景内的图元与光线之间的多个交叉,潜在地标识新的最接近交点。
53.交叉
ꢀ‑ꢀ
交叉指令执行光线-图元交叉测试并且输出结果。
54.每图元包围盒构造
ꢀ‑ꢀ
此指令围绕给定图元或图元的组构建包围盒(例如,在构建新的bvh或其他加速数据结构时)。
55.未命中
ꢀ–ꢀ
指示光线未命中场景的指定区或场景内的所有几何结构。
56.访问
ꢀ–ꢀ
指示光线将遍历的子代体积(children volume)。
57.异常
ꢀ‑ꢀ
包括各种类型的异常处理程序(例如,针对各种误差状况而被调用)。
58.图2d是根据本文描述的实施例的可被配置为图形处理器和/或计算加速器的通用图形处理单元(gpgpu)270的框图。gpgpu 270可经由一个或多个系统和/或存储器总线与主机处理器(例如,一个或多个cpu 246)和存储器271、272互连。在一个实施例中,存储器271是可与一个或多个cpu 246共享的系统存储器,而存储器272是专用于gpgpu 270的设备存储器。在一个实施例中,设备存储器272和gpgpu 270内的组件可被映射到一个或多个cpu 246可访问的存储器地址中。可经由存储器控制器268来促进对存储器271和272的访问。在一个实施例中,存储器控制器268包括内部直接存储器存取(dma)控制器269,或者可包括逻辑以执行否则将由dma控制器执行的操作。
59.gpgpu 270包括多个高速缓冲存储器,其包括l2高速缓存253、l1高速缓存254、指令高速缓存255和共享存储器256,该共享存储器256的至少一部分也可被分区为高速缓冲存储器。gpgpu 270还包括多个计算单元260a-260n。每个计算单元260a-260n包括一组向量寄存器261、标量寄存器262、向量逻辑单元263和标量逻辑单元264。计算单元260a-260n还可包括本地共享存储器265和程序计数器266。计算单元260a-260n可与常量高速缓存267耦合,该常量高速缓存267可被用于存储常量数据,所述常量数据是在gpgpu 270上执行的内核或着色器程序的运行期间将不改变的数据。在一个实施例中,常量高速缓存267是标量数据高速缓存,并且经高速缓存的数据可被直接提取到标量寄存器262中。
60.在操作期间,一个或多个cpu 246可将命令写入已被映射到可访问地址空间中的gpgpu 270中的寄存器或存储器中。命令处理器257可从寄存器或存储器读取命令,并且确
定将在gpgpu 270内如何处理那些命令。然后线程分派器258可被用于将线程分派到计算单元260a-260n,以执行那些命令。每个计算单元260a-260n可独立于其他计算单元执行线程。另外,每个计算单元260a-260n可被独立配置用于有条件的计算,并且可有条件地将计算的结果输出到存储器。在提交的命令完成时,命令处理器257可中断一个或多个cpu 246。
61.图3a-3c图示了由本文描述的实施例提供的另外的图形处理器和计算加速器架构的框图。图3a-3c的与本文中任何其他图的元件具有相同附图标记(或名称)的元件可以以与本文其他地方描述的元件类似的任何方式操作或起作用,但不限于此。
62.图3a是图形处理器300的框图,该图形处理器300可以是分立的图形处理单元,或者可以是与多个处理核集成的图形处理器,或诸如但不限于存储器设备或网络接口的其他半导体设备。在一些实施例中,图形处理器经由到图形处理器上的寄存器的存储器映射i/o接口并且利用被放置到处理器存储器中的命令进行通信。在一些实施例中,图形处理器300包括用于访问存储器的存储器接口314。存储器接口314可以是到本地存储器、一个或多个内部高速缓存、一个或多个共享外部高速缓存和/或到系统存储器的接口。
63.在一些实施例中,图形处理器300还包括用于将显示输出数据驱动到显示设备318的显示控制器302。显示控制器302包括用于一个或多个覆盖平面的硬件,以用于显示和组成用户接口元素或视频的多个层。显示设备318可以是内部或外部显示设备。在一个实施例中,显示设备318是头戴式显示设备,诸如虚拟现实(vr)显示设备或增强现实(ar)显示设备。在一些实施例中,图形处理器300包括视频编解码器引擎306以将媒体编码成一个或多个媒体编码格式、从一个或多个媒体编码格式将媒体解码、或者在一个或多个媒体编码格式之间对媒体进行转码,所述媒体编码格式包括但不限于运动图像专家组(mpeg)格式(诸如,mpeg-2)、高级视频编码(avc)格式(诸如,h.264/mpeg-4 avc、h.265/hevc)、开放媒体联盟(aomedia)vp8、vp9以及电影与电视工程师协会(smpte)421m/vc-1和联合图像专家组(jpeg)格式,诸如,jpeg、和运动jpeg(mjpeg)格式。
64.在一些实施例中,图形处理器300包括用于执行二维(2d)光栅化器操作(包括例如位边界块传送)的块图像传送(blit)引擎304。然而,在一个实施例中,使用图形处理引擎(gpe)310的一个或多个组件来执行2d图形操作。在一些实施例中,gpe 310是用于执行包括三维(3d)图形操作和媒体操作的图形操作的计算引擎。
65.在一些实施例中,gpe 310包括用于执行3d操作的3d流水线312,所述3d操作诸如是使用作用于3d图元形状(例如,矩形、三角形等)的处理功能来渲染三维图像和场景。3d流水线312包括可编程和固定功能元件,所述可编程和固定功能元件在元件内执行各种任务和/或派生(spawn)到3d/媒体子系统315的执行线程。尽管3d流水线312可被用于执行媒体操作,但gpe 310的实施例还包括特别用于执行媒体操作(诸如,视频后处理和图像增强)的媒体流水线316。
66.在一些实施例中,媒体流水线316包括固定功能或可编程逻辑单元以代替或者代表视频编解码器引擎306来执行一个或多个专用媒体操作,诸如视频解码加速、视频去交织和视频编码加速。在一些实施例中,媒体流水线316另外包括线程派生单元以派生用于在3d/媒体子系统315上执行的线程。派生的线程在3d/媒体子系统315中包括的一个或多个图形执行单元上执行用于媒体操作的计算。
67.在一些实施例中,3d/媒体子系统315包括用于执行由3d流水线312和媒体流水线
316派生的线程的逻辑。在一个实施例中,流水线将线程执行请求发送到3d/媒体子系统315,所述3d/媒体子系统315包括线程分派逻辑,所述线程分派逻辑用于将各种请求仲裁并分派到可用线程执行资源。执行资源包括用于处理3d和媒体线程的图形执行单元的阵列。在一些实施例中,3d/媒体子系统315包括用于线程指令和数据的一个或多个内部高速缓存。在一些实施例中,子系统还包括共享存储器,所述共享存储器包括寄存器和可寻址存储器,以在线程之间共享数据并且存储输出数据。
68.图3b图示了根据本文描述的实施例的具有拼贴架构的图形处理器320。在一个实施例中,图形处理器320包括图形处理引擎集群322,所述图形处理引擎集群322在图形引擎贴片310a-310d内具有图3a的图形处理引擎310的多个实例。每个图形引擎贴片310a-310d可经由一组贴片互连323a-323f而被互连。每个图形引擎贴片310a-310d还可经由存储器互连325a-325d被连接到存储器模块或存储器设备326a-326d。存储器设备326a-326d可使用任何图形存储器技术。例如,存储器设备326a-326d可以是图形双倍数据率(gddr)存储器。在一个实施例中,存储器设备326a-326d是高带宽存储器(hbm)模块,其可与其相应图形引擎贴片310a-310d一起在管芯上。在一个实施例中,存储器设备326a-326d是堆叠存储器设备,其可被堆叠在其相应图形引擎贴片310a-310d顶上。在一个实施例中,如图11b-11d中进一步详细描述的那样,每个图形引擎贴片310a-310d和关联存储器326a-326d驻留在单独的小芯片上,所述小芯片被接合到基础管芯或基础衬底。
69.图形处理引擎集群322可与片上或封装上组构互连324连接。组构互连324可实现图形引擎贴片310a-310d与诸如视频编解码器306和一个或多个拷贝引擎304之类的组件之间的通信。拷贝引擎304可被用于将数据移出以下各项、将数据移入以下各项以及在以下各项之间移动数据:存储器设备326a-326d和处于图形处理器320外的存储器(例如,系统存储器)。组构互连324还可被用于互连图形引擎贴片310a-310d。图形处理器320可以可选地包括用于实现与外部显示设备318的连接的显示控制器302。图形处理器还可被配置为图形或计算加速器。在加速器配置中,可省略显示控制器302和显示设备318。
70.图形处理器320可经由主机接口328连接到主机系统。主机接口328可实现图形处理器320、系统存储器和/或其他系统组件之间的通信。主机接口328可例如是pci express总线或另一类型的主机系统接口。
71.图3c图示了根据本文描述的实施例的计算加速器330。计算加速器330可包括与图3b的图形处理器320的架构类似性并且被优化用于计算加速。计算引擎集群332可包括计算引擎贴片340a-340d的集合,其包括被优化用于并行或基于向量的通用计算操作的执行逻辑。在一些实施例中,计算引擎贴片340a-340d不包括固定功能图形处理逻辑,尽管在一个实施例中,计算引擎贴片340a-340d中的一个或多个计算引擎贴片可包括用于执行媒体加速的逻辑。计算引擎贴片340a-340d可经由存储器互连325a-325d连接到存储器326a-326d。存储器326a-326d和存储器互连325a-325d可以是与在图形处理器320中类似的技术,或者可以是不同的。图形计算引擎贴片340a-340d还可经由贴片互连323a-323f的集合被互连,并且可与组构互连324连接和/或通过组构互连324被互连。在一个实施例中,计算加速器330包括可被配置为设备范围高速缓存的大的l3高速缓存336。计算加速器330还可以以与图3b的图形处理器320类似的方式经由主机接口328连接到主机处理器和存储器。
72.图形处理引擎
图4是根据一些实施例的图形处理器的图形处理引擎410的框图。在一个实施例中,图形处理引擎(gpe)410是图3a中示出的gpe 310的某一版本,并且还可表示图3b的图形引擎贴片310a-310d。图4的与本文中任何其他图的元件具有相同附图标记(或名称)的元件可以以与本文其他地方描述的元件类似的任何方式操作或起作用,但不限于此。例如,图示了图3a的3d流水线312和媒体流水线316。媒体流水线316在gpe 410的一些实施例中是可选的,并且可未被显式地包括在gpe 410内。例如并且在至少一个实施例中,单独的媒体和/或图像处理器被耦合到gpe 410。
73.在一些实施例中,gpe 410与命令流播器403耦合或者包括该命令流播器403,该命令流播器403将命令流提供到3d流水线312和/或媒体流水线316。在一些实施例中,命令流播器403与存储器耦合,所述存储器可以是系统存储器,或内部高速缓冲存储器和共享高速缓冲存储器中的一个或多个。在一些实施例中,命令流播器403接收来自存储器的命令,并且将命令发送到3d流水线312和/或媒体流水线316。命令是从存储用于3d流水线312和媒体流水线316的命令的环形缓冲器提取的指令(directive)。在一个实施例中,环形缓冲器可另外包括存储批量的多个命令的批量命令缓冲器。用于3d流水线312的命令还可包括对在存储器中存储的数据(诸如但不限于用于3d流水线312的顶点和几何数据和/或用于媒体流水线316的图像数据和存储器对象)的引用。3d流水线312和媒体流水线316通过经由相应流水线内的逻辑执行操作或者通过将一个或多个执行线程分派到图形核阵列414来处理命令和数据。在一个实施例中,图形核阵列414包括图形核(例如,(一个或多个)图形核415a、(一个或多个)图形核415b)的一个或多个块,每个块包括一个或多个图形核。每个图形核包括:图形执行资源的集合,其包括用于执行图形和计算操作的通用和图形特定执行逻辑;以及固定功能纹理处理和/或机器学习和人工智能加速逻辑。
74.在各种实施例中,3d流水线312可包括用于通过处理指令并且将执行线程分派到图形核阵列414来处理一个或多个着色器程序(诸如,顶点着色器、几何着色器、像素着色器、片段着色器、计算着色器或其他着色器程序)的固定功能和可编程逻辑。图形核阵列414提供执行资源的统一块以用于在处理这些着色器程序时使用。图形核阵列414的(一个或多个)图形核415a-415b内的多用途执行逻辑(例如,执行单元)包括对各种3d api着色器语言的支持,并且可执行与多个着色器相关联的多个同时执行线程。
75.在一些实施例中,图形核阵列414可包括用于执行媒体功能(诸如,视频和/或图像处理)的执行逻辑。在一个实施例中,执行单元包括通用逻辑,该通用逻辑可编程以除图形处理操作外还执行并行通用计算操作。该通用逻辑可与在图1的(一个或多个)处理器核107或如图2a中的核202a-202n内的通用逻辑并行或结合地执行处理操作。
76.由在图形核阵列414上执行的线程生成的输出数据可将数据输出到统一返回缓冲器(urb)418中的存储器。urb 418可存储用于多个线程的数据。在一些实施例中,urb 418可被用于在图形核阵列414上执行的不同线程之间发送数据。在一些实施例中,urb 418可另外被用于在图形核阵列上的线程与在共享功能逻辑420内的固定功能逻辑之间的同步。
77.在一些实施例中,图形核阵列414是可缩放的,使得该阵列包括可变数量的图形核,这些图形核各自基于gpe 410的目标功率和性能水平而具有可变数量的执行单元。在一个实施例中,执行资源是动态可缩放的,使得可按照需要启用或禁用执行资源。
78.图形核阵列414与共享功能逻辑420耦合,该共享功能逻辑420包括在图形核阵列
中的图形核之间共享的多个资源。共享功能逻辑420内的共享功能是硬件逻辑单元,所述硬件逻辑单元将专用补充功能性提供到图形核阵列414。在各种实施例中,共享功能逻辑420包括但不限于采样器421、数学422和线程间通信(itc)423逻辑。另外,一些实施例实现共享功能逻辑420内的一个或多个高速缓存425。
79.至少在其中对给定专用功能的需求不足以包括在图形核阵列414内的情况下,实现共享功能。相反,该专用功能的单个实例化被实现为共享功能逻辑420中的独立实体,且在图形核阵列414内的执行资源之间被共享。在图形核阵列414之间共享且包括在图形核阵列414内的功能的精确集合跨实施例而变化。在一些实施例中,由图形核阵列414广泛使用的共享功能逻辑420内的特定共享功能可被包括在图形核阵列414内的共享功能逻辑416内。在各种实施例中,图形核阵列414内的共享功能逻辑416可包括共享功能逻辑420内的一些或全部逻辑。在一个实施例中,可在图形核阵列414的共享功能逻辑416内重复共享功能逻辑420内的全部逻辑元件。在一个实施例中,排除了共享功能逻辑420以有利于图形核阵列414内的共享功能逻辑416。
80.执行单元图5a-5b图示了根据本文描述的实施例的线程执行逻辑500,其包括在图形处理器核中采用的处理元件的阵列。图5a-5b的与本文中任何其他图的元件具有相同附图标记(或名称)的元件可以以与本文其他地方描述的元件类似的任何方式操作或起作用,但不限于此。图5a-5b图示了线程执行逻辑500的概述,该线程执行逻辑500可表示利用图2b的每个子核221a-221f图示的硬件逻辑。图5a表示通用图形处理器内的执行单元,而图5b表示可在计算加速器内使用的执行单元。
81.如图5a中所图示,在一些实施例中,线程执行逻辑500可包括着色器处理器502、线程分派器504、指令高速缓存506、包括多个执行单元508a-508n的可缩放执行单元阵列、采样器510、共享本地存储器511、数据高速缓存512和数据端口514。在一个实施例中,可缩放执行单元阵列可通过基于工作负载的计算要求启用或禁用一个或多个执行单元(例如,执行单元508a、508b、508c、508d到508n-1和508n中的任何执行单元)来动态地进行缩放。在一个实施例中,所包括的组件经由链接到组件中的每个组件的互连组构而互连。在一些实施例中,线程执行逻辑500包括通过指令高速缓存506、数据端口514、采样器510和执行单元508a-508n中的一个或多个到存储器(诸如,系统存储器或高速缓冲存储器)的一个或多个连接。在一些实施例中,每个执行单元(例如,508a)是独立可编程通用计算单元,其能执行多个同时硬件线程,同时为每个线程并行处理多个数据元素。在各种实施例中,执行单元508a-508n的阵列是可缩放的,以包括任何数量的各个执行单元。
82.在一些实施例中,执行单元508a-508n主要被用于执行着色器程序。着色器处理器502可处理各种着色器程序,且经由线程分派器504分派与着色器程序相关联的执行线程。在一个实施例中,线程分派器包括用于对来自图形和媒体流水线的线程发起请求进行仲裁并且在执行单元508a-508n中的一个或多个执行单元上实例化所请求的线程的逻辑。例如,几何流水线可将顶点、曲面细分或几何着色器分派到线程执行逻辑以用于处理。在一些实施例中,线程分派器504还可处理来自执行的着色器程序的运行时线程派生请求。
83.在一些实施例中,执行单元508a-508n支持指令集,所述指令集包括对许多标准3d图形着色器指令的本机支持,使得来自图形库(例如,direct 3d和opengl)的着色器程序以
最小的转化被执行。执行单元支持顶点和几何处理(例如,顶点程序、几何程序、顶点着色器)、像素处理(例如,像素着色器、片段着色器)和通用处理(例如,计算和媒体着色器)。执行单元508a-508n中的每个执行单元能进行多发布(multi-issue)单指令多数据(simd)执行,并且多线程操作在面临更高时延存储器访问时实现高效执行环境。每个执行单元内的每个硬件线程具有专用高带宽寄存器堆和关联独立线程状态。执行是对能进行整数、单精度和双精度浮点运算、simd分支能力、逻辑运算、超越运算和其他杂项运算的流水线的每时钟多发布。在等待来自存储器或共享功能之一的数据时,执行单元508a-508n内的依赖性逻辑促使等待的线程进行休眠,直到所请求的数据已被返回为止。在等待的线程正在休眠时,硬件资源可专用于处理其他线程。例如,在与顶点着色器操作相关联的延迟期间,执行单元可执行用于像素着色器、片段着色器或另一类型的着色器程序(包括不同顶点着色器)的操作。各种实施例可应用于:通过作为使用simd的备选方案或者除使用simd之外还使用单指令多线程(simt)来使用执行。对simd核或操作的引用也可应用于simt或者应用于与simt组合的simd。
84.执行单元508a-508n中的每个执行单元对数据元素的阵列进行操作。数据元素的数量是“执行大小”或指令的通道的数量。执行通道是用于指令内的数据元素访问、掩蔽(masking)和流控制的执行的逻辑单元。通道的数量可独立于特定图形处理器的物理算术逻辑单元(alu)或浮点单元(fpu)的数量。在一些实施例中,执行单元508a-508n支持整数和浮点数据类型。
85.执行单元指令集包括simd指令。各种数据元素可作为打包数据类型存储在寄存器中,并且执行单元将基于元素的数据大小来处理各种元素。例如,在对256位宽向量进行操作时,向量的256位被存储在寄存器中,并且执行单元对作为四个单独的54位打包数据元素(四字(qw)大小数据元素)、八个单独的32位打包数据元素(双字(dw)大小数据元素)、十六个单独的16位打包数据元素(字(w)大小数据元素)或三十二个单独的8位数据元素(字节(b)大小数据元素)的向量进行操作。然而,不同向量宽度和寄存器大小是可能的。
86.在一个实施例中,一个或多个执行单元可被组合成具有线程控制逻辑(507a-507n)的融合的执行单元509a-509n,所述线程控制逻辑(507a-507n)对于融合的eu是公共的。多个eu可被融合成eu群组。融合的eu群组中的每个eu可被配置成执行单独的simd硬件线程。融合的eu群组中eu的数量可根据实施例而变化。另外,可每eu执行各种simd宽度,包括但不限于simd8、simd16和simd32。每个融合的图形执行单元509a-509n包括至少两个执行单元。例如,融合的执行单元509a包括第一eu 508a、第二eu 508b以及线程控制逻辑507a,该线程控制逻辑507a对第一eu 508a和第二eu 508b是公共的。线程控制逻辑507a控制在融合的图形执行单元509a上执行的线程,允许融合的执行单元509a-509n内的每个eu使用公共指令指针寄存器来执行。
87.在线程执行逻辑500中包括一个或多个内部指令高速缓存(例如,506)以对用于执行单元的线程指令进行高速缓存。在一些实施例中,包括一个或多个数据高速缓存(例如,512)以在线程执行期间对线程数据进行高速缓存。在执行逻辑500上执行的线程还可在共享本地存储器511中存储显式管理的数据。在一些实施例中,包括采样器510以提供3d操作的纹理采样和媒体操作的媒体采样。在一些实施例中,采样器510包括专用纹理或媒体采样功能性,以在向执行单元提供采样的数据前在采样过程期间处理纹理或媒体数据。
88.在执行期间,图形和媒体流水线经由线程派生和分派逻辑向线程执行逻辑500发送线程发起请求。一旦几何对象的群组已被处理且光栅化成像素数据,着色器处理器502内的像素处理器逻辑(例如,像素着色器逻辑、片段着色器逻辑等)就被调用以进一步计算输出信息,且使结果被写入到输出表面(例如,颜色缓冲器、深度缓冲器、模板缓冲器等)。在一些实施例中,像素着色器或片段着色器计算要跨光栅化对象内插的各种顶点属性的值。在一些实施例中,着色器处理器502内的像素处理器逻辑然后执行应用编程接口(api)供应的像素或片段着色器程序。为了执行着色器程序,着色器处理器502经由线程分派器504向执行单元(例如,508a)分派线程。在一些实施例中,着色器处理器502使用采样器510中的纹理采样逻辑来访问存储在存储器中的纹理映射中的纹理数据。对纹理数据和输入几何数据的算术运算为每个几何片段计算像素颜色数据,或者丢弃一个或多个像素而不进行进一步处理。
89.在一些实施例中,数据端口514提供存储器访问机制,以供线程执行逻辑500将经处理的数据输出至存储器以用于在图形处理器输出流水线上进一步处理。在一些实施例中,数据端口514包括或者耦合到一个或多个高速缓冲存储器(例如,数据高速缓存512)来对数据进行高速缓存以用于经由数据端口的存储器访问。
90.在一个实施例中,执行逻辑500还可包括光线追踪器505,所述光线追踪器505可提供光线追踪加速功能性。光线追踪器505可支持包括用于光线生成的指令/功能的光线追踪指令集。该光线追踪指令集可与由图2c中的光线追踪核245支持的光线追踪指令集类似或不同。
91.图5b图示了根据实施例的执行单元508的示例性内部细节。图形执行单元508可包括指令提取单元537、通用寄存器堆阵列(grf)524、架构寄存器堆阵列(arf)526、线程仲裁器522、发送单元530、分支单元532、simd浮点单元(fpu)534的集合以及在一个实施例中专用整数simd alu 535的集合。grf 524和arf 526包括与可在图形执行单元508中活动的每个同时硬件线程相关联的通用寄存器堆和架构寄存器堆的集合。在一个实施例中,在arf 526中维持每线程架构状态,而在线程执行期间使用的数据被存储在grf 524中。每个线程的执行状态(包括用于每个线程的指令指针)可被保持在arf 526中的线程特定寄存器中。
92.在一个实施例中,图形执行单元508具有下述架构:该架构是同时多线程(smt)和细粒度交错多线程(imt)的组合。该架构具有模块化配置,其可在设计时基于每执行单元的寄存器的数量和同时线程的目标数量而微调,其中执行单元资源跨用于执行多个同时线程的逻辑而被划分。可由图形执行单元508执行的逻辑线程的数量不限于硬件线程的数量,并且多个逻辑线程可被指派到每个硬件线程。
93.在一个实施例中,图形执行单元508可共同发布多个指令,所述多个指令各自可以是不同的指令。图形执行单元线程508的线程仲裁器522可将指令分派到发送单元530、分支单元532或(一个或多个)simd fpu 534中的一个以用于执行。每个执行线程可访问grf 524内的128个通用寄存器,其中每个寄存器可存储32个字节,其可作为32位数据元素的simd 8元素向量而访问。在一个实施例中,每个执行单元线程可访问grf 524内的4千字节,尽管实施例不限于此,并且在其他实施例中可提供更多或更少的寄存器资源。在一个实施例中,图形执行单元508被分区成可独立执行计算操作的七个硬件线程,尽管每执行单元的线程的数量还可根据实施例而变化。例如,在一个实施例中,支持多达16个硬件线程。在其中七个
线程可访问4千字节的实施例中,grf 524可存储总共28千字节。在16个线程可访问4千字节的情况下,grf 524可存储总共64千字节。灵活的寻址模式可允许对寄存器一起进行寻址以有效地构建更宽的寄存器或者表示跨步矩形块数据结构(strided rectangular block data structure)。
94.在一个实施例中,经由通过消息传递发送单元530执行的“发送”指令来分派存储器操作、采样器操作和其他较长时延系统通信。在一个实施例中,将分支指令分派到专用分支单元532以促进simd发散和最终收敛。
95.在一个实施例中,图形执行单元508包括一个或多个simd浮点单元((一个或多个)fpu)534以执行浮点运算。在一个实施例中,(一个或多个)fpu 534还支持整数计算。在一个实例中,(一个或多个)fpu 534可simd执行多达m数量的32位浮点(或整数)运算,或者simd执行多达2m个16位整数或16位浮点运算。在一个实施例中,(一个或多个)fpu中的至少一个提供扩展的数学能力以支持高吞吐量超越数学函数和双精度54位浮点。在一些实施例中,还存在8位整数simd alu 535的集合,并且8位整数simd alu 535的集合可被特别地优化以执行与机器学习计算相关联的操作。
96.在一个实施例中,图形执行单元508的多个实例的阵列可在图形子核分组(例如,子切片)中被实例化。为了可缩放性,产品架构师可选定每子核分组的执行单元的确切数量。在一个实施例中,执行单元508可跨多个执行通道执行指令。在另一实施例中,在图形执行单元508上执行的每个线程是在不同的通道上执行的。
97.图6图示了根据实施例的另外的执行单元600。执行单元600可以是用于在例如如图3c中的计算引擎贴片340a-340d中使用的计算优化的执行单元,但不限于此。执行单元600的变型还可被用在如图3b中的图形引擎贴片310a-310d中。在一个实施例中,执行单元600包括线程控制单元601、线程状态单元602、指令提取/预提取单元603和指令解码单元604。执行单元600另外包括寄存器堆606,所述寄存器堆606存储可被指派到执行单元内的硬件线程的寄存器。执行单元600另外包括发送单元607和分支单元608。在一个实施例中,发送单元607和分支单元608可与图5b的图形执行单元508的发送单元530和分支单元532类似地操作。
98.执行单元600还包括计算单元610,所述计算单元610包括多个不同类型的功能单元。在一个实施例中,计算单元610包括alu单元611,所述alu单元611包括算术逻辑单元的阵列。alu单元611可被配置成执行64位、32位和16位整数和浮点运算。整数和浮点运算可同时被执行。计算单元610还可包括脉动阵列612和数学单元613。脉动阵列612包括可用于以脉动方式执行向量或其他数据并行操作的数据处理单元的宽度w和深度d的网络。在一个实施例中,脉动阵列612可被配置成执行矩阵运算,诸如矩阵点积运算。在一个实施例中,脉动阵列612支持16位浮点运算以及8位和4位整数运算。在一个实施例中,脉动阵列612可被配置成加速机器学习操作。在此类实施例中,脉动阵列612可被配置有对bfloat16(16位浮点格式)的支持。在一个实施例中,可包括数学单元613来以高效且比alu单元611更低功率的方式执行数学运算的特定子集。数学单元613可包括在由其他实施例提供的图形处理引擎的共享功能逻辑中找到的数学逻辑的变型(例如,图4的共享功能逻辑420的数学逻辑422)。在一个实施例中,数学单元613可被配置成执行32位和64位浮点运算。
99.线程控制单元601包括用于控制执行单元内线程的执行的逻辑。线程控制单元601
可包括用于开始、停止和抢占执行单元600内线程的执行的线程仲裁逻辑。线程状态单元602可用于为被指派以在执行单元600上执行的线程存储线程状态。在执行单元600内存储线程状态实现在线程变为阻塞或空闲时那些线程的快速抢占。指令提取/预提取单元603可从更高级别执行逻辑的指令高速缓存(例如,如图5a中的指令高速缓存506)提取指令。指令提取/预提取单元603还可基于当前执行的线程的分析来发布对要被加载到指令高速缓存中的指令的预提取请求。指令解码单元604可被用于解码要由计算单元执行的指令。在一个实施例中,指令解码单元604可被用作次级解码器以将复杂指令解码成组成的微操作。
100.执行单元600另外包括可由在执行单元600上执行的硬件线程使用的寄存器堆606。可跨用于执行执行单元600的计算单元610内的多个同时线程的逻辑而划分寄存器堆606中的寄存器。可由图形执行单元600执行的逻辑线程的数量不限于硬件线程的数量,并且多个逻辑线程可被指派到每个硬件线程。寄存器堆606的大小可基于支持的硬件线程的数量跨实施例而变化。在一个实施例中,寄存器重命名可被用于动态地将寄存器分配到硬件线程。
101.图7是图示了根据一些实施例的图形处理器指令格式700的框图。在一个或多个实施例中,图形处理器执行单元支持具有采用多种格式的指令的指令集。实线框示出了一般被包括在执行单元指令中的组成部分,而虚线包括可选的或者仅被包括在指令的子集中的组成部分。在一些实施例中,描述和图示的指令格式700是宏指令,因为它们是供应给执行单元的指令,而与一旦指令被处理由指令解码产生的微操作相反。
102.在一些实施例中,图形处理器执行单元本机地支持采用128位指令格式710的指令。基于所选择的指令、指令选项和操作数的数量,64位压缩指令格式730可用于一些指令。本机128位指令格式710提供对所有指令选项的访问,而采用64位格式730,一些选项和操作被限制。采用64位格式730的可用的本机指令随实施例而变化。在一些实施例中,使用索引字段713中索引值的集合来部分地压缩指令。执行单元硬件基于索引值来引用压缩表的集合,并且使用压缩表输出来重构采用128位指令格式710的本机指令。可使用指令的其他大小和格式。
103.对于每种格式,指令操作码712定义执行单元要执行的操作。执行单元跨每个操作数的多个数据元素并行执行每个指令。例如,响应于相加指令,执行单元跨表示纹理元素或图片元素的每个颜色通道来执行同时加法运算。默认情况下,执行单元跨操作数的所有数据通道来执行每个指令。在一些实施例中,指令控制字段714实现对诸如通道选择(例如,断定(predication))和数据通道次序(例如,搅混(swizzle))之类的某些执行选项的控制。对于采用128位指令格式710的指令,执行大小字段716限制将被并行执行的数据通道的数量。在一些实施例中,执行大小字段716不可供64位压缩指令格式730中使用。
104.一些执行单元指令具有多达三个操作数,所述三个操作数包括两个源操作数src0 720、src1 722和一个目的地718。在一些实施例中,执行单元支持双目的地指令,其中目的地中的一个是隐含的。数据操纵指令可具有第三源操作数(例如,src2 724),其中指令操作码712确定源操作数的数量。指令的最后源操作数可以是利用指令传递的立即(例如,硬编码的)值。
105.在一些实施例中,128位指令格式710包括访问/地址模式字段726,该访问/地址模式字段726指定例如使用直接寄存器寻址模式还是间接寄存器寻址模式。在使用直接寄存
器寻址模式时,由指令中的位来直接提供一个或多个操作数的寄存器地址。
106.在一些实施例中,128位指令格式710还包括访问/地址模式字段726,该访问/地址模式字段726指定指令的地址模式和/或访问模式。在一个实施例中,访问模式被用于定义指令的数据访问对齐。一些实施例支持包括16字节对齐的访问模式和1字节对齐的访问模式的访问模式,其中访问模式的字节对齐确定指令操作数的访问对齐。例如,当处于第一模式中时,指令可将字节对齐的寻址用于源操作数和目的地操作数,并且当处于第二模式中时,指令可将16字节对齐的寻址用于所有源操作数和目的地操作数。
107.在一个实施例中,访问/地址模式字段726的地址模式部分确定指令要使用直接寻址还是间接寻址。在使用直接寄存器寻址模式时,指令中的位直接提供一个或多个操作数的寄存器地址。在使用间接寄存器寻址模式时,可基于指令中的地址立即字段和地址寄存器值来计算一个或多个操作数的寄存器地址。
108.在一些实施例中中,基于操作码712位字段来对指令进行分组,以简化操作码解码740。对于8位操作码,4、5和6位允许执行单元确定操作码的类型。所示出的精确操作码分组仅是示例。在一些实施例中,移动和逻辑操作码群组742包括数据移动和逻辑指令(例如,移动(mov)、比较(cmp))。在一些实施例中,移动和逻辑群组742共享五个最高有效位(msb),其中移动(mov)指令采用0000xxxxb的形式,并且逻辑指令采用0001xxxxb的形式。流控制指令群组744(例如调用、跳(jmp))包括采用0010xxxxb(例如,0x20)形式的指令。杂项指令群组746包括指令的混合,包括采用0011xxxxb(例如,0x30)形式的同步指令(例如等待、发送)。并行数学指令群组748包括采用0100xxxxb(例如,0x40)的形式的逐组成部分的算术指令(例如,加、乘(mul))。并行数学群组748跨数据通道并行执行算术运算。向量数学群组750包括采用0101xxxxb(例如,0x50)形式的算术指令(例如,dp4)。向量数学群组对向量操作数执行诸如点积计算的算术。示出的操作码解码740在一个实施例中可用于确定执行单元的哪个部分将被用于执行解码的指令。例如,一些指令可被定名为将由脉动阵列执行的脉动指令。诸如光线追踪指令(未示出)的其他指令可被路由到执行逻辑的切片或分区内的光线追踪核或光线追踪逻辑。
109.图形流水线图8是图形处理器800的另一实施例的框图。图8的与本文中任何其他图的元件具有相同附图标记(或名称)的元件可以以与本文其他地方描述的元件类似的任何方式操作或起作用,但不限于此。
110.在一些实施例中,图形处理器800包括几何流水线820、媒体流水线830、显示引擎840、线程执行逻辑850和渲染输出流水线870。在一些实施例中,图形处理器800是包括一个或多个通用处理核的多核处理系统内的图形处理器。通过对一个或多个控制寄存器(未示出)的寄存器写入或者经由通过环形互连802发布至图形处理器800的命令来控制图形处理器。在一些示例实施例中,环形互连802将图形处理器800耦合到其他处理组件,诸如其他图形处理器或通用处理器。来自环形互连802的命令由命令流播器803解译,该命令流播器803将指令供应至几何流水线820或媒体流水线830的各个组件。
111.在一些实施例中,命令流播器803指导顶点提取器805的操作,该顶点提取器805从存储器读取顶点数据,并执行由命令流播器803提供的顶点处理命令。在一些实施例中,顶点提取器805将顶点数据提供给顶点着色器807,该顶点着色器807对每个顶点执行坐标空
间变换和照明操作。在一些示例中,顶点提取器805和顶点着色器807通过经由线程分派器831向执行单元852a-852b分派执行线程来执行顶点处理指令。
112.在一些实施例中,执行单元852a-852b是具有用于执行图形和媒体操作的指令集的向量处理器的阵列。在一些实施例中,执行单元852a-852b具有附连的l1高速缓存851,所述l1高速缓存2151对于每个阵列是特定的,或者在阵列之间被共享。高速缓存能被配置为数据高速缓存、指令高速缓存或被分区以在不同分区中包含数据和指令的单个高速缓存。
113.在一些实施例中,几何流水线820包括曲面细分组件以执行3d对象的硬件加速的曲面细分。在一些实施例中,可编程外壳着色器811配置曲面细分操作。可编程域着色器817提供曲面细分输出的后端评估。曲面细分器813在外壳着色器811的指导下进行操作,并且包含专用逻辑以基于作为到几何流水线820的输入而提供的粗略几何模型来生成详细的几何对象的集合。在一些实施例中,如果未使用曲面细分,则可绕过曲面细分组件(例如,外壳着色器811、曲面细分器813和域着色器817)。
114.在一些实施例中,完整几何对象可由几何着色器819经由分派到执行单元852a-852b的一个或多个线程来处理,或者可直接行进至裁剪器(clipper)829。在一些实施例中,几何着色器对整个几何对象进行操作,而不是如在图形流水线的先前阶段中对顶点或顶点的补片(patch)进行操作。如果曲面细分被禁用,则几何着色器819接收来自顶点着色器807的输入。在一些实施例中,几何着色器819由几何着色器程序可编程以在曲面细分单元被禁用时执行几何曲面细分。
115.在光栅化前,裁剪器829处理顶点数据。裁剪器829可以是具有裁剪和几何着色器功能的可编程裁剪器或固定功能裁剪器。在一些实施例中,渲染输出流水线870中的光栅化器和深度测试组件873分派像素着色器以将几何对象转换成逐像素表示。在一些实施例中,像素着色器逻辑被包括在线程执行逻辑850中。在一些实施例中,应用可绕过光栅化器和深度测试组件873,并且经由流出单元823访问未光栅化的顶点数据。
116.图形处理器800具有允许数据和消息在处理器的主要组件之间传递的互连总线、互连组构或某种其他互连机构。在一些实施例中,执行单元852a-852b和关联的逻辑单元(例如,l1高速缓存851、采样器854、纹理高速缓存858等)经由数据端口856互连,以执行存储器访问并且与处理器的渲染输出流水线组件进行通信。在一些实施例中,采样器854、高速缓存851、858和执行单元852a-852b各自具有单独的存储器访问路径。在一个实施例中,纹理高速缓存858还可被配置为采样器高速缓存。
117.在一些实施例中,渲染输出流水线870包含光栅化器和深度测试组件873,该光栅化器和深度测试组件873将基于顶点的对象转换成关联的基于像素的表示。在一些实施例中,光栅化器逻辑包括用于执行固定功能三角形和线光栅化的窗口化器(windower)/掩蔽器单元。关联的渲染高速缓存878和深度高速缓存879在一些实施例中也是可用的。像素操作组件877对数据执行基于像素的操作,尽管在一些实例中,与2d操作相关联的像素操作(例如,带有混合(blending)的位块图像传送)由2d引擎841执行,或者在显示时由显示控制器843使用覆盖显示平面代替。在一些实施例中,共享l3高速缓存875对于全部图形组件是可用的,从而允许在不使用主系统存储器的情况下共享数据。
118.在一些实施例中,图形处理器媒体流水线830包括媒体引擎837和视频前端834。在一些实施例中,视频前端834接收来自命令流播器803的流水线命令。在一些实施例中,媒体
流水线830包括单独的命令流播器。在一些实施例中,视频前端834在将命令发送至媒体引擎837之前处理媒体命令。在一些实施例中,媒体引擎837包括线程派生功能性来派生线程,以便经由线程分派器831分派到线程执行逻辑850。
119.在一些实施例中,图形处理器800包括显示引擎840。在一些实施例中,显示引擎840处于处理器800的外部,且经由环形互连802或某一其他互连总线或组构与图形处理器耦合。在一些实施例中,显示引擎840包括2d引擎841和显示控制器843。在一些实施例中,显示引擎840包含能独立于3d流水线操作的专用逻辑。在一些实施例中,显示控制器843与显示设备(未示出)耦合,该显示设备可以是系统集成的显示设备(如在膝上型计算机中),或者可以是经由显示设备连接器附连的外部显示设备。
120.在一些实施例中,几何流水线820和媒体流水线830可配置成基于多个图形和媒体编程接口执行操作,并且不特定于任何一个应用编程接口(api)。在一些实施例中,用于图形处理器的驱动器软件将特定于特定图形或媒体库的api调用转化成可由图形处理器处理的命令。在一些实施例中,为全部来自khronos group的开放图形库(opengl)、开放计算语言(opencl)和/或vulkan图形和计算api提供支持。在一些实施例中,还可为来自微软公司的direct3d库提供支持。在一些实施例中,可支持这些库的组合。还可为开源计算机视觉库(opencv)提供支持。如果可进行从未来api的流水线到图形处理器的流水线的映射,则具有兼容3d流水线的未来api也将被支持。
121.图形流水线编程图9a是图示了根据一些实施例的图形处理器命令格式900的框图。图9b是图示了根据实施例的图形处理器命令序列910的框图。图9a中的实线框图示了一般被包括在图形命令中的组成部分,而虚线包括可选的或者仅被包括在图形命令的子集中的组成部分。图9a的示例性图形处理器命令格式900包括用于标识命令的客户端902、命令操作代码(操作码)904和数据906的数据字段。在一些命令中还包括子操作码905和命令大小908。
122.在一些实施例中,客户端902指定处理命令数据的图形设备的客户端单元。在一些实施例中,图形处理器命令解析器检查每个命令的客户端字段以调节命令的进一步处理,并且将命令数据路由到适当的客户端单元。在一些实施例中,图形处理器客户端单元包括存储器接口单元、渲染单元、2d单元、3d单元和媒体单元。每个客户端单元具有处理命令的对应处理流水线。一旦由客户端单元接收到命令,客户端单元便读取操作码904和子操作码905(如果子操作码905存在的话),以确定要执行的操作。客户端单元使用数据字段906中的信息来执行命令。对于一些命令,预期显式命令大小908来指定命令的大小。在一些实施例中,命令解析器基于命令操作码来自动确定至少一些命令的大小。在一些实施例中,经由双字的倍数来对齐命令。可使用其他命令格式。
123.图9b中的流程图示了示例性图形处理器命令序列910。在一些实施例中,以图形处理器的实施例为特征的数据处理系统的软件或固件使用所示出的命令序列的版本来设定、执行和终止图形操作的集合。仅出于示例的目的示出并描述了样本命令序列,这是由于实施例不限于这些特定命令或此命令序列。另外,命令可作为命令序列中的批量命令被发布,使得图形处理器将至少部分并发地处理命令的序列。
124.在一些实施例中,图形处理器命令序列910可以以流水线转储清除命令912开始,以促使任何活动的图形流水线完成该流水线的当前未决命令。在一些实施例中,3d流水线
922和媒体流水线924不并发地操作。执行流水线转储清除以促使活动的图形流水线完成任何未决命令。响应于流水线转储清除,图形处理器的命令解析器将暂停命令处理,直至活动的绘图引擎完成未决操作并且相关的读取高速缓存失效。可选地,可将渲染高速缓存中标记为“脏”的任何数据转储清除到存储器。在一些实施例中,流水线转储清除命令912可被用于流水线同步,或者在将图形处理器置于低功率状态前被使用。
125.在一些实施例中,在命令序列要求图形处理器在流水线之间显式地切换时,使用流水线选择命令913。在一些实施例中,除非上下文要为两个流水线发布命令,在发布流水线命令前,在执行上下文内仅要求一次流水线选择命令913。在一些实施例中,紧接经由流水线选择命令913的流水线切换之前,要求流水线转储清除命令912。
126.在一些实施例中,流水线控制命令914配置图形流水线以用于操作,且被用于对3d流水线922和媒体流水线924进行编程。在一些实施例中,流水线控制命令914配置活动的流水线的流水线状态。在一个实施例中,流水线控制命令914被用于流水线同步,并且在处理一批命令前从活动的流水线内的一个或多个高速缓冲存储器中清除数据。
127.在一些实施例中,返回缓冲器状态命令916被用于为相应流水线配置返回缓冲器的集合以写入数据。一些流水线操作要求分配、选择或配置一个或多个返回缓冲器,在处理期间这些操作将中间数据写入到所述一个或多个返回缓冲器。在一些实施例中,图形处理器还使用一个或多个返回缓冲器来存储输出数据并且执行跨线程通信。在一些实施例中,返回缓冲器状态916包括选择要用于流水线操作的集合的返回缓冲器的大小和数量。
128.命令序列中的剩余命令基于用于操作的活动流水线而不同。基于流水线确定920,将命令序列定制到以3d流水线状态930开始的3d流水线922或者从媒体流水线状态940开始的媒体流水线924。
129.用于配置3d流水线状态930的命令包括3d状态设置命令,所述3d状态设置命令用于在处理3d图元命令之前要配置的顶点缓冲器状态、顶点元素状态、恒定颜色状态、深度缓冲器状态以及其他状态变量。至少部分基于使用中的特定3d api来确定这些命令的值。在一些实施例中,如果将不使用某些流水线元件,则3d流水线状态930命令还能够选择性地禁用或绕过那些元件。
130.在一些实施例中,3d图元932命令被用于提交要由3d流水线处理的3d图元。经由3d图元932命令传递到图形处理器的命令和相关联的参数被转发到图形流水线中的顶点提取功能。顶点提取功能使用3d图元932命令数据来生成顶点数据结构。顶点数据结构被存储在一个或多个返回缓冲器中。在一些实施例中,3d图元932命令被用于经由顶点着色器对3d图元执行顶点操作。为了处理顶点着色器,3d流水线922将着色器执行线程分派到图形处理器执行单元。
131.在一些实施例中,经由执行934命令或事件来触发3d流水线922。在一些实施例中,寄存器写入触发命令执行。在一些实施例中,经由命令序列中的“go”或“kick”命令来触发执行。在一个实施例中,使用流水线同步命令来触发命令执行以转储清除通过图形流水线的命令序列。3d流水线将执行3d图元的几何处理。一旦操作完成,所得到的几何对象便被光栅化,并且像素引擎对所得到的像素进行上色。对于那些操作,还可包括用于控制像素着色和像素后端操作的另外的命令。
132.在一些实施例中,在执行媒体操作时,图形处理器命令序列910沿着媒体流水线
924路径。一般而言,用于媒体流水线924的编程的特定使用和方式取决于要执行的媒体或计算操作。可在媒体解码期间将特定媒体解码操作卸载到媒体流水线。在一些实施例中,还可绕过媒体流水线,并且可使用由一个或多个通用处理核提供的资源来全部或部分地执行媒体解码。在一个实施例中,媒体流水线还包括用于通用图形处理器单元(gpgpu)操作的元件,其中图形处理器被用于使用计算着色器程序来执行simd向量运算,所述计算着色器程序与图形图元的渲染不是显式相关的。
133.在一些实施例中,以与3d流水线922类似的方式对媒体流水线924进行配置。将用于配置媒体流水线状态940的命令的集合分派或放置到在媒体对象命令942之前的命令队列中。在一些实施例中,用于媒体流水线状态940的命令包括用于配置媒体流水线元件的数据,所述媒体流水线元件将被用于处理媒体对象。这包括用于配置媒体流水线内的视频解码和视频编码逻辑的数据,诸如编码和解码格式。在一些实施例中,用于媒体流水线状态940的命令还支持使用到包含一批状态设置的“间接”状态元素的一个或多个指针。
134.在一些实施例中,媒体对象命令942将指针供应到媒体对象以便由媒体流水线处理。媒体对象包括存储器缓冲器,所述存储器缓冲器包含要处理的视频数据。在一些实施例中,在发布媒体对象命令942之前,所有媒体流水线状态必须是有效的。一旦配置了流水线状态并且将媒体对象命令942排队,就经由执行命令944或等效执行事件(例如,寄存器写入)来触发媒体流水线924。然后可通过由3d流水线922或媒体流水线924提供的操作对来自媒体流水线924的输出进行后处理。在一些实施例中,以与媒体操作类似的方式配置和执行gpgpu操作。
135.图形软件架构图10图示了根据一些实施例的用于数据处理系统1000的示例性图形软件架构。在一些实施例中,软件架构包括3d图形应用1010、操作系统1020和至少一个处理器1030。在一些实施例中,处理器1030包括图形处理器1032和一个或多个通用处理器核1034。图形应用1010和操作系统1020各自在数据处理系统的系统存储器1050中执行。
136.在一些实施例中,3d图形应用1010包含一个或多个着色器程序,该一个或多个着色器程序包括着色器指令1012。着色器语言指令可采用高级着色器语言,诸如direct3d的高级着色器语言(hlsl)或opengl着色器语言(glsl)等等。应用还包括采用适合由通用处理器核1034执行的机器语言的可执行指令1014。应用还包括由顶点数据定义的图形对象1016。
137.在一些实施例中,操作系统1020是来自微软公司的microsoft
®ꢀ
windows
®
操作系统、专有的类unix操作系统或使用linux内核的变型的开源类unix操作系统。操作系统1020可支持图形api 1022,诸如direct3d api、opengl api或vulkan api。当direct3d api在使用中时,操作系统1020使用前端着色器编译器1024来将采用hlsl的任何着色器指令1012编译成更低级着色器语言。编译可以是即时(jit)编译或者应用可执行着色器预编译。在一些实施例中,在3d图形应用1010的编译期间将高级着色器编译成低级着色器。在一些实施例中,以中间形式(诸如,由vulkan api使用的标准可移植中间表示(spir)的版本)提供着色器指令1012。
138.在一些实施例中,用户模式图形驱动器1026包含用于将着色器指令1012转换成硬件特定表示的后端着色器编译器xxxx。当opengl api在使用中时,将采用glsl高级语言的
着色器指令1012传递到用户模式图形驱动器1026以用于编译。在一些实施例中,用户模式图形驱动器1026使用操作系统内核模式功能1028来与内核模式图形驱动器1029通信。在一些实施例中,内核模式图形驱动器1029与图形处理器1032通信以分派命令和指令。
139.ip核实现至少一个实施例的一个或多个方面可由存储在机器可读介质上的代表性代码来实现,该代表性代码表示和/或定义诸如处理器的集成电路内的逻辑。例如,机器可读介质可包括表示处理器内的各种逻辑的指令。在由机器读取时,指令可促使机器制作逻辑以执行本文描述的技术。称为“ip核”的此类表示是用于集成电路的逻辑的可重复使用单元,该可重复使用单元可作为对集成电路的结构进行描述的硬件模型而被存储在有形机器可读介质上。可将硬件模型供应至各种客户或制造设施,所述客户或制造设施将硬件模型加载在制造集成电路的制作机器上。可制作集成电路,使得电路执行与本文描述的实施例中的任何实施例相关联的所描述的操作。
140.图11a是示出根据实施例的可被用于制造集成电路以执行操作的ip核开发系统1100的框图。ip核开发系统1100可被用于生成可被并入到更大的设计中或被用于构造完整集成电路(例如,soc集成电路)的模块化、可重复使用设计。设计设施1130可生成采用高级编程语言(例如,c/c )的ip核设计的软件仿真1110。软件仿真1110可被用于使用仿真模型1112来设计、测试和验证ip核的行为。仿真模型1112可包括功能、行为和/或时序仿真。然后可从仿真模型1112创建或合成寄存器传送级(rtl)设计1115。rtl设计1115是对硬件寄存器之间的数字信号流进行建模的集成电路的行为的抽象,包括使用建模的数字信号执行的相关联的逻辑。除rtl设计1115外,还可创建、设计或合成处于逻辑级或晶体管级的较低级设计。因此,初始设计和仿真的特定细节可变化。
141.可由设计设施将rtl设计1115或等效物进一步合成为硬件模型1120,该硬件模型1120可采用硬件描述语言(hdl)或物理设计数据的某种其他表示。可进一步对hdl进行仿真或测试以验证ip核设计。可使用非易失性存储器1140(例如,硬盘、闪速存储器或任何非易失性存储介质)来存储ip核设计以用于递送到第三方制作设施1165。备选的是,可通过有线连接1150或无线连接1160(例如,经由因特网)来传送ip核设计。制作设施1165然后可制作至少部分基于ip核设计的集成电路。制作的集成电路可被配置成执行根据本文描述的至少一个实施例的操作。
142.图11b图示了根据本文描述的一些实施例的集成电路封装组装件1170的截面侧视图。集成电路封装组装件1170图示了如本文描述的一个或多个处理器或加速器设备的实现。封装组装件1170包括连接到衬底1180的硬件逻辑1172、1174的多个单元。逻辑1172、1174可至少部分地以可配置逻辑或固定功能性逻辑硬件实现,并且可包括本文描述的(一个或多个)处理器核、(一个或多个)图形处理器或其他加速器设备中的任何设备的一个或多个部分。逻辑1172、1174的每个单元可在半导体管芯内被实现,并且经由互连结构1173与衬底1180耦合。互连结构1173可被配置成在逻辑1172、1174与衬底1180之间路由电信号,并且可包括互连,该互连诸如但不限于凸块(bump)或柱。在一些实施例中,互连结构1173可被配置成路由电信号,诸如,例如与逻辑1172、1174的操作相关联的输入/输出(i/o)信号和/或功率或接地信号。在一些实施例中,衬底1180可以是环氧基层压衬底。衬底1180可在其他实施例中包括其他合适类型的衬底。封装组装件1170可经由封装互连1183被连接到其他电
气设备。封装互连1183可被耦合到衬底1180的表面,以将电信号路由到其他电气设备,诸如主板、其他芯片组或多芯片模块。
143.在一些实施例中,逻辑1172、1174的单元与桥1182电耦合,该桥1182被配置成在逻辑1172、1174之间路由电信号。桥1182可以是为电信号提供路线(route)的密集互连结构。桥1182可包括由玻璃或合适的半导体材料构成的桥衬底。可在桥衬底上形成电路由部件(electrical routing feature),以在逻辑1172、1174之间提供芯片到芯片连接。
144.尽管图示了逻辑1172、1174的两个单元和桥1182,但是本文描述的实施例可包括在一个或多个管芯上的更多或更少逻辑单元。由于当逻辑被包括在单个管芯上时可排除桥1182,因此可通过零个或多于零个桥来连接一个或多个管芯。备选的是,可通过一个或多个桥来连接多个管芯或逻辑单元。另外,在其他可能配置(包括三维配置)中可将多个逻辑单元、管芯和桥连接在一起。
145.图11c图示了包括连接到衬底1180(例如,基础管芯)的硬件逻辑小芯片的多个单元的封装组装件1190。如本文描述的图形处理单元、并行处理器和/或计算加速器可由单独制造的多样化的硅小芯片构成。在此上下文中,小芯片是至少部分封装的集成电路,其包括可与其他小芯片被组装到更大封装中的逻辑的不同单元。带有不同ip核逻辑的小芯片的多样化集合可被组装到单个设备中。另外,可使用有源中介层(interposer)技术将小芯片集成到基础管芯或基础小芯片中。本文描述的概念能够实现gpu内的不同形式的ip之间的互连和通信。可使用不同工艺技术来制造并且在制造期间构成ip核,这避免了将多个ip(特别是在带有若干特点(flavors)ip的大的soc上)汇聚到相同制造工艺的复杂性。实现多个工艺技术的使用改进了推向市场的时间,并且提供了创建多个产品sku的有成本效益的方式。另外,解聚的ip更易于独立地被功率选通,在给定工作负载上不在使用中的组件可被断电,从而降低总体功率消耗。
146.硬件逻辑小芯片可包括专用硬件逻辑小芯片1172、逻辑或i/o小芯片1174和/或存储器小芯片1175。硬件逻辑小芯片1172和逻辑或i/o小芯片1174可至少部分地用可配置逻辑或固定功能性逻辑硬件实现,并且可包括(一个或多个)处理器核、(一个或多个)图形处理器、并行处理器或本文描述的其他加速器设备中的任何的一个或多个部分。存储器小芯片1175可以是dram(例如,gddr、hbm)存储器或高速缓冲(sram)存储器。
147.每个小芯片可被制作为单独的半导体管芯,并且经由互连结构1173与衬底1180耦合。互连结构1173可被配置成在各种小芯片与衬底1180内的逻辑之间路由电信号。互连结构1173可包括互连,诸如但不限于凸块或柱。在一些实施例中,互连结构1173可被配置成路由电信号,诸如,例如与逻辑、i/o和存储器小芯片的操作相关联的输入/输出(i/o)信号和/或功率或接地信号。
148.在一些实施例中,衬底1180是环氧基层压衬底。衬底1180可在其他实施例中包括其他合适类型的衬底。封装组装件1190可经由封装互连1183连接到其他电气设备。封装互连1183可被耦合到衬底1180的表面,以将电信号路由到其他电气设备,诸如主板、其他芯片组或多芯片模块。
149.在一些实施例中,逻辑或i/o小芯片1174和存储器小芯片1175可经由桥1187电耦合,该桥1187被配置成在逻辑或i/o小芯片1174与存储器小芯片1175之间路由电信号。桥1187可以是为电信号提供路由的密集互连结构。桥1187可包括由玻璃或合适的半导体材料
构成的桥衬底。可在桥衬底上形成电路由部件,以在逻辑或i/o小芯片1174与存储器小芯片1175之间提供芯片到芯片连接。桥1187还可被称为硅桥或互连桥。例如,在一些实施例中,桥1187是嵌入式多管芯互连桥(emib)。在一些实施例中,桥1187可只是从一个小芯片到另一小芯片的直接连接。
150.衬底1180可包括用于i/o 1191、高速缓冲存储器1192和其他硬件逻辑1193的硬件组件。组构1185可被嵌入在衬底1180中以能够实现在各种逻辑小芯片与衬底1180内的逻辑1191、1193之间的通信。在一个实施例中,i/o 1191、组构1185、高速缓存、桥和其他硬件逻辑1193可被集成到基础管芯中,该基础管芯被层叠在衬底1180顶上。
151.在各种实施例中,封装组装件1190可包括由组构1185或一个或多个桥1187互连的更少或更多数量的组件和小芯片。封装组装件1190内的小芯片可按在3d或2.5d布置来进行布置。一般而言,桥结构1187可被用于促进在例如逻辑或i/o小芯片与存储器小芯片之间的点到点互连。组构1185可被用于将各种逻辑和/或i/o小芯片(例如,小芯片1172、1174、1191、1193)与其他逻辑和/或i/o小芯片互连。在一个实施例中,衬底内的高速缓冲存储器1192可充当用于封装组装件1190的全局高速缓存、分布式全局高速缓存的一部分或者充当用于组构1185的专用高速缓存。
152.图11d图示了根据实施例的包括可互换小芯片1195的封装组装件1194。可互换小芯片1195可被组装到一个或多个基础小芯片1196、1198上的标准化槽中。基础小芯片1196、1198可经由桥互连1197被耦合,该桥互连1197可类似于本文描述的其他桥互连,并且可例如是emib。存储器小芯片还可经由桥互连被连接到逻辑或i/o小芯片。i/o和逻辑小芯片可经由互连组构通信。基础小芯片可各自支持采用标准化格式的一个或多个槽以用于逻辑或i/o或存储器/高速缓存中的一个。
153.在一个实施例中,可将sram和功率递送电路制作到基础小芯片1196、1198中的一个或多个基础小芯片中,所述基础小芯片1196、1198可使用相对于堆叠在基础小芯片顶上的可互换小芯片1195不同的工艺技术而被制作。例如,可使用更大的工艺技术来制作基础小芯片1196、1198,而可使用更小的工艺技术来制作可互换小芯片。可互换小芯片1195中的一个或多个可互换小芯片可以是存储器(例如,dram)小芯片。可基于针对使用封装组装件1194的产品的功率和/或性能,为封装组装件1194选择不同存储器密度。另外,可基于针对产品的功率和/或性能,在组装时选择带有不同数量的类型的功能单元的逻辑小芯片。另外,可将包含不同类型的ip逻辑核的小芯片插入到可互换小芯片槽中,能够实现可混合并匹配不同技术ip块的混合处理器设计。
154.示例性片上系统集成电路图12-13图示了根据本文描述的各种实施例的可使用一个或多个ip核而制作的示例性集成电路以及相关联的图形处理器。除了所示出的内容外,还可包括其他逻辑和电路,包括另外的图形处理器/核、外设接口控制器或通用处理器核。
155.图12是图示了根据实施例的可使用一个或多个ip核而制作的示例性片上系统集成电路1200的框图。示例性集成电路1200包括一个或多个应用处理器1205(例如,cpu)、至少一个图形处理器1210,且可另外包括图像处理器1215和/或视频处理器1220,以上处理器中的任何处理器可以是来自相同或多个不同设计设施的模块化ip核。集成电路1200包括外设或总线逻辑,所述外设或总线逻辑包括usb控制器1225、uart控制器1230、spi/sdio控制
器1235和i2s/i2c控制器1240。另外,集成电路可包括耦合到高清晰度多媒体接口(hdmi)控制器1250和移动工业处理器接口(mipi)显示接口1255中的一个或多个的显示设备1245。可通过包括闪速存储器和闪速存储器控制器的闪速存储器子系统1260来提供存储。可经由存储器控制器1265提供存储器接口以便访问sdram或sram存储器设备。一些集成电路另外包括嵌入式安全引擎1270。
156.图13-14是图示了根据本文描述的实施例的供soc内使用的示例性图形处理器的框图。图13图示了根据实施例的可使用一个或多个ip核而制作的片上系统集成电路的示例性图形处理器1310。图14图示了根据实施例的可使用一个或多个ip核而制作的片上系统集成电路的另外的示例性图形处理器1340。图13的图形处理器1310是低功率图形处理器核的示例。图14的图形处理器1340是更高性能图形处理器核的示例。图形处理器1310、1340中的每个图形处理器可以是图12的图形处理器1210的变型。
157.如图13中所示,图形处理器1310包括顶点处理器1305和一个或多个片段处理器1315a-1315n(例如,1315a、1315b、1315c、1315d到1315n-1和1315n)。图形处理器1310可经由单独的逻辑执行不同着色器程序,使得顶点处理器1305被优化以执行用于顶点着色器程序的操作,而一个或多个片段处理器1315a-1315n执行用于片段或像素着色器程序的片段(例如,像素)着色操作。顶点处理器1305执行3d图形流水线的顶点处理阶段,并且生成图元和顶点数据。(一个或多个)片段处理器1315a-1315n使用由顶点处理器1305生成的图元和顶点数据来产生在显示设备上显示的帧缓冲(framebuffer)。在一个实施例中,(一个或多个)片段处理器1315a-1315n被优化以执行如opengl api中提供的片段着色器程序,所述片段着色器程序可被用于执行与如针对在direct 3d api中提供的像素着色器程序类似的操作。
158.图形处理器1310另外包括一个或多个存储器管理单元(mmu)1320a-1320b、(一个或多个)高速缓存1325a-1325b和(一个或多个)电路互连1330a-1330b。一个或多个mmu 1320a-1320b为图形处理器1310(包括为顶点处理器1305和/或(一个或多个)片段处理器1315a-1315n)提供虚拟地址到物理地址映射,这些处理器除了引用在一个或多个高速缓存1325a-1325b中存储的顶点或图像/纹理数据之外还可引用在存储器中存储的顶点或图像/纹理数据。在一个实施例中,一个或多个mmu 1320a-1320b可与系统内的其他mmu同步,所述其他mmu包括与图12的一个或多个应用处理器1205、图像处理器1215和/或视频处理器1220相关联的一个或多个mmu,使得每个处理器1205-1220可参与到共享或统一的虚拟存储器系统中。根据实施例,一个或多个电路互连1330a-1330b使得图形处理器1310能够经由soc的内部总线或者经由直接连接来与soc内的其他ip核通过接口连接。
159.如图14中所示,图形处理器1340包括图13的图形处理器1310的一个或多个mmu 1320a-1320b、(一个或多个)高速缓存1325a-1325b和(一个或多个)电路互连1330a-1330b。图形处理器1340包括提供统一着色器核架构的一个或多个着色器核1355a-1355n(例如,1455a、1355b、1355c、1355d、1355e、1355f到1355n-1和1355n),在该统一着色器核架构中单个核或类型或核可执行全部类型的可编程着色器代码,其包括用于实现顶点着色器、片段着色器和/或计算着色器的着色器程序代码。存在的着色器核的确切数量可在实施例和实现之间变化。另外,图形处理器1340包括核间任务管理器1345,该核间任务管理器1345充当用于将执行线程分派到一个或多个着色器核1355a-1355n的线程分派器;以及用于为基于
贴片的渲染加速拼贴操作的拼贴单元1358,在该基于贴片的渲染中,用于场景的渲染操作在图像空间中被细分,例如以利用场景内的局部空间相干性或优化内部高速缓存的使用。
160.具有机器学习的光线追踪如上所提及,光线追踪是图形处理技术,其中通过基于物理的渲染来仿真光传输。光线追踪中的关键操作之一是:处理可见性查询,其需要包围体层级(bvh)中的节点的遍历和交叉测试。
161.基于光线和路径追踪的技术通过下述操作来计算图像:追踪经过每个像素的光线和路径,并使用随机采样以计算高级效果,诸如阴影、光泽度、间接照明等。使用仅几个样本是快速的,但产生有噪图像,而使用许多样本产生高质量图像,但成本过高。
162.机器学习包括能够逐步地改进指定任务的性能或逐步地呈现更准确预测或决策的任何电路、程序代码或其组合。一些机器学习引擎可以执行这些任务或呈现这些预测/决策,而不显式地被编程成执行任务或呈现预测/决策。存在多种机器学习技术,包括(但不限于)受监督和半监督学习、无监督学习和强化学习。
163.在最近若干年中,对针对实时使用的光线/路径追踪的突破性解决方案已经以“去噪”的形式出现——使用图像处理技术以从有噪低样本计数输入产生高质量滤波/去噪图像的过程。最有效的去噪技术依赖于机器学习技术,其中机器学习引擎学习有噪图像在它已利用更多样本而计算的情况下将很可能看上去像什么。在一个特定实现中,机器学习由卷积神经网络(cnn)执行,然而,本发明的基础原理不限于cnn实现。在这种实现中,利用低样本计数输入和真正事实产生训练数据。cnn被训练成预测来自所讨论的像素周围的有噪像素输入的邻域的收敛像素。
164.尽管不完美,但该基于ai的去噪技术已经证明为出人意料地有效。然而,警告是需要良好训练数据,这是由于否则网络可能预测错误结果。例如,如果动画电影工作室训练了具有陆地上的场景的过去电影上的去噪cnn且然后试图使用经训练的cnn以对来自水上的新电影片场的帧进行去噪,则去噪操作将次优地执行。
165.为了解决该问题,可以在渲染的同时动态地收集学习数据,并且机器学习引擎(诸如,cnn)可以是基于当前在其上运行它的数据来连续训练的,从而针对手边的任务而连续地改进机器学习引擎。因此,训练阶段仍然可以在运行时之前被执行,但被继续以在运行时期间按照需要调整机器学习权重。由此,通过将学习数据的生成限于每帧或每n个帧的图像的子区,来避免计算训练所需的参考数据的高成本。特别地,生成帧的有噪输入,以用于利用当前网络对全部帧进行去噪。另外,生成和使用参考像素的小区以用于连续训练,如下所述。
166.尽管本文描述了cnn实现,但可以使用任何形式的机器学习引擎,包括但不限于执行受监督学习(例如,构建包含输入和期望输出两者的数据集的数学模型)、无监督学习(例如,其评估针对某些类型的结构的输入数据)、和/或受监督和无监督学习的组合。
167.现有去噪实现在训练阶段和运行时阶段中操作。在训练阶段期间,定义了网络拓扑,其接收具有各种每像素数据通道(诸如,像素颜色、深度、法线、法线偏差、图元id和反照率)的n
×
n像素的区,并生成最终像素颜色。使用一个帧价值的低样本计数输入且参考利用非常高样本计数而计算的“期望”像素颜色来生成“代表性”训练数据的集合。针对这些输入而训练网络,从而生成针对网络的“理想”权重的集合。在这些实现中,参考数据用于训练网
络的权重,以将网络的数据最接近地匹配到期望结果。
168.在运行时,加载给定的预先计算的理想网络权重并且对网络进行初始化。对于每个帧,生成去噪输入(即,与用于训练相同)的低样本计数图像。对于每个像素,像素的输入的给定邻域穿过网络,以预测“去噪的”像素颜色,从而生成去噪帧。
169.图15图示了初始训练实现。机器学习引擎1500(例如,cnn)接收具有各种每像素数据通道(诸如,像素颜色、深度、法线、法线偏差、图元id和反照率)的n
×
n像素的区作为高样本计数图像数据1702,并生成最终像素颜色。使用一个帧价值的低样本计数输入1501来生成代表性训练数据。针对这些输入而训练网络,从而生成机器学习引擎1500后续使用以在运行时对低样本计数图像进行去噪的“理想”权重1505的集合。
170.为了改进上述技术,增强用于每帧或帧子集(例如,每n个帧,其中n = 2、3、4、10、25等)生成新训练数据的去噪阶段。特别地,如图16中所图示,选择每个帧中的一个或多个区,这里被称作“新参考区”1602,其利用高样本计数而渲染成单独高样本计数缓冲区1604。低样本计数缓冲区1603存储低样本计数输入帧1601(包括与新参考区1602相对应的低样本区1604)。
171.可以随机选择新参考区1602的位置。可替换地,可以以针对每个新帧预先指定的方式(例如,使用帧之间的区的预定义移动,该区限于帧的中心处的指定区等)调整新参考区1602的位置。
172.不论如何选择新参考区,它都被机器学习引擎1600使用以持续地刷新和更新用于去噪的经训练的权重1605。特别地,渲染来自每个新参考区1602的参考像素颜色和来自对应低样本计数区1607的有噪参考像素输入。然后在机器学习引擎1600上使用高样本计数参考区1602和对应低样本计数区1607来执行补充训练。相比于初始训练,该训练是在运行时期间针对每个新参考区1602连续执行的——从而确保机器学习引擎1600被精确地训练。例如,可以评估每像素数据通道(例如像素颜色、深度、法线、法线偏差等),机器学习引擎1600使用该每像素数据通道以作出对经训练的权重1605的调整。如在训练情况(图15)中那样,针对理想权重1605的集合而训练机器学习引擎1600,以用于从低样本计数输入帧1601移除噪声,以生成去噪帧1620。然而,基于新类型的低样本计数输入帧1601的新图像特性来持续地更新经训练的权重1605。
173.可以在图形处理器单元(gpu)或主机处理器上的后台进程中并发地执行由机器学习引擎1600执行的再训练操作。可被实现为驱动器组件和/或gpu硬件组件的渲染循环可以连续地产生它放置在队列中的新训练数据(例如,以新参考区1602的形式)。在gpu或主机处理器上执行的后台训练进程可以从该队列连续地读取新训练数据,再训练机器学习引擎1600,并以适当间隔利用新权重1605更新它。
174.图17图示了其中后台训练进程1700由主机cpu 1710实现的一个这种实现的示例。特别地,后台训练进程1700使用高样本计数新参考区1602和对应低样本区1604以持续地更新经训练的权重1605,从而更新机器学习引擎1600。
175.如图18a中针对多玩家在线游戏的非限制性示例而图示的那样,不同主机1820-1822个体地生成后台训练进程1700a-c向服务器1800(例如,诸如游戏服务器)传输的参考区。服务器1800然后在机器学习引擎1810上使用从主机1821-1822中的每一个接收的新参考区来执行训练,从而如前所述更新权重1805。它将这些权重1805传输到存储权重1605a-c
的主机1820,从而更新每个个体机器学习引擎(未示出)。因为可以在短时间段中给服务器1800提供大量参考区,所以它可以高效且精确地更新针对正在由用户执行的任何给定应用(例如,在线游戏)的权重。
176.如图18b中所图示,不同主机可以生成新的经训练的权重(例如,如前所述基于训练/参考区1602)并与服务器1800(例如,诸如游戏服务器)共享新的经训练的权重,或者可替换地使用对等共享协议。服务器上的机器学习管理组件1810使用从主机中的每一个接收的新权重来生成组合权重1805的集合。组合权重1805例如可以是从新权重生成且如本文描述的那样持续更新的平均值。一旦被生成,就可以传输组合权重1605a-c的拷贝并将其存储在主机1820-1821中的每一个上,主机1820-1821然后可以如本文描述的那样使用组合权重以执行去噪操作。
177.半闭环更新机制也可以被硬件制造商使用。例如,参考网络可以被包括,作为由硬件制造商分发的驱动器的一部分。随着驱动器使用本文描述的技术来生成新训练数据并将这些连续地提交回到硬件制造商,硬件制造商使用该信息以继续针对新驱动器更新而改进其机器学习实现。
178.在示例实现中(例如,在渲染场上的批量电影渲染中),渲染器将新生成的训练区传输到专用服务器或数据库(处于该工作室的渲染场中),该专用服务器或数据库随时间从多个渲染节点聚集该数据。单独机器上的单独进程连续地改进工作室的专用去噪网络,并且新渲染器作业始终使用最近训练的网络。
179.在图19中图示了机器学习方法。该方法可以被实现在本文描述的架构上,但不限于任何特定系统或图形处理架构。
180.在1901处,作为初始训练阶段的一部分,针对多个图像帧生成低样本计数图像数据和高样本计数图像数据。在1902处,使用高/低样本计数图像数据来训练机器学习去噪引擎。例如,可以根据训练来更新与像素特征相关联的卷积神经网络权重的集合。然而,可以使用任何机器学习架构。
181.在1903处,在运行时,连同具有高样本计数的至少一个参考区一起生成低样本计数图像帧。在1904处,由机器学习引擎和/或单独训练逻辑(例如,后台训练模块1700)使用高样本计数参考区,以持续地刷新机器学习引擎的训练。例如,可以结合低样本计数图像的对应部分而使用高样本计数参考区,以继续向机器学习引擎1904教导如何最有效地执行去噪。在cnn实现中,例如,这可以涉及更新与cnn相关联的权重。
182.可以实现上述多个变型,诸如,对到机器学习引擎的反馈回路进行配置的方式、生成训练数据的实体、将训练数据反馈到训练引擎的方式、以及如何将改进的网络提供给渲染引擎。另外,尽管上述示例使用单个参考区来执行连续训练,但可以使用任何数量的参考区。此外,如前所提及,参考区可以是不同大小的,可以是在不同数量的图像帧上使用的,且可以使用不同技术(例如随机、根据预定模式等)而定位在图像帧内的不同位置中。
183.另外,尽管卷积神经网络(cnn)被描述为机器学习引擎1600的一个示例,但本发明的基础原理可以是使用能够使用新训练数据持续刷新其结果的机器学习引擎的任何形式来实现的。作为示例而非限制,其他机器学习实现包括成组数据处理方法(gmdh)、长短期存储器、深度储藏库计算、深度信任网络、张量深度堆叠网络和深度预测编码网络,仅举几例。
184.用于高效分布式去噪的装置和方法
如上所述,去噪已经变为用于利用平滑无噪图像的实时光线追踪的关键特征。渲染可以跨多个设备上的分布式系统而完成,但到目前为止,现有去噪框架全部在单个机器上的单个实例上操作。如果渲染正在跨多个设备而完成,则它们可能未全部渲染可访问以用于计算图像的去噪部分的像素。
185.呈现了与基于人工智能(ai)和非ai两者的去噪技术一起工作的分布式去噪算法。图像的区已经根据分布式渲染操作而跨节点分布,或者根据单个帧缓冲而分开和分布。在需要时从相邻节点采集计算足够去噪所需的相邻区的鬼区,并且将最终所得贴片复合成最终图像。
186.分布式处理图20图示了执行渲染的多个节点2021-2023。尽管为了简明而图示了仅三个节点,但本发明的基础原理不限于任何特定数量的节点。事实上,可以使用单个节点以实现本发明的某些实施例。
187.节点2021-2023各自渲染图像的部分,从而得到该示例中的区2011-2013。尽管在图20中示出了矩形区2011-2013,但可以使用任何形状的区并且任何设备可以处理任何数量的区。节点执行充分平滑的去噪操作所需的区被称作鬼区2011-2013。换言之,鬼区2001-2003表示以指定质量水平执行去噪所需的整个数据。降低质量水平减小了鬼区的大小且因而减少了所需的数据量,并且提高质量水平增大了鬼区和所需的对应数据。
188.如果诸如节点2021之类的节点确实具有鬼区2001的以指定质量水平对其区2011进行去噪所需的部分的本地拷贝,则该节点将从一个或多个“邻近”节点(诸如,拥有如所图示的鬼区2001的部分的节点2022)检索所需数据。类似地,如果节点2022确实具有鬼区2002的以指定质量水平对其区2012进行去噪所需的部分的本地拷贝,则节点2022将从节点2021检索所需鬼区数据2032。可以在总线、互连、高速存储器组构、网络(例如,高速以太网)上执行检索,或者检索甚至可以是能够在多个核(例如,用于以极端分辨率或时变地渲染大图像)之间分发渲染工作的多核芯片中的片上互连。每个节点2021-2023可以包括个体执行单元或者图形处理器内的执行单元的指定集合。
189.要发送的指定数据量取决于正在使用的去噪技术。此外,来自鬼区的数据可以包括改进每个相应区的去噪所需的任何数据。例如,鬼区数据可以包括图像颜色/波长、强度/阿尔法数据和/或法线。然而,本发明的基础原理不限于鬼区数据的任何特定集合。
190.另外细节对于较慢网络或互连,可以使用现有通用无损或有损压缩来利用该数据的压缩。示例包括但不限于zlib、gzip和伦佩尔-齐夫-马尔可夫链算法(lzma)。可以通过注意到帧之间的光线命中信息中的增量可以相当稀疏来使用进一步内容特定压缩,并且当节点已经具有从先前帧采集的增量时,仅有对该增量作出贡献的样本需要被发送。这些可以被选择性地推送到采集那些样本的节点i,或者节点i可以请求来自其他节点的样本。无损压缩用于某些类型的数据和程序代码,而有损数据用于其他类型的数据。
191.图21图示了节点2021-2022之间的交叉的另外细节。每个节点2021-2022包括用于渲染相应图像区2011-2012和鬼区2001-2002的光线追踪渲染电路系统2081-2082。去噪器2100-2111分别对每个节点2021-2022负责渲染和去噪的区2011-2012执行去噪操作。去噪器2021-2022例如可以包括用于分别生成去噪区2121-2122的电路系统、软件或其任何组
合。如所提及的那样,在生成去噪区时,去噪器2021-2022可能需要依赖于不同节点所拥有的鬼区内的数据(例如,去噪器2100可能需要来自节点2022所拥有的鬼区2002的数据)。
192.因此,去噪器2100-2111可以使用分别来自区2011-2012和鬼区2001-2002的数据来生成去噪区2121-2122,该数据的至少部分可以是从另一节点接收的。区数据管理器2101-2102可以如本文所描述的那样管理来自鬼区2001-2002的数据传送。压缩器/解压缩器单元2131-2132可以分别执行在节点2021-2022之间交换的鬼区数据的压缩和解压缩。
193.例如,节点2021的区数据管理器2101可以在从节点2022请求时将来自鬼区2001的数据发送到压缩器/解压缩器2131,压缩器/解压缩器2131压缩数据以生成它向节点2022传输的经压缩的数据2106,从而减小互连、网络、总线或其他数据通信链路上的带宽。节点2022的压缩器/解压缩器2132然后对经压缩的数据2106进行解压缩,并且去噪器2111使用经解压缩的鬼数据以生成比在仅有来自区2012的数据的情况下将可能的质量更高的质量的去噪区2012。区数据管理器2102可以将来自鬼区2001的经解压缩的数据存储在高速缓存、存储器、寄存器堆或其他储存器中,以在生成去噪区2122时使它可用于去噪器2111。可以执行操作的类似集合以将来自鬼区2002的数据提供给节点2021上的去噪器2100,去噪器2100结合来自区2011的数据而使用该数据以生成更高质量的去噪区2121。
194.抓取数据或渲染如果诸如节点2021-2022之类的设备之间的连接是缓慢的(即,比阈值时延和/或阈值带宽慢),则本地渲染鬼区而不是请求来自其他设备的结果可能更快。这可以是通过下述操作来在运行时确定的:跟踪针对鬼区大小的网络交易速度和线性外插渲染时间。在渲染出整个鬼区更快的这种情况下,多个设备可以最后渲染图像的相同部分。可以基于基础区的方差和所确定的模糊程度来调整鬼区的所渲染的部分的分辨率。
195.负载平衡可以使用静态和/或动态负载平衡方案以在各种节点2021-2023之间分发处理负载。对于动态负载平衡,由去噪滤波器确定的方差可能在去噪中需要更多时间,但利用低方差和需要更少样本的图像的模糊区驱动用于渲染场景的特定区的样本的量。可以基于来自先前帧的数据来动态地调整被指派给特定节点的特定区,或者在设备正在渲染时跨设备动态地传送该特定区,使得所有设备将具有相同量的工作。
196.图22图示了在每个相应节点2021-2022上运行的监视器2201-2202如何采集性能度量数据,包括但不限于在网络接口2211-2212上传输数据所耗费的时间、在对区进行去噪(在具有鬼区数据的情况下以及在没有鬼区数据的情况下)时耗费的时间、以及渲染每个区/鬼区所耗费的时间。监视器2201-2202将这些性能度量报告回到管理器或负载平衡器节点2201,管理器或负载平衡器节点2201分析数据以识别每个节点2021-2022上的当前工作负载并潜在地确定处理各种去噪区2121-2122的更高效模式。管理器节点2201然后根据所检测到的负载将针对新区的新工作负载分发到节点2021-2022。例如,管理器节点2201可以将更多工作传输到未重加载的那些节点,和/或重新分配来自过载的那些节点的工作。另外,负载平衡器节点2201可以传输重配置命令以调整由节点中的每一个执行渲染和/或去噪的特定方式(上面描述了其一些示例)。
197.确定鬼区可以基于由去噪器2100-2111实现的去噪算法来确定鬼区2001-2002的大小和形
状。它们的相应大小然后可以是基于被去噪的样本的所检测到的方差来动态修改的。用于ai去噪自身的学习算法可以用于确定适当区大小,或者在诸如双侧模糊之类的其他情况下,预定滤波器带宽将确定鬼区2001-2002的大小。在使用学习算法的示例性实现中,可以在管理器节点2201上执行机器学习引擎,和/或可以在个体节点2021-2023中的每一个上执行机器学习的部分(参见例如图18a-b和以上关联文本)。
198.收集最终图像可以通过从节点2021-2023中的每一个收集所渲染且经去噪的区来收集最终图像,而无需鬼区或法线。在图22中,例如,去噪区2121-2122被传输到管理器节点2201的区处理器2280,其对区进行组合以生成最终去噪图像2290,然后,最终去噪图像2290被显示在显示器2290上。区处理器2280可以使用多种2d复合技术来对区进行组合。尽管被图示为单独组件,但区处理器2280和去噪图像2290可以是显示器2290的组成部分。各种节点2021-2022可以使用直接发送技术以传输去噪区2121-2122,并潜在地使用区数据的各种有损或无损压缩。
199.ai去噪仍然是高成本操作,并且随着游戏移动到云中。由此,跨多个节点2021-2022的去噪的分布式处理可能变为实现用于传统游戏的实时帧速率或者需要更高帧速率的虚拟现实(vr)所必需。电影工作室还常常在可以用于更快去噪的大渲染场中渲染。
200.在图23中图示了用于执行分布式渲染和去噪的示例性方法。该方法可以是在上述系统架构的上下文内实现的,但不限于任何特定系统架构。
201.在2301处,将图形工作分派到多个节点,该多个节点执行光线追踪操作以渲染图像帧的区。每个节点可能已经具有在存储器中执行操作所需的数据。例如,节点中的两个或更多个可以共享公共存储器,或者节点的本地存储器可能已经存储来自在先光线追踪操作的数据。可替换地或另外,可以将某个数据传输到每个节点。
202.在2302处,确定指定水平的去噪(即,在可接受性能水平处)所需的“鬼区”。鬼区包括执行指定水平的去噪所需的任何数据,包括一个或多个其他节点所拥有的数据。
203.在2303处,在节点之间交换与鬼区(或其部分)相关的数据。在2304处,每个节点在其相应区上执行去噪(例如,使用所交换的数据),并且在2305处,对结果进行组合以生成最终去噪图像帧。
204.诸如图22中所示的管理器节点或主节点可以将工作分派到节点,且然后对由节点执行的工作进行组合以生成最终图像帧。可以使用基于对等端的架构,其中节点是交换数据以对最终图像帧进行渲染和去噪的对等端。
205.本文描述的节点(例如,节点2021-2023)可以是经由高速网络而互连的图形处理计算系统。可替换地,节点可以是耦合到高速存储器组构的个体处理元件。所有节点可以共享公共虚拟存储器空间和/或公共物理存储器。可替换地,节点可以是cpu和gpu的组合。例如,上述管理器节点2201可以是cpu和/或在cpu上执行的软件,并且节点2021-2022可以是gpu和/或在gpu上执行的软件。可以使用各种不同类型的节点,同时仍符合本发明的基础原理。
206.示例神经网络实现存在许多类型的神经网络;简单类型的神经网络是前馈网络。前馈网络可被实现为其中节点用层布置的非循环图(acyclic graph)。通常,前馈网络拓扑包括被至少一个隐
藏层分开的输入层和输出层。隐藏层将输入层接收的输入变换为对在输出层中生成输出有用的表示。网络节点经由边而完全连接到邻近层中的节点,但在每个层内的节点之间没有边。在前馈网络的输入层的节点处接收的数据经由激活函数而被传播(即,“前馈”)到输出层的节点,该激活函数基于分别与连接层的边中的每个相关联的系数(“权重”)计算网络中的每个连续层的节点的状态。根据由被执行的算法表示的特定模型,来自神经网络算法的输出可采取各种形式。
207.在机器学习算法可用于对特定问题进行建模之前,使用训练数据集来训练算法。训练神经网络涉及选择网络拓扑、使用表示正被网络建模的问题的训练数据的集合以及调整权重直到网络模型以最小误差对训练数据集的所有实例执行。例如,在对于神经网络的受监督学习训练过程期间,网络响应于表示训练数据集中的实例的输入而产生的输出与对该实例的“正确的”经标记的输出比较,计算表示输出与经标记的输出之间的差异的误差信号,并且调整与连接相关联的权重以在误差信号通过网络层向后传播时使该误差最小化。在对于从训练数据集的实例生成的输出中的每个的误差被最小化时,网络被认为是“经训练的”。
208.机器学习算法的准确度可明显受到用于训练算法的数据集的质量的影响。训练过程可以是计算密集的并且在常规的通用处理器上可能需要大量时间。相应地,并行处理硬件用于训练许多类型的机器学习算法。这对于优化神经网络的训练特别有用,这是因为在调整神经网络中的系数时执行的计算使得它们自身自然地有助于并行实现。具体地,许多机器学习算法和软件应用已适合于利用通用图形处理设备内的并行处理硬件。
209.图24是机器学习软件栈200的通用图。机器学习应用2402可配置成使用训练数据集来训练神经网络或使用经训练的深度神经网络来实现机器智能。机器学习应用2402可包括用于神经网络的训练和推理功能性和/或可用于在部署之前训练神经网络的专用软件。机器学习应用2402可实现任何类型的机器智能,其包括但不限于图像识别、测绘(mapping)和定位(localization)、自主导航、话音合成、医学成像或语言翻译。
210.用于机器学习应用2402的硬件加速可经由机器学习框架2404而启用。机器学习框架2404可以被实现在本文描述的硬件上,该硬件诸如是包括本文描述的处理器和组件的处理系统100。针对图24而描述的与本文中任何其他图的元件具有相同或类似名称的元件描述与在其他图中相同的元件,可以以与其类似的方式操作或起作用,可以包括相同组件,且可以链接到其他实体,如本文其他地方描述的那些实体,但不限于此。机器学习框架2404可提供机器学习图元库。机器学习图元是机器学习算法普遍执行的基本操作。在没有机器学习框架2404的情况下,将需要机器学习算法的开发人员创建和优化与机器学习算法相关联的主计算逻辑,然后在开发新的并行处理器时重新优化计算逻辑。取而代之,机器学习应用可配置成使用机器学习框架2404提供的图元来执行必要的计算。示例性图元包括张量卷积、激活函数和池化,它们是在训练卷积神经网络(cnn)时执行的计算操作。机器学习框架2404还可提供图元来实现由许多机器学习算法执行的基本线性代数子程序,例如矩阵和向量运算。
211.机器学习框架2404可处理从机器学习应用2402接收的输入数据并且生成到计算框架2406的合适输入。计算框架2406可抽取被提供给gpgpu驱动器2408的底层指令,以使机器学习框架2404能够经由gpgpu硬件2410利用硬件加速而不需要机器学习框架2404深入了
解gpgpu硬件2410的架构。另外,计算框架2406可对机器学习框架2404实现跨多种类型和代际的gpgpu硬件2410的硬件加速。
212.gpgpu机器学习加速图25图示了多gpu计算系统2500,其可以是处理系统100的变型。因此,本文与处理系统100结合的任何特征的公开内容还公开了与多gpu计算系统2500的对应结合,但不限于此。图25的与本文中任何其他图的元件具有相同或类似名称的元件描述与在其他图中相同的元件,可以以与其类似的方式操作或起作用,可以包括相同组件,且可以链接到其他实体,如本文其他地方描述的那些实体,但不限于此。多gpu计算系统2500可包括处理器2502,其经由主机接口开关2504耦合到多个gpgpu 2506a-d。主机接口开关2504可以例如是pci express开关设备,其将处理器2502耦合到pci express总线,处理器2502通过该pci express总线可与一组gpgpu 2506a-d通信。多个gpgpu 2506a-d中的每个可以是上述gpgpu的实例。gpgpu 2506a-d可经由一组高速点到点gpu到gpu链路2516互连。高速gpu到gpu链路可经由专用gpu链路而连接到gpgpu 2506a-d中的每个。p2p gpu链路2516在gpgpu 2506a-d中的每个之间实现直接通信而不需要在处理器2502连接到的主机接口总线上通信。利用被引导到p2p gpu链路的gpu到gpu业务,主机接口总线仍然可用于系统存储器访问或者例如经由一个或多个网络设备与多gpu计算系统2500的其他实例通信。取代经由主机接口开关2504将gpgpu 2506a-d连接到处理器2502,处理器2502可包括对p2p gpu链路2516的直接支持且因而直接连接到gpgpu 2506a-d。
213.机器学习神经网络实现本文描述的计算架构可配置成执行特别适合于训练和部署神经网络以用于机器学习的并行处理的类型。神经网络可归纳为具有图关系的功能的网络。如在本领域内众所周知的,存在多种类型的神经网络实现在机器学习中使用。一个示例性类型的神经网络是前馈网络,如之前描述的那样。
214.第二个示例性类型的神经网络是卷积神经网络(cnn)。cnn是用于处理具有已知的网格状拓扑的数据(诸如图像数据)的专门前馈神经网络。相应地,cnn通常用于计算视觉和图像识别应用,但它们也可用于其他类型的模式识别,诸如话音和语言处理。cnn输入层中的节点被组织成一组“滤波器”(受在视网膜中发现的接受野启发的特征检测器),并且每组滤波器的输出被传播到网络的连续层中的节点。对于cnn的计算包括对每个滤波器应用卷积数学运算来产生该滤波器的输出。卷积是由两个函数执行以产生第三函数的专门种类的数学运算,该第三函数是该两个原始函数中的一个的修改后的版本。在卷积网络术语中,到卷积的第一函数可称为输入,而第二函数可称为卷积内核。输出可称为特征图。例如,到卷积层的输入可以是定义输入图像的各种颜色分量的多维阵列的数据。卷积内核可以是多维阵列的参数,其中这些参数由训练过程针对神经网络而适配。
215.递归神经网络(rnn)是前馈神经网络族,其包括层之间的反馈连接。rnn通过跨神经网络的不同部分共享参数数据来启用对顺序数据的建模。rnn的架构包括循环。循环表示变量的当前值在未来时间处对它自身值的影响,这是因为来自rnn的输出数据的至少一部分被用作反馈以用于处理序列中的后续输入。该特征由于可在其中组成语言数据的变量性质而使得rnn对于语言处理特别有用。
216.下文描述的图呈现示例性前馈、cnn和rnn网络,以及描述用于分别训练和部署那
些类型的网络中的每个的通用过程。将理解这些描述是示例性且非限制性的并且所图示的概念一般可应用于深度神经网络和一般的机器学习技术。
217.上文描述的示例性神经网络可用于执行深度学习。深度学习是使用深度神经网络的机器学习。在深度学习中使用的深度神经网络是由多个隐藏层组成的人工神经网络,这与只包括单个隐藏层的浅层神经网络相对。更深层神经网络通常在计算上更密集来训练。然而,网络的另外隐藏层实现多步模式识别,其相对于浅层机器学习技术导致输出误差减小。
218.在深度学习中使用的深度神经网络通常包括耦合到后端网络的前端网络,用于执行特征识别,该后端网络表示可基于被提供给模型的特征表示来执行操作(例如,对象分类、话音识别等)的数学模型。深度学习使机器学习能够被执行而不需要对模型执行手工特征工程化。取而代之,深度神经网络可基于输入数据内的统计结构或相关性来学习特征。习得的特征可被提供给数学模型,其可将所检测到的特征映射到输出。网络使用的数学模型一般专门针对待执行的特定任务,并且不同模型将用于执行不同任务。
219.一旦神经网络被结构化,学习模型就可应用于网络来训练网络以执行特定任务。学习模型描述了如何调整模型内的权重来减小网络的输出误差。误差后向传播是用于训练神经网络的常见方法。向网络呈现输入向量以用于处理。使用损耗函数将网络的输出与期望输出进行比较并且对输出层中的神经元中的每个计算误差值。然后,误差值被向后传播直到每个神经元具有关联的误差值,其大致表示它对原始输出的贡献。然后,网络可使用算法(诸如随机梯度下降算法)从那些误差中学习,以更新神经网络的权重。
220.图26-27图示了示例性卷积神经网络。图26图示了cnn内的各种层。如图26中所示,用于对图像处理进行建模的示例性cnn可接收输入2602,其描述输入图像的红、绿和蓝(rgb)分量。输入2602可被多个卷积层(例如,卷积层2604、卷积层2606)处理。来自多个卷积层的输出可以可选地被一组全连接层2608处理。全连接层中的神经元具有到之前的层中的所有激活的全连接,如之前针对前馈网络描述的那样。来自全连接层2608的输出可用于从网络生成输出结果。全连接层2608内的激活可使用矩阵乘法而不是卷积而计算。不是所有的cnn实现都利用全连接层。例如,在一些实现中,卷积层2606能够为cnn生成输出。
221.卷积层是稀疏连接的,这与在全连接层2608中发现的传统神经网络配置不同。传统神经网络层是全连接的,使得每个输出单元与每个输入单元交互。然而,如所图示的那样,因为场的卷积的输出是到后续层的节点的输入(而不是场中的节点中的每个节点的相应状态值),所以卷积层是稀疏连接的。与卷积层相关联的内核执行卷积运算,其输出被发送给下一个层。在卷积层内执行的降维是使cnn能够放缩以处理大图像的一个方面。
222.图27图示了cnn的卷积层内的示例性计算级。到cnn的卷积层2712的输入可在卷积层2714的三个级中被处理。这三个级可包括卷积级2716、检测器级2718和池化级2720。然后,卷积层2714可向连续卷积层输出数据。网络的最终卷积层可生成输出特征图数据或向全连接层提供输入,例如以对到cnn的输入生成分类值。
223.在卷积级2716中并行执行若干卷积以产生一组线性激活。卷积级2716可包括仿射变换,其是可被规定为线性变换加平移的任何变换。仿射变换包括这些变换的旋转、平移、缩放和组合。卷积级计算连接到输入中的特定区的功能(例如,神经元)的输出,该特定区可被确定为与神经元相关联的局部区。神经元计算神经元的权重与神经元连接到的局部输入
中的区之间的点积。来自卷积级2716的输出定义被卷积层2714的连续级所处理的一组线性激活。
224.线性激活可被检测器级2718处理。在检测器级2718中,每个线性激活被非线性激活函数处理。该非线性激活函数使整体网络的非线性性质增加而不影响卷积层的相应场。可使用若干类型的非线性激活函数。一个特定类型是整流线性单元(relu),其使用被定义为 f(x)=max(0,x)的激活函数,使得激活被阈值化在零处。
225.池化级2720使用池化函数,其用附近输出的汇总统计来代替卷积层2706的输出。池化函数可用于将平移不变性引入神经网络,使得对输入的小平移不改变池化输出。局部平移的不变性在输入数据中特征的存在比特征的精确位置更重要的场景中可以是有用的。在池化级2720期间可使用各种类型的池化函数,其包括最大池化、平均池化和l2范数池化。另外,一些cnn实现不包括池化级。取而代之,这样的实现替代相对于之前的卷积级具有增加步幅的另外卷积级。
226.然后,来自卷积层2714的输出可被下一个层2722处理。下一个层2722可以是另外卷积层,或全连接层2708中的一个。例如,图27的第一卷积层2704可向第二卷积层2706输出,而第二卷积层可向全连接层2808的第一层输出。
227.图28图示了示例性递归神经网络2800。在递归神经网络(rnn)中,网络的之前的状态影响网络的当前状态的输出。rnn可使用多种函数用多种方式加以构建。rnn的使用一般围绕着使用数学模型以基于输入的在先序列预测未来。例如,给定之前的词序列,rnn可用于执行统计语言建模来预测即将到来的词。所图示的rnn 2800可被描述为具有接收输入向量的输入层2802、实现递归功能的隐藏层2804、启用之前状态的

记忆’的反馈机制2805和输出结果的输出层2806。rnn 2800基于时间步长来操作。rnn在给定时间长处的状态基于之前的时间步长经由反馈机制2805而受影响。对于给定时间步长,隐藏层2804的状态由之前的状态和当前时间步长处的输入来定义。第一时间步长处的初始输入(x1)可被隐藏层2804处理。第二输入(x2)可被隐藏层2804使用在初始输入(x1)的处理期间所确定的状态信息来处理。给定状态可被计算为s_t=f(ux_t ws_(t-1)),其中u和w是参数矩阵。函数f一般是非线性,诸如双曲正切函数(tanh)或整流器函数f(x)=max(0,x)的变型。然而,在隐藏层2804中使用的特定数学函数可根据rnn 2800的特定实现细节而变化。
228.除所描述的基本cnn和rnn网络外,可启用那些网络上的变化。一个示例rnn变型是长短期记忆(lstm)rnn。lstm rnn能够学习长期依赖性,其对于处理较长语言序列是必要的。关于cnn的变型是卷积深度信任网络,其具有与cnn相似的结构并且采用与深度信任网络相似的方式来训练。深度信任网络(dbn)是生成式神经网络,其由多层的概率性(随机)变量组成。dbn可使用贪婪的无监督学习而逐层训练。然后,dbn的习得权重可用于通过对神经网络确定权重的最优初始集来提供预先训练神经网络。
229.图29图示了深度神经网络的训练和部署。一旦已经针对任务而结构化给定网络,就使用训练数据集2902来训练神经网络。已开发各种训练框架2904来启用训练过程的硬件加速。例如,上述机器学习框架可配置为训练框架。训练框架2904可钩入(hook into)未经训练的神经网络2906并且使该未经训练的神经网能够使用本文描述的并行处理资源而训练以生成经训练的神经网2908。
230.为了开始训练过程,可随机或通过使用深度信任网络的预先训练来选择初始权
重。然后,采用受监督或无监督方式执行训练循环。
231.受监督学习是其中训练作为介导(mediated)操作而执行的学习方法,诸如当训练数据集2902包括与针对输入的期望输出配对的输入时,或在训练数据集包括具有已知输出的输入并且神经网络的输出被人工分级的情况下。网络处理输入并且将所得的输出与一组预期或期望输出相比较。然后,误差通过系统而被向后传播。训练框架2904可调整成调整控制未经训练的神经网络2906的权重。训练框架2904可提供工具来监视未经训练的神经网络2906在多大程度上向适合于基于已知输入数据生成正确应答的模型收敛。随着网络的权重被调整以改善神经网络生成的输出,训练过程重复发生。训练过程可持续直到神经网络达到与经训练的神经网2908相关联的统计上期望的准确度。然后,可部署经训练的神经网络2908来实现任何数量的机器学习操作。
232.无监督学习是其中网络试图使用未标记的数据来训练它自己的学习方法。因此,对于无监督学习,训练数据集2902将包括输入数据而没有任何关联的输出数据。未经训练的神经网络2906可学习未标记的输入内的分组并且可确定个体输入如何与整体数据集相关。无监督训练可用于生成自组织图,其是能够执行在降低数据的维度方面有用的操作的一类经训练的神经网络2907。无监督训练还可用于执行异常检测,其允许标识输入数据集中偏离数据的正常模式的数据点。
233.还可采用关于受监督和无监督训练的变化。半监督学习是其中训练数据集2902包括相同分布的标记和无标记数据的混合的技术。递增式学习是其中输入数据被连续用于进一步训练模型的受监督学习的变型。递增式学习使经训练的神经网络2908能够适合于新的数据2912而没有忘记初始训练期间网络内灌输的知识。
234.无论是受监督还是无监督,针对特别深度神经网络的训练过程对于单个计算节点在计算上可能太密集。取代使用单个计算节点,计算节点的分布式网络可用于加速训练过程。
235.图30a是图示了分布式学习的框图。分布式学习是使用多个分布式计算节点(诸如,上述节点)以执行神经网络的受监督或无监督训练的训练模型。分布式计算节点可各自包括一个或多个主机处理器以及通用处理节点中的一个或多个,诸如,高度并行通用图形处理单元。如所图示的那样,分布式学习可以是所执行的模型并行结构3002、数据并行结构3004或模型和数据并行结构的组合。
236.在模型并行结构3002中,分布式系统中的不同计算节点可对单个网络的不同部分执行训练计算。例如,神经网络的每个层可由分布式系统的不同处理节点训练。模型并行结构的优点包括放缩到特别大模型的能力。拆分与神经网络的不同层相关联的计算启用了其中所有层的权重将不适合单个计算节点的存储器的非常大神经网络的训练。在一些实例中,模型并行结构在执行大神经网络的无监督训练时可特别有用。
237.在数据并行结构3004中,分布式网络的不同节点具有模型的完整实例并且每个节点接收数据的不同部分。然后,来自不同节点的结果被组合。尽管不同的方法对于数据并行结构是可能的,但数据并行训练方法全部需要将结果进行组合并使每个节点之间的模型参数同步的技术。组合数据的示例性方法包括参数平均和基于更新的数据并行结构。参数平均训练了训练数据子集上的每个节点并将全局参数(例如,权重、偏置)设置成来自每个节点的参数的平均值。参数平均使用中央参数服务器,其维持参数数据。基于更新的数据并行
结构与参数平均相似,不同之处在于对模型的更新被传送,而不是将来自节点的参数传送到参数服务器。另外,基于更新的数据并行结构可采用分散方式执行,其中更新被压缩且在节点之间传送。
238.组合模型和数据并行结构3006可例如在其中每个计算节点包括多个gpu的分布式系统中实现。每个节点可具有模型的完整实例,其中每个节点内的单独gpu用于训练模型的不同部分。
239.分布式训练相对于在单个机器上的训练具有增加的开销。然而,本文描述的并行处理器和gpgpu可各自实现各种技术来减少分布式训练的开销,这些技术包括实现高带宽gpu到gpu数据传送和加速远程数据同步的技术。
240.示例性机器学习应用机器学习可应用于解决多种技术问题,其包括但不限于计算机视觉、自主驾驶和导航、话音识别和语言处理。在传统上,计算机视觉已经是机器学习应用的最活跃研究领域之一。计算机视觉的应用的范围从再现人类视觉能力(诸如,识别面部)到创建视觉能力的新类别而变化。例如,计算机视觉应用可配置成从视频中可见的对象中引发的振动中识别声波。并行处理器加速机器学习使计算机视觉应用能够使用比之前可行的明显更大的训练数据集而训练,并使推理系统能够使用低功率并行处理器而部署。
241.并行处理器加速机器学习具有自主驾驶应用,其包括车道和道路标志识别、障碍物避免、导航和驾驶控制。加速机器学习技术可用于基于定义对特定训练输入的合适响应的数据集来训练驾驶模型。本文描述的并行处理器可对用于自主驾驶技术方案的日益复杂的神经网络实现快速训练,并在适合于集成到自主交通工具中的移动平台中启用低功率推理处理器的部署。
242.并行处理器加速深度神经网络已对自动话音识别(asr)启用机器学习方法。asr包括创建下述函数:给定输入声序列,该函数计算最可能的语言序列。使用深度神经网络的加速机器学习已经实现了对之前用于asr的隐藏马尔可夫模型(hmm)和高斯混合模型(gmm)的替换。
243.并行处理器加速机器学习还可用于加速自然语言处理。自动学习过程可利用统计推理算法来产生对错误或不熟悉输入具有鲁棒性的模型。示例性自然语言处理器应用包括人类语言之间的自动机器翻译。
244.用于机器学习的并行处理平台可被分成训练平台和部署平台。训练平台一般是高度并行的并且包括优化,以加速多gpu单节点训练和多节点多gpu训练。适合于训练的示例性并行处理器包括本文描述的高度并行通用图形处理单元和/或多gpu计算系统。相反,所部署的机器学习平台一般包括适合于用在诸如相机、自主机器人和自主交通工具之类的产品中的较低功率并行处理器。
245.图30b图示了适合于使用经训练的模型执行推理的示例性推理片上系统(soc)3100。图30b的与本文中任何其他图的元件具有相同或类似名称的元件描述与在其他图中相同的元件,可以以与其类似的方式操作或起作用,可以包括相同组件,且可以链接到其他实体,如本文其他地方描述的那些实体,但不限于此。soc 3100可集成处理组件,其包括媒体处理器3102、视觉处理器3104、gpgpu 3106和多核处理器3108。soc 3100可另外包括片上存储器3105,其可实现处理组件中的每一个可访问的共享片上数据池。处理组件可针对低
功率操作而优化以实现到多种机器学习平台的部署,其包括自主交通工具和自主机器人。例如,soc 3100的一个实现可被用作自主交通工具的主控制系统的一部分。在soc 3100配置成供自主交通工具中使用的情况下,soc被设计且配置成符合部署管辖的相关功能安全标准。
246.在操作期间,媒体处理器3102和视觉处理器3104可协同工作来加速计算机视觉操作。媒体处理器3102可实现多个高分辨率(例如,4k、8k)视频流的低时延解码。经解码的视频流可被写入到片上存储器3105中的缓冲器。然后,视觉处理器3104可对经解码的视频进行解析,并在使用经训练的图像识别模型准备处理帧时对经解码的视频的帧执行初步处理操作。例如,视觉处理器3104可针对用于在高分辨率视频数据上执行图像识别的cnn加速卷积运算,而后端模型计算由gpgpu 3106执行。
247.多核处理器3108可包括控制逻辑来帮助媒体处理器3102和视觉处理器3104所执行的数据传送和共享存储器操作的定序和同步。多核处理器3108还可充当应用处理器来执行可利用gpgpu 3106的推理计算能力的软件应用。例如,导航和驾驶逻辑的至少一部分可以以在多核处理器3108上执行的软件而实现。这样的软件可直接向gpgpu 3106发出计算工作负载,或者,可将计算工作负载发出到多核处理器3108,该多核处理器3108可向gpgpu 3106卸载那些操作的至少一部分。
248.gpgpu 3106可包括计算集群,诸如高度并行通用图形处理单元dplab00内的处理集群dplab06a-dplab06h的低功率配置。gpgpu 3106内的处理集群可支持被专门优化以在经训练的神经网络上执行推理计算的指令。例如,gpgpu 3106可支持执行诸如8位和4位整数向量运算之类的低精度计算的指令。
249.光线追踪架构在一个实现中,图形处理器包括用于执行实时光线追踪的电路系统和/或程序代码。光线追踪核的专用集合可以被包括在图形处理器中,以执行本文描述的各种光线追踪操作,包括光线遍历和/或光线交叉操作。除光线追踪核外,还可以包括用于执行可编程着色操作的图形处理核的多个集合和用于在张量数据上执行矩阵运算的张量核的多个集合。
250.图31图示了一个这种图形处理单元(gpu)3105的示例性部分,该图形处理单元(gpu)3105包括被布置到多核组3100a-n中的图形处理资源的专用集合。图形处理单元(gpu)3105可以是图形处理器300、gpgpu 1340和/或本文描述的任何其他图形处理器的变型。因此,图形处理器的任何特征的公开内容还公开了与gpu 3105的对应结合,但不限于此。此外,图31的与本文中任何其他图的元件具有相同或类似名称的元件描述与在其他图中相同的元件,可以以与其类似的方式操作或起作用,可以包括相同组件,且可以链接到其他实体,如本文其他地方描述的那些实体,但不限于此。尽管提供了仅单个多核组3100a的细节,但是将领会,其他多核组3100b-n可以配备有图形处理资源的相同或类似集合。
251.如所图示的那样,多核组3100a可以包括一组图形核3130、一组张量核3140和一组光线追踪核3150。调度器/分派器3110调度和分派图形线程以用于在各种核3130、3140、3150上执行。一组寄存器堆3120存储核3130、3140、3150在执行图形线程时使用的操作数值。这些可以包括例如用于存储整数值的整数寄存器、用于存储浮点值的浮点寄存器、用于存储打包数据元素(整数和/或浮点数据元素)的向量寄存器和用于存储张量/矩阵值的贴片寄存器。贴片寄存器可以被实现为向量寄存器的组合集合。
252.一个或多个1级(l1)高速缓存和纹理单元3160在每个多核组3100a内本地存储图形数据,诸如纹理数据、顶点数据、像素数据、光线数据、包围体数据等。由多核组3100a-n的全部或子集共享的2级(l2)高速缓存3180存储针对多个同时图形线程的图形数据和/或指令。如所图示的那样,l2高速缓存3180可以跨多个多核组3100a-n而共享。一个或多个存储器控制器3170将gpu 3105耦合到存储器3198,存储器3198可以是系统存储器(例如,dram)和/或本地图形存储器(例如,gddr6存储器)。
253.输入/输出(i/o)电路系统3195将gpu 3105耦合到一个或多个io设备3195,诸如数字信号处理器(dsp)、网络控制器或用户输入设备。片上互连可以用于将i/o设备3190耦合到gpu 3105和存储器3198。io电路系统3195的一个或多个io存储器管理单元(iommu)3170将io设备3190直接耦合到系统存储器3198。iommu 3170可以管理页表的多个集合以将虚拟地址映射到系统存储器3198中的物理地址。另外,io设备3190、(一个或多个)cpu 3199和(一个或多个)gpu 3105可以共享相同虚拟地址空间。
254.iommu 3170还可以支持虚拟化。在该情况下,它可以管理页表的第一集合以将客户/图形虚拟地址映射到客户/图形物理地址,并管理页表的第二集合以将客户/图形物理地址映射到系统/主机物理地址(例如,在系统存储器3198内)。页表的第一和第二集合中的每个的基址可被存储在控制寄存器中并且在上下文切换时被换出(例如,使得新的上下文被提供有对页表的相关集合的访问)。尽管在图31中未图示,但核3130、3140、3150和/或多核组3100a-n中的每个可以包括转化后备缓冲器(tlb),以对客户虚拟到客户物理转化、客户物理到主机物理转化以及客户虚拟到主机物理转化进行高速缓存。
255.cpu 3199、gpu 3105和io设备3190可被集成在单个半导体芯片和/或芯片封装上。所图示的存储器3198可被集成在相同芯片上,或者可经由片外接口而耦合到存储器控制器3170。在一个实现中,存储器3198包括gddr6存储器,所述gddr6存储器共享与其他物理系统级存储器相同的虚拟地址空间,尽管本发明的基础原理不限于此特定实现。
256.张量核3140可包括特别设计成执行矩阵运算的多个执行单元,所述矩阵运算是用于执行深度学习操作的基础计算操作。例如,同时矩阵乘法运算可被用于神经网络训练和推理。张量核3140可使用多种操作数精度来执行矩阵处理,所述多种操作数精度包括单精度浮点(例如,32位)、半精度浮点(例如,16位)、整数字(16位)、字节(8位)和半字节(4位)。神经网络实现还可以取出每个经渲染的场景的特征,潜在地组合来自多个帧的细节,以构造高质量的最终图像。
257.在深度学习实现中,可调度并行矩阵乘法工作以用于在张量核3140上执行。神经网络的训练特别要求大量的矩阵点积运算。为了处理n x n x n矩阵相乘的内积公式,张量核3140可包括至少n个点积处理元素。在矩阵相乘开始前,一个完整矩阵被加载到贴片寄存器中,并且在n个周期的每个周期,第二矩阵的至少一列被加载。每个周期,有被处理的n个点积。
258.取决于特定实现,可以以不同精度存储矩阵元素,所述不同精度包括16位字、8位字节(例如,int8)和4位半字节(例如,int4)。可为张量核2140指定不同精度模式以确保最高效的精度被用于不同工作负载(例如,诸如可容许量化到字节和半字节的推理工作负载)。
259.光线追踪核3150可以用于对于实时光线追踪和非实时光线追踪实现二者均使光
线追踪操作加速。特别地,光线追踪核3150可以包括光线遍历/交叉电路系统,以用于使用包围体层级(bvh)来执行光线遍历并且标识封闭在bvh体积之内的图元与光线之间的交叉。光线追踪核3150还可包括用于执行深度测试和剔除(例如,使用z缓冲器或类似布置)的电路系统。在一个实现中,光线追踪核3150与本文描述的图像去噪技术协同执行遍历和交叉操作,其至少一部分可在张量核3140上被执行。例如,张量核3140可以实现深度学习神经网络,以执行对由光线追踪核3150生成的帧的去噪。然而,(一个或多个)cpu 3199、图形核3130和/或光线追踪核3150还可实现去噪和/或深度学习算法的全部或一部分。
260.另外,如上所述,可采用去噪的分布式方法,其中gpu 3105处于通过网络或高速互连耦合到其他计算设备的计算设备中。互连的计算设备可以另外共享神经网络学习/训练数据来改进速度,利用该速度,整个系统学习对不同类型的图像帧和/或不同的图形应用执行去噪。
261.光线追踪核3150可以处理所有bvh遍历和光线-图元交叉,从而避免图形核3130以每光线数千个指令而过载。每个光线追踪核3150可以包括用于执行包围盒测试(例如,对于遍历操作)的专用电路系统的第一集合和用于执行光线-三角形交叉测试(例如,交叉已被遍历的光线)的专用电路系统的第二集合。因此,多核组3100a可仅仅启动光线探头,并且光线追踪核3150独立执行光线遍历和交叉并且将命中数据(例如,命中、无命中、多次命中等)返回到线程上下文。在光线追踪核3150执行遍历和交叉操作的同时,其他核3130、3140可以被释放以执行其他图形或计算工作。
262.每个光线追踪核3150可以包括用于执行bvh测试操作的遍历单元和执行光线-图元交叉测试的交叉单元。交叉单元然后可以生成“命中”、“无命中”或“多次命中”响应,交叉单元将该响应提供到适当的线程。在遍历和交叉操作期间,其他核(例如,图形核3130和张量核3140)的执行资源可以被释放以执行其他形式的图形工作。
263.还可以使用混合光栅化/光线追踪方法,其中在图形核3130与光线追踪核3150之间分布工作。
264.光线追踪核3150(和/或其他核3130、3140)可以包括对诸如microsoft的directx光线追踪(dxr)之类的光线追踪指令集的硬件支持,所述dxr包括dispatchrays命令以及光线-生成、最接近-命中、任何-命中和未命中着色器,这些实现对每个对象指派纹理和着色器的独特集合。可由光线追踪核3150、图形核3130和张量核3140支持的另一光线追踪平台是vulkan 1.1.85。然而,注意本发明的基础原理不限于任何特定光线追踪isa。
265.一般而言,各种核3150、3140、3130可支持光线追踪指令集,所述光线追踪指令集包括用于光线生成、最接近命中、任何命中、光线-图元交叉、每图元和分层包围盒构造、未命中、访问和异常的指令/功能。更特定地,光线追踪指令可以被包括以执行以下功能:光线生成
ꢀ–ꢀ
可为每个像素、样本或其他用户定义的工作指派执行光线生成指令。
266.最接近命中
ꢀ–ꢀ
可执行最接近命中指令,以用场景内的图元来定位光线的最接近交点。
267.任何命中
ꢀ‑ꢀ
任何命中指令标识场景内的图元与光线之间的多个交叉,潜在地标识新的最接近交点。
268.交叉
ꢀ‑ꢀ
交叉指令执行光线-图元交叉测试并且输出结果。
269.每图元包围盒构造
ꢀ‑ꢀ
此指令围绕给定图元或图元的组构建包围盒(例如,在构建
新的bvh或其他加速数据结构时)。
270.未命中
ꢀ–ꢀ
指示光线未命中场景的指定区或场景内的所有几何结构。
271.访问
ꢀ–ꢀ
指示光线将遍历的子代体积。
272.异常
ꢀ‑ꢀ
包括各种类型的异常处理程序(例如,针对各种误差状况而被调用)。
273.分层光束追踪包围体层级普遍用于改进在图形图元和其他图形对象上执行操作的效率。bvh是基于几何对象的集合而构建的分层树形结构。在树形结构顶上的是根节点,其封闭给定场景中的所有几何对象。在形成树的叶节点的包围体中包裹个体几何对象。这些节点然后被分组为小集合且被封闭在更大包围体内。这些进而还以递归方式而被分组和封闭在其他更大包围体内,从而最终得到具有树顶部处的由根节点表示的单个包围体的树形结构。包围体层级用于高效地支持几何对象集合上的多种操作,诸如碰撞检测、图元剔除以及在光线追踪中使用的光线遍历/交叉操作。
274.在光线追踪架构中,使光线遍历通过bvh以确定光线-图元交叉。例如,如果光线未经过bvh的根节点,那么光线不与由bvh封闭的图元中的任一个交叉,并且对于光线而言关于该组图元不需要进一步处理。如果光线经过bvh的第一子节点但未经过第二子节点,那么不需要针对由第二子节点封闭的任何图元而测试光线。以该方式,bvh提供了针对光线-图元交叉进行测试的高效机制。
275.可以针对bvh而测试被称作“光束”的邻接光线的组,而不是个体光线。图32图示了由四个不同光线概述的示例性光束3201。与由四个光线定义的补片3200交叉的任何光线被视为处于相同光束内。尽管图32中的光束3201由光线的矩形布置定义,但可以以各种其他方式定义光束,同时仍符合本发明的基础原理(例如圆形、椭圆形等)。
276.图33图示了gpu 3320的光线追踪引擎3310如何实现本文描述的光束追踪技术。特别地,光线生成电路系统3304生成要针对其而执行遍历和交叉操作的多个光线。然而,不是在个体光线上执行遍历和交叉操作,而是使用由光束层级构造电路系统3305生成的光束层级3307来执行遍历和交叉操作。光束层级与包围体层级(bvh)相似。例如,图34提供了可被细分成多个不同组件的主光束3400的示例。特别地,主光束3400可以被划分成象限3401-3404,并且每个象限自身可以被划分成子象限,诸如象限3404内的子象限a-d。主光束可以是以多种方式细分的。例如,主光束可以被划分成两半(而不是象限),并且每一半可以被划分成两半,依此类推。不论如何作出细分,都以与bvh类似的方式生成分层结构,例如,其中根节点表示主光束3400,第一级子节点各自由象限3401-3404表示,第二级子节点针对每个子象限a-d,依此类推。
277.一旦光束层级3307被构造,遍历/交叉电路系统3306就可以使用光束层级3307和bvh 3308来执行遍历/交叉操作。特别地,它可以针对bvh而测试光束并剔除光束的不与bvh的任何部分交叉的部分。使用例如图34中所示的数据,如果与子区3402和3403相关联的子光束不与bvh或bvh的特定分支交叉,那么可以关于bvh或分支而剔除它们。可以通过执行深度优先搜索或其他搜索算法来针对bvh而测试剩余部分3401、3404。
278.在图35中图示了用于光线追踪的方法。该方法可以是在上述图形处理架构的上下文内实现的,但不限于任何特定架构。
279.在3500处,构造包括多个光线的主光束,并且在3501处,对光束进行细分并生成分
层数据结构以创建光束层级。可以作为从多个光线构造光束层级的单个集成操作而执行操作3500-3501。在3502处,与bvh一起使用光束层级以从bvh剔除光线(来自光束层级)和/或节点/图元。在3503处,针对剩余光线和图元而确定光线-图元交叉。
280.分布式光线追踪系统中的有损和无损分组压缩光线追踪操作可以跨在网络上耦合在一起的多个计算节点而分布。图36例如图示了包括多个光线追踪节点3610-3613的光线追踪集群3600,该多个光线追踪节点3610-3613并行执行光线追踪操作,从而在节点之一上潜在地组合结果。在所图示的架构中,光线追踪节点3610-3613经由网关而通信耦合到客户端侧光线追踪应用3630。
281.关于分布式架构的困难之一是必须在光线追踪节点3610-3613中的每一个之间传输的大量分组化数据。可以使用无损压缩技术和有损压缩技术两者,以减少在光线追踪节点3610-3613之间传输的数据。
282.为了实现无损压缩而不是发送充满某些类型的操作的结果的分组,发送允许接收节点重构结果的数据或命令。例如,随机采样的区域光和环境遮蔽(ao)操作不必然需要方向。因此,发射节点可以仅仅发送随机种子,该随机种子然后被接收节点使用以执行随机采样。例如,如果场景跨节点3610-3612而分布,则为了在点p1-p3处对光1进行采样,仅需要将光id和原点发送到节点3610-3612。节点中的每一个然后可以独立地对光进行随机采样。随机种子可以由接收节点生成。类似地,对于主光线命中点,可以在不针对连续帧等待原点的情况下在节点3610-3612上计算环境遮蔽(ao)和软阴影采样。另外,如果已知光线集合将去往相同点光源,则可以将识别光源的指令发送到接收节点,该接收节点会将它应用于光线集合。作为另一示例,如果存在单点传输的n个环境遮蔽光线,则可以发送从该点生成n个样本的命令。
283.可以针对有损压缩而应用各种另外技术。例如,可以采用量化因子以对与bvh、图元和光线相关联的所有坐标值进行量化。另外,可以将针对诸如bvh节点和图元之类的数据而使用的32位浮点值转换成8位整数值。在示例性实现中,以全精度存储光线分组的边界,但将个体光线点p1-p3作为经编索引的偏移而传输到边界。类似地,可以生成使用8位整数值作为局部坐标的多个局部坐标系。可以使用全精度(例如,32位浮点)值来对这些局部坐标系中的每一个的原点的位置进行编码,从而有效地连接全局和局部坐标系。
284.以下是无损压缩的示例。在光线追踪程序中内部使用的光线数据格式的示例如下:struct ray{
ꢀꢀ
uint32 pixid;
ꢀꢀ
uint32 materialid;
ꢀꢀ
uint32 instanceid;
ꢀꢀ
uint64 primitiveid;
ꢀꢀ
uint32 geometryid;
ꢀꢀ
uint32 lightid;
ꢀꢀ
float origin[3];
ꢀꢀ
float direction[3];
ꢀꢀ
float t0;
ꢀꢀ
float t;
ꢀꢀ
float time;
ꢀꢀ
float normal[3]; //用于几何交叉
ꢀꢀ
float u;
ꢀꢀ
float v;
ꢀꢀ
float wavelength;
ꢀꢀ
float phase; //干涉法
ꢀꢀ
float refractedoffset; //纹影法
ꢀꢀ
float amplitude;
ꢀꢀ
float weight; };
[0285]
取代发送针对所生成的每一个节点的原始数据,可以通过对值进行分组并且通过在可能的情况下使用适用元数据创建隐式光线,来压缩该数据。
[0286]
对光线数据进行捆绑和分组可以针对具有修饰语的公共数据或掩码而使用标志(flag)。
[0287]
struct raypacket{
ꢀꢀ
uint32 size;
ꢀꢀ
uint32 flags;
ꢀꢀ
list《ray》 rays;}例如:raypacket.rays = ray_1 至 ray_256。
[0288]
原点全部被共享除了跨所有光线而存储仅单个原点外,所有光线数据被打包。针对raypacket_common_origin而设置raypacket.flags。当raypacket在被接收到时未被打包时,从单个原点值填入原点。
[0289]
仅在一些光线之间共享原点除共享原点的光线外,所有光线数据被打包。对于唯一共享原点的每个组,对操作符进行打包,该操作符标识操作(共享原点)、存储原点并标记哪些光线共享信息。这种操作可以在节点之间的任何共享值(诸如材料id、图元id、原点、方向、法线等)上完成。
[0290]
struct rayoperation{
ꢀꢀ
uint8 operationid;
ꢀꢀ
void* value;
ꢀꢀ
uint64 mask;}
[0291]
发送隐式光线
时常,可以在接收端上利用用于生成光线数据的最小元信息导出该光线数据。非常普遍的示例是生成多个次级光线以对区域进行随机采样。取代发送者生成次级光线、发送它并且接收者对它进行操作,发送者可以发送需要利用任何相关信息生成光线的命令,并且在接收端上生成该光线。在需要首先由发送者生成光线以确定将它发送到哪个接收者的情况下,生成光线并且可以发送随机种子以再生完全相同的光线。
[0292]
例如,为了利用对区域光源进行采样的64个阴影光线对命中点进行采样,所有64个光线与来自相同计算n4的区交叉。创建具有公共原点和法线的raypacket。如果希望接收者对所得到的像素贡献进行着色,则可以发送更多数据,但是对于该示例,让我们假定希望仅返回光线是否命中另一节点数据。针对生成阴影光线操作而创建rayoperation,并且给rayoperation指派要采样的lightid的值和随机数种子。当n4接收到光线分组时,它通过对所有光线填入共享原点数据并基于利用随机数种子而随机采样的lightid设置方向,来生成完全填充的光线数据,以生成原始发送者生成的相同光线。当结果被返回时,仅需要返回针对每个光线的二进制结果,其可以通过光线上的掩码而转交。
[0293]
在该示例中发送原始64个光线将使用104个字节*64个光线=6656个字节。如果返回光线也是以它们的原始形式发送的,那么这还被加倍到13312个字节。使用在仅发送公共光线原点、法线的情况下的无损压缩以及具有种子和id的光线生成操作,利用针对交叉掩码而返回的8个字节发送仅29个字节。这导致需要在~360:1的网络上发送的数据压缩率。这不包括自身处理消息的开销,其将需要以某种方式而标识,但这由实现决定。可以完成其他操作,以用于根据针对主光线的pixelid重新估算光线原点和方向、基于光线分组中的范围来重新计算pixelid、以及值的重新估算的许多其他可能实现。类似操作可以用于所发送的任何光线或光线组,包括阴影、反射、折射、环境遮蔽、交叉、体积交叉、着色、路径追踪中的反弹反射等。
[0294]
图37图示了针对执行光线追踪分组的压缩和解压缩的两个光线追踪节点3710-3711的另外细节。特别地,当第一光线追踪引擎3730准备好将数据传输到第二光线追踪引擎3731时,光线压缩电路系统3720执行如本文描述的光线追踪数据的有损和/或无损压缩(例如将32位值转换成8位值、用原始数据替代重构数据的指令等)。在本地网络(例如,10gb/s、100gb/s以太网网络)上将经压缩的光线分组3710从网络接口3725传输到网络接口3726。光线解压缩电路系统然后在适当时对光线分组进行解压缩。例如,它可以执行重构光线追踪数据(例如,使用随机种子以执行针对照明操作的随机采样)的命令。光线追踪引擎3731然后使用所接收到的数据以执行光线追踪操作。
[0295]
在相反方向上,光线压缩电路系统3741压缩光线数据,网络接口3726在网络上传输经压缩的光线数据(例如, 使用本文描述的技术),光线解压缩电路系统3740在必要时对光线数据进行解压缩,并且光线追踪引擎3730在光线追踪操作中使用该数据。尽管在图37中被图示为单独的单元,但光线解压缩电路系统3740-3741可以分别集成在光线追踪引擎3730-3731内。例如,就经压缩的光线数据包括重构光线数据的命令而言,这些命令可以由每个相应光线追踪引擎3730-3731执行。
[0296]
如图38中所图示,光线压缩电路系统3720可以包括:有损压缩电路系统3801,用于执行本文描述的有损压缩技术(例如,将32位浮点坐标转换成8位整数坐标);以及无损压缩电路系统3803,用于执行无损压缩技术(例如,传输命令和数据以允许光线重新压缩电路系
统3821重构数据)。光线解压缩电路系统3721包括有损解压缩电路系统3802和用于执行无损解压缩的无损解压缩电路系统3804。
[0297]
在图39中图示了另一示例性方法。该方法可以被实现在本文描述的光线追踪架构或其他架构上,但不限于任何特定架构。
[0298]
在3900处,接收将从第一光线追踪节点传输到第二光线追踪节点的光线数据。在3901处,有损压缩电路系统在第一光线追踪数据上执行有损压缩,并且在3902处,无损压缩电路系统在第二光线追踪数据上执行无损压缩。在3903处,将经压缩的光线追踪数据传输到第二光线追踪节点。在3904处,有损/无损解压缩电路系统执行光线追踪数据的有损/无损解压缩,并且在3905处,第二光线追踪节点执行对经解压缩的数据的光线追踪操作。
[0299]
具有硬件加速混合光线追踪的图形处理器接下来呈现混合渲染流水线,其在图形核3130上执行光栅化并在光线追踪核3150、图形核3130和/或cpu 3199核上执行光线追踪操作。例如,可以在图形核3130上执行光栅化和深度测试,以替代主光线投射级。光线追踪核3150然后可以生成针对光线反射、折射和阴影的次级光线。另外,将选择其中光线追踪核3150将执行光线追踪操作(例如,基于材料性质阈值,诸如高反射率级别)的场景的某些区,同时将利用图形核3130上的光栅化来渲染场景的其他区。该混合实现可以用于实时光线追踪应用——其中时延是关键问题。
[0300]
下述光线遍历架构可以例如在使用专用硬件来加速关键功能(诸如,bvh遍历和/或交叉)的同时,使用现有单指令多数据(simd)和/或单指令多线程(simt)图形处理器来执行光线遍历的可编程着色和控制。可以通过在遍历期间以及在着色之前的特定点处对派生着色器重新分组来改进针对不相干路径的simd占用。这是使用对着色器进行动态分类的专用硬件在片上实现的。通过将功能拆分成在返回时执行的延续部分并在执行之前针对改进的simd占用而对延续部分重新分组,来管理递归。
[0301]
通过将遍历功能性分解成内部遍历和外部遍历来实现光线遍历/交叉的可编程控制,该内部遍历可以被实现为固定功能硬件,该外部遍历在gpu处理器上执行并通过用户定义的遍历着色器来实现可编程控制。通过在内部和外部遍历之间的过渡期间保守地截断内部遍历状态,来降低在硬件与软件之间传送遍历上下文的成本。
[0302]
可以通过在下表a中列出的不同着色器类型来表达光线追踪的可编程控制。可以存在针对每个类型的多个着色器。例如,每个材料可以具有不同的命中着色器。着色器类型功能性主启动主光线命中双向反射比分布函数(brdf)采样,启动次级光线任何命中计算针对阿尔法纹理几何结构的透射比未命中计算来自光源的辐射交叉使定制形状交叉遍历实例选择和变换可调用通用函数
[0303]
表a递归光线追踪可以由api函数发起,api函数命令图形处理器启动可派生针对主光线的光线-场景交叉的主着色器或交叉电路系统的集合。这进而派生其他着色器,诸如遍
历、命中着色器或未命中着色器。派生子着色器的着色器还可以从该子着色器接收返回值。可调用着色器是可直接由另一着色器派生且还可将值返回给调用着色器的通用函数。
[0304]
图40图示了包括着色器执行电路系统4000和固定功能电路系统4010的图形处理架构。通用执行硬件子系统包括多个单指令多数据(simd)和/或单指令多线程(simt)核/执行单元(eu)4001(即,每个核可以包括多个执行单元)、一个或多个采样器4002和1级(l1)高速缓存4003或其他形式的本地存储器。固定功能硬件子系统4010包括消息单元4004、调度器4007、光线-bvh遍历/交叉电路系统4005、分类电路系统4008和本地l1高速缓存4006。
[0305]
在操作中,主分派器4009将主光线的集合分派到调度器4007,调度器4007将工作调度给在simd/simt核/eu 4001上执行的着色器。simd核/eu 4001可以是上述光线追踪核3150和/或图形核3130。主着色器的执行派生要执行(例如,要由一个或多个子着色器和/或固定功能硬件执行)的另外工作。消息单元4004将由simd核/eu 4001派生的工作分发给调度器4007从而按照需要访问空闲栈池、分发给分类电路系统4008或光线-bvh交叉电路系统4005。如果另外的工作被发送到调度器4007,则对它进行调度以用于在simd/simt核/eu 4001上处理。在调度之前,分类电路系统4008可以如本文描述的那样将光线分类成组或箱(例如,对具有类似特性的光线进行分组)。光线-bvh交叉电路系统4005使用bvh体积来执行光线的交叉测试。例如,光线-bvh交叉电路系统4005可以将光线坐标与bvh的每个级别进行比较以识别被光线交叉的体积。
[0306]
可以使用着色器记录、包括指向入口函数的指针的用户分配的结构、供应商特定元数据、以及对由simd核/eu 4001执行的着色器的全局参数,来引用着色器。着色器的每个执行实例与调用栈相关联,该调用栈可以用于存储在父着色器与子着色器之间传递的参数。调用栈还可以存储对在调用返回时执行的延续函数的引用。
[0307]
图41图示了所指派的栈4101的示例集合,栈4101包括主着色器栈、命中着色器栈、遍历着色器栈、延续函数栈和光线-bvh交叉栈(如所描述的那样,其可以由固定功能硬件4010执行)。新着色器调用可以实现来自空闲栈池4102的新栈。可以在本地l1高速缓存4003、4006中高速缓存调用栈(例如,所指派的栈的集合所包括的栈),以减小访问的时延。
[0308]
可以存在有限数量的调用栈,每个调用栈具有在邻接存储区中分配的固定最大大小“sstack”。因此,可以根据栈索引(sid)直接计算栈的基址,作为基址 = sid * sstack。栈id可以被调度器4007在将工作调度给simd核/eu 4001时分配和解除分配。
[0309]
主分派器4009可以包括:图形处理器命令处理器,其响应于来自主机(例如,cpu)的分派命令而分派主着色器。调度器4007可以接收这些分派请求,并且如果它可以分配针对每个simd通道的栈id,则它在simd处理器线程上启动主着色器。可以从在分派命令的开始处初始化的空闲栈池4102分配栈id。
[0310]
执行着色器可以通过将派生消息发送到消息传递单元4004来派生子着色器。该命令包括与着色器相关联的栈id,且还包括指向针对每个活跃simd通道的子着色器记录的指针。父着色器可以针对活跃通道仅发出该消息一次。在发送针对所有相关通道的派生消息之后,父着色器可以终止。
[0311]
在simd核/eu 4001上执行的着色器还可以使用具有针对固定功能硬件而预留的着色器记录指针的派生消息,来派生固定功能任务,诸如光线-bvh交叉。如所提及的那样,消息传递单元4004将所派生的光线-bvh交叉工作发送到固定功能光线-bvh交叉电路系统
4005,并将可调用着色器直接发送到分类电路系统4008。分类电路系统可以通过着色器记录指针来对着色器进行分组,以导出具有类似特性的simd批量。相应地,来自不同父着色器的栈id可以由分类电路系统4008分组在相同批量中。分类电路系统4008将经分组的批量发送到调度器4007,调度器4007访问来自图形存储器2511或末级高速缓存(llc)4020的着色器记录并在处理器线程上启动着色器。
[0312]
延续部分可以被视为可调用着色器,且还可以通过着色器记录而引用。当子着色器被派生且将值返回给父着色器时,可以在调用栈4101上推送指向延续部分着色器记录的指针。当子着色器返回时,然后可以从调用栈4101弹出延续部分着色器记录并且可以派生延续部分着色器。可选地,所派生的延续部分可以经过与可调用着色器类似的分类单元,并得以在处理器线程上启动。
[0313]
如图42中所图示,分类电路系统4008通过着色器记录指针4201a、4201b、4201n来对所派生的任务进行分组,以创建用于着色的simd批量。可以从不同分派和不同输入simd通道对经分类的批量中的栈id或上下文id进行分组。分组电路系统4210可以使用包括多个条目的内容可寻址存储器(cam)结构4201来执行分类,其中每个条目是利用标签4201标识的。如所提及的那样,标签4201可以是对应着色器记录指针4201a、4201b、4201n。cam结构4201可以存储各自与对应于着色器记录指针的不完整simd批量相关联的有限数量的标签(例如32、64、128等)。
[0314]
对于传入的派生命令,每个simd通道具有对应栈id(被示作每个cam条目中16个上下文id 0-15)和着色器记录指针4201a-b、
……
n(充当标签值)。分组电路系统4210可以将针对每个通道的着色器记录指针与cam结构4201中的标签4201进行比较,以找到匹配批量。如果匹配批量被找到,则可以将栈id/上下文id添加到批量。否则,可以创建具有新着色器记录指针标签的新条目,从而可能驱逐具有不完整批量的较旧条目。
[0315]
执行着色器可以在调用栈为空时通过将解除分配消息发送到消息单元来对调用栈解除分配。解除分配消息被中继到调度器,该调度器将针对活跃simd通道的栈id/上下文id返回给空闲池。
[0316]
呈现使用固定功能光线遍历和软件光线遍历的组合的用于光线遍历操作的混合方法。因此,它在维持固定功能遍历的效率的同时提供了软件遍历的灵活性。图43示出了可以用于混合遍历的加速结构,其为具有单个顶级bvh 4300以及若干底级bvh 4301和4302的两级树。右侧示出了图形元素,以指示内部遍历路径4303、外部遍历路径4304、遍历节点4305、具有三角形的叶节点4306和具有定制图元的叶节点4307。
[0317]
顶级bvh 4300中的具有三角形的叶节点4306可以引用三角形、针对定制图元的交叉着色器记录、或遍历着色器记录。底级bvh 4301-4302的具有三角形的叶节点4306仅可以引用三角形和针对定制图元的交叉着色器记录。引用的类型被封闭在叶节点4306内。内部遍历4303指代每个bvh 4300-4302内的遍历。内部遍历操作包括光线-bvh交叉的计算,并且跨bvh结构4300-4302的遍历被称作外部遍历。可以在固定功能硬件中高效地实现内部遍历操作,而可以利用关于可编程着色器的可接受性能执行外部遍历操作。因此,可以使用固定功能电路系统4010来执行内部遍历操作,并且可以使用包括用于执行可编程着色器的simd/simt核/eu 4001的着色器执行电路系统4000来执行外部遍历操作。
[0318]
注意,为了简明,simd/simt核/eu 4001在本文中有时被简称作“核”、“simd核”、“eu”或“simd处理器”。类似地,光线-bvh遍历/交叉电路系统4005有时被简称作“遍历单元”、“遍历/交叉单元”或“遍历/交叉电路系统”。当使用可替换术语时,用于标明相应电路系统/逻辑的特定名称不更改电路系统/逻辑所执行的基础功能,如本文描述的那样。
[0319]
此外,尽管在图40中出于解释的目的而被图示为单个组件,但遍历/交叉单元4005可以包括不同的遍历单元和单独的交叉单元,其中每一个可以在如本文描述的电路系统和/或逻辑中实现。
[0320]
当光线在内部遍历期间与遍历节点交叉时,可以派生遍历着色器。分类电路系统4008可以通过着色器记录指针4201a-b、n来对这些着色器进行分组,以创建由调度器4007启动的simd批量,以用于在图形simd核/eu4001上的simd执行。遍历着色器可以以若干方式修改遍历,从而启用大范围的应用。例如,遍历着色器可以在更粗细节水平(lod)处选择bvh或者变换光线,以实现刚性体变换。遍历着色器然后可以针对所选择的bvh而派生内部遍历。
[0321]
内部遍历通过对bvh进行遍历并计算光线-盒和光线-三角形交叉来计算光线-bvh交叉。通过将消息发送到消息传递电路系统4004来以与着色器相同的方式派生内部遍历,消息传递电路系统4004将对应的派生消息中继到光线-bvh交叉电路系统4005,光线-bvh交叉电路系统4005计算光线-bvh交叉。
[0322]
针对内部遍历的栈可以被本地存储在固定功能电路系统4010中(例如,在l1高速缓存4006内)。当光线与对应于遍历着色器或交叉着色器的叶节点交叉时,可以终止内部遍历并且可以截断内部栈。可以在由调用着色器指定的位置处连同指向光线和bvh的指针一起将经截断的栈写入到存储器,并且然后可以派生对应的遍历着色器或交叉着色器。如果光线在内部遍历期间与任何三角形交叉,则可以将对应命中信息作为输入参数而提供给这些着色器,如下面的代码中所示。这些派生着色器可以由分类电路系统4008分组,以创建用于执行的simd批量。
[0323]
structhitinfo{
ꢀꢀꢀꢀ
floatbarycentrics[2];
ꢀꢀꢀꢀ
floattmax;
ꢀꢀꢀꢀ
boolinnertravcomplete;
ꢀꢀꢀꢀ
uintprimid;
ꢀꢀꢀꢀ
uintgeomid;
ꢀꢀꢀꢀ
shaderrecord*leafshaderrecord;}
[0324]
截断内部遍历栈降低了使其溢出到存储器的成本。在restarttrailforstacklessbvhtraversal,highperformancegraphics(2010),pp.107

111中描述的方法,为了在栈的顶部处将栈截断到少量的条目,可以应用42位重启尾部和6位深度值。重启尾部指示已经在bvh内部取得的分支,并且深度值指示与最后栈条目相对应的遍历的深度。这是在稍后的时间处恢复内部遍历的足够信息。
[0325]
当内部栈为空并且不存在更多bvh节点要测试时,内部遍历是不完整的。在该情况下,派生外部栈处理程序,其弹出外部栈的顶部并在外部栈不为空的情况下恢复遍历。
[0326]
外部遍历可以执行主要遍历状态机,且可以被实现在由着色器执行电路系统4000
执行的程序代码中。它可以在以下条件下派生内部遍历查询:(1)当新光线被命中着色器或主着色器派生时;(2)当遍历着色器针对遍历而选择bvh时;以及(3)当外部栈处理程序针对bvh而恢复内部遍历时。
[0327]
如图44中所图示,在内部遍历被派生之前,在调用栈4405上分配空间以供固定功能电路系统4010存储经截断的内部栈4410。在也在存储器2511中存储的遍历状态4400中维持到调用栈和内部栈的顶部的偏移4403-4404。遍历状态4400还包括世界空间4401和对象空间4402中的光线以及针对最接近交叉图元的命中信息。
[0328]
遍历着色器、交叉着色器和外部栈处理程序都由光线-bvh交叉电路系统4005派生。遍历着色器在发起针对第二级bvh的新内部遍历之前在调用栈4405上分配。外部栈处理程序是负责更新命中信息且恢复任何未决内部遍历任务的着色器。外部栈处理程序还负责在遍历完成时派生命中或未命中着色器。当不存在未决内部遍历查询要派生时,遍历完成。当遍历完成并且交叉被找到时,派生命中着色器;否则,派生未命中着色器。
[0329]
尽管上述混合遍历方案使用两级bvh层级,但还可以实现具有外部遍历实现中的对应改变的任意数量的bvh级别。
[0330]
另外,尽管上面描述了用于执行光线-bvh交叉的固定功能电路系统4010,但还可以在固定功能电路系统中实现其他系统组件。例如,上述外部栈处理程序可以是可潜在地在固定功能bvh遍历/交叉电路系统4005中实现的内部(非用户可见)着色器。该实现可以用于减少所分派的着色器级的数量以及固定功能交叉硬件4005与处理器之间的往返旅程。
[0331]
本文描述的示例使用用户定义的功能来实现可编程着色和光线遍历控制,该用户定义的功能可以以更高simd效率在现有和未来gpu处理器上执行。光线遍历的可编程控制实现若干重要特征,诸如程序实例化、随机细节水平选择、定制图元交叉和懒惰bvh更新。
[0332]
还提供了支持命中和交叉着色器的投机执行的可编程多指令多数据(mimd)光线追踪架构。特别地,该架构集中于减少上面关于图40描述的可编程simd/simt核/执行单元4001与混合光线追踪架构中的固定功能mimd遍历/交叉单元4005之间的调度和通信开销。下面描述命中和交叉着色器的多个投机执行方案,其可以是从遍历硬件以单个批量而分派的,从而避免若干遍历和着色往返旅程。可以使用用于实现这些技术的专用电路。
[0333]
本发明实施例在下述使用情况中特别有益:从光线遍历查询期望多个命中和交叉着色器的执行,该光线遍历查询在被实现时将在没有专用硬件支持的情况下施加显著开销。这些包括但不限于最接近的k命中查询(启动针对k个最接近交叉的命中着色器)和多个可编程交叉着色器。
[0334]
这里描述的技术可以被实现为对图40中图示(和关于图40-44而描述)的架构的扩展。特别地,本发明的目前实施例在具有改进上面提及的使用情况的性能的增强的情况下构建在该架构上。
[0335]
混合光线追踪遍历架构的性能限制是从执行单元启动遍历查询的开销和从光线追踪硬件调用可编程着色器的开销。当在相同光线的遍历期间调用多个命中或交叉着色器时,该开销生成可编程核4001与遍历/交叉单元4005之间的“执行往返旅程”。这也对需要从个体着色器调用提取simd/simt相干性的分类单元4008施加了另外的压力。
[0336]
光线追踪的若干方面需要可通过在上表a中列出的不同着色器类型(即,主、命中、任何命中、未命中、交叉、遍历和可调用)而表达的可编程控制。这些可以是针对每个类型的
多个着色器。例如,每个材料可以具有不同的命中着色器。这些着色器类型中的一些被定义在当前microsoft
®
光线追踪api中。
[0337]
作为简要回顾,递归光线追踪由api函数发起,该api函数命令gpu启动可派生针对主光线的光线-场景交叉(以硬件和/或软件实现)的主着色器的集合。这进而可以派生其他着色器,诸如遍历、命中或未命中着色器。派生子着色器的着色器还可以从该着色器接收返回值。可调用着色器是通用功能,其可以被另一着色器直接派生且还可以将值返回给调用的着色器。
[0338]
光线遍历通过对包围体层级(bvh)中的节点进行遍历和交叉来计算光线-场景交叉。最近的研究已经示出:可以使用最适于固定功能硬件的技术(诸如,降低精度算术、bvh压缩、每光线状态机、专用交叉流水线和定制高速缓存)来改进计算光线-场景交叉的效率超过一个量级。
[0339]
图40中所示的架构包括下述这种系统:其中,simd/simt核/执行单元4001的阵列与固定功能光线追踪/交叉单元4005交互,以执行可编程光线追踪。可编程着色器被映射到执行单元/核4001上的simd/simt线程,其中simd/simt利用、执行和数据相干对于最优性能而言是关键的。光线查询常常出于诸如下述各项之类的各种原因而打破相干:
·
遍历发散:bvh遍历的持续时间在有利于异步光线处理的光线之间变化很大。
[0340]
·
执行发散:从相同simd/simt线程的不同通道派生的光线可能导致不同着色器调用。
[0341]
·
数据访问发散:例如,命中不同表面的光线对不同bvh节点和图元进行采样,并且着色器访问不同纹理。多种其他场景可能导致数据访问发散。
[0342]
simd/simt核/执行单元4001可以是本文描述的核/执行单元的变型,本文描述的核/执行单元包括(一个或多个)图形核415a-415b、着色器核1355a-n、图形核3130、图形执行单元608、执行单元852a-b、或者本文描述的任何其他核/执行单元。可以使用simd/simt核/执行单元4001,以替代(一个或多个)图形核415a-415b、着色器核1355a-n、图形核3130、图形执行单元608、执行单元852a-b、或者本文描述的任何其他核/执行单元。因此,结合(一个或多个)图形核415a-415b、着色器核1355a-n、图形核3130、图形执行单元608、执行单元852a-b、或者本文描述的任何其他核/执行单元的任何特征的公开内容还公开了与图40的simd/simt核/执行单元4001的对应结合,但不限于此。
[0343]
固定功能光线追踪/交叉单元4005可以通过个体地且乱序地处理每个光线来克服前两个挑战。然而,这打破了simd/simt组。分类单元4008因而负责再次形成要被分派到执行单元的着色器调用的新相干simd/simt组。
[0344]
容易看出这种架构与直接处于simd/simt处理器上的基于纯软件的光线追踪实现相比的优点。然而,存在与simd/simt核/执行单元4001(本文中有时简称作simd/simt处理器或核/eu)与mimd遍历/交叉单元4005之间的管理相关联的开销。此外,分类单元4008可以不从非相干着色器调用取出完美simd/simt利用。
[0345]
可以标识出下述用户情况:着色器调用可以在遍历期间特别频繁。针对混合mimd光线追踪处理器而描述增强,以显著减少核/eu 4001与遍历/交叉单元4005之间的通信的开销。这在找到可编程交叉着色器的k个最接近交叉和实现时可以是特别有益的。然而,注意这里所描述的技术不限于任何特定处理场景。
[0346]
下面提供核/eu 4001与固定功能遍历/交叉单元4005之间的光线追踪上下文切换的高级成本的概要。每当着色器调用在单个光线遍历期间必要时,大多数性能开销都由这两个上下文切换导致。
[0347]
启动光线的每个simd/simt通道生成派生消息到与要遍历的bvh相关联的遍历/交叉单元4005。经由派生消息和(高速缓冲)存储器将数据(光线遍历上下文)中继到遍历/交叉单元4005。当遍历/交叉单元4005准备好将新硬件线程指派给派生消息时,它加载遍历状态并在bvh上执行遍历。还存在需要在bvh上的第一遍历步骤之前执行的设立成本。
[0348]
图45图示了可编程光线追踪流水线的操作流程。可以在固定功能电路系统中实现包括遍历4502和交叉4503的共享元件,而可以利用可编程核/执行单元实现剩余元件。
[0349]
在4502处,主光线着色器4501将工作发送到遍历电路系统,该遍历电路系统遍历经过bvh(或其他加速结构)的(一个或多个)当前光线。当达到叶节点时,在4503处,遍历电路系统调用交叉电路系统,在4504处,该交叉电路系统在识别光线-三角形交叉时调用任何命中着色器(其可以如所指示的那样将结果提供回到遍历电路系统)。
[0350]
可替换地,可以在到达叶节点和在4507处调用的最接近命中着色器(如果命中被记录)或4506处的未命中着色器(在未命中的情况下)之前终止遍历。
[0351]
如在4505处指示的那样,如果遍历电路系统到达定制图元叶节点,则可以调用交叉着色器。定制图元可以是任何非三角形图元,诸如多边形或多面体(例如,四面体、体素、六面体、楔形物、锥体或其他“非结构化”体积)。交叉着色器4505识别光线与对实现任何命中处理的任何命中着色器4504定制的图元之间的任何交叉。
[0352]
当硬件遍历4502到达可编程级时,遍历/交叉单元4005可以生成着色器分派消息到相关着色器4505-4507,该相关着色器4505-4507对应于用于执行着色器的(一个或多个)执行单元的单个simd通道。由于分派发生在任意次序的光线中并且它们在所调用的程序中是发散的,因此分类单元4008可以累积多个分派调用以取出相干simd批量。经更新的遍历状态和可选着色器参数可以被遍历/交叉单元4005写入到存储器2511中。
[0353]
在k最接近交叉问题中,针对前k个交叉而执行最接近命中着色器4507。以传统方式,这将意指:在找到最接近交叉时结束光线遍历、调用命中着色器、以及从命中着色器派生新光线以找到下一最接近交叉(具有光线原点偏移,因此相同交叉不会再次发生)。容易看出,该实现将针对单个光线需要k个光线派生。另一实现使用插入分类操作来与任何命中着色器4504一起操作,任何命中着色器4504是针对所有交叉而调用的且维持最接近交叉的全局列表。关于该方法的主要问题是:不存在任何命中着色器调用的上界。
[0354]
如所提及的那样,可以在非三角形(定制)图元上调用交叉着色器4505。取决于交叉测试的结果和遍历状态(未决节点和图元交叉),相同光线的遍历可以在交叉着色器4505的执行之后继续。因此,找到最接近命中可能需要到执行单元的若干往返旅程。
[0355]
焦点还可以被放在通过对遍历硬件和着色器调度模型的改变而针对交叉着色器4505和命中着色器4504、4507的simd-mimd上下文切换的减少上。首先,光线遍历电路系统4005通过累积多个潜在调用并在更大批量中分派它们来推迟着色器调用。另外,可以在该级处剔除证明为不必要的某些调用。此外,着色器调度器4007可以将来自相同遍历上下文的多个着色器调用聚集成单个simd批量,这得到单个光线派生消息。在一个示例性实现中,遍历硬件4005中止遍历线程并等待多个着色器调用的结果。该操作模式在本文中被称作“投机”着色器执行,这是因为它允许多个着色器的分派,该多个着色器中的一些可以不是在使用顺序调用时调用的。
[0356]
图46a图示了其中遍历操作遇到子树中的多个定制图元4650的示例,并且图46b图示了可以如何利用三个交叉分派周期c1-c3解决这一点。特别地,调度器4007可能需要三个周期以将工作提交给simd处理器4001,并且遍历电路系统4005需要三个周期以将结果提供给分类单元4008。遍历电路系统4005所需要的遍历状态4601可以被存储在诸如本地高速缓存(例如,l1高速缓存和/或l2高速缓存)之类的存储器中。
[0357]
a. 推迟的光线追踪着色器调用还可以修改对硬件遍历状态4601进行管理以允许多个潜在交叉或命中调用在列表中的累积的方式。在遍历期间的给定时间处,可以使用列表中的每个条目以生成着色器调用。例如,可以在遍历硬件4005上和/或在存储器中的遍历状态4601中累积k个最接近交叉点,并且如果遍历完成,则可以针对每个元素而调用命中着色器。对于命中着色器,可以针对bvh中的子树而累积多个潜在交叉。
[0358]
对于最接近k使用情况,该方法的优点是:取代到simd核/eu 4001的k-1个往返路程以及k-1个新光线派生消息,在遍历电路系统4005上的单个遍历操作期间从相同遍历线程调用所有命中着色器。针对潜在实现的挑战是:它并不琐碎,以保证命中着色器的执行次序(标准“往返旅程”方法保证了首先执行最接近交叉的命中着色器等)。这可以由命中着色器的同步或排序的松弛来解决。
[0359]
对于交叉着色器使用情况,遍历电路系统4005不预先知道是否给定着色器将返回肯定交叉测试。然而,投机执行多个交叉着色器是可能的,并且如果至少一个返回肯定命中结果,则将它合并到全局最接近命中中。特定实现需要找到所推迟的交叉测试的最优数量以减少分派调用的数量,但避免调用太多冗余交叉着色器。
[0360]
b. 聚集来自遍历电路系统的着色器调用在从遍历电路系统4005上的相同光线派生分配多个着色器时,可以创建光线遍历算法的流程中的分支。这可能对于交叉着色器而言是有问题的,这是因为bvh遍历的剩余部分取决于所有所分派的交叉测试的结果。这意味着:同步操作是等待着色器调用的结果所必需的,这可能在异步硬件上有挑战性。
[0361]
合并着色器调用的结果的两个点可以是:simd处理器4001和遍历电路系统4005。关于simd处理器4001,多个着色器可以使用标准编程模型来同步和聚集它们的结果。一种完成这一点的相对简单的方式是:在存储器中的共享数据结构中使用全局原子和聚集结果,其中可以存储多个着色器的交叉结果。然后,最后的着色器可以解析数据结构并回调遍历电路系统4005以继续遍历。
[0362]
还可以实现更高效的方法,其将多个着色器调用的执行限于simd处理器4001上的相同simd线程的通道。然后使用simd/simt减少操作(而不是依赖于全局原子)来局部减少交叉测试。该实现可以依赖于分类单元4008内的新电路系统,以令小批量的着色器调用保留在相同simd批量中。
[0363]
可以在遍历电路系统4005上进一步中止遍历线程的执行。使用传统执行模型,当在遍历期间分派着色器时,终止遍历线程并且将光线遍历状态保存到存储器,以允许在执行单元4001处理着色器的同时执行其他光线派生命令。如果遍历线程仅被中止,则遍历状
态不需要被存储,且可以单独地等待每个着色器结果。该实现可以包括用于避免死锁且提供足够硬件利用的电路系统。
[0364]
图47-48图示了在具有三个着色器4701的simd核/执行单元4001上调用单个着色器调用的经推迟的模型的示例。在被保存时,所有交叉测试是在相同simd/simt组内评估的。因此,还可以在可编程核/执行单元4001上计算最接近交叉。
[0365]
如所提及的那样,着色器聚集和/或推迟的全部或部分可以由遍历/交叉电路系统4005和/或核/eu调度器4007执行。图47图示了调度器4007内的着色器推迟/聚集器电路系统4706可以如何推迟与特定simd/simt线程/通道相关联的着色器的调度,直到指定触发事件已经发生。在检测到触发事件时,调度器4007在单个simd/simt批量中将多个聚集着色器分派到核/eu 4001。
[0366]
图48图示了遍历/交叉电路系统4005内的着色器推迟/聚集器电路系统4805可以如何推迟与特定simd线程/通道相关联的着色器的调度,直到指定触发事件已经发生。在检测到触发事件时,遍历/交叉电路系统4005在单个simd/simt批量中将聚集着色器提交给分类单元4008。
[0367]
然而,注意着色器推迟和聚集技术可以是在各种其他组件(诸如,分类单元4008)内实现的或者可以跨多个组件而分布。例如,遍历/交叉电路系统4005可以执行着色器聚集操作的第一集合,并且调度器4007可以执行着色器聚集操作的第二集合,以确保在核/eu 4001上高效地调度针对simd线程的着色器。
[0368]
使聚集着色器被分派到核/eu的“触发事件”可以是处理事件,诸如特定数量的累积着色器或与特定线程相关联的最小时延。可替换地或另外,触发事件可以是时间事件,诸如从第一着色器的推迟起的某个持续时间或特定数量的处理器周期。诸如核/eu 4001和遍历/交叉单元4005上的当前工作负载之类的其他变量也可以由调度器4007评估,以确定何时分派着色器的simd/simt批量。
[0369]
可以使用上述方法的不同组合、基于所使用的特定系统架构和应用的要求来实现本发明不同实施例。
[0370]
光线追踪指令下述光线追踪指令被包括在由cpu 3199和/或gpu 3105支持的指令集架构(isa)中。如果被cpu执行,则单指令多数据(simd)指令可以利用向量/打包源和目的地寄存器以执行所描述的操作,且可以由cpu核解码和执行。如果被gpu 3105执行,则指令可以由图形核3130执行。例如,上述执行单元(eu)4001中的任一个可以执行指令。可替换地或另外,指令可以由光线追踪核3150和/或张量核3140上的执行电路系统执行。
[0371]
图49图示了用于执行下述光线追踪指令的架构。所图示的架构可以集成在上述核3130、3140、3150中的一个或多个内(参见例如图31和关联文本)或可以被包括在不同的处理器架构中。
[0372]
在操作中,指令提取单元4903从存储器3198提取光线追踪指令4900,并且解码器4995对指令进行解码。在一个实现中,解码器4995对指令进行解码以生成可执行操作(例如,经微编码的核中的微操作或μop)。可替换地,可以在没有解码的情况下执行光线追踪指令4900中的一些或全部,并且由此,解码器4904不是必需的。
[0373]
在两个实现中的任一个实现中,调度器/分派器4905跨功能单元(fu)4910-4912的
集合而调度和分派指令(或操作)。所图示的实现包括:向量fu 4910,用于执行单指令多数据(simd)指令,该simd指令在向量寄存器4912中存储的多个打包数据元素上并发地操作;以及标量fu 4911,用于对一个或多个标量寄存器4916中存储的标量值进行操作。可选的光线追踪fu 4912可以对向量寄存器4915中存储的打包数据值和/或标量寄存器4916中存储的标量值进行操作。在没有专用fu 4912的实现中,向量fu 4910和可能地标量fu 4911可以执行下述光线追踪指令。
[0374]
各种fu 4910-4912从向量寄存器4915、标量寄存器4916和/或本地高速缓存子系统4908(例如,l1高速缓存)访问执行光线追踪指令4900所需的光线追踪数据4902(例如,遍历/交叉数据)。fu 4910-4912还可以经由加载和存储操作来执行对存储器3198的访问,并且高速缓存子系统4908可以独立地操作以对数据进行本地高速缓存。
[0375]
尽管光线追踪指令可以用于提高针对光线遍历/交叉和bvh构建的性能,但它们还可以适用于其他领域,诸如高性能计算(hpc)和通用gpu(gpgpu)实现。
[0376]
在以下描述中,术语双字有时被缩写为dw,并且无符号字节被缩写为ub。另外,下面提到的源和目的地寄存器(例如src0、src1、dest等)可以指代向量寄存器4915或者在一些情况下指代向量寄存器4912和标量寄存器4916的组合。典型地,如果指令所使用的源或目的地值包括打包数据元素(例如,其中源或目的地存储n个数据元素),则使用向量寄存器4915。其他值可以使用标量寄存器4916或向量寄存器4915。
[0377]
去量化去量化指令的一个示例对先前量化的值进行“去量化”。作为示例,在光线追踪实现中,某些bvh子树可以被量化以降低存储和带宽要求。去量化指令可以采取去量化dest src0 src1 src2的形式,其中源寄存器src0存储n个无符号字节,源寄存器src1存储1个无符号字节,源寄存器src2存储1个浮点值,并且目的地寄存器dest存储n个浮点值。所有这些寄存器可以是向量寄存器4915。可替换地,src0和dest可以是向量寄存器4915,并且src1和src2可以是标量寄存器4916。
[0378]
以下代码序列定义了去量化指令的一个特定实现:for (int i = 0; i 《 simd_width) {
ꢀꢀꢀꢀ
if (execmask[i]) {dst[i] = src2[i] ldexp(convert_to_float(src0[i]),src1);
ꢀꢀꢀꢀꢀ
}}在该示例中,ldexp将双精度浮点值乘以2的指定整数次幂(即,ldexp(x, exp) = x * 2
exp
)。在以上代码中,如果与当前simd数据元素(execmask[i])相关联的执行掩码值被设置成1,那么将src0中的位置i处的simd数据元素转换成浮点值且乘以src1中的值的整数次幂(2
src1 value
),并且将该值添加到src2中的对应simd数据元素。
[0379]
选择性min或max选择性min或max指令可以执行每通道的min或max操作(即,返回值的集合的最小值或最大值),如位掩码中的位所指示。位掩码可以利用向量寄存器4915、标量寄存器4916或掩码寄存器(未示出)的单独集合。以下代码序列定义了min/max指令的一个特定实现:sel_min_max dest src0 src1 src2,其中src0存储n个双字,src1存储n个双字,src2存储
一个双字,并且目的地寄存器存储n个双字。
[0380]
以下代码序列定义了选择性min/max指令的一个特定实现:for (int i = 0; i 《 simd_width) {
ꢀꢀꢀꢀ
if (execmask[i]) {
ꢀꢀꢀꢀ
dst[i] = (1 《《 i) & src2
ꢀꢀ
min(src0[i],src1[i]) : max(src0[i],src1[i]);
ꢀꢀꢀꢀ
}}在该示例中,(1 《 《 i) & src2(1左移i同src进行与运算)的值用于选择src0和src1中的第i个数据元素的最小值或src0和src1中的第i个数据元素的最大值。仅当与当前simd数据元素(execmask[i])相关联的执行掩码值被设置成1时,才针对第i个数据元素而执行操作。
[0381]
洗牌索引指令洗牌索引指令可以将输入通道的任何集合拷贝到输出通道。对于simd宽度32,可以以较低吞吐量执行该指令。该指令采取下述形式:shuffle_index dest src0 src1 《optional flag》,其中src0存储n个双字,src1存储n个无符号字节(即,索引值),并且dest存储n个双字。
[0382]
以下代码序列定义了洗牌索引指令的一个特定实现:for (int i = 0; i 《 simd_width) {
ꢀꢀ
uint8_t srclane = src1.index[i];
ꢀꢀ
if (execmask[i]) {
ꢀꢀꢀꢀ
bool invalidlane = srclane 《 0 || srclane 》= simd_width || !execmask[srclanemod];
ꢀꢀꢀꢀ
if (flag) {
ꢀꢀꢀꢀꢀꢀ
invalidlane |= flag[srclanemod];
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
if (invalidlane) {
ꢀꢀꢀꢀꢀꢀ
dst[i] = src0[i];
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
else {
ꢀꢀꢀꢀꢀꢀ
dst[i] = src0[srclane];
ꢀꢀꢀꢀ
}
ꢀꢀ
}}
[0383]
在以上代码中,src1中的索引标识当前通道。如果执行掩码中的第i个值被设置成1,那么执行检验以确保源通道处于0至simd宽度的范围内。如果是,那么设置标志(srclanemod)并且将目的地的数据元素i设置为等于src0的数据元素i。如果通道处于范围内(即,是有效的),那么将来自src1的索引值(srclane0)用作到src0中的索引(dst[i] = src0[srclane])。
[0384]
立即数洗牌/dn/xor指令立即数洗牌指令可以基于指令的立即数来对输入数据元素/通道进行洗牌。立即数可以基于立即数的值来指定将输入通道移位1个、2个、4个、8个或16个位置。可选地,另外的标量源寄存器可以被指定为填充值。当源通道索引是无效的时,填充值(如果被提供的话)被存储到目的地中的数据元素位置。如果未提供填充值,则数据元素位置被设置成全0。
[0385]
标志寄存器可以被用作源掩码。如果针对源通道的标志位被设置成1,则源通道可以被标记为无效并且指令可以继续。
[0386]
以下是立即数洗牌指令的不同实现的示例:shuffle_《up/dn/xor》_《1/2/4/8/16》 dest src0 《optional src1》 《optional flag》shuffle_《up/dn/xor》_《1/2/4/8/16》 dest src0 《optional src1》 《optional flag》在该实现中,src0存储n个双字,src1存储针对填充值(如果存在的话)的一个双字,并且dest存储包括结果的n个双字。
[0387]
以下代码序列定义了立即数洗牌指令的一个特定实现:for (int i = 0; i 《 simd_width) {
ꢀꢀ
int8_t srclane;
ꢀꢀ
switch(shuffle_type) {
ꢀꢀ
case up:
ꢀꢀꢀꢀ
srclane = i
ꢀ‑ꢀ
shift;
ꢀꢀ
case dn:
ꢀꢀꢀꢀ
srclane = i shift;
ꢀꢀ
case xor:
ꢀꢀꢀꢀ
srclane = i ^ shift;
ꢀꢀ
}
ꢀꢀ
if (execmask[i]) {
ꢀꢀꢀꢀ
bool invalidlane = srclane 《 0 || srclane 》= simd_width || !execmask[srclane];
ꢀꢀꢀꢀ
if (flag) {
ꢀꢀꢀꢀꢀꢀ
invalidlane |= flag[srclane];
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
if (invalidlane) {
ꢀꢀꢀꢀꢀꢀ
if (src1)
ꢀꢀꢀꢀꢀꢀꢀꢀ
dst[i] = src1;
ꢀꢀꢀꢀꢀꢀ
else
ꢀꢀꢀꢀꢀꢀꢀꢀ
dst[i] = 0;
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
else {
ꢀꢀꢀꢀꢀꢀ
dst[i] = src0[srclane];
ꢀꢀꢀꢀ
}
ꢀꢀ
}}
[0388]
这里,基于立即数的值将输入数据元素/通道移位1个、2个、4个、8个或16个位置。寄存器sr1是被用作填充值的另外标量源寄存器,当源通道索引是无效的时,该填充值被存储到目的地中的数据元素位置。如果未提供填充值并且源通道索引是无效的,则将目的地中的数据元素位置设置成0。标志寄存器(flag)被用作源掩码。如果针对源通道的标志位被设置成1,则将源通道标记为无效的并且指令如上所描述的那样继续。
[0389]
间接洗牌/dn/xor指令间接洗牌指令具有对从源通道到目的地通道的映射进行控制的源操作数(src1)。间接洗牌指令可以采取下述形式:shuffle_《up/dn/xor》 dest src0 src1 《optional flag》其中src0存储n个双字,src1存储1个双字,并且dest存储n个双字。
[0390]
以下代码序列定义了立即数洗牌指令的一个特定实现:for (int i = 0; i 《 simd_width) {
ꢀꢀ
int8_t srclane;
ꢀꢀ
switch(shuffle_type) {
ꢀꢀ
case up:
ꢀꢀꢀꢀ
srclane = i
ꢀ‑ꢀ
src1;
ꢀꢀ
case dn:
ꢀꢀꢀꢀ
srclane = i src1;
ꢀꢀ
case xor:
ꢀꢀꢀꢀ
srclane = i ^ src1;
ꢀꢀ
}
ꢀꢀ
if (execmask[i]) {
ꢀꢀꢀꢀ
bool invalidlane = srclane 《 0 || srclane 》= simd_width || !execmask[srclane];
ꢀꢀꢀꢀ
if (flag) {
ꢀꢀꢀꢀꢀꢀ
invalidlane |= flag[srclane];
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
if (invalidlane) {
ꢀꢀꢀꢀꢀꢀ
dst[i] = 0;
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
else {
ꢀꢀꢀꢀꢀꢀ
dst[i] = src0[srclane];
ꢀꢀꢀꢀ
}
ꢀꢀ
}}
[0391]
因此,间接洗牌指令以与上述立即数洗牌指令类似的方式操作,但源通道到目的
地通道的映射由源寄存器src1而不是立即数来控制。
[0392]
交叉通道min/max指令可以针对浮点和整数数据类型而支持交叉通道最小值/最大值指令。交叉通道最小值指令可以采取lane_min dest src0形式,并且交叉通道最大值指令可以采取lane_max dest src0形式,其中src0存储n个双字并且dest存储1个双字。
[0393]
作为示例,以下代码序列定义了交叉通道最小值的一个特定实现:dst = src[0];for (int i = 1; i 《 simd_width) {
ꢀꢀ
if (execmask[i]) {
ꢀꢀꢀꢀ
dst = min(dst, src[i]);
ꢀꢀ
}}在该示例中,将源寄存器的数据元素位置i中的双字值与目的地寄存器中的数据元素进行比较,并且将两个值中的最小值拷贝到目的地寄存器。交叉通道最大值指令以基本上相同的方式操作,唯一区别是目的地值和位置i中的数据元素的最大值被选择。
[0394]
交叉通道min/max索引指令交叉通道最小值索引指令可以采取lane_min_index dest src0形式,并且交叉通道最大索引指令可以采取lane_max_index dest src0形式,其中src0存储n个双字并且dest存储1个双字。
[0395]
作为示例,以下代码序列定义了交叉通道最小值索引指令的一个特定实现:dst_index = 0;tmp = src[0]for (int i = 1; i 《 simd_width) {
ꢀꢀ
if (src[i] 《 tmp && execmask[i])
ꢀꢀ
{
ꢀꢀꢀꢀꢀ
tmp = src[i];
ꢀꢀꢀꢀꢀ
dst_index = i;
ꢀꢀ
}}在该示例中,将目的地索引从0递增到simd宽度,从而横跨目的地寄存器。如果执行掩码位被设置,那么将源寄存器中的位置i处的数据元素拷贝到临时存储位置(tmp)并且将目的地索引设置成数据元素位置i。
[0396]
交叉通道分类网络指令交叉通道分类网络指令可以使用n宽(稳定)分类网络、按升序(sortnet_min)或按降序(sortnet_max)对所有n个输入元素进行分类。指令的min/max版本可以分别采取sortnet_min dest src0和sortnet_max dest src0形式。在一个实现中,src0和dest存储n个双字。在src0的n个双字上执行min/max分类,并且升序的元素(针对min)或降序的元素(针对max)按它们相应的分类的次序而存储在dest中。定义指令的代码序列的一个示例是:dst = apply_n_wide_sorting_network_min/max(src0)。
[0397]
交叉通道分类网络索引指令交叉通道分类网络索引指令可以使用n宽(稳定)分类网络来对所有n个输入元素进行分类,但按升序(sortnet_min)或按降序(sortnet_max)返回排列索引。指令的min/max版本可以采取sortnet_min_index dest src0和sortnet_max_index dest src0形式,其中src0和dest各自存储n个双字。定义指令的代码序列的一个示例是dst = apply_n_wide_sorting_network_min/max_index(src0)。
[0398]
在图50中图示了用于执行上述指令中的任一个的方法。该方法可以被实现在上述特定处理器架构上,但不限于任何特定处理器或系统架构。
[0399]
在5001处,在处理器核上执行主图形线程的指令。这可以包括例如上述核中的任一个(例如,图形核3130)。当在主图形线程内到达光线追踪工作时,在5002处确定,光线追踪指令被卸载到光线追踪指令电路系统,其可以以诸如上面关于图49描述的功能单元(fu)的形式存在,或者可以处于如关于图31描述的专用光线追踪核3150中。
[0400]
在5003处,对光线追踪指令进行解码,从存储器提取光线追踪指令,并且在5005处,将指令解码成可执行操作(例如,在需要解码器的实施例中)。在5004处,调度和分派光线追踪指令以供光线追踪电路系统执行。在5005处,由光线追踪电路系统执行光线追踪指令。例如,可以在上述fu(例如向量fu 4910、光线追踪fu 4912等)和/或图形核3130或光线追踪核3150上分派和执行指令。
[0401]
当执行针对光线追踪指令而完成时,在5006处存储结果(例如,存储回到存储器3198),并且在5007处,通知主图形线程。在5008处,在主线程的上下文内处理光线追踪结果(例如,从存储器读取该光线追踪结果并且将该光线追踪结果整合到图形渲染结果中)。
[0402]
在实施例中,术语“引擎”或“模块”或“逻辑”可以指代下述各项、是下述各项的一部分或包括下述各项:专用集成电路(asic)、电子电路、执行一个或多个软件或固件程序的处理器(共享、专用或组)和/或存储器(共享、专用或组)、组合逻辑电路、和/或提供所描述的功能性的其他合适组件。在实施例中,可以以固件、硬件、软件或者固件、硬件和软件的任何组合实现引擎、模块或逻辑。
[0403]
用于异步光线追踪的装置和方法本发明实施例包括执行光线追踪的固定功能加速电路系统和通用处理电路系统的组合。例如,与包围体层级(bvh)的光线遍历和交叉测试相关的某些操作可以由固定功能加速电路系统执行,而多个执行电路执行各种形式的光线追踪着色器(例如任何命中着色器、交叉着色器、未命中着色器等)。一个实施例包括双高带宽存储库,该双高带宽存储库包括用于存储光线的多个条目和用于存储bvh节点的对应双栈。在该实施例中,遍历电路系统在双光线库与栈之间交替,以在每个时钟周期上处理光线。另外,一个实施例包括:优先级选择电路系统/逻辑,其在内部节点、非内部节点和图元之间区分,并使用该信息以对bvh节点和由bvh节点包围的图元的处理进行智能优先化排序。
[0404]
一个特定实施例使用短栈来减少针对遍历而需要的高速存储器,以在遍历操作期间存储有限数量的bvh节点。该实施例包括:栈管理电路系统/逻辑,用于高效地向短栈推送条目并从短栈弹出条目,以确保所需要的bvh节点是可用的。另外,通过执行对跟踪数据结构的更新来跟踪遍历操作。当遍历电路系统/逻辑被暂停时,它可以咨询跟踪数据结构以在它离开的bvh内的相同位置处开始遍历操作,并且,执行在数据结构跟踪中维持的跟踪数
据,使得遍历电路系统/逻辑可以重启。
[0405]
图51图示了一个实施例,包括用于执行着色器程序代码且处理关联光线追踪数据4902(例如,bvh节点数据和光线数据)的着色器执行电路系统4000、用于执行遍历和交叉操作的光线追踪加速电路系统5110、以及用于存储由rt加速电路系统5110和着色器执行电路系统4000处理的程序代码和关联数据的存储器3198。
[0406]
在一个实施例中,着色器执行电路系统4000包括:多个核/执行单元4001,其执行着色器程序代码以执行各种形式的数据并行操作。例如,在一个实施例中,核/执行单元4001可以跨多个通道而执行单个指令,其中指令的每个实例对在不同通道中存储的数据进行操作。在simt实现中,例如,指令的每个实例与不同的线程相关联。在执行期间,l1高速缓存存储用于高效访问的某个光线追踪数据(例如,最近或频繁访问的数据)。
[0407]
主光线的集合可以被分派到调度器4007,调度器4007将工作调度给由核/eu 4001执行的着色器。核/eu 4001可以是光线追踪核3150、图形核3130、cpu核3199、或者能够执行着色器程序代码的其他类型的电路系统。一个或多个主光线着色器5101处理主光线并派生要由光线追踪加速电路系统5110和/或核/eu 4001执行的另外工作(例如,以由一个或多个子着色器执行)。由主光线着色器5101或由核/eu 4001执行的其他着色器派生的新工作可以被分发给分类电路系统4008,分类电路系统4008如本文所描述的那样将光线分类成组或箱(例如,对具有类似特性的光线进行分组)。调度器4007然后调度核/eu 4001上的新工作。
[0408]
可执行的其他着色器包括如上所描述的那样处理命中结果(例如,分别识别针对给定光线的任何命中或最接近命中)的的任何命中着色器4514和最接近命中着色器4507。未命中着色器4506处理光线未命中(例如,其中光线不与节点/图元交叉)。所提及的那样,可以使用着色器记录来引用各种着色器,该着色器记录可以包括一个或多个指针、供应商特定元数据和全局参数。在一个实施例中,着色器记录由着色器记录标识符(sri)标识。在一个实施例中,着色器的每个执行实例与调用栈5203相关联,调用栈5203存储在父着色器与子着色器之间传递的参数。调用栈5121还可以存储对在调用返回时执行的延续部分功能的引用。
[0409]
光线遍历电路系统5102遍历经过bvh的节点的每个光线,从而沿bvh的层级向下(例如,通过父节点、子节点和叶节点)工作,以识别被光线遍历的节点/图元。光线-bvh遍历电路系统5103执行光线的交叉测试,确定图元上的命中点,并响应于命中而生成结果。遍历电路系统5102和交叉电路系统5103可以从一个或多个调用栈5121检索工作。在光线追踪加速电路系统5110内,调用栈5121和关联光线追踪数据4902可以被存储在本地光线追踪高速缓存(rtc)5107或其他本地存储设备内,以供遍历电路系统5102和交叉电路系统5103高效访问。下述一个特定实施例包括高带宽光线库(参见例如图52a)。
[0410]
光线追踪加速电路系统5110可以是本文描述的各种遍历/交叉电路的变型,该各种遍历/交叉电路包括光线-bvh遍历/交叉电路4005、遍历电路4502和交叉电路4503、以及光线追踪核3150。可以使用光线追踪加速电路系统5110,以代替光线-bvh遍历/交叉电路4005、遍历电路4502和交叉电路4503、以及光线追踪核3150、或者用于处理bvh栈和/或执行遍历/交叉的任何其他电路系统/逻辑。因此,结合本文描述的光线-bvh遍历/交叉电路4005、遍历电路4502和交叉电路4503、以及光线追踪核3150的任何特征的公开内容还公开了与光线追踪加速电路系统5110的对应结合,但不限于此。
[0411]
参考图52a,光线遍历电路系统5102的一个实施例分别包括第一和第二光线存储库5201和5202,其中每个库包括用于存储从存储器加载的对应多个传入光线5206的多个条目。对应第一和第二栈5203和5204分别包括从存储器读取且被本地存储以用于处理的所选bvh节点数据5290-5291。如本文所描述,在一个实施例中,栈5203-5204是包括用于存储bvh节点数据的有限数量的条目(例如,在一个实施例中,六个条目)的“短”栈。尽管与光线库5201-5202分离地图示,但栈5203-5204也可以被维持在对应光线库5201-5202内。可替换地,栈5203-5204可以被存储在单独的本地存储器或高速缓存中。
[0412]
遍历处理电路系统5210的一个实施例在选择下一光线和节点要处理(例如,以乒乓方式)时在两个库5201-5202与栈5203-5204之间交替。例如,遍历处理电路系统5210可以在每个时钟周期上从交替的光线库/栈选择新光线/bvh节点,从而确保非常高效的操作。然而,应当注意,该特定布置不是符合本发明的基础原理所必需的。
[0413]
在一个实施例中,光线分配器5205基于库分配计数器5220的集合的当前相对值将传入光线5206的条目分别平衡到第一和第二存储器库5201-5202中。在一个实施例中,库分配计数器5220在第一和第二存储器库5201-5202中的每一个中维持未遍历的光线的数量的计数。例如,当光线分配器5205将新光线添加到第一库5201时,可以递增第一库分配计数器,并且当从第一库5201处理光线时,可以递减第一库分配计数器。类似地,当光线分配器5205将新光线添加到第二库5201时,可以递增第二库分配计数器,并且当从第二组5201处理光线时,可以递减第二组分配计数器。
[0414]
在一个实施例中,光线分配器5205将当前光线分配给与更小计数器值相关联的库。如果两个计数器相等,则光线分配器5205可以选择任一个库或者可以选择与上次计数器相等时选择的库不同的库。在一个实施例中,每个光线被存储在库5201-5202之一的一个条目中,并且每个库包括用于存储多达32个光线的32个条目。然而,本发明的基础原理不限于这些细节。
[0415]
图52b图示了在一个实施例中执行以管理光线存储库5201-5202和栈5203-5204的四个进程5251-5254。在一个实施例中,四个进程5251-5254是程序代码的公共集合的不同实现或配置(本文中有时被称作“traceray”)。初始进程5251可以被执行以读取光线5261并从根节点开始执行bvh的新自顶向下遍历。alloc函数修改控制位并启动对应读取请求到光线追踪栈。特别地,为了分配新条目,alloc设置有效(vld)位并重置驱逐就绪(evict_rdy)位。在针对光线的库条目中,数据存在(dp)位和脏位被重置。对应栈条目中的dp位被设置。对于对应hitinfo,dp位被设置并且脏位被重置。与节点数据相关联的dp位和着色器记录标识符(sri)dp位被重置。
[0416]
实例进程5252执行bvh的节点之一(除根节点外)内的遍历,并读取光线和在先提交的命中5262。在一个实施例中,当命中着色器之一识别光线与图元之间的命中时,那么执行提交进程5253以提交结果,从而读取光线、潜在命中和栈5263。可替换地,执行继续进程5254以继续光线的遍历,从而读取光线、所提交的命中和栈5264。
[0417]
在各种情形中,遍历电路系统5002必须暂停遍历操作并保存当前光线和关联bvh节点,诸如当需要着色器执行操作序列时。例如,如果透光对象是命中或程序纹理,则遍历电路系统5002将栈5203-5204保存到存储器并执行所需要的着色器。一旦着色器已经完成对命中(或其他数据)进行处理,遍历电路系统5002就从存储器复原光线库5201-5202和栈
5203-5204的状态。
[0418]
在一个实施例中,遍历/栈跟踪器5248持续地监视遍历和栈操作并将重启数据存储在跟踪阵列5249中。例如,如果遍历电路系统5002已经遍历节点n、n0、n1、n2和n00且生成了结果,那么遍历/栈跟踪器5248将更新跟踪阵列,以指示这些节点的遍历已经完成和/或指示要从栈处理的下一节点。当遍历电路系统5002被重启时,它从跟踪队列5249读取重启数据,使得它可以在正确级处重启遍历,而不重新遍历bvh节点中的任一个(以及浪费周期)。跟踪阵列5249中存储的重启数据有时被称作“重启尾部”或“rst”。
[0419]
如图52b中所指示,各种traceray进程5251-5254经由一个或多个函数来管理进和出光线存储库5201-5202的分配。如针对初始进程5251而图示的那样,alloc函数设置存储库条目中的有效位(vld)(指示该条目现在包含有效光线)并重置(rst)驱逐就绪标志(指示光线数据不应当被驱逐)。光线函数将光线存储在所选择的条目中,并重置数据存在(dp)位(指示光线数据被存储在条目中)和脏位(指示数据未被修改)。在从存储库读取光线时,栈函数设置dp位并从栈检索相关bvh节点(例如,在初始进程5251的情况下的根节点以及在实例进程5252的情况下的另一节点)。hitinfo函数重置脏位,并针对初始函数5251而设置dp位或针对所有其他函数而重置它。在一个实施例中,hitinfo产生反映光线命中的数据。节点函数dp位和sri(着色器记录标识符)dp,该sri dp是针对着色器记录标识符的dp。一个实施例执行内核起始指针(ksp)查找以确保ksp不等于0。如果它等于0,那么针对透光四边形而实现不同的处理。
[0420]
在一个实施例中,一旦已经在存储库5201-5202之一中分配光线条目,就执行提取以从与光线相关联的栈检索节点数据(以及潜在地其他数据)。在一个实施例中,针对每个光线而维持栈,包括针对光线遍历经过的当前节点的数据的工作集合。
[0421]
在移动到bvh中的下一级别时(例如,在确定光线与父节点交叉时),在栈5203-5204上对子节点进行分类和推送。子节点被顺序地弹出栈且被个体地处理以识别光线遍历的子节点(遍历“命中”)。在一个实施例中,不论何时在rt加速电路系统5110与着色器4504、4506、4507、5101、5105之间存在移交时,都将栈存储出去到存储器或本地高速缓存/储存器。
[0422]
当包括四边形或三角形(或其他图元类型)的叶节点被遍历电路系统5102识别时,它将该信息传递到交叉电路系统5103,交叉电路系统5103分别在四边形或三角形上执行交叉测试。如果图元不是四边形或三角形,那么在一个实现中,遍历电路系统终止遍历并将控制传递回到最接近命中着色器4507(如果检测到命中)或未命中着色器4506(如果未检测到命中)。在其中交叉电路系统5103被设计成执行针对除四边形和三角形外还有多种图元(例如线、弧、圆等)的交叉的实现中,那么遍历电路系统5102会将针对这些图元的叶节点转发到交叉电路系统5103。
[0423]
在一个实施例中,当硬件或软件组件生成读取请求到存储器3198或高速缓存时,使用16位标签以提供与数据类型和请求者有关的信息。例如,两位代码可以指定该请求是针对光线、栈数据、命中数据、来自bvh的节点数据、还是任何其他类型的数据。当已经从存储器返回光线、栈和hitinfo时,光线遍历经过一个或多个bvh节点,并且如上所描述的那样执行交叉测试。
[0424]
在不同处理级处从存储器加载一个或多个栈5203-5204和光线5206。例如,初始进
程5251和/或实例进程5252可能需要新bvh被加载以用于遍历。在这些情形中,栈5203-5204可以被初始化成bvh的顶节点(或“根”节点)。对于bvh内的光线延续部分5254,可以从存储器加载栈5203-5204并扩充栈5203-5204。一旦已经准备栈5203-5204,就从栈提取节点数据(下面有时被称作proc_node_fetch的操作)。
[0425]
在一个实施例中,通过启动针对两个非内部(ni)节点和两个内部节点的并行请求来提取节点数据。图53图示了一个这种实施例,其中ni节点优先级选择逻辑(prisel)5311请求双ni节点:来自库0的第一ni节点5301和来自库1的第二ni节点5302。因此,内部节点prisel逻辑5312请求双内部节点:来自库0的第一节点5303和来自库1的第二节点5304。
[0426]
在一个实施例中,ni节点优先级选择逻辑(prisel)5311对第一ni节点5301和第二ni节点5302之一进行优先化排序,从而将经优先化排序的结果存储在光线追踪高速缓存(rtc)中。类似地,内部节点prisel逻辑5312请求双内部节点,并从第一内部节点5303和第二内部节点5304选择经优先化排序的结果。
[0427]
如果可能的话,优先级选择逻辑5311-5312的每个实例对来自不同库的非内部bvh节点5301-5302之一和内部bvh节点5303-5304之一进行优先化排序。在一个实施例中,从每个库选择仅一个请求(例如,请求5302和5304之一以及请求5301和5303之一)。这些请求的启动还可以如所指示的那样重置栈数据存在(dp)位,使得该条目不是响应于节点提取操作而检索的。在一个实施例中,对于实例提取操作,当实例请求被发送时,重置光线的数据存在(dp)位,并且当在节点提取之后变换光线时,最终设置光线的数据存在(dp)位。
[0428]
在一个实施例中,在读取的启动时写入node_info,并且针对读取请求而如下计算地址/标签:i.rtt_rtc_rd_addr[47:6]=rt_ray.rt_ray_ctrl.root_node_ptr[47:6] curr_stack.child_offset;(注意:节点上的子偏移始终关于当前bvh根节点);ii.rtt_rtc_rd_tag[6:0]={rtt_inst,rtt_alloc_entry[5:0]};iii.node.node_info=curr_stack.node_info。
[0429]
在一个实施例中,所返回的节点数据将针对节点和栈而设置dp位。
[0430]
可以基于读取标签来区分以下情况:a.内部节点:这将写入到节点;b.实例:这将针对下一级bvh(1)而更新rt_ray.rt_ray_ctrl并写入节点结构。
[0431]
i.root_node_ptr=node_return.startnodeptrii.hitgrp_srbase_ptr=rt_ray_ctrl.hitgrp_srbase_ptr rt_ray_ctrl.srstride*node_return.instancecontributiontohitgrpindexiii.hitgrp_sr_stride=rt_ray_ctrl.srstride*rt_ray_ctrl.shade_indx_multiv.inst_leaf_ptr=rt_ray.rt_ray_ctrl.root_node_ptr stack.current_node.child_offset

仅逻辑视图,在实例节点提取请求自身期间抓取和存储节点提取地址v.{miss_sr_ptr,shader_indx_mult,mask}={rt_ray[0].rt_ray_ctrl.miss_sr_ptr,rt_ray[0].rt_ray_ctrl.shader_indx_mult,rt_ray[0].rt_ray_ctrl.mask}保存bvh[0]
vi.flag[0]=rt_ray[0].rt_ray_ctrl.flag[0]|(~rt_ray[0].rt_ray_ctrl.flag[1]&node_return.flag[2]);

经由光线或经由实例标志保存不透光(仅当光线标志不是强制透光时)vii.flag[1]=(rt_ray[0].rt_ray_ctrl.flag[1])|(~rt_ray[0].rt_ray_ctrl.flag[0]&node_return.flag[3]);

经由光线或经由实例标志保存透光(仅当光线标志不是强制不透光时)viii.flag[3:2]=rt_ray[0].rt_ray_ctrl.flag[3:2];

(接受第一次命中并结束搜索或跳过最接近命中着色器)保存bvh[0]ix.flag[5:4]=node_return.flag[0]2’d0:rt_ray[0].rt_ray_ctrl.flag[5:4];

经由实例来禁用三角形剔除x.flag[8:6]=rt_ray[0].rt_ray_ctrl.flag[8:6];

(禁用交叉着色器,剔除不透光或剔除透光)保存bvh[0]xi.node.node_ctrl=针对实例不需要xii.node.node_data={

0,node_rtn.obj2world_p,world2obj_vzyx};c.四边形:这将更新节点如下i.node.node_ctrl={node_rtn.leafdesc.last,node_rtn.leafdesc.primindex1delta[15:0],node_rtn.leafdesc.primindex0[31:0],node_rtn.shader_indx};ii.node.node_data={

0,quad_mode,j[2:0],v[3:0]};

quad_mode=node_rtn.leafdesc.primindex1delta[15:0]!=

0;
[0432]
基于光线标志、实例标志和几何结构标志,图55a中所示的不透光/透光处理表指示要在节点数据被提取时使用的所得标志(不透光或透光)。如表中所指示,光线标志始终取得优先。另外,状态中的一些是互斥的。在一个实施例中,这些是以硬件利用排他位的优先级处理的。在一个实现中,如果cull_opaque和force_opaque两者都被设置,则将自动剔除关联几何结构。
[0433]
opaque=rt_ray.rt_ray_ctrl.flag[0]|quad.flag[0];(注意每bvh级别存储的光线已经计及实例标志)nopaque=rt_ray.rt_ray_ctrl.flag[1]|~quad.flag[0];
[0434]
图55b是示出了根据一个实施例的光线标志处理和异常的表。这里,剔除的决策基于光线标志、实例标志和几何结构标志的组合。
[0435]
cull_opaque=rt_ray.rt_ray_ctrl.flag[6]&(rt_ray.rt_ray_ctrl.flag[0]|quad.flag[0]);cull_nopaque=rt_ray.rt_ray_ctrl.flag[7]&(rt_ray.rt_ray_ctrl.flag[1]|~quad.flag[0]);cull=cull_opaque|cull_nopaque;
[0436]
在一个实施例中,可以如下实现基于掩码的剔除:mask_kill=~|(rtc_rtt_rd_rtn.mask&rtc_rtt_rd_rtn.data.mask);
[0437]
图55b是示出了根据一个实施例的最终剔除的表。作为(cull_opaque和force_opaque)或(cull_non_opaque和force_non_opaque)的光线标志是互斥的。然而,在该等式
中,光线标志还计及可设置不透光/透光的实例标志。仅几何结构可以被剔除,而实例和几何结构两者可以被掩码。
[0438]
如图56中所图示,在一个实施例中,基于上述剔除和mask_kill设置的评估,在5601或5602处确定早出,并且在5603处将结果发送到节点储存器和/或在5604处将结果发送到栈。
[0439]
一旦节点数据就绪,就可以执行盒/交叉测试。这在一个实施例中由本文中被称作ray_test_proc的进程完成,ray_test_proc具有运行的两个基础并发进程,一个填充四边形/实例(qi)并且另一个执行盒/交叉测试。在图57中图示的一个实现中,ray_test_proc启动优先级选择逻辑(prisel)5701-5702的两个并行实例:四边形/实例prisel5701,用于在来自库0的四边形/实例5711与来自库1的第二四边形/实例5712之间请求和选择;以及内部节点prisel5702,用于在来自库0的内部节点5713与来自库1的内部节点5714之间请求和选择。
[0440]
在一个实施例中,四边形/实例优先级选择逻辑5701对第一qi节点5711和第二qi节点5712之一进行优先化排序,从而将经优先化排序的结果存储在光线追踪队列(rtq)中以用于进一步处理(例如,交叉测试)。类似地,内部节点prisel逻辑5702对在其上执行光线追踪遍历(rtt)盒测试的内部bvh节点5713-5714之一进行优先化排序。在一个实施例中,从每个库选择仅一个请求(例如,请求5711和5712之一以及请求5713和5714之一)。这些请求的启动还可以如所指示的那样重置栈数据存在(dp)位,使得该条目不是响应于节点提取操作而检索的。在一个实施例中,对于实例提取操作,当实例请求被发送时,重置光线的数据存在(dp)位,并且当在节点提取之后变换光线时,最终设置光线的数据存在(dp)位。
[0441]
作为该进程的一部分,对于其中节点类型是透光的每个四边形测试分派,基于以下着色器记录标识符查找地址来作为无绑定线程分派(btd)而分派着色器记录标识符空查找:sri_null_lookup_ptr[47:3]=2*(ray.hitgroupsrbaseptr node.leafdesc.shaderindex*ray.srstride) 1;sri_null_lookup_tag[7:0]={1’d0,rtt_inst,rtt_alloc_entry[5:0]};
[0442]
在一个实施例中,四边形/实例(qi)解耦fifo被包括,以解析时间栈fifo满条件并实现利用到栈fifo(参见例如图60中的栈fifo6001)中的推送而对命中信息/光线的同步更新。这被完成以使得光线/命中信息具有在后续进程中设置的经保证的数据存在(dp)位。注意,光线/命中信息可以在与存储器写入冲突时被指派有固定高优先级。
[0443]
来自rtq的返回可以得到两个单独接口上的实例(例如,实例变换)或四边形(即,遍历/交叉测试结果)。下面是用于在一个实施例中处理结果的两个返回fifo:a.实例返回fifo:更新rt_ray.rt_ray_data=rtq_rt_ray_data;ray_dirty[entry]=1;b.四边形返回fifo:i.如果四边形是透光的并且(t
far
《p
rev
_t
far
)

检验sri_null_dp以弹出(从中读取)四边形/实例(qi)解耦fifo。注意在一个实施例中,来自光线追踪队列(rtq)fifo的hitinfo写入具有相比于memhitinfo更高的优先级。
[0444]
1.if(ksp_null=1)

,则将透光四边形视为仿佛它是不透光的,并更新
t
far
;2. if (ksp_null != 1 )
ꢀ→
· 将潜在的hitinfo写入到存储器,其中有效位被设置成1;
· 从rtq读取t、u、v、叶类型、primleafindex和正面;
· 从nodedata读取primindexdelta、primleafptr。更新来自光线数据的instanceleafptr;
· 如上计算的hitgrouprecptr;ii. 如果四边形是透光的并且(t
far 《 p
rev
_t
far
)
ꢀ→
·
利用valid = 1更新所提交的hitinfo;
· 从rtq读取t、u、v、叶类型、primleafindex和正面;
· 从nodedata读取primindexdelta、primleafptr;
· 更新来自rt_ray.rt_ray_ctrl的instanceleafptr;
· 如针对上面而计算的hitgrouprecptr。
[0445]
在一个实施例中,来自光线追踪遍历(rtt)盒交叉测试的返回可以推送到栈0/1(5203/5204)fifo 6001中以用于进一步处理。
[0446]
图58和图59a-b图示了使用“短”栈(例如,诸如栈5203或5204,其包括有限数量的本地栈条目)的bvh-光线处理的示例。短栈用于结合智能节点管理技术而节省高速储存器,以提供遍历操作的非常高效的序列。在所图示的示例中,短栈5203包括针对六个bvh节点的条目。然而,本发明的基础原理可以是使用各种大小的短栈来实现的。
[0447]
操作5949-5972在bvh遍历期间推送和弹出栈条目。在一个实施例中,操作5949-5972由栈处理电路系统5120(参见图51)在栈5203上执行。在bvh级别0处以根bvh节点n 5900开始,示出特定遍历序列。
[0448]
在5949处,利用节点n对栈5203进行初始化,然后,从栈弹出节点n并处理节点n,从而得到在bvh的级别1处包括子节点n0-n2 5901-5903的命中h0-h2(即,“命中”意味着光线遍历三个子节点n0-n2 5901-5903)。基于命中距离来对三个子节点命中5901-5902进行分类,并在栈5203(操作5950)上按所分类的次序推送三个子节点命中5901-5902。因此,在该实施例中,不论何时子节点的新集合被评估时,它们都是基于命中距离来分类的且按所分类的次序(即,其中更近的子节点处于栈的顶部)而写入到栈5203中。
[0449]
从栈5203弹出第一子节点n0 5901(即,最接近子节点)并对其进行处理,从而得到bvh的级别2(“级别”有时被称作bvh节点的“深度”)处的三个更多子节点命中n00-n02 5911-5913,其被分类且推送到栈5203(操作5951)。
[0450]
从栈弹出子节点n00 5911并对其进行处理,从而得到包括bvh的级别3处的单个子节点n000 5920的单个命中(操作5952)。该节点被弹出和处理,从而得到级别4处的六个命中n0000-n0005 5931-5936,其被分类且推送到栈5203(操作5953)。为了在短栈5203内腾出空间,如所指示的那样移除节点n1、n2、n02、n01(即,以将短栈限于六个条目)。第一所分类的节点n0000 5931被弹出和处理,从而生成bvh的级别5处的三个命中n00000-n00002 5931-5933(操作5954)。注意,n0005被移除以在短栈5203上针对新节点腾出空间。
[0451]
在一个实施例中,每当从短栈5203移除节点时,它都被保存回到存储器。然后,它将在稍后的时间处(例如,当到根据遍历操作来处理节点的时间时)被重新加载到短栈
5203。
[0452]
处理在图59a上继续,其中在bvh的节点5处弹出和处理节点n00001和n00002(操作5955-5956)。然后,弹出和处理级别4处的节点n0001、n0002、n0003和n0004(操作5957-5960),从而得到空短栈5203。
[0453]
因此,弹出操作导致根据重启尾部(rst)来检索根bvh节点(节点n)(操作5961)。再次对来自级别1的三个子命中n0、n1、n2进行分类,并将其推送到短栈(操作5962)。然后弹出和处理节点n0,紧接着是节点n00、n000和n0005(操作5963-5965)。弹出和处理节点n01(操作5966),紧接着是节点n02、节点n2和节点n1(操作5967-5970),从而再次得到空短栈。因此,从短栈弹出接下来的级别2节点n11并对其进行处理,从而完成遍历(即,因为节点n11未导致命中)。
[0454]
所提及的那样,遍历跟踪器5248的一个实施例更新跟踪阵列5249,跟踪阵列5249识别当前正在遍历的bvh层级的每个级别中的子节点/子树。在一个实现中,跟踪阵列5249的长度等于bvh的深度(在所图示的示例中为6),并且跟踪阵列5249中的每个条目包括标识当前正在遍历的子子树的索引值。在一个特定实现中,对于n宽bvh(即,其中每个内部节点引用n个子节点),跟踪阵列5249中的每个条目包括用于标识子节点/子树的log2(n)位值。在一个实施例中,被指派有比当前子索引更小的索引的子节点/子树已经被完全遍历,且因而不会在重启的情况下被重新访问。在一个实施例中,当最后的交叉孩子正在被遍历时,子索引被设置成最大值以指示在栈上不存在更多条目。
[0455]
短遍历栈5203可以将栈的顶部少数条目存储在圆形阵列中。在一个实现中,短遍历栈5203中的每个栈条目包括对节点的偏移、诸如节点类型(内部、图元、实例等)之类的杂项信息、以及指示该孩子是否是父节点中的最后(最远)交叉子节点的一个位。然而,这些特定细节不是符合本发明的基础原理所必需的。
[0456]
图60图示了如上所述的用于执行栈管理和遍历操作的栈处理电路系统/逻辑5120的一个实施例。栈fifo 6001被加载有需要处理的任何子bvh节点6000。例如,当盒测试或四边形测试由遍历处理电路系统5210完成时,结果被推送到栈fifo 6001中且用于更新栈5203。这可以包括例如对命中信息的更新,诸如与特定命中相关联的子节点6000的集合。
[0457]
栈处理电路系统/逻辑6003从栈6203读取条目,其中处理每个条目所需的数据包括与bvh节点是内部节点还是叶节点有关的指示以及关联索引数据。如果节点是叶节点/四边形,那么数据可以包括四边形描述符和索引以及着色器索引数据。栈处理电路系统/逻辑6003然后执行本文描述的栈处理操作,诸如识别与命中相关联的新节点并基于命中距离来对节点进行分类。尽管被图示为单独的实体,但栈处理电路系统/逻辑6003可以集成在遍历电路系统5102内。
[0458]
如所指示的那样,随着栈处理电路系统/逻辑6003完成处理来自栈5203的每个bvh节点,它生成栈更新6011。例如,在从栈5203读取条目之后,它可以更新各种控制位,诸如数据存在(dp)位和有效(vld)位。图60图示了驱逐就绪和数据存在位6010被设置。对应栈更新6011也可以被发送到栈5203(例如,允许旧条目被移除以针对新子节点腾出空间)。
[0459]
可以经由仲裁电路系统6012来控制栈更新,仲裁电路系统6012在下述各项之间进行选择:利用当前处理更新6011更新栈5203;利用一个或多个新bvh子节点填充来自存储器的栈5203(mem填充);以及执行到来自存储器的栈的初始分配(例如,以根节点和一个或多
个子节点开始)。
[0460]
在一个实施例中,当在栈上处理四边形/实例/内部节点时,可以执行以下操作中的一个或多个:i. 由于诸如针对新bvh而沿实例向下移动、处理命中程序、任何命中着色器等之类的多个条件所致的栈条目的驱逐;ii. 如果由于命中程序和/或任何命中着色器而驱逐栈,则对光线条目解除分配;iii. 如果由于命中程序和/或任何命中着色器而驱逐该栈,则对高速缓存条目解除分配;iv. 如果需要经由实例叶将光线向下传递到新bvh,则更新光线控制(仅bvh)。
[0461]
图61a-b图示了用于针对所有光线追踪遍历结构而配置读取/写入端口并设置控制位的表。特别地,针对光线6101、命中6102和栈6103而示出示例子结构、垂直结构和读取/写入动作。然而,注意本发明的基础原理不限于这些特定数据结构/操作。
[0462]
用于高质量光线追踪细节水平过渡的装置和方法在图形处理架构上,“细节水平”(lod)可以指代基于诸如与相机的距离之类的变量对网状物分辨率的选择。lod技术用于降低存储器消耗并改进图形处理功能,诸如游戏中的几何混叠。例如,当网状物远离于用户的当前视角时,高分辨率网状物的细节可能不是必需的。
[0463]
在基于光栅化的实现中,使用“随机lod”技术(诸如在lloyd et al, implementing stochastic levels of detail with microsoft directx raytracing(2020年6月15日)中描述)来实现lod之间的平滑过渡。在没有这些随机技术的情况下,lod之间的过渡可能导致分散伪像,其中当新lod被选择时,对象突然在外观方面改变。使用随机lod,通过将像素随机指派给过渡中涉及的lod之一(例如,更高分辨率或更低分辨率lod)来执行lod水平之间的交叉迭化(cross-dissolve)。
[0464]
上述解决方案使用二进制掩码和二进制比较值,以在从第一lod(“lod0”)衰减到第二lod(“lod1”)时实现用于随机lod过渡的八个过渡步长。在该实现中,对8位光线掩码和8位实例掩码进行逻辑与运算,以确定是否需要遍历实例。这些8位掩码和关联的逐位逻辑运算得到有限的lod过渡能力。例如,当在对象的lod0和lod1之间过渡(其中lod0具有小数值0.25并且lod1具有小数值0.75(基于相机距离))时,针对实例的掩码将被设置成lod0以启用仅2个随机位(8个位的0.25)。针对lod1的实例掩码将被设置成lod0的掩码的二进制补码,其中6个位被启用。对于任何给定光线,在光线掩码中选择一个随机位以实现lod0(具有概率0.25)和lod1(具有概率0.75)的随机选择。然而,因为八个位中的仅一个被选择,所以仅存在用于在lod0与lod1之间过渡的8个中间步长。
[0465]
如图62中所示,在本发明的一个实施例中,lod选择器6205被提供有n位比较操作掩码6220,其被视为二进制值以确定要执行的比较操作。所选择的比较操作用于与参考进行比较,以允许更多过渡lod步长。在一个实施例中,从小于或等于(less_equal)和大于(greater)选择比较操作,尽管本发明的基础原理不限于这些特定比较操作。在一个实现中,使用8个位(n = 8),其中这些位中的7个位定义了[0
……
127]范围内的无符号整数值,从而启用针对lod交叉衰减的128个过渡步长,并且1个位指示比较操作(例如,如果被设置成0,那么执行less_equal操作,并且如果被设置成1,则执行greater操作)。在一个实施例
中,还可以在范围[0
……
127]内将光线比较掩码6221提供给lod选择器6205,作为另外的光线参数。
[0466]
在一个实施例中,以下代码序列突出显示光线遍历如何对该新比较掩码作出反应:if( ray.instancemask & instance.instancemask ){
ꢀꢀꢀꢀ
if(
ꢀꢀꢀꢀ
( instance.comparisonmode == less_equal && instance.comparisonmask 《= ray.comparisonmask ) ||
ꢀꢀꢀꢀ
( instance.comparisonmode == greater && instance.comparisonmask 》 ray.comparisonmask )
ꢀꢀꢀꢀ
)
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀ
traverseinstance(instance);
ꢀꢀꢀꢀ
}}
[0467]
在以上代码序列中,第一个if声明测试二进制掩码是否允许到当前实例中的遍历。如果是,那么第二个if声明测试鉴于实例比较掩码(例如,比较操作掩码6220)和光线比较掩码6221的值的比较模式设置。
[0468]
返回到以上lod过渡示例,对于具有小数值0.25的lod0的实例,前7个位被设置成值31(=int(0.25*127)),并且最后位被设置成0(指示less_equal操作)。对于具有小数值0.75的lod1的实例,前7个位被设置成值31(=int((1.0-0.75)*127)),并且最后位被设置成1(指示greater操作)。因此,对于该实现,如果在范围[0
……
127]内生成均匀分布的随机数作为光线比较掩码,则存在可由lod选择器6205选择的多达127个过渡步长以用于在lod0与lod1之间过渡。
[0469]
尽管上面阐述的特定细节用于解释的目的,但可以利用其他细节实现本发明的基础原理。例如,取代less_equal和greater或者除less_equal和greater外,可以使用其他比较操作符。例如,还可以使用诸如not_equal、equal、less和greater_equal(大于或等于)之类的比较操作符。一个实现包括光线标志和实例标志,其禁用与运算光线掩码并启用这些位作为比较掩码的使用。
[0470]
本发明实施例包括执行光线追踪的固定功能加速电路系统和通用处理电路系统的组合。例如,与包围体层级(bvh)的光线遍历和交叉测试相关的某些操作可以由固定功能加速电路系统执行,而多个执行电路执行各种形式的光线追踪着色器(例如任何命中着色器、交叉着色器、未命中着色器等)。一个实施例包括双高带宽存储库,该双高带宽存储库包括用于存储光线的多个条目和用于存储bvh节点的对应双栈。在该实施例中,遍历电路系统在双光线库与栈之间交替,以在每个时钟周期上处理光线。另外,一个实施例包括:优先级选择电路系统/逻辑,其在内部节点、非内部节点和图元之间区分,并使用该信息以对bvh节点和由bvh节点包围的图元的处理进行智能优先化排序。
[0471]
加速数据结构压缩
加速数据结构的构造是高效光线追踪渲染中的最重要步骤之一。近期,本文广泛地描述的包围体层级(bvh)加速结构已经变为出于该目的而最宽泛地使用的结构。bvh是分层树形结构,其服务于对几何结构进行空间编索引和组织,使得可以非常高效地解析光线/图元交叉查询。解析这些查询的能力是用于光线追踪渲染的最关键操作之一。尽管下述本发明实施例在bvh结构上操作,但本发明的基础原理不限于bvh。这些实施例可以被应用于具有类似相关特征的任何其他加速数据结构。
[0472]
产生bvh典型地被称作“构造”或“构建”bvh。尽管已经提出多个bvh构造算法,但自顶向下bvh构建器主导地用于实现针对实时和离线渲染应用两者的高渲染效率。自顶向下bvh构建算法典型地在构造期间维持一个或多个临时阵列。这些阵列保持对几何结构进行分类/组织所必需的数据,以产生bvh结构。这些阵列在构建期间被读取和/或写入多次(典型地,针对bvh层级的每级别1-2次)。由于这些阵列常常是相当大的大小的,因此该过程是带宽密集型的。因此,如果该带宽问题未被解决,则bvh构建计算性能中的改进(诸如,可从硬件bvh构建器期望)很可能具有仅有限影响。
[0473]
本发明的一个实施例包括针对由许多自顶向下bvh构建器维持的临时数据的压缩方案。该压缩方案的目的是减小针对bvh构造而需要的带宽,从而实现更快速且更高效的bvh构造。然而,注意本发明实施例可以用于其他种类的bvh构建器且与其他类型的加速数据结构(诸如,kd树)一起使用。
[0474]
许多自顶向下bvh构建器在bvh构建期间维持两个主要类型的数据:(1)针对bvh构建中涉及的每个图元的轴对齐包围盒(aabb);以及(2)与每个图元相关联的无符号整数索引,其指向这些aabb之一和/或从中产生了aabb的原始图元。
[0475]
本发明的一个实施例将阵列结构(soa)布局用于将每个aabb与单个整数索引进行组合。在一个阵列中维持aabb,并且在第二阵列中维持整数索引。仅索引阵列必须被重排序以实现bvh构造。以该方式存储构建数据导致多个优势。在该布局方案中,aabb数据很大程度上是只读的,并且未针对大多数构建过程而引发aabb写入带宽。
[0476]
通过使用soa结构,需要在构建期间不频繁地压缩仅aabb。事实上,取决于实现,aabb数据可能仅需要在构建之前被压缩一次,作为预先过程。由于通过对索引阵列进行分区来执行构建,因此本发明的一个实施例在构建的每个级别处重新压缩这些。
[0477]
通过对这些阵列的经压缩的版本而不是它们的传统未经压缩对应物进行操作,减小针对bvh构造而需要的带宽。阵列的经压缩的版本被暂时地存储,且仅用于构建的目的。一旦构建完成,就丢弃它们,从而留下对图元的原始输入列表进行引用的bvh。
[0478]
本文描述的压缩技术的重要特性是:它们知道高速缓存线。全部两个经压缩的阵列被存储为固定大小的压缩块的阵列,其中大小是高速缓存线的整体数量。该数量大于或等于1。两种类型的阵列中的每一种的压缩块不需要是相同大小的。这两种类型的块在本文中被称作aabb压缩块和索引压缩块。
[0479]
注意,本发明的基础原理不需要块的大小是高速缓存线的整体数量。相反,这是本文描述的若干可选特征之一。在下述一个实施例中,该功能性由分别处于表b和d中的变量aabbcompressionblocksizebytes和indexcompressionblocksizebytes控制。
[0480]
因为随着自顶向下构建从树形结构的根继续到叶,每个节点的空间范围和由每个节点引用的图元的数量一般将减少,所以aabb的不同表示在构造的不同级处可以是适当
的。例如,经压缩的aabb的准确度在树的较高级别处可能较不关键,而在较低级别处可能需要更精确的表示以维持合理树质量。因此,在树的根附近使用有损压缩以最大化带宽节约并且针对较低级别切换到图元的未经压缩无损表示可能是足够的。这将bvh构造划分成图63中图示的至少两个阶段:顶部阶段6301,针对层级的指定级别处或以上的节点(节点0、1、8);以及底部阶段6302,针对指定级别以下的节点(节点2-7、9-14)。多级别构建可以以下述这样的方式继续:在较低级别中的任何节点被构建之前,构建整个较高级别层级(例如,图63中的

顶’部分),或者可以使级别的构建交错。如果整体在任何较低级别之前构建较高级别,则必须在构建的较低级别处拆分的节点可以被存储在诸如要在稍后级处分区的队列之类的结构上。
[0481]
对针对较低级别6302而使用aabb的全精度拷贝来说可替换地,方案的另一变形是在构建期间“重新压缩”aabb以用于在构建较低级别时使用。通过这样做,可以相对于个体子树的程度压缩几何结构。由于个体子树一般表示与根节点相比更小的空间范围,因此这可以有益于经压缩的表示的准确度或压缩的效率。在当前研究中观察针对多级经压缩的构建的类似模式。可以根据多种节点特性来定义构造的不同阶段之间的划分6300。一个实施例使用固定数量的图元以充当阈值。
[0482]
在本发明一些实施例中使用的变型代之以选择采用仅单级别构建。例如,可以使用构建数据的单个经压缩的表示以构建整个树。
[0483]
aabb压缩在本发明的一个实施例中,到aabb压缩逻辑(其可以以硬件和/或软件实现)的输入是未经压缩的图元的阵列,并且输出是aabb压缩块的阵列,aabb压缩块是固定大小的且与某个数量的高速缓存线对齐。由于网状物的任何特定区处的有效aabb压缩比是非常依赖于数据的,因此一个实施例针对每aabb压缩块打包可变数量的aabb。
[0484]
如图64中所示,压缩块6400的一个实施例被组织在两个主要部分中:元数据6401和向量残差6402。元数据6401提供将向量残差6402解码成aabb的列表所需的每块的信息和常量。向量残差6402存储用于表示aabb的大量压缩信息。下面更详细地描述这些元素中的每一个。
[0485]
简言之,在一个实施例中,使用增量压缩。seedvector包括aabb值的基线集合,并且向量残差6402将偏移提供给这些基线值以重构每个aabb。numresiduals值指定向量残差6402的数量,并且residualsizevector指定残差6402的大小。
[0486]
aabb全局压缩常量除每个压缩块6400中存储的每块的常量外,aabb全局压缩常量的集合可以在整个压缩过程中存储与所有块相关的信息。这些在表b中针对一个特定实现而总结
常量描述nq{x,y,z}标示用于在三个空间维度中的每一个中量化顶点组件的位的数量的三个值aabbcompressionblocksizebytesaabb压缩块的字节中的大小。该值将典型地与高速缓存线的某个数量对齐maxaabbsperblock在aabb压缩块中允许的aabb的最大数量。该常量连同numresidualvectorsperprimitive全局压缩常量一起被使用,以确定针对图64中所示的numresiduals值而需要的位的数量
numresidualvectorsperprimitive该值跟踪用于表示压缩块中的aabb的残差向量的数量。规则的aabb通常由两个3d向量min和max构成。然而,可能的是,aabb的表示可以被变换成具有不同数量的向量的结构。在关于aabb残差计算的稍后章节中讨论这一点的示例,其中一对3d向量被变换成单个6d向量。有必要使压缩算法跟踪该值以正确地执行多个核心操作residualnumdimensions该常量用于跟踪残差向量在它们被添加到aabb压缩块的点处将具有多少维度。需要该值,这是由于3daabb数据在压缩期间被变换成不同数量的维度是可能的
[0487]
表baabb压缩流程aabb压缩过程的一个实施例涉及:轮流迭代通过图元的输入阵列;以及输出aabb压缩块6400的阵列。输出阵列包含以压缩的形式表示图元的aabb所需的最小数量的aabb压缩块6400。
[0488]
图65图示了根据一个特定实施例的过程。如所提及的那样,压缩过程不限于任何特定架构,且可以以硬件、软件或其任何组合而实现。
[0489]
在6501处,提供针对bvh构建的图元的阵列。在6502处,选择阵列中的下一图元(例如,过程的起始处的第一图元)并且评估其aabb以用于压缩。如果在6503处确定(例如,基于其min/max数据)aabb适合在当前压缩块内,那么在6504处将aabb添加到当前压缩块。如所提及的那样,这可以包括:通过计算到压缩块内的现有基础向量(例如,seedvector)的距离来确定针对aabb的残差值。
[0490]
在一个实施例中,如果图元的aabb不适合在压缩块内,那么在6510处将当前压缩块定下来,并将其存储在输出阵列内的存储器中。在6511处,使用图元的aabb来对新压缩块进行初始化。在一个实施例中,图元aabb被用作针对新压缩块的种子向量。然后可以基于到新种子向量的距离来针对图元的后续aabb而生成残差。在一个实现中,基于到种子向量值的距离值来确定针对第二aabb而生成的第一残差。然后基于到第一残差的距离来确定针对第三aabb的第二残差。因此,如下面更详细地描述的那样,存储运行差异。一旦当前图元被压缩,该过程返回到6502,其中选择阵列中的下一图元以用于压缩。
[0491]
因此,轮流访问每个图元,确定其aabb(例如,作为浮点值)。然后,对aabb执行一系列操作以实现压缩,并且将压缩的结果添加到输出阵列中的当前aabb压缩块。如果经压缩的aabb适合,则将它添加到当前块,并且该过程移动到下一aabb。如果aabb不适合,则将当前aabb压缩块定下来,并且在输出阵列中对新aabb压缩块进行初始化。以该方式,对存储aabb所需的经压缩的块的数量进行最小化。
[0492]
表c中的以下伪代码示出了根据本发明一个特定实施例的aabb压缩的流程。然而,注意,本发明的基础原理不必限于这些细节。
[0493]
如伪代码序列中所示,对于每个aabb压缩块,将整数写入单独阵列(blockoffsets)中,该单独阵列记录原始图元阵列中每个aabb压缩块在其处开始的位置(即,它所包含的第一图元aabb)。在构建期间使用blockoffsets阵列,以用于解析经压缩的块所表示的原始图元id。
[0494]
aabb残差计算在一个实施例中,每个输入aabb经过一组级,以在将它添加到经压缩的块之前压缩它,从而得到图64中所示的向量残差。作为表c的第26行上的代码而捕获该过程,其中compressioncore用于将aabb转换成经压缩的向量的列表。
[0495]
表c在一个实施例中,aabb的压缩发生在以下级中:(1)量化;(2)变换;以及(3)预测/增量编码。
[0496]
1. 量化在一个实施例中,首先使用每轴固定数量的位将浮点aabb值量化到无符号整数表示。该量化步骤可以是以多种方式执行的。例如,在一个实现中,确定针对每个轴i的以下值:
其中s
min
和s
max
是要针对其而构建bvh的几何结构的整个集合的最小值和最大值坐标,n
b,i
是第i个轴中的经量化的网格中的单元的数量,nqi对应于表b中的值,vu
min
和vu
max
是经量化的aabb的最小值和最大值坐标,vf
min
和vf
max
是原始浮点aabb的最小值和最大值坐标,并且下标i标示给定轴(i∈{x,y,z})。由于任何浮点计算可能引入误差,中间值应当被向上或向下舍入以最小化vu
min
的值且最大化vu
max
的值。值还可以被转换成整数且被夹到有效范围,以确保驻留于几何结构的整个集合的aabb内部的防水aabb。
[0497]smin
和s
max
还可以表示几何结构的子集的范围(例如,更大bvh内的子树)。这可以出现在例如按照图63的多级别压缩构建中。
[0498]
2. 变换在一个实施例中,实现变换级,其中数据被变换成更服从压缩的形式。尽管可以使用多种变换,但本发明的一个实施例采用本文中被称作位置-范围变换的新变换,其将vu
min
和vu
max
组合成每图元的单个6维(6d)向量vt,如下所示:其中vu
min
{x, y, z}和vu
max
{x, y, z}分别是vu
min
和vu
max
的分量。实质上,该变换允许在剩余压缩级中单独地处理aabb的位置和范围/大小特性。如所提及的那样,还可以使用其他变换。
[0499]
3. 预测/增量编码在一个实现中,使用传统增量编码技术以实现良好压缩性能。在一个实施例中,每个压缩块中的第一向量被定名为“种子”向量,且被逐字地存储在aabb压缩块6400中,如图64中所示。对于后续向量,存储值的运行差异(即,残差6402)。这对应于预测方案,其中针对序列中的下一输入向量的预测始终是前一输入向量,并且残差值是当前和先前输入向量之差。该实施例中的残差值6402因而是有符号值,这需要另外的符号位。可以使用各种其他预测/增量编码,同时仍符合本发明的基础原理。
[0500]
一个实施例存储具有最小数量所需位的残差值6402,以便最大化压缩。基于残差编码步骤的结尾处的残差值的大小,将针对向量维度中的每一个而需要某个数量的位,以适应在该维度中遇到的值的范围。
[0501]
所需数量的位被存储在残差大小向量(rsv),如图64中的元数据6401中所图示。rsv对于给定压缩块6400而言是固定的,并且因此,特定块的给定维度中的所有值针对它们的残差6402使用相同数量的位。
[0502]
rsv的每个元素中存储的值仅仅是在维度中存储残差值的整个范围作为有符号数所需的位的最小数量。在压缩给定aabb压缩块(即,表c的第18-37行)的同时,维持适应到目前为止看到的所有向量所需的运行最大值数量的位。针对每个新添加的aabb(即,committoblock,表c的第32行)而确定rsv,并将rsv存储在压缩块的元数据中。
[0503]
为了测试是否新aabb将适合到当前块(即,testaddtoblock,表c的第28行和图65中的操作6503)中,我们计算将从添加新aabb而出现的期望新rsv,对期望rsv向量进行求和,且然后将该值乘以在新aabb被添加的情况下将存在于块中的残差的总数。如果该值处于可用于存储残差的预算内(即,小于或等于总块大小减去元数据6401大小),则可以将它
添加到当前块。如果否,那么对新压缩块进行初始化。
[0504]
熵编码本发明的一个实施例包括对aabb残差计算的另外步骤,其包括在预测/增量编码之后残差的熵编码。本发明的基础原理不限于该特定实现。
[0505]
预先分类/重排序能力作为可选预处理,可以对输入几何结构进行分类/重排序以改进空间相干性,这可以改进压缩性能。可以以多种方式执行分类。一种实现这一点的方式是使用莫顿码(morton code)分类。这种分类已经被用作其他bvh构建器中的主要步骤,以在取出层级之前提升几何结构中的空间相干性。
[0506]
可以按任何期望次序写入经压缩的aabb,但如果aabb被重排序/分类,那么有必要存储记录经分类的排序的另外整数阵列。该阵列由每图元的单个整数索引构成。构建可以以用于引用经重排序的图元列表的主索引继续。当需要原始图元id时(诸如,当叶节点的内容正在被写入时),我们必须使用主索引以在另外阵列中查找原始图元id,以确保树正确地引用原始输入几何结构列表。
[0507]
aabb解压缩在一个实施例中,一次针对整个aabb压缩块6400而执行aabb的解压缩。首先通过检查压缩块6400的元数据6401并基于该信息解释所存储的残差(例如,将距离值添加到种子向量和序列中的在先残差值),来重构残差数据。然后执行aabb压缩级中的每一个的逆操作,以对由压缩块表示的单精度浮点aabb进行解压缩。
[0508]
在采用与经压缩的层级输出对齐的降低精度构造技术的bvh构建器的情况下,一个实施例实现解压缩步骤的变型。这种降低精度构建器在2020年1月17日提交的、名称为“an architecture for reduced precision bounding volume hierarchy construction”、序列号为16/746,636的共同待审申请中描述,该共同待审申请被转让给本技术的受让人。降低精度构建器执行降低精度整数空间中的其许多计算。因此,本发明的一个实施例将本文描述的aabb残差计算的量化步骤与在降低精度构建器中采用的量化对齐。然后可以将aabb解压缩成仅整数,与当前正在被降低精度构建器处理的不论什么节点的坐标空间对齐。可以利用不输出经压缩的层级但执行顶点的量化的构建器实现类似变型。
[0509]
索引压缩在本发明的一个实施例中,索引阵列被压缩成索引压缩块的阵列。图66图示了包括元数据6603和索引残差6602的索引压缩块6610的一个实施例。索引阵列与aabb阵列不同,这是由于在构建过程期间对索引进行分区/重排序时,必须对它重新压缩。
[0510]
在许多传统bvh构建器中,索引被表示为无符号整数,一般每图元具有一个索引。索引阵列的目的是指向图元aabb。每个aabb/图元可以被分配有存储器中的固定大小。因此,随机访问阵列中的任何特定图元p或aabb a是可能的。然而,当aabb压缩导致每高速缓存线的可变数量的aabb时,不容易在压缩之后确定存储给定图元的aabb压缩块。因此,存储传统索引与本文描述的aabb压缩块不兼容。
[0511]
在本发明的一个实施例中,用于标识图元aabb的位置的编索引技术还允许索引自身的压缩。两个新技术下面被称作块偏移编索引(boi)和分层位向量编索引(hbi)。可以单独地或结合本发明各种实施例使用这些编索引实现。另外,按照图63,全部两个编索引技术
可以被用作多级别构建的一部分,并且全部两种类型的索引也可以被用作相同bvh构建的一部分。这些编索引技术允许bvh构建以与传统bvh构建器类似的方式继续,但具有aabb和对应索引阵列两者的经压缩的表示。
[0512]
全局索引压缩常量索引压缩采用一组全局索引压缩常量,其适用于所有索引压缩块。下面描述的全部两个索引压缩方案共享相同全局常量,其在下表d中总结
常量描述indexcompressionblocksizebytes索引压缩块的字节中的大小。该值将典型地与高速缓存线的某个数量对齐maxindicesperblock在索引压缩块中允许的索引的最大数量。该值确定存储由给定块表示的索引的数量所需的位的数量
[0513]
表d块偏移编索引在块偏移编索引(boi)中,规则的单整数索引被改变成包含两个整数的结构,两个整数中的一个标识压缩块6400,并且两个整数中的一个包括用于标识压缩块6400内的图元aabb数据的偏移。根据以下代码序列来生成新数据结构的一个实施例:struct blockoffsetindex{
ꢀꢀ
uint blockidx;
ꢀꢀ
uint blockoffset;}这里,blockidx存储对aabb压缩块的索引,并且blockoffset引用块内部的特定图元aabb(即,blockidx与blockoffset结合提供图元aabb的地址)。该信息足以完全引用在构建期间其压缩块内的特定aabb。
[0514]
在一个实施例中,针对bvh构建中的每个图元生成这些结构之一,因此,列表的大小是可预测的。然而,给定每aabb压缩块的可变数量的aabb,则将存在针对这些压缩块中的每一个的可变数量的这些索引结构(例如,对于每个aabb压缩块,blockoffset的不是所有可能值都将存在)。因此,为了正确地对块偏移索引的阵列进行初始化,有必要参考blockoffsets阵列(参见例如表c中的代码序列),根据blockoffsets阵列,可以与aabb压缩并发地或作为aabb压缩的后处理而确定每个aabb压缩块中的图元的数量。一旦被初始化,块偏移索引就可以被以与在传统bvh构建器中找到的传统索引实质上相同的方式处理。
[0515]
在传统bvh构建器中使用的单整数索引典型地在大小方面是4个字节。在一个实施例中,将26个位用于blockidx,并且将6个位用于blockoffset。在可替换实施例中,针对每个变量而使用更小数量的位,以减小整体存储器占地面积。在一个实施例中,由于针对blockoffset的固定大小必须被选择,因此这对每aabb压缩块的图元的最大数量施加限制。在6个位的情况下,可以每aabb压缩块表示最大值64个图元。
[0516]
针对块偏移编索引的要解决的剩余项目是可以如何实现压缩。对块偏移索引进行增量编码,并按序将其打包成索引压缩块。每个块是利用尽可能多的索引打包的,并且每当前一个达到容量时,都开始新的索引压缩块。这是以与aabb压缩块非常类似的方式执行的(如表c中所示),从而得到每索引压缩块的可变数量的索引。
[0517]
图66图示了包括除残差大小向量和种子向量外还标识索引数量的元数据6603的块偏移索引压缩块6610的一个示例。在一个实施例中,两通道编码用于索引残差6602,其中
blockidx和blockoffset值被单独地增量压缩。类似于aabb压缩块,索引压缩块6610存储块中的索引的数量的指示、针对残差的位的数量(作为残差大小向量)和种子向量,该种子向量包括针对blockidx的第一种子向量和针对blockoffset的第二种子向量。索引残差值6602包括由压缩引起的一对差值。例如,索引残差值可以包括:第一差值,表示当前输入blockidx值与在先输入blockidx值之差;以及第二差值,表示当前输入blockoffset值与在先输入blockoffset值之差。序列中的第一blockidx和blockoffset值被逐字地存储在seedvector字段中,seedvector字段表示根据其而计算第一残差值的向量。
[0518]
分层位向量编索引本发明的一个实施例使用被称作分层位向量编索引(hbi)的另一图元索引压缩技术,其可以是单独地或与块偏移编索引(boi)结合使用的。hbi与传统整数索引和boi两者的不同之处在于:单个hbi索引可以一次引用多个图元。事实上,hbi索引可以引用多达整个aabb压缩块。
[0519]
在图67a-b中示出了该类型的索引的经扩充的结构。每个hbi索引6700由两个元素构成。blockidx 6708指向给定aabb压缩块,从而服务于与块偏移索引中的对应元素相同的目的。第二组件是:位向量6701,其具有与在aabb压缩块中允许的aabb的最大数量(即,maxaabbsperblock)相等的数量的位。位向量6701中的每个位表明aabb压缩块中的对应元素是否由该索引引用。例如,如果位向量中的第三位是
‘1’
,则这表明aabb压缩块的第三aabb/图元由hbi索引引用。如果位是
‘0’
,那么该aabb/图元未被引用。
[0520]
相比于boi索引,当阵列被初始化时,创建每aabb压缩块的单个hbi索引6700。blockidx值6708被设置成从0开始的升序值,并且初始位向量6701被设置成全1。由于分区发生在自顶向下构建器中,因此如果由给定hbi索引6700引用的所有图元全部位于拆分平面的相同侧上,则索引可以仅仅被原样分区到列表的一侧,类似于传统整数索引。然而,如果hbi索引6700引用拆分平面的全部两侧上的图元,那么索引必须被拆分成两个新hbi索引,其中在与左和右分区相对应的两个新索引子列表中的每一个中放置一个hbi索引。为了拆分hbi索引,复制索引并且在索引的每个拷贝中更新位向量6701,以反映由两个新索引引用的图元。这意味着:阵列中的hbi索引的数量可以增长,并且索引的复制有些类似于如何在一些传统bvh构建器中处理空间拆分。用于处理潜在地增长的列表的简单方式仅仅是分配“最差情况”量的存储器。
[0521]
可以使用blockidx组件6708上的增量压缩将hbi索引6700打包成索引压缩块。另外,hbi索引还供应了它们从中导出它们的名称的分层压缩机会。不横跨拆分平面的任何hbi索引将具有等于
‘1’
的其位向量的所有元素。在将hbi索引打包成索引压缩块时,可以使用单个位的标志(在本文中有时被称作位向量占用标志)以指示整个位向量是“全1”。值
‘0’
指示位向量被逐字地存储在块中,并且指
‘1’
指示向量是“全1”且因而根本未被存储(除了标志)。因此,hbi索引从两个技术导出压缩:增量编码和分层位向量。像boi索引那样,还以与aabb压缩块非常类似的方式将hbi索引打包成压缩块。为了正确地执行这一点,压缩操作还必须监视索引位向量以决定是否必须逐字地存储任何位向量,并将这一点纳入针对块而需要的大小作为因素。
[0522]
图67b示出了可以如何将hbi索引的序列编码成包括残差数据6704和元数据6701的hbi压缩块6710。在该实施例中,残差数据包括blockidx残差6702和分层成员位向量
6703。按照图63的多级别构建情形,hbi编索引意图在层级的顶部附近或在最近已针对其而重新压缩aabb压缩块的子树的顶部附近进行操作。这是因为与其他编索引方法相比通过改变aabb压缩块中的空间相干性来更直接地影响hbi索引。事实上,尽管hbi索引提供压缩,但最差情况情形可能实际上导致索引数据的扩充(最多到上界)。过渡到块偏移编索引(boi)或传统整数索引中部构建(mid-build)可以避免该情形,且在近期尚未执行重新压缩的情况下可以更有效。
[0523]
构建级别之间的索引过渡如果在bvh构建中使用boi或hbi索引并且构建过渡到另一级(按照图63的多级别构建情形),那么将有必要将索引解码成对于下一构建级而言适当的形式。例如,在针对树的较高级别使用块偏移编索引并且从经压缩的aabb表示过渡到传统aabb表示的简单情况下,那么将有必要将块偏移索引解码成传统整数索引。可以在过渡之后丢弃块偏移索引。
[0524]
类似过渡将需要针对hbi编索引且针对采用不同aabb压缩配置的两个经压缩的构建级别之间的过渡而发生。过渡过程是相对简单的,这是由于块偏移索引和分层位向量索引两者都表示相同基础信息的可替换编码,且还可以始终被解码成引用图元的原始集合的传统整数索引。
[0525]
对经压缩的索引阵列进行分区在自顶向下bvh构建中,有必要对整数索引的列表进行分区/分类,以便在构建期间且针对索引排序而进行递归,以反映树形结构。在传统bvh构建器中,该步骤是直截了当的,这是由于索引是规则的未经压缩的数据结构。然而,本文描述的本发明实施例导致了新挑战,这是因为必须对索引压缩块的列表而不是索引的列表进行分区。此外,预测块的数量直到所有索引被压缩之后是不可能的。由于在每个分区步骤之后重新压缩索引,因此该挑战遍及构建而存在。
[0526]
尽管预先预测经压缩的索引阵列的大小是不可能的,但如果我们知道要压缩的索引的数量,则我们可以在阵列的最大大小上放置上界。在自顶向下bvh构建器中,在分区发生之前,由节点分区引起的每个索引子分区中的索引的数量典型地已知,并且因此,可以在每个分区步骤处针对全部两个子阵列导出上界。
[0527]
在boi的情况下,当索引的压缩未被增量压缩实现时,阵列的最大大小出现。通过将针对块的元数据的大小纳入作为因素,预测块的最大数量且因而预测字节中的最大大小是可能的。
[0528]
在hbi编索引的情况下,当blockidx的增量压缩未被实现时,最大大小出现,并且,hbi索引被拆分到下述这样的程度:每个hbi索引表示仅单个图元(在每个索引位向量中设置仅一个位)。通过将所有元数据纳入作为因素,包括针对分层位向量的第一级别而使用的另外位(位向量占用标志),我们可以计算块的最大数量,且因而可以计算针对给定数量的图元的字节中的最大大小。
[0529]
考虑到上界可以被放置在阵列的大小上,则使用简单技术以使用一对阵列来对索引压缩块阵列进行分区。基于索引类型将全部两个阵列调整大小到最大可能大小,如前面在该章节中所讨论。在构建的开始处,将初始索引的集合写入到该对中的阵列之一。对于每个级别,读取、解释来自一个阵列的块,并且将新压缩的块写出到第二阵列,其反映经分区的索引。在递归时,可以切换阵列中的每一个的角色,从而始终从刚刚已写入的阵列进行读
取。由于索引的排序改变以反映分区,因此索引阵列被持续地重新压缩。
[0530]
由于可以预测分区中的块的最大数量,因此由分区引起的每个子阵列可以被写入另一阵列的位置中,使得始终可以适应最大大小。这可以有效地得到阵列中的“间隙”,但仍然实现带宽压缩。如果以该方式对索引进行分区,则bvh构建器可以跟踪当前构建任务就引用其图元的索引压缩块以及构建任务中的图元的数量而言的起始/结尾。
[0531]
空间拆分用于在一些情况下改进bvh遍历效率的广泛使用的技术是使用空间拆分。由于aabb未在构建的每个级别处被重新压缩,因此难以将在构建自身期间发生的空间拆分(如在一些相关工作中所见)并入到压缩方案中。然而,按照其他先前设计,压缩方案应当与预先拆分方法兼容。这种方案将aabb的集合递送到bvh构建,且一般需要对构建自身的极少修改或不需要对构建自身的修改。
[0532]
一种用于将这些预先拆分方案与本发明实施例进行组合的方式是:预先准备浮点aabb的阵列,包括所有拆分图元(而不是按照表c的第23行计算它们);以及保持将它们链接回到原始图元的id的阵列。我们然后可以使用boi或hbi索引或者传统索引,以在构建期间引用这些aabb,并在需要时(诸如,在写入叶节点时)将它们链接回到原始图元。
[0533]
图68图示了具有用于执行本文描述的压缩和解压缩技术的压缩硬件逻辑6810和解压缩硬件逻辑6808的gpu 2505的光线追踪引擎8000的一个实施例。然而,注意图68包括不是符合本发明基础原理所需的许多特定细节。
[0534]
示出了基于图元6806(例如,与当前图形图像相关联)的当前集合对bvh进行构造的bvh构建器6807。在一个实施例中,bvh压缩逻辑6810与bvh构建器6807协同地操作,以并发地压缩由bvh构建器6807使用的基础数据,以生成数据6812的经压缩的版本。特别地,压缩逻辑6810包括:包围盒压缩器6825,生成aabb压缩块6400;以及索引压缩器6826,生成索引压缩块6610,如本文所描述。尽管在图68中被图示为单独的单元,但压缩逻辑6810可以集成在bvh构建器6807内。相反,bvh构建器不是符合本发明基础原理所必需的。
[0535]
当系统组件需要未经压缩的数据6814(例如,诸如bvh构建器6807)时,解压缩逻辑6808实现本文描述的技术以对经压缩的数据6812进行解压缩。特别地,索引解压缩器6836对索引压缩块6610进行解压缩,并且包围盒解压缩器6835对aabb压缩块6400进行解压缩,以生成未经压缩的数据6814的未经压缩的aabb。未经压缩的数据6814然后可以由其他系统组件访问。
[0536]
图68中图示的各种组件可以以硬件、软件或其任何组合而实现。例如,可以在执行单元4001中的一个或多个上执行某些组件,而可以以硬件实现诸如遍历/交叉单元6803之类的其他组件。
[0537]
此外,图元6806、经压缩的数据6812和未经压缩的数据6814可以被存储在本地存储器/高速缓存6898和/或系统存储器(未示出)中。例如,在支持共享虚拟存储器(svm)的系统中,可以跨一个或多个本地存储器和物理系统存储器而映射虚拟存储器空间。如上所提及,可以基于高速缓存层级中的高速缓存线的大小来生成bvh压缩块(例如,以适合每高速缓存线的一个或多个压缩块)。
[0538]
用于位移网状物压缩的装置和方法本发明的一个实施例使用用于可见性查询的光线追踪来执行路径追踪以渲染逼
真图像。在该实现中,从虚拟相机投射且通过所仿真的场景来追踪光线。然后执行随机采样以递增地计算最终图像。路径追踪中的随机采样使噪声出现在经渲染的图像中,该噪声可以是通过允许生成更多样本来移除的。该实现中的样本可以是由单个光线引起的颜色值。
[0539]
在一个实施例中,用于可见性查询的光线追踪操作在预处理阶段中依赖于在场景图元(例如三角形、四边形等)上生成的包围体层级(bvh)(或其他3d分层布置)。使用bvh,渲染器可以快速地确定光线与图元之间的最接近交点。
[0540]
当以硬件(例如,诸如使用本文描述的遍历/交叉电路系统)加速这些光线查询时,存储器带宽问题可能由于所提取的三角形数据的量而发生。幸运的是,所建模的场景中的许多复杂度由位移映射产生,其中使用细分规则来对诸如细分表面之类的平滑基础表面表示进行精细曲面细分,以生成如图69a中所示的曲面细分网状物6991。将位移功能6992应用于精细曲面细分网状物的每个顶点,该精细曲面细分网状物典型地仅沿基础表面的几何法线而位移,或者位移到任意方向中以生成位移网状物6993。被添加到表面的位移的量在范围方面受限;因此,与基础表面的非常大的位移是不频繁的。
[0541]
本发明的一个实施例使用有损防水压缩来有效地压缩位移映射网状物。特别地,该实现对相对于粗基础网状物的位移进行量化,该粗基础网状物可以匹配于基础细分网状物。在一个实施例中,可以使用与位移映射相同的准确度的到网格中的双线性内插,来对基础细分网状物的原始四边形进行细分。
[0542]
图69b图示了包括根据本文描述的实施例的位移映射网状物6902的压缩电路系统/逻辑6900,用于生成经压缩的位移网状物6910。在所图示的实施例中,位移映射电路系统/逻辑6911从基础细分表面生成位移映射网状物6902。图70a图示了其中图元表面7000被精细曲面细分以生成基础细分表面7001的示例。位移功能被应用于基础细分表面7001的顶点以创建位移映射7002。
[0543]
返回到图69b,在一个实施例中,量化器6912相对于粗基础网状物6903而对位移映射网状物6902进行量化,以生成包括与粗基础网状物6903相关联的基础坐标6905和3d位移阵列6904的经压缩的位移网状物6910。作为示例而非限制,图70b图示了差向量d1-d4 7022的集合,每个向量与不同位移顶点v1-v4相关联。
[0544]
在一个实施例中,粗基础网状物7003是基础细分网状物6301。可替换地,内插器6921使用与位移映射相同的准确度的到网格中的双线性内插,来对基础细分网状物的原始四边形进行细分。
[0545]
量化器6912确定从每个粗基础顶点到对应位移顶点v1-v4的差向量d1-d4 7022,并在3d位移阵列6904中组合差向量7022。以该方式,使用仅四边形的坐标(基础坐标6905)和3d位移向量6904的阵列来定义位移网格。注意,这些3d位移向量6904不必然匹配于用于计算原始位移7002的位移向量,这是由于建模工具通常不会使用双线性内插来对四边形进行细分并应用更复杂细分规则以创建要位移的平滑表面。
[0546]
如图70c中所图示,两个相邻四边形7090-7091的网格将无缝地缝合在一起,这是由于沿着边界7092,全部两个四边形7090-7091将评估到完全相同的顶点位置v5-v8。由于沿针对相邻四边形7090-7091的边7092而存储的位移也是相同的,因此位移表面不会具有任何裂缝。该性质是显著的,这是由于这特别地意味着可以针对整个网状物任意地降低所存储的位移的准确度,从而导致更低质量的所连接的位移网状物。
[0547]
在一个实施例中,使用半精度浮点数以对位移进行编码(例如,16位浮点值)。可替换地或另外,使用共享指数表示,其针对所有三个顶点组件和三个尾数存储仅一个指数。进一步地,由于位移的程度通常相当有界限,因此可以使用由某个常量缩放的固定点坐标来对一个网状物的位移进行编码,以获得足以对所有位移进行编码的范围。尽管本发明的一个实施例将双线性补片用作基础图元,但使用仅平坦三角形,另一实施例使用三角形对以处理每个四边形。
[0548]
在图71中图示了根据本发明的一个实施例的方法。该方法可以被实现在本文描述的架构上,但不限于任何特定处理器或系统架构。
[0549]
在7101处,从基础细分表面生成位移映射网状物。例如,可以对图元表面进行精细曲面细分以生成基础细分表面。在7102处,生成或识别基础网状物(例如,诸如在一个实施例中,基础细分网状物)。
[0550]
在7103处,将位移功能应用于基础细分表面的顶点,以创建差向量的3d位移阵列。在7104处,生成与基础网状物相关联的基础坐标。如所提及的那样,可以与差向量组合地使用基础坐标以重构位移网格。在7105处,存储经压缩的位移网状物,包括3d位移阵列和基础坐标。
[0551]
在6506处确定,下一次从储存器或存储器读取图元时,在7103处从经压缩的位移网状物生成位移网格。例如,可以将3d位移阵列应用于基础坐标以重构所分派的网状物。
[0552]
针对有损网格图元的增强有损位移网状物压缩和硬件bvh遍历/交叉复杂动态场景对于实时光线追踪实现而言是有挑战性的。程序表面、蒙皮动画等需要三角测量的更新和每个帧中的加速结构,甚至在第一个光线被启动之前。
[0553]
取代仅将双线性补片用作基础图元,本发明的一个实施例将方法扩展成支持双三次四边形或三角形补片,其需要以防水方式在补片边界处加以评估。在一个实现中,将位域添加到有损网格图元,指示隐式三角形是否有效。一个实施例还包括:经修改的硬件块,其将现有曲面细分器扩展成直接产生有损位移网状物(例如,如上面关于图69a-71描述的那样),然后,该有损位移网状物被存储出去到存储器。
[0554]
在一个实现中,对bvh遍历单元的硬件扩展取得有损网格图元作为输入,并动态地取出针对隐式地引用的三角形/四边形的子集的包围盒。所取出的包围盒以与bvh遍历单元的光线-盒测试电路系统(例如,下述光线/盒遍历单元8930)兼容的格式存在。光线相对于动态生成的包围盒交叉测试的结果被传递到光线-四边形/三角形交叉单元8940,其取出包围盒中包含的相关三角形并与那些相关三角形交叉。
[0555]
一个实现还包括使用间接地引用的顶点数据对有损网格图元的扩展(类似于其他实施例),从而通过跨相邻网格图元共享顶点数据来降低存储器消耗。在一个实施例中,使硬件bvh三角形交叉器块的经修改的版本知道来自有损位移网状物的作为三角形的输入,从而允许它针对相邻三角形重用边计算。还将扩展添加到有损位移网状物压缩以处理运动模糊几何结构。
[0556]
如上所描述,假定输入是任意维度的网格网状物,则首先将该输入网格网状物细分成具有固定分辨率(诸如,如图72中图示的4
×
4个顶点)的更小子网格。
[0557]
如图73中所示,在一个实施例中,现在基于4
×
4个输入顶点来计算有损4
×
4网格图元结构(gridprim)。一个实现根据以下代码序列来进行操作:
structgridprim{
ꢀꢀ
primleafdescleafdesc;//4b
ꢀꢀ
uint32_tprimindex;//4b
ꢀꢀ
float3vertex[4];//48b
ꢀꢀ
struct{
ꢀꢀꢀꢀ
exp:7;//共享的指数
ꢀꢀꢀꢀ
disp_x:5;
ꢀꢀꢀꢀ
disp_y:5;
ꢀꢀꢀꢀ
disp_z:5;
ꢀꢀ
}disp_mag[16];//44b};//总共64个字节
[0558]
在一个实现中,这些操作消耗100个字节:可以预留来自primleafdesc的18个位以禁用个体三角形,例如,(按自顶向下、从左到右的次序)000000000100000000b的位掩码将禁用图74中所示的突出显示的三角形7401。
[0559]
隐式三角形可以是3
×
3个四边形(4
×
4个顶点)或更多三角形。这些中的许多缝合在一起,从而形成网状物。掩码告诉我们是否想要与三角形交叉。如果到达孔,则每4
×
4网格对个体三角形进行去激活。这实现了更大的精度和显著降低的存储器使用率:~5.5个字节/三角形,这是非常紧致的表示。相比而言,如果以全精度存储线性阵列,则每个三角形取得48个和64个字节。
[0560]
如图75中所图示,硬件曲面细分器7550将补片曲面细分成以4
×
4个单位表示的三角形并将它们存储出去到存储器,因此,bvh可以被构建在它们上并且它们可以被光线追踪。在该实施例中,硬件曲面细分器7550被修改成直接支持有损位移网格图元。取代生成个体三角形并将它们传递到光栅化单元,硬件曲面细分单元7550可以直接生成有损网格图元并将它们存储出去到存储器。
[0561]
对硬件bvh遍历单元7550的扩展取有损网格图元作为输入,且即时地取出针对隐式地引用三角形/四边形的子集的包围盒。在图76中所示的示例中,从有损网格取出九个包围盒7601a-i(针对每个四边形,一个包围盒)并将其作为特殊九宽bvh节点而传递到硬件bvh遍历单元7550以执行光线-盒交叉。
[0562]
一个接一个地测试所有18个三角形是非常昂贵的。参考图77,一个实施例针对每个四边形取出一个包围盒7601a-i(尽管这仅是示例;可以取出任何数量的三角形)。当三角形的子集被读取并且包围盒被计算时,生成n宽bvh节点7700——针对每个四边形,一个子节点7601a-i。该结构然后被传递到硬件遍历单元7710,其遍历经过新构造的bvh的光线。因此,在该实施例中,网格图元用于隐式bvh节点,根据该隐式bvh节点,可以确定包围盒。当包围盒被生成时,已知包含两个三角形。当硬件遍历单元7710确定光线遍历包围盒7601a-i之一时,相同结构被传递到光线-三角形交叉器7715以确定哪个包围盒已被命中。也就是说,如果包围盒已经被命中,则针对包围盒中包含的三角形执行交叉测试。
[0563]
在本发明的一个实施例中,这些技术被用作对光线-三角形遍历7710和交叉单元7710的预先剔除步骤。当可以使用仅bvh节点处理单元来推断三角形时,交叉测试明显更便
宜。对于每个交叉包围盒7601a-i,将两个相应三角形传递到光线追踪三角形/四边形交叉单元7715以执行光线-三角形交叉测试。
[0564]
上述网格图元和隐式bvh节点处理技术可以被整合在对本文描述的遍历/交叉单元中的任一个(例如,诸如下述光线/盒遍历单元8930)的预处理步骤内或被用作该预处理步骤。
[0565]
在一个实施例中,这种4
×
4有损网格图元的扩展用于支持具有两个时间步长的运动模糊处理。在以下代码序列中提供一个示例:structgridprimmb{
ꢀꢀ
primleafdescleafdesc;//4b
ꢀꢀ
uint32_tprimindex;//4b
ꢀꢀ
float3vertex_time0[4];//48b
ꢀꢀ
float3vertex_time1[4];//48b
ꢀꢀ
//到这里总共32个字节
ꢀꢀ
struct{
ꢀꢀꢀꢀ
exp:6;//共享的指数
ꢀꢀꢀꢀ
disp_x:6;
ꢀꢀꢀꢀ
disp_y:6;
ꢀꢀꢀꢀ
disp_z:6;
ꢀꢀ
}disp_mag_time0[16],disp_mag_time1[16];//2x48b};//总共8 96 96个字节
[0566]
运动模糊操作与对相机中的快门时间进行仿真相似。为了对该效果进行光线追踪,从t0移动到t1,存在三角形的两个表示,一个针对t0并且一个针对t1。在一个实施例中,在它们之间执行内插(例如,在.5处线性地内插两个时间点中的每一个处的图元表示)。
[0567]
诸如包围体层级(bvh)和k-d树之类的加速结构的缺点是:它们需要构建和存储时间和存储器两者。一种减少该开销的方式是采用加速数据结构的某种压缩和/或量化,这针对bvh而运转得特别好,bvh自然地贡献了保守增量编码。在优点方面,这可以显著地减小常常具有bvh节点的大小的加速结构的大小。在缺点方面,压缩bvh节点还引发开销,这可能落入不同类别中。第一,存在在遍历期间对每个bvh节点进行解压缩的明显成本;第二,特别是对于分层编码方案,跟踪父信息的需要稍稍使栈操作复杂;以及第三,保守地对边界进行量化意味着包围盒比未经压缩的盒稍不紧密,从而触发必须分别遍历和交叉的节点和图元的数量方面的可测量的增加。
[0568]
通过本地量化来压缩bvh是减小其大小的已知方法。n宽bvh节点包含以单精度浮点格式存在的其“n”个孩子的轴对齐包围盒(aabb)。本地量化相对于父的aabb而表达“n”个孩子aabb并以经量化的(例如,8位)格式存储这些值,从而减小bvh节点的大小。
[0569]
整个bvh的本地量化引入了多个开销因素,这是由于:(a)经去量化的aabb比原始单精度浮点aabb更粗糙,从而针对每个光线而引入另外的遍历和交叉步骤;以及(b)去量化操作自身是高成本的,这将开销添加到每个光线遍历步骤。由于这些劣势,经压缩的bvh仅被用在特定应用场景中而不是广泛采用的。
[0570]
本发明的一个实施例采用用于在包围体层级中压缩针对头发图元的叶节点的技术,如在2018年12月28日提交的、名称为apparatus and method for compressing leaf nodes of bounding volume hierarchies、序列号为16/236,185的共同待审申请中描述,该共同待审申请被转让给本技术的受让人。特别地,如在该共同待审申请中所描述,将若干组经定向的图元与父包围盒一起存储,从而消除了叶节点中的子指针存储。然后使用16位坐标针对每个图元而存储经定向的包围盒,该16位坐标是关于父盒的拐角而量化的。最后,针对每个图元组而存储经量化的法线以指示取向。该方法可能导致针对bvh头发图元的带宽和存储器占地面积方面的显著减小。
[0571]
在一些实施例中,通过存储父包围盒并使用较低精度相对于该父包围盒对n个子包围盒(例如,8个孩子)进行编码,来压缩bvh节点(例如,对于8宽bvh)。将该思想应用于bvh的每个节点的劣势是:在每个节点处,当遍历经过该结构的光线时,引入某个解压缩开销,这可能降低性能。
[0572]
为了解决该问题,本发明的一个实施例仅在bvh的最低级别处使用经压缩的节点。这提供了以最优性能运行的更高bvh级别的优势(即,它们与盒是大的时相比同样经常被触摸,但它们之中存在非常少),并且更低/最低级别上的压缩也是非常有效的,这是由于bvh的大多数数据处于(一个或多个)最低级别中。
[0573]
另外,在一个实施例中,还针对存储经定向的包围盒的bvh节点而应用量化。如下所讨论,操作比针对轴对齐包围盒稍复杂。在一个实现中,将使用具有经定向的包围盒的经压缩的bvh节点与仅在bvh的最低级别(或更低级别)处使用经压缩的节点进行组合。
[0574]
因此,一个实施例通过引入经压缩的叶节点的单个专用层来在完全压缩的bvh上改进,同时使用针对内部节点的规则的未经压缩的bvh节点。该方法背后的一个动机是:压缩的几乎所有节省来自于bvh的最低级别(特别是对于4宽和8宽bvh,其组成所有节点中的绝大多数),而大多数开销来自于内部节点。因此,引入专用“经压缩的叶节点”的单个层给出了与完全压缩的bvh几乎相同(并且在一些情况下,甚至更好)的压缩增益,同时维持与未经压缩的bvh几乎相同的遍历性能。
[0575]
图80图示了执行本文描述的叶节点压缩和解压缩操作的示例性光线追踪引擎8000。在一个实施例中,光线追踪引擎8000包括上述光线追踪核中的一个或多个的电路系统。可替换地,光线追踪引擎8000可以被实现在cpu的核上或被实现在其他类型的图形核(例如gfx核、张量核等)上。
[0576]
在一个实施例中,光线生成器8002生成遍历/交叉单元8003通过包括多个输入图元8006的场景而追踪的光线。例如,诸如虚拟现实游戏之类的app可以生成从中生成输入图元8006的命令的流。遍历/交叉单元8003遍历经过由bvh构建器8007生成的bvh 8005的光线,并识别其中光线与图元8006中的一个或多个交叉的命中点。尽管被图示为单个单元,但遍历/交叉单元8003可以包括耦合到不同交叉单元的遍历单元。这些单元可以以电路系统、由gpu或cpu执行的软件/命令、或者其任何组合而实现。
[0577]
在一个实施例中,bvh处理电路系统/逻辑8004包括:bvh构建器8007,其基于场景中的图元8006之间的空间关系来生成如本文描述的bvh 8005。另外,bvh处理电路系统/逻辑8004包括用于如本文所描述的那样分别对叶节点进行压缩和解压缩的bvh压缩器8009和bvh解压缩器8009。出于图示的目的,以下描述将集中于8宽bvh(bvh8)。
[0578]
如图81中所图示,单个8宽bvh节点8100a的一个实施例包含8个包围盒8101-8108和指向包围盒/叶数据8101-8108的8个(64位)子指针/引用8110。在一个实施例中,bvh压缩器8025执行下述编码:其中,8个子编号为8101a-8108a相对于父包围盒8100a而表达,且被量化成8位均匀值,被示作包围盒叶数据8101b-8108b。经量化的8宽bvh(qbvh8节点8100b)由bvh压缩8125使用起始和范围值来编码,该起始和范围值被存储为两个3维单精度向量(2
×
12个字节)。八个经量化的子包围盒8101b-8108b被存储为针对每维度的包围盒的下界和上界的2乘8个字节(总共48个字节)。注意,该布局不同于现有实现,这是由于范围是以全精度存储的,这总体上提供了更紧密的边界但需要更多空间。
[0579]
在一个实施例中,bvh解压缩器8026如下对qbvh8节点8100b进行解压缩。维度i中的经解压缩的下界可以由qbvh8.starti (byte

to

float)qbvh8.loweri∗
qbvh8.extendi计算,这在cpu 4099上需要每维度和盒五个指令:2个负载(start,extend)、byte-to-int负载 向上转换、int-to-float转换、以及一个乘-加。在一个实施例中,使用simd指令来针对所有8个经量化的子包围盒8101b-8108b并行地完成解压缩,这将10个指令左右的开销添加到光线-节点交叉测试,从而使它是在标准未经压缩节点情况中的至少多于两倍贵。在一个实施例中,这些指令是在cpu 4099的核上执行的。可替换地,指令的可比较集合由光线追踪核4050执行。
[0580]
在没有指针的情况下,qbvh8节点需要72个字节,而未经压缩的bvh8节点需要192个字节,这得到2.66x的减少因子。在具有8个(64位)指针的情况下,减少因子减小到1.88x,这使得有必要解决用于处理叶指针的存储成本。
[0581]
在一个实施例中,当将bvh8节点的仅叶层压缩成qbvh8节点时,8个孩子8101-8108的所有子指针将仅参考叶图元数据。在一个实现中,该事实是通过在qbvh8节点8100b自身之后直接存储所有所引用的图元数据来利用的,如图81中所图示。这允许将qbvh8的全64位子指针8110减小到仅8位偏移8122。在一个实施例中,如果图元数据是固定大小的,则完全跳过偏移8122,这是由于它们可以是直接根据所交叉的包围盒的索引和指向qbvh8节点8100b自身的指针来计算的。
[0582]
当使用自顶向下bvh8构建器时,压缩仅bvh8叶级别仅需要对构建过程的略微修改。在一个实施例中,这些构建修改被实现在bvh构建器8007中。在递归构建阶段期间,bvh构建器8007跟踪图元的当前数量是否处于某个阈值以下。在一个实现中,n
×
m是阈值,其中n指代bvh的宽度并且m是bvh叶内的图元的数量。对于bvh8节点并且例如每叶的四个三角形,阈值是32。因此对于具有少于32个图元的所有子树,bvh处理电路系统/逻辑8004将进入特殊代码路径,在该特殊代码路径处,它将继续基于表面积启发法(sah)的拆分过程,但创建单个qbvh8节点8100b。当qbvh8节点8100b最终被创建时,bvh压缩器8009然后收集所有所引用的图元数据且恰在qbvh8节点后面拷贝它。
[0583]
由光线追踪核8150或cpu 8199执行的实际bvh8遍历仅稍微受叶级别压缩影响。实质上,叶级别qbvh8节点8100b被视为经扩展的叶类型(例如,它被标记为叶)。这意味着:规则的bvh8自顶向下遍历继续,直到达到qbvh节点8100b。在该点处,执行单个光线-qbvh节点交叉,并且对于所有其交叉孩子8101b-8108b,重构相应叶指针并且执行规则的光线-图元交叉。有趣的是,基于交叉距离而对qbvh的交叉孩子8101b-8108b的排序可能不提供任何可测量的优点,这是由于在大多数情况下无论如何仅单个孩子被光线交叉。
[0584]
叶级别压缩方案的一个实施例允许甚至通过取出公共特征而对实际图元叶数据进行无损压缩。例如,经压缩的叶bvh(clbvh)节点内的三角形非常可能共享一个或多个顶点的索引和像相同objectid之类的性质。通过每clbvh节点存储这些所共享的性质仅一次并且在图元中使用小本地字节大小索引,进一步降低存储器消耗。
[0585]
在一个实施例中,用于利用bvh叶内的公共空间相干几何特征的技术也用于其他更复杂图元类型。诸如头发段之类的图元很可能共享每bvh叶的公共方向。在一个实施例中,bvh压缩器8009实现压缩方案,该压缩方案考虑该公共方向性质,以高效地压缩已被示为对于包围长对角线图元类型而言非常有用的定向包围盒(obb)。
[0586]
本文描述的叶级别压缩bvh仅在最低bvh级别处引入bvh节点量化,且因而在保存未经压缩的bvh的遍历性能的同时允许另外存储器减小优化。由于仅最低级别处的bvh节点被量化,因此所有其孩子指向可被邻接地存储在存储器块或者一个或多个高速缓存线8098中的叶数据8101b-8108b。
[0587]
该思想还可以被应用于使用定向包围盒(obb)的层级,定向包围盒(obb)典型地用于加速头发图元的渲染。为了说明一个特定实施例,将评估三角形上的标准8宽bvh的典型情况中的存储器减小。
[0588]
8宽bvh节点8100的布局被表示在以下代码序列中:struct bvh8node {
ꢀꢀꢀꢀ
float lowerx[8], upperx[8];
ꢀꢀꢀꢀ
// 8 x x维度中的下界和上界
ꢀꢀꢀꢀ
float lowery[8], uppery[8];
ꢀꢀꢀꢀ
// 8 x y维度中的下界和上界
ꢀꢀꢀꢀ
float lowerz[8], upperz[8];
ꢀꢀꢀꢀ
// 8 x z维度中的下界和上界
ꢀꢀꢀꢀ
void *ptr[8];
ꢀꢀꢀꢀ
// 8 x 指向8个子节点或叶数据的64位指针};且需要存储器的276个字节。标准8宽量化的节点的布局可以被定义为:struct qbvh8node {
ꢀꢀꢀꢀ
vec3f start, scale;
ꢀꢀꢀꢀ
char lowerx[8], upperx[8];
ꢀꢀꢀꢀ
// 8 x x维度中的字节量化下界/上界
ꢀꢀꢀꢀ
char lowery[8], uppery[8];
ꢀꢀꢀꢀ
// 8 x y维度中的字节量化下界/上界
ꢀꢀꢀꢀ
char lowerz[8], upperz[8];
ꢀꢀꢀꢀ
// 8 x z维度中的字节量化下界/上界
ꢀꢀꢀꢀ
void *ptr[8];
ꢀꢀꢀꢀ
// 8 x 指向8个子节点或叶数据的64位指针};且需要136个字节。
[0589]
因为在叶级别处使用仅经量化的bvh节点,所以所有子指针实际上将指向叶数据8101a-8108a。在一个实施例中,通过将经量化的节点8100b以及其孩子所指向的所有叶数据8101b-8108b存储在存储器8098的单个邻接块中,移除经量化的bvh节点8100b中的8个子指针。保存子指针将经量化的节点布局减小到:struct qbvh8nodeleaf {vec3f start, scale;
ꢀꢀꢀꢀ
// 起始位置,父aabb的扩展向量
ꢀꢀꢀꢀ
char lowerx[8], upperx[8];
ꢀꢀꢀꢀ
// 8 x x维度中的字节量化的下界和上界
ꢀꢀꢀꢀ
char lowery[8], uppery[8];
ꢀꢀꢀꢀ
// 8 x y维度中的字节量化的下界和上界
ꢀꢀꢀꢀ
char lowerz[8], upperz[8];
ꢀꢀꢀꢀ
// 8 x z维度中的字节量化的下界和上界};其需要仅72个字节。由于存储器/高速缓存8098中的连续布局,第i个孩子的子指针现在可以仅由下式计算:childptr(i) = addr(qbvh8nodeleaf) sizeof(qbvh8nodeleaf) i * sizeof(leafdatatype)。
[0590]
由于bvh的最低级别处的节点组成bvh的整个大小的多于一半,因此本文描述的仅叶级别压缩提供了对原始大小的0.5 0.5 * 72/256 = .64x的减小。
[0591]
另外,具有更粗边界的开销和对经量化的bvh节点自身进行解压缩的成本仅出现在bvh叶级别(相比于当整个bvh被量化时的所有级别)处。因此,很大程度上避免了由于更粗边界(由量化引入)所致的常常相当显著的遍历和交叉开销。
[0592]
本发明实施例的另一优点是改进的硬件和软件预提取效率。这由下述事实引起:所有叶数据被存储在存储器或(一个或多个)高速缓存线的相对小邻接块中。
[0593]
因为bvh叶级别处的几何结构是空间上相干的,所以非常可能的是,由qbvh8nodeleaf节点引用的所有图元共享公共性质/特征,诸如objectid、一个或多个顶点等。因此,本发明的一个实施例通过移除图元数据复制来进一步减小储存器。例如,图元和关联数据可以针对每qbvh8nodeleaf节点存储仅一次,从而进一步降低针对叶数据的存储器消耗。
[0594]
下面描述头发图元的有效包围,作为通过在bvh叶级别处利用公共几何性质而实现的显著存储器减小的一个示例。为了准确地包围作为在空间中定向的长但薄的结构的头发图元,公知的方法是计算定向包围盒以紧密地包围几何结构。首先,计算与头发方向对齐的坐标空间。例如,z轴可以被确定成指向头发方向,而x和y轴垂直于z轴。使用该定向空间,标准aabb现在可以用于紧密地包围头发图元。使光线与这种定向边界交叉需要首先将光线变换成定向空间以及然后执行标准光线/盒交叉测试。
[0595]
关于该方法的问题是其存储器使用率。成为定向空间的变换需要9个浮点值,而存储包围盒需要另外6个浮点值,从而产生总共60个字节。
[0596]
在本发明的一个实施例中,bvh压缩器8025压缩针对在空间上接近在一起的多个头发图元的定向空间和包围盒。这些经压缩的边界然后可以被存储在经压缩的叶级别内
部,以紧密地包围被存储在叶内部的头发图元。在一个实施例中使用以下方法以压缩定向边界。定向空间可以由彼此正交的三个归一化向量



푣y和
푣z表达。将点p变换到该空间中通过将它投影到这些轴上来工作:


=d
표푡
(


,

)
푝y=d
표푡
(
푣y,

)
푝z=d
표푡
(
푣z,

)
[0597]
由于向量



푣y和
푣z被归一化,因此它们的分量处于范围[-1,1]内。因此,这些向量是使用8位有符号浮点数而不是使用8位有符号整数和常量缩放来量化的。这样,生成经量化的




푣y′

푣y′
。该方法减小将定向空间从36个字节(9个浮点值)编码成仅9个字节(各具有1个字节的9个浮点数)所需的存储器。
[0598]
在一个实施例中,通过利用所有向量彼此正交这一事实来进一步降低定向空间的存储器消耗。因此,仅必须存储两个向量(例如,
푝y′

푝z′
)且可以计算



=
푐푟표푠푠
(
푝y′
,
푝z′
),从而将所需储存器进一步减小到仅六个字节。
[0599]
剩下的是对经量化的定向空间内部的aabb进行量化。这里的问题是:将点p投影到该空间的经压缩的坐标轴上(例如,通过计算d
표푡
(



,

))产生了潜在地大的范围的值(这是由于值p典型地被编码为浮点数)。出于该原因,将需要使用浮点数以对边界进行编码,减少了潜在节约。
[0600]
为了解决该问题,本发明的一个实施例将多个头发图元变换到空间中,其中其坐标出于范围[0,1/√3]内。这可以是通过下述操作来完成的:确定多个头发图元的世界空间轴对齐包围盒b,并使用变换t,该变换t首先平移b.lower到左边,且然后在每个坐标中放缩1

max(

.
푠푖푧푒
.

,

.
푠푖푧푒
.

.

.
푠푖푧푒
.

):。
[0601]
一个实施例确保该变换之后的几何结构保持处于范围[0,1/√3]内,这是由于然后经变换的点到经量化的向量p


、py′
或pz′
上的投影保持处于范围[-1,1]内。这意味着:曲线几何结构的aabb可以在使用t而变换时被量化,且然后被变换到经量化的定向空间中。在一个实施例中,使用8位有符号固定点算术。然而,出于精度原因,可以使用16位有符号固定点数(例如,使用16位有符号整数和常量缩放而编码)。这降低了将轴对齐包围盒从24个字节(6个浮点值)编码到仅12个字节(6个字)外加针对多个头发图元而共享的偏移b.lower(3个浮点)和缩放(1个浮点)的存储器要求。
[0602]
例如,具有8个头发图元要包围,该实施例将存储器消耗从8*60个字节=480个字节降低到仅8*(6 12) 3*4 4=160个字节,这是3x的降低。使光线与这些经量化的定向边界交叉通过下述操作来工作:首先使用变换t对光线进行变换,然后使用经量化的




푣y′

푣z′
来投影光线。最后,使光线与经量化的aabb交叉。
[0603]
上述胖叶方法提供了针对甚至更多压缩的可能性。假定在胖bvh叶中存在指向多个邻近gridprim的共享顶点数据的隐式单个float3指针,则每个网格图元中的顶点可以由字节大小的索引(“vertex_index_*”)间接寻址,从而利用顶点共享。在图78中,共享且以全精度存储顶点7801-7802。在该实施例中,共享顶点7801-7802仅被存储一次,并且指向包含独特顶点的阵列的索引被存储。因此,取代48个字节,每时间戳存储仅4个字节。以下代码序
列中的索引用于标识共享顶点。
[0604]
structgridprimmbindexed{
ꢀꢀ
primleafdescleafdesc;//4b
ꢀꢀ
uint32_tprimindex;//4b
ꢀꢀ
uint8_tvertex_index_time0[4];//4b
ꢀꢀ
uint8_tvertex_index_time1[4];//4b
ꢀꢀ
//到这里总共16个字节
ꢀꢀ
struct{
ꢀꢀꢀꢀ
exp:5;//共享的指数
ꢀꢀꢀꢀ
disp_x:5;
ꢀꢀꢀꢀ
disp_y:5;
ꢀꢀꢀꢀ
disp_z:5;
ꢀꢀ
}disp_mag_time0[16],disp_mag_time1[16];//80个字节};//总共96个字节
[0605]
在一个实施例中,仅评估图元的共享边一次以节省处理资源。在图79中,例如,假定包围盒由突出显示的四边形构成。不是个体地与所有三角形交叉,本发明的一个实施例针对三个共享边中的每一个执行光线-边计算一次。因此,跨四个三角形而共享三个光线-边计算的结果(即,针对每个共享边执行仅一个光线-边计算)。另外,在一个实施例中,将结果存储到片上存储器(例如,对交叉器单元来说直接可访问的暂时存储器/高速缓存)。
[0606]
针对图形和数据结构的原子“原子”是必须作为单个单位而完成的操作的集合。某些原子将对于图形处理性能而言有益,尤其是在执行计算着色器时。本发明的一个实施例包括用于改进图形处理性能的多种新原子,包括:
·
夹持的原子;
·

z测试的’原子写入;
·

z测试的’原子累积;
·
针对环形缓冲区的原子。
[0607]
i.用于夹持的原子夹持原子的一个实施例指定目的地、类型值、以及最小值和最大值夹持值。作为示例,夹持原子可以采取下述形式:interlockedaddclamp(destination,typevalue,typemin,typemax)以上夹持操作以原子方式将值添加到目的地,且然后夹持到指定最小值和最大值(例如,针对最大值以上的任何值而设置成最大值并且针对min以下的任何值而设置成最小值)。
[0608]
夹持原子值可以是32个位、64个位或任何其他数据大小。此外,夹持原子可以对各种数据类型进行操作,该各种数据类型包括但不限于uint、float、2xfp16、float2和4xfp16。
[0609]
ii.“z测试的”分散写入
z测试的分散写入可以用于多种应用,包括例如:
·
分散立方体图渲染/体素化(例如,对于环境探测器);
·
分散不完美反射性阴影图(rsm)(类似于不完美阴影图,但对于间接照明);以及
·
通过分散“环境探测器”更新的动态扩散全局照明样式全局照明。
[0610]
以下是可在本发明的一个实施例中执行的比较交换指令的示例:interlockedcmpxchg_type_cmp_op()type=int,uint,floatcmp_op=less,greater,equal,less_equal,greater_equal,not_equal例如:interlockeddepthcmpxchg_float_less_equal()
[0611]
在图82a中图示了示例64位目的地寄存器8201,存储32位深度值8202和32位有效载荷8203。在操作中,如果新浮点深度值小于或等于所存储的浮点值,则以上比较交换命令仅交换有效载荷和深度。在一个实施例中,cmpxchg原子是“远程”原子,这意味着:实际比较和原子更新不由发出了指令的eu完成,而是代之以由与存储数据的llc(或存储器控制器)接近的逻辑块完成。
[0612]
针对读取-写入字节地址缓冲器(rwbyteaddressbuffers)的示例高级着色语言(hlsl)内部函数在一个实施例中,仅highcompvalue是要与64位目的地中的高32个位比较的类型的。剩余部分被假定为被转换成32位无符号整数(asuint()):voidrwbyteaddressbuffer::interlockedcomparehighexchange_less(uintbyteaddress64,uintuhighcompval,uint2highandlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcomparehighexchange_lessequal(uintbyteaddress64,uintuhighcompval,uint2highandlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcomparehighexchange_greater(uintbyteaddress64,uintuhighcompval,uint2highandlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcomparehighexchange_greaterequal(uintbyteaddress64,uintuhighcompval,uint2highandlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcomparehighexchange_equal(uintbyteaddress64,uintuhighcompval,uint2highandlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcomparehighexchange_notequal(uintbyteaddress64,uintuhighcompval,uint2highandlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcomparehighexchange_less(uintbyteaddress64,intihighcompval,uint2highandlowval,outuint2
highandloworgval)voidrwbyteaddressbuffer::interlockedcomparehighexchange_lessequal(uintbyteaddress64,intihighcompval,uint2highandlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcomparehighexchange_greater(uintbyteaddress64,intihighcompval,uint2highandlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcomparehighexchange_greaterequal(uintbyteaddress64,intihighcompval,uint2highandlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcomparehighexchange_equal(uintbyteaddress64,intihighcompval,uint2highandlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcomparehighexchange_notequal(uintbyteaddress64,intihighcompval,uint2highandlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcomparehighexchange_less(uintbyteaddress64,floatfhighcompval,uint2highandlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcomparehighexchange_lessequal(uintbyteaddress64,floatfhighcompval,uint2highandlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcomparehighexchange_greater(uintbyteaddress64,floatfhighcompval,uint2highandlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcomparehighexchange_greaterequal(uintbyteaddress64,floatfhighcompval,uint2highandlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcomparehighexchange_equal(uintbyteaddress64,floatfhighcompval,uint2highandlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcomparehighexchange_notequal(uintbyteaddress64,floatfhighcompval,uint2highandlowval,outuint2highandloworgval)
[0613]
针对目的地r的示例hlsl内部函数highcompvalue是要与64位dest处的高32个位比较的类型的。剩余部分被假定为使用asuint()而转化。
[0614]
所有这些内部函数取类型

r’的

dest’参数,其可以是资源变量或共享存储器变量。资源变量是包括编索引或字段引用的对资源的标量引用。共享存储器变量是利用

groupshared’关键字而定义的变量。在两种情况中的任一种情况下,类型必须是uint2或uint64。当

r’是共享存储器变量类型时,在由

dest’引用的共享存储器寄存器和

value’参数上执行操作。当

r’是资源变量类型时,在由

dest’引用的资源位置和

value’参数上执行操作。结果被存储在由

dest’引用的资源位置或共享存储器寄存器中:voidinterlockedcomparehighexchange_less(rdest,uintuhighcompval,uint2highandlowval,outuint2highandloworgval)voidinterlockedcomparehighexchange_lessequal(rdest,uintuhighcompval,uint2highandlowval,outuint2highandloworgval)voidinterlockedcomparehighexchange_greater(rdest,uintuhighcompval,uint2highandlowval,outuint2highandloworgval)voidinterlockedcomparehighexchange_greaterequal(rdest,uintuhighcompval,uint2highandlowval,outuint2highandloworgval)voidinterlockedcomparehighexchange_equal(rdest,uintuhighcompval,uint2highandlowval,outuint2highandloworgval)voidinterlockedcomparehighexchange_notequal(rdest,uintuhighcompval,uint2highandlowval,outuint2highandloworgval)voidinterlockedcomparehighexchange_less(rdest,intihighcompval,uint2highandlowval,outuint2highandloworgval)voidinterlockedcomparehighexchange_lessequal(rdest,intihighcompval,uint2highandlowval,outuint2highandloworgval)voidinterlockedcomparehighexchange_greater(rdest,intihighcompval,uint2highandlowval,outuint2highandloworgval)voidinterlockedcomparehighexchange_greaterequal(rdest,intihighcompval,uint2highandlowval,outuint2highandloworgval)voidinterlockedcomparehighexchange_equal(rdest,intihighcompval,uint2highandlowval,outuint2highandloworgval)voidinterlockedcomparehighexchange_notequal(rdest,intihighcompval,uint2highandlowval,outuint2highandloworgval)voidinterlockedcomparehighexchange_less(rdest,floatfhighcompval,uint2highandlowval,outuint2highandloworgval)voidinterlockedcomparehighexchange_lessequal(rdest,floatfhighcompval,uint2highandlowval,outuint2highandloworgval)voidinterlockedcomparehighexchange_greater(rdest,floatfhighcompval,uint2highandlowval,outuint2highandloworgval)voidinterlockedcomparehighexchange_greaterequal(rdest,floatfhighcompval,uint2highandlowval,outuint2highandloworgval)voidinterlockedcomparehighexchange_equal(rdest,floatfhighcompval,uint2highandlowval,outuint2highandloworgval)voidinterlockedcomparehighexchange_notequal(rdest,float
fhighcompval,uint2highandlowval,outuint2highandloworgval)
[0615]
iii.“z测试的”分散累积下面关于图82b-c来描述两个实施例。图82b图示了存储32位深度值和32位有效载荷值的64位目的地寄存器。图82c图示了存储32位深度值和两个16位浮点值的64位目的地。以下是示例原子:interlockedcmpadd_type1_type2_cmp_op()
·
type1=int,uint,float
·
type2=int,uint,float,2xfp16
·
cmp_op=less,greater,equal,less_equal,greater_equal,not_equal
·
例如:interlockedcmpaccum_float_2xfp16_less()如果新浮点深度值<所存储的浮点深度值:2.与新值交换所存储的深度值3.dest.payload.lowfp16 =inputpayload.lowfp164.dest.payload.highfp16 =inputpayload.highfp16
[0616]
针对rwbyteaddressbuffers的新hlsl内部函数仅highcompvalue是要与64位目的地处的高32个位比较的类型的。addlowval可以是类型

float



int



uint



min16float2

的:voidrwbyteaddressbuffer::interlockedcompareexchangehighaddlow_less(uintbyteaddress64,uintuhighcompval,typeaddlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcompareexchangehighaddlow_lessequal(uintbyteaddress64,uintuhighcompval,typeaddlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcompareexchangehighaddlow_greater(uintbyteaddress64,uintuhighcompval,typeaddlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcompareexchangehighaddlow_greaterequal(uintbyteaddress64,uintuhighcompval,typeaddlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcompareexchangehighaddlow_equal(uintbyteaddress64,uintuhighcompval,typeaddlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcompareexchangehighaddlow_notequal(uintbyteaddress64,uintuhighcompval,typeaddlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcompareexchangehighaddlow_less(uintbyteaddress64,intihighcompval,typeaddlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcompareexchangehighaddlow_
lessequal(uintbyteaddress64,intihighcompval,typeaddlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcompareexchangehighaddlow_greater(uintbyteaddress64,intihighcompval,typeaddlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcompareexchangehighaddlow_greaterequal(uintbyteaddress64,intihighcompval,typeaddlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcompareexchangehighaddlow_equal(uintbyteaddress64,intihighcompval,typeaddlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcompareexchangehighaddlow_notequal(uintbyteaddress64,intihighcompval,typeaddlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcompareexchangehighaddlow_less(uintbyteaddress64,floatfhighcompval,typeaddlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcompareexchangehighaddlow_lessequal(uintbyteaddress64,floatfhighcompval,typeaddlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcompareexchangehighaddlow_greater(uintbyteaddress64,floatfhighcompval,typeaddlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcompareexchangehighaddlow_greaterequal(uintbyteaddress64,floatfhighcompval,typeaddlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcompareexchangehighaddlow_equal(uintbyteaddress64,floatfhighcompval,typeaddlowval,outuint2highandloworgval)voidrwbyteaddressbuffer::interlockedcompareexchangehighaddlow_notequal(uintbyteaddress64,floatfhighcompval,typeaddlowval,outuint2highandloworgval)
[0617]
针对目的地r而建议的新hlsl内部函数仅highcompvalue是要与64位dest处的高32个位比较的类型的。addlowval可以是类型

float



int



uint



min16float2

的:voidinterlockedcompareexchangehighaddlow_lessequal(rdest,uintuhighcompval,typeaddlowval,outuint2highandloworgval)voidinterlockedcompareexchangehighaddlow_greater(rdest,uintuhighcompval,typeaddlowval,outuint2highandloworgval)
voidinterlockedcompareexchangehighaddlow_greaterequal(rdest,uintuhighcompval,typeaddlowval,outuint2highandloworgval)voidinterlockedcompareexchangehighaddlow_equal(rdest,uintuhighcompval,typeaddlowval,outuint2highandloworgval)voidinterlockedcompareexchangehighaddlow_notequal(rdest,uintuhighcompval,typeaddlowval,outuint2highandloworgval)voidinterlockedcompareexchangehighaddlow_less(rdest,intihighcompval,typeaddlowval,outuint2highandloworgval)voidinterlockedcompareexchangehighaddlow_lessequal(rdest,intihighcompval,typeaddlowval,outuint2highandloworgval)voidinterlockedcompareexchangehighaddlow_greater(rdest,intihighcompval,typeaddlowval,outuint2highandloworgval)voidinterlockedcompareexchangehighaddlow_greaterequal(rdest,intihighcompval,typeaddlowval,outuint2highandloworgval)voidinterlockedcompareexchangehighaddlow_equal(rdest,intihighcompval,typeaddlowval,outuint2highandloworgval)voidinterlockedcompareexchangehighaddlow_notequal(rdest,intihighcompval,typeaddlowval,outuint2highandloworgval)voidinterlockedcompareexchangehighaddlow_less(rdest,floatfhighcompval,typeaddlowval,outuint2highandloworgval)voidinterlockedcompareexchangehighaddlow_lessequal(rdest,floatfhighcompval,typeaddlowval,outuint2highandloworgval)voidinterlockedcompareexchangehighaddlow_greater(rdest,floatfhighcompval,typeaddlowval,outuint2highandloworgval)voidinterlockedcompareexchangehighaddlow_greaterequal(rdest,floatfhighcompval,typeaddlowval,outuint2highandloworgval)voidinterlockedcompareexchangehighaddlow_equal(rdest,floatfhighcompval,typeaddlowval,outuint2highandloworgval)voidinterlockedcompareexchangehighaddlow_notequal(rdest,floatfhighcompval,typeaddlowval,outuint2highandloworgval)
[0618]
iv.针对环形缓冲区的原子环形缓冲区(或循环缓冲区)是包括单个固定大小缓冲区的数据结构,该单个固定大小缓冲区如同它被端到端连接那样进行操作。循环缓冲区普遍用于缓冲数据流。本发明的一个实施例包括用于向和从环形缓冲区增补和弹出条目的原子。
[0619]
最初,appendindex和popfrontindex为0。为了以原子方式增补或弹出,一个实施例使用特殊64位原子。利用这些原子,gpu线程可以例如在环形缓冲区的容量的界限内实现生产者-消费者方案。硬件监察器可以唤醒在环形缓冲区上等待的内核。
[0620]
以下代码序列图示了根据本发明的一个实施例的用于从环形缓冲区增补和弹出条目的原子操作:
a. 环形缓冲区增补interlockedappend( in dest64, in ringsize, out appendindexout )atomically execute (
ꢀꢀꢀꢀ
if( ( (dest64.appendindex 1) % ringsize ) != ( dest64.popfrontindex % ringsize) )
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀ
appendindexout = dest64.appendindex;
ꢀꢀꢀꢀꢀꢀꢀ
dest64.appendindex;
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
else
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀ
appendindexout = 0xffffffff; // error, ring-buffer full
ꢀꢀꢀꢀ
})b. 环形缓冲区前部弹出interlockedpopfront( in dest64, in ringsize, out popindexout )atomically execute (
ꢀꢀꢀꢀ
if( ( (dest64.popfrontindex) % ringsize ) != ( dest64.appendindex % ringsize) )
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀ
popindexout = dest64.popfrontindex;
ꢀꢀꢀꢀꢀꢀꢀ
dest64.popfrontindex;
ꢀꢀꢀꢀ
}
ꢀꢀꢀꢀ
else
ꢀꢀꢀꢀ
{
ꢀꢀꢀꢀꢀꢀꢀꢀ
popindexout = 0xffffffff; // error ring buffer empty
ꢀꢀꢀꢀ
})c. 示例使用情况i. 使用interlockedappend来对具有可用数量的条目的环形缓冲区进行初始化;ii. 多个线程运行并使用interlockedpopfront来暂时挑选/分配条目;iii. 条目使用interlockedappend得以返回到环形缓冲区;iv. 线程可以决定不等待条目并应对该情况。
[0621]
在图84-85中图示了针对多生产者样本和多消费者样本的伪代码。
[0622]
在图84a中图示了生产者伪代码样本。对于该示例,假定job_entry_ready_buffer被初始化成全零并且job_entry_consumed_buffer被初始化成全1:在图84b中图示了消费者伪代码样本。对于该示例,假定job_entry_ready_buffer被初始化成全零并且job_entry_consumed_buffer被初始化成全1。
[0623]
图83a图示了根据一个实施例而实现的示例环形缓冲区。示出了环形缓冲区后部
弹出操作,其中条目n、n 1等被弹出且存储在环形缓冲区条目0、1等中。图83b图示了根据以下代码序列的存储增补索引值8212和前部弹出索引值8213的64位目的地寄存器8211:interlockedpopback( in dest64, in ringsize, out popindexout )atomically execute (if( ( (dest64.popfrontindex) % ringsize ) != ( dest64.appendindex % ringsize) ){
ꢀꢀꢀ
popindexout = dest64.appendindex;
ꢀꢀꢀ‑‑
dest64.appendindex;}else{
ꢀꢀꢀꢀ
popindexout = 0xffffffff; // error ring buffer empty} )
[0624]
v. 原子乘法操作乘法原子的一个实施例指定目的地和类型值。作为示例,乘法原子可以采取下述形式:interlockedmultiply(destination, type value)。
[0625]
在一个实施例中,乘法操作以原子方式将指定数据类型的值与目的地中的值相乘,其可以是相同数据类型或不同数据类型。
[0626]
作为示例而非限制,乘法原子值可以是4位、8位、16位、32位和64位整数以及16位、32位、64位浮点值。值可以是有符号的或无符号的。此外,可以基于最小数据元素大小来执行多个并行乘法操作。例如,浮点乘法电路系统可以被配置成执行单个32位浮点乘法或双重16位浮点乘法。可以使用诸如bfloat16或tensorfloat16之类的格式以高效地执行并行乘法。类似地,整数乘法器可能能够执行单个32位乘法、双重16位乘法、四个8位乘法或八个4位乘法。可以使用各种其他类型的数据格式和并行操作,同时仍符合本发明的基础原理,包括例如2
×
fp16、float2、4
×
fp16、11_11_10fp和2
×
11_11_10fp。
[0627]
这些原子可以用于多种目的,包括机器学习操作、加权混合次序无关透明度(oit)或不透光阴影图。
[0628]
针对图形处理器管理的拼贴资源的装置和方法本发明的一个实施例改进了用户写入的gpu程序可高速缓存且重用缓冲器或纹理中存储的数据的效率。该实施例还提供了可同时物理地适合于gpu存储器中或可不同时物理地适合于gpu存储器中的大的程序上计算的资源的逻辑表示。
[0629]
在本发明的一个实施例中,新拼贴资源由gpu定义和管理,在本文中被称作gpu管理的拼贴资源或gpu管理的缓冲器。在一个实现中,缓冲器或其他拼贴储存资源包含最多n个固定大小的存储器块。不同gpu架构可以支持不同的最大块数量(n)。
[0630]
在一个实施例中,gpu管理的拼贴资源用于在着色器之间高效地共享数据——即,其中一个着色器充当针对一个或多个“消费者”着色器的“生产者”。例如,生产者着色器可以生成消费者着色器可在不涉及与cpu的交互的情况下使用的程序上更新的内容。作为另
一示例,在光线追踪实现中,可能需要在遍历时更新各种形式的蒙皮动画。一个着色器可以在没有cpu干预的情况下对网状物的小部分进行蒙皮,从而将结果存储在拼贴资源中。随着其他光线追踪相同部分,它们可以在不访问主存储器的情况下从拼贴资源本地访问数据。
[0631]
图85a图示了用于实现gpu管理的拼贴资源8531的架构的一个实施例。图形处理器8521包括用于在执行单元4001的集合上调度着色器8511a-b的调度器8510。着色器的执行需要对由资源管理器8512管理的拼贴资源8531的访问。在下面提供的示例中,一个着色器8511a被定名为“生产者”,从而将其结果存储在拼贴资源8531中,并且另一着色器8511b是“消费者”,使用由生产者着色器8511a生成的结果。因此,生产者着色器8511a需要写入到拼贴资源8521的访问,并且消费者着色器8511b需要对拼贴资源8531的读取访问。然而,应当注意,生产者/消费者架构不是符合本发明的基础原理所必需的。
[0632]
在一个实现中,拼贴资源8531包括片上贴片存储器或贴片缓冲器,其存储数据的贴片大小的块0-(n-1)。“贴片”大小可以基于图形处理器8521的架构和图形处理流水线的配置而可变。在一个实施例中,图形处理流水线被配置成使用贴片资源8531来执行基于贴片的推迟渲染、基于贴片的立即模式渲染和/或其他形式的基于贴片的图形处理。
[0633]
在一个实施例中,执行单元(eu)4001或其他处理单元使用哈希值或其他形式的id 8501(例如,在一个实施例中,64位哈希)来请求块。资源管理器8512确定块是否存在于包括n个固定大小的块的拼贴资源8531内。如果未找到这种块,则缓冲器管理器8510驱逐最近最少使用(lru)块,或者在存在的情况下选择未使用的块。响应8502标识缓冲器管理器8510标记为与给定哈希值一起“使用”的所分配的块。在一个实现中,还返回指示块为新的标志。被替换的最近最少使用块失去其所存储的旧内容。如果块已经在那里,则返回指示块已经存在并且然而它被返回的标志。
[0634]
尽管被图示为图形处理器8521内的组件,但贴片资源8531可以被实现在图形处理器8521外部的存储器(诸如,系统存储器或系统级高速缓存)内。
[0635]
在gpu的eu 4001上执行的某些类别的着色器8511a-b是先验已知的,以需要存储器块。例如,这些着色器可以始终在波的通道中执行。在一个实施例中,调度这些着色器8511a-b的执行的调度器8510从系统生成的值构造64位id/哈希。例如,在光线追踪的上下文中,一个实施例使用instanceid和geometryid以构造唯一64位哈希。然而,可以使用多种其他系统生成的变量。
[0636]
在该实施例中,调度器8510经由资源管理器8512来检验是否已经存在针对64位哈希而分配的拼贴资源8531的块。如果是,则在下述假定下执行着色器8511a-b:块已经包含经高速缓存的数据,并且这可以由着色器消耗并且着色器是在eu 4001上调度的。资源管理器8512锁定存储器块以免于被重用,只要使用数据的着色器对该块正在执行的锁定进行了高速缓存即可。由于着色器由一个或多个eu 4001执行,因此它使用块id 8501来更新拼贴资源8531中的块,且针对某些操作从资源管理器8512接收响应8502。
[0637]
在一个实施例中,如果调度器8510最初发现不存在具有给定64位哈希的块,则资源管理器8512定位未使用的块或者使用已经被分配且当前未在使用中的最近最少使用块(或其他块)。如果它不能定位这种块,则它可以推迟着色器的执行,直到这种块变得可用。当它可用时,拼贴资源管理器8512锁定拼贴资源块以免于被重用,只要着色器正在执行即可,并且拼贴资源管理器8512调度着色器。可以将标志传递到着色器,以指示块为空并且着
色器可以使用它以生成和存储数据。在将数据写入到拼贴资源块之后,着色器可以继续执行,如同具有其数据的拼贴资源块已经可用一样。
[0638]
返回到上述消费者/生产者示例,如果所请求的哈希在池中无效,则生产者着色器8511a可以被调度成生成程序资源8531的新块或贴片。这种所请求的哈希可以由一个或多个消费者着色器8511b生成,资源管理器8512将阻止该一个或多个消费者着色器8511b直到它们的请求被填充。
[0639]
在一个实施例中,拼贴资源块被驱逐到固态设备8515或其他高速储存介质。ssd 8515或其他储存设备可以本地集成在与图形处理器8521相同的衬底和/或卡上,且可以被配置成在内部图形处理器8521上下文切换期间保存拼贴资源块和其他数据。
[0640]
在图85b中图示了根据一个实施例的方法。该方法可以被实现在上述架构的上下文内,但不限于任何特定架构。
[0641]
在8551处,调度器评估要被调度以用于执行的下一着色器,且在8552处确定要用于识别拼贴资源块(例如,使用本文描述的技术中的一个或多个)的哈希id。在8553处,调度器查询具有该哈希id的拼贴资源管理器。
[0642]
如果在8554处确定已经针对该哈希id分配了块,那么在8555处拼贴资源管理器锁定拼贴资源块并且在8556处着色器在执行期间使用拼贴资源块。当着色器完成时,可以后续解锁拼贴资源块,除非它是利用将在当前(生产者)着色器完成之后需要数据的消费者着色器的哈希id锁定的。在任何情况下,该过程都返回到8551以用于调度下一着色器。
[0643]
如果在8554处未利用哈希id识别拼贴资源块,那么拼贴资源管理器将拼贴资源块指派给哈希id,且可以给着色器分配指示它可以使用该拼贴资源块的标志。如所提及的那样,拼贴资源管理器可以从拼贴资源块驱逐现有数据,以将拼贴资源块指派给当前着色器。在8555处锁定拼贴资源块并且在8556处着色器在执行期间使用拼贴资源块。
[0644]
可以以多种方式使用gpu管理的拼贴缓冲器8531。例如,通道的simd波想要进入由无绑定线程分派器(下面所描述)捆绑的相同交叉着色器盒。在交叉着色器被运行之前,硬件从缓冲器管理器8510请求块。
[0645]
可以以不同方式生成64位哈希。例如,在一个实施例中,64位哈希是与帧计数器组合的当前光线遍历实例的instanceid。如果块是新的,则硬件可以启动在然后填充块(例如,利用蒙皮的三角形)的波的通道内运行的用户计算着色器。如果块是旧的,那么可以不启动着色器。然后执行交叉着色器,并且给交叉着色器提供指向块的指针。交叉着色器然后可以执行光线/三角形交叉,和/或可以针对光线/三角形交叉的硬件指令而提供支持(如本文所描述)。可替换地,块可以被设计成仅包含三角形。在该情况下,硬件在这些三角形上迭代(而不在它们上构建bvh),且可以例如更新最接近命中着色器或调用到任何命中着色器中。各种其他使用情况可以利用如上所描述的gpu管理的拼贴资源8531。
[0646]
用于高效懒惰bvh构建的装置和方法复杂动态场景对于实时光线追踪实现而言是有挑战性的。程序表面、蒙皮动画等需要三角测量的更新和每个帧中的加速结构,甚至在第一个光线被启动之前。
[0647]
懒惰构建“按需”评估场景元素,如光线遍历所驱动的那样。帧的渲染以像前一帧的场景图或层级之类的粗加速结构而开始,然后逐步构建针对由光线在遍历期间命中的对象的新需要的加速结构。可以有效地从构造过程排除不可见对象。然而,这些技术不容易利
用当前系统和api而实现,这是因为计算实例可见性所必需的更高级(即,每对象)可编程性未被支持。
[0648]
本发明的一个实施例支持针对实时光线追踪的多遍懒惰构建(mplb),其利用经扩展的编程模型解决这些问题。它允许在每个光线分派期间跟踪实例级别遍历,并在渲染时间处针对仅潜在地可见的几何结构而选择性地构建底级加速结构(blas)。类似于一些适应性采样计数,如本文描述的mplb可能需要相同像素集合上的多个光线分派,以重新启动光线到场景的先前未构建的部分,但本发明的某些实施例包括用于最小化该开销的技术,诸如假定帧到帧相干性和光栅化的主可见性。这些技术可以提供与一次性构建器相比在构建复杂度方面的显著降低,而在平均遍历成本方面仅具有边际增长。
[0649]
图86a图示了用于执行如本文描述的懒惰构建操作的按需(或“懒惰”)构建器8607的一个实施例。另外,该实施例包括用于中止光线遍历的遍历中止电路系统/逻辑8620。光线遍历中止电路系统/逻辑8620可以以硬件、软件或其任何组合而实现。当遍历被中止时,光线栈储存器8605存储被中止的光线栈8610(如本文更详细地描述)。另外,gpu侧命令调度在不受cpu监督的情况下在执行单元4001上启动懒惰构建任务和光线延续部分。还使用遍历原子以减少着色器开销。
[0650]
在未命中底级加速结构(blas)遇见时的遍历中止在一个实现中,使用具有遍历着色器扩展的编程模型,以编程方式标记未命中实例(例如,bvh 8005的未命中底级加速结构),使得它们可以在单独的一遍中被识别和更新。然后,执行不完整遍历或者中断遍历。
[0651]
为了渲染最终像素,可能需要重新启动对应像素的主着色器,从而导致若干重复遍历和着色器执行操作。在一个实施例中,当遍历被中止时,遍历中止逻辑8620将整个光线上下文8610(光线栈、延续部分等)备份到片外存储器8605中。在一个实施例中,该遍历中止由驱动器管理的内部函数(例如,suspendtraversal());然而,本发明的基础原理不限于该实现。另外,(由cpu 3199执行的)主机侧中的新dispatchray()重新调度来自光线上下文8610的被中止的光线栈,以继续遍历着色器执行。
[0652]
针对构建和分派的gpu侧命令调度当前懒惰构建实现的另一显著开销是cpu 3199对bvh构建器8007的回读和条件调度以及gpu 2505上的光线分派的持续要求。为了改进效率,在一个实现中,bvh处理电路系统/逻辑8004与光线遍历8003异步地运行bvh构建。在完成构建任务时,光线追踪引擎8000执行光线分派以继续来自光线上下文8610的被中止的光线栈。
[0653]
减少遍历着色器开销的遍历原子关于当前实现的一个问题是:如果实例未命中(未构建),则若干光线可以遍历它并针对懒惰构建器8607而标记它以更新它。可由仅一个遍历着色器调用完成的简单任务由数百个或更多个调用重复。遍历着色器不是资源密集型的,但它具有启动、执行输入/输出功能且存储结果的显著开销。
[0654]
在本发明的一个实施例中,未构建的实例叶可以被标记为“原子”节点。原子节点可以被仅一个光线立即遍历。一旦光线遍历原子节点,该原子节点就被锁定,并且在遍历着色器执行的结尾处,该原子节点被解锁。在一个实施例中,遍历着色器将节点的状态设置成“无效”,这防止光线甚至在锁定被释放之后进入它。这允许遍历硬件在不执行新遍历着色
器的情况下跳过节点或中止光线的遍历。
[0655]
在一个实施例中,对于原子节点,取代规则原子语义,使用某些互斥/条件语义。例如,如果遍历电路系统/逻辑8003将光线遍历到代理节点,则它试图锁定节点。如果这在节点已经被锁定时失效,则它自动地执行“suspendray”而不返回到eu 4001。如果锁定被成功地执行,则遍历电路系统/逻辑8003处理代理节点。
[0656]
具有遍历着色器的加速结构的懒惰构建本发明的一个实施例根据图86b中所示的处理流程来进行操作。作为概述,按需构建器8607在被确定为潜在地可见的几何结构实例8660上构建加速结构。潜在地可见的实例8660由预先构建器8655基于来自g-缓冲器8650的主可见性数据和指示前一帧中的可见性的可见性历史数据8651来生成。潜在地可见的实例8660还可以是基于可见底级加速结构(blas)图8675来确定的,该可见底级加速结构(blas)图8675指示加速结构的包括可见图元的底级节点。在一个实施例中,可见blas图8675是响应于由遍历逻辑8670执行的遍历操作而持续地更新的,遍历逻辑8670可以包括在图形处理器的执行单元上执行的专用遍历电路系统和/或遍历着色器。
[0657]
按需构建器8607生成加速结构的与潜在地可见的实例8660相关联的那些部分。光线生成着色器8678基于遍历单元8670遍历通过加速结构部分的加速结构的这些部分来选择性地生成光线。遍历单元8670向按需构建器8670通知它针对遍历而需要的另外加速结构节点,并更新光线生成着色器8678(例如,其仅生成针对无掩码的像素的光线)和可见blas图8675所使用的blas像素掩码8677。
[0658]
因此,按需构建器8706在潜在地可见的实例8660上选择性地构建底级加速结构,并且,在光线遍历8670期间更新实例可见性。不同于先前实现,本发明实施例在多遍中操作,以便避免复杂的光线调度。该思想与近期纹理空间着色方法相似,在近期纹理空间着色方法中,在最终渲染之前使用纹素的可见性驱动的标记以避免冗余着色。
[0659]
在操作中,首先构建针对被标记为在前一遍中潜在地可见的空实例的blas。在第二遍中,光线生成着色器8678选择性地将光线重新发射到未完成的像素,其中遍历着色器用于记录更潜在地可见的空实例或者完成像素。未完成像素的数量在每次迭代之后减少,直到不剩下对空实例进行了遍历的光线。
[0660]
本发明的一个实施例使用gpu光栅化器和光线追踪硬件一起来执行混合渲染。这是因为:当创建g-缓冲器8650时,容易获得场景中的所有实例的主可见性。因此,这些实施例中的预先构建器8655通过使用该数据高效地构造初始加速结构来利用混合渲染。在第一次迭代之前,在该预先构建启发法(如下讨论)中标记潜在地可见的实例8660。
[0661]
以下代码序列是抽象高级着色器语言(hlsl),描述了与一些内部函数和用户函数一起描述的遍历着色器的一个实施例:
[0662]
skiptraversal()内部函数被定义成忽略当前实例并继续更高级加速结构中的遍历。如所提及的那样,可见底级加速结构(blas)图8675用于记录在加速结构构建器和遍历着色器中普遍使用的实例可见性。如图86c中所示,可见blas图8675的一个实施例包含:与每个blas id 8674相关联的标志8676,指示实例所参考的blas可见性;以及两个标志built_full和built_empty,指示blas是否已经被构建。另外,布尔标志trav_valid被添加到光线有效载荷以跟踪遍历状态,该遍历状态可以用于检验到目前为止光线是否已经遇到空实例。
[0663]
在一个实施例中,遍历着色器中的可见性被保守地更新,这是因为所有所遍历的实例对当前光线来说潜在地可见。因此,第一任务是:对于当前实例的对应blas,将可见性标志设置为真。它还将可见性历史(vis_history)标志设置为真以在下一帧(以上代码序列的第9行)中重用它。接下来,基于当前实例的状态(空或满)和光线状态(即,trav_valid值)来确定遍历目的地。这被分类成如图86d中所示的三个状态8690-8692。
[0664]
对于空实例8690,重置对应像素掩码(第15行)以用于在下一遍中重新发射光线。然后通过在光线有效载荷中设置trav_valid标志(第16行)来使当前遍历无效。最后,tlas遍历通过调用skiptraversal()来继续。
[0665]
对于满实例和无效遍历情况8691,当前实例具有所构建的blas,但到目前为止光线已经遇到空实例(即,trav_valid为假)。因为光线最终将被再次发射到当前像素,所以可以跳过blas遍历(第20行)。
[0666]
对于满实例和有效遍历8692,由于光线通常在没有空实例的情况下对加速结构进行了遍历,因此遍历着色器提取当前实例的blas并继续遍历。如果光线维持有效性直到遍
历结束,则光线通常将调用和执行最接近命中或未命中着色器。
[0667]
否则,那些着色器在不执行它们的代码的情况下返回控制,并完成当前遍,这防止针对次级光线的硬件光线遍历和着色器启动的开销。在下一遍中,光线仅被再次发射到具有“假”掩码的像素,并且尝试针对那些像素的有效遍历。
[0668]
对于加速结构构建操作,取决于可见性位掩码的可见性标志,构建实例的blas或者创建空实例。潜在地可见的实例通常构造blas(build_full),并且不可见实例仅计算几何结构的包围盒并将它打包在tlas(build_empty)的叶节点中。还参考其他两个标志,指示在前一遍中针对当前对象已经执行了build_full还是build_empty。通过检验这些标志,可以在构建-遍历循环的不同迭代中针对相同对象而避免重复动作。
[0669]
一旦完成针对对象的blas构建过程,,就通过在这些blas上构建tlas来构造最终加速结构。tlas仅在第一遍中被重新构建且在剩余遍中被改装,这是因为可能已经在第一遍中设立所有对象的包围盒。
[0670]
如上所描述,本发明的一个实施例执行多个遍,这使它有时冗余地发射针对相同像素的光线。这是因为当前遍应当弥补前一遍中的无效遍历。这可能导致冗余硬件光线遍历和着色器调用。然而,一个实施例通过应用像素掩码将遍历成本的该开销仅限于与无效遍历相对应的像素。
[0671]
此外,使用不同技术以识别潜在地可见的blas(并构建它们),甚至在第一光线被遍历(例如,由预先构建器8655)之前。使用g-缓冲器8650,可以标记很可能由主光线遍历的直接可见的实例。此外,既定存在显著量的帧到帧相干性;因此,还预先构建在前一帧中遍历的实例的blas。这两种技术的组合大大减少了构建-遍历迭代的数量。
[0672]
针对材料剔除掩码的装置和方法现有光线追踪api使用8位剔除掩码以跳过针对某些几何结构实例的光线遍历。这用于例如防止特定对象投射阴影,或者隐藏对象免于反射。该特征允许在单个加速结构内表示几何结构的不同子集,这与构建针对每个子集的单独加速结构形成对照。8位掩码中的位设置可以用于对遍历性能和用于维持多个加速结构的资源开销进行平衡。例如,如果掩码中的位被设置成0,则可以忽略对应实例。
[0673]
渲染引擎可以将多个几何结构实例与资产相关联,并且每个几何结构实例可以包含多个材料。然而,当前光线追踪api仅允许以实例的粒度指定剔除掩码。这意味着:在不同材料上具有不同剔除掩码的资产不能使用标准剔除。作为应变方法,当前实现使用任何命中着色器以忽略交叉,这是昂贵且复杂的。
[0674]
如图87中所图示,本发明的一个实施例在每材料的基础上暴露了这些掩蔽控制。特别地,一个实现包括:n位的基于材料的剔除掩码8701,用于跳过针对与某些材料相关联的几何结构实例的部分的光线遍历。在一个实施例中,使用8位的基于材料的剔除掩码,但本发明的基础原理不限于该实现。相比于现有实现,基于材料的剔除掩码8701被暴露且可以被遍历电路系统/逻辑8003用于在每材料的基础以及每实例的基础上的实例剔除。
[0675]
在一个特定实现中,n位剔除掩码8701被存储在命中组8700内部,从而提供固定功能的每材料的剔除并减轻针对昂贵的任何命中着色器应变方法的需要。如本文使用的“命中组”8700是api对象,其包含用于处理命中场景中的给定对象的光线的着色器集合。着色器集合可以包括例如最接近命中着色器、任何命中着色器和(对于程序几何结构)交叉着色
器。在一个实现中,基于材料的剔除掩码8701与命中组8700相关联,作为另外块的数据。
[0676]
为了将剔除掩码8701与命中组8700相关联,可以将剔除掩码8701存储在api提供以供实现使用的32字节着色器记录(例如,如本文描述的那样经由记录id而标识)内。然而,注意本发明的基础原理不限于用于将剔除掩码与命中组相关联的任何特定技术。
[0677]
在一个实施例中,遍历/交叉电路系统8003根据基于材料的剔除掩码8701来直接剔除潜在命中。例如,掩码值0可以指示应当剔除具有对应材料的实例。可替换地或另外,该行为可以是通过在驱动器内部注入任何命中着色器来仿真的。
[0678]
几何图像加速器和方法几何图像是三维(3d)三角形网状物到二维(2d)域上的映射。特别地,几何图像可以将几何结构表示为经量化的点的2d阵列。还可以使用相同隐式表面参数化将诸如颜色和法线之类的对应图像数据存储在2d阵列中。由2d阵列表示的2d三角形网状物由具有隐式连接性的顶点位置的规则网格定义。
[0679]
在本发明的一个实施例中,通过将3d三角形网状物映射到2d平面中来形成几何图像,从而得到由顶点位置的规则网格定义的隐含的三角形连接性。可以以各种方式在图形流水线内处理所得到的2d几何图像,该各种方式包括使用贴图细化(mipmap)来进行向下采样和向上采样。
[0680]
如图88中所图示,本发明的一个实施例通过在几何图像域上生成四叉树结构8850来执行光线追踪,其中每个四叉树节点8800、8810-8813在2d三角形网状物8820的顶点位置上存储轴对齐包围盒(aabb)。如所图示的那样,每个节点8800、8810-8813存储包含三角形和/或顶点中的一个或多个的关联aabb的最小值和最大值坐标。这得到了被极端正则化且非常容易计算的结构。
[0681]
一旦在2d三角形网状物上构造aabb,就可以如本文关于本发明各种实施例而描述的那样使用aabb来执行光线追踪操作。例如,可以执行遍历操作,以确定光线遍历bvh的底级节点8810-8813之一。然后可以针对与2d网状物的交叉而测试光线,并且可以如本文描述的那样(例如,根据与2d三角形网状物相关联的材料)生成和处理命中结果(如果有的话)。
[0682]
如所图示的那样,在一个实施例中,储存/压缩逻辑8850被配置成压缩和/或存储aabb作为双重图像锥体8855,一个存储最小值并且一个存储最大值。在该实施例中,针对几何图像而开发的不同压缩方案可以用于压缩最小值和最大值图像锥体。
[0683]
上面关于图88而描述的四叉树结构8850、8860-8861可以由bvh构建器8007生成。可替换地,四叉树结构可以由电路系统和/或逻辑的不同集合生成。
[0684]
用于针对光线追踪的加速碰撞检测和盒-盒测试的装置和方法图89a-b图示了根据本发明的一个实施例的光线追踪架构。多个执行单元8910执行与光线追踪操作相关的着色器和其他程序代码。在执行单元(eu)8910之一上执行的“traceray”功能触发光线状态初始化器8920,以对通过包围体层级(bvh)(例如,被存储在存储器缓冲器8918中的栈5121中或者被存储在本地或系统存储器3198中的其他数据结构中)追踪当前光线(经由光线id/描述符而标识)所需的状态进行初始化。
[0685]
在一个实施例中,如果traceray功能识别出针对其而部分地完成了在先遍历操作的光线,那么状态初始化器8920使用唯一光线id以从存储器3198中的一个或多个缓冲器8918加载关联光线追踪数据4902和/或栈5121。如所提及的那样,存储器3198可以是片上/
本地存储器或高速缓存和/或系统级存储器设备。
[0686]
如关于其他实施例而讨论的那样,跟踪阵列5249可以被维持以存储针对每个阵列的遍历进度。如果当前光线已经部分地遍历了bvh,那么状态初始化器8920可以使用跟踪阵列5249以确定在其处重启的bvh级别/节点。
[0687]
遍历和光线盒测试单元8930通过bvh来遍历光线。当已经在bvh的叶节点内识别图元时,实例/四边形交叉测试器8940针对与图元(例如,一个或多个图元四边形)的交叉而测试光线,从而从集成在图形处理器的高速缓存层级内的光线追踪高速缓存8960(这里被示作耦合到l1高速缓存8970)检索关联的光线/着色器记录。实例/四边形交叉测试器8940在本文中有时被简称作交叉单元(例如,图51中的交叉单元5103)。
[0688]
光线/着色器记录被提供给线程分派器8950,其至少部分地使用本文描述的无绑定线程分派技术将新线程分派给执行单元8910。在一个实施例中,光线/盒遍历单元8930包括:上述遍历/栈跟踪逻辑5248,其跟踪和存储针对跟踪阵列5249内的每个光线的遍历进度。
[0689]
渲染中的一类问题可以被映射到与其他包围体或盒的测试盒碰撞(例如,由于重叠)。这种盒查询可以用于针对各种应用而枚举查询包围盒内部的几何结构。例如,盒查询可以用于在光子映射期间采集光子,枚举可影响查询点(或查询区)的所有光源,和/或搜索与某个查询点最接近的表面点。在一个实施例中,盒查询在与光线查询相同的bvh结构上操作;因此,用户可以通过某个场景来追踪光线,并在相同场景上执行盒查询。
[0690]
在本发明的一个实施例中,关于光线追踪硬件/软件而与光线查询类似地处理盒查询,其中光线/盒遍历单元8930使用盒/盒操作而不是光线/盒操作来执行遍历。在一个实施例中,遍历单元8930可以将与用于光线/盒操作相同的特征集合用于盒/盒操作,该特征集合包括但不限于运动模糊、掩码、标志、最接近命中着色器、任何命中着色器、未命中着色器和遍历着色器。本发明的一个实施例将位添加到每个光线追踪消息或指令(例如,如本文描述的traceray)以指示该消息/指令与boxquery操作相关联。在一个实现中,在同步和异步光线追踪模式两者中(例如,分别使用标准分派和无绑定线程分派操作)启用boxquery。
[0691]
在一个实施例中,一旦经由位而被设置成boxquery模式,光线追踪硬件/软件(例如遍历单元8930、实例/四边形交叉测试器8940等)将与光线追踪消息/指令相关联的数据解释为盒数据(例如,三个维度中的min/max值)。在一个实施例中,如前所述的那样生成和维持遍历加速结构,但针对每个主stackid,代替光线而对盒进行初始化。
[0692]
在一个实施例中,不针对盒查询而执行硬件实例化。然而,可以使用遍历着色器以软件仿真实例化。因此,当在盒查询期间到达实例节点时,硬件可以将实例节点作为程序节点进行处理。由于全部两个结构的首部是相同的,因此这意味着:硬件将调用实例节点的首部中存储的着色器,然后,其可以继续实例内部的点查询。
[0693]
在一个实施例中,光线标志被设置成指示实例/四边形交叉测试器8940将接受第一次命中并结束搜索(例如,accept_first_hit_and_end_search标志)。当该光线标志未被设置时,与光线查询类似,根据所交叉的孩子到查询盒的距离来从前到后进入所交叉的孩子。当搜索与某个点最接近的几何结构时,该遍历次序显著地改进性能,如关于光线查询的情况那样。
[0694]
本发明的一个实施例使用任何命中着色器来过滤掉误报(false positive)命中。
例如,尽管硬件可以不在叶级别处执行准确盒/三角形测试,但它将保守地报告命中叶节点的所有三角形。进一步地,当搜索盒被任何命中着色器收缩时,硬件可以返回所弹出的叶节点的图元作为命中,即使叶节点盒可能不再重叠经收缩的查询盒。
[0695]
如图89a中所指示,盒查询可以由向硬件发送消息/命令(即,traceray)的执行单元(eu)8910发出。处理然后如上所述的那样继续——即,通过状态初始化器8920、光线/盒遍历逻辑8930、实例/四边形交叉测试器8940和无绑定线程分派器8950。
[0696]
在一个实施例中,盒查询通过将查询盒的下界存储在与光线原点相同的位置中、将上界存储在与光线方向相同的位置中以及将查询半径存储成远值,来重用如用于光线查询的memray数据布局。
[0697]
structmembox{
ꢀꢀ
//32个字节(语义被改变)
ꢀꢀ
vec3flower;//查询盒的下界
ꢀꢀ
vec3fupper;//查询盒的上界
ꢀꢀ
floatunused;
ꢀꢀ
floatradius;//查询盒的另外扩展(l0范数)
ꢀꢀ
//32个字节(与标准memray相同)};
[0698]
使用该membox布局,硬件使用盒[下-半径,上 半径]以执行查询。因此,所存储的边界在每个维度中扩展l0范数中的某个半径。该查询半径对容易收缩搜索区域(例如,针对最接近命中搜索)来说可以是有用的。
[0699]
由于membox布局仅重用光线原点、光线方向和memray布局的t
far
个成员,因此不需要针对光线查询而更改硬件中的数据管理。相反,数据像光线数据那样被存储在内部储存器(例如,光线追踪高速缓存8960和l1高速缓存8970)中,且将仅以不同方式针对盒/盒测试而解释。
[0700]
在一个实施例中,以下操作由光线/状态初始化单元8920和光线/盒遍历单元8930执行。在状态初始化器8920中对来自traceray消息的另外位“boxqueryenable”进行流水线处理(影响它跨消息的压实),从而将boxqueryenable设置的指示提供给每个光线/盒遍历单元8930。
[0701]
光线/盒遍历单元8930随每个光线存储“boxqueryenable”,从而将该位作为标签随初始光线负载请求进行发送。当从存储器接口返回所请求的光线数据时,在boxqueryenable被设置的情况下,绕过互惠计算,并且取而代之,针对raystore中的所有组件(即,根据盒而不是光线)加载不同的配置。
[0702]
光线/盒遍历单元8930将boxqueryenable位流水线处理到基础测试逻辑。在一个实施例中,根据以下配置设置来修改光线盒数据路径。如果boxqueryenable==1,则不改变盒的平面,这是由于它是基于光线的方向的x、y和z分量的符号的改变。对于光线盒而言不必要的针对光线而执行的检验被绕过。例如,假定查询盒不具有inf或nan,因此这些检验在数据路径中被绕过。
[0703]
在一个实施例中,在由命中确定逻辑来处理之前,执行另一加法运算以确定值下
半径(基本上,来自命中的t值)和上-半径。另外,在命中“实例节点”(在硬件实例化实现中)时,它不计算任何变换,而是代之以使用实例节点中的着色器id来启动交叉着色器。
[0704]
在一个实施例中,当boxqueryenable被设置时,光线/盒遍历单元8930不针对任何命中着色器执行null着色器查找。另外,当boxqueryenable被设置时,当有效节点是quad、meshlet类型的时,光线/盒遍历单元8930调用交叉着色器,仿佛它会在更新存储器中的潜在命中信息之后调用any hit shader。
[0705]
在一个实施例中,图89a中图示的各种组件的单独集合被提供在每个多核组3100a中(例如,在光线追踪核3150内)。在该实现中,每个多核组3100a可以在光线数据和/或盒数据的不同集合上并行操作,以执行如本文描述的遍历和交叉操作。
[0706]
用于针对光线追踪的小网状物压缩和解压缩的装置和方法如上所述,“小网状物”是通过几何分区而创建的网状物的子集,其包括基于关联属性的数量的某个顶点数量(例如16、32、64、256等)。小网状物可以被设计成共享尽可能多的顶点以允许在渲染期间的顶点重用。可以预先计算该分区以避免运行时处理,或者每当网状物被画出时,都可以在运行时动态执行该分区。
[0707]
本发明的一个实施例执行小网状物压缩,以降低针对底级加速结构(blas)的储存要求。该实施例利用小网状物表示具有类似顶点的更大网状物的一小段这一事实,以允许128b数据块内的高效压缩。然而,注意本发明的基础原理不限于任何特定块大小。
[0708]
可以在bvh消耗点处(例如,由光线追踪硬件块)对对应包围体层级(bvh)进行构建和解压缩时执行小网状物压缩。在下述某些实施例中,在l1高速缓存(有时称“lsc单元”)与光线追踪高速缓存(有时称“rtc单元”)之间执行小网状物解压缩。如本文所描述,光线追踪高速缓存是光线遍历/交叉硬件所使用的高速本地高速缓存。
[0709]
在一个实施例中,以硬件加速小网状物压缩。例如,如果执行单元(eu)路径支持解压缩(例如,潜在地,以支持遍历着色器执行)可以将小网状物解压缩集成在l1高速缓存外的公共路径中。
[0710]
在一个实施例中,使用消息以发起对存储器中的128b块的小网状物压缩。例如,4
×
64b消息输入可以被压缩到对着色器的128b块输出。在该实现中,在bvh中添加另外节点类型以指示与经压缩的小网状物的关联。
[0711]
图89b图示了针对小网状物压缩的一个特定实现,包括集成在光线追踪集群内的小网状物压缩块(rtmc)9030和小网状物解压缩块(rtmd)9090。当将新消息从执行着色器的执行单元8910传输到光线追踪集群(例如,在光线追踪核3150内)时,调用小网状物压缩9030。在一个实施例中,消息包括四个64b阶段和128b写入地址。来自eu 8910的消息向小网状物压缩块9030指示将顶点和相关小网状物数据定位在本地存储器3198(和/或取决于实现,系统存储器)中何处。小网状物压缩块9030然后执行如本文描述的小网状物压缩。经压缩的小网状物数据然后可以经由存储器接口9095而存储在本地存储器3198和/或光线追踪高速缓存8960中,且由实例/四边形交叉测试器8940和/或遍历/交叉着色器访问。
[0712]
在图89b中,小网状物收集和解压缩块9090可以收集针对小网状物的经压缩的数据并将数据解压缩成多个64b块。在一个实现中,仅经解压缩的小网状物数据被存储在l1高速缓存8970内。在一个实施例中,在基于节点类型(例如,叶节点,经压缩)和图元id提取bvh节点数据时激活小网状物解压缩。遍历着色器还可以使用与光线追踪实现的剩余部分相同
的语义来访问经压缩的小网状物。
[0713]
在一个实施例中,小网状物压缩块9030接受来自eu8910的输入三角形的阵列,并产生经压缩的128b小网状物叶结构。该结构中的一对连续三角形形成四边形。在一个实现中,eu消息包括如以下代码序列中所指示的最多14个顶点和三角形。在消息中提供的地址处经由存储器接口9095将经压缩的小网状物写入到存储器。
[0714]
在一个实施例中,着色器计算针对小网状物的集合的位预算,并且因此,提供地址以使得占地面积压缩是可能的。这些消息仅是针对可压缩小网状物而发起的。
[0715]
compressmeshletmsg{
ꢀꢀ
uint64_taddress;//首部:针对小网状物的128b对齐的目的地地址
ꢀꢀ
floatvert_x[14];//最多14个顶点坐标
ꢀꢀ
uint32_tvert_x_bits;//最大值顶点位
ꢀꢀ
uint32_tnumprims;//三角形的数量(对于四边形,始终为偶数)floatvert_y[14];
ꢀꢀ
uint32_tvert_y_bits;//最大值顶点位
ꢀꢀ
uint32_tnumidx;//索引的数量
ꢀꢀ
floatvert_z[14];
ꢀꢀ
uint32_tvert_z_bits;//最大值顶点位
ꢀꢀ
uint32_tnumprimidbits;
ꢀꢀ
int32_tprimid[14];//primids
ꢀꢀ
primleafdescprimleafdesc;
ꢀꢀ
struct{
ꢀꢀꢀꢀ
int8_tidx_x;
ꢀꢀꢀꢀ
int8_tidx_y;
ꢀꢀꢀꢀ
int8_tidx_z;
ꢀꢀꢀꢀ
int8_tlast;//如果三角形是叶中的最后一个,则为1;否则,为0
ꢀꢀ
}index[14];//顶点索引
ꢀꢀ
int32_tpad0;
ꢀꢀ
int32_tpad1;}
[0716]
在一个实施例中,小网状物解压缩块9090对来自128b小网状物的两个连续四边形(128b)进行解压缩,并将经解压缩的数据存储在l1高速缓存8970中。l1高速缓存8970中的标签跟踪每个经解压缩的四边形的索引(包括三角形索引)和小网状物地址。光线追踪高速缓存8960以及eu8910可以从l1高速缓存8970提取64b经解压缩的四边形。在一个实施例中,eu8910通过如下所示的那样将meshletquadfetch消息发出到l1高速缓存8960来提取经解压缩的四边形。可以发出用于提取四边形的前32个字节和最后32个字节的单独消息。
[0717]
着色器可以如下所示的那样访问来自四边形结构的三角形顶点。在一个实施例中,“if”声明被“sel”指令替换。
[0718]
// 假定顶点i是由编译器确定的常量float3 getvertexi(quad& q,int triid,int vertexid){
ꢀꢀ
if(triid==0)
ꢀꢀꢀꢀ
returnquad.vi;
ꢀꢀ
elseif(i==j0)
ꢀꢀꢀꢀ
returnquad.v0;
ꢀꢀ
elseif(i==j1)
ꢀꢀꢀꢀ
returnquad.v1;
ꢀꢀ
elseif(i==j2)
ꢀꢀꢀꢀ
returnquad.v2;}
[0719]
在一个实施例中,光线追踪高速缓存8960可以通过提供小网状物地址和四边形索引来直接从l1高速缓存8970库提取经解压缩的四边形。
[0720]
getquaddata{
ꢀꢀ
uint1_tmsb;//ms32b或ls32b
ꢀꢀ
uint4_ttriangle_idx;//小网状物内部的三角形的索引。对于四边形,始终为偶数
ꢀꢀ
uint64_tmeshlet_addr;}
[0721]
小网状物压缩过程在分配针对诸如几何性质之类的固定开销的位(例如,标志和掩码)之后,将小网状物的数据添加到经压缩的块,同时基于(pos.x,pos.y,pos.z)上与(base.x,base.y,base.z)相比的增量来计算剩余位预算,其中基础值包括列表中的第一顶点的位置。类似地,也可以计算prim-id增量。由于增量与第一顶点比较,因此以低时延进行解压缩是更便宜的。连同增量位的宽度,基础位置和primid是数据结构中的恒定开销的一部分。对于偶数三角形的剩余顶点,将位置增量和prim-id增量存储在不同64b块上以便并行地打包它们。
[0722]
使用这些技术,bvh构建操作在经由存储器接口9095写出经压缩的数据时消耗对存储器的更低带宽。另外,在一个实施例中,将经压缩的小网状物存储在l3高速缓存中允许利用相同l3高速缓存大小存储更多bvh数据。在一个工作实现中,多于50%的小网状物被压缩2:1。在使用具有经压缩的小网状物的bvh时,存储器处的带宽节约导致功率节约。
[0723]
用于计算和光线追踪流水线中的无绑定线程分派和工作组/线程抢占的装置和方法如上所述,无绑定线程分派(btd)是一种在不支持共享本地存储器(slm)或存储器屏障的实现中解决针对光线追踪的simd发散问题的方式。本发明实施例包括针对可用于解决针对各种计算模型的simd发散的广义btd的支持。在一个实施例中,具有线程组屏障和slm的任何计算分派可以派生无绑定子线程,并且,可以经由btd来对所有线程进行重新分组和分派,以改进效率。在一个实现中,每父一次允许一个无绑定子线程,并且允许发端线程与无绑定子线程共享它们的slm空间。仅当最终收敛的父终止(即,执行eot)时,才释放全部两个slm和屏障。一个特定实施例允许可调用模式内的放大,该可调用模式允许其中多于一个孩子被派生的树遍历情况。
[0724]
图90以图形方式图示了可由simd流水线同步处理的线程9000的初始集合。例如,
线程9000可以作为工作组而被同步地分派和执行。然而,在该实施例中,同步线程9000的初始集合可以生成多个发散派生线程9001,该多个发散派生线程9001可以在本文描述的异步光线追踪架构内产生其他派生线程9011。最终,收敛派生线程9021返回到线程9000的原始集合,其然后可以继续同步执行,从而根据跟踪阵列5249按照需要复原上下文。
[0725]
在一个实施例中,无绑定线程分派(btd)功能通过坚持在执行和完成(发散后且然后收敛派生)之后恢复父线程,来支持simd16和simd32模式、可变通用寄存器(gpr)使用、共享本地存储器(slm)和btd屏障。本发明的一个实施例包括用于恢复父线程的硬件管理的实现以及slm和屏障资源的软件管理的取消引用。
[0726]
在本发明的一个实施例中,以下术语具有以下含义:可调用模式:由无绑定线程分派派生的线程处于“可调用模式”中。这些线程可以访问继承的共享本地存储器空间,且可以可选地在可调用模式中每线程派生线程。在该模式中,线程不可访问工作组级别屏障。
[0727]
工作组(wg)模式:当线程正在以如标准线程分派所分派的具有组成simd通道的相同方式执行时,它们被定义为处于工作组模式中。在该模式中,线程可访问工作组级别屏障以及共享的本地存储器。在一个实施例中,响应于“计算步行者”命令而发起线程分派,该“计算步行者”命令发起仅计算上下文。
[0728]
普通派生:也被称作规则派生线程9011(图90),不论何时一个可调用调用了另一个时,都发起普通派生。这种所派生的线程是在可调用模式中考虑的。
[0729]
发散派生:如图90中所示,当线程从工作组模式过渡到可调用模式时,触发发散派生线程9001。发散派生的参数是simd宽度和固定功能线程id(fftid),它们子组统一的。
[0730]
收敛派生:当线程从可调用模式过渡回到工作组模式时,执行收敛派生线程9021。收敛派生的参数是每通道的fftid以及指示通道的栈是否为空的掩码。该掩码必须是通过在返回站点处检验每通道的栈指针的值来动态计算的。编译器必须计算该掩码,这是因为这些可调用线程可以递归地调用彼此。收敛派生中的不具有收敛位集合的通道将像普通派生那样表现。
[0731]
无绑定线程分派在不允许共享本地存储器或屏障操作的一些实现中解决了针对光线追踪的simd发散问题。另外,在本发明的一个实施例中,使用btd以使用多种计算模型来解决simd发散。特别地,具有线程组屏障和共享本地存储器的任何计算分派可以派生无绑定子线程(例如,每父每次一个子线程),并且所有相同线程可以由btd重新分组和分派以用于更高效率。该实施例允许发端线程与它们的子线程共享它们共享的本地存储器空间。仅当最终收敛的父终止(如线程结束(eot)指示符所指示)时,才释放共享本地存储器分配和屏障。本发明的一个实施例还提供了可调用模式内的放大,从而允许其中多于一个孩子被派生的树遍历情况。
[0732]
尽管不限于此,但本发明的一个实施例被实现在下述系统上:在该系统中,没有针对放大的支持被任何simd通道提供(即,允许以发散或收敛的派生线程的形式存在的仅单个未决simd通道)。另外,在一个实现中,在分派线程时,将(fftid, barrier_id, slm_id)的32b发送到btd启用的分派器8950。在一个实施例中,在启动线程并将该信息发送到无绑定线程分派器8950之前,释放所有这些空间。在一个实现中,一次仅单个上下文活跃。因此,流氓内核甚至在篡改fftid之后也不能访问其他上下文的地址空间。
[0733]
在一个实施例中,如果stackid分配被启用,则当线程终止时,将不再取消引用共享本地存储器和屏障。取而代之,它们仅在当线程终止时已经释放所有关联stackid的情况下才被取消引用。一个实施例通过确保stackid被适当地释放来防止固定功能线程id(fftid)泄漏。
[0734]
在一个实施例中,指定屏障消息,以显式地从发送线程取得屏障id。这是在无绑定线程分派调用之后启用屏障/slm使用所必需的。
[0735]
图91图示了用于执行如本文描述的无绑定线程分派和线程/工作组抢占的架构的一个实施例。该实施例的执行单元(eu)8910支持线程执行掩码9150-9153的直接操控,并且每个btd派生消息支持用于在完成收敛派生9021之后重新派生父线程的fftid引用计数。因此,本文描述的光线追踪电路系统支持针对btd派生和traceray消息的另外消息变型。在一个实施例中,btd启用的分派器8950维持发散派生线程9001上的原始simd通道的每fftid(如线程分派所指派)的计数,并针对收敛派生线程9021而倒计数,以启动父线程9000的恢复。
[0736]
可以在执行期间对各种事件进行计数,该执行包括但不限于:规则派生9011执行;发散派生执行9001;收敛派生事件9021;fftid计数器达到最小值阈值(例如,0);以及针对(fftid, barrier_id, slm_id)而执行的负载。
[0737]
在一个实施例中,利用btd启用的线程(即,以表彰threadgroup语义)允许共享本地存储器(slm)和屏障分配。btd启用的线程分派器8950将fftid释放和屏障id释放从线程结束(eot)指示解除联系(例如,经由特定消息)。
[0738]
在一个实施例中,为了支持来自计算线程的可调用着色器,使用驱动器管理的缓冲器9170以存储跨无绑定线程分派的工作组信息。在一个特定实现中,驱动器管理的缓冲器9170包括多个条目,其中每个条目与不同的fftid相关联。
[0739]
在一个实施例中,在状态初始化器8920内,两个位被分配以指示针对消息压实而纳入因素的流水线派生类型。对于发散消息,状态初始化器8920还将来自消息的fftid,并利用每个simd通道而流水线处理到光线/盒遍历块8930或无绑定线程分派器8950。对于收敛派生9021,存在消息中的针对每个simd通道的fftid以及具有针对光线/盒遍历单元8930或无绑定线程分派器8950的每个simd通道的流水线fftid。在一个实施例中,光线/盒遍历单元8930还对包括收敛派生9021的派生类型进行流水线处理。特别地,在一个实施例中,光线/盒遍历单元8930对具有针对traceray消息的每个光线收敛派生9021的fftid进行流水线处理和存储。
[0740]
在一个实施例中,线程分派器8950具有专用接口,以在准备利用无绑定线程分派启用位集合对新线程进行分派时提供以下数据结构:struct tsl_sts_inf { // 不可失速(non-stallable)接口
ꢀꢀꢀ
logic[8] fftid;
ꢀꢀꢀ
logic[8] barrier_id;
ꢀꢀꢀ
logic[8] slm_id;
ꢀꢀꢀ
logic[8] count_valid_simd_lanes;}
[0741]
无绑定线程分派器8950还处理具有三个另外位的线程结束(eot)消息,该三个另
外位是:release_fftid、release_barrier_id、release_slm_id。如所提及的那样,线程结束(eot)消息不必然释放/解除引用与id相关联的所有分配,而是仅具有释放位集合的分配。典型使用情况是:当发散派生9001被发起时,派生线程产生eot消息,但释放位未被设置。其在收敛派生9021之后的延续部分将产生另一eot消息,但这次具有释放位集合。仅在该级处,所有每线程的资源才将被回收。
[0742]
在一个实施例中,无绑定线程分派器8950实现新接口以加载fftid、barrier_id、slm_id和通道计数。它将所有该信息存储在某个数目的条目深(在一个实施例中,max_fftid,144个条目深)的fftid可寻址储存器9121中。在一个实现中,响应于任何规则派生9011或发散派生9001,btd启用的分派器8950使用针对每个simd通道的该标识信息,在每fftid的基础上执行对fftid可寻址储存器9121的查询,并将线程数据存储在如上所述的分类缓冲器(参见例如图42中的内容可寻址存储器4201)中。这导致每simd通道将另外两的数据(例如,24个位)存储在分类缓冲器4201中。
[0743]
在接收到收敛派生消息时,对于从状态初始化器3920或光线/盒遍历块8930到无绑定线程分派器8950的每个simd通道,递减每fftid的计数。当给定父的fftid计数器变为零时,利用原始执行掩码9150-9153调度整个线程,该原始执行掩码9150-9153具有在分类电路系统4008中由收敛派生消息提供的延续部分着色器记录4201。
[0744]
本发明的不同实施例可以根据不同配置来进行操作。例如,在一个实施例中,由线程执行的所有发散派生9001必须具有匹配的simd宽度。另外,在一个实施例中,simd通道必须不执行在相关执行掩码9150-9153内具有convergencemask位集合的收敛派生9021,除非某个更早线程执行了具有相同fftid的发散派生。如果利用给定stackid执行发散派生9001,则收敛派生9021必须在下一发散派生之前出现。
[0745]
如果线程中的任何simd通道执行发散派生,那么所有通道必须最终执行发散派生。已执行发散派生的线程可以不执行屏障,或者死锁将发生。该约束是在发散控制流内启用派生所必需的。父子组不能被重新派生,直到所有通道已经发散且重新收敛。
[0746]
线程必须最终在执行任何派生之后终止以保证向前的进度。如果在线程终止之前执行多个派生,则死锁可以发生。在一个特定实施例中,遵循以下不变因素,尽管本发明的基础原理不限于此:
· 由线程执行的所有发散派生必须具有匹配的simd宽度。
[0747]
· simd通道必须不执行在相关执行掩码9150-9153内具有convergencemask位集合的收敛派生,除非某个更早线程执行了具有相同fftid的发散派生。
[0748]
· 如果利用给定stackid执行发散派生,则收敛派生必须在下一发散派生之前出现。
[0749]
· 如果线程中的任何simd通道执行发散派生,那么所有通道必须最终执行发散派生。已执行发散派生的线程可以不执行屏障,或者死锁将发生。该约束是在发散控制流内启用派生所必需的。父子组不能被重新派生,直到所有通道已经发散且重新收敛。
[0750]
· 线程必须最终在执行任何派生之后终止以保证向前的进度。如果在线程终止之前执行多个派生,则死锁可以发生。
[0751]
在一个实施例中,btd启用的分派器8950包括:线程抢占逻辑9120,抢占某些类型的工作负载/线程的执行,以释放用于执行其他类型的工作负载/线程的资源。例如,本文描
述的各种实施例可以执行计算工作负载和图形工作负载(包括光线追踪工作负载)两者,其可以以不同优先级运行和/或具有不同时延要求。为了解决每个工作负载/线程的要求,本发明的一个实施例中止光线遍历操作,以释放针对更高优先级工作负载/线程或否则将未能满足指定时延要求的工作负载/线程的执行资源。
[0752]
如上关于图52a-b所描述,一个实施例使用短栈5203-5204来降低针对遍历的储存要求,以在遍历操作期间存储有限数量的bvh节点。这些技术可以被图91中的实施例使用,其中光线/盒遍历单元8930高效地向和从短栈5203-5204推送和弹出条目,以确保所需bvh节点5290-5291可用。另外,随着遍历操作被执行,遍历/栈跟踪器5248更新在本文中被称作跟踪阵列5249的跟踪数据结构以及相关栈5203-5204和光线追踪数据4902。使用这些技术,当光线的遍历被暂停和重启时,遍历电路系统/逻辑8930可以查阅跟踪数据结构5249并访问相关栈5203-5204和光线追踪数据4902,以在bvh内它停下来的相同位置处针对该光线开始遍历操作。
[0753]
在一个实施例中,线程抢占逻辑9120确定何时要如本文描述的那样抢占遍历线程(或其他编程类型)的集合(例如,以释放针对更高优先级工作负载/线程的资源),并通知光线/盒遍历单元8930,使得它可以暂停处理当前线程之一,以释放用于处理更高优先级线程的资源。在一个实施例中,“通知”仅仅是通过在遍历在旧线程上完成之前分派针对新线程的指令来执行的。
[0754]
因此,本发明的一个实施例包括针对在工作组模式中操作的同步光线追踪(即,其中工作组的所有线程被同步地执行)和使用如本文描述的无绑定线程分派的异步光线追踪两者的硬件支持。与需要工作组中的所有线程以在执行抢占之前完成的当前系统相比,这些技术显著地改进了性能。相比而言,本文描述的实施例可以通过密切地跟踪遍历操作、仅存储重启所需的数据并在适当时使用短栈,来执行栈级别和线程级别抢占。这些技术是可能的,这至少部分地因为光线追踪加速硬件和执行单元8910经由在每光线的级别和每bvh的级别处管理的持久性存储器结构3198进行通信。
[0755]
当如上所述的那样生成traceray消息并且存在抢占请求时,可以在各种级处抢占光线遍历操作,该各种级包括:(1)尚未开始;(2)部分地完成且被抢占;(3)遍历完成,不具有无绑定线程分派;以及(4)遍历完成,但具有无绑定线程分派。如果遍历尚未开始,那么当光线追踪消息被恢复时,不从跟踪阵列5249需要另外数据。如果遍历部分地完成,那么遍历/栈跟踪器5248将读取跟踪阵列5249,以按照需要使用光线追踪数据4902和栈5121来确定在何处恢复遍历。它可以使用被指派给每个光线的唯一id来查询跟踪阵列5249。
[0756]
如果遍历完成并且不存在无绑定线程分派,那么可以使用跟踪阵列5249(和/或其他数据结构4902、5121)中存储的任何命中信息来调度无绑定线程分派。如果遍历完成并且存在无绑定线程分派,那么复原无绑定线程并恢复执行直到完成。
[0757]
在一个实施例中,跟踪阵列5249包括针对飞行中的光线的每个唯一光线id的条目,并且每个条目可以包括针对对应线程的执行掩码9150-9153之一。可替换地,执行掩码9150-9153可以被存储在单独数据结构中。在两个实现中的任一个实现中,跟踪阵列5249中的每个条目可以包括或关联于1位值,以指示当光线/盒遍历单元8930在抢占之后继续操作时是否需要重新提交对应光线。在一个实现中,该1位值是在线程组(即,工作组)内管理的。该位可以在光线遍历的起始处被设置成1,且可以在光线遍历完成时被重置回到0。
[0758]
本文描述的技术在不等待遍历线程和/或整个工作组完成的情况下允许与要由其他线程(例如,计算线程)抢占的光线遍历相关联的遍历线程,从而改进与高优先级和/或低时延线程相关联的性能。此外,由于本文描述的用于跟踪遍历过程的技术,可以在停下来的地方重启遍历线程,从而节省显著的处理周期和资源使用。另外,上述实施例允许工作组线程派生无绑定线程,并提供用于重新收敛以到达回到原始simd架构状态的机制。这些技术有效地将针对光线追踪和计算线程的性能改进了一个量级。
[0759]
用于数据并行光线追踪的装置和方法在科学可视化中(而且在电影和其他领域中),数据集正在日益增长到不能被单个节点处理的大小。对于离线算法(大多数在电影中),这常常是通过寻呼、高速缓存和核外技术来处理的;但当需要交互式设置(例如,针对油和气的可视化、大数据/hpc环境中的科学可视化、交互式电影内容预览等)时,这不再是可能的。在该情况下,绝对有必要使用某种形式的数据并行渲染,其中跨多个不同节点而对数据进行分区——使得可以跨所有节点而存储整个数据——并且其中这些节点在渲染所需图像时协作。
[0760]
本发明实施例包括用于减小用于在跨多个计算节点的数据分布式光线追踪的上下文中传送光线和/或体积块的带宽的装置和方法。图92例如图示了包括多个光线追踪节点9210-9213的光线追踪集群9200,该多个光线追踪节点9210-9213并行地执行光线追踪操作,从而潜在地在节点之一上对结果进行组合。在所图示的架构中,光线追踪节点9210-9213经由网关9220通信耦合到客户端侧光线追踪应用9230。
[0761]
在以下描述中将假定多个节点9210-9213联合地保持光线追踪数据。每个这种节点9210-9213可以包含一个或多个cpu、gpu、fpga等,并且,可以在这些资源中的个体资源或组合上执行计算。在一个实施例中,计算节点9210-9213通过某种形式的网络9215(诸如,infiniband、omnipath或nvlink,仅举几例)来彼此通信。可以跨这些节点9210-9213的存储器而将数据分成部分,这是因为使用渲染器的应用自身已经对数据进行分区(如针对许多原位算法或并行中间件(诸如paraview、visit等)的情况那样)或者因为渲染器已经创建该分区。
[0762]
为了在这种环境中进行并行渲染,存在多种算术选择:基于复合的方法使每个节点渲染其本地数据的图像,并使用深度和/或阿尔法复合来组合这些部分结果。数据转发(或高速缓存)方法在给定节点上计算给定光线的(或像素的、路径的等)操作,检测不论何时该光线/像素/路径需要在另一节点上存在的数据,并按需提取该数据。基于光线转发的方法不将数据转发到需要它的光线,而是代之以将光线发送到数据所处的地方:当节点检测到光线需要关于另一节点的数据进行处理时,它将该光线发送到拥有该数据的节点。
[0763]
在这些选择当中,复合是最简单且最广泛使用的;然而,它仅对于相对简单的渲染效果适用,且不能被容易地用于诸如阴影、反射、环境遮蔽、全局照明、体散射、体阴影等之类的效果。用户更频繁地需要的这种效果需要某种光线追踪,在该情况下,数据并行渲染将数据提取到光线或将光线发送到数据。之前已经使用全部两个方法,并且它们的限制被完好地理解。特别地,通过发送多达数十亿个光线在周围(用于光线转发)、或者通过使每个节点9210-9213提取多达数千兆字节的数据(用于数据转发)、或者这两者(当使用这两者的组合时),全部两个方法遭受高带宽要求。
[0764]
尽管网络带宽急剧增加,但数据大小和/或光线计数也增加,这意味着该带宽实际
上非常快地成为针对性能的限制因素。事实上,它常常是不能实现交互式性能的唯一原因,除了在非常简单的设置(诸如仅主光线的渲染,在该情况下,还可能已经使用复合)中。
[0765]
本发明的一个实施例集中于下述核心思想:实际上,数据的非常大的部分实际上常常对于给定帧而言无关紧要。例如,在体渲染中,用户常常使用“传递函数”以突出显示数据的某些区,其中较不有趣的数据被设置成全透明。清楚的是,将仅遍历“非有趣”数据的光线不会需要提取该数据(或被发送到该数据),并且,可以保存相应带宽。类似地,对于基于表面的光线追踪,如果光线经过由另一节点拥有的空间的区但实际上未在此处与任何三角形交叉,那么它实际上不需要与该另一节点的三角形交互。
[0766]
一个实施例以使用在本文中被称作针对节点的数据的“代理”9230-9233的内容的形式,将来自个体节点的“空的空间跳过”和“包围体”的构思扩展到数据并行渲染。特别地,每个节点计算其自身的数据的非常低存储器占地面积代理9230-9233,使得该代理提供近似或保守地包围该数据的能力。所有节点9210-9213然后交换它们的代理9230-9233,使得每个节点具有每个其他节点的代理。例如,在节点9210上存储的代理9230将包括来自节点9211-9213的代理数据。当节点需要通过由另一节点拥有的空间区来追踪光线时,它首先通过其自身对该节点的代理的拷贝来追踪该光线。如果该代理保证不会发生有意义的交互,则它可以跳过发送该光线/提取该数据,从而保存这样做所需的带宽。
[0767]
图93图示了根据本发明的一个实施例的光线追踪节点9210的另外细节。体积细分模块9265将体积细分成多个分区,其中每个分区由不同的节点处理。工作数据集9360包括针对要由节点9210处理的分区的数据。代理生成模块9250基于工作数据集9360来生成代理9340。代理9340被传输到如本文描述的那样使用代理以剔除不需要的数据的其他光线追踪节点9211-9213中的每一个。类似地,分别在节点9211-9213上生成的代理9341-9343被传输到节点9210。光线追踪引擎9315使用本地存储的工作数据集9360和由互连节点9211-9213中的每一个提供的代理9341-9343两者来执行光线追踪操作。
[0768]
图94图示了下述示例:其中在体渲染的上下文中,给定体积数据集9400太大而不能被渲染在一个节点上,因此它得以分区成多个块9401-9404(在该情况下,2
×
2集合)。如图95中所图示,该逻辑分区体积然后可以跨不同节点9210-9213而分布,每个节点保留体积的一部分。
[0769]
传统上,每当节点想要发送经过其他节点的空间区的光线时,它都必须将该光线发送到这些节点或者提取那些节点的数据。在图96中,例如,节点9210追踪经过由节点9211-9213拥有的空间的光线。
[0770]
如图97中所图示,在一个实施例中,每个节点9210-9213分别计算针对数据9401-9404的其部分的本地代理9240-9243,其中代理是在大小方面(显著)更小的任何种类的对象,但允许近似或保守地包围该节点的数据。例如,在一个实施例中,每个节点计算通常被称作“宏单元网格”的内容;较低分辨率网格,其中每个单元对应于输入体积中的单元的区,并且其中每个这种单元存储例如该区中的最小值和最大值标量值(在单节点渲染的上下文中,这通常用于“空间跳过”)。在所图示的示例中,每个节点9210-9213计算针对数据的其部分的一个这种代理9240-9243。在一个实施例中,所有节点然后交换它们的相应代理,直到每个节点具有针对每个节点的所有代理,如图98中所图示。
[0771]
如果对于给定传递函数设置而言数据值中的仅一些实际上有趣(在它们不完全透
明的意义上),那么这可以在代理中被保守地检测(正如传统单节点空间跳过那样)。这在图99中被图示为区9940-9943。
[0772]
另外,由于每个节点具有每个其他节点的代理,因此每个节点还可以基于它针对其他节点而具有的代理来保守地界定哪些其他节点的区是有趣的,如图100中所示。如果节点9210必须追踪横跨节点9211-9213的数据区的光线,那么可以将光线投影到代理上并在此处遍历光线,如虚线箭头所指示。这指示了尽管光线确实经过由节点9210-9212拥有的空间,但仅节点9212实际上包含任何有趣的区,因此该光线可以被转发到节点9212,如实线箭头在图100中所指示,而不在节点9210上处理或者发送到节点9211(或者在高速缓存上下文中,可以仅从节点9210而不是从9211和9212两者提取数据)。
[0773]
在图101中图示了根据本发明的一个实施例的方法。该方法可以被实现在上述架构的上下文内,但不限于任何特定处理或系统架构。
[0774]
在10101处,将体积逻辑细分成多个区(n),并且在10102处,将与n个分区相关联的数据分发给n个不同节点(例如,在一个实施例中,每节点一个分区)。在10103处,每个节点计算针对其相应分区的代理并将该代理发送到其他节点。在10104处,使用代理来针对当前光线或光线组(例如,光束)而执行遍历/交叉操作,从而潜在地忽略与操作不相关的代理内的某些区。如所提及的那样,对于给定传递函数设置,数据值中的仅一些实际上是有趣的(例如,因为他们不完全透明)。如关于单节点空间跳过而完成的那样,这可以在代理中被保守地检测。如果在10105处确定光线与代理交互,那么在10106处,将(一个或多个)光线发送到与代理相关联的节点或者从节点获取数据。然后在10107处选择接下来的光线或光线组。
[0775]
具有重要性采样和重新采样的重要性采样的随机拼贴照明在视频游戏图形引擎中使用的光的数量已经在过去若干年中急剧增加,从而创建针对图形处理器的显著另外计算负载。用于处理大光计数的公共技术之一(被称作“拼贴照明”)并未完好地与提供实时光线追踪阴影的新图形处理硬件能力交互。
[0776]
下述本发明实施例利用新随机计数,以降低甚至随着光计数继续增加而将保持计算上可行的拼贴照明的成本。一些实施例还解决了利用拼贴照明来渲染光线追踪阴影的工业范围的问题。
[0777]
术语“推迟照明”指代下述过程:其中仅在场景已经被拉取到g-缓冲器之后执行针对像素的照明操作。g-缓冲器典型地包含每像素的法线、深度和其他材料相关信息。每像素的深度用于重构像素的世界空间位置,并且连同其他每像素的数据一起使用该位置,以实施针对屏幕上可见的最前部表面的照明计算。
[0778]
在游戏引擎移动到具有许多光源的场景的情况下,变得有必要确定哪些光源影响给定像素。“拼贴照明”是下述技术:其中计算着色器的一组通道使用以下操作集合来处理像素或体素的正方形或矩形2d或3d贴片(例如,1
×
1、8
×
8、16
×
16或16
×
16
×
16):(1)重构像素在每个计算通道中的世界空间位置(例如,其中每个通道在单个像素上操作);(2)计算通道联合创建像素的贴片的世界空间包围盒;(3)每个通道评估所有场景光的子集,以确定光是否与贴片的世界空间包围盒交叉;以及(4)通道联合创建与贴片交叉的所有光源的列表/阵列——有时被称作“每贴片的光列表”。
[0779]
由于贴片的三维世界空间盒可以变大,因此存在拼贴照明的下述变型:该变型基于光源的某种形式的空间群集将盒细分成多个更小的盒。
[0780]“推迟拼贴照明”渲染流水线对推迟照明和拼贴照明进行组合,以使用每贴片的光列表中的所有光类累积针对g-缓冲器像素的“推迟照明”。仅当对于给定光而言存在阴影图时才计及阴影化。
[0781]“向前 ”照明渲染流水线仅在第一遍中在场景几何结构上渲染场景深度。基于该深度信息,如在拼贴照明中生成每贴片的光列表。然后使用光列表以在第二渲染遍期间在场景几何结构上计算光,该场景几何结构针对给定像素而累积来自每贴片的光列表中的所有光的每像素的照明。向前 照明典型地允许比推迟照明和拼贴照明的组合更复杂的材料设立。再一次,仅当对于给定光而言存在阴影图时才计及阴影化。
[0782]“时间累积”指代重用来自最后帧(在可能时)的数据,以通过使计算遍布在若干帧上来累积来自若干光源的照明,而不是在一个帧中累积来自所有光源的照明。由于每贴片的光计数可能是高的,因此该过程典型地削减了给定帧中的照明计算。
[0783]
本发明实施例减少了经典推迟拼贴照明针对大光计数而面临的计算负载。通过使用光的时变重要性采样子集而不是所有光使照明计算在时间上遍布在若干帧上,来减少每贴片/像素的光的数量。此外,某些实施例包括用于光的重要性采样以及用于阴影投射光的重新重要性采样的随机选择技术。该设立消除了现今典型地使用的阴影投射光的全局集合。
[0784]
特别地,一个实现使用随机拼贴照明,其选择针对贴片(或甚至像素)的光源的“重要”子集。可以例如基于光源(或缺少光源)对贴片/像素的影响来确定光源的重要性级别。一旦被识别,光源的该子集然后就在照明和阴影计算期间被评估。在一个实现中,将时变的随机选择的光子集与时间累积进行组合,以产生用于图形渲染的更高质量且更高效的照明。
[0785]
游戏中的阴影阴影图存储如从光源的视点所见的场景的深度。游戏典型地渲染针对场景中的n个最重要光源的有限数量的阴影图(例如,其中在一些实现中,n = 8)。艺术家常常确定哪些光源针对游戏场景的各种位置而投射阴影。对于光线追踪的阴影,同样成立。在一些实施例中,使用光线追踪以计算针对n个所识别的光源的屏幕空间可见性掩码。
[0786]
均匀(伪)随机数和蒙特卡洛积分在一个实施例中,使用范围[0
ꢀ……
范围(range)]内的伪随机数来执行随机采样。这些数可以被生成以使得每个数的概率密度是1/范围。
[0787]
蒙特卡洛积分是一种用于使用给定范围内的均匀数xi来近似n个函数样本的有限和在该范围上的函数的积分的技术。
[0788]
这里,每个样本xi具有相同概率,并且概率密度函数是恒定的。
[0789]
重要性采样在一个实施例中,可以使用偏态概率密度函数(pdf),以使有助于更快速地估计积分的样本出现得更频繁。“偏态”指代pdf不是如标准蒙特卡洛积分中那样恒定这一事实。相反,对积分估计具有更显著影响的样本具有更高值的pdf。pdf在范围上的积分需要积分到1.0,其为:

[0790]
例如,对于图102中所图示的x的函数,[0
……
0.2]和[0.8
……
1]内的随机样本不显著贡献于积分。因此,一个实施例使用在[0.2
……
0.8]内具有更高密度的pdf以更高效地近似积分。
[0791]
重新重要性采样本发明的一个实施例在“重要”光的第一集合已经被选择之后执行重新重要性采样。特别地,一旦已经经由重要性采样生成了pdf,重新重要性采样然后就对所有所选择的光的pdf值之和进行重新放缩和归一化,并再次执行重要性采样,以选择甚至更小的光子集。
[0792]
如上所提及,可以选择n个最重要光源(例如,其中n=4
……
8)以生成阴影图。典型地在cpu上作出关于哪些光投射阴影的决策,并且对于所有照明贴片和所有像素,针对每个帧(全局)作出决策。
[0793]
在一个实施例中,在针对每个像素/贴片在光上迭代时,仅关于上面提及的n个光计及光的可见性。针对这n个光而渲染的阴影图用于确定哪个像素可以看到哪个光。
[0794]
以下公式反映了以上描述,假定在针对像素的贴片光列表中存在m个光:在一个实施例中,仅针对n个光而应用阴影(基于针对光i的阴影图查找);光的剩余部分不投射任何阴影。
[0795]
本发明实施例扩展拼贴推迟照明流水线且因而可以容易地整合到现有拼贴照明流水线中。另外,本发明的一个实施例使用时间累积和空间滤波/累积(例如,对相邻像素的内核上的照明进行求和),连同光重要性采样和阴影光重新重要性采样一起。
[0796]
已经观察到,对于n个光以及m个阴影投射光的子集,针对像素的照明可以由下式近似:参见ericheitz、stephenhill和morganmcguire的“combininganalyticdirectilluminationandstochasticshadows”。
[0797]
本发明实施例改动了对适于拼贴照明的在时间上累积且在空间上滤波的版本:
[0798]
这里,潜在地大数量的光n(每贴片)被重要性采样且减少到显著更小数量的光n1。由于该思想是在时间上积分,因此一个实施例针对每个帧选择n1的不同子集。
[0799]
光n1的该依赖于时间的集合然后被重新重要性采样,以达到需要阴影光线以评估可见性的甚至更小数量的光n2。由此,照明和阴影评估的成本针对每贴片/像素而下降,这是由于照明成本在时间上遍布在若干帧上。此外,局部地(例如,每贴片或甚至每像素)选择“重要”阴影投射光的独立集合改进了阴影化的局部质量。
[0800]
如所提及的那样,本发明的一个实施例还在生成经重要性采样的拼贴光列表、经重新重要性采样的拼贴光列表和经重新重要性采样的阴影拼贴光列表时,执行时间累积和空间滤波,从而跨多个帧分布处理负载。
[0801]
如下面更详细描述的那样,一个实施例执行经重要性采样的拼贴照明以确定第一光列表l1,并执行第一光列表l1的重新重要性采样以生成经重新重要性采样的光列表l2。阴影和无阴影拼贴照明两者然后都是根据经重新重要性采样的光列表l2确定的。可以执行时间累积以生成最终阴影和无阴影拼贴照明。
[0802]
在一个实施例中,根据以上等式的以下分量确定第一光列表l1和初始概率密度函数pdf1:使用下式、基于经重新重要性采样的光列表l2和所适配的概率函数pdf2来确定经重要性采样的阴影拼贴照明:并且根据下式、基于经重新重要性采样的光列表l2来确定经重新重要性采样的拼贴照明:。
[0803]
在图103中图示了根据本发明的一个实施例的照明引擎10300。重要性采样逻辑10305处理n1光的每贴片的光列表以生成光列表l1。如所提及的那样,每贴片的光列表n1可以是在若干帧上生成的在时间上累积的光列表。
[0804]
在一个实施例中,重要性采样逻辑10305执行图104中所示的操作以生成光列表l1。特别地,在10401处,对每贴片的光列表n1进行扫描以确定最小值和最大值亮度值。例如,可以在贴片的拐角处评估光强度以识别最小值和最大值强度。可以基于最小值和最大值亮度来确定光亮度箱的集合。
[0805]
在10402处,根据亮度来对光分箱。例如,每个箱可以指定亮度/强度的最小值和/或最大值级别。然后根据光的强度将光分配给每个箱。图105图示了使用四个箱10501的一个示例。
[0806]
返回到图104,在10403处,从光箱对n1光进行重要性采样以生成经重要性采样的光列表l1。如所提及的那样,可以使用偏态概率密度函数以识别有助于更快地估计积分的样本。在图105中,例如,bin4中的将对估计具有更显著影响的两个最明亮的光跨采样阵列10502中的8个位置而分布,bin3中的1个光分布在3个位置上,bin2中的1个光分布在2个位置上,并且bin1中的两个光被存储在2个位置中。然后在采样阵列10502上执行随机采样以生成光列表l1。
[0807]
在一个实现中,不生成采样阵列10502,而是通过首先选择箱来执行重要性采样。然后直接从所选择的箱对光进行重要性采样。各种其他技术可以用于在一些采样,同时仍符合本发明的基础原理。
[0808]
返回到图103,无阴影光处理逻辑10310计算光列表l1上的无阴影拼贴照明操作以生成累积的光值l
accum
。特别地,在将l
accum
初始化成0之后,对于当前像素,针对l1中的所有光li执行操作l
accum = l
i *brdf/pdfi。可以在时间上将结果与来自在先帧的光值l
accum_last_frame
进行组合, 以生成l
accum
的最终值。
[0809]
在一个实施例中,重新重要性采样逻辑10315对针对当前贴片的经重要性采样的光的列表l1连同强度一起进行扫描,以识别最小值和最大值强度。重新重要性采样逻辑10315根据亮度来对光分箱以生成光箱(如上面关于重要性采样逻辑10305所描述)。一旦箱被生成,就可以使用用于上述重要性采样的技术(参见例如图105)以对来自光箱的n2光进行采样。
[0810]
无阴影拼贴光处理逻辑10320处理n2光以生成阴影拼贴照明结果l
accum2
。在一个实施例中,对于当前像素,针对l2中的所有光li执行操作l
accum = l
i *brdf/pdfi。可以在时间上将结果与来自在先帧的光值l
accum2_last_frame
进行组合以生成l
accum2
的最终值。在一些实施例中,该操作可以使用也包含n2光的经独立采样的光列表l
2'
。例如,某些实施例使用两个不同的经重新重要性采样的光列表l2和l
2'
。一个可以用于无阴影照明并且另一个可以用于阴影照明。
[0811]
类似地,阴影拼贴光处理逻辑10321处理n2光以生成阴影拼贴照明结果l
accum_shd
。在一个实施例中,对于当前像素,针对l2中的所有光li执行操作l
accum_shd = l
i *brdf*visibility
lighti /pdfi。可以在时间上将结果与来自在先帧的光值l
accum_shd__last_frame
进行组合,以生成l
accum_shd
的最终值。
[0812]
去噪和组合逻辑10330在对结果进行组合之前对所有l
accum_shd
像素、所有l
accum2
像素和所有l
accum
像素进行去噪,以生成拼贴照明输出10340。在一个实施例中,通过执行操作l
shd = l
accum x l
accum_shd / l
accum2
来对结果进行组合,尽管本发明的基础原理不限于该特定操作。
[0813]
在图106中图示了根据本发明的一个实施例的方法。该方法可以是在上述架构上执行的,但不限于任何特定处理器或系统架构。
[0814]
在10601处,从贴片的输入光列表对n1光进行重要性采样,以生成经重要性采样的光列表l1。在10602处,从l1确定无阴影拼贴照明。在10603处,从光列表l1对n2光进行重新采样以产生光列表l2以及可选地产生光列表l
2'
。该操作在本文中被称作“重新重要性采样”。然后在10604处从光列表l2(或可选地,l
2'
)执行阴影拼贴照明,并且在10605处从光列表l2执行无阴影拼贴照明。然后在10606处对结果(l
accum_shd
像素、l
accum2
像素和l
accum
像素)进行去噪和组合,以生成最终照明输出。
[0815]
示例以下是本发明的不同实施例的示例实现。
[0816]
示例1. 一种装置包括:重要性采样硬件逻辑,要执行每贴片的光列表的重要性采样,以生成经重要性采样的每贴片或每像素的光列表;重新重要性采样硬件逻辑,要执行经重要性采样的每贴片或每像素的光列表的重新重要性采样,以生成一个或多个经重新重要性采样的光列表;阴影光处理逻辑,要生成针对当前帧的阴影拼贴照明结果;以及无阴影光处理逻辑,要基于所述一个或多个经重新重要性采样的光列表来生成针对所述当前帧的无阴影拼贴照明结果,其中针对所述当前帧的阴影和无阴影拼贴照明结果是至少部分地通过
累积来自至少一个在先帧的阴影和无阴影光数据来确定的。
[0817]
示例2. 示例1的装置,进一步包括:硬件逻辑,要基于所述阴影拼贴照明结果、所述非阴影拼贴照明结果和经重要性采样的光列表,来生成针对所述当前帧的最终照明结果,以生成针对所述当前帧的最终照明结果。
[0818]
示例3. 示例1的装置,其中所述重要性采样和所述重新重要性采样是根据偏态概率密度函数(pdf)来执行的。
[0819]
示例4. 示例3的装置,其中所述偏态pdf是通过增加对具有更大亮度或强度的光进行采样的概率来实现的。
[0820]
示例5. 示例4的装置,其中重要性采样或重新重要性采样是要通过下述操作来执行的:基于亮度或强度将所述每贴片的光列表或经重要性采样的光列表的光分别分箱到多个箱中。
[0821]
示例6. 示例4的装置,其中所述重要性采样或重新重要性采样是要通过下述操作来执行的:基于分别处于所述每贴片的光列表或经重要性采样的光列表中的每个光的亮度或强度,将所述光、阵列或位掩码中的条目的数量、每光的条目的数量相关联。
[0822]
示例7. 示例6的装置,其中所述重要性采样或重新重要性采样是要通过对所述阵列进行随机采样来执行的。
[0823]
示例8. 示例2的装置,其中所述要生成最终照明结果的硬件逻辑要确定所述阴影拼贴照明结果与所述非阴影拼贴照明结果之比以生成中间结果,并将所述中间结果乘以经重要性采样的光列表以生成所述最终照明结果。
[0824]
示例9. 示例2的装置,其中要生成最终照明结果的硬件逻辑要在生成所述最终照明结果之前,在所述阴影拼贴照明结果、所述无阴影拼贴照明结果和经重要性采样的光列表上执行去噪操作。
[0825]
示例10. 一种方法,包括:执行每贴片的光列表的重要性采样,以生成经重要性采样的每贴片或每像素的光列表;执行经重要性采样的每贴片或每像素的光列表的重新重要性采样,以生成一个或多个经重新重要性采样的光列表;以及基于所述一个或多个经重新重要性采样的光列表,来生成针对当前帧的阴影拼贴照明结果和无阴影拼贴照明结果,其中针对所述当前帧的阴影和无阴影拼贴照明结果是至少部分地通过累积来自至少一个在先帧的阴影和无阴影光数据来确定的。
[0826]
示例11. 示例10的方法,进一步包括:基于所述阴影拼贴照明结果、所述非阴影拼贴照明结果和经重要性采样的光列表,来生成针对所述当前帧的最终照明结果,以生成针对所述当前帧的最终照明结果。
[0827]
示例12. 示例10的方法,其中所述重要性采样和所述重新重要性采样是根据偏态概率密度函数(pdf)来执行的。
[0828]
示例13. 示例12的方法,其中所述偏态pdf是通过增加对具有更大亮度或强度的光进行采样的概率来实现的。
[0829]
示例14. 示例13的方法,其中重要性采样或重新重要性采样是要通过下述操作来执行的:基于亮度或强度将所述每贴片的光列表或经重要性采样的光列表的光分别分箱到多个箱中。
[0830]
示例15. 示例13的方法,其中所述重要性采样或重新重要性采样是要通过下述操
作来执行的:基于分别处于所述每贴片的光列表或经重要性采样的光列表中的每个光的亮度或强度,将所述光、阵列中的条目的数量、每光的条目的数量相关联。
[0831]
示例16. 示例15的方法,其中所述重要性采样或重新重要性采样是要通过对所述阵列进行随机采样来执行的。
[0832]
示例17. 示例11的方法,其中生成最终结果包括:确定所述阴影拼贴照明结果与所述非阴影拼贴照明结果之比以生成中间结果;以及将所述中间结果乘以经重要性采样的光列表以生成所述最终照明结果。
[0833]
示例18. 示例11的方法,进一步包括:在生成所述最终照明结果之前,在所述阴影拼贴照明结果、所述无阴影拼贴照明结果和经重要性采样的光列表上执行去噪操作。
[0834]
示例19. 一种具有程序代码存储于其上的机器可读介质,所述程序代码在由机器执行时使所述机器执行下述操作:执行每贴片的光列表的重要性采样,以生成经重要性采样的每贴片或每像素的光列表;执行经重要性采样的每贴片或每像素的光列表的重新重要性采样,以生成一个或多个经重新重要性采样的光列表;以及基于所述一个或多个经重新重要性采样的光列表,来生成针对当前帧的阴影拼贴照明结果和无阴影拼贴照明结果,其中针对所述当前帧的阴影和无阴影拼贴照明结果是至少部分地通过累积来自至少一个在先帧的阴影和无阴影光数据来确定的。
[0835]
示例20. 示例19的机器可读介质,进一步包括:基于所述阴影拼贴照明结果、所述非阴影拼贴照明结果和经重要性采样的光列表,来生成针对所述当前帧的最终照明结果,以生成针对所述当前帧的最终照明结果。
[0836]
示例21. 示例19的机器可读介质,其中所述重要性采样和所述重新重要性采样是根据偏态概率密度函数(pdf)来执行的。
[0837]
示例22. 示例21的机器可读介质,其中所述偏态pdf是通过增加对具有更大亮度或强度的光进行采样的概率来实现的。
[0838]
示例23. 示例22的机器可读介质,其中重要性采样或重新重要性采样是要通过下述操作来执行的:基于亮度或强度将所述每贴片的光列表或经重要性采样的光列表的光分别分箱到多个箱中。
[0839]
示例24. 示例22的机器可读介质,其中所述重要性采样或重新重要性采样是要通过下述操作来执行的:基于分别处于所述每贴片的光列表或经重要性采样的光列表中的每个光的亮度或强度,将所述光、阵列中的条目的数量、每光的条目的数量相关联。
[0840]
示例25. 示例24的机器可读介质,其中所述重要性采样或重新重要性采样是要通过对所述阵列进行随机采样来执行的。
[0841]
示例26. 示例20的机器可读介质,其中生成最终结果包括:确定所述阴影拼贴照明结果与所述非阴影拼贴照明结果之比以生成中间结果;以及将所述中间结果乘以经重要性采样的光列表以生成所述最终照明结果。
[0842]
示例27. 示例20的机器可读介质,进一步包括使所述机器执行下述操作的程序代码:在生成所述最终照明结果之前,在所述阴影拼贴照明结果、所述无阴影拼贴照明结果和经重要性采样的光列表上执行去噪操作。
[0843]
因此,本发明实施例通过来自给定的每贴片的光列表的光集合的重要性采样和重新重要性采样来减少计算负载。另外,所描述的实施例可以与拼贴照明一起被使用,以创建
针对具有大量光的场景的实时(光线追踪)阴影。这些实施例通过使用光的时变的经重要性采样的子集而不是所有光使照明计算在时间上遍布在若干帧上,来减少每贴片/像素的光的数量。此外,这些实施例用于光的重要性采样以及用于阴影投射光的重新重要性采样的随机选择技术,从而消除了现今典型地使用的阴影投射光的全局集合。
[0844]
本发明实施例可以包括上面已经描述的各种步骤。步骤可以体现在可以用于使通用或专用处理器执行步骤的机器可执行指令中。可替换地,这些步骤可以由包含用于执行步骤的硬连线逻辑的特定硬件组件执行,或者由所编程的计算机组件和定制硬件组件的任何组合执行。
[0845]
如本文所描述,指令可以指代硬件的特定配置,诸如被配置成执行某些操作或者具有体现在非瞬变计算机可读介质中的存储器中存储的预定功能性或软件指令的专用集成电路(asic)。因此,可以使用在一个或多个电子设备(例如终端站、网络元件等)上存储和执行的代码和数据来实现图中所示的技术。这种电子设备使用计算机机器可读介质来存储和传送(内部地和/或在网络上与其他电子设备)代码和数据,该计算机机器可读介质诸如是非瞬变计算机机器可读储存介质(例如,磁盘;光盘;随机存取存储器;只读存储器;闪速存储器设备;相变存储器)和瞬变计算机机器可读通信介质(例如,电、光、声或其他形式的传播信号——诸如载波、红外信号、数字信号等)。
[0846]
另外,这种电子设备典型地包括耦合到一个或多个其他组件的一个或多个处理器的集合,该一个或多个其他组件诸如是一个或多个储存设备(非瞬变机器可读储存介质)、用户输入/输出设备(例如,键盘、触摸屏和/或显示器)和网络连接。处理器的集合和其他组件的耦合典型地通过一个或多个总线和桥(也被称为总线控制器)。承载网络业务的储存设备和信号分别表示一个或多个机器可读储存介质和机器可读通信介质。因此,给定电子设备的储存设备典型地存储用于在该电子设备的一个或多个处理器的集合上执行的代码和/或数据。当然,可以使用软件、固件和/或硬件的不同组合来实现本发明实施例的一个或多个部分。遍及该详细描述,出于解释的目的,阐述了许多特定细节以便提供本发明的透彻理解。然而,对本领域技术人员来说将明显的是,可以在没有这些特定细节中的一些的情况下实践本发明。在某些实例中,未详细描述公知结构和功能以便使避免本发明的主题模糊。相应地,本发明的范围和精神应当是按照所附权利要求来判断的。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献