CN115861517A - 用于利用着色器调用图分析进行光线追踪的装置和方法 - Google Patents

用于利用着色器调用图分析进行光线追踪的装置和方法 Download PDF

Info

Publication number
CN115861517A
CN115861517A CN202211026423.1A CN202211026423A CN115861517A CN 115861517 A CN115861517 A CN 115861517A CN 202211026423 A CN202211026423 A CN 202211026423A CN 115861517 A CN115861517 A CN 115861517A
Authority
CN
China
Prior art keywords
shader
ray
data
graphics
execution
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202211026423.1A
Other languages
English (en)
Inventor
S·沃尔科夫
S·皮洛
J·巴尔扎克
K·莱维特-格瑞维奇
I·苏尔明
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Intel Corp
Original Assignee
Intel Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Intel Corp filed Critical Intel Corp
Publication of CN115861517A publication Critical patent/CN115861517A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/06Ray-tracing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/005General purpose rendering architectures

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Graphics (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Theoretical Computer Science (AREA)
  • Image Generation (AREA)

Abstract

用于改善光线追踪效率的装置和方法。例如,装置的一个实施例包括:一种装置,包括:二进制插桩引擎,用于执行对光线追踪着色器的二进制插桩并用于追踪光线追踪着色器的执行以生成执行度量;调用图构造逻辑,用于基于执行度量构造着色器调用图;着色器源映射逻辑,用于将着色器调用图映射到着色器源代码以生成源代码图;效率分析逻辑,用于基于源代码图确定光线追踪着色器执行中的低效率;以及优化逻辑,用于基于低效率标识优化动作。

Description

用于利用着色器调用图分析进行光线追踪的装置和方法
背景
技术领域
本发明总体上涉及图形处理器领域。更具体地,本发明涉及用于利用 着色器调用图分析进行光线追踪的装置和方法。
背景技术
光线追踪是在其中通过基于物理的渲染来模拟光传输的技术。尽管在 电影渲染中广泛使用,但是直到仅仅几年前,人们认为其对于实时执行是 过于资源密集型的。光线追踪中的关键操作之一是处理对光线-场景相交的 可见性查询,被称为“光线遍历”,“光线遍历”通过遍历包围体层次体系 (bounding volume hierarchy,BVH)中的节点并使该节点相交来计算光线- 场景相交。
栅格化是其中屏幕对象是从由三角形网格创建的对象的3D模型创建 的技术。每个三角形的顶点与具有不同形状和大小的其他三角形的顶点相 交。每个顶点在空间中都有一位置以及关于颜色、纹理及其法线的信息, 该信息用于确定对象的表面正面向的方向。栅格化单元将3D模型的三角形 转换为2D屏幕空间中的像素,并且可以基于顶点数据为每个像素指派初始 颜色值。
附图说明
结合以下附图,从以下具体实施方式可获得对本发明更好的理解,其 中:
图1是具有处理器的计算机系统的实施例的框图,该处理器具有一个 或多个处理器核心和图形处理器;
图2A-图2D图示由本发明的实施例提供的计算系统和图形处理器;
图3A-图3C图示附加的图形处理器和计算加速器体系结构的框图;
图4是用于图形处理器的图形处理引擎的实施例的框图;
图5A-B图示包括处理元件的阵列的线程执行逻辑;
图6是包括处理元件的阵列的线程执行逻辑的框图;
图7图示根据实施例的图形处理器执行单元指令格式;
图8是图形处理器的另一实施例的框图,该图形处理器包括图形管线、 媒体管线、显示引擎、线程执行逻辑以及渲染输出管线;
图9A是图示根据实施例的图形处理器命令格式的框图;
图9B是图示根据实施例的图形处理器命令序列的框图;
图10图示根据实施例的用于数据处理系统的示例性图形软件体系结 构;
图11A图示根据实施例的可用于制造集成电路以执行操作的示例性IP 核心开发系统;
图11B-图11D图示包括小芯片和中介层衬底的示例性封装布置;
图12图示根据实施例的可使用一个或多个IP核心来制造的示例性片 上系统集成电路;
图13图示可以使用一个或多个IP核心来制造的片上系统集成电路的 示例性图形处理器;
图14图示可使用一个或多个IP核心来制造的片上系统集成电路的附 加示例性图形处理器;
图15图示用于执行机器学习体系结构的初始训练的体系结构;
图16图示如何在运行时期间持续地训练并更新机器学习引擎;
图17图示如何在运行时期间持续地并更新训练机器学习引擎;
图18A-图18B图示如何在网络上共享机器学习数据;以及
图19图示用于训练机器学习引擎的方法;
图20图示节点如何交换虚假(ghost)区域数据以执行分布式降噪操作;
图21图示在其中跨多个节点分布图像渲染和降噪操作的体系结构;
图22图示用于分布式渲染和降噪的体系结构的附加细节;
图23图示用于执行分布式渲染和降噪的方法;
图24图示机器学习方法;
图25图示多个经互连的通用图形处理器;
图26图示用于机器学习实现的卷积层和全连接层的集合;
图27图示卷积层的示例;
图28图示机器学习实现中经互连的节点的集合的示例;
图29图示在其中神经网络使用训练数据集进行学习的训练框架;
图30A图示模型并行性和数据并行性的示例;
图30B图示片上系统(system on a chip,SoC);
图31图示处理体系结构,该处理体系结构包括光线追踪核心和张量核 心;
图32图示光束的示例;
图33图示用于执行光束追踪的装置;
图34图示光束层次体系的示例;
图35图示用于执行光束追踪的方法;
图36图示分布式光线追踪引擎的示例;
图37-图38图示在光线追踪系统中执行的压缩;
图39图示在光线追踪体系结构构上实现的方法;
图40图示示例性混合式光线追踪装置;
图41图示用于光线追踪操作的栈;
图42图示混合式光线追踪装置的附加细节;
图43图示包围体层次体系;
图44图示调用栈和遍历状态存储;
图45图示用于遍历和相交的方法;
图46A-图46B图示如何需要多个调遣周期来执行某些着色器;
图47图示单个调遣周期如何执行多个着色器;
图48图示单个调遣周期如何执行多个着色器;
图49图示用于执行光线追踪指令的体系结构;
图50图示用于在线程内执行光线追踪指令的方法;
图51图示用于异步光线追踪的体系结构的一个实施例;
图52A图示光线遍历电路的一个实施例;
图52B图示在一个实施例中执行的用于管理光线存储区块的进程;
图53图示优先级选择电路/逻辑的一个实施例;
图54和图55A-图55B图示在本发明的一个实施例中使用的不同类型 的光线追踪数据,包括标志、异常和剔除数据;
图56图示用于确定光线追踪管线早出(early out)的一个实施例;
图57图示优先级选择电路/逻辑的一个实施例;
图58图示用于光线遍历操作的示例包围体层次体系(BVH);
图59A-59B图示附加的遍历操作;
图60图示用于管理BVH栈的栈管理电路的一个实施例;
图61A-图61B图示示例数据结构、子结构和对光线、命中和栈执行的 操作;
图62图示具有N比特比较操作掩码的细节层级选择器的实施例;
图63图示根据本发明的一个实施例的加速数据结构;
图64图示包括残差值和元数据的压缩块的一个实施例;
图65图示根据本发明的一个实施例的方法;
图66图示块偏移索引压缩块的一个实施例;
图67A图示根据本发明的一个实施例的分层式比特向量索引 (HierarchicalBit-Vector Indexing,HBI);
图67B图示根据本发明的一个实施例的索引压缩块;以及
图68图示包括BVH压缩电路/逻辑和解压缩电路/逻辑的示例体系结构。
图69A图示应用于网格的位移函数;
图69B图示用于压缩网格或小网格的压缩电路的一个实施例;
图70A图示基础细分表面上的位移映射;
图70B-图70C图示相对于粗基础网格的差向量;
图71图示根据本发明的一个实施例的方法;
图72-图74图示包括多个互连顶点的网格;
图75图示用于生成网格的曲面细分器(tesselator)的一个实施例;
图76-图77图示在其中基于网格形成包围体的一个实施例;
图78图示网格共享重叠顶点的一个实施例;
图79图示在三角形之间具有共享边的网格;
图80图示根据一个实施例的光线追踪引擎;
图81图示根据一个实施例的BVH压缩器;
图82A-图82C图示用于64比特寄存器的示例数据格式;
图83A-图83B图示用于环形缓冲器的索引的一个实施例;
图84A-图84B图示用于产生方和消耗方的示例环形缓冲器原子性 (atomics);
图85A图示分片资源的一个实施例;
图85B图示根据本发明的一个实施例的方法;
图86A图示包括按需构建器的BVH处理逻辑的一个实施例;
图86B图示用于加速结构的按需构建器的一个实施例;
图86C图示可见底部层级加速结构图的一个实施例;
图86D图示不同类型的实例和遍历决策;
图87图示基于材料的剔除掩码的一个实施例;
图88图示在其中在几何网格上方形成四叉树结构的一个实施例;
图89A图示光线追踪体系结构的一个实施例;
图89B图示包括小网格压缩的一个实施例;
图90图示多个线程,包括同步线程、分散生成线程、常规生成线程和 会聚生成线程;
图91图示具有无绑定线程调遣器的光线追踪体系结构的一个实施例;
图92图示根据一个实施例的光线追踪集群;
图93-图100图示在多节点光线追踪实现方式中使用代理数据的实施例;
图101图示根据本发明的一个实施例的方法;
图102图示与第一和第二子切片相关联的着色器记录的示例集合;
图103图示根据本发明的一个实施例的方法;
图104图示根据本发明的一个实施例的装置;
图105图示插入到光线追踪着色器块中的插桩(instrumentation)代码;
图106图示在其中基于指定的时序收集某些追踪数据的一个实施例; 以及
图107图示与主要和次要光线相关联的多个着色器记录。
具体实施方式
在以下描述中,出于解释的目的,阐述了众多特定细节以提供对下文 所描述的本发明的实施例的透彻理解。然而,对本领域技术人员将显而易 见的是,可在没有这些特定细节中的一些细节的情况下实施本发明的实施 例。在其他实例中,以框图形式示出公知的结构和设备,以避免使本发明 的实施例的根本性原理变得模糊。
示例性图形处理器体系结构和数据类型
系统概览
图1是根据实施例的处理系统100的框图。系统100可被用在以下各项 中:单处理器台式计算机系统、多处理器工作站系统、或具有大量处理器 102或处理器核心107的服务器系统。在一个实施例中,系统100是被并入 在片上系统(system-on-a-chip,SoC)集成电路内的处理平台,该片上系统 (SoC)集成电路用于在移动设备、手持式设备或嵌入式设备中使用,诸如, 用于在具有至局域网或广域网的有线或无线连接性的物联网 (Internet-of-things,IoT)设备内使用。
在一个实施例中,系统100可包括以下各项,可与以下各项耦合,或可 并入在以下各项内:基于服务器的游戏平台、包括游戏和媒体控制台的游 戏控制台、移动游戏控制台、手持式游戏控制台或在线游戏控制台。在一 些实施例中,系统100是移动电话、智能电话、平板计算设备或移动互联 网连接的设备(诸如,具有低内部存储容量的笔记本)的部分。处理系统 100也可包括以下各项,与以下各项耦合,或被集成在以下各项内:可穿戴 设备,诸如,智能手表可穿戴设备;利用增强现实(augmented reality,AR) 或虚拟现实(virtualreality,VR)特征来增强以提供视觉、音频或触觉输 出来补充现实世界视觉、音频或触觉体验或以其他方式提供文本、音频、 图形、视频、全息图像或视频、或触觉反馈的智能眼镜或服装;其他增强 现实(AR)设备;或其他虚拟现实(VR)设备。在一些实施例中,处理系 统100包括电视机或机顶盒设备,或者是电视机或机顶盒设备的部分。在 一个实施例中,系统100可包括自动驾驶交通工具,与自动驾驶交通工具 耦合,或集成在自动驾驶交通工具中,该自动驾驶交通工具诸如,公共汽 车、拖拉机拖车、汽车、电机或电力循环、飞机或滑翔机(或其任何组合)。 自动驾驶交通工具可使用系统100来处理在该交通工具周围感测到的环境。
在一些实施例中,一个或多个处理器102各自都包括用于处理器指令的 一个或多个处理器核心107,这些指令当被执行时,执行用于系统或用户软 件的操作。在一些实施例中,一个或多个处理器核心107中的至少一个被 配置成处理特定的指令集109。在一些实施例中,指令集109可促进复杂指 令集计算(Complex Instruction Set Computing,CISC)、精简指令集计算 (Reduced Instruction Set Computing,RISC)或经由超长指令字(VeryLong Instruction Word,VLIW)的计算。一个或多个处理器核心107可处理不同 的指令集109,不同的指令集109可包括用于促进对其他指令集的仿真的指 令。处理器核心107也可包括其他处理设备,诸如,数字信号处理器(Digital Signal Processor,DSP)。
在一些实施例中,处理器102包括缓存存储器104。取决于体系结构, 处理器102可具有单个内部缓存或多级的内部缓存。在一些实施例中,缓 存存储器在处理器102的各种部件之间被共享。在一些实施例中,处理器 102也使用外部缓存(例如,第3级(level 3,L3)缓存或最后一级缓存(Last Level Cache,LLC))(未示出),可使用已知的缓存一致性技术在处理 器核心107之间共享该外部缓存。寄存器堆106可附加地被包括在处理器 102中,并且寄存器堆106可包括用于存储不同类型的数据的不同类型的寄 存器(例如,整数寄存器、浮点寄存器、状态寄存器以及指令指针寄存器)。 一些寄存器可以是通用寄存器,而其他寄存器可专用于处理器102的设计。
在一些实施例中,一个或多个处理器102与一个或多个接口总线110 耦合,以在处理器102与系统100中的其他部件之间传输通信信号,诸如, 地址、数据、或控制信号。在一个实施例中,接口总线110可以是处理器 总线,诸如,直接媒体接口(Direct MediaInterface,DMI)总线的某个版 本。然而,处理器总线不限于DMI总线,并且可包括一个或多个外围部件 互连总线(例如,PCI、PCI快速(PCI express))、存储器总线或其他类 型的接口总线。在一个实施例中,(一个或多个)处理器102包括集成存 储器控制器116和平台控制器中枢130。存储器控制器116促进存储器设备 与系统100的其他部件之间的通信,而平台控制器中枢(platform controller hub,PCH)130提供经由本地I/O总线至I/O设备的连接。
存储器设备120可以是动态随机存取存储器(dynamic random-access memory,DRAM)设备、静态随机存取存储器(static random-access memory, SRAM)设备、闪存设备、相变存储器设备、或具有适当的性能以充当进程 存储器的某个其他存储器设备。在一个实施例中,存储器设备120可以作 为用于系统100的系统存储器来操作,以存储数据122和指令121供在一 个或多个处理器102执行应用或进程时使用。存储器控制器116也与可选 的外部图形处理器118耦合,该可选的外部图形处理器118可与处理器102 中的一个或多个图形处理器108通信以执行图形操作和媒体操作。在一些 实施例中,可由加速器112辅助图形操作、媒体操作或计算操作,该加速 器112是可被配置用于执行专业的图形操作、媒体操作或计算操作的集合 的协处理器。例如,在一个实施例中,加速器112是用于优化机器学习或计算操作的矩阵乘法加速器。在一个实施例中,加速器112是光线追踪加 速器,该光线追踪加速器可用于与图形处理器108一致地执行光线追踪操 作。在一个实施例中,可替代加速器112使用外部加速器119,或可与加速 器112一致地使用外部加速器119。
在一些实施例中,显示设备111可以连接至(一个或多个)处理器102。 显示设备111可以是以下各项中的一项或多项:内部显示设备,如在移动 电子设备或膝上型设备中;或经由显示接口(例如,显示端口等)附接的 外部显示设备。在一个实施例中,显示设备111可以是头戴式显示器(head mounted display,HMD),诸如,用于在虚拟现实(VR)应用或增强现实 (AR)应用中使用的立体显示设备。
在一些实施例中,平台控制器中枢130使外围设备能够经由高速I/O总 线而连接至存储器设备120和处理器102。I/O外围设备包括但不限于音频 控制器146、网络控制器134、固件接口128、无线收发器126、触摸传感 器125、数据存储设备124(例如,非易失性存储器、易失性存器、硬盘驱 动器、闪存、NAND、3D NAND、3D XPoint等)。数据存储设备124可以 经由存储接口(例如,SATA)或经由如外围部件互连总线(例如,PCI、 PCI快速)之类的外围总线来进行连接。触摸传感器125可以包括触摸屏传 感器、压力传感器、或指纹传感器。无线收发器126可以是Wi-Fi收发器、 蓝牙收发器、或移动网络收发器,该移动网络收发器诸如3G、4G、5G或 长期演进(Long-Term Evolution,LTE)收发器。固件接口128使得能够与系统固件进行通信,并且可以例如是统一可扩展固件接口(unified extensible firmwareinterface,UEFI)。网络控制器134可启用到有线网络的网络连接。 在一些实施例中,高性能网络控制器(未示出)与接口总线110耦合。在 一个实施例中,音频控制器146是多声道高清音频控制器。在一个实施例 中,系统100包括用于将传统(例如,个人系统2(PersonalSystem 2,PS/2)) 设备耦合至系统的可选的传统I/O控制器140。平台控制器中枢130还可以 连接至一个或多个通用串行总线(Universal Serial Bus,USB)控制器142 连接输入设备,诸如,键盘和鼠标143组合、相机144、或其他USB输入 设备。
将会理解,所示的系统100是示例性的而非限制性的,因为也可以使用 以不同方式配置的其他类型的数据处理系统。例如,存储器控制器116和 平台控制器中枢130的实例可以集成到分立的外部图形处理器中,该分立 的外部图形处理器诸如外部图形处理器118。在一个实施例中,平台控制器 中枢130和/或存储器控制器116可以在一个或多个处理器102外部。例如, 系统100可包括外部存储器控制器116和平台控制器中枢130,该外部存储 器控制器116和平台控制器中枢130可以被配置为在与(一个或多个)处 理器102通信的系统芯片组内的存储器控制器中枢和外围控制器中枢。
例如,可使用电路板(“橇板(sled)”),在该电路板上被放置的部件 (诸如,CPU、存储器和其他部件)经设计以实现提升的热性能。在一些 示例中,诸如处理器之类的处理部件位于橇板的顶侧上,而诸如DIMM之 类的附近存储器位于橇板的底侧上。作为由该设计提供的增强的气流的结 果,部件能以比典型系统更高的频率和功率等级来操作,由此增加性能。 此外,橇板配置成盲配机架中的功率和数据通信线缆,由此增强它们被快 速地移除、升级、重新安装和/或替换的能力。类似地,位于橇板上的各个 部件(诸如,处理器、加速器、存储器和数据存储设备)由于它们相对于 彼此增加的间距而被配置成易于升级。在说明性实施例中,部件附加地包 括用于证明它们的真实性的硬件认证特征。
数据中心可利用支持多个其他网络体系结构的单个网络结构(“结构”), 多个其他网络体系结构包括以太网和全方位路径。橇板可经由光纤耦合至 交换机,这提供比典型的双绞线布线(例如,5类、5e类、6类等)更高的 带宽和更低的等待时间。由于高带宽、低等待时间的互连和网络体系结构, 数据中心在使用中可集中在物理上解散的诸如存储器、加速器(例如,GPU、 图形加速器、FPGA、ASIC、神经网络和/或人工智能加速器等)和数据存 储驱动器之类的资源,并且根据需要将它们提供给计算资源(例如,处理 器),从而使计算资源能够就好像被集中的资源在本地那样访问这些被集 中的资源。
功率供应或功率源可将电压和/或电流提供给系统100或本文中描述的 任何部件或系统。在一个示例中,功率供应包括用于插入到墙壁插座中的 AC-DC(交流-直流)适配器。此类AC功率可以是可再生能量(例如,太 阳能)功率源。在一个示例中,功率源包括DC功率源,诸如,外部AC-DC 转换器。在一个示例中,功率源或功率供应包括用于通过接近充电场来充 电的无线充电硬件。在一个示例中,功率源可包括内部电池、交流供应、 基于动作的功率供应、太阳能功率供应、或燃料电池源。
图2A-图2D图示由本文中描述的实施例提供的计算系统和图形处理器。 图2A-图2D的具有与本文中的任何其他附图的元件相同的附图标记(或名称) 的那些元件能以类似于本文中其他地方描述的任何方式操作或起作用,但不限 于此。
图2A是处理器200的实施例的框图,该处理器200具有一个或多个处 理器核心202A-202N、集成存储器控制器214以及集成图形处理器208。处 理器200可包括附加的核心,这些附加的核心多至由虚线框表示的附加核 心202N并包括由虚线框表示的附加核心202N。处理器核心202A-202N中 的每一个包括一个或多个内部缓存单元204A-204N。在一些实施例中,每 一个处理器核心也具有对一个或多个共享缓存单元206的访问权。内部缓 存单元204A-204N和共享缓存单元206表示处理器200内的缓存存储器层 次体系。缓存存储器层次体系可包括每个处理器核心内的至少一个级别的 指令和数据缓存以及一级或多级共享的中级缓存,诸如,第2级(L2)、 第3级(L3)、第4级(L4)、或其他级别的缓存,其中,在外部存储器 之前的最高级别的缓存被分类为LLC。在一些实施例中,缓存一致性逻辑 维持各缓存单元206与204A-204N之间的一致性。
在一些实施例中,处理器200还可包括一个或多个总线控制器单元的集 合216和系统代理核心210。一个或多个总线控制器单元216管理外围总线 的集合,诸如,一个或多个PCI总线或PCI快速总线。系统代理核心210 提供对各处理器部件的管理功能。在一些实施例中,系统代理核心210包 括用于管理对各种外部存储器设备(未示出)的访问的一个或多个集成存 储器控制器214。
在一些实施例中,处理器核心202A-202N中的一个或多个处理器核心 包括对同步多线程的支持。在此类实施例中,系统代理核心210包括用于 在多线程处理期间协调并操作核心202A-202N的部件。系统代理核心210 可附加地包括功率控制单元(power controlunit,PCU),该功率控制单元 包括用于调节处理器核心202A-202N和图形处理器208的功率状态的逻辑 和部件。
在一些实施例中,处理器200附加地包括用于执行图形处理操作的图形 处理器208。在一些实施例中,图形处理器208与共享缓存单元的集合206 以及与系统代理核心210耦合,该系统代理核心210包括一个或多个集成 存储器控制器214。在一些实施例中,系统代理核心210还包括用于将图形 处理器输出驱动到一个或多个经耦合的显示器的显示控制器211。在一些实 施例中,显示控制器211还可以是经由至少一个互连与图形处理器耦合的 单独模块,或者可以集成在图形处理器208内。
在一些实施例中,基于环的互连单元212用于耦合处理器200的内部部 件。然而,可以使用替代的互连单元,诸如,点到点互连、交换式互连、 或其他技术,包括本领域中公知的技术。在一些实施例中,图形处理器208 经由I/O链路213与环形互连212耦合。
示例性I/O链路213表示多个各种各样的I/O互连中的至少一种,包括 促进各处理器部件与高性能嵌入式存储器模块218(诸如,eDRAM模块) 之间的通信的封装上I/O互连。在一些实施例中,处理器核心202A-202N 中的每个处理器核心以及图形处理器208可将嵌入式存储器模块218用作 共享的最后一级缓存。
在一些实施例中,处理器核心202A-202N是执行相同指令集体系结构 的同构核心。在另一实施例中,处理器核心202A-202N在指令集体系结构 (instruction setarchitecture,ISA)方面是异构的,其中,处理器核心 202A-202N中的一个或多个执行第一指令集,而其他核心中的至少一个执 行第一指令集的子集或不同的指令集。在一个实施例中,处理器核心 202A-202N在微体系结构方面是异构的,其中,具有相对较高功耗的一个或多个核心与具有较低功耗的一个或多个功率核心耦合。在一个事实中, 处理器核心202A-202N在计算能力方面是异构的。此外,处理器200可实 现在一个或多个芯片上,或者除其他部件之外还被实现为具有所图示的部 件的SoC集成电路。
图2B是根据本文中所描述的一些实施例的图形处理器核心219的硬件 逻辑的框图。图2B的具有与本文中的任何其他附图的元件相同的附图标记 (或名称)的那些元件能以类似于本文中其他地方描述的任何方式操作或起作 用,但不限于此。图形处理器核心219(有时称为核心切片)可以是模块化 图形处理器内的一个或多个图形核心。图形处理器核心219的示例是一个 图形核心切片,并且基于目标功率包络和性能包络,如本文中所描述的图 形处理器可以包括多个图形核心切片。每个图形处理器核心219可包括固 定功能块230,该固定功能块230与多个子核心221A-221F(也称为子切片) 耦合,多个子核心221A-221F包括模块化的通用和固定功能逻辑的块。
在一些实施例中,固定功能块230包括几何/固定功能管线231,该几何 /固定功能管线231例如在较低性能和/或较低功率的图形处理器实现中可 由图形处理器核心219中的所有子核心共享。在各实施例中,几何/固定功 能管线231包括3D固定功能管线(例如,如在下文描述的图3和图4中的 3D管线312)、视频前端单元、线程生成器和线程调遣器、以及统一返回 缓冲器管理器,该统一返回缓冲器管理器管理统一返回缓冲器(例如,如 下文所描述的在图4中的统一返回缓冲器418)。
在一个实施例中,固定功能块230还包括图形SoC接口232、图形微控 制器233和媒体管线234。图形SoC接口232提供图形处理器核心219与 片上系统集成电路内的其他处理器核心之间的接口。图形微控制器233是 可配置成管理图形处理器核心219的各种功能的可编程子处理器,这些功 能包括线程调遣、调度和抢占。媒体管线234(例如,图3和图4的媒体管 线316)包括用于促进对包括图像数据和视频数据的多媒体数据进行解码、 编码、预处理和/或后处理的逻辑。媒体管线234经由对子核心221A-221F 内的计算或采样逻辑的请求来实现媒体操作。
在一个实施例中,SoC接口232使图形处理器核心219能够与通用应用 处理器核心(例如,CPU)和/或SoC内的其他部件进行通信,其他部件包 括诸如共享的最后一级缓存存储器的存储器层次体系元件、系统RAM、和 /或嵌入式芯片上或封装上DRAM。SoC接口232还可启用与SoC内的诸如 相机成像管线的固定功能设备的通信,并且启用全局存储器原子性的使用 和/或实现全局存储器原子性,该全局存储器原子性可在图形处理器核心 219与SoC内的CPU之间被共享。SoC接口232还可实现针对图形处理器 核心219的功率管理控制,并且启用图形核心219的时钟域与SoC内的其 他时钟域之间的接口。在一个实施例中,SoC接口232使得能够从命令流 转化器和全局线程调遣器接收命令缓冲器,该命令流转化器和全局线程调 遣器被配置成将命令和指令提供给图形处理器内的一个或多个图形核心中的每一个图形核心。当媒体操作将要执行时,这些命令和指令可以被调遣 给媒体管线234,或者当图形处理操作将要执行时,这些命令和指令可以被 调遣给几何和固定功能管线(例如,几何和固定功能管线231、几何和固定 功能管线237)。
图形微控制器233可被配置成执行针对图形处理器核心219的各种调度 任务和管理任务。在一个实施例中,图形微控制器233可对子核心221A-221F内的执行单元(execution unit,EU)阵列222A-222F、224A-224F 内的各个图形并行引擎执行图形和/或计算工作负载调度。在该调度模型中, 在包括图形处理器核心219的SoC的CPU核心上执行的主机软件可以经由 多个图形处理器门铃(doorbell)中的一个图形处理器门铃来提交工作负载, 这调用了对适当的图形引擎的调度操作。调度操作包括:确定接下来要运 行哪个工作负载,将工作负载提交到命令流转化器,抢占在引擎上运行的 现有工作负载,监测工作负载的进度,以及当工作负载完成时通知主机软 件。在一个实施例中,图形微控制器233还可促进图形处理器核心219的 低功率或空闲状态,从而向图形处理器核心219提供独立于操作系统和/或 系统上的图形驱动器软件跨低功率状态转变来保存和恢复图形处理器核心 219内的寄存器的能力。
图形处理器核心219可具有多于或少于所图示的子核心221A-221F,最 多N个模块化子核心。对于每组N个子核心,图形处理器核心219还可包 括共享功能逻辑235、共享和/或缓存存储器236、几何/固定功能管线237、 以及用于加速各种图形和计算处理操作的附加的固定功能逻辑238。共享功 能逻辑235可以包括与可由图形处理器核心219内的每N个子核心共享的、 与图4的共享功能逻辑420(例如,采样器逻辑、数学逻辑、和/或线程间 通信逻辑)相关联的逻辑单元。共享和/或缓存存储器236可以是用于图形 处理器核心219内的N个子核心的集合221A-221F的最后一级缓存,并且 还可以充当可由多个子核心访问的共享存储器。几何/固定功能管线237而 不是几何/固定功能管线231可被包括在固定功能块230内,并且几何/固定 功能管线237可包括相同或类似的逻辑单元。
在一个实施例中,图形处理器核心219包括附加的固定功能逻辑238, 该附加的固定功能逻辑238可包括供由图形处理器核心219使用的各种固 定功能加速逻辑。在一个实施例中,附加的固定功能逻辑238包括供在仅 位置着色中使用的附加的几何管线。在仅位置着色中,存在两个几何管线: 几何/固定功能管线238、231内的完全几何管线;以及剔除管线,其是可被 包括在附加的固定功能逻辑238内的附加的几何管线。在一个实施例中,剔除管线是完全几何管线的精简版本。完全管线和剔除管线可以执行同一 应用的不同实例,每个实例具有单独的上下文。仅位置着色可以隐藏被丢 弃三角形的长剔除运行,从而在一些实例中使得能够更早地完成着色。例 如并且在一个实施例中,附加的固定功能逻辑238内的剔除管线逻辑可以 与主应用并行地执行位置着色器,并且通常比完全管线更快地生成关键结 果,因为剔除管线仅取得顶点的位置属性并对顶点的位置属性进行着色, 而不向帧缓冲器执行对像素的栅格化和渲染。剔除管线可以使用所生成的 关键结果来计算所有三角形的可见性信息,而无需考虑那些三角形是否被 剔除。完全管线(其在本实例中可以被称为重放(replay)管线)可以消耗 该可见性信息以跳过被剔除的三角形,从而仅对最终被传递到栅格化阶段 的可见的三角形进行着色。
在一个实施例中,附加的固定功能逻辑238还可包括机器学习加速逻辑, 诸如,固定功能矩阵乘法逻辑,该机器学习加速逻辑用于包括针对机器学 习训练或推断的优化的实现方式。
在每个图形子核心221A-221F内包括可用于响应于由图形管线、媒体 管线、或着色器程序作出的请求而执行图形操作、媒体操作和计算操作的 执行资源的集合。图形子核心221A-221F包括:多个EU阵列222A-222F、 224A-224F;线程调遣和线程间通信(threaddispatch and inter-thread communication,TD/IC)逻辑223A-223F;3D(例如,纹理)采样器225A-225F; 媒体采样器206A-206F;着色器处理器227A-227F;以及共享的本地存储器(shared local memory,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,以使在 线程组内执行的线程能够使用片上存储器的公共池来执行。
图2C图示图形处理单元(graphics processing unit,GPU)239,该GPU 239包括布置为多核心组240A-240N的图形处理资源的专用集合。虽然提 供仅单个多核心组240A的细节,但是将理解,其他多核心组240B-240N 可配备有图形处理资源的相同或类似的集合。
如所图示,多核心组240A可包括图形核心的集合243、张量核心的集 合244以及光线追踪核心的集合245。调度器/调遣器241调度和调遣图形 线程以用于在各个核心243、244、245上执行。寄存器堆的集合242存储 在执行图形线程时由核心243、244、245使用的操作对象值。这些寄存器 堆可包括例如用于存储整数值的整数寄存器、用于存储浮点值的浮点寄存 器、用于存储紧缩(packed)数据元素(整数和/或浮点数据元素)的向量 寄存器以及用于存储张量/矩阵值的片寄存器。在一个实施例中,片寄存器 被实现为向量寄存器的组合的集合。
一个或多个组合的第一级(L1)缓存和共享存储器单元247在本地将 图形数据存储在每个多核心组240A内,图形数据诸如纹理数据、顶点数据、 像素数据、光线数据、包围体数据等。一个或多个纹理单元247也可用于 执行纹理操作,诸如,纹理映射和采样。由所有多核心组240A-240N或多 核心组240A-240N的子集共享的第二级(L2)缓存253存储用于多个并发 的图形线程的图形数据和/或指令。如所图示,可跨多个多核心组240A-240N 共享L2缓存253。一个或多个存储器控制器248将GPU 239耦合至存储器 249,该存储器249可以是系统存储器(例如,DRAM)和/或专用图形存储 器(例如,GDDR6存储器)。
输入/输出(Input/output,I/O)电路250将GPU 239耦合至一个或多 个I/O设备252,这一个或多个I/O设备252诸如为数字信号处理器(digital signal processor,DSP)、网络控制器或用户输入设备。片上互连可用于将 I/O设备252耦合至GPU 239和存储器249。I/O电路250的一个或多个I/O 存储器管理单元(I/O memory management unit,IOMMU)251直接将I/O 设备252耦合至系统存储器249。在一个实施例中,IOMMU 251管理用于 将虚拟地址映射到系统存储器249中的物理地址的多个集合的页表。在该 实施例中,I/O设备252、(一个或多个)CPU 246和(一个或多个)GPU 239 可共享相同的虚拟地址空间。
在一个实现方式中,IOMMU 251支持虚拟化。在这种情况下,IOMMU 251可以管理用于将客机(guest)/图形虚拟地址映射到客机/图形物理地址 的第一集合的页表以及用于将客机/图形物理地址映射到(例如,系统存储 器249内的)系统/主机物理地址的第二集合的页表。第一集合的页表和第 二集合的页表中的每一个的基址可被存储在控制寄存器中,并且在上下文 切换时被换出(例如,使得新上下文被提供有对相关集合的页表的访问权)。虽然未在图2C中图示,但是核心243、244、245和/或多核心组240A-240N 中的每一个可包括转译后备缓冲器(translation backside buffer,TLB),这 些TLB用于对客机虚拟至客机物理转换、客机物理至主机物理转换以及客 机虚拟至主机物理转换进行缓存。
在一个实施例中,CPU 246、GPU 239和I/O设备252被集成在单个半 导体芯片和/或芯片封装上。所图示的存储器249可集成在同一芯片上,或 者可经由芯片外接口被耦合至存储器控制器248。在一个实现方式中,存储 器249包括共享与其他物理系统级存储器相同的虚拟地址空间的GDDR6 存储器,但是本发明的根本性原理不限于该特定的实现方式。
在一个实施例中,张量核心244包括专门设计成用于执行矩阵操作的 多个执行单元,这些矩阵操作是用于执行深度学习操作的基本计算操作。 例如,可将同步矩阵乘法操作用于神经网络训练和推断。张量核心244可 使用各种操作对象精度来执行矩阵处理,操作对象精度包括单精度浮点(例 如,32比特)、半精度浮点(例如,16比特)、整数字(16比特)、字节 (8比特)和半字节(4比特)。在一个实施例中,神经网络实现方式提取 每个经渲染场景的特征,从而潜在地组合来自多个帧的细节,以构建高质 量的最终图像。
在深度学习实现方式中,可调度并行的矩阵乘法工作用于在张量核心 244上执行。神经网络的训练尤其需要大量矩阵点积操作。为了处理N x N x N矩阵乘法的内积公式化,张量核心244可包括至少N个点积处理元件。 在矩阵乘法开始之前,一个完整的矩阵被加载到片寄存器中,并且对于N 个循环中的每个循环,第二矩阵的至少一列被加载。对于每个循环,存在 被处理的N个点积。
取决于特定的实现方式,能以不同精度来存储矩阵元素,包括16比特 的字、8比特的字节(例如,INT8)以及4比特的半字节(例如,INT4)。 可为张量核心244指定不同的精度模式以确保将最高效的精度用于不同的 工作负载(例如,诸如推断工作负载,其可容忍到字节和到半字节的量化 (quantization))。
在一个实施例中,光线追踪核心245加速用于实时光线追踪实现方式 和非实时光线追踪实现方式两者的光线追踪操作。具体而言,光线追踪核 心245包括光线遍历/相交电路,该光线遍历/相交电路用于使用包围体层次 体系(BVH)来执行光线遍历并识别封围在BVH容体内的光线与基元之间 的相交。光线追踪核心245还可包括用于执行深度测试和剔除(例如,使 用Z缓冲器或类似布置)的电路。在一个实现方式中,光线追踪核心245 与本文所述的图像降噪技术一起执行遍历操作和相交操作,该图像降噪技 术中的至少一部分可以在张量核心244上执行。例如,在一个实施例中, 张量核心244实现深度学习神经网络以执行对由光线追踪核心245生成的 帧的降噪(包括本地存储器9010(和/或系统存储器))。然而,(一个或 多个)CPU 246、图形核心243和/或光线追踪核心245还可实现降噪和/或 深度学习算法中的全部或一部分。
此外,如上文所描述,可采用对于降噪的分布式方法,在该分布式方 法中,GPU239在通过网络或高速互连而耦合至其他计算设备的计算设备 中。在该实施例中,经互连的计算设备共享神经网络学习/训练数据以改善 整个系统学习执行用于不同类型的图像帧和/或不同的图形应用的降噪的速 度。
在一个实施例中,光线追踪核心245处理所有的BVH遍历和光线-基 元相交(intersection),从而使图形核心243免于被针对每条光线的数千条 指令过载。在一个实施例中,每个光线追踪核心245包括用于执行包围盒 测试(例如,用于遍历操作)的第一组专业电路以及用于执行光线-三角形 相交测试(例如,使已被遍历的光线相交)的第二组专业电路。由此,在 一个实施例中,多核心组240A可简单地发起光线探测,并且光线追踪核心245独立地执行光线遍历和相交,并将命中数据(例如,命中、无命中、多 个命中等)返回到线程上下文。当光线追踪核心245执行遍历和相交操作 时,其他核心243、244被释放以执行其他图形或计算工作。
在一个实施例中,每个光线追踪核心245包括用于执行BVH测试操作 的遍历单元以及执行光线-基元相交测试的相交单元。相交单元生成“命中”、 “无命中”或“多个命中”响应,该相交单元将这些响应提供给适当的线程。在 遍历和相交操作期间,其他核心(例如,图形核心243和张量核心244)的 执行资源被释放以执行其他形式的图形工作。
在下文描述的一个特定实施例中,使用在其中工作被分布在图形核心 243与光线追踪核心245之间的混合式栅格化/光线追踪方法。
在一个实施例中,光线追踪核心245(和/或其他核心243、244)包括 对光线追踪指令集的硬件支持,光线追踪指令集诸如:微软的DirectX光线 追踪(DirectX Ray Tracing,DXR),其包括DispatchRays命令;以及光线 生成着色器、最近命中着色器、任何命中着色器和未命中着色器,它们使 得为每个对象指派唯一集合的着色器和纹理得以实现。可由光线追踪核心 245、图形核心243和张量核心244支持的另一光线追踪平台是Vulkan 1.1.85。然而,要注意本发明的根本性原理不限于任何特定的光线追踪ISA。
一般而言,各个核心245、244、243可支持包括用于以下各项的指令/ 功能的光线追踪指令集:光线生成、最近命中、任何命中、光线-基元相交、 逐基元和层次体系包围盒构建、未命中、拜访、和异常。更具体地,一个 实施例包括用于执行以下功能的光线追踪指令:
光线生成(Ray Generation)——可为每个像素、样本或其他用户定义 的工作分配执行光线生成指令。
最近命中(Closest Hit)——可执行最近命中指令以对场景内光线与基元 的最近交点定位。
任何命中(Any Hit)——任何命中指令识别场景内光线与基元之间的多 个相交,从而潜在地识别新的最近交点。
相交(Intersection)——相交指令执行光线-基元相交测试并输出结果。
逐基元包围盒构建(Per-primitive Bounding box Construction)——该指 令围绕给定的基元或基元组建立包围盒(例如,当建立新BVH或其他加速 数据结构时)。
未命中(Miss)——指示光线未命中场景或场景的指定区域内的任何几 何体。
拜访(Visit)——指示光线将遍历的子容体。
异常(Exceptions)——包括各种类型的异常处置器(例如,为各种错误 条件而被调用)。
图2D是根据本文中描述的实施例的通用图形处理器单元(general purposegraphics processing unit,GPGPU)270的框图,该GPGPU 270可被 配置为图形处理器和/或计算加速器。GPGPU 270可经由一个或多个系统和 /或存储器总线来与主机处理器(例如,一个或多个CPU 246)和存储器271、 272互连。在一个实施例中,存储器271是可与一个或多个CPU 246进行 共享的系统存储器,而存储器272是专用于GPGPU 270的设备存储器。在 一个实施例中,GPGPU 270和设备存储器272内的部件可被映射到可由一 个或多个CPU246访问的存储器地址。可经由存储器控制器268来促进对 存储器271和272的访问。在一个实施例中,存储器控制器268包括内部 直接存储器访问(direct memory access,DMA)控制器269,或可包括用于 执行否则将由DMA控制器执行的操作的逻辑。
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中。
在操作期间,一个或多个CPU 246可将命令写入到GPGPU 270中的寄 存器中,或写入到GPGPU 270中的、已经被映射到可访问地址空间的存储 器中。命令处理器257可从寄存器或存储器读取命令,并且确定将如何在 GPGPU 270内处理那些命令。随后可使用线程调遣器258来将线程调遣到 计算单元260A-260N以执行那些命令。每个计算单元260A-260N可独立于 其他计算单元来执行线程。此外,每个计算单元260A-260N可被独立地配 置成用于有条件计算,并且可有条件地将计算的结果输出到存储器。当所 提交的命令完成时,命令处理器257可中断一个或多个CPU 246。
图3A-图3C图示由本文中描述的实施例提供的附加的图形处理器和计 算加速器体系结构的框图。图3A-图3C的具有与本文中的任何其他附图的元 件相同的附图标记(或名称)的那些元件能以类似于本文中其他地方描述的任 何方式操作或起作用,但不限于此。
图3A是图形处理器300的框图,该图形处理器300可以是分立的图形 处理单元,或可以是与多个处理核心或其他半导体器件集成的图形处理器, 其他半导体器件诸如但不限于存储器设备或网络接口。在一些实施例中, 图形处理器经由到图形处理器上的寄存器的存储器映射的I/O接口并且利 用被放置到处理器存储器中的命令进行通信。在一些实施例中,图形处理 器300包括用于访问存储器的存储器接口314。存储器接口314可以是到本地存储器、一个或多个内部缓存、一个或多个共享的外部缓存、和/或系统 存储器的接口。
在一些实施例中,图形处理器300还包括显示控制器302,该显示控制 器302用于将显示输出数据驱动到显示设备318。显示控制器302包括用于 显示器的一个或多个叠加平面以及多层的视频或用户界面元素的合成的硬 件。显示设备318可以是内部或外部显示设备。在一个实施例中,显示设 备318是头戴式显示设备,诸如,虚拟现实(VR)显示设备或增强现实(AR) 显示设备。在一些实施例中,图形处理器300包括用于将媒体编码到一种 或多种媒体编码格式,从一种或多种媒体编码格式对媒体解码,或在一种 或多种媒体编码格式之间对媒体转码的视频编解码器引擎306,这一种或多 种媒体编码格式包括但不限于:移动图像专家组(Moving Picture Experts Group,MPEG)格式(诸如,MPEG-2)、高级视频译码(Advanced Video Coding,AVC)格式(诸如,H.264/MPEG-4AVC、H.265/HEVC,开放媒 体联盟(Alliance for Open Media,AOMedia)VP8、VP9)、以及电影和电视 工程师协会(Societyof Motion Picture&Television Engineers,SMPTE)421 M/VC-1、和联合图像专家组(Joint Photographic Experts Group,JPEG)格 式(诸如,JPEG、以及运动JPEG(MotionJPEG,MJPEG)格式)。
在一些实施例中,图形处理器300包括块图像传送(block image transfer,BLIT)引擎304,用于执行二维(two-dimensional,2D)栅格化器操作, 包括例如,比特边界块传送。然而,在一个实施例中,使用图形处理引擎 (graphics processing engine,GPE)310的一个或多个部件执行2D图形操 作。在一些实施例中,GPE 310是用于执行图形操作的计算引擎,这些图 形操作包括三维(three-dimensional,3D)图形操作和媒体操作。
在一些实施例中,GPE 310包括用于执行3D操作的3D管线312,3D 操作诸如,使用作用于3D基元形状(例如,矩形、三角形等)的处理函数 来渲染三维图像和场景。3D管线312包括可编程和固定功能元件,该可编 程和固定功能元件执行到3D/媒体子系统315的元件和/或所生成的执行线 程内的各种任务。虽然3D管线312可用于执行媒体操作,但是GPE310 的实施例还包括媒体管线316,该媒体管线316专门用于执行媒体操作,诸 如,视频后处理和图像增强。
在一些实施例中,媒体管线316包括固定功能或可编程逻辑单元用于代 替、或代表视频编解码器引擎306来执行一个或多个专业的媒体操作,诸 如,视频解码加速、视频去隔行、以及视频编码加速。在一些实施例中, 媒体管线316附加地包括线程生成单元以生成用于在3D/媒体子系统315 上执行的线程。所生成的线程在3D/媒体子系统315中所包括的一个或多个 图形执行单元上执行对媒体操作的计算。
在一些实施例中,3D/媒体子系统315包括用于执行由3D管线312和 媒体管线316生成的线程的逻辑。在一个实施例中,管线向3D/媒体子系统315发送线程执行请求,该3D/媒体子系统315包括用于对于对可用的线程 执行资源的各种请求进行仲裁和调遣的线程调遣逻辑。执行资源包括用于 处理3D线程和媒体线程的图形执行单元的阵列。在一些实施例中,3D/媒 体子系统315包括用于线程指令和数据的一个或多个内部缓存。在一些实 施例中,该子系统还包括用于在线程之间共享数据并用于存储输出数据的 共享存储器,其包括寄存器和可寻址存储器。
图3B图示根据本文中描述的实施例的具有分片体系结构的图形处理器 320。在一个实施例中,图形处理器320包括图形处理引擎集群322,该图 形处理引擎集群322在图形引擎片310A-310D内具有图3A中的图形处理 器引擎310的多个实例。每个图形引擎片310A-310D可经由片互连的集合 323A-323F被互连。每个图形引擎片310A-310D还可经由存储器互连 325A-325D被连接到存储器模块或存储器设备326A-326D。存储器设备 326A-326D可使用任何图形存储器技术。例如,存储器设备326A-326D可 以是图形双倍数据速率(graphics double data rate,GDDR)存储器。在一 个实施例中,存储器设备326A-326D是高带宽存储器(high-bandwidth memory,HBM)模块,这些高带宽存储器(HBM)模块可与其相应的图形 引擎片310A-310D一起在管芯上。在一个实施例中,存储器设备326A-326D 是堆叠式存储器设备,这些堆叠式存储器设备可被堆叠在它们相应的图形 引擎片310A-310D的顶部上。在一个实施例中,每个图形引擎片310A-310D 和相关联的存储器326A-326D驻留在分开的小芯片上,这些分开的小芯片 被键合到基管芯或基衬底,如在图11B-图11D中进一步详细地所描述。
图形处理引擎集群322可与芯片上或封装上结构互连324连接。结构互 连324可启用图形引擎片310A-310D与诸如视频编解码器306和一个或多 个副本引擎304之类的部件之间的通信。副本引擎304可用于将数据移出 存储器设备326A-326D和在图形处理器320外部的存储器(例如,系统存 储器),将数据移入存储器设备326A-326D和在图形处理器320外部的存 储器(例如,系统存储器),并且在存储器设备326A-326D与在图形处理 器320外部的存储器(例如,系统存储器)之间移动数据。结构互连324 还可用于将图形引擎片310A-310D互连。图形处理器320可以可选地包括 显示控制器302,以启用与外部显示设备318的连接。图形处理器还可被配 置为图形加速器或计算加速器。在加速器配置中,显示控制器302和显示 设备318可被省略。
图形处理器320可经由主机接口328连接到主机系统。主机接口328 可启用图形处理器320、系统存储器和/或系统部件之间的通信。主机接口 328可以是例如PCI快速总线或另一类型的主机系统接口。
图3C图示根据本文中描述的实施例的计算加速器330。计算加速器330 可包括与图3B中的图形处理器320的体系结构类似性,并且针对计算加速 进行优化。计算引擎集群332可包括计算引擎片的集合340A-340D,计算 引擎片的集合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连接至主机处理器和存储器。
图形处理引擎
图4是根据一些实施例的图形处理器的图形处理引擎410的框图。在一 个实施例中,图形处理引擎(graphics processing engine,GPE)410是图3A 中示出的GPE 310的某个版本,并且还可表示图3B中的图形引擎片 310A-310D。图4的具有与本文中的任何其他附图的元件相同的附图标记 (或名称)的那些元件能以类似于本文中其他地方描述的任何方式操作或 起作用,但不限于此。例如,图示出图3A的3D管线312和媒体管线316。 媒体管线316在GPE 410的一些实施例中是可选的,并且可以不被显式地 包括在GPE 410内。例如并且在至少一个实施例中,单独的媒体和/或图像 处理器被耦合至GPE 410。
在一些实施例中,GPE 410与命令流转化器403耦合或包括命令流转化 器403,该命令流转化器403将命令流提供给3D管线312和/或媒体管线 316。在一些实施例中,命令流转化器403与存储器耦合,该存储器可以是 系统存储器、或内部缓存存储器和共享缓存存储器中的一个或多个。在一 些实施例中,命令流转化器403从存储器接收命令,并将这些命令发送至 3D管线312和/或媒体管线316。这些命令是从环形缓冲器取得的指示,该 环形缓冲器存储用于3D管线312和媒体管线316的命令。在一个实施例中, 环形缓冲器可附加地包括存储批量的多个命令的批量命令缓冲器。用于3D 管线312的命令还可包括对存储在存储器中的数据的引用,这些数据诸如 但不限于用于3D管线312的顶点数据和几何数据和/或用于媒体管线316 的图像数据和存储器对象。3D管线312和媒体管线316通过经由各自管线内的逻辑执行操作或者通过将一个或多个执行线程调遣至图形核心阵列 414来处理命令和数据。在一个实施例中,图形核心阵列414包括一个或多 个图形核心(例如,(一个或多个)图形核心415A、(一个或多个)图形 核心415B)的块,每个块包括一个或多个图形核心。每个图形核心包括图 形执行资源的集合,该图形执行资源的集合包括:用于执行图形操作和计 算操作的通用执行逻辑和图形专用执行逻辑;以及固定功能纹理处理逻辑 和/或机器学习和人工智能加速逻辑。
在各实施例中,3D管线312可包括用于通过处理指令以及将执行线程 调遣到图形核心阵列414来处理一个或多个着色器程序的固定功能和可编 程逻辑,这一个或多个着色器程序诸如,顶点着色器、几何着色器、像素 着色器、片段着色器、计算着色器、或其他着色器程序。图形核心阵列414 提供统一的执行资源块供在处理这些着色器程序时使用。图形核心阵列414 的(一个或多个)图形核心415A-415B内的多功能执行逻辑(例如,执行 单元)包括对各种3D API着色器语言的支持,并且可执行与多个着色器相 关联的多个同步执行线程。
在一些实施例中,图形核心阵列414包括用于执行诸如视频和/或图像 处理的媒体功能的执行逻辑。在一个实施例中,执行单元包括通用逻辑, 该通用逻辑可编程以便除了执行图形处理操作之外还执行并行通用计算操 作。通用逻辑可与图1的(一个或多个)处理器核心107或图2A中的核心 202A-202N内的通用逻辑并行地或结合地执行处理操作。
由在图形核心阵列414上执行的线程生成的输出数据可以将数据输出 到统一返回缓冲器(unified return buffer,URB)418中的存储器。URB 418 可以存储用于多个线程的数据。在一些实施例中,URB 418可用于在图形 核心阵列414上执行的不同线程之间发送数据。在一些实施例中,URB 418 可附加地用于在图形核心阵列上的线程与共享功能逻辑420内的固定功能 逻辑之间的同步。
在一些实施例中,图形核心阵列414是可缩放的,使得阵列包括可变数 量的图形核心,每个图形核心都具有基于GPE 410的目标功率和性能等级 的可变数量的执行单元。在一个实施例中,执行资源是动态可缩放的,使 得可以根据需要启用或禁用执行资源。
图形核心阵列414与共享功能逻辑420耦合,该共享功能逻辑420包括 在图形核心阵列中的图形核心之间被共享的多个资源。共享功能逻辑420 内的共享功能是向图形核心阵列414提供专业的补充功能的硬件逻辑单元。 在各实施例中,共享功能逻辑420包括但不限于采样器逻辑421、数学逻辑 422和线程间通信(inter-thread communication,ITC)逻辑423。另外,一 些实施例在共享功能逻辑420内实现一个或多个缓存425。
至少在其中对于给定的专业功能的需求不足以包括在图形核心阵列 414中的情况下实现共享功能。相反,那个专业功能的单个实例化被实现为 共享功能逻辑420中的独立实体,并且在图形核心阵列414内的执行资源 之间被共享。在图形核心阵列414之间被共享并被包括在图形核心阵列414 内的确切的功能集因实施例而异。在一些实施例中,共享功能逻辑420内 的由图形核心阵列414广泛使用的特定共享功能可被包括在图形核心阵列414内的共享功能逻辑416内。在各实施例中,图形核心阵列414内的共享 功能逻辑416可包括共享功能逻辑420内的一些或所有逻辑。在一个实施 例中,共享功能逻辑420内的所有逻辑元件可以在图形核心阵列414的共 享功能逻辑416内被复制。在一个实施例中,共享功能逻辑420被排除以 有利于图形核心阵列414内的共享功能逻辑416。
执行单元
图5A-图5B图示根据本文中所描述的实施例的线程执行逻辑500,该 线程执行逻辑500包括在图形处理器核心中采用的处理元件的阵列。图5A- 图5B的具有与本文中的任何其他附图的元件相同的附图标记(或名称)的 那些元件能以类似于本文中其他地方描述的任何方式操作或起作用,但不 限于此。图5A-图5B图示线程执行逻辑500的概览,该线程执行逻辑500 可表示以图2B中的每个子核心221A-221F图示的硬件逻辑。图5A表示通 用图形处理器内的执行单元,而图5B表示可在计算加速器内被使用的执行 单元。
如在图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的阵列是可缩放的以包括任何数 量的单独的执行单元。
在一些实施例中,执行单元508A-508N主要用于执行着色器程序。着 色器处理器502可处理各种着色器程序,并且可经由线程调遣器504调遣 与着色器程序相关联的执行线程。在一个实施例中,线程调遣器包括用于 对来自图形管线和媒体管线的线程发起请求进行仲裁并在执行单元508A-508N中的一个或多个执行单元上实例化所请求的线程的逻辑。例如, 几何管线可将顶点着色器、曲面细分着色器或几何着色器调遣到线程执行 逻辑以用于处理。在一些实施例中,线程调遣器504还可处理来自执行的 着色器程序的运行时线程生成请求。
在一些实施例中,执行单元508A-508N支持包括对许多标准3D图形着 色器指令的原生支持的指令集,使得以最小的转换执行来自图形库(例如, Direct 3D和OpenGL)的着色器程序。这些执行单元支持顶点和几何处理 (例如,顶点程序、几何程序、顶点着色器)、像素处理(例如,像素着 色器、片段着色器)以及通用处理(例如,计算和媒体着色器)。执行单 元508A-508N中的每个执行单元都能够进行多发出单指令多数据(single instructionmultiple data,SIMD)执行,并且多线程操作在面对较高等待时 间的存储器访问时启用高效的执行环境。每个执行单元内的每个硬件线程 都具有专用的高带宽寄存器堆和相关的独立线程状态。对于能够进行整数 操作、单精度浮点操作和双精度浮点操作、能够具有SIMD分支能力、能 够进行逻辑操作、能够进行超越操作和能够进行其他混杂操作的管线,执 行针对每个时钟是多发出的。在等待来自存储器或共享功能中的一个共享 功能的数据时,执行单元508A-508N内的依赖性逻辑使等待的线程休眠, 直到所请求的数据已返回。当等待的线程正在休眠时,硬件资源可致力于 处理其他线程。例如,在与顶点着色器操作相关联的延迟期间,执行单元 可以执行针对像素着色器、片段着色器或包括不同顶点着色器的另一类型 的着色器程序的操作。各实施例可应用以使用利用单指令多线程(SingleInstruction Multiple Thread,SIMT)的执行,作为SIMD用例的替代,或作 为SIMD用例的附加。对SIMD核心或操作的引用也可应用于SIMT,或结 合SIMT而应用于SIMD。
执行单元508A-508N中的每个执行单元对数据元素的数组进行操作。 数据元素的数量是“执行大小”、或用于指令的通道数量。执行通道是用于 数据元素访问、掩蔽、和指令内的流控制的执行的逻辑单元。通道的数量 可独立于用于特定图形处理器的物理算术逻辑单元(Arithmetic Logic Unit, ALU)或浮点单元(Floating Point Unit,FPU)的数量。在一些实施例中, 执行单元508A-508N支持整数和浮点数据类型。
执行单元指令集包括SIMD指令。各种数据元素可以作为紧缩数据类型 被存储在寄存器中,并且执行单元将基于元素的数据大小来处理各个元素。 例如,当对256比特宽的向量进行操作时,向量的256比特被存储在寄存 器中,并且执行单元将向量操作为四个单独的64比特紧缩数据元素(四字 (Quad-Word,QW)大小数据元素)、八个单独的32比特紧缩数据元素 (双字(Double Word,DW)大小数据元素)、十六个单独的16比特紧缩 数据元素(字(Word,W)大小的数据元素)、或三十二个单独的8比特 数据元素(字节(byte,B)大小的数据元素)。然而,不同的向量宽度和 寄存器大小是可能的。
在一个实施例中,可以将一个或多个执行单元组合到融合执行单元 509A-509N中,该融合执行单元509A-509N具有对于融合EU而言共同的 线程控制逻辑(507A-507N)。可以将多个EU融合到EU组中。融合的EU 组中的每个EU可以被配置成执行单独的SIMD硬件线程。融合的EU组中 的EU的数量可以根据实施例而有所不同。另外,可以逐EU地执行各种SIMD宽度,包括但不限于SIMD8、SIMD16和SIMD32。每个融合图形执 行单元509A-509N包括至少两个执行单元。例如,融合执行单元509A包 括第一EU 508A、第二EU 508B、以及对于第一EU 508A和第二EU 508B 而言共同的线程控制逻辑507A。线程控制逻辑507A控制在融合图形执行 单元509A上执行的线程,从而允许融合执行单元509A-509N内的每个EU 使用共同的指令指针寄存器来执行。
一个或多个内部指令缓存(例如,506)被包括在线程执行逻辑500中 以对用于执行单元的线程指令进行缓存。在一些实施例中,一个或多个数 据缓存(例如,512)被包括,以在线程执行期间对线程数据进行缓存。在 执行逻辑500上执行的线程还可将被显式地管理的数据存储在共享本地存 储器511中。在一些实施例中,采样器510被包括以为3D操作提供纹理采 样并且为媒体操作提供媒体采样。在一些实施例中,采样器510包括专业 的纹理或媒体采样功能,以便在向执行单元提供采样数据之前在采样过程 期间处理纹理数据或媒体数据。
在执行期间,图形管线和媒体管线经由线程生成和调遣逻辑将线程发起 请求发送到线程执行逻辑500。一旦一组几何对象已经被处理并被栅格化为 像素数据,着色器处理器502内的像素处理器逻辑(例如,像素着色器逻 辑、片段着色器逻辑等)就被调用以进一步计算输出信息,并且使得结果 被写入到输出表面(例如,颜色缓冲器、深度缓冲器、模板印刷(stencil) 缓冲器等)。在一些实施例中,像素着色器或片段着色器计算各顶点属性的值,各顶点属性的值将跨经栅格化的对象而被内插。在一些实施例中, 着色器处理器502内的像素处理器逻辑随后执行应用编程接口(application programming interface,API)供应的像素着色器程序或片段着色器程序。 为了执行着色器程序,着色器处理器502经由线程调遣器504将线程调遣 至执行单元(例如,508A)。在一些实施例中,着色器处理器502使用采 样器510中的纹理采样逻辑来访问存储在存储器中的纹理图中的纹理数据。 对纹理数据和输入几何数据的算术操作计算针对每个几何片段的像素颜色 数据,或丢弃一个或多个像素而不进行进一步处理。
在一些实施例中,数据端口514提供存储器访问机制,供线程执行逻辑 500将经处理的数据输出至存储器以便在图形处理器输出管线上进一步处 理。在一些实施例中,数据端口514包括或耦合至一个或多个缓存存储器 (例如,数据缓存512),以便对数据进行缓存供经由数据端口进行存储器 访问。
在一个实施例中,执行逻辑500还可包括可提供光线追踪加速功能的光 线追踪器505。光线追踪器505可支持光线追踪指令集,该光线追踪指令集 包括用于光线生成的指令/函数。光线追踪指令集可与图2C中的光线追踪 核心245所支持的光线追踪指令集类似或不同。
图5B图示根据实施例的执行单元508的示例性内部细节。图形执行单 元508可包括指令取得单元537、通用寄存器堆阵列(general register file, GRF)524、体系结构寄存器堆阵列(architectural register file,ARF)526、 线程仲裁器522、发送单元530、分支单元532、SIMD浮点单元(floating point unit,FPU)的集合534、以及在一个实施例中的专用整数SIMD ALU的集 合535。GRF 524和ARF 526包括与可在图形执行单元508中活跃的每个 同步硬件线程相关联的通用寄存器堆和体系结构寄存器堆的集合。在一个 实施例中,每线程体系结构状态被维持在ARF 526中,而在线程执行期间 使用的数据被存储在GRF524中。每个线程的执行状态,包括用于每个线 程的指令指针,可以被保持在ARF 526中的线程特定寄存器中。
在一个实施例中,图形执行单元508具有作为同步多线程(Simultaneous Multi-Threading,SMT)与细粒度交织多线程(Interleaved Multi-Threading, IMT)的组合的体系结构。该体系结构具有模块化配置,该模块化配置可 以基于同步线程的目标数量和每个执行单元的寄存器的数量而在设计时进 行微调,其中跨用于执行多个同步线程的逻辑来划分执行单元资源。可由 图形执行单元508执行的逻辑线程的数量不限于硬件线程的数量,并且可 将多个逻辑线程指派给每个硬件线程。
在一个实施例中,图形执行单元508可协同发出多条指令,这些指令可 以各自是不同的指令。图形执行单元线程508的线程仲裁器522可以将指 令调遣给以下各项中的一项以供执行:发送单元530、分支单元532或(一 个或多个)SIMD FPU 534。每个执行线程可以访问GRF 524内的128个通 用寄存器,其中,每个寄存器可以存储可作为具有32比特数据元素的SIMD 8元素向量访问的32个字节。在一个实施例中,每个执行单元线程具有对 GRF524内的4个千字节的访问权,但是实施例并不限于此,并且在其他 实施例中可以提供更多或更少的寄存器资源。在一个实施例中,图形执行 单元508被分区为可独立地执行计算操作的七个硬件线程,但是每个执行 单元的线程数量也可根据实施例而有所不同。例如,在一个实施例中,支 持最多16个硬件线程。在其中七个线程可以访问4个千字节的实施例中,GRF 524可以存储总共28个千字节。在16个线程可访问4个千字节的情 况下,GRF 524可存储总共64个千字节。灵活的寻址模式可以准许对多个 寄存器一起进行寻址,从而建立实际上更宽的寄存器或者表示跨步式矩形 块数据结构。
在一个实施例中,经由通过消息传递发送单元530执行的“发送”指令来 调遣存储器操作、采样器操作以及其他较长等待时间的系统通信。在一个 实施例中,分支指令被调遣给专用分支单元532以促进SIMD发散和最终 收敛。
在一个实施例中,图形执行单元508包括用于执行浮点操作的一个或多 个SIMD浮点单元(FPU)534。在一个实施例中,(一个或多个)FPU 534 还支持整数计算。在一个实施例中,(一个或多个)FPU 534可以SIMD 执行最多数量M个32比特浮点(或整数)操作,或者SIMD执行最多2M 个16比特整数或16比特浮点操作。在一个实施例中,(一个或多个)FPU 中的至少一个提供支持高吞吐量超越数学函数和双精度64比特浮点的扩展 数学能力。在一些实施例中,8比特整数SIMD ALU的集合535也存在, 并且可专门优化成执行与机器学习计算相关联的操作。
在一个实施例中,可以在图形子核心分组(例如,子切片)中对图形执 行单元508的多个实例的阵列进行实例化。为了可缩放性,产品体系结构 师可以选择每子核心分组的执行单元的确切数量。在一个实施例中,执行 单元508可以跨多个执行通道来执行指令。在进一步的实施例中,在不同 通道上执行在图形执行单元508上执行的每个线程。
图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类似的方式操作。
执行单元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可配置有对bfloat 16比特浮点 格式的支持。在一个实施例中,数学单元613可被包括以便以高效的且比 ALU单元611更低功率的方式执行数学操作的特定子集。数学单元613可 包括可在由其他实施例提供的图形处理引擎的共享功能逻辑(例如,图4 中的共享功能逻辑420的数学逻辑422)中发现的数学逻辑的变体。在一个 实施例中,数学单元613可配置成执行32比特和64比特浮点操作。
线程控制单元601包括用于控制执行单元内的线程的执行的逻辑。线程 控制单元601可包括线程仲裁逻辑,该线程仲裁逻辑用于启动、停止以及 抢占执行单元600内线程的执行。线程状态单元602可用于存储用于被指 派在执行单元600上执行的线程的线程状态。将线程状态存储在执行单元 600能使得能够在线程变得被锁定或空闲时快速抢占那些线程。指令取得/ 预取单元603可从较高级别执行逻辑的指令缓存(例如,如图5A中的指令 缓存506)取得指令。指令取得/预取单元603还基于对当前执行线程的分 析来发出对要被加载到执行缓存中的指令的预取请求。指令解码单元604 可用于对要由计算单元执行的指令进行解码。在一个实施例中,指令解码 单元604可被用作次级解码器以将复杂指令解码为组成的微操作。
执行单元600附加地包括寄存器堆606,该寄存器堆可由在执行单元600 上执行的硬件线程使用。寄存器堆606中的寄存器可跨用于执行执行单元 600的计算单元610内的多个同步线程的逻辑而被划分。可由图形执行单元 600执行的逻辑线程的数量不限于硬件线程的数量,并且可将多个逻辑线程 指派给每个硬件线程。基于所支持的硬件线程的数量,寄存器堆606的大 小可因实施例而异。在一个实施例中,可使用寄存器重命名来动态地将寄 存器分配给硬件线程。
图7是图示根据一些实施例的图形处理器指令格式700的框图。在一个或 多个实施例中,图形处理器执行单元支持具有多种格式的指令的指令集。实线 框图示通常被包括在执行单元指令中的组成部分,而虚线包括可选的或仅被包 括在指令的子集中的组成部分。在一些实施例中,所描述和图示的指令格式700 是宏指令,因为它们是供应至执行单元的指令,这与产生自一旦指令被处理就 进行的指令解码的微指令相反。
在一些实施例中,图形处理器执行单元原生地支持128比特指令格式710 的指令。基于所选择的指令、指令选项和操作对象数量,64比特紧凑指令格式 730可用于一些指令。原生128比特指令格式710提供对所有指令选项的访问, 而一些选项和操作在64比特格式730中受限。64比特格式730中可用的原生 指令因实施例而异。在一些实施例中,使用索引字段713中的索引值的集合将 指令部分地压缩。执行单元硬件基于索引值来引用压缩表的集合,并使用压缩 表输出来重构128比特指令格式710的原生指令。可使用指令的其他大小和格 式。
针对每种格式,指令操作码712限定执行单元要执行的操作。执行单元跨 每个操作对象的多个数据元素并行地执行每条指令。例如,响应于加法指令, 执行单元跨表示纹理元素或图片元素的每个颜色通道执行同步加法操作。默认 地,执行单元跨操作对象的所有数据通道执行每条指令。在一些实施例中,指 令控制字段714启用对某些执行选项的控制,这些执行选项诸如通道选择(例 如,谓词(predication))以及数据通道顺序(例如,混合)。针对128比特 指令格式710的指令,执行大小字段716限制将被并行地执行的数据通道的数 量。在一些实施例中,执行大小字段716不可用于64比特紧凑指令格式730。
一些执行单元指令具有最多三个操作对象,包括两个源操作对象src0 720、 src1722以及一个目的地操作对象718。在一些实施例中,执行单元支持双目 的地指令,其中,双目的地中的一个目的地是隐式的。数据操纵指令可具有第 三源操作对象(例如,SRC2724),其中,指令操作码712确定源操作对象的 数量。指令的最后一个源操作对象可以是与指令一起传递的立即数(例如,硬 编码的)值。
在一些实施例中,128比特指令格式710包括访问/寻址模式字段726,该 访问/寻址模式字段726例如指定使用直接寄存器寻址模式还是间接寄存器寻 址模式。当使用直接寄存器寻址模式时,由指令中的比特直接提供一个或多个 操作对象的寄存器地址。
在一些实施例中,128比特指令格式710包括访问/寻址模式字段726,该 访问/寻址模式字段726指定指令的寻址模式和/或访问模式。在一个实施例中, 访问模式用于限定针对指令的数据访问对齐。一些实施例支持包括16字节对 齐访问模式和1字节对齐访问模式的访问模式,其中,访问模式的字节对齐确 定指令操作对象的访问对齐。例如,当处于第一模式时,指令可将字节对齐寻 址用于源操作对象和目的地操作对象,并且当处于第二模式时,指令可将16 字节对齐寻址用于所有的源操作对象和目的地操作对象。
在一个实施例中,访问/寻址模式字段726的寻址模式部分确定指令要使用 直接寻址还是间接寻址。当使用直接寄存器寻址模式时,指令中的比特直接提 供一个或多个操作对象的寄存器地址。当使用间接寄存器寻址模式时,可以基 于指令中的地址寄存器值和地址立即数字段来计算一个或多个操作对象的寄 存器地址。
在一些实施例中,基于操作码712比特字段对指令进行分组从而简化操作 码解码740。针对8比特的操作码,比特4、比特5、和比特6允许执行单元确 定操作码的类型。所示出的确切的操作码分组仅是示例。在一些实施例中,移 动和逻辑操作码组742包括数据移动和逻辑指令(例如,移动(mov)、比较 (cmp))。在一些实施例中,移动和逻辑组742共享五个最高有效比特(most significant bit,MSB),其中,移动(mov)指令采用0000xxxxb的形式,而 逻辑指令采用0001xxxxb的形式。流控制指令组744(例如,调用(call)、跳 转(jmp))包括0010xxxxb(例如,0x7)形式的指令。混杂指令组746包括 指令的混合,包括0011xxxxb(例如,0x30)形式的同步指令(例如,等待(wait)、 发送(send))。并行数学指令组748包括0100xxxxb(例如,0x40)形式的 逐分量的算术指令(例如,加、乘(mul))。并行数学组748跨数据通道并 行地执行算术操作。向量数学组750包括0101xxxxb(例如,0x50)形式的算 术指令(例如,dp4)。向量数学组对向量操作对象执行算术,诸如点积计算。 在一个实施例中,所图示的操作码解码740可用于确定执行单元的哪个部分将 用于执行经解码的指令。例如,一些指令可被指定为将由脉动阵列执行的脉动 指令。其他指令,诸如,光线追踪指令(未示出)可被路由到执行逻辑的切片 或分区内的光线追踪核心或光线追踪逻辑。
图形管线
图8是图形处理器800的另一实施例的框图。图8的具有与本文中的任何 其他附图的元件相同的附图标记(或名称)的那些元件能以类似于本文中其他 地方描述的任何方式操作或起作用,但不限于此。
在一些实施例中,图形处理器800包括几何管线820、媒体管线830、显 示引擎840、线程执行逻辑850、以及渲染输出管线870。在一些实施例中,图 形处理器800是包括一个或多个通用处理核心的多核心处理系统内的图形处理 器。图形处理器通过至一个或多个控制寄存器(未示出)的寄存器写入、或者 经由通过环形互连802发出至图形处理器800的命令被控制。在一些实施例中, 环形互连802将图形处理器800耦合至其他处理部件,诸如其他图形处理器或 通用处理器。来自环形互连802的命令由命令流转化器803解译,该命令流转 化器将指令供应至几何管线820或媒体管线830的各个部件。
在一些实施例中,命令流转化器803引导顶点取得器805的操作,该顶点 取得器805从存储器读取顶点数据,并执行由命令流转化器803提供的顶点处 理命令。在一些实施例中,顶点取得器805将顶点数据提供给顶点着色器807, 该顶点着色器807对每个顶点执行坐标空间变换和照明操作。在一些实施例中, 顶点取得器805和顶点着色器807通过经由线程调遣器831将执行线程调遣至 执行单元852A-852B来执行顶点处理指令。
在一些实施例中,执行单元852A-852B是具有用于执行图形操作和媒体操 作的指令集的向量处理器的阵列。在一些实施例中,执行单元852A-852B具有 专用于每个阵列或在阵列之间被共享的所附接的L1缓存851。缓存可以被配 置为数据缓存、指令缓存、或被分区为在不同分区中包含数据和指令的单个缓 存。
在一些实施例中,几何管线820包括用于执行3D对象的硬件加速曲面细 分的曲面细分部件。在一些实施例中,可编程外壳着色器811配置曲面细分操 作。可编程域着色器817提供对曲面细分输出的后端评估。曲面细分器813在 外壳着色器811的指示下进行操作,并且包括用于基于粗糙的几何模型来生成 详细的几何对象集合的专用逻辑,该粗糙的几何模型作为输入被提供该几何管 线820。在一些实施例中,如果不使用曲面细分,则可以绕过曲面细分部件(例 如,外壳着色器811、曲面细分器813和域着色器817)。
在一些实施例中,完整的几何对象可由几何着色器819经由被调遣至执行 单元852A-852B的一个或多个线程来处理,或者可以直接行进至裁剪器829。 在一些实施例中,几何着色器对整个几何对象而不是对如在图形管线的先前阶 段中那样对顶点或顶点补片进行操作。如果禁用曲面细分,则几何着色器819 从顶点着色器807接收输入。在一些实施例中,几何着色器819是可由几何着 色器程序编程的以便在曲面细分单元被禁用的情况下执行几何曲面细分。
在栅格化之前,裁剪器829处理顶点数据。裁剪器829可以是固定功能裁 剪器或具有裁剪和几何着色器功能的可编程裁剪器。在一些实施例中,渲染输 出管线870中的栅格化器和深度测试部件873调遣像素着色器以将几何对象转 换为逐像素表示。在一些实施例中,像素着色器逻辑被包括在线程执行逻辑850 中。在一些实施例中,应用可绕过栅格化器和深度测试部件873,并且经由流 出单元823访问未栅格化的顶点数据。
图形处理器800具有互连总线、互连组织、或允许数据和消息在处理器的 主要部件之中传递的某个其他互连机制。在一些实施例中,执行单元 852A-852B和相关联的逻辑单元(例如,L1缓存851、采样器854、纹理缓存 858等)经由数据端口856进行互连,以便执行存储器访问并且与处理器的渲 染输出管线部件进行通信。在一些实施例中,采样器854、缓存851、858以及 执行单元852A-852B各自具有单独的存储器访问路径。在一个实施例中,纹理 缓存858也可被配置为采样器缓存。
在一些实施例中,渲染输出管线870包含栅格化器和深度测试部件873, 其将基于顶点的对象转换为相关联的基于像素的表示。在一些实施例中,栅格 化器逻辑包括用于执行固定功能三角形和线栅格化的窗口器/掩码器单元。相关 联的渲染缓存878和深度缓存879在一些实施例中也是可用的。像素操作部件 877对数据进行基于像素的操作,但是在一些实例中,与2D操作相关联的像 素操作(例如,利用混合的比特块图像传送)由2D引擎841执行,或者在显 示时由显示控制器843使用叠加显示平面来代替。在一些实施例中,共享的L3缓存875可用于所有的图形部件,从而允许在无需使用主系统存储器的情 况下共享数据。
在一些实施例中,图形处理器媒体管线830包括媒体引擎837和视频前端 834。在一些实施例中,视频前端834从命令流转化器803接收管线命令。在 一些实施例中,媒体管线830包括单独的命令流转化器。在一些实施例中,视 频前端834在将媒体命令发送至媒体引擎837之前处理该命令。在一些实施例 中,媒体引擎837包括用于生成线程以用于经由线程调遣器831调遣至线程执 行逻辑850的线程生成功能。
在一些实施例中,图形处理器800包括显示引擎840。在一些实施例中, 显示引擎840在处理器800外部,并且经由环形互连802、或某个其他互连总 线或结构来与图形处理器耦合。在一些实施例中,显示引擎840包括2D引擎 841和显示控制器843。在一些实施例中,显示引擎840包含能够独立于3D管 线进行操作的专用逻辑。在一些实施例中,显示控制器843与显示设备(未示 出)耦合,该显示设备可以是系统集成显示设备(如在膝上型电脑中)、或者 是经由显示设备连接器附接的外部显示设备。
在一些实施例中,几何管线820和媒体管线830可被配置成用于基于多个 图形和媒体编程接口执行操作,并且并非专用于任何一种应用编程接口(API)。 在一些实施例中,图形处理器的驱动器软件将专用于特定图形或媒体库的API 调用转换成可由图形处理器处理的命令。在一些实施例中,为全部来自Khronos Group的开放图形库(Open GraphicsLibrary,OpenGL)、开放计算语言(Open Computing Language,OpenCL)和/或Vulkan图形和计算API提供支持。在 一些实施例中,也可以为来自微软公司的Direct3D库提供支持。在一些实施例 中,可以支持这些库的组合。还可以为开源计算机视觉库(Open SourceComputer Vision Library,OpenCV)提供支持。如果可进行从未来API的管 线到图形处理器的管线的映射,则具有兼容3D管线的未来API也将受到支持。
图形管线编程
图9A是图示根据一些实施例的图形处理器命令格式900的框图。图9B 是图示根据实施例的图形处理器命令序列910的框图。图9A中的实线框图示 一般被包括在图形命令中的组成部分,而虚线包括可选的或仅被包括在图形命 令的子集中的组成部分。图9A的示例性图形处理器命令格式900包括用于标 识命令的客户端902、命令操作代码(操作码)904和数据906的数据字段。 子操作码905和命令大小908也被包括在一些命令中。
在一些实施例中,客户端902指定图形设备的处理命令数据的客户端单元。 在一些实施例中,图形处理器命令解析器检查每个命令的客户端字段,以调整 对命令的进一步处理并将命令数据路由至适当的客户端单元。在一些实施例中, 图形处理器客户端单元包括存储器接口单元、渲染单元、2D单元、3D单元、 和媒体单元。每个客户端单元具有处理命令的对应的处理管线。一旦由客户端 单元接收到命令,客户端单元就读取操作码904以及子操作码905(如果存在) 以确定要执行的操作。客户端单元使用数据字段906内的信息来执行命令。针 对一些命令,预期显式的命令大小908指定命令的大小。在一些实施例中,命令解析器基于命令操作码自动地确定命令中的至少一些命令的大小。在一些实 施例中,经由双字的倍数来对齐命令。可使用其他命令格式。
图9B中的流程图图示了示例性图形处理器命令序列910。在一些实施例 中,以图形处理器的实施例为特征的数据处理系统的软件或固件使用所示出的 命令序列的某个版本来建立、执行并终止图形操作的集合。仅出于示例性目的 示出并描述了样本命令序列,因为实施例不限于这些特定的命令或者该命令序 列。而且,命令可以作为批量的命令以命令序列被发出,使得图形处理器将以 至少部分同时的方式处理命令序列。
在一些实施例中,图形处理器命令序列910可开始于管线转储清除命令 912,以便使得任何活跃的图形管线完成管线的当前未决命令。在一些实施例 中,3D管线922和媒体管线924不并发地操作。执行管线转储清除以使得活 跃的图形管线完成任何未决命令。响应于管线转储清除,用于图形处理器的命 令解析器将暂停命令处理,直到活跃的绘画引擎完成未决操作并且相关的读缓 存被无效。可选地,渲染缓存中被标记为“脏”的任何数据可以被转储清除到存 储器。在一些实施例中,管线转储清除命令912可以用于管线同步,或者在将 图形处理器置于低功率状态之前使用。
在一些实施例中,当命令序列要求图形处理器在管线之间明确地切换时, 使用管线选择命令913。在一些实施例中,在发出管线命令之前在执行上下文 中仅需要一次管线选择命令913,除非上下文将发出针对两条管线的命令。在 一些实施例中,紧接在经由管线选择命令913的管线切换之前需要管线转储清 除命令912。
在一些实施例中,管线控制命令914配置用于操作的图形管线,并且用于 对3D管线922和媒体管线924进行编程。在一些实施例中,管线控制命令914 配置活跃管线的管线状态。在一个实施例中,管线控制命令914用于管线同步, 并且用于在处理批量的命令之前清除来自活跃管线内的一个或多个缓存存储 器的数据。
在一些实施例中,返回缓冲器状态命令916用于配置用于相应管线的返回 缓冲器的集合以写入数据。一些管线操作需要分配、选择或配置一个或多个返 回缓冲器,在处理期间操作将中间数据写入这一个或多个返回缓冲器中。在一 些实施例中,图形处理器还使用一个或多个返回缓冲器来存储输出数据并且执 行跨线程通信。在一些实施例中,返回缓冲器状态916包括选择要用于管线操 作的集合的返回缓存器的大小和数量。
命令序列中的剩余命令基于用于操作的活跃管线而不同。基于管线判定 920,命令序列被定制用于以3D管线状态930开始的3D管线922、或者在媒 体管线状态940处开始的媒体管线924。
用于配置3D管线状态930的命令包括用于顶点缓冲器状态、顶点元素状 态、常量颜色状态、深度缓冲器状态、以及将在处理3D基元命令之前配置的 其他状态变量的3D状态设置命令。这些命令的值至少部分地基于使用中的特 定3D API来确定。在一些实施例中,如果将不使用某些管线元件,则3D管 线状态930命令还能够选择性地禁用或绕过那些元件。
在一些实施例中,3D基元932命令用于提交待由3D管线处理的3D基元。 经由3D基元932命令传递给图形处理器的命令和相关联的参数被转发到图形 管线中的顶点取得功能。顶点取得功能使用3D基元932命令数据来生成多个 顶点数据结构。顶点数据结构被存储在一个或多个返回缓冲器中。在一些实施 例中,3D基元932命令用于经由顶点着色器对3D基元执行顶点操作。为了处 理顶点着色器,3D管线922将着色器执行线程调遣至图形处理器执行单元。
在一些实施例中,经由执行934命令或事件触发3D管线922。在一些实 施例中,寄存器写入触发命令执行。在一些实施例中,经由命令序列中的“去 往(go)”或“踢除(kick)”命令来触发执行。在一个实施例中,使用管线同步 命令来触发命令执行,以便通过图形管线来转储清除命令序列。3D管线将执 行针对3D基元的几何处理。一旦操作完成,就对所得到的几何对象进行栅格 化,并且像素引擎对所得到的像素进行着色。对于那些操作,还可以包括用于 控制像素着色和像素后端操作的附加命令。
在一些实施例中,当执行媒体操作时,图形处理器命令序列910遵循媒体 管线924路径。一般地,针对媒体管线924进行编程的特定用途和方式取决于 待执行的媒体或计算操作。在媒体解码期间,特定的媒体解码操作可以被转移 到媒体管线。在一些实施例中,还可绕过媒体管线,并且可使用由一个或多个 通用处理核心提供的资源来整体地或部分地执行媒体解码。在一个实施例中, 媒体管线还包括用于通用图形处理器单元(GPGPU)操作的元件,其中,图形 处理器用于使用计算着色器程序来执行SIMD向量操作,这些计算着色器程序 并不明确地与图形基元的渲染相关。
在一些实施例中,以与3D管线922类似的方式配置媒体管线924。将用 于配置媒体管线状态940的命令集合调遣或放置到命令队列中,在媒体对象命 令942之前。在一些实施例中,用于媒体管线状态的命令940包括用于配置媒 体管线元件的数据,这些媒体管线元件将用于处理媒体对象。这包括用于在媒 体管线内配置视频解码和视频编码逻辑的数据,诸如编码或解码格式。在一些 实施例中,用于媒体管线状态的命令940还支持使用指向包含批量的状态设置 的“间接”状态元件的一个或多个指针。
在一些实施例中,媒体对象命令942供应指向用于由媒体管线处理的媒体 对象的指针。媒体对象包括存储器缓冲器,该存储器缓冲器包含待处理的视频 数据。在一些实施例中,在发出媒体对象命令942之前,所有的媒体管线状态 必须是有效的。一旦管线状态被配置并且媒体对象命令942被排队,就经由执 行命令944或等效的执行事件(例如,寄存器写入)来触发媒体管线924。随 后可通过由3D管线922或媒体管线924提供的操作对来自媒体管线924的输 出进行后处理。在一些实施例中,以与媒体操作类似的方式来配置和执行GPGPU操作。
图形软件体系结构
图10图示根据一些实施例的用于数据处理系统1000的示例性图形软件体 系结构。在一些实施例中,软件体系结构包括3D图形应用1010、操作系统1020、 以及至少一个处理器1030。在一些实施例中,处理器1030包括图形处理器1032 以及一个或多个通用处理器核心1034。图形应用1010和操作系统1020各自在 数据处理系统的系统存储器1050中执行。
在一些实施例中,3D图形应用1010包含一个或多个着色器程序,这一个 或多个着色器程序包括着色器指令1012。着色器语言指令可以采用高级着色器 语言,诸如,Direct3D的高级着色器语言(High-Level Shader Language,HLSL)、 OpenGL着色器语言(OpenGL Shader Language,GLSL),等等。应用还包 括采用适于由通用处理器核心1034执行的机器语言的可执行指令1014。应用 还包括由顶点数据限定的图形对象1016。
在一些实施例中,操作系统1020是来自微软公司的
Figure BDA0003815892730000421
Figure BDA0003815892730000422
操作系统、专属的类UNIX操作系统、或使用Linux内核的变体的 开源的类UNIX操作系统。操作系统1020可支持图形API 1022,诸如Direct3D API、OpenGL API或Vulkan API。当Direct3DAPI正在使用时,操作系统1020 使用前端着色器编译器1024以将采用HLSL的任何着色器指令1012编译成较 低级的着色器语言。编译可以是即时(just-in-time,JIT)编译,或者应用可执 行着色器预编译。在一些实施例中,在3D图形应用1010的编译期间,将高级 着色器编译成低级着色器。在一些实施例中,着色器指令1012以中间形式提 供,诸如由Vulkan API使用的标准便携式中间表示(Standard Portable Intermediate Representation,SPIR)的某个版本。
在一些实施例中,用户模式图形驱动器1026包含后端着色器编译器1027, 该后端着色器编译器1027用于将着色器指令1012转换成硬件专用表示。当 OpenGL API在使用中时,将采用GLSL高级语言的着色器指令1012传递至用 户模式图形驱动器1026以用于编译。在一些实施例中,用户模式图形驱动器 1026使用操作系统内核模式功能1028来与内核模式图形驱动器1029进行通信。 在一些实施例中,内核模式图形驱动器1029与图形处理器1032通信以调遣命 令和指令。
IP核心实现方式
至少一个实施例的一个或多个方面可以由存储在机器可读介质上的代表 性代码实现,该机器可读介质表示和/或限定集成电路(诸如,处理器)内的逻 辑。例如,机器可读介质可以包括表示处理器内的各种逻辑的指令。当由机器 读取时,指令可以使机器制造用于执行本文所述的技术的逻辑。这类表示(被 称为“IP核心”)是集成电路的逻辑的可重复使用单元,这些可重复使用单元可 以作为描述集成电路的结构的硬件模型而被存储在有形的、机器可读介质上。 可以将硬件模型供应至在制造集成电路的制造机器上加载硬件模型的各消耗 方或制造设施。可以制造集成电路,使得电路执行与本文中描述的实施例中的任一实施例相关联地描述的操作。
图11A是图示根据实施例的IP核心开发系统1100的框图,该IP核心开 发系统1100可以用于制造集成电路以执行操作。IP核心开发系统1100可以用 于生成可并入到更大的设计中或用于构建整个集成电路(例如,SOC集成电路) 的模块化、可重复使用设计。设计设施1130可生成采用高级编程语言(例如, C/C++)的IP核心设计的软件仿真1110。软件仿真1110可用于使用仿真模型 1112来设计、测试并验证IP核心的行为。仿真模型1112可以包括功能仿真、 行为仿真和/或时序仿真。随后可从仿真模型1112创建或合成寄存器传输级(register transfer level,RTL)设计1115。RTL设计1115是对硬件寄存器之 间的数字信号的流进行建模的集成电路(包括使用建模的数字信号执行的相关 联的逻辑)的行为的抽象。除了RTL设计1115之外,还可以创建、设计或合 成逻辑级或晶体管级的较低级别设计。由此,初始设计和仿真的特定细节可有 所不同。
可以由设计设施进一步将RTL设计1115或等效方案合成到硬件模型1120 中,该硬件模型1120可以采用硬件描述语言(hardware description language, HDL)或物理设计数据的某种其他表示。可以进一步仿真或测试HDL以验证 IP核心设计。可使用非易失性存储器1140(例如,硬盘、闪存、或任何非易 失性存储介质)来存储IP核心设计以用于递送至第三方制造设施1165。替代 地,可以通过有线连接1150或无线连接1160(例如,经由因特网)来传输IP 核心设计。制造设施1165随后可以制造至少部分地基于IP核心设计的集成电路。所制造的集成电路可被配置用于执行根据本文中描述的至少一个实施例的 操作。
图11B图示根据本文中描述的一些实施例的集成电路封装组件1170的截 面侧视图。集成电路封装组件1170图示如本文中所描述的一个或多个处理器 或加速器设备的实现方式。封装组件1170包括连接至衬底1180的多个硬件逻 辑单元1172、1174。逻辑1172、1174可以至少部分地实现在可配置逻辑或固 定功能逻辑硬件中,并且可包括本文中描述的(一个或多个)处理器核心、(一 个或多个)图形处理器或其他加速器设备中的任何处理器核心、图形处理器或 其他加速器设备的一个或多个部分。每个逻辑单元1172、1174可以实现在半 导体管芯内,并且经由互连组织1173与衬底1180耦合。互连组织1173可以 被配置成在逻辑1172、1174与衬底1180之间路由电信号,并且可以包括互连, 该互连诸如但不限于凸块或支柱。在一些实施例中,互连组织1173可以被配 置成路由电信号,诸如例如,与逻辑1172、1174的操作相关联的输入/输出(I/O) 信号和/或功率或接地信号。在一些实施例中,衬底1180是基于环氧树脂的层 压衬底。在其他实施例中,封装衬底1180可以包括其他合适类型的衬底。封 装组件1170可以经由封装互连1183连接至其他电气设备。封装互连1183可 以耦合至衬底1180的表面以将电信号路由到其他电气设备,诸如主板、其他 芯片组或多芯片模块。
在一些实施例中,逻辑单元1172、1174与桥接器1182电耦合,该桥接器 1182被配置成在逻辑1172与逻辑1174之间路由电信号。桥接器1182可以是 为电信号提供路由的密集互连组织。桥接器1182可以包括由玻璃或合适的半 导体材料构成的桥接器衬底。电路由特征可形成在桥接器衬底上以提供逻辑 1172与逻辑1174之间的芯片到芯片连接。
尽管图示了两个逻辑单元1172、1174和桥接器1182,但是本文中所描述 的实施例可以包括在一个或多个管芯上的更多或更少的逻辑单元。这一个或多 个管芯可以由零个或更多个桥接器连接,因为当逻辑被包括在单个管芯上时, 可以排除桥接器1182。替代地,多个管芯或逻辑单元可以由一个或多个桥接器 连接。另外,在其他可能的配置(包括三维配置)中,多个逻辑单元、管芯和 桥接器可被连接在一起。
图11C图示封装组件1190,该封装组件1190包括连接到衬底1180的 多个单元的硬件逻辑小芯片(例如,基础管芯)。如本文中所描述的图形 处理单元、并行处理器和/或计算加速器可由分开制造的各种硅小芯片组成。 在该上下文中,小芯片是至少部分地被封装的集成电路,该至少部分地被 封装的集成电路包括可与其他小芯片一起被组装到更大的封装中的不同的 逻辑单元。具有不同IP核心逻辑的小芯片的各种集合可被组装到单个器件中。此外,可使用有源插入器技术将小芯片集成到基础管芯或基础小芯片 中。本文中描述的概念启用GPU内的不同形式的IP之间的互连和通信。IP 核心可通过使用不同的工艺技术来制造并在制造期间被组成,这避免了尤 其是对于具有若干风格的IP的大型SoC的将多个IP聚集到同一制造工艺 的复杂性。允许使用多种工艺技术改善了上市时间,并提供具有成本效益 的方法来创建多个产品SKU。此外,分解的IP更适于被独立地进行功率门 控,可关闭不在给定工作负载上使用的部件,从而降低总功耗。
硬件逻辑小芯片可包括专用硬件逻辑小芯片1172、逻辑或I/O小芯片 1174、和/或存储器小芯片1175。硬件逻辑小芯片1172以及逻辑或I/O小 芯片1174可以至少部分地实现在可配置逻辑或固定功能逻辑硬件中,并且 可包括本文中描述的(一个或多个)处理器核心、(一个或多个)图形处 理器、并行处理器或其他加速器设备中的任何处理器核心、图形处理器、 并行处理器或其他加速器设备的一个或多个部分。存储器小芯片1175可以 是DRAM(例如,GDDR、HBM)存储器或缓存(SRAM)存储器。
每个小芯片可被制造为单独的半导体管芯,并且经由互连组织1173与 衬底1180耦合。互连组织1173可配置成在衬底1180内的各种小芯片与逻 辑之间路由电信号。互连组织1173可包括互连,诸如但不限于凸块或支柱。 在一些实施例中,互连组织1173可以被配置成路由电信号,诸如例如,与 逻辑小芯片、I/O小芯片和存储器小芯片的操作相关联的输入/输出(I/O) 信号和/或功率信号或接地信号。
在一些实施例中,衬底1180是基于环氧树脂的层压衬底。在其他实施 例中,衬底1180可包括其他合适类型的衬底。封装组件1190可以经由封 装互连1183连接至其他电气设备。封装互连1183可以耦合至衬底1180的 表面以将电信号路由到其他电气设备,诸如主板、其他芯片组或多芯片模 块。
在一些实施例中,逻辑或I/O小芯片1174和存储器小芯片1175可经由 桥接器1187被电耦合,该桥接器1187配置成在逻辑或I/O小芯片1174与 存储器小芯片1175之间路由电信号。桥接器1187可以是为电信号提供路 由的密集互连组织。桥接器1187可以包括由玻璃或合适的半导体材料构成 的桥接器衬底。电路由特征可形成在桥接器衬底上以提供逻辑或I/O小芯 片1174与存储器小芯片1175之间的芯片到芯片连接。桥接器1187还可被 称为硅桥接器或互连桥接器。例如,在一些实施例中,桥接器1187是嵌入 式多管芯互连桥接器(Embedded Multi-die Interconnect Bridge,EMIB)。 在一些实施例中,桥接器1187可以仅是从一个小芯片到另一小芯片的直接 连接。
衬底1180可包括用于I/O 1191、缓存存储器1192和其他硬件逻辑1193 的硬件部件。结构1185可被嵌入在衬底1180中以启用衬底1180内的各种 逻辑小芯片与逻辑1191、1193之间的通信。在一个实施例中,I/O 1191、 结构1185、缓存、桥接器和其他硬件逻辑1193可集成在层叠在衬底1180 的顶部上的基础管芯中。
在各实施例中,封装组件1190可包括由结构1185或一个或多个桥接器 1187互连的更少或更多数量的部件和桥接器。封装组件1190内的小芯片能 以3D布置或2.5D布置来布置。一般而言,桥接器组织1187可用于促进例 如逻辑或I/O小芯片与存储器小芯片之间的点到点互连。结构1185可用于 将各种逻辑和/或I/O小芯片(例如,小芯片1172、1174、1191、1193)与 其他逻辑和/或I/O小芯片互连。在一个实施例中,衬底内的缓存存储器1192可充当用于封装组件1190的全局缓存,充当分布式全局缓存的部分,或充 当用于结构1185的专用缓存。
图11D图示根据实施例的包括可互换小芯片1195的封装组件1194。可 互换小芯片1195可被组装到一个或多个基础小芯片1196、1198上的标准 化插槽中。基础小芯片1196、1198可经由桥接器互连1197被耦合,该桥 接器互连1197可与本文中描述的其他桥接器互连类似,并且可以是例如 EMIB。存储器小芯片也可经由桥接器互连被连接至逻辑或I/O小芯片。I/O 和逻辑小芯片可经由互连组织进行通信。基础小芯片各自可支持按照用于 逻辑或I/O或存器/缓存的标准化格式的一个或多个插槽。
在一个实施例中,SRAM和功率递送电路可被制造到基础小芯片1196、 1198中的一个或多个中,基础小芯片1196、1198可使用相对于可互换小芯 片1195不同的工艺技术来制造,可互换小芯片1195堆叠在基础小芯片的 顶部上。例如,可使用较大工艺技术来制造基础小芯片1196、1198,同时 可使用较小工艺技术来制造可互换小芯片。可互换小芯片1195中的一个或 多个可以是存储器(例如,DRAM)小芯片。可基于针对使用封装组件1194 的产品的功率和/或性能来为封装组件1194选择不同的存储器密度。此外, 可在组装时基于针对产品的功率和/或性能来选择具有不同数量的类型的功 能单元的逻辑小芯片。此外,可将包含具有不同类型的IP逻辑核心的小芯 片插入到可互换小芯片插槽中,从而启用可混合并匹配不同技术的IP块的 混合式存储器设计。
示例性片上系统集成电路
图12-图13图示根据本文中所述的各实施例的可以使用一个或多个IP 核心制造的示例性集成电路和相关联的图形处理器。除了所图示的内容之 外,还可以包括其他逻辑和电路,包括附加的图形处理器/核心、外围接口 控制器或通用处理器核心。
图12是图示根据实施例的可使用一个或多个IP核心来制造的示例性片 上系统集成电路1200的框图。示例性集成电路1200包括一个或多个应用 处理器1205(例如,CPU)、至少一个图形处理器1210,并且可附加地包 括图像处理器1215和/或视频处理器1220,其中的任一个都可以是来自相 同设计设施或多个不同的设计设施的模块化IP核心。集成电路1200包括 外围或总线逻辑,包括USB控制器1225、UART控制器1230、SPI/SDIO 控制器1235和I2S/I2C控制器1240。此外,集成电路可包括显示设备1245, 该显示设备1245耦合至高清晰度多媒体接口(high-definition multimedia interface,HDMI)控制器1250和移动行业处理器接口(mobile industry processor interface,MIPI)显示接口1255中的一个或多个。可以由闪存子 系统1260(包括闪存和闪存控制器)来提供存储装置。可以经由存储器控制器1265来提供存储器接口以获得对SDRAM或SRAM存储器设备的访问。 一些集成电路附加地包括嵌入式安全引擎1270。
图13-图14是图示根据本文中所描述的实施例的用于在SoC内使用的示 例性图形处理器的框图。图13图示根据实施例的可以使用一个或多个IP核心 制造的片上系统集成电路的示例性图形处理器1310。图14图示根据实施例的 可以使用一个或多个IP核心制造的片上系统集成电路的附加示例性图形处理 器1340。图13的图形处理器1310是低功率图形处理器核心的示例。图14的 图形处理器1340是较高性能图形处理器核心的示例。图形处理器1310、1340 中的每一个都可以是图12的图形处理器1210的变体。
如图13中所示,图形处理器1310包括顶点处理器1305以及一个或多个 片段处理器1315A-1315N(例如,1315A、1315B、1315C、1315D,一直到1315N-1 和1315N)。图形处理器1310可以经由单独的逻辑执行不同的着色器程序, 使得顶点处理器1305被优化以执行用于顶点着色器程序的操作,而一个或多 个片段处理器1315A-1315N执行用于片段或像素着色器程序的片段(例如,像 素)着色操作。顶点处理器1305执行3D图形管线的顶点处理阶段,并生成基 元数据和顶点数据。(一个或多个)片段处理器1315A-1315N使用由顶点处理器1305生成的基元数据和顶点数据来产生被显示在显示设备上的帧缓冲器。 在一个实施例中,(一个或多个)片段处理器1315A-1315N被优化以执行如在 OpenGL API中提供的片段着色器程序,这些片段着色器程序可以用于执行与 如在Direct 3D API中提供的像素着色器程序类似的操作。
图形处理器1310附加地包括一个或多个存储器管理单元(memory managementunit,MMU)1320A-1320B、(一个或多个)缓存1325A-1325B 以及(一个或多个)电路互连1330A-1330B。这一个或多个MMU 1320A-1320B 为图形处理器1310(包括为顶点处理器1305和/或(一个或多个)片段处理器 1315A-1315N)提供虚拟到物理地址映射,除了存储在一个或多个缓存 1325A-1325B中的顶点数据或图像/纹理数据之外,该虚拟到物理地址映射还可 以引用存储在存储器中的顶点数据或图像/纹理数据。在一个实施例中,一个或 多个MMU 1320A-1320B可以与系统内的其他MMU同步,使得每个处理器 1205-1220可以参与共享或统一的虚拟存储器系统,系统内的其他MMU包括 与图12的一个或多个应用处理器1205、图像处理器1215和/或视频处理器1220 相关联的一个或多个MMU。根据实施例,一个或多个电路互连1330A-1330B 使得图形处理器1310能够经由SoC的内部总线或经由直接连接来与SoC内的 其他IP核心对接。
如图14中所示,图形处理器1340包括图13的图形处理器1310的一个或 多个MMU1320A-1320B、(一个或多个)缓存1325A-1325B、以及(一个或 多个)电路互连1330A-1330B。图形处理器1340包括一个或多个着色器核心 1355A-1355N(例如,1355A、1355B、1355C、1355D、1355E、1355F,一直 到1355N-1和1355N),这一个或多个着色器核心提供统一着色器核心体系结 构,在该统一着色器核心体系结构中,单个核心或类型或核心可以执行所有类型的可编程着色器代码,包括用于实现顶点着色器、片段着色器和/或计算着色 器的着色器程序代码。存在的着色器核心的确切数量可以因实施例和实现方式 而异。另外,图形处理器1340包括核心间任务管理器1345,该核心间任务管 理器1345充当用于将执行线程调遣给一个或多个着色器核心1355A-1355N的 线程调遣器和用于加速对基于片的渲染的分片操作的分片单元1358,在基于片 的渲染中,针对场景的渲染操作在图像空间中被细分,例如以利用场景内的局 部空间一致性或优化内部缓存的使用。
利用机器学习的光线追踪
如上所述,光线追踪是在其中通过基于物理的渲染来模拟光传输的图 形处理技术。光线追踪的关键操作之一是处理可见性查询,该查询需要对 包围体层次体系(BVH)中的节点进行遍历和相交测试。
基于光线追踪和路径追踪的技术通过以下方式来计算图像:追踪通过 每个像素的光线和路径,并使用随机采样来计算诸如阴影、光泽度、间接 照明等高级效果。仅使用一些样本是快速的,但产生噪声图像,而使用许 多样本产生高质量图像,但成本过高。
机器学习包括能够逐步改善指定任务的执行或逐步呈现更准确的预测 或决策的任何电路、程序代码或其组合。一些机器学习引擎可以执行这些 任务或呈现这些预测/决策,而无需被显式地编程来执行任务或呈现预测/ 决策。存在多种机器学习技术,包括(但不限于)有监督和半监督学习、 无监督学习和强化学习。
在过去的几年里,对用于实时使用的光线/路径追踪的突破性方案已经 以“降噪”的形式出现——使用图像处理技术以从有噪声、低样本计数输入 产生高质量、经过滤/经降噪的图像的过程。最有效的降噪技术依赖于机器 学习技术,其中,机器学习引擎学习在已利用更多样本来计算的情况下有 噪声图像看起来可能会是什么。在一个特定的实现方式中,机器学习由卷 积神经网络(convolutional neural network,CNN)执行;然而,本发明的 根本性原理不限于CNN实现方式。在此类实现方式中,训练数据是使用低 样本计数输入和基础事实(ground-truth)被生成的。CNN经训练以根据围 绕考虑中的像素的有噪声像素输入的邻域来预测会聚的像素。
虽然并不完美,但这种基于AI的降噪技术已被证明惊人地有效。然而, 需要注意的是,需要良好的训练数据,因为网络否则可能会预测错误的结 果。例如,如果动画电影工作室对具有陆地上的场景的以往电影训练了降 噪CNN,并随后尝试使用经训练的CNN来对来自水上的新电影布景的帧 进行降噪,则降噪操作将次佳地执行。
为了解决这个问题,可以在渲染的同时动态收集学习数据,并且可以 基于当前正在被运行的数据持续地训练机器学习引擎(诸如,CNN),从 而针对手头的任务持续改进机器学习引擎。因此,训练阶段仍可在运行时 之前被执行,但在运行时期间继续根据需要调整机器学习权重。由此,通 过针对每个帧或每N个帧将学习数据的生成限于图像的子区域来避免计算 训练所需的参考数据的高成本。尤其是生成帧的有噪声输入以利用当前网 络对整个帧进行降噪。此外,如下所述,参考像素的小区域被生成并被用 于持续训练。
虽然本文描述了CNN实现方式,但可以使用任何形式的机器学习引擎, 包括但不限于执行有监督学习(例如,构建包含输入和期望的输出的一组 数据的数学模型)、无监督学习(例如,其评估用于某些类型的结构的输 入数据)、和/或有监督和无监督学习的组合的系统。
现有的降噪实现方式在训练阶段和运行阶段操作。在训练阶段期间, 定义网络拓扑,该网络拓扑接收具有各个逐像素数据通道的NxN像素的区 域并生成最终的像素颜色,逐像素数据通道诸如,像素颜色、深度、法线、 法线偏离、基元ID和反射率。使用低样本计数输入的一帧的值(worth) 并参考使用非常高的样本计数而被计算的“期望的”像素颜色来生成一组 “代表性”训练数据。网络针对这些输入进行训练,从而为网络生成一组“理 想的”权重。在这些实现方式中,参考数据用于训练网络的权重,以将网络 的输出最接近地匹配到期望的结果。
在运行时,给定的、预先计算的理想网络权重被加载,并且网络被初 始化。对于每一帧,生成降噪输入的低样本计数图像(即,与用于训练的 图像相同)。对于每一帧,通过网络运行像素输入的给定邻域以预测“经降 噪的”像素颜色,从而生成经降噪的帧。
图15图示初始训练实现方式。机器学习引擎1500(例如,CNN)接 收具有各种逐像素数据通道的作为高样本计数图像数据1702的N x N像素 的区域并生成最终的像素颜色,逐像素数据通道诸如,像素颜色、深度、 法线、法线偏离、基元ID和反射率。使用低样本计数输入1501的一帧的 值来生成代表性训练数据。网络针对这些输入进行训练,从而生成一组“理 想的”权重1505,机器学习引擎1500随后使用这些“理想的”权重1505以 在运行时对低样本计数图像进行降噪。
为了改进上述技术,用于生成针对每帧或帧的子集(例如,针对每N 帧,其中,N=2、3、4、10、25等)的新训练数据的降噪阶段被扩充。具 体而言,如在图16中所图示,每个帧中的一个或多个区域(在此被称为“新 参考区域”1602)被选择,这一个或多个区域以高样本计数被渲染到单独的 高样本数缓冲器1604中。低样本计数缓冲器1603存储低样本计数输入帧 1601(包括对应于新参考区域1602的低样本区域1604)。
可以随机选择新参考区域1602的位置。替代地,能以预先指定的方式 为每个新帧(例如,使用帧之间的区域的预定移动,限于帧的中央处的指 定区域等)调整新参考区域1602的位置。
无论如何选择新参考区域,都由机器学习引擎1600使用该新参考区域 来持续改良和更新用于降噪的经训练的权重1605。具体地,渲染来自每个 新参考区域1602的参考像素颜色和来自对应的低样本计数区域1607的有 噪声参考像素输入。随后使用高样本计数参考区域1602和对应的低样本计 数区域1607在机器学习引擎1600上执行补充训练。与初始训练形成对照, 该训练在运行时期间针对每个新参考区域1602持续执行——由此确保机器 学习引擎1600被精确地训练。例如,可评估逐像素数据通道(例如,像素 颜色、深度、法线、法线偏离等),机器学习引擎1600使用这些逐像素数 据通道来作出对经训练的权重1605的调整。如在训练情况(图15)中,机 器学习引擎1600针对一组理想权重1605进行训练,以从低样本计数输入 帧1601去除噪声以生成经降噪的帧1620。然而,基于新类型的低样本计数 输入帧1601的新图像特性持续更新经训练的权重1605。
可以在图形处理器单元(graphics processor unit,GPU)或主机处理器 上的后台进程中同时执行由机器学习引擎1600执行的重新训练操作。可以 被实现为驱动器部件和/或GPU硬件部件的渲染循环可以持续产生该渲染 循环将其放置在队列中的新的训练数据(例如,以新的参考区域1602的形 式)。在GPU或主机处理器上执行的后台训练进程可以持续地从该队列读 取新的训练数据,重新训练机器学习引擎1600,并以适当的间隔用新的权 重1605更新机器学习引擎1600。
图17图示一个此类实现方式的示例,其中后台训练进程1700由主机 CPU 1710来实现。具体而言,后台训练进程1700使用高样本计数新参考 区域1602和对应的低样本区域1604来持续更新经训练的权重1605,由此 更新机器学习引擎1600。
如在图18A中所图示,对于多玩家在线游戏的非限制性示例,不同的 主机机器1820-1822各自生成参考区域,后台训练进程1700A-1700C将这 些参考区域传送到服务器1800(例如,诸如,游戏服务器)。服务器1800 随后使用从主机1820-1822中的每一个接收到的新参考区域对机器学习引 擎1810执行训练,从而如先前所述地更新权重1805。服务器1800将这些 权重1805传送到存储权重1605A-1605C的主机机器1820,由此更新每个 单独的机器学习引擎(未示出)。由于服务器1800可在短时间段内被提供 有大量参考区域,因此该服务器1800可对正由用户执行的任何给定应用(例 如,在线游戏)高效且精确地更新权重。
如图18B中所示,不同的主机机器可以(例如,基于如前所述的训练/ 参考区域1602)生成新的经训练权重并与服务器1800(例如,诸如,游戏 服务器)共享新的经训练权重,或者替代地,使用对等(peer-to-peer)共 享协议。服务器上的机器学习管理部件1810使用从主机机器中的每一个接 收到的新权重生成一组组合权重1805。组合权重1805例如可以是如本文中 所述从新权重生成并被持续更新的平均值。一旦被生成,就可传送组合权重1605A-1605C的副本并将组合权重1605A-1605C的副本存储在主机机器 1820-1822中的每一个上,主机机器1820-1822随后可如本文中所述使用这 些组合权重以执行降噪操作。
也可以由硬件制造商使用半封闭回路更新机制。例如,可包括参考网 络作为由硬件制造商分发的驱动器的部分。随着驱动器使用本文中所述的 技术生成新训练数据并持续地将这些数据往回提交给硬件制造商,该硬件 制造商使用该信息以继续改进用于下一驱动器更新的其机器学习实现方式。
在示例实现方式中(例如,在渲染场上的批量电影渲染中),渲染器 将新生成的训练区域传送到随时间推移从多个渲染节点聚合该数据的(那 个工作室的渲染场中的)专用服务器或数据库。单独机器上的单独进程持 续地改进工作室的专用降噪网络,并且新的渲染作业总是使用最新经训练 的网络。
在图19中图示机器学习方法。该方法可在本文中所描述的体系结构上 实现,但不限于任何特定的系统或图形处理体系结构。
在1901处,作为初始训练阶段的一部分,为多个图像帧生成低样本计 数图像数据和高样本计数图像数据。在1902处,使用高/低样本计数图像数 据来训练机器学习降噪引擎。例如,可以根据训练来更新与像素特征相关 联的一组卷积神经网络权重。然而,可以使用任何机器学习体系结构。
在1903处,在运行时,低样本计数图像帧连同具有高样本计数的至少 一个参考区域一起被生成。在1904处,由机器学习引擎和/或单独的训练逻 辑(例如,后台训练模块1700)使用高样本计数参考区域来持续改良对机 器学习引擎的训练。例如,高样本计数参考区域可以与低样本计数图像的 对应部分结合使用,以继续教导机器学习引擎1904如何最有效地执行降噪。 例如,在CNN实现方式中,这可能涉及更新与CNN相关联的权重。
可以实现上述多种变体,诸如,配置到机器学习引擎的反馈回路的方 式、生成训练数据的实体、将训练数据馈送回训练引擎的方式、以及如何 向渲染引擎提供改进的网络。此外,虽然上述示例使用单个参考区域执行 持续训练,但是可以使用任何数量的参考区域。此外,如前所述,参考区 域可以具有不同的大小,可以用于不同数量的图像帧上,并且可以使用不 同的技术(例如,随机、根据预定模式等)被定位在图像帧内的不同位置 中。
此外,虽然将卷积神经网络(CNN)描述为机器学习引擎1600的一个 示例,但是可使用能够使用新训练数据来持续改良其结果的任何形式的机 器学习引擎来实现本发明的根本性原理。作为示例而非限制,其他机器学 习实现方式包括数据处理分组方法(groupmethod of data handling,GMDH)、 长短期记忆、深度储存计算、深度信念网络、张量深度堆叠网络和深度预 测性译码网络,仅举数例。
用于高效分布式降噪的装置和方法
如上所述,降噪已成为针对具有平滑、无噪声图像的实时光线追踪的 关键特征。可跨分布式系统在多个设备上完成渲染,但是到目前为止,现 有的降噪框架全都对于单个机器上的单个实例进行操作。如果正跨多个设 备完成渲染,则这多个设备可能无法使得所有经渲染的像素针对计算图像 的经降噪部分是可访问的。
提出了一种对基于人工智能(artificial intelligence,AI)和非基于AI 的降噪技术两者有效的分布式降噪算法。图像的区域要么已经通过分布式 渲染操作跨节点分布,要么从单个帧缓冲器被拆分和分布。在需要时从相 邻节点收集计算足够降噪所需的相邻区域的虚假区域,并将最终产生的片 合成为最终图像。
分布式处理
图20图示执行渲染的多个节点2021-2023。尽管为简单起见仅图示三 个节点,但本发明的根本性原理不限于任何特定数量的节点。事实上,可 以使用单个节点来实现本发明的某些实施例。
节点2021-2023各自都渲染图像的一部分,从而在此示例中产生区域 2011-2013。虽然图20中示出矩形区域2011-2013,但可以使用任何形状的 区域,并且任何设备都可以处理任何数量的区域。由节点执行足够平滑的 降噪操作所需的区域被称为虚假区域2011-2013。换言之,虚假区域 2001-2003表示以指定的质量等级执行降噪所需的数据的全部。降低质量等 级减小虚假区域的大小并因此减少所需的数据量,并且提高质量等级增加 虚假区域和所需的对应数据。
如果诸如节点2021之类的节点确实具有虚假区域2001的、以所指定 的质量等级对该节点的区域2011降噪所需的部分的本地副本,则该节点将 从一个或多个“邻近”节点取回所需数据,这一个或多个“邻近”节点诸如所图 示的拥有虚假区域2001的部分的节点2022。类似地,如果节点2022确实 具有虚假区域2022的、以所指定的质量等级对该节点的区域2012降噪所 需的部分的本地副本,则节点2022将从节点2011取回所需的虚假区域数据2032。可以通过总线、互连、高速存储器结构(fabric)、网络(例如, 高速以太网)来执行取回,或者甚至可以是能够将渲染工作分布在多个核 心之间(例如,用于以极端分辨率或随时间变化渲染大图像)的多核心芯 片中的片上互连。每个节点2021-2023可以包括在图形处理器内的各个执 行单元或指定的执行单元集合。
要被发送的具体数据量取决于所使用的降噪技术。此外,来自虚假区 域的数据可以包括改进每个相应区域的降噪所需的任何数据。例如,虚假 区域数据可以包括图像颜色/波长、强度/α数据和/或法线。然而,本发明的 根本性原理不限于任何特定的虚假区域数据集。
附加细节
对于较慢的网络或互连,可以使用现有的通用无损或有损压缩来利用 对此数据的压缩。示例包括但不限于zlib、gzip、以及Lempel–Ziv–Markov 链算法(Lempel–Ziv–Markov chain algorithm,LZMA)。通过注意到帧之 间的光线命中信息的增量可能非常稀疏以及当节点已经具有来自先前帧的 所收集的增量时仅需要发送对那个增量作出贡献的样本,可使用进一步的 内容特定的压缩。这些可以选择性地推送到收集那些样本的节点i,或者节 点i可以从其他节点请求样本。无损压缩用于某些类型的数据和程序代码, 而有损数据用于其他类型的数据。
图21图示节点2021-2022之间的交互的附加细节。每个节点2021-2022 包括用于渲染相应图像区域2011-2012和虚假区域2001-2002的光线追踪渲 染电路2081-2082。降噪器2100-2111分别对区域2011-2012执行降噪操作, 每个节点2021-2022负责对区域2011-2012渲染和降噪。例如,降噪器 2021-2022可以包括用于分别生成经降噪的区域2121-2122的电路、软件或 其任何组合。如所提及的,当生成经降噪区域时,降噪器2021-2022可能 需要依赖于不同节点拥有的虚假区域内的数据(例如,降噪器2100可能需 要来自节点2022拥有的虚假区域2002的数据)。
由此,降噪器2100-2111可以分别使用来自区域2011-2012以及虚假区 域2001-2002的数据来生成经降噪的区域2121-2122,这些数据的至少部分 可从另一节点接收。如本文所述,区域数据管理器2101-2102可以管理从 虚假区域2001-2002的数据传递。压缩器/解压缩器单元2131-2132可以分 别执行对在节点2021-2022之间交换的虚假区域数据的压缩和解压缩。
例如,节点2021的区域数据管理器2101可以应来自节点2022的请求 而将来自虚假区域2001的数据发送到压缩器/解压缩器2131,该压缩器/解 压缩器2131对数据进行压缩以生成经压缩的数据2106,压缩器/解压缩器 2131将该经压缩的数据2106传送到节点2022,由此降低通过互连、网络、 总线或其他数据通信链路的带宽。节点2022的压缩器/解压缩器2132随后 对压缩数据2106进行解压缩,并且降噪器2111使用经解压缩的虚假数据来生成比仅使用来自区域2012的数据可能会产生的更高质量的经降噪区域 2012。区域数据管理器2102可以将来自虚假区域2001的经解压缩的数据 存储在缓存、存储器、寄存器堆或其他存储装置中,以在生成经降噪区域 2122时使该经解压缩的数据可用于降噪器2111。可执行类似的操作集以将 来自虚假区域2002的数据提供给节点2021上的降噪器2100,该降噪器2100 结合来自区域2011的数据来使用该数据以生成更高质量的经降噪的区域2121。
抓取数据或渲染
如果诸如节点2021-2022之类的设备之间的连接是慢的(即,低于阈 值等待时间和/或阈值带宽),则在本地渲染虚假区域可能比从其他设备请 求结果更快。这可以在运行时通过跟踪网络事务速度和针对虚假区域大小 的线性外推渲染时间来确定。在其中渲染完整个虚假区域更快的此类情况 下,多个设备可最终渲染图像的多个相同部分。可以基于基础区域的方差 和所确定的模糊程度来调整虚假区域的经渲染部分的分辨率。
负载平衡
可使用静态和/或动态负载平衡方案以在各节点2021-2023之间分布处 理负载。对于动态负载平衡,由降噪过滤器确定的方差可能既在降噪方面 需要更多时间而又驱动用于渲染场景的特定区域的样本量,其中图像的低 方差和模糊区域需要较少的样本。可基于来自先前帧的数据动态地调整指 派给特定节点的特定区域,或者当多个设备正在渲染时,可跨这些设备动 态地传递指派给特定节点的特定区域,使得所有设备将具有相同的工作量。
图22图示在每个相应节点2021-2022上运行的监视器2201-2202如何 收集性能度量数据,该性能度量数据包括但不限于通过网络接口2211-2212 传送数据所消耗的时间、当(利用或不利用虚假区域数据)对区域降噪时 消耗的时间、以及渲染每个区域/虚假区域所消耗的时间。监视器2201-2202 将这些性能度量往回向管理器或负载平衡器节点2201报告,该管理器或负 载平衡器节点2201分析数据以标识每个节点2021-2022上的当前工作负载 并潜在地确定处理各种经降噪的区域2121-2122的更高效模式.管理器节点 2201随后根据检测到的负载将用于新区域的新工作负载分发给节点 2021-2022。例如,管理器节点2201可以将更多的工作传送到那些负载不 重的节点和/或从那些过载的节点重新分配工作。此外,负载平衡器节点 2201可以传送重新配置命令,以调整由节点中的每一个执行渲染和/或降噪 的具体方式(其一些示例在上文描述)。
确定虚假区域
虚假区域2001-2002的大小和形状可以基于降噪器2100-2111实现的降 噪算法来确定。然后可以基于经降噪的样本的检测到的方差来动态地修改 虚假区域的相应大小。用于AI降噪的学习算法本身可用于确定适当的区域 大小,或者在诸如双边模糊之类的其他情况下,预定的滤波器宽度将确定 虚假区域2001-2002的大小。在使用学习算法的示例性实现方式中,可在 管理器节点2201上执行机器学习引擎,和/或可在各个节点2021-2023中的 每个节点上执行机器学习的多个部分(参见例如图18A-图18B和上述相关 联的文本)。
聚集最终图像
可在无需虚假区域或法线的情况下通过从节点2021-2022中的每个节 点聚集经渲染和经降噪的区域来生成最终图像。例如,在图22中,经降噪 区域2121-2122被传送到管理器节点2201的区域处理器2280,该区域处理 器2280组合这些区域以生成最终的经降噪图像2290,该最终的经降噪图像 2290随后被显示在显示器2290上。区域处理器2280可以使用多种2D合 成技术来组合区域。尽管被示为单独的部件,但是区域处理器2280和经降 噪图像2290可以集成到显示器2290。各种节点2021-2022可以使用直接发 送技术来传送经降噪区域2121-2122,并且可能使用区域数据的各种有损或 无损压缩。
AI降噪仍然是成本高昂的操作,并且随着游戏移动到云中。由此,跨 多个节点2021-2022的降噪的分布式处理可能变得需要实现针对传统游戏 或需要更高帧率的虚拟现实(VR)的实时帧率。电影工作室也经常在大型 渲染场中进行渲染,该大型渲染场可被用于更快地进行降噪。
在图23中图示用于执行分布式渲染和降噪的示例性方法。该方法可在 上文描述的系统体系结构的上下文内实现,但是不限于任何特定的系统体 系结构。
在2301处,图形工作被调遣给多个节点,这多个节点执行光线追踪操 作以渲染图像帧的区域。每个节点可能在存储器中已经具有用于执行操作 所需的数据。例如,节点中的两个或更多节点可以共享公共存储器,或者 节点的本地存储器可能已经存储了来自先前光线追踪操作的数据。替代地 或附加地,可以将某些数据传送到每个节点。
在2302处,确定对于所指定的降噪等级(即,以可接受的性能等级) 所需的“虚假区域”。虚假区域包括执行指定的降噪等级所需的任何数据, 包括一个或多个其他节点所拥有的数据。
在2303处,与虚假区域(或其部分)有关的数据在节点之间交换。在 2304处,每个节点对其相应的区域执行降噪(例如,使用交换的数据), 并且在2305处,将结果组合以生成最终的经降噪的图像帧。
诸如图22中所示的管理器节点或主节点可以将工作调遣给节点,并随 后组合由节点执行的工作以生成最终图像帧。可以使用基于对等的体系结 构,其中节点是交换数据以对最终图像帧进行渲染和降噪的对等方。
本文中描述的节点(例如,节点2021-2023)可以是经由高速网络而被 互连的图形处理计算系统。替代地,节点可以是耦合到高速存储器结构的 各个处理元件。所有节点可以共享公共虚拟存储器空间和/或公共物理存储 器。替代地,节点可以是CPU和GPU的组合。例如,上述管理器节点2201 可以是CPU和/或在CPU上被执行的软件,而节点2021-2022可以是GPU 和/或在GPU上被执行的软件。可使用各种不同类型的节点而仍符合本发明 的根本性原理。
示例神经网络实现方式
存在许多类型的神经网络;简单类型的神经网络是前馈网络。前馈网 络可以被实现为在其中按层来布置节点的非循环图。典型地,前馈网络拓 扑包括由至少一个隐藏层分开的输入层和输出层。隐藏层将由输入层接收 的输入变换为对在输出层中生成输出有用的表示。网络节点经由边被完全 连接到相邻层中的节点,但在每个层内的节点之间不存在边。在前馈网络 的输入层的节点处接收的数据经由激活函数被传播(即,“前馈”)至输出层的节点,该激活函数基于分别与连接这些层的边中的每一条边相关联的 系数(“权重”)来计算网络中每个连续层的节点的状态。取决于正由正被 执行的算法表示的特定模型,来自神经网络算法的输出可以采用各种形式。
在可使用机器学习算法对特定问题建模之前,使用训练数据集来训练 算法。训练神经网络涉及:选择网络拓扑;使用表示正由网络建模的问题 的训练数据的集合;以及调整权重,直到网络模型针对训练数据集的所有 实例都以最小误差执行。例如,在针对神经网络的有监督学习训练过程期 间,由网络响应于表示训练数据集中的实例的输入而产生的输出与针对那 个实例的“正确的”标记输出进行比较,计算表示输出与标记输出之间的差 异的误差信号,并且随着误差信号通过网络的层被向后传播,调整与连接 相关联的权重以使那个误差最小化。当根据训练数据集的实例生成的输出 中的每个输出的误差被最小化时,网络被认为是“经训练的”。
机器学习算法的准确度会显著地受用于训练算法的数据集的质量影响。 训练过程可能是计算密集型的,并且在传统通用处理器上可能需要大量的 时间。相应地,使用并行处理硬件来训练许多类型的机器学习算法。这对 于优化神经网络的训练是特别有用的,因为在调整神经网络中的系数时执 行的计算本身自然地适于并行实现方式。具体地,许多机器学习算法和软 件应用已被适配成利用通用图形处理设备内的并行处理硬件。
图24是机器学习软件栈2400的广义图。机器学习应用2402可以被配 置成使用训练数据集来训练神经网络或使用经训练的深度神经网络来实现 机器智能。机器学习应用2402可包括用于神经网络的训练和推断功能和/ 或可用于在部署之前训练神经网络的专业软件。机器学习应用2402可实现 任何类型的机器智能,包括但不限于:图像识别、地图创建和定位、自主 导航、语音合成、医学成像或语言翻译。
可以经由机器学习框架2404来启用用于机器学习应用2402的硬件加 速。机器学习框架2404可在本文中描述的硬件上实现,硬件诸如包括本文 中描述的处理器和部件的处理系统100。针对图24描述的具有与本文中任 何其他附图的元件相同或类似名称的元件描述与其他附图中相同的元件, 可按与其他附图中类似的方式操作或运行,可包括相同部件,并且可链接 如本文中其他地方所描述的那些实体那样的其他实体,但不限于此。机器学习框架2404可提供机器学习基元的库。机器学习基元是通常由机器学习 算法执行的基本操作。在没有机器学习框架2404的情况下,将需要机器学 习算法的开发者创建和优化与机器学习算法相关联的主计算逻辑,随后在 新的并行处理器被开发时重新优化计算逻辑。相反,机器学习应用可以被 配置成使用由机器学习框架2404提供的基元来执行必要的计算。示例性基 元包括张量卷积、激活函数和池化,它们是在训练卷积神经网络(CNN) 时被执行的计算操作。机器学习框架2404还可以提供基元以实现由许多机 器学习算法执行的基本线性代数子程序,诸如,矩阵和向量操作。
机器学习框架2404可处理从机器学习应用2402接收的输入数据,并 生成至计算框架2406的适当输入。计算框架2406可抽象出提供给GPGPU 驱动器2408的底层指令,以使得机器学习框架2404能够经由GPGPU硬件 2410来利用硬件加速而无需机器学习框架2404非常熟悉GPGPU硬件2410 的体系结构。此外,计算框架2406可以跨各种类型和世代的GPGPU硬件 2410来启用用于机器学习框架2404的硬件加速。
GPGPU机器学习加速
图25图示多GPU计算系统2500,其可以是处理系统100的变体。因 此,任何特征与本文中的处理系统100的组合的公开也公开了与多GPU计 算系统2500的对应组合,但是不限于此。图25的具有与本文中任何其他 附图的元件相同或类似名称的元件描述与其他附图中相同的元件,可按与 其他附图中类似的方式操作或运行,可包括相同的部件,并且可链接到如 本文中其他地方所描述的那些实体那样的其他实体,但不限于此。多GPU 计算系统2500可包括经由主机接口开关2504被耦合至多个GPGPU 2506A-2506D的处理器2502。主机接口开关2504可以是例如将处理器2502 耦合至PCI快速(PCI express)总线的PCI快速开关设备,处理器2502可 以通过该PCI快速总线与GPGPU的集合2506A-2506D通信。多个GPGPU 2506A-2506D中的每一个可以是上述GPGPU的实例。GPGPU 2506A-2506D 可经由高速点到点GPU至GPU链路的集合2516来互连。高速GPU至GPU 链路可以经由专用GPU链路连接到GPGPU 2506A-2506D中的每一个。P2P GPU链路2516启用GPGPU 2506A-2506D中的每一个GPGPU之间的直接 通信,而不需要通过处理器2502被连接到的主机接口总线进行的通信。利 用定向到P2P GPU链路的GPU-GPU通信量,主机接口总线保持可用于系 统存储器访问,或用于例如经由一个或多个网络设备与多GPU计算系统 2500的其他实例通信。,处理器2502可包括对P2P GPU链路2516的直接 支持,并因此直接连接到GPGPU 2506A-2506D,而不是经由主机接口开关 2504将GPGPU 2506A-2506D连接到处理器2502。
机器学习神经网络实现方式
本文中描述计算体系结构可以被配置成执行特别适合于训练和部署用 于机器学习的神经网络的这些类型的并行处理。可以将神经网络概括为具 有图关系的函数网络。如本领域中众所周知的,存在机器学习中所使用的 多种类型的神经网络实现方式。一种示例性类型的神经网络是如先前描述 的前馈网络。
第二示例性类型的神经网络是卷积神经网络(CNN)。CNN是用于处 理具有已知的、网格状拓扑的数据(诸如,图像数据)的专业的前馈神经 网络。因此,CNN通常用于计算视觉和图像识别应用,但是它们也可用于 其他类型的模式识别,诸如,语音和语言处理。CNN输入层中的节点被组 织为“过滤器”的集合(由视网膜中发现的感受野激发的特征检测器),并且每个过滤器集合的输出被传播至网络的连续层中的节点。用于CNN的 计算包括将卷积数学运算应用于每个过滤器以产生那个过滤器的输出。卷 积是由两个函数执行以产生第三函数的一种专业的数学运算,该第三函数 是两个原始函数中的一个的修改版本。在卷积网络术语中,卷积的第一函 数可以被称为输入,而第二个函数可以被称为卷积核心。输出可被称为特 征图。例如,至卷积层的输入可以是定义输入图像的各种颜色分量的多维 数据数组。卷积核心可以是多维参数数组,其中通过用于神经网络的训练 过程来使参数适配。
循环神经网络(Recurrent neural network,RNN)是包括层之间的反馈 连接的一类前馈神经网络。RNN通过跨神经网络的不同部分共享参数数据 来启用对序列化数据进行建模。用于RNN的体系结构包括循环。这些循环 表示变量的当前值在未来时刻对其自身值的影响,因为来自RNN的输出数 据的至少一部分被用作反馈以用于处理序列中的后续输入。由于语言数据 可被组成的可变本质,这个特征使RNN变得对语言处理特别有用。
下文描述的图呈现了示例性前馈网络、CNN网络和RNN网络,并且 描述了用于分别训练和部署那些类型的网络中的每一种的一般过程。将理 解,这些描述是示例性且非限制性的,并且一般说来所图示的概念一般可 应用于深度神经网络和机器学习技术。
上文描述的示例性神经网络可以用于执行深度学习。深度学习是使用 深度神经网络的机器学习。与仅包括单个隐藏层的浅层神经网络相反,深 度学习中使用的深度神经网络是由多个隐藏层组成的人工神经网络。更深 的神经网络通常训练起来更具计算密集性。然而,网络的附加隐藏层启用 多步模式识别,该多步模式识别产生相对于浅层机器学习技术的减小的输 出误差。
深度学习中使用的深度神经网络典型地包括用于执行特征识别的前端 网络,该前端网络耦合至后端网络,该后端网络表示数学模型,该数学模 型可基于提供给模型的特征表示来执行操作(例如,对象分类、语音识别 等)。深度学习使得在无需针对模型执行手工特征工程的情况下执行机器 学习。相反,深度神经网络可以基于输入数据内的统计结构或相关性来学 习特征。所学习的特征可以提供给数学模型,该数学模型可以将所检测的特征映射至输出。由网络使用的数学模型通常专用于待执行的特定任务, 并且将使用不同的模型来执行不同的任务。
一旦将神经网络结构化,就可以将学习模型应用于网络以将网络训练 成执行特定任务。学习模型描述如何调整模型内的权重以减小网络的输出 误差。反向传播误差是用于训练神经网络的常用方法。输入向量被呈现给 网络以供处理。使用损失函数将网络的输出与期望输出进行比较,并且为 输出层中的神经元中的每个神经元计算误差值。随后,向后传播误差值, 直到每个神经元具有粗略地表示该神经元对原始输出的贡献的相关联的误 差值。随后,网络可以使用算法(诸如,随机梯度下降算法)通过那些误 差进行学习,以更新神经网络的权重。
图26-图27图示示例性卷积神经网络。图26图示CNN内的各个层。 如图26中所示,用于对图像处理进行建模的示例性CNN可接收输入2602, 该输入2602描述输入图像的红、绿和蓝(red,green,and blue,RGB)分量。 输入2602可由多个卷积层(例如,卷积层2604、卷积层2606)处理。来 自多个卷积层的输出可选地可由全连接层的集合2608处理。如先前针对前 馈网络所描述,全连接层中的神经元具有至前一层中的所有激活的完全连 接。来自全连接层2608的输出可用于从网络生成输出结果。可使用矩阵乘 法而不是卷积来计算全连接层2608内的激活。并非所有的CNN实现方式 都利用全连接层。例如,在一些实现方式中,卷积层2606可生成CNN的 输出。
卷积层被稀疏地连接,这不同于在全连接层2608中发现的传统神经网 络配置。传统神经网络层完全被连接,使得每个输出单元与每个输入单元 相互作用。然而,如所图示,卷积层被稀疏地连接,因为感受野的卷积的 输出(而不是感受野中的每个节点的相应状态值)被输入到后续层的节点。 与卷积层相关联的核心执行卷积操作,该卷积操作的输出被发送至下一层。 在卷积层内执行的降维是使得CNN能够缩放以处理大图像的一个方面。
图27图示在CNN的卷积层内的示例性计算阶段。可以在卷积层2714 的三个阶段中处理至CNN的卷积层的输入2712。这三个阶段可以包括卷 积阶段2716、检测器阶段2718和池化阶段2720。随后,卷积层2714可将 数据输出至连续的卷积层。网络的最终卷积层可以生成输出特征图数据或 提供至全连接层的输入,例如以生成用于至CNN的输入的分类值。
在卷积阶段2716中,并行地执行若干个卷积,以产生线性激活的集合。 卷积阶段2716可以包括仿射变换,该仿射变换是可被指定为线性变换加平 移的任何变换。仿射变换包括旋转、平移、缩放和这些变换的组合。卷积 阶段计算连接至输入中的特定区域的函数(例如,神经元)的输出,这些 特定区域可以被确定为与神经元相关联的局部区域。神经元计算神经元的 权重与局部输入中神经元被连接到的区域的权重之间的点积。来自卷积阶段2716的输出定义由卷积层2714的连续阶段处理的线性激活的集合。
线性激活可由检测器阶段2718处理。在检测器阶段2718中,每个线性激 活由非线性激活函数处理。非线性激活函数增加整体网络的非线性性质,而不 影响卷积层的感受野。可使用若干种类型的非线性激活函数。一个特定的类型 是修正线性单元(rectifiedlinear unit,ReLU),其使用被定义为f(x)=max(0,x) 的激活函数,使得激活函数的阈值设定为零。
池化阶段2720使用池化函数,该池化函数用附近输出的概括统计来替换 卷积层2706的输出。池化函数可用于将平移不变性引入到神经网络中,使得 至输入的小平移不改变经池化的输出。局部平移的不变性在其中特征在输入数 据中的存在比该特征的精确位置更重要的场景下可以是有用的。可以在池化阶 段2720期间使用各种类型的池化函数,包括最大池化、平均池化和l2范数池 化。另外,一些CNN实现方式不包括池化阶段。相反,此类实现方式代用相 对于先前的卷积阶段具有增加的跨步的附加卷积阶段。
随后,来自卷积层2714的输出可由下一层2722处理。下一层2722可以 是一个附加的卷积层或是全连接层2708中的一个层。例如,图27的第一卷积 层2704可以输出至第二卷积层2706,而第二卷积层可以输出至全连接层2608 中的第一层。
图28图示示例性循环神经网络2800。在循环神经网络(RNN)中,网络 的先前状态影响网络的当前状态的输出。可以使用各种函数以各种方式来建立 RNN。RNN的使用通常围绕使用数学模型以基于先前的输入序列来预测未来。 例如,RNN可用于执行统计语言建模以在给定先前的字序列的情况下预测即 将来临的字。可以将所图示的RNN 2800描述为具有以下各项:输入层2802, 其接收输入向量;隐藏层2804,用于实现循环函数;反馈机制2805,用于启 用先前状态的“记忆”;以及输出层2806,用于输出结果。RNN 2800基于时间步长来操作。RNN在给定时间步长的状态经由反馈机制2805基于先前的时间 步长被影响。针对给定的时间步长,由先前状态和在当前时间步长的输入来限 定隐藏层2804的状态。在第一时间步长的初始输入(x1)可由隐藏层2804处理。 第二输入(x2)可由隐藏层2804使用在处理初始输入(x1)期间所确定的状态信 息来处理。给定的状态可被计算为st=f(Uxt+Ws(t-1)),其中,U和W是参数矩阵。 该函数f一般是非线性的,诸如,双曲正切函数(Tanh)或修正函数f(x)=max(0,x) 的变体。然而,隐藏层2804中使用的特定数学函数可以取决于RNN2800的 特定实现方式细节而有所不同。
除所描述的基本CNN网络和RNN网络之外,还可实现那些网络的变化。 一个示例RNN变体是长短期记忆(long short term memory,LSTM)RNN。LSTM RNN能够学习对于处理较长的语言序列可能必要的长期依赖性。CNN的变体 是卷积深度信念网络,该卷积深度信念网络具有类似于CNN的结构并且以类 似于深度信念网络的方式被训练。深度信念网络(deep belief network,DBN) 是由随机性(随机)变量的多个层组成的生成式神经网络。可以使用贪婪式无 监督学习来逐层训练DBN。随后,DBN的所学习的权重可以用于通过确定用于神经网络的最佳初始权重集合来提供预训练神经网络。
图29图示深度神经网络的训练和部署。一旦已针对任务将给定的网络结 构化,就使用训练数据集2902来训练神经网络。已开发出各种训练框架2904 来启用对训练过程的硬件加速。例如,以上描述的机器学习框架可被配置为训 练框架。训练框架2904可以跟未经训练的神经网络2906挂钩,并且使得能够 使用本文中描述的并行处理资源来训练未经训练的神经网以生成经训练的神 经网络2908。
为了开始训练过程,可随机地或通过使用深度信念网络进行预训练来选择 初始权重。随后,以有监督或无监督方式执行训练循环。
有监督学习是在其中将训练被执行为中介操作的学习方法,诸如,当训练 数据集2902包括与输入的期望输出配对的该输入时,或在训练数据集包括具 有已知输出的输入并且神经网络的输出被手动分级的情况下。网络处理输入, 并且将所得的输出与预期输出或期望输出的集合进行比较。随后,通过系统反 向传播误差。训练框架2904可以进行调整,以调整控制未经训练的神经网络 2906的权重。训练框架2904可以提供工具以监测未经训练的神经网络2906 在多好地收敛于适合基于已知的输入数据生成正确的答案的模型。随着网络的 权重被调整以改良由神经网络生成的输出,训练过程反复地发生。训练过程可以继续,直到神经网络达到与经训练的神经网络2908相关联的统计上期望的 准确度。随后,可以部署经训练的神经网络2908以实现任何数量的机器学习 操作。
无监督学习是在其中网络试图使用未标记数据来训练其自身的学习方法。 因此,针对无监督学习,训练数据集2902将包括不具有任何相关联的输出数 据的输入数据。未经训练的神经网络2906可以学习未标记输入内的分组,并 且可以确定单独的输入如何与整个数据集相关。无监督训练可以用于生成自组 织图,该自组织图是能够执行有助于数据降维的操作的一类的经训练的神经网 络2907。无监督训练还可以用于执行异常检测,该异常检测允许识别输入数据 集中偏离数据正常模式的数据点。
还可采用有监督训练和无监督训练的变体。半监督学习是在其中在训练数 据集2902中包括具有相同分布的经标记数据和未标记数据的混合的技术。渐 进式学习是有监督学习的变体,其中连续地使用输入数据以进一步训练模型。 渐进式学习使得经训练的神经网络2908能够适配于新数据2912,而不忘记在 初始训练期间根植在网络内的知识。
无论是有监督还是无监督的,用于特别深的神经网络的训练过程对于单个 计算节点可能是过于计算密集的。可以使用计算节点的分布式网络而不是使用 单个计算节点来加速训练过程。
图30A是图示分布学习的框图。分布式学习是使用多个分布式计算节点 (诸如,以上所述的节点)来执行神经网络的有监督训练或无监督训练的训练 模型。分布式计算节点可以各自包括一个或多个主机处理器以及通用处理节点 中的一个或多个通用处理节点,诸如,高度并行的通用图形处理单元。如所图 示,分布式学习可被执行模型并行性3002、数据并行性3004、或模型并行性 和数据并行性的组合。
在模型并行性3002中,分布式系统中的不同计算节点可以针对单个网络 的不同部分执行训练计算。例如,可以由分布式系统的不同的处理节点训练神 经网络的每个层。模型并行性的益处包括缩放到特别大的模型的能力。分割与 神经网络的不同层相关联的计算使得能够训练非常大的神经网络,其中所有层 的权重将不拟合到单个计算节点的记忆中。在一些实例中,模型并行性在执行 大型神经网络的无监督训练中可以是特别有用的。
在数据并行性3004中,分布式网络的不同节点具有模型的完整实例,并 且每个节点接收数据的不同部分。随后,组合来自不同节点的结果。虽然用于 数据并行性的不同方法是可能的,但是数据并行训练方法全都需要组合结果并 使每个节点之间的模型参数同步的技术。用于组合数据的示例性方法包括参数 求平均和基于更新的数据并行性。参数求平均对训练数据的子集训练每个节点, 并且将全局参数(例如,权重、偏差)设定为来自每个节点的参数的平均值。 参数求平均使用维持参数数据的中央参数服务器。基于更新的数据并行性类似 于参数求平均,例外在于,传递对模型的更新而不是将来自节点的参数传送到 参数服务器。另外,能以分散的方式执行基于更新的数据并行性,其中更新被 压缩并且在节点之间传送。
可以例如在其中每个计算节点包括多个GPU的分布式系统中实现组合式 模型和数据并行性3006。每个节点可以具有模型的完整实例,其中每个节点内 的多个单独的GPU用于训练模型的不同部分。
分布训练相对于在单个机器上的训练具有增加的开销。然而,本文中描述 的并行处理器和GPGPU可以各自实现各种技术以用于减少分布训练的开销, 这些技术包括用于启用高带宽GPU-GPU数据传送和加速的远程数据同步的技 术。
示例性机器学习应用
可以应用机器学习以解决各种技术问题,包括但不限于计算机视觉、 自主驾驶和导航、语音识别以及语言处理。计算机视觉在传统上已是机器 学习应用的最活跃研究领域之一。计算机视觉的应用范围为从重现人类视 觉能力(诸如,识别人脸)到创建新类别的视觉能力。例如,计算机视觉 应用可以被配置成从视频中可见的物体中诱发的振动来识别声波。并行处 理器加速的机器学习使得能够使用比先前可行的训练数据集明显大得多的 训练数据集来训练计算机视觉应用,并且使得能够使用低功率并行处理器 来部署推断系统。
并行处理器加速的机器学习具有自主驾驶应用,包括车道和道路标志 识别、障碍回避、导航和驾驶控制。加速的机器学习技术可以用于基于定 义对特定训练输入的适当响应的数据集来训练驾驶模型。本文中描述的并 行处理器能够实现对用于自主驾驶解决方案的日益复杂的神经网络进行快 速训练,并且能够实现将低功率推断处理器部署在适合于集成到自主车辆 中的移动平台中。
并行处理器加速的深度神经网络已实现用于自动语音识别(automatic speechrecognition,ASR)的机器学习方法。ASR包括创建在给定的输入声 序列的情况下计算最可能的语言序列的函数。使用深度神经网络的加速的 机器学习已实现对于先前用于ASR的隐马尔可夫模型(hidden Markov model, HMM)和高斯混合模型(Gaussian mixture model,GMM)的替代。
并行处理器加速的机器学习还可以用于加速自然语言处理。自动学习 程序可以利用统计推断算法以产生对于有误差的或不熟悉的输入而言具有 稳健性的模型。示例性自然语言处理器应用包括人类语言之间的自动机器 翻译。
可以将用于机器学习的并行处理平台划分为训练平台和部署平台。训 练平台通常是高度并行的,并且包括优化以加速多GPU单节点训练和多节 点、多GPU训练。适用于训练的示例性并行处理器包括高度并行的通用图 形处理单元和/或本文描述的多GPU计算系统。相反,经部署的机器学习平 台通常包括适合在诸如以下产品中使用的低功率并行处理器:相机、自主 机器人和自主车辆。
图30B图示适于使用经训练的模型执行推断的示例性推断片上系统 (SOC)3100。图30B的具有与本文中任何其他附图的元件相同或类似名 称的元件描述与其他附图中相同的元件,可按与其他附图中类似的方式操 作或运行,可包括相同的部件,并且可链接到如本文中其他地方所描述的 那些实体那样的其他实体,但不限于此。SOC 3100可集成处理部件,包括 媒体处理器3102、视觉处理器3104、GPGPU 3106和多核心处理器3108。 SOC3100可附加地包括片上存储器3105,该片上存储器3105可启用能够 由处理部件中的每个处理部件访问的共享片上数据池。处理部件可针对低 功率操作进行优化,以启用对包括自主交通工具和自主机器人的各种机器 学习平台的部署。例如,SOC 3100的一个实现方式可被用作用于自主交通 工具的主控制系统的部分。在SOC 3100被配置成在自主交通工具中使用的 情况下,SOC被设计和配置成符合部署管辖的相关功能安全标准。
在操作期间,媒体处理器3102和视觉处理器3104可协同地工作以加 速计算机视觉操作。媒体处理器3102可启用对多个高分辨率(例如,4K、 8K)视频流的低等待时间解码。经解码的视频流可被写入片上存储器3105 中的缓冲器。视觉处理器3104随后可解析经解码的视频,并且对经解码的 视频的帧执行初步处理操作,以准备好使用经训练的图像识别模型来处理 帧。例如,视觉处理器3104可加速用于CNN的卷积操作,该CNN用于对 高分辨率视频数据执行图像识别,同时后端模型计算由GPGPU 3106执行。
多核心处理器3108可包括控制逻辑,该控制逻辑用于辅助对由媒体处 理器3102和视觉处理器3104执行的数据传输和共享存储器操作的定序和 同步。多核心处理器3108还可充当应用处理器,以用于执行能够利用GPGPU 3106的推断计算能力的软件应用。例如,导航和驾驶逻辑的至少部 分可实现在多核心处理器3108上执行的软件中。此类软件可直接将计算工 作负载发出到GPGPU 3106,或者计算工作负载可被发出到多核心处理器3108,该多核心处理器3108可将那些操作的至少部分迁移至GPGPU 3106。
GPGPU 3106可以包括处理集群,诸如高度并行的通用图形处理单元 DPLAB00内的低功率配置的处理集群DPLAB06A-DPLAB06H。GPGPU 3106内的处理集群可支持专门优化成在经训练的神经网络上执行推断计算 的指令。例如,GPGPU 3106可支持用于执行诸如8比特和4比特整数向量 操作之类的低精度计算的指令。
光线追踪体系结构
在一个实现方式中,图形处理器包括用于执行实时光线追踪的电路和/ 或程序代码。专用的光线追踪核心的集合可以被包括在图形处理器中以执 行本文中描述的各种光线追踪操作,包括光线遍历和/或光线相交操作。除 了光线追踪核心之外,还可以包括用于执行可编程着色操作的多个集合的 图形处理核心以及用于对张量数据执行矩阵操作的多个集合的张量核心。
图31图示一个此类图形处理单元(GPU)3105的示例性部分,该GPU 3105包括被布置为多核心组3100A-3100N的专用的图形处理资源的集合。 图形处理单元(GPU)3105可以是图形处理器300、GPGPU 1340和/或本 文描述的任何其他图形处理器的变体。因此,图形处理器的任何特征的公 开也公开了与GPU 3105的对应组合,但不限于此。此外,图31的具有与 本文中任何其他附图的元件相同或类似名称的元件描述与其他附图中相同 的元件,可按与其他附图中类似的方式操作或运行,可包括相同的部件, 并且可链接如本文中其他地方所描述的那些实体那样的其他实体,但不限 于此。虽然提供仅单个多核心组3100A的细节,但是将理解,其他多核心 组3100B-3100N可配备有相同或类似集合的图形处理资源。
如所图示,多核心组3100A可包括图形核心的集合3130、张量核心的 集合3140以及光线追踪核心的集合3150。调度器/调遣器3110调度和调遣 图形线程以用于在各个核心3130、3140、3150上执行。寄存器堆的集合3120 存储在执行图形线程时由核心3130、3140、3150使用的操作对象值。这些 寄存器堆可包括例如用于存储整数值的整数寄存器、用于存储浮点值的浮 点寄存器、用于存储紧缩数据元素(整数和/或浮点数据元素)的向量寄存器以及用于存储张量/矩阵值的片寄存器。片寄存器可以被实现为向量寄存 器的组合的集合。
一个或多个第一级(level 1,L1)缓存和纹理单元3160在本地将图形 数据存储在每个多核心组3100A内,图形数据诸如纹理数据、顶点数据、 像素数据、光线数据、包围体数据等。由所有多核心组3100A-3100N或多 核心组3100A-3100N的子集共享的第二级(L2)缓存3180存储用于多个 并发的图形线程的图形数据和/或指令。如所图示,可跨多个多核心组 3100A-3100N共享L2缓存3180。一个或多个存储器控制器3170将GPU 3105耦合至存储器3198,该存储器3198可以是系统存储器(例如,DRAM) 和/或本地图形存储器(例如,GDDR6存储器)。
输入/输出(IO)电路3195将GPU 3105耦合至一个或多个I/O设备3195, 这一个或多个IO设备3195诸如为数字信号处理器(digital signal processor, DSP)、网络控制器或用户输入设备。片上互连可用于将I/O设备3190耦 合至GPU 3105和存储器3198。IO电路3195的一个或多个IO存储器管理 单元(IO memory management unit,IOMMU)3170直接将I/O设备3190耦 合至系统存储器3198。IOMMU 3170可以管理用于将虚拟地址映射到系统存储器3198中的物理地址的多个集合的页表。此外,IO设备3190、(一 个或多个)CPU 3199和(一个或多个)GPU 3105可共享相同的虚拟地址 空间。
IOMMU 3170还可以支持虚拟化。在这种情况下,IOMMU 3170可以 管理用于将客机(guest)/图形虚拟地址映射到客机/图形物理地址的第一集 合的页表以及用于将客机/图形物理地址映射到(例如,系统存储器3198 内的)系统/主机物理地址的第二集合的页表。第一集合的页表和第二集合 的页表中的每一个的基址可被存储在控制寄存器中,并且在上下文切换时 被换出(例如,使得新上下文被提供有对相关集合的页表的访问权)。虽 然未在图2C中图示,但是核心3130、3140、3150和/或多核心组 3100A-3100N中的每一个可包括转译后备缓冲器(TLB),这些TLB用于 对客机虚拟至客机物理转换、客机物理至主机物理转换以及客机虚拟至主 机物理转换进行缓存。
CPU 3199、GPU 3105和IO设备3190可以被集成在单个半导体芯片 和/或芯片封装上。所图示的存储器3198可集成在同一芯片上,或者可经由 芯片外接口被耦合至存储器控制器3170。在一个实现方式中,存储器3198 包括共享与其他物理系统级存储器相同的虚拟地址空间的GDDR6存储器, 但是本发明的根本性原理不限于该特定的实现方式。
在一个实施例中,张量核心3140可以包括专门设计成用于执行矩阵操 作的多个执行单元,这些矩阵操作是用于执行深度学习操作的基本计算操 作。例如,可将同步矩阵乘法操作用于神经网络训练和推断。张量核心3140 可使用各种操作对象精度来执行矩阵处理,操作对象精度包括单精度浮点 (例如,32比特)、半精度浮点(例如,16比特)、整数字(16比特)、 字节(8比特)和半字节(4比特)。神经网络实现方式还可以提取每个经 渲染场景的特征,从而潜在地组合来自多个帧的细节,以构建高质量的最 终图像。
在深度学习实现方式中,可调度并行的矩阵乘法工作用于在张量核心 3140上执行。神经网络的训练尤其需要大量矩阵点积操作。为了处理N x N x N矩阵乘法的内积公式化,张量核心3140可包括至少N个点积处理元件。 在矩阵乘法开始之前,一个完整的矩阵被加载到片寄存器中,并且对于N 个循环中的每个循环,第二矩阵的至少一列被加载。对于每个循环,存在 被处理的N个点积。
取决于特定的实现方式,能以不同精度来存储矩阵元素,包括16比特 的字、8比特的字节(例如,INT8)以及4比特的半字节(例如,INT4)。 可为张量核心3140指定不同的精度模式以确保将最高效的精度用于不同的 工作负载(例如,诸如推断工作负载,其可容忍到字节和到半字节的量化)。
光线追踪核心3150可以用于加速用于实时光线追踪实现方式和非实 时光线追踪实现方式两者的光线追踪操作。具体而言,光线追踪核心3150 可以包括光线遍历/相交电路,该光线遍历/相交电路用于使用包围体层次体 系(BVH)来执行光线遍历并识别封围在BVH容体内的光线与基元之间的 相交。光线追踪核心3150还可包括用于执行深度测试和剔除(例如,使用 Z缓冲器或类似布置)的电路。在一个实现方式中,光线追踪核心3150与 本文所述的图像降噪技术一起执行遍历操作和相交操作,该图像降噪技术 中的至少一部分可以在张量核心3140上执行。例如,张量核心3140可以 实现深度学习神经网络以执行对由光线追踪核心3150生成的帧的降噪。然 而,(一个或多个)CPU 3199、图形核心3130和/或光线追踪核心3150还 可实现降噪和/或深度学习算法中的全部或一部分。
此外,如上文所描述,可采用对于降噪的分布式方法,在该分布式方 法中,GPU3105在通过网络或高速互连而耦合至其他计算设备的计算设备 中。经互连的计算设备可以附加地共享神经网络学习/训练数据以改善整个 系统学习执行用于不同类型的图像帧和/或不同的图形应用的降噪的速度。
光线追踪核心3150可以处理所有的BVH遍历和光线-基元相交 (intersection),从而使图形核心3130免于被针对每条光线的数千条指令 过载。每个光线追踪核心3150可以包括用于执行包围盒测试(例如,用于 遍历操作)的第一组专业电路以及用于执行光线-三角形相交测试(例如, 使已被遍历的光线相交)的第二组专业电路。由此,多核心组3100A可简 单地发起光线探测,并且光线追踪核心3150独立地执行光线遍历和相交, 并将命中数据(例如,命中、无命中、多个命中等)返回到线程上下文。 当光线追踪核心245执行遍历和相交操作时,其他核心3130、3140可以被 释放以执行其他图形或计算工作。
每个光线追踪核心3150可以包括用于执行BVH测试操作的遍历单元 以及执行光线-基元相交测试的相交单元。相交单元随后可以生成“命中”、 “无命中”或“多个命中”响应,该相交单元将这些响应提供给适当的线程。在 遍历和相交操作期间,其他核心(例如,图形核心3130和张量核心3140) 的执行资源可以被释放以执行其他形式的图形工作。
还可以使用在其中工作被分布在图形核心3130与光线追踪核心3150 之间的混合式栅格化/光线追踪方法。
光线追踪核心3150(和/或其他核心3130、3140)可以包括对光线追 踪指令集的硬件支持,光线追踪指令集诸如:微软的DirectX光线追踪(DXR),其包括DispatchRays命令;以及光线生成着色器、最近命中着 色器、任何命中着色器和未命中着色器,它们使得为每个对象指派唯一集 合的着色器和纹理得以实现。可由光线追踪核心3150、图形核心3130和张 量核心3140支持的另一光线追踪平台是Vulkan 1.1.85。然而,要注意本发 明的根本性原理不限于任何特定的光线追踪ISA。
一般而言,各个核心3150、3140、3130可支持包括用于以下各项的指 令/功能的光线追踪指令集:光线生成、最近命中、任何命中、光线-基元相 交、逐基元和层次体系包围盒构建、未命中、拜访、和异常。更具体地, 可以包括光线追踪指令以用于执行以下功能:
光线生成(Ray Generation)——可为每个像素、样本或其他用户定义 的工作分配执行光线生成指令。
最近命中(Closest Hit)——可执行最近命中指令以对场景内光线与基元 的最近交点定位。
任何命中(Any Hit)——任何命中指令识别场景内光线与基元之间的多 个相交,从而潜在地识别新的最近交点。
相交(Intersection)——相交指令执行光线-基元相交测试并输出结果。
逐基元包围盒构建(Per-primitive Bounding box Construction)——该指 令围绕给定的基元或基元组建立包围盒(例如,当建立新BVH或其他加速 数据结构时)。
未命中(Miss)——指示光线未命中场景或场景的指定区域内的任何几 何体。
拜访(Visit)——指示光线将遍历的子容体。
异常(Exceptions)——包括各种类型的异常处置器(例如,为各种错误 条件而被调用)。
分层式光束追踪
包围体层次体系常用于改善对图形基元和其他图形对象执行操作的效 率。BVH是基于几何对象的集合建立的分层式树结构。在该树结构的顶部 是封围给定场景中的所有几何对象的根节点。各个几何对象被包裹在形成 该树的叶节点的包围体中。这些节点随后被分组为多个小集合并被封围在 更大的包围体内。这些节点转而以递归方式又被分组并被封围在其他更大 的包围体中,最终产生具有单个包围体的树结构,该单个包围体由位于树 顶部的根节点表示。包围体层次体系用于高效地支持对几何对象的集合的 各种操作,这些操作诸如在光线追踪中使用的碰撞检测、基元剔除以及遍 历/相交操作。
在光线追踪体系结构中,使光线遍历通过BVH以确定光线-基元相交。 例如,如果光线不通过BVH的根节点,则该光线不与由该BVH封围的基 元中的任何基元相交,并且无需针对该光线相对于该基元集合的进一步处 理。如果光线通过BVH的第一子节点但不通过第二子节点,则不需要针对 第二子节点所封围的任何基于测试光线。以这种方式,BVH提供用于测试 光线-基元相交的高效机制。
被称为“光束”的连续光线的组可以针对BVH进行测试,而不是对各条 光线进行测试。图32图示由四条不同光线勾勒出的示例性光束3201。与由 四条光线定义的补片(patch)3200相交的任何光线被认为在同一光束内。 虽然图32中的光束3201由光线的矩形布置来定义,但光束可以以各种其 他方式定义,同时仍符合本发明的根本性原理(例如,圆形、椭圆形等)。
图33图示GPU 3320的光线追踪引擎3310如何实现本文所述的光束 追踪技术。具体地,光线生成电路3304生成要对其执行遍历和相交操作的 多条光线。然而,与对各条光线执行遍历和相交操作不同,使用由光束层 次体系构建电路3305生成的光束的层次体系3307来执行遍历和相交操作。 光束层次体系类似于包围体层次体系(BVH)。例如,图34提供了可以被 细分为多个不同成分的主光束3400的示例。具体而言,主光束3400可细 分为四分体3401-3404,并且每个四分体自身可划分为多个子四分体,诸如, 四分体3404内的子四分体A-D。可以以多种方式细分主光束。例如,主光 束可以被分成两半(而不是象限),并且每一半可以被分成两半,以此类 推。不管如何进行细分,分层式结构以与BVH类似的方式被生成,例如, 具有:表示主光束3400的根节点;第一级子节点,每个第一级子节点由象 限3401-3404表示;针对每个子象限A-D的第二级子节点,以此类推。
一旦构建了光束层次体系3307,遍历/相交电路3306就可以使用光束 层次体系3307和BVH 3308来执行遍历/相交操作。具体而言,遍历/相交 电路3306对照BVH测试光束,并剔除该光束的不与该BVH的任何部分相 交的部分。使用图34中所示的数据,例如,如果与子区域3402和3403相 关联的子光束不与BVH或BVH的特定分支相交,则这些子光束可以相对 于BVH或分支被剔除。剩余部分3401、3404可以通过执行深度优先搜索 或其他搜索算法来对照BVH进行测试。
在图35中图示用于光线追踪的方法。该方法可在以上描述的图形处理 体系结构的上下文内实现,但并不限于任何特定的体系结构。
在3500处,构建包括多条光线的主光束,并且在3501处,该光束被 细分并且分层式数据结构被生成以创建光束层次体系。操作3500-3501可 以作为单个集成操作来执行,该操作从多条光线构建光束层次体系。在3502 处,光束层次体系与BVH一起使用以(从光束层次体系)剔除光线和/或 从BVH剔除节点/基元。在3503处,为剩余的光线和基元确定光线-基元相 交。
分布式光线追踪系统中的有损和无损分组(packet)压缩
光线追踪操作可以跨通过网络耦合在一起的多个计算节点分布。例如, 图36图示包括多个光线追踪节点3610-3613的光线追踪集群3600并行地 执行光线追踪操作,从而潜在地在节点中的一个节点上组合结果。在所图 示的体系结构中,光线追踪节点3610-3613经由网关通信地耦合到客户端 侧光线追踪应用3630。
分布式体系结构的困难之一是必须在光线追踪节点3610-3613中的每 一个之间传送的大量的分组化的(packetized)数据。无损压缩技术和有损 压缩技术两者可以用于减少在光线追踪节点3610-3613之间传送的数据。
为了实现无损压缩,与发送填充有某些类型的操作的结果的分组不同, 发送允许接收节点重建结果的数据或命令。例如,随机采样的区域光和环 境遮蔽(ambientocclusion,AO)操作不一定需要方向。因此,传送节点可 以简单地发送随机种子,该随机种子随后由接收节点使用来执行随机采样。 例如,如果场景跨节点3610-3612分布,则为了在点p1-p3处对光1进行 采样,仅光ID和原点需要被发送到节点3610-3612。节点中的每一个节点 随后可以独立地对光进行随机采样。随机种子可以由接收节点生成。类似 地,对于主光线命中点,可在节点3610-3612上计算环境遮挡(AO)和软 阴影采样,而无需等待用于连续帧的原始点。此外,如果已知一组光线将 去往同一点光源,则可以向接收节点发送标识光源的指令,接收节点将会 将该光源应用于该组光线。作为另一示例,如果存在从单个点发射的N条 环境遮挡光线,则可发送命令以从该点生成N个样本。
可以将各种附加技术应用于有损压缩。例如,可以采用量化因子来量 化与BVH、基元和光线相关联的所有坐标值。此外,用于诸如BVH节点 和基元之类的数据的32比特浮点值可以被转换为8比特整数值。在示例性 实现方式中,光线分组的边界以全精度被存储,但各个光线点P1-P3作为 到边界的索引偏移被传送。类似地,可以生成使用8比特整数值作为局部 坐标的多个局部坐标系。这些局部坐标系中的每一个的原点位置可以使用 全精度(例如,32比特浮点)值进行编码,从而有效地连接全局坐标系和 局部坐标系。
以下是无损压缩的示例。在光线追踪程序内部使用的光线数据格式 的示例如下:
Figure BDA0003815892730000771
Figure BDA0003815892730000781
可通过对值分组并在可能的情况下使用适用的元数据创建隐式光线来 对用于所生成的每个以及每一个节点的原始数据压缩而不是发送该数据。
将光线数据捆包和分组
标志可用于公共数据或带有修饰符的掩码。
Figure BDA0003815892730000782
例如:
RayPacket.rays(光线分组.光线)=ray_1(光线_1)至ray_256(光线_256)
原点全都是共享的
所有光线数据都被打包,除了仅单个原点跨所有光线被存储。为 RAYPACKET_COMMON_ORIGIN(光线分组_共同_原点)设置 RayPacket.flags(光线分组.标志)。当RayPacket在被接收时被拆包时,从 单个原点值填入原点。
原点仅在一些光线之间被共享
除了共享原点的光线之外,所有光线数据都被打包。对于具有多个唯 一的共享原点的每个组,对标识操作(共享的原点)、存储原点并对哪些 光线共享信息进行掩码的操作符进行打包。此类操作可在多个节点之间对 任何共享值进行,这些共享值诸如材料ID、基元ID、原点、方向、法线等。
Figure BDA0003815892730000791
发送隐式光线
很多时候,光线数据可以在接收端上使用用于生成该光线数据的最少 元信息被导出。非常常见的示例是生成多条次级光线以随机地对区域进行 采样。发送发可发送需要以任何从属性信息生成光线的命令,并且在接收 端上生成该光线,而不是发送方生成次级光线,发送该次级光线,并且接 收方对该次级光线进行操作。在需要首先由发送方生成光线以确定将其发 送到哪个接收方的情况下,生成光线并且可以发送随机种子以重新生成完 全相同的光线。
例如,为了使用对面光源进行采样的64条阴影光线对命中点进行采样, 所有64条光线都与来自同一计算N4的区域相交。创建具有共同原点和法 线的RayPacket。如果希望接收方对所得到的像素贡献着色,则可以发送更 多数据,但对于这个示例,让我们假设我们希望仅返回光线是否命中另一 节点数据。RayOperation被创建以用于生成阴影光线操作,并且被指派有 要采样的lightID的值以及随机数种子。当N4接收到光线分组时,它通过以下方式来生成完全填充的光线数据:将共享的原点数据填充到所有光线, 并基于利用随机数种子随机采样的lightID设置方向,以生成与原始发送方 生成的相同光线。当结果被返回时,仅用于每条光线的二进制结果需要被 返回,这可由掩码对光线传递。
在此示例中发送原始的64条光线将会使用104个字节*64条光线= 6656个字节。如果返回光线也以其原始形式被发送,则这也会加倍至13312 个字节。使用其中仅发送共同的光线原点、法线和具有种子和ID的光线生 成操作的无损压缩,仅发送29个字节,其中8个字节为被相交的掩码返回。 这导致需要通过网络发送的约为360:1的数据压缩率。这不包括处理消息本 身的开销,处理消息本身的开销需将会要以某种方式来标识,但其取决于实现方式。可进行其他操作以用于:从用于主光线的pixelID重新计算光线 原点和方向;基于raypacket中的范围重新计算pixelID;以及用于重新计算 值的许多其他可能的实现方式。可将类似操作用于所发送的任何单条光线 或光线组,包括路径追踪中的阴影、反射、折射、环境遮挡、相交、体积 相交、着色、反弹反射等。
图37图示两个光线追踪节点3710-3711的附加细节,两个光线追踪节 点3710-3711执行对光线追踪分组的压缩和解压缩。具体而言,当第一光 线追踪引擎3730准备好将数据传送到第二光线追踪引擎3731时,光线压 缩电路3720执行如本文所述的对光线追踪数据的有损和/或无损压缩(例如, 将32比特值转换为8比特值,替代原始数据以得到用于重构数据的指令 等)。经压缩的光线分组3701通过本地网络(例如,10Gb/s、100Gb/s以 太网)从网络接口3725传送到网络接口3726。光线解压缩电路随后在适当 的时候对光线分组进行解压缩。例如,光线解压缩电路可以执行命令以重 构光线追踪数据(例如,使用随机种子来执行用于照明操作的随机采样)。 光线追踪引擎3731随后使用接收到的数据来执行光线追踪操作。
在相反方向上,光线压缩电路3741压缩光线数据,网络接口3726通 过网络传送经压缩的光线数据(例如,使用本文描述的技术),光线解压 缩电路3740在必要时对光线数据解压缩,并且光线追踪引擎3730使用光 线追踪操作中的数据。尽管在图37中被示为单独的单元,但光线解压缩电 路3740-3741可以分别集成在光线追踪引擎3730-3731内。例如,在经压缩 的光线数据包括用于重构光线数据的命令的意义上,这些命令可以由每个 相应的光线追踪引擎3730-3731来执行。
如图38中所图示,光线压缩电路3720可包括用于执行本文中描述的 有损压缩技术(例如,将32比特的浮点坐标转换为8比特的整数坐标)的 有损压缩电路3801以及用于执行无损压缩技术(例如,传送命令和数据以 允许光线解压缩电路3821重构数据)的无损压缩电路3803。光线解压缩电 路3721包括有损解压缩电路3802以及用于执行无损解压缩的无损解压缩 电路3804。
在图39中图示另一示例性方法。该方法可在光线追踪体系结构或本文 中描述的其他体系结构上实现,但不限于任何特定的体系结构。
在3900处,接收将从第一光线追踪节点传送到第二光线追踪节点的光 线数据。在3901处,有损压缩电路对第一光线追踪数据执行有损压缩,并 且在3902处,无损压缩电路对第二光线追踪数据执行无损压缩。在3903 处,将经压缩的光线追踪数据传送到第二光线追踪节点。在3904处,有损 /无损解压缩电路执行对光线追踪数据的有损/无损解压缩,并且在3905处, 第二光线追踪节点使用经解压缩的数据执行光线追踪操作。
具有硬件加速的混合式光线追踪的图形处理器
接下来呈现在图形核心3130上执行栅格化以及在光线追踪核心3150、 图形核心3130和/或CPU 3199核心上执行光线追踪操作的混合式渲染管线。 例如,可以在图形核心3130上执行栅格化和深度测试来代替主光线投射阶 段。光线追踪核心3150随后可以生成用于光线反射、折射和阴影的次级光 线。此外,将选择场景中的、在其中光线追踪核心3150将(例如,基于诸 如高反射率水平之类的材料属性阈值)执行光线追踪操作的某些区域,而该场景的其他区域将利用图形核心3130上的栅格化来渲染。这种混合式实 现方式可用于实时光线追踪应用——其中等待时间是关键问题。
下文描述的光线遍历体系结构可例如通过在使用专用硬件加速诸如 BVH遍历和/或相交之类的关键功能的同时使用现有的单指令多数据 (SIMD)和/或单指令多线程(SIMT)图形处理器来执行光线遍历的可编 程着色和控制。通过在遍历期间并在着色之前在特定点处对生成的着色器 重新分组,可以改善对非相干路径的SIMD占用。这是使用专用硬件来实 现的,该专用硬件在芯片上动态地对着色器进行分类。递归是通过将函数 拆分为在返回时执行的延拓以及在执行之前对延拓重新分组以获得改善的 SIMD占用来进行管理的。
光线遍历/相交的可编程控制是通过以下方式实现的:将遍历功能分解 为可以被实现为固定功能硬件的内遍历和在GPU处理器上执行并通过用户 定义的遍历着色器启用可编程控制的外遍历。通过在内遍历和外遍历之间 的转变期间保守地截断内遍历状态来降低在硬件和软件之间传送遍历上下 文的成本。
对光线追踪的可编程控制可以通过下表A中列出的不同着色器类型来 表示。针对每种类型可存在多个着色器。例如,每种材料可具有不同的命 中着色器。
Figure BDA0003815892730000821
表A
由API函数或相交电路发起递归光线追踪,该API函数命令图形处理 器启动主色器的集合,该相交电路可生成针对主光线的光线-场景相交。这 转而生成其他着色器,诸如,遍历着色器、命中着色器、或未命中着色器。 生成子着色器的着色器也可从那个子着色器接收返回值。可调用着色器是 可直接由另一着色器生成且也可将值返回给作出调用的着色器的通用函数。
图40图示包括着色器执行电路4000和固定功能电路4010的图形处理 体系结构。通用执行硬件子系统包括:多个单指令多数据(SIMD)和/或单 指令多线程(singleinstructions multiple threads,SIMT)核心/执行单元(EU) 4001(即,每个核心可以包括多个执行单元)、一个或多个采样器4002、 以及第一级(Level 1,L1)缓存4003或其他形式的本地存储器。固定功能 硬件子系统4010包括消息传递单元4004、调度器4007、光线-BVH遍历/ 相交电路4005、排序电路4008和本地L1缓存4006。
在操作中,主调遣器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可以将光线排序成如本文所述的组或箱(bin)(例如, 对具有类似特性的光线进行分组)。光线-BVH相交电路4005使用BVH体 积执行光线的相交测试。例如,光线-BVH相交电路4005可以将光线坐标 与每一级的BVH进行比较,以标识被光线相交的体积。
可以使用以下各项来引用着色器:着色器记录;用户分配的结构,其 包括指向入口函数的指针;厂商特定元数据;以及由SIMD核心/EU 4001 执行的着色器的全局变量。着色器的每个执行实例都与调用栈相关联,该 调用栈可以用于存储在父着色器与子着色器之间传递的变量。调用栈还可 存储对在调用返回时被执行的延拓函数的引用。
图41图示所指派的栈的示例集合4101,该栈的示例集合4101包括主 着色器栈、命中着色器栈、遍历着色器栈、延拓函数栈、以及光线-BVH相 交栈(如所描述,其可由固定功能硬件4010执行)。新的着色器调用可以 实现来自空闲栈池4102的新栈。调用栈(例如,被指派的栈的集合所包括 的栈)可以被缓存在本地L1缓存4003、4006中以减少访问的等待时间。
可存在有限数量的调用栈,每个调用栈具有分配在存储器的连续区域 中的固定的最大大小“S”。因此,栈的基址可以直接从栈索引(stack index, SID)被计算为:基址=SID*S。当将工作调度到SIMD核心/EU 4001时, 栈ID可以由调度器4007分配和解除分配。
主调遣器4009可以包括图形处理器命令处理器,该图形处理器命令处 理器响应于来自主机(例如,CPU)的调遣命令来调遣主着色器。调度器 4007可以接收这些调遣请求,并且在其可为每个SIMD通道分配栈ID的情 况下在SIMD处理器线程上启动主着色器。可以从空闲栈池4102分配栈ID, 该空闲栈池4102在调遣命令的开始时被初始化。
执行着色器可通过将生成消息发送到消息传递单元4004来生成子着 色器。该命令包括与着色器相关联的栈ID,并且还包括指向针对每个活跃 SIMD通道的子着色器记录的指针。父着色器可为活跃通道仅发出一次该消 息。在为所有相关通道发送生成消息之后,父着色器可以终止。
在SIMD核心/EU 4001上执行的着色器也可使用具有为固定功能硬件 预留的着色器记录指针的生成消息来生成诸如光线-BVH相交之类的固定 功能任务。如所提及,消息传递单元4004将所生成的光线-BVH相交工作 发送到固定功能光线-BVH相交电路4005,并直接将可调用着色器发送到 排序电路4008。排序电路可以通过着色器记录指针对着色器分组以导出具 有类似特性的SIMD批次。相应地,可由排序电路4008使来自不同父着色 器的栈ID成组在同一批次中。排序电路4008将经分组的批次发送到调度 器4007,该调度器4007从图形存储器2511或最后一级缓存(last level cache, LLC)4020访问着色器记录,并且启动处理器线程上的着色器。
延拓可以被当作可调用着色器,并且也可通过着色器记录来引用。当 子着色器被生成并将值返回给父着色器时,指向延拓着色器记录的指针可 以入栈到调用栈4101上。当子着色器返回时,延拓着色器记录可以随后从 调用栈4101出栈,并且延拓着色器可以被生成。可选地,生成的延拓可以 通过类似于可调用着色器的排序单元并在处理器线程上被启动。
如在图42中所图示,排序电路4008通过着色器记录指针4201A、4201B、 4201n对所生成的任务分组,以创建要着色的SIMD批次。来自不同的调遣 以及不同的输入SIMD通道的栈ID或上下文ID可被分组在经排序的批次 中。分组电路4210可以使用内容可寻址存储器(content addressable memory, CAM)结构4201来执行排序,该CAM结构4201包括多个条目,其中每 个条目以标签4201来标识。如所提及,标签4201可以是对应的着色器记 录指针4201A、4201B、4201n。CAM结构4201可以存储有限数量的(例 如,32个、64个、128个等)标签,每个标签都与对应于着色器记录指针 的不完整SIMD批次相关联。
对于传入的生成命令,每个SIMD通道具有对应的栈ID(在每个CAM 条目中示出为16个上下文ID 0-15)以及着色器记录指针4201A-B,…n(充 当标签值)。分组电路4210可以将针对每个通道的着色器记录指针与CAM 结构4201中的标签4201进行比较以找到匹配的批次。如果找到匹配的批 次,则可以将栈ID/上下文ID添加到该批次。否则,可以创建具有新着色 器记录指针标签的新条目,从而可能驱逐具有不完整批次的较旧条目。
当调用栈为空时,执行着色器可通过将解除分配消息发送到消息传递 单元来对该调用栈解除分配。该解除分配消息被中继到调度器,该调度器 将针对活跃SIMD通道的栈ID/上下文ID返回给空闲池。
提出了使用固定功能光线遍历和软件光线遍历的组合的用于光线遍历 操作的混合式方法。因此,该方法提供软件遍历的灵活性,同时保持固定 功能遍历的效率。图43示出可用于混合式遍历的加速结构,该加速结构是 具有单个顶部层级BVH 4300和若干底部层级BVH 4301和4302的两级树。 在右边示出图形元素以指示内遍历路径4303、外遍历路径4304、遍历节点 4305、具有三角形的叶节点4306以及具有定制基元的叶节点4307。
顶部层级BVH 4300中的具有三角形的叶节点4306可引用用于定制基 元的三角形相交着色器记录,或引用遍历着色器记录。底部层级BVH 4301-4302的具有三角形的叶节点4306可仅引用用于定制基元的三角形相 交着色器记录。在叶节点4306内对引用的类型进行编码。内遍历是指每个 BVH 4300-4302内的遍历。内遍历操作包括光线-BVH相交的计算,跨BVH 结构4300-4302的遍历被称为外遍历。内遍历操作可以在固定功能硬件中 被高效地实现,而外遍历操作可以使用可编程着色器以可接受的性能来执 行。因此,可以使用固定功能电路4010来执行内遍历操作,并且可以使用 包括用于执行可编程着色器的SIMD/SIMT核心/EU 4001的着色器执行电 路4000来执行外遍历操作。
注意,为简单起见,SIMD/SIMT核心/EU 4001在本文中有时被简称为 “核心”、“SIMD核心”、“EU”或“SIMD处理器”。类似地,光线-BVH遍历/ 相交电路4005有时被简称为“遍历单元”、“遍历/相交单元”或“遍历/相交电 路”。当使用替代术语时,用于指定相应电路/逻辑的特定名称不改变如本文 中所述的该电路/逻辑执行的根本性功能。
此外,虽然在图40中出于解释的目的被图示为单个部件,但是遍历/ 相交单元4005可包括不同的遍历单元和单独的相交单元,它们中的每一个 都可实现在如本文中所述的电路和/或逻辑中。
当在内遍历期间光线与遍历节点相交时,遍历着色器可以被生成。排 序电路4008可以通过着色器记录指针4201A-B,n对这些着色器分组以创建 SIMD批次,该SIMD批次由调度器4007启动以用于在图形SIMD核心/EU 4001上的SIMD执行。遍历着色器可以通过若干方式修改遍历,从而实现 广泛的应用。例如,遍历着色器能以较粗糙的细节层级(level ofdetail,LOD) 选择BVH或变换光线以启用严格的体变换。遍历着色器随后可以为所选择 的BVH生成内遍历。
内遍历通过遍历BVH并计算光线-框相交和光线-三角形相交来计算光 线-BVH相交。通过将消息发送到消息传递电路4004以与着色器相同的方 式生成内遍历,该消息传递电路4004将对应的生成消息中继到光线-BVH 相交电路4005,该光线-BVH相交电路4005计算光线-BVH相交。
用于内遍历的栈可以在本地被存储在固定功能电路4010中(例如,在 L1缓存4006内)。当光线与对应于遍历着色器或相交着色器的叶节点相 交时,内遍历可以被终止,并且内栈被截断。被截断的栈连同指向光线和 BVH的指针可以被写入到存储器中由调用着色器指定的位置处,并且随后 对应的遍历着色器或相交着色器可以被生成。如果光线在内遍历期间与任 何三角形相交,则可以将相应的命中信息作为输入变量提供给这些着色器, 如下面的代码所示。可以由排序电路4008对这些所生成的着色器分组以创 建用于执行的SIMD批次。
Figure BDA0003815892730000871
截断内遍历栈减少将内遍历栈溢出到存储器的成本。可以使用在 “RestartTrail for Stackless BVH Traversal,High Performance Graphics(2010)(用 于无栈BVH遍历的高性能图形的重新启动路线(2010))”第107-111页中描 述的方法将栈截断为该栈顶部的少量条目,即42比特的重新启动路线和6比 特的深度值。重新启动路线指示已在BVH内部采取的分支,并且深度值指 示与最后的栈条目对应的遍历的深度。这是用于在稍候时间恢复内遍历的 足够信息。
当内栈为空且不再有要测试的BVH节点时,内遍历完成。在这种情况 下,外栈处置器被生成,该外栈处置器使外栈的顶部出栈,并在外栈不为 空的情况下恢复遍历。
外遍历可以执行主遍历状态机,并且能以由着色器执行电路4000执行 的程序代码实现。着色器执行电路4000可在以下条件下生成内遍历查询: (1)当由命中着色器或主着色器生成新光线时;(2)当遍历着色器选择 要遍历的BVH时;以及(3)当外栈处置器恢复针对BVH的内遍历时。
如在图44中所图示,在生成内遍历之前,在调用栈4405上分配供固 定功能电路4010存储被截断的内栈4410的空间。到调用栈和内栈的顶部 的偏移4403-4404被维持在遍历状态4400中,该遍历状态4400也被存储 在存储器2511中。遍历状态4400还包括世界空间中的光线4401和对象空 间中的光线4402以及用于最近相交基元的命中信息。
遍历着色器、相交着色器和外栈处置器全部都由光线-BVH相交电路 4005生成。遍历着色器在发起针对第二级BVH的新的内遍历之前在调用 栈4405上进行分配。外栈处置器是负责更新命中信息并恢复任何待决的内 遍历任务的着色器。外栈处置器还负责在遍历完成时生成命中或未命中着 色器。当没有待生成的待决内遍历查询时,遍历完成。当遍历完成并且相 交被找到时,生成命中着色器;否则生成未命中着色器。
虽然上述混合式遍历方案使用两层级BVH层次体系,但也可以实现任 意数量的BVH层级以及外遍历实现中的对应变化。
此外,虽然以上将固定功能电路4010描述为用于执行光线-BVH相交, 但是其他系统部件也可实现在固定功能电路中。例如,上文描述的外栈处 置器可以是可潜在地实现在固定功能BVH遍历/相交电路4005中的内部的 (非用户可见的)着色器。该实现方式可用于减少所调遣的着色器阶段的 数量以及固定功能相交硬件4005与处理器之间的往返行程的数量。
本文描述示例使用用户定义的功能来启用可编程着色和光线遍历控制, 这能以更高的SIMD效率在现有的以及未来的GPU处理器上执行。光线遍 历的可编程控制启用若干重要的特征,诸如,程序性的实例化、随机细节 层级选择、定制基元相交、以及惰性BVH更新。
还提供支持对命中着色器和相交着色器的推测性执行的可编程多指令 多数据(multiple instruction multiple data,MIMD)光线追踪体系结构。具 体而言,该体系结构聚焦于降低上文中参照图40描述的可编程SIMD/SIMT 核心/执行单元4001与混合式光线追踪体系结构中的固定功能MIMD遍历/ 相交单元4005之间的调度和通信开销。在下文中描述命中着色器和相交着 色器的多个推测性执行方案,它们可从遍历硬件在单个批次中被调遣,从 而避免若干遍历和着色往返行程。可以使用用于实现这些技术的专用电路。
本发明的实施例在其中光线遍历查询期望多个命中着色器或相交着色 器的执行的用例中是特别有益的,该光线遍历查询当在没有专用硬件支持 的情况下被实现时会产生显著的开销。这些包括但不限于最近k命中查询 (启动针对k最近相交的命中着色器)和多个可编程相交着色器。
本文描述的技术可实现为对在图40中图示(并参照图40-图44描述) 的体系结构的扩展。具体而言,本发明的当前实施例利用用于改进上述用 例的性能的增强而在该体系结构上构建。
混合式光线追踪遍历体系结构的性能限制是启动来自执行单元的遍历 查询的开销以及调用来自光线追踪硬件的可编程着色器的开销。当在同一 光线的遍历期间调用多个命中着色器或相交着色器时,该开销生成可编程 核心4001与遍历/相交单元4005之间的“执行往返行程”。这也向排序单元 4008施加额外的压力,排序单元4008需要从各个着色器调用提取 SIMD/SIMT一致性。
光线追踪的若干方面需要可通过在上文表A中列举的不同着色器类型 (即,主要、命中、任何命中、未命中、相交、遍历、以及可调用)来表 达的可编程控制。针对每种类型可存在多个着色器。例如,每种材料可具 有不同的命中着色器。在当前的
Figure BDA0003815892730000891
光线追踪API中定义这些着色器类 型中的一些。
作为简要回顾,由API函数发起递归光线追踪,该API函数命令GPU 启动可生成用于主光线的光线-场景相交的主着色器集合(以硬件和/或软件 实现)。这转而可生成其他着色器,诸如,遍历着色器、命中着色器、或 未命中着色器。生成子着色器的着色器也可从那个着色器接收返回值。可 调用着色器是可直接由另一着色器生成且也可可将值返回给作出调用的着 色器的通用函数。
光线遍历通过遍历包围体层次体系(BVH)中的节点并使这些节点相 交来计算光线-场景相交。近期的研究已显示,使用更适合于固定功能硬件 的技术(诸如,降低精度的算术、BVH压缩、逐光线状态机、专用相交管 线和定制缓存)可将计算光线-场景相交的效率改善超过一数量级。
在图40中示出的体系结构包括在其中SIMD/SIMT核心/执行单元的阵 列4001与固定功能光线追踪/相交单元4005相互作用以执行可编程光线追 踪的此类系统。可编程着色器被映射到执行单元/核心4001上的SIMD/SIMT 线程,其中,SIMD/SIMT利用、执行和数据一致性对于最优性能是关键的。 出于诸如以下各项的各种理由,光线查询常打破一致性:
遍历分散:BVH遍历的持续时间在支持异步光线处理的光线之间变化很 大。
执行分散:从相同SIMD/SIMT线程的不同通道生成的光线会导致不同 的着色器调用。
数据访问分散:例如,命中不同表面的光线对不同的BVH节点和基元 采样,并且着色器访问不同的纹理。各种其他场景可导致数据访问分散。
SIMD/SIMT核心/执行单元4001可以是本文中描述的核心/执行单元的 变体,本文中描述的核心/执行单元包括(多个)图形核心415A-415B、着 色器核心1355A-1355N、图形核心3130、图形执行单元608、执行单元 852A-852B、或本文中描述的任何其他核心/执行单元。SIMD/SIMT核心/ 执行单元4001可以代替(多个)图形核心415A-415B、着色器核心1355A-1355N、图形核心3130、图形执行单元608、执行单元852A-852B、 或本文中描述的任何其他核心/执行单元而被使用。因此,结合(多个)图 形核心415A-415B、着色器核心1355A-1355N、图形核心3130、图形执行 单元608、执行单元852A-852B、或本文中描述的任何其他核心/执行单元 对任何特征的公开还公开了与图40的SIMD/SIMT核心/执行单元4001的 对应组合,但是不限于此。
固定功能光线追踪/相交单元4005可以通过单独地且乱序地处理每条 光线来克服前两项难题。然而,那打破了SIMD/SIMT组。因此,排序单元 4008负责形成着色器调用的新的、一致的SIMD/SIMT组,用于再次被调 遣到执行单元。
容易看出此类体系结构与直接在SIMD/SIMT处理器上的基于纯软件 的光线追踪实现方式相比的益处。然而,存在与SIMD/SIMT核心/执行单 元4001(在本文中有时简称为SIMD/SIMT处理器或核心/EU)与MIMD 遍历/相交单元4005之间的消息传送相关联的开销。此外,排序单元4008 可能无法从不一致的着色器调用提取完美的SIMD/SIMT利用。
可以标识其中在遍历期间着色器调用可能特别频繁的用例。描述了用 于使混合式MIMD光线追踪处理器显著地降低核心/EU 4001与遍历/相交 单元4005之间的通信的开销的增强。当找到k最近相交并实现可编程相交 着色器时,这可以是特别有益的。然而,要注意,在此描述的技术不限于 任何特定的处理场景。
下文中提供核心/EU 4001与固定功能遍历/相交单元4005之间的光线 追踪上下文切换的高层级成本的总结。性能开销中的大多数性能开销由每 当着色器调用在单光线遍历期间是必要时的这两个上下文切换导致。
发射光线的每个SIMD/SIMT通道产生到与要遍历的BVH相关联的遍 历/相交单元4005的生成消息。数据(光线遍历上下文)通过生成消息和(所 缓存的)存储器被中继到遍历/相交单元4005。当遍历/相交单元4005准备 好将新的硬件线程指派给生成消息时,它加载遍历状态并对BVH执行遍历。 还存在在BVH上的第一次遍历步骤之前需要执行的设置成本。
图45图示可编程光线追踪管线的操作流程。包括遍历4502和相交4503 的被着色元素可在固定功能电路中实现,而其余元素可使用可编程核心/执 行单元实现。
主光线着色器4501将工作发送到4502处的遍历电路,该遍历电路使 (一条或多条)当前光线遍历通过BVH(或其他加速结构)。当到达叶节 点时,遍历电路调用在4503处的相交电路,该相交电路在标识光线-三角 形相交后,调用在4504处的任何命中着色器(该着色器可如所指示的将结 果往回提供给遍历电路)。
替代地,可以在到达叶节点以及在4507处调用的最近命中着色器(如 果记录了命中)或在4506处调用的未命中着色器(在未命中的情况下)之 前终止遍历。
如在4505处所指示,如果遍历电路到达定制基元叶节点,则可以调用 相交着色器。定制基元可以是任何非三角形基元,诸如多边形或多面体(例 如,四面体、体素、六面体、楔形、角锥体或其他“非结构化”体积)。相 交着色器4505向实现任何命中处理的任何命中着色器4504标识光线与定 制基元之间的任何相交。
当硬件遍历4502到达可编程阶段时,遍历/相交单元4005可生成到相 关着色器4505-4507的着色器调遣消息,该着色器调遣消息对应于用于执 行着色器的(一个或多个)执行单元的单个SIMD通道。由于调遣以任意 的光线顺序发生,并且它们在被调用的程序中是分散的,因此排序单元4008 可以累积多个调遣调用以提取一致的SIMD批次。更新的遍历状态和可选 的着色器变量可由遍历/相交单元4005写入存储器2511中。
在k最近相交问题中,对于前k个相交执行最近命中着色器4507。按 照传统方式,这将意味着:在找到最近相交后结束光线遍历;调用命中着 色器;并从命中着色器中生成新的光线以找到下一个最近相交(利用光线 原点偏移,因此将不会再次出现相同的相交)。容易看出,这种实现方式 对于单条光线将需要k次光线生成。另一实现方式利用任何命中着色器 4504、使用相交排序操作来进行操作,任何命中着色器4504对所有相交进 行调用并维护最近相交的全局列表。这种方法的主要问题是,没有任何命 中着色器调用的上界。
如所提及,可对非三角形(定制)基元调用相交着色器4505。取决于 相交测试的结果和遍历状态(待决节点和基元相交),在相交着色器4505 的执行之后,对同一光线的遍历可以继续进行。因此,发现最近命中可能 需要到执行单元的若干次往返行程。
还可以将关注点放在通过对遍历硬件和着色器调度模型的改变来减少 用于相交着色器4505和命中着色器4504、4507的SIMD-MIMD上下文切 换。首先,光线遍历电路4005通过累积多个潜在调用并以较大批次调遣它 们来推迟着色器调用。此外,在该阶段可以剔除被证明不必要的某些调用。 此外,着色器调度器4007可以将来自相同遍历上下文的多个着色器调用聚 合到单个SIMD批次中,这产生单个光线生成消息。在一个示例性实现方 式中,遍历硬件4005中止遍历线程并等待多个着色器调用的结果。此处将 这种操作模式称为“推测性”着色器执行,因为它允许调遣多个着色器,这 些着色器中的一些着色器在使用顺序调用时可能不会被调用。
图46A图示其中遍历操作在子树中遇到多个定制基元4650的示例,并 且图46B图示如何利用三个相交调遣周期C1-C3来解决这个问题。具体而 言,调度器4007可能需要三个周期来将工作提交给SIMD处理器4001,并 且遍历电路4005需要三个周期来将结果提供给排序单元4008。遍历电路 4005所需的遍历状态4601可以被存储在诸如本地缓存(例如,L1缓存和/ 或L2缓存)的存储器中。
A.推迟的光线追踪着色器调用
还可以修改管理硬件遍历状态4601以允许在列表中累积多个潜在的 相交或命中调用的方式。在遍历期间的给定时间,列表中的每个条目可用 于生成着色器调用。例如,可以在遍历硬件4005上和/或在存储器中的遍历 状态4601中累积k最近交点,并且如果遍历完成,则可以为每个元素调用 命中着色器。对于命中着色器,可以为BVH中的子树累积多个潜在相交。
对于最近k用例,这种方法的好处是,在遍历电路4005上的单次遍历 操作期间,从同一遍历线程调用所有命中着色器,而没有到SIMD核心/EU 4001的k-1次往返行程和k-1个新的光线生成消息。对于潜在实现方式的 一个挑战在于,保证命中着色器的执行顺序并不是微不足道的(标准的“往 返行程”方法保证最近相交的命中着色器首先被执行,等等)。这可以通过 命中着色器的同步或放宽排序来解决。
对于相交着色器用例,遍历电路4005事先不知晓给定的着色器是否会 返回肯定的相交测试。然而,推测性地执行多个相交着色器是可能的,并 且如果至少一个相交着色器返回肯定的命中结果,则将其合并到全局最近 命中。具体的实现方式需要找到推迟的相交测试的最优数量,以减少调遣 调用的数量但避免调用过多冗余的相交着色器。
B.从遍历电路聚合着色器调用
当在遍历电路4005上调遣来自同一光线生成的多个着色器时,可以创 建光线遍历算法的流程中的分支。这对于相交着色器可能是有问题的,因 为BVH遍历的其余部分依赖于所有调遣的相交测试的结果。这意味着同步 操作有必要等待着色器调用的结果,这在异步硬件上可能是有挑战性的。
合并着色器调用的结果的两点可以是:SIMD处理器4001和遍历电路4005。关于SIMD处理器4001,多个着色器可以使用标准编程模型来同步 并聚合它们的结果。这样做的一种相对简单的方法是使用全局原子性并聚 合存储器中的共享数据结构中的结果,多个着色器的相交结果可以存储在 该共享数据结构中。然后最后一个着色器可以解析数据结构并且回调遍历 电路4005以继续遍历。
还可以实现一种更高效的方法,该方法将多个着色器调用的执行限制 于SIMD处理器4001上的同一SIMD线程的通道。然后,使用SIMD/SIMT 减少操作(而不是依赖于全局原子性)在本地减少相交测试。该实现方式 可以依赖于排序单元4008内的新电路,以使小批次的着色器调用留在同一 SIMD批次中。
可以进一步在遍历电路4005上中止遍历线程的执行。通过使用传统执 行模型,当在遍历期间调遣着色器时,终止遍历线程,并且将光线遍历状 态保存到存储器,以便在执行单元4001处理着色器时允许执行其他光线生 成命令。如果仅仅中止遍历线程,则不需要存储遍历状态,并且遍历状态 可以分别等待每个着色器结果。该实现方式可以包括用于避免死锁和提供 足够的硬件利用率的电路。
图47-图48图示推迟模型的示例,该模型在具有三个着色器4701的 SIMD核心/执行单元4001上调用单个着色器调用。当保留时,所有相交测 试都在同一SIMD/SIMT组内被评估。因此,也可以在可编程核心/执行单 元4001上计算最近相交。
如所提及,着色器聚合和/或推迟的全部或部分可以由遍历/相交电路 4005和/或核心/EU调度器4007执行。图47图示调度器4007内的着色器 推迟/聚合器电路4706如何能够推迟与特定SIMD/SIMT线程/通道相关联的 着色器的调度直到已经发生指定的触发事件。在检测到触发事件后,调度 器4007将单个SIMD/SIMT批次中的多个聚合的着色器调遣到核心/EU 4001。
图48图示遍历/相交电路4005内的着色器推迟/聚合器电路4805如何 能够推迟与特定SIMD线程/通道相关联的着色器的调度直到已经发生指定 的触发事件。在检测到触发事件后,遍历/相交电路4005以单个SIMD/SIMT 批次将聚合的着色器提交给排序单元4008。
然而,注意,着色器推迟和聚合技术可以在诸如排序单元4008之类的 各种其他部件内实现,或者可以跨多个部件分布。例如,遍历/相交电路4005 可以执行着色器聚合操作的第一集合,并且调度器4007可以执行着色器聚 合操作的第二集合,以确保用于SIMD线程的着色器在核心/EU 4001上被 高效地调度。
用于使聚合的着色器被调遣到核心/EU的“触发事件”可以是处理事件, 诸如特定数量的累积的着色器或与特定线程相关联的最小等待时间。替代 地或附加地,触发事件可以是时间性事件,诸如从第一着色器的推迟开始 的某个持续时间或特定数量的处理器周期。其他变量,诸如核心/EU 4001 和遍历/相交单元4005上的当前工作负载,也可以由调度器4007评估,以 确定何时调遣着色器的SIMD/SIMT批次。
基于所使用的特定系统体系结构和应用的要求,可以使用上述方法的 不同组合来实现本发明的不同实施例。
光线追踪指令
下面描述的光线追踪指令被包括在CPU 3199和/或GPU 3105支持的指 令集体系结构(ISA)中。如果由CPU执行,则单指令多数据(SIMD)指 令可以利用向量/紧缩源和目的地寄存器来执行所描述的操作,并且可以由 CPU核心来解码和执行。如果由GPU 3105执行,则指令可以由图形核心 3130来执行。例如,上述执行单元(EU)4001中的任一个可以执行该指 令。替代地或附加地,指令可以由光线追踪核心3150和/或张量核心3140 上的执行电路来执行。
图49图示用于执行如下所述的光线追踪指令的体系结构。所图示的体 系结构可以被集成在上述核心3130、3140、3150(参见例如,图31和相关 联的文本)中的一个或多个内,或者可以被包括在不同的处理器体系结构 中。
在操作中,指令取得(fetch)单元4903从存储器3198取得光线追踪 指令4900,并且解码器4995对该指令进行解码。在一个实现方式中,解码 器4995解码指令以生成可执行操作(例如,微编码核心中的微操作或uop)。 替代地,可以在不解码的情况下执行光线追踪指令4900中的一些或所有, 并且因此不需要解码器4904。
在任一实现中,调度器/调遣器4905跨一组功能单元(functional unit, FU)4910-4912调度和调遣指令(或操作)。所图示的实现方式包括向量 FU 4910和标量FU4911,该向量FU 4910用于执行对存储在向量寄存器 4915中的多个紧缩数据元素进行同时操作的单指令多数据(SIMD)指令, 该标量FU 4911用于对存储在一个或多个标量寄存器4916中的标量值进行 操作。可选的光线追踪FU 4912可以对存储在向量寄存器4915中的紧缩数 据值和/或存储在标量寄存器4916中的标量值进行操作。在没有专用的FU 4912的实现方式中,向量FU 4910,且可能地标量FU 4911,可以执行下述 光线追踪指令。
各个FU 4910-4912从向量寄存器4915、标量寄存器4916和/或本地缓 存子系统4908(例如,L1缓存)访问执行光线追踪指令4900所需的光线 追踪数据4902(例如,遍历/相交数据)。FU 4910-4912还可以经由加载和 存储操作执行对存储器3198的访问,并且缓存子系统4908可以独立操作 以在本地缓存数据。
虽然光线追踪指令可用于提高光线遍历/相交和BVH构建的性能,但 光线追踪指令也可适用于其他领域,诸如,高性能计算(high performance computing,HPC)和通用GPU(general purpose GPU,GPGPU)实现。
在以下描述中,术语双字有时缩写为dw,并且无符号字节缩写为ub。 此外,下面提到的源和目的地寄存器(例如,src0、src1、dest等)可以指 向量寄存器4915,或者在某些情况下指向量寄存器4915和标量寄存器4916 的组合。典型地,如果由指令使用的源或目的地值包括紧缩数据元素(例 如,其中源或目的地存储N个数据元素),则使用向量寄存器4915。其他 值可以使用标量寄存器4916或向量寄存器4915。
去量化(dequantize)
去量化指令的一个示例使先前被量化的值“去量化”。作为示例,在光 线追踪实现中,可以量化某些BVH子树以降低存储和带宽要求。去量化指 令可以采用dequantize destsrc0 src1 src2的形式,其中源寄存器src0存储N 个无符号字节,源寄存器src1存储1个无符号字节,源寄存器src2存储1 个浮点值,并且目的地寄存器dest存储N个浮点值。所有这些寄存器可以 是向量寄存器4915。替代地,src0和dest可以是向量寄存器4915,并且 src1和src2可以是标量寄存器4916。
下列代码序列定义去量化指令的一个特定实现方式:
Figure BDA0003815892730000971
在此示例中,ldexp将双精度浮点值乘以指定的2的整数幂(即,ldexp(x,exp) =x*2exp)。在以上代码中,如果与当前SIMD数据元素相关联的执行掩码 值(execMask[i])被设置为1,则将src0中位置i处的SIMD数据元素转换 为浮点值并乘以src1中的值的整数幂(2src1值),并将该值加到src2中对 应SIMD数据元素。
选择性最小值或最大值
如由比特掩码(bitmask)中的比特所指示,选择性最小值或最大值指 令可以逐通道地执行最小值或最大值操作(即,返回一组值的最小值或最 大值)。比特掩码可以利用向量寄存器4915、标量寄存器4916或单独的一 组掩码寄存器(未示出)。下列代码序列定义最小值/最大值指令的一个特 定实现方式:sel_min_max dest src0 src1 src2,其中src0存储N个双字,src1 存储N个双字,src2存储一个双字,目的地寄存器存储N个双字。
下列代码序列定义选择性最小值/最大值指令的一个特定实现方式:
Figure BDA0003815892730000972
Figure BDA0003815892730000981
在该示例中,(1<<i)&src2(左移i的a1与src2求“与”)的值用于选择 src0和src1中的第i个数据元素的最小值或src0和src1中的第i个数据元 素的最大值。仅在与当前SIMD数据元素相关联的执行掩码值(execMask[i])) 被设置为1的情况下,才对第i个数据元素执行该操作。
混洗索引指令
混洗索引指令可以将输入通道的任何集合复制到输出通道。对于SIMD 宽度为32,该指令可以以较低的吞吐量执行。该指令采用以下形式: shuffle_index dest src0 src1<optional flag>,其中src0存储N个双字,src1 存储N个无符号字节(即,索引值),并且dest存储N个双字。
下列代码序列定义混洗索引指令的一个特定实现方式:
Figure BDA0003815892730000982
Figure BDA0003815892730000991
在以上代码中,src1中的索引标识当前通道。如果执行掩码中的第i 个值被设置为1,则执行检查以确保源通道在0到SIMD宽度的范围内。如 果这样,则设置标志(srcLaneMod),并且将目的地的数据元素i设置为 等于src0的数据元素i。如果通道在范围内(即,是有效的),则来自src1 的索引值(srcLane0)被用作对src0的索引(dst[i]=src0[srcLane])。
立即数混洗Up/Dn/XO(上/下/异或)指令
立即数混洗指令可以基于指令的立即数来混洗输入数据元素/通道。基 于立即数的值,立即数可以指定将输入通道移位1个、2个、4个、8个或 16个位置。可选地,可以将附加的标量源寄存器指定为填充值。当源通道 索引无效时,填充值(如果被提供)被存储到目的地中的数据元素位置。 如果未提供填充值,则数据元素位置被设置为全0。
标志寄存器可用作源掩码。如果用于源通道的标志比特被设置为1, 则该源通道可以被标记为无效并且指令可以继续。
以下是立即数混洗指令的不同实现方式的示例:
shuffle_<up/dn/xor>_<1/2/4/8/16>dest src0<optional src1><optionalflag>
shuffle_<up/dn/xor>_<1/2/4/8/16>dest src0<optional src1><optionalflag>
在此实现方式中,src0存储N个双字,src1存储用于填充值(如果存 在)的一个双字,并且dest存储包含结果的N个双字。
下列代码序列定义立即数混洗指令的一个特定实现方式:
Figure BDA0003815892730000992
Figure BDA0003815892730001001
在这里,输入数据元素/通道基于立即数的值被移位1个、2个、4个、 8个或16个位置。寄存器src1是附加的标量源寄存器,当源通道索引无 效时,该附加的标量源寄存器被用作被存储到目的地中的数据元素位置的 填充值。如果未提供填充值且源通道索引无效,则将目的地中的数据元素 位置设置为0。标志寄存器(FLAG)被用作源掩码。如上所述,如果用于 源通道的标志比特被设置为1,则源通道被标记为无效,并且指令继续。
间接混洗Up/Dn/XOR(上/下/异或)指令
间接混洗指令具有源操作对象(src1),该源操作对象(src1)控制从 源通道向目的地通道的映射。间接混洗指令可以采用以下形式:
shuffle_<up/dn/xor>dest src0 src1<optional flag>
其中src0存储N个双字,src1存储1个双字,并且dest存储N个双字。
下列代码序列定义立即数混洗指令的一个特定实现方式:
Figure BDA0003815892730001011
Figure BDA0003815892730001021
因此,间接混洗指令以与上述立即数混洗指令类似的方式进行操作, 但源通道向目的地通道的映射由源寄存器src1而非立即数控制。
跨通道最小值/最大值指令
可对浮点和整数数据类型支持跨通道最小值/最大值指令。跨通道最小 值指令可以采用lane_min dest src0的形式,而跨通道最大值指令可以采用 lane_max dest src0的形式,其中src0存储N个双字,并且dest存储1个双 字。
作为示例,下列代码序列定义了跨道最小值的一个特定实现方式:
Figure BDA0003815892730001022
在此示例中,将源寄存器的数据元素位置i中的双字值与目的地寄存器中的 数据元素进行比较,并将这两个值中的最小值复制到目的地标寄存器。跨 通道最大值指令以基本相同的方式操作,唯一的区别在于选择位置i中的数 据元素和目的地值中的最大值。
跨通道最小值/最大值索引指令
跨通道最小值索引指令可以采用lane_min_index dest src0的形式,而 跨通道最大值索引指令可以采用lane_max_index dest src0的形式,其中 src0存储N个双字,并且dest存储1个双字。
作为示例,下列代码序列定义了跨通道最小值索引指令的一种特定实 现方式:
Figure BDA0003815892730001031
在此示例中,目的地索引从0递增到SIMD宽度,从而跨越目的地寄存器。 如果设置了执行掩码比特,则源寄存器中位置i处的数据元素被复制到临时 存储位置(tmp),并且目的地索引被设置为数据元素位置i。
跨通道排序网络指令
跨通道排序网络指令可以使用N宽度(稳定的)排序网络按升序 (sortnet_min,排序网络_最小值)或降序(sortnet_max,排序网络_最大值) 来对所有N个输入元素进行排序。指令的最小值/最大值版本可以分别采用 sortnet_min dest src0和sortnet_maxdest src0的形式。在一个实现方式中, src0和dest存储N个双字。对src0的N个双字执行最小值/最大值排序, 并且升序元素(对于最小值)或降序元素(对于最大值)按其相应的排序顺序被存储在dest中。定义指令的代码序列的一个示例是:dst= apply_N_wide_sorting_network_min/max(src0)。
跨通道排序网络索引指令
跨通道排序网络索引指令可以使用N宽度(稳定的)排序网络按升序 (sortnet_min)或降序(sortnet_max)来对所有N个输入元素进行排序但 返回置换索引。指令的最小值/最大值版本可以采用sortnet_min_index dest src0和sortnet_max_index dest src0的形式,其中src0和dest各自存储N个 双字。定义指令的代码序列的一个示例是:dst=apply_N_wide_sorting_network_min/max_index(src0)。
在图50中图示用于执行上述指令中的任一个指令的方法。该方法可以 在上述的特定处理器体系结构上实现,但不限于任何特定处理器或系统体 系结构。
在5001处,在处理器核心上执行主图形线程的指令。这可以包括例如 上述核心中的任一个核心(例如,图形核心3130)。当在5002处确定在主 图形线程内到达光线追踪工作时,光线追踪指令被迁移到光线追踪执行电 路,该光线追踪执行电路可以是诸如以上关于图49所描述的功能单元(FU) 的形式,或者该光线追踪执行电路可以处于如关于图31所述的专用光线追 踪核心3150中。
在5003处,从存储器取得的光线追踪指令被解码,并且在5005处, 指令被解码为可执行操作(例如,在需要解码器的实施例中)。在5004处, 光线追踪指令被调度和调遣以由光线追踪电路执行。在5005处,由光线追 踪电路执行光线追踪指令。例如,指令可以被调遣到上述FU(例如,向量 FU 4910、光线追踪FU 4912等)和/或图形核心3130或光线追踪核心3150 上,并在上述FU(例如,向量FU 4910、光线追踪FU 4912等)和/或图形 核心3130或光线追踪核心3150上被执行。
当针对光线追踪指令的执行完成时,在5006处存储结果(例如,存储 回存储器3198),并在5007处通知主图形线程。在5008处,在主线程的 上下文内处理光线追踪结果(例如,从存储器读取并集成到图形渲染结果 中)。
在实施例中,术语“引擎”或“模块”或“逻辑”可以指代执行提供所描述功 能的一个或多个软件或固件程序、组合逻辑电路和/或其他合适的部件的专 用集成电路(application specific integrated circuit,ASIC)、电子电路、处 理器(共享的、专用的或成组的)和/或存储器(共享的、专用的或成组的), 或可以是上述各项的部分,或可包括上述各项。在实施例中,引擎、模块 或逻辑可以实现在固件、硬件、软件或固件、硬件和软件的任何组合中。
用于异步光线追踪的装置和方法
本发明的实施例包括固定功能加速电路和通用处理电路的组合以执行 光线追踪。例如,与包围体层次体系(BVH)的光线遍历和相交测试相关 的某些操作可由固定功能加速电路执行,而多个执行电路执行各种形式的 光线追踪着色器(例如,任何命中着色器、相交着色器、未命中着色器等)。 一个实施例包括双高带宽存储区块,其包括用于存储光线的多个条目和用 于存储BVH节点的对应双栈。在该实施例中,遍历电路在双光线区块和栈之间交替进行,以在每个时钟周期处理光线。此外,一个实施例包括优先 级选择电路/逻辑,该优先级选择电路/逻辑在内部节点、非内部节点和基元 之间进行区分,并使用该信息智能地对于对BVH节点和由BVH节点限定 的基元的处理进行优先级排定。
一个特定实施例通过在遍历操作期间使用短栈来存储有限数量的BVH 节点来减少遍历所需的高速存储器。该实施例包括栈管理电路/逻辑,用于 高效地将条目入栈到短栈和从短栈出栈,以确保所需的BVH节点可用。此 外,通过执行对跟踪数据结构的更新来跟踪遍历操作。当遍历电路/逻辑被 暂停时,它可以查阅跟踪数据结构以在BVH内它停止的相同位置开始遍历 操作,并且在数据结构跟踪中维护的跟踪数据被执行,使得遍历电路/逻辑 可以重新开始。
图51图示一个实施例,包括用于执行着色器程序代码并处理相关联的 光线追踪数据4902(例如,BVH节点数据和光线数据)的着色器执行电路 4000、用于执行遍历和相交操作的光线追踪加速电路5110、以及用于存储 由RT加速电路5110和着色器执行电路4000处理的程序代码和相关联的数 据的存储器3198。
在一个实施例中,着色器执行电路4000包括多个核心/执行单元4001, 这些核心/执行单元4001执行着色器程序代码以执行各种形式的数据并行 操作。例如,在一个实施例中,核心/执行单元4001可以跨多个通道执行单 个指令,其中指令的每个实例对存储在不同通道中的数据进行操作。在 SIMT实现方式中,例如,指令的每个实例与不同的线程相关联。在执行期 间,L1缓存存储某些光线追踪数据以供高效的访问(例如,最近或频繁访 问的数据)。
主光线的集合可被调遣到调度器4007,该调度器4007将工作调度到 由核心/EU4001执行的着色器。核心/EU 4001可以是光线追踪核心3150、 图形核心3130、CPU核心3199或能够执行着色器程序代码的其他类型的 电路。一个或多个主光线着色器5101处理主光线,并生成要由光线追踪加 速电路5110和/或核心/EU 4001执行(例如,要由一个或多个子着色器执 行)的附加工作。由主光线着色器5101或核心/EU 4001所执行的其他着色 器生成的新工作可以被分发给排序电路4008,该排序电路4008如本文所述 将光线排序到组中或排序到箱中(例如,使具有类似特性的光线成组)。然 后,调度器4007在核心/EU 4001上调度新工作。
可被执行的其他着色器包括任何命中着色器4514和最近命中着色器 4507,该任何命中着色器4514和最近命中着色器4507如上所述地处理命 中结果(例如,分别标识针对给定光线的任何命中或最近命中)。未命中 着色器4506处理光线未命中(例如,其中光线不与节点/基元相交)。如所 提及,各种着色器可以使用着色器记录来引用,该着色器记录可以包括一 个或多个指针、厂商特定元数据、和全局变量。在一个实施例中,着色器 记录由着色器记录标识符(shader record identifier,SRI)标识。在一个实 施例中,着色器的每个执行实例都与调用栈5203相关联,该调用栈5203 存储在父着色器与子着色器之间传递的变量。调用栈5121还可存储对在调 用返回时被执行的延拓函数的引用。
光线遍历电路5102使每条光线遍历通过BVH的节点,从而沿着BVH 的层次体系(例如,通过父节点、子节点和叶节点)向下工作以标识被光 线遍历的节点/基元。光线-BVH相交电路5103执行光线的相交测试从而确 定基元上的命中点,并且响应于命中而生成结果。遍历电路5102和相交电 路5103可以从一个或多个调用栈5121取回工作。在光线追踪加速电路5110 内,调用栈5121和相关联的光线追踪数据4902可以存储在本地光线追踪 缓存(ray tracing cache,RTC)5107或其他本地存储设备内,以用于由遍 历电路5102和相交电路5103进行的高效访问。下面描述的一个特定实施 例包括高带宽光线区块(例如,参见图52A)。
光线追踪加速电路5110可以是本文所述的各种遍历/相交电路的变体, 本文所述的各种遍历/相交电路包括光线-BVH遍历/相交电路4005、遍历电 路4502和相交电路4503、以及光线追踪核心3150。光线追踪加速电路5110 可代替光线-BVH遍历/相交电路4005、遍历电路4502和相交电路4503、 以及光线追踪核心3150或用于处理BVH栈和/或执行遍历/相交的任何其他 电路/逻辑被使用。因此,本文所述的与光线-BVH遍历/相交电路4005、遍 历电路4502和相交电路4503、以及光线追踪核心3150组合的任何特征的 公开也公开了与光线追踪加速电路5110的对应组合,但不限于此。
参照图52A,光线遍历电路5102的一个实施例包括第一光线存储区块 和第二光线存储区块,分别为5201和5202,其中每个区块包括多个条目, 用于存储从存储器加载的对应的多条传入光线5206。对应的第一栈和第二 栈,分别为5203和5204,包括从存储器读取并且在本地存储以供处理的所 选择的BVH节点数据5290-5291。如本文所述,在一个实施例中,栈 5203-5204是包括用于存储BVH节点数据的有限数量的条目(例如,在一 个实施例中为六个条目)的“短”栈。虽然与光线区块5201-5202分开示出, 但是栈5203-5204也可以被维护在对应的光线区块5201-5202内。替代地, 栈5203-5204可以存储在分开的本地存储器或缓存中。
当选择要处理的下一条光线和节点时,遍历处理电路5210的一个实施 例在两个区块5201-5202之间和两个栈5203-5204之间交替(例如,以 ping-pong方式)。例如,遍历处理电路5210可以在每个时钟周期上从交 替的光线区块/栈中选择新的光线/BVH节点,从而确保高度高效的操作。 然而,应当注意,该特定布置对于符合本发明的根本性原理不是必需的。
在一个实施例中,基于区块分配计数器的集合5220的当前相对值,光 线分配器5205平衡传入光线5206分别向第一存储器区块和第二存储器区 块5201-5202的进入。在一个实施例中,区块分配计数器5220维护第一存 储器区块和第二存储器区块5201-5202中的每一个中的未遍历的光线的数 量的计数。例如,当光线分配器5205将新的光线添加到第一区块5201时, 可以递增第一区块分配计数器,并且当来自第一区块5201的光线被处理时,可以递减第一区块分配计数器。类似地,当光线分配器5205将新的光线添 加到第二区块5201时,可以递增第二区块分配计数器,并且当来自第二区 块5201的光线被处理时,可以递减第二区块分配计数器。
在一个实施例中,光线分配器5205将当前光线分配到与较小的计数器 值相关联的区块。如果两个计数器相等,则光线分配器5205可以选择任一 区块,或者可以选择与上一次计数器相等时所选择的区块不同的区块。在 一个实施例中,每条光线被存储在区块5201-5202中的一个区块的一个条 目中,并且每个区块包括32个条目,用于存储最多32条光线。然而,本 发明的根本性原理不限于这些细节。
图52B图示在一个实施例中被执行以管理光线存储区块5201-5202和 栈5203-5204的四个进程5251-5254。在一个实施例中,这四个进程 5251-5254是程序代码的共同集合(本文中有时称为“TraceRay”)的不同实 现方式或配置。初始进程5251可以被执行以读取光线5261并执行从根节 点开始的BVH的新的自上而下的遍历。Alloc函数修改控制比特并启动对 光线追踪栈的对应的读取请求。具体而言,为了分配新的条目,Alloc对有 效(valid,VLD)比特进行置位,并重置驱逐就绪(Evict_Rdy)比特。在 用于光线的区块条目中,数据存在(data present,DP)比特和脏比特被重 置。对应的栈条目中的DP比特被置位。对于对应的Hitinfo(命中信息), DP比特被置位,而脏比特被重置。与节点数据相关联的DP比特和着色器 记录标识符(SRI)DP比特被重置。
实例进程5252在BVH的节点中的一个节点(除根节点外)内执行遍 历,并读取光线和先前提交的命中5262。在一个实施例中,当命中着色器 中的一个标识光线与基元之间的命中时,然后提交进程5253被执行以提交 结果,从而读取光线、潜在的命中和栈5263。替代地,执行继续进程5254 以继续遍历的光线,从而读取光线、提交的命中和栈5264。
在各种情况下,诸如当需要着色器执行操作序列时,遍历电路5002必 须暂停遍历操作并保存当前光线和相关联的BVH节点。例如,如果不透明 物体是命中或程序性纹理,则遍历电路5002将栈5203-5204保存到存储器 并执行所需的着色器。一旦着色器已经完成处理命中(或其他数据),遍 历电路5002就从存储器恢复光线区块5201-5202和栈5203-5204的状态。
在一个实施例中,遍历/栈跟踪器5248持续地监视遍历和栈操作,并 将重新启动数据存储在跟踪数组5249中。例如,如果遍历电路5002已经 遍历了节点N、N0、N1、N2和N00,并生成了结果,则遍历/栈跟踪器5248 将更新跟踪数组以指示这些节点的遍历已经完成和/或指示来自栈的下一个 要处理的节点。当遍历电路5002被重新启动时,它从跟踪数组5249读取 重新启动数据,使得它可以在正确的阶段重新启动遍历,而无需重新遍历 BVH节点中的任一个(并浪费周期)。存储在跟踪数组5249中的重新启 动数据有时被称为“重新启动路线”或“RST”。
如图52B中所指示,各种TraceRay进程5251-5254经由一个或多个函 数来管理进入光线存储区块5201-5202中和离开光线存储区块5201-5202的 分配。如针对初始进程5251所示,Alloc函数对存储区块条目中的有效比 特(VLD)(指示该条目现在包含有效的光线)置位,并重置(Rst)驱逐 就绪标志(指示不应当驱逐光线数据)。Ray函数将光线存储在所选择的 条目中,并重置数据存在(DP)比特(指示光线数据存储在条目中)和脏 比特(指示数据未被修改)。在从存储区块读取光线后,Stack函数对DP 比特置位,并从栈取回相关的BVH节点(例如,在初始进程5251的情况 下是根节点,并且在实例进程5252的情况下是另一个节点)。HitInfo函数 为初始函数5251重置脏比特并且对DP比特置位,或者为所有其他函数重 置DP比特。在一个实施例中,Hitinfo产生反映光线命中的数据。Node函 数重置DP比特和SRI(着色器记录标识符)DP,该SRI DP是用于着色器 记录标识符的DP。一个实施例执行内核开始指针(KSP)查找以确保KSP 不等于零。如果它等于零,则对非不透明的四边形实现不同的处置。
在一个实施例中,一旦已经在存储区块5201-5202中的一个中分配了 光线条目,就执行取得以从与该光线相关联的栈取回节点数据(以及潜在 地取回其他数据)。在一个实施例中,为每条光线维护栈,该栈包括用于 使该光线遍历通过的当前节点的数据的工作集合。
当移动到BVH中的下一级时(例如,在确定光线与父节点相交后), 子节点被排序并入栈到栈5203-5204上。子节点被顺序地出栈并被单独地 处理,以标识光线遍历的子节点(遍历“命中”)。在一个实施例中,每当 存在RT加速电路5110与着色器4504、4506、4507、5101、5105之间的切 换时,栈被向外存储到存储器或本地缓存/存储。
当包括四边形或三角形(或其他基元类型)的叶节点被遍历电路5102 标识时,该叶节点将此信息传递给相交电路5103,该相交电路5103分别对 四边形或三角形执行相交测试。如果基元不是四边形或三角形,则在一个 实现方式中,遍历电路终止遍历,并将控制传回最近命中着色器4507(如 果检测到命中)或未命中着色器4506(如果未检测到命中)。在其中相交 电路5103被设计为对除四边形和三角形之外的各种基元(例如,线、弧、 圆形等)执行相交的实现方式中,然后遍历电路5102将会将用于这些基元 的叶节点转发给相交电路5103。
在一个实施例中,当硬件或软件部件生成对存储器3198或缓存的读取 请求时,使用16比特标签来提供关于数据类型和请求方的信息。例如,两 比特代码可以指定请求是针对光线、栈数据、命中数据、来自BVH的节点 数据、还是任何其他类型的数据。当光线、栈和Hitinfo已经从存储器被返 回时,如上所述,使光线遍历通过一个或多个BVH节点并且执行相交测试。
在不同的处理阶段,从存储器加载一个或多个栈5203-5204和光线5206。 例如,初始进程5251和/或实例进程5252可能需要加载新的BVH以供遍 历。在这些情况下,栈5203-5204可以被初始化为BVH的顶部节点(或“根” 节点)。对于BVH内的光线延拓5254,栈5203-5204可以从存储器被加载 并被扩展。一旦栈5203-5204已被准备好,就从栈取得节点数据(有时在 下文中被称为Proc_Node_Fetch的操作)。
在一个实施例中,通过发起对两个非内部(non-internal,NI)节点和 两个内部节点的并行请求来取得节点数据。图53图示一个此类实施例,其 中NI节点优先级选择逻辑(priority selection logic,PRISEL)5311请求双 NI节点:来自区块0的第一NI节点5301和来自区块1的第二NI节点5302。 同时,内部节点PRISEL逻辑5312请求双内部节点:来自区块0的第一节 点5303和来自区块1的第二节点5304。
在一个实施例中,NI节点优先级选择逻辑(PRISEL)5311优先选择 第一NI节点5301和第二NI节点5302中的一个,从而将优先选择的结果 存储在光线追踪缓存(raytracing cache,RTC)中。类似地,内部节点PRISEL 逻辑5312请求双内部节点,并从第一内部节点5303和第二内部节点5304 选择优先选择的结果。
如果可能的话,则优先级选择逻辑5311-5312的每个实例都从不同的 区块优先选择非内部BVH节点5301-5302中的一个和内部BVH节点 5303-5304中的一个。在一个实施例中,从每个区块选择仅一个请求(例如, 请求5302和5304中的一个和请求5301和5303中的一个)。这些请求的 发起还可以重置栈数据存在(DP)比特,如所指示,使得该条目不响应于节点取得操作而被取回。在一个实施例中,对于实例取得操作,当发送实 例请求时,光线的数据存在(DP)比特被重置,并且当在节点取得之后光 线被变换时,该比特最终被置位。
在一个实施例中,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.
在一个实施例中,返回的节点数据将为节点和栈设置DP比特。
基于读取标签可以区分以下几种情况:
A.内部节点:这将写入到节点
B.实例:这将更新rt_ray.rt_ray_ctrl以用于下一级BVH(1)并写入节点结构。
i.root_node_ptr=node_return.StartNodePtr
ii.hitgrp_srbase_ptr=rt_ray_ctrl.hitgrp_srbase_ptr+ rt_ray_ctrl.srstride*node_return.instancecontributiontohitgrpindex
iii.hitgrp_sr_stride=rt_ray_ctrl.srstride*rt_ray_ctrl.shade_indx_mult
iv.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]};→四边形_模式= node_rtn.leafDesc.PrimIndex1Delta[15:0]!=‘0;
基于光线标志、实例标志和几何标志,图55A中所示的不透明/非不透 明处置表指示在取得节点数据时要使用的所得到的标志(不透明或非不透 明)。如表中所指示,光线标志始终优先。此外,状态中的一些状态是相 互排斥的。在一个实施例中,这些状态以排他比特的优先级在硬件中被处 置。在一个实现方式中,如果设置了cull_opaque(剔除_不透明)和 force_opaque(强制_不透明)两者,则相关联的几何将被自动剔除。
opaque(不透明)=rt_ray.rt_ray_ctrl.flag[0]|quad.flag[0];(请注意,针对每BVH级存储的光线已经考虑了实例标志)
nopaque(非不透明)=rt_ray.rt_ray_ctrl.flag[1]|~quad.flag[0];
图55B是示出根据一个实施例的光线标志处置和异常的表。在此,要 剔除的决定基于光线标志、实例标志和几何标志的组合。
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_opaque|cull_nopaque(剔除_不透明|剔除_非不透明)
在一个实施例中,可以如下实现基于掩码的剔除:
mask_kill(掩码_杀死)=~|(rtc_rtt_rd_rtn.mask&rtc_rtt_rd_rtn.data.mask);
图55B是示出根据一个实施例的最终剔除的表。光线标志为 (cull_opaque和force_opaque)或(cull_non_opaque和force_non_opaque), 该光线标志是互斥的。然而,在这个等式中,光线标志也考虑了可以设置 不透明/非不透明的实例标志。仅几何可以被剔除,而实例和几何两者都可 以被掩蔽。
如图56中所示,在一个实施例中,基于上述对剔除和mask_kill设置 的评估,在5601或5602处确定早出,并且在5603处将结果发送到节点存 储装置和/或在5604处将结果发送到栈。
一旦节点数据准备好,就可以执行框/相交测试。在一个实施例中,这 是通过在本文中称为Ray_Test_Proc(光线_测试_进程)的进程来实现的, 该进程具有两个运行的底层并发进程,一个用于填充四边形/实例 (quad/instance,QI),且另一个用于执行框/相交测试。在图57中所示的 一个实现方式中,Ray_Test_Proc启动优先级选择逻辑(PRISEL)5701-5702 的两个并行实例:四边形/实例PRISEL 5701,用于在来自区块0的四边形 /实例5711和来自区块1的第二四边形/实例5712之间进行请求和选择; 以及内部节点PRISEL 5702,用于在来自区块0的内部节点5713和来自区 块1的内部节点5714之间进行请求和选择。
在一个实施例中,四边形/实例优先级选择逻辑5701优先选择第一QI 节点5711和第二QI节点5712中的一个,从而将优先选择的结果存储在光 线追踪队列(ray tracingqueue,RTQ)中以供进一步处理(例如,相交测 试)。类似地,内部节点PRISEL逻辑5702优先选择在其上执行光线追踪 遍历(ray tracing traversal,RTT)框测试的内部BVH节点5713-5714中的 一个。在一个实施例中,从每个区块选择仅一个请求(例如,请求5711和5712中的一个和请求5713和5714中的一个)。这些请求的发起还可以重 置栈数据存在(DP)比特,如所指示,使得该条目不响应于节点取得操作 而被取回。在一个实施例中,对于实例取得操作,当发送实例请求时,光 线的数据存在(DP)比特被重置,并且当在节点取得之后光线被变换时, 该比特最终被置位。
作为此过程的一部分,对于在其中节点类型为非不透明的每个四边形 测试调遣,着色器记录标识符空查找表基于以下着色器记录标识符查找表 地址被调遣为无绑定线程调遣(bindless thread dispatch,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]};
在一个实施例中,包括四边形/实例(QI)解耦FIFO,以解决时间性 栈FIFO满状况并利用入栈到栈FIFO(参见例如图60中的栈FIFO 6001) 中来实现对hitinfo/光线的同步更新。这样做使得光线/hitinfo具有在后续进 程中设置的得以保证的数据存在(DP)比特。请注意,当与存储器写入发 生冲突时,光线/hitinfo可被指派固定的高优先级。
来自RTQ的返回可以在两个单独的接口上产生“实例”(例如,实例 变换)或“四边形”(即,遍历/相交测试结果)。以下是一个实施例中用 于处理结果的两个返回FIFO:
a.实例返回FIFO:更新rt_ray.rt_ray_data=rtq_rt_ray_data;ray_dirty[Entry] =1;
b.四边形返回FIFO
i.如果四边形是非不透明并且(T<Prev_T)→检查SRI_NULL_DP 以从四边形/实例(QI)解耦的FIFO出栈(从四边形/实例(QI)解 耦的FIFO读取)。请注意,在一个实施例中,从光线追踪队列(RTQ) FIFO的Hitinfo写入具有高于MemHitInfo的优先级。
1.如果(KSP_NULL=1)→将非不透明四边形视为就 像它是不透明的并且更新T
2.如果(KSP_NULL!=1)→
◆利用设置为1的有效比特将潜在的HitInfo写入到存储器。
◆从RTQ读取T、U、V、叶类型、PrimLeafIndex和正面。
◆从NodeData(节点数据)读取PrimIndexDelta、PrimleafPtr。 从光线数据更新instanceLeafPtr。
◆如以上计算的hitGroupRecPtr
ii.如果四边形为非不透明并且(T<Prev_T)→
◆利用有效=1更新提交的HitInfo。
◆从RTQ读取T、U、V、叶类型、PrimLeafIndex和正面
◆从NodeData读取PrimIndexDelta、PrimleafPtr。
◆从rt_ray.rt_ray_ctrl更新instanceLeafPtr
◆如针对以上所计算的hitGroupRecPtr
在一个实施例中,来自光线追踪遍历(RTT)框相交测试的返回可以 入栈到栈0/1(5203/5204)FIFO 6001以供进一步处理。
图58和图59A-59B图示使用“短”栈(例如,诸如栈5203或5204,其 包括有限数量的本地栈条目)的BVH-光线处理的示例。短栈用于结合智能 节点管理技术保存高速存储以提供高度高效的遍历操作序列。在所图示示 例中,短栈5203包括用于六个BVH节点的条目。然而,本发明的根本性 原理可以使用各种大小的短栈来实现。
操作5949-5972在BVH遍历期间使栈条目进栈和出栈。在一个实施例 中,操作5949-5972由栈处理电路5120(参见图51)在栈5203上执行。 示出特定的遍历序列,该遍历序列以BVH层级0处的根BVH节点N 5900 开始。
在5949处,栈5203用节点N初始化,栈5203随后从栈出栈并被处理, 从而导致命中H0-H2,命中H0-H2包括位于BVH的层级1的子节点N0-N2 5901-5903(即,“命中”意味着光线遍历三个子节点N0-N2 5901-5903)。 三个子节点命中5901-5902基于命中距离进行排序,并以排序顺序在栈5203 上入栈(操作5950)。因此,在该实施例中,每当评估一组新的子节点时, 这组组新的子节点基于命中距离被排序,并以排序顺序写入栈5203(即, 更接近的子节点位于栈的顶部)。
第一子节点N0 5901(即,最近的子节点)从栈5203出栈并被处理, 从而导致在BVH的层级2(“层级”有时称为BVH节点的“深度”)处的三 个更多子节点命中N00-N02 5911-5913,这些子节点命中被排序并入栈到栈 5203(操作5951)。
子节点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上为新节点腾出空间。
在一个实施例中,每当从短栈5203移除节点时,就将该节点保存回存 储器。该节点将随后将在稍后的时间(例如,当到了根据遍历操作处理节 点的时候)被重新加载到短栈5203。
处理在图59A上继续,其中节点N00001和N00002在BVH的层级5 处出栈并被处理(操作5955-5956)。处于层级4的节点N0001、N0002、 N0003和N0004随后出栈并被处理(操作5957-5960),从而产生空的短 栈5203。
因此,出栈操作导致根据重新启动路径(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没有导致命中)。
如所提及,遍历跟踪器5248的一个实施例更新跟踪数组5249,该踪 数组5249标识当前正被遍历的BVH层次体系的每一层级中的子节点/子树。 在一个实现方式中,跟踪数组5249的长度等于BVH的深度(在所示示例 中为6),并且跟踪数组5249中的每个条目包括标识当前正被遍历的子子 树(child subtree)的索引值。在一个特定实现方式中,对于N宽度的BVH (即,其中每个内部节点引用N个子节点),跟踪数组5249中的每个条目 包括用于标识子节点/子树的log2(N)比特值。在一个实施例中,被指派了小 于当前子索引的索引的子节点/子树已经被完全遍历并且因此在重新启动的 情况下将不会被重新访问。在一个实施例中,当最后一个相交的子被遍历 时,子索引被设置为最大值以指示栈上没有更多的条目。
短遍历栈5203可以将栈的顶部几个条目存储在循环数组中。在一个实 现中,短遍历栈5203中的每个栈条目包括到节点的偏移、诸如节点类型(内 部、基元、实例等)之类的混杂信息、以及指示该子是否是父节点中最后 一个(最远的)相交子节点的一个比特。然而,这些具体细节对于遵守本 发明的根本性原理不是必需的。
图60图示用于执行如上所述的栈管理和遍历操作的栈处理电路/逻辑 5120的一个实施例。栈FIFO 6001加载有需要处理的任何子BVH节点6000。 例如,当由遍历处理电路5210完成框测试或四边形测试时,结果入栈到栈 FIFO 6001中并用于更新栈5203。这可以包括例如对命中信息的更新,该 命中信息诸如,与特定命中相关联的子节点的集合6000。
栈处理电路/逻辑6003从栈5203读取条目,其中处理每个条目所需的 数据包括关于BVH节点是内部节点还是叶节点的指示以及相关联的索引 数据。如果节点是叶节点/四边形,则数据可以包括四边形描述符和索引以 及着色器索引数据。栈处理电路/逻辑6003随后执行本文描述的栈处理操作, 诸如,标识与命中相关联的新节点并基于命中距离对节点进行排序。尽管 被示为单独的实体,但栈处理电路/逻辑6003可以集成在遍历电路5102内。
如所指示,栈处理电路/逻辑6003在其完成处理来自栈5203的每个 BVH节点时生成栈更新6011。例如,在从栈5203读取条目之后,栈处理 电路/逻辑6003可以更新各种控制比特,诸如,数据存在(DP)比特和有 效(VLD)比特。图60图示驱逐就绪和数据存在比特6010被设置。也可 以将相应的栈更新6011发送到栈5203(例如,允许旧条目被移除以为新的 子节点腾出空间)。
可以经由仲裁电路6012控制栈更新,该仲裁电路6012在以下操作之 间进行选择:用当前处理更新6011来更新栈5203、用一个或多个新BVH 子节点从存储器填充栈5203(MemFill,存储器填充)、以及执行从存储 器到栈的初始分配(例如,从根节点和一个或多个子节点开始)。
在一个实施例中,当在栈上处理四边形/实例/内部节点时,可以执行以 下操作中的一项或多项:
i.由于多种状况(诸如,向下移动用于新BVH的实例,处理命中程序、 任何命中着色器等)而驱逐栈条目。
ii.如果栈由于命中程序和/或任何命中着色器而被驱逐,则解除分配光 线条目。
iii.如果该栈由于命中程序和/或任何命中着色器而被驱逐,则解除分配 缓存条目。
iv.如果光线需要经由实例叶向下传递到新的BVH,则更新光线控制(仅 BVH)。
图61A-图61B图示用于为所有光线追踪遍历结构配置读取/写入端口 并设置控制比特的表。具体地,针对光线6101、命中6102和栈6103示出 示例子结构、垂直结构和读取/写入动作。然而,要注意本发明的根本性原 理不限于这些特定的数据结构/操作。
用于高质量光线追踪的细节层级转变的设备和方法
在图形处理体系结构上,“细节层级”(LOD)可以指基于变量(诸如, 距相机的距离)的网格分辨率的选择。LOD技术用于减少存储器消耗并改进 图形处理功能,诸如,游戏中的几何混叠。例如,当网格远离用户的当前视角 时,可能不需要高分辨率网格的细节。
在基于栅格化的实现方式中,可以使用“随机LOD”技术实现各LOD之间 的平滑转变,诸如Lloyd等人的Implementing Stochastic Levels of Detail with MicrosoftDirectX Raytracing(使用Microsoft DirectX光线追踪实现随机细节层 级)(2020年6月15日)中所述。在没有这些随机技术的情况下,各LOD 之间的转变可导致分散伪像,其中当新的LOD被选择时,对象在外观上突然 变化。使用随机LOD,通过像素向转变中所涉及的LOD中的一个LOD(例如, 较高分辨率或较低分辨率LOD)的随机指派来执行LOD层级之间的淡入淡出 (cross-dissolve)。
当从第一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)的随机选择。然而,由于仅选择了8个比特中 的一个比特,因此在LOD0和LOD1之间的转变仅有8个中间步骤。
如图62中所示,在本发明的一个实施例中,LOD选择器6205设置有N 比特比较操作掩码6220,该N比特比较操作掩码6220被视为用于确定要执行 的比较操作的二进制值。所选择的比较操作用于与参考进行比较,以允许更多 的转变LOD步骤。在一个实施例中,比较操作选自小于或等于(less_equal) 和大于(greater),但是本发明的根本性原理不限于这些特定的比较操作。在 一个实现方式中,使用8个比特(N=8),其中这些比特中的7个比特定义[0..127] 范围内的无符号整数值,从而启用用于LOD交叉淡变的128个转变步骤,并且1个比特指示比较操作(例如,如果设置为0,则执行less_equal操作,并 且如果设置为1,则执行大于操作)。在一个实施例中,还可以在[0..127]范围 内将光线比较掩码6221提供给LOD选择器6205作为附加光线参数。
在一个实施例中,以下代码序列突出显示了光线遍历如何对这个新的比较 掩码做出反应:
Figure BDA0003815892730001201
Figure BDA0003815892730001211
在上面的代码序列中,第一个IF语句测试二进制掩码是否允许遍历到当 前实例中。如果是,则第二个IF语句根据实例比较掩码(例如,比较操作掩 码6220)和光线比较掩码6221的值来测试比较模式设置。
回到上面的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(指示大于操作)。 因此,对于该实现方式,如果在[0..127]范围内生成均匀分布的随机数作为光 线比较掩码,则存在可以由LOD选择器6205选择的最多127个转变步骤以用 于在LOD0和LOD1之间进行转变。
尽管上述具体细节用于解释的目的,但本发明的根本性原理可以用其他细 节来实现。例如,还可以替代或附加于less_equal和大于来使用其他比较运算 符。例如,还可以使用比较运算符,诸如,not_equal(不等于)、equal(等于)、 less(小于)和greater_equal(大于等于)。一个实现方式包括光线标志和实 例标志,其禁用经“与”运算的光线掩码并启用这些比特作为比较掩码的使用。
本发明的实施例包括固定功能加速电路和通用处理电路的组合以执行光 线追踪。例如,与包围体层次体系(BVH)的光线遍历和相交测试相关的某些 操作可由固定功能加速电路执行,而多个执行电路执行各种形式的光线追踪着 色器(例如,任何命中着色器、相交着色器、未命中着色器等)。一个实施例 包括双高带宽存储区块,其包括用于存储光线的多个条目和用于存储BVH节 点的对应双栈。在该实施例中,遍历电路在双光线区块和栈之间交替进行,以 在每个时钟周期处理光线。此外,一个实施例包括优先级选择电路/逻辑,该优 先级选择电路/逻辑在内部节点、非内部节点和基元之间进行区分,并使用该信息智能地对于对BVH节点和由BVH节点限定的基元的处理进行优先级排定。
加速数据结构压缩
加速数据结构的构建是高效光线追踪渲染中最重要的步骤之一。近来,本 文广泛描述的包围体层次体系(BVH)加速结构已成为用于此目的的最广泛使 用的结构。BVH是分层式树结构,其用于在空间上索引和组织几何,使得可 以非常高效地解决光线/基元始相交查询。解决这些查询的能力是用于光线追踪 渲染的最关键的操作之一。尽管下面描述的本发明的实施例在BVH结构上操 作,但是本发明的根本性原理不限于BVH。这些实施例可以应用于具有类似 相关特征的任何其他加速数据结构。
产生BVH通常称为“构造”或“构建”BVH。尽管已经提出了多种BVH构建 算法,但主要使用自上而下的BVH构建器以实现针对实时和离线渲染应用两 者的高渲染效率。自上而下的BVH构建算法典型地在构造期间维护一个或多 个临时数组。这些数组保存对于对几何进行排序/组织以产生BVH结构必要的 数据。这些数组在构建期间被多次读取和/或写入(典型地,针对BVH层次体 系的每个层级1-2次)。由于这些数组通常具有相当大的大小,因此该过程是 带宽密集型的。因此,如果不解决此带宽问题,则BVH构建计算性能的改进 (诸如,从硬件BVH构建器可能期望的)可能仅具有有限的影响。
本发明的一个实施例包括用于由许多自上而下的BVH构建器维护的临时 数据的压缩方案。这种压缩方案的目的是减少BVH构造所需的带宽,从而实 现更快且更高效的BVH构造。然而,请注意,本发明的实施例可以用于其他 种类的BVH构建器并且与其他类型的加速数据结构(kd树(kd-tree))一起 使用。
许多自上而下的BVH构建器在BVH构建期间维护两种主要类型的数据: (1)BVH构建中涉及的用于每个基元的轴对齐的边界框(axis aligned bounding box,AABB);(2)与每个基元相关联的无符号整数索引,该索引指向这些AABB 中的一个,和/或指向从其产生AABB的原始基元。
本发明的一个实施例利用数组结构(Structure of Arrays,SOA)布局来将 每个AABB与单个整数索引组合。AABB被维护在一个数组中,并且整数索 引被维护在第二数组中。仅索引数组必须被重新排序以实现BVH构造。以这 种方式存储构建数据带来许多优势。在该布局方案中,AABB数据大部分是只 读的,并且对于大多数构建过程而言不引发AABB写入带宽。
通过使用SOA结构,仅AABB需要在构建期间不频繁地被压缩。事实上, 取决于实现方式,AABB数据可能仅需要在构建之前被压缩一次作为预处理。 由于构建通过对索引数组进行分区来执行,因此本发明的一个实施例在构建的 每一层级处重新压缩这些AABB。
通过对这些数组的压缩版本而不是对其传统的未经压缩对应物进行操作, BVH构建所需的带宽被减少。数组的经压缩版本被临时地存储,并且仅用于 构建的目的。一旦构建完成,它们就会被丢弃,从而留下引用基元的原始输入 列表的BVH。
本文描述的压缩技术的重要特性在于,这些压缩技术是缓存行感知的。这 两个经压缩阵列都被存储为具有固定大小的压缩块的数组,其中大小是缓存行 的整数。此数字大于或等于一。两种类型的数组中的每一种的压缩块不需要是 相同的大小。这两种类型的块在本文中被称为AABB压缩块和索引压缩块。
注意,本发明的根本性原理不要求块的大小是缓存行的整数。相反,这是 本文描述的若干可选特征之一。在下面描述的一个实施例中,该功能分别由表 B和表D中的变量AABBCompressionBlockSizeBytes和 IndexCompressionBlockSizeBytes控制。
由于每个节点的空间范围和由每个节点引用的基元的数量通常将随着自 上而下的构建从树结构的根向叶进行而减少,因此AABB的不同表示在构建的 不同阶段可以是适当的。例如,经压缩的AABB的准确性在树的较高层级处可 能较不关键,而在较低层级处可能需要更精确的表示来维持合理的树质量。因 此,在树的根附近使用有损压缩以最大化带宽节约并切换到针对较低层级的基 元的未经压缩的、无损表示可能是足够的。这将BVH构建分为图63中图示的 至少两个阶段:顶部阶段6301,用于层次体系的指定层级处或层级以上的节点 (节点0、1、8);以及底部阶段6302,用于指定层级以下的节点(节点2-7、 9-14)。多级构建可以这样的方式继续进行,即在构建较低层级中的任何节点 之前构建整个较高层级层次体系(例如,图63中的“顶部”部分),或者层级 的构建可以交错。如果较高层级完全在任何较低层级之前被构建,则必须在构 建的较低层级处拆分的节点可以被存储在诸如队列之类的结构上,以便在稍后 阶段被分区。
作为将AABB的全精度副本用于较低层级6302的替代方案,该方案的另 一个变体是在构建期间“重新压缩”AABB以用于构建较低层级。通过这样做, 几何可以相对于各个子树的范围被压缩。由于与根节点相比,各个子树通常表 示较小的空间范围,因此这可有益于经压缩的表示的准确性或有益于压缩效率。 在当前的研究中观察到用于多层级压缩构建的类似模式。可以根据各种节点特 性来定义不同构建阶段之间的划分6300。一个实施例使用固定数量的基元来充 当阈值。
在本发明的一些实施例中使用的变体替代地选择仅采用单层级构建。例如, 构建数据的单个经压缩的表示可用于构建整个树。
I.AABB压缩
在本发明的一个实施例中,AABB压缩逻辑(可以以硬件和/或软件来实 现)的输入是未经压缩的基元的数组,并且输出是固定大小的AABB压缩块的 数组并与某个数量的缓存行对齐。由于在网格的任何特定区域处的有效AABB 压缩率高度依赖于数据,因此一个实施例逐AABB压缩块对可变数量的AABB 打包。
如图64所示,压缩块6400的一个实施例被组织成两个主要部分:MetaData (元数据)6401和向量残差6402。元数据6401提供将向量残差6402解码为 AABB列表所需的每块信息和常量。向量残差6402存储用于表示AABB的大 部分经压缩的信息。在下文中更详细地描述这些元素中的每一个。
简而言之,在一个实施例中,使用增量(delta)压缩。seedVector(种子 向量)包括AABB值的基线集合,并且向量残差6402提供至这些基线值的偏 移以重构每个AABB。numResiduals(数量残差)值指定向量残差6402的数量, 并且residualSizeVector(残差大小向量)指定残差6402的大小。
AABB全局压缩常量
除了存储在每个压缩块6400中的每块常量之外,一组AABB全局压缩常 量可以存储与整个压缩过程中的所有块有关的信息。对于一个特定的实现方式, 这些信息总结在表B中。
Figure BDA0003815892730001251
表B
AABB压缩流
AABB压缩过程的一个实施例涉及依次迭代通过输入基元数组,并输出 AABB压缩块6400的数组。输出数组包含以压缩形式表示基元的AABB所需 的最小数量的AABB压缩块6400。
图65图示根据一个特定实施例的过程。如所提及,压缩过程不限于任何 特定的体系结构并且可以以硬件、软件或其任何组合来实现。
在6501处,提供用于BVH构建的基元的数组。在6502处,选择数组中 的下一基元(例如,第一基元在过程的开始处)并评估其AABB以进行压缩。 如果在6503处(例如,基于最大/最小数据)确定AABB适配在当前压缩块内, 则在6504处,将AABB添加到当前压缩块。如所提及,这可以包括通过计算 到压缩块内的现有基向量(例如,种子向量)的距离来确定针对AABB的残差 值。
在一个实施例中,如果基元的AABB不适配在压缩块内,则当前压缩块 在6510处被最终确定,并且当前压缩块在存储器中被存储在输出数组内。在 6511处,使用基元的AABB来初始化新的压缩块。在一个实施例中,基元AABB 被用作用于新压缩块的种子向量。然后可以基于到新种子向量的距离为基元的 后续AABB生成残差。在一个实现方式中,针对第二AABB生成的第一残差 基于到种子向量值的距离值来确定。随后,针对第三AABB的第二残差基于到 第一残差的距离值来确定。因此,存储运行差异,如下面更详细地所描述。一 旦当前基元被压缩,该过程就返回到6502,在6502处,选择数组中的下一基 元以进行压缩。
因此,依次访问每个基元,其AABB被确定(例如,作为浮点值)。然 后对AABB执行一系列操作以实现压缩,并将经压缩的结果添加到输出数组中 的当前AABB压缩块中。如果经压缩的AABB适配,则将其添加到当前块, 并且该过程移动到下一AABB。如果AABB不适配,则最终确定当前AABB 压缩块,并在输出数组中初始化新的AABB压缩块。以此方式,存储AABB所需的压缩块的数量被最小化。
下面表C中的伪代码显示根据本发明一个特定实施例的AABB压缩的流 程。然而,请注意,本发明的根本性原理不必限于这些细节。
如伪代码序列中所示,对于每个AABB压缩块,将整数写入单独的数组(blockOffsets)中,该数组记录原始基元数组中的、每个AABB压缩块开始 的的位置(即,原始基元阵列所包含的第一基元AABB)。在构建期间使用blockOffsets(块偏移)数组来解析压缩块表示的原始基元ID。
AABB残差计算
在一个实施例中,每个输入AABB在将其添加到压缩块之前经过一组阶 段以对其进行压缩,从而产生图64中所示的向量残差。该过程被捕捉为表C 的第26行上的代码,其中CompressionCore(压缩核心)用于将AABB转换为 经压缩的向量的列表。
Figure BDA0003815892730001271
表C
在一个实施例中,AABB的压缩发生在以下阶段:(1)量化,(2)变换, 和(3)预测/增量编码。
1.量化
在一个实施例中,浮点AABB值首先使用针对每轴的固定数量的比特被 量化为无符号整数表示。该量化步骤可以以多种方式来执行。例如,在一个实 现方式中,针对每个轴i确定以下值:
Li=Smax,i-Smin,i
Figure BDA0003815892730001281
VUmin,i=(VFmin,i-Smin,i)/Li×NB,i
VUmax,i=(VFmax,i-Smin,i)/Li×NB,i
其中Smin和Smax是要为其构建BVH的整个几何集的最小和最大坐标,NB,i是第 i轴中经量化的网格中的单元的数量,NQi对应于表B中的值,VUmin和VUmax是经量化的AABB的最小和最大坐标,VFmin和VFmax是原始浮点AABB的最 小和最大坐标,并且下标i表示给定轴(i∈{x,y,z})。由于任何浮点计算都 可能引入误差,因此中间值应向上或向下舍入以最小化VUmin的值并最大化 VUmax的值。这些值也可以被转换为整数并被钳制到有效范围,以确保水密性 AABB驻留在整个几何集的AABB内。
Smin和Smin也可以表示几何子集的范围(例如,较大BVH内的子树)。 例如,这可能发生在如根据图63的多级压缩构建中。
2.变换
在一个实施例中,实现了变换阶段,其中数据被变换成更易于压缩的形式。 尽管可以使用多种变换,但本发明的一个实施例采用在本文中称为位置-范围 变换的新颖变换,其将VUmin和VUmax组合成针对每基元的单个6维(6D)向 量VT,如下所示:
Ex=VUmax,x-VUmin,xEy=VUmax,y-VUmin,yEZ=VUmax,z-VUmin,z
VT=(VUmin,x,VUmin,y,VUmin,z,Ex,Ey,Ez)
其中,VUmin{x,y,z}和VUmax{x,y,z}分别是VUmin和VUmax的分量。本质上,这种 变换允许在剩余的压缩阶段中分别处理AABB的位置和范围/大小特性。如所 提及,也可以使用其他变换。
3.预测/增量编码
在一个实现方式中,传统的增量编码技术用于实现良好的压缩性能。在一 个实施例中,每个压缩块中的第一向量被指定为“种子”向量并逐字地被存储在 AABB压缩块6400中,如图64所示。对于后续向量,存储值的运行差异(即, 残差6402)。这对应于预测方案,其中对序列中下一输入向量的预测始终是 前一个输入向量,并且残差值是当前输入向量与前一个输入向量之间的差。本 实施例中的残差值6402因此是有符号值,这需要附加的符号比特。可使用各 种其他预测/增量编码,同时仍符合本发明的根本性原理。
一个实施例存储具有最小数量的所需比特的残差值6402,以便最大化压 缩。基于残差编码步骤结束时残差值的大小,针对向量维度中的每个向量维度 都需要一定数量的比特,以适应在该维度中遇到的值的范围。
所需的比特数存储在残差大小向量(Residual Size Vector,RSV)中,如 图64中的元数据6401中所示。RSV对于给定的压缩块6400是固定的,并因 此。特定块的给定维度中的所有值将相同数量的比特用于它们的残差6402。
RSV的每个元素中存储的值仅是将维度中的整个残差值范围存储为有符 号数所需的最小比特数。在压缩给定的AABB压缩块(即,表C的第18至37 行)时,保持了用于容纳到目前为止所看到的所有向量所需的运行的最大比特 数。RSV是针对每个新添加的AABB(即,CommitToBlock,表C的第32行) 确定的,并被存储在压缩块的元数据中。
为了测试新的AABB是否适配当前块(即,TestAddToBlock,表C的第 28行和图65中的操作6503),我们计算通过添加新AABB将出现的预期的新 RSV,对预期RSV向量求和,并随后将该值乘以在新AABB被添加的情况下 该块中将存在的残差总数。如果该值在可用于存储残差的预算内(即,小于或 等于总块大小减去元数据6401大小),则可以将其添加到当前块中。如果不 在预算内,则初始化新的压缩块。
熵编码
本发明的一个实施例包括对AABB残差计算的附加步骤,该附加步骤包 括在预测/增量编码之后对残差进行熵编码。本发明的根本性原理不限于该特定 实现方式。
预排序/重新排序能力
作为可选的预处理,可以对输入几何进行排序/重新排序以改善空间一致 性,这可以改善压缩性能。可以通过多种方式执行排序。实现此排序的一种方 法是使用MortonCode(莫顿代码)排序。此类排序已经在其他BVH构建器 中用作主要步骤,以在提取层次体系之前促进几何中的空间一致性。
经压缩的AABB可以按任何期望的顺序写入,但如果AABB被重新排序/ 排序,则需要存储记录排序顺序的附加的整数数组。该数组由针对每基元的单 个整数索引组成。构建可以使用用于引用经重新排序的基元列表的主索引而继 续进行。当需要原始基元ID时(诸如,当叶节点的内容正在被写入时),我 们必须使用主索引在附加数组中查找原始基元ID,以确保树正确地引用原始 输入几何列表。
II.AABB解压缩
在一个实施例中,一次针对整个AABB压缩块6400执行对AABB的解压 缩。首先通过检查压缩块6400的元数据6401并基于该信息解释所存储的残差 (例如,将距离值添加到种子向量和序列中的先前残差值)来重构残差数据。 随后执行AABB压缩阶段中的每一个压缩阶段的逆以对由压缩块表示的单精 度浮点AABB进行解压缩。
一个实施例在BVH构建器的情况下实现解压缩步骤的变体,该构建器采 用与经压缩的层次体系输出对齐的降低精度的构建技术。在已转让给本申请的 受让人的、于2020年1月17日提交的序列号为16/746,636的题为“An Architecture for Reduced PrecisionBounding Volume Hierarchy Construction(一 种用于降低精度的包围体层次体系的体系结构)”的共同未决申请中描述了此 类降低精度的构建器。降低精度的构建器在降低精度的整数空间中执行其计算 中的许多计算。因此,本发明的一个实施例将本文描述的AABB残差计算的量 化步骤与在降低精度的构建器中所采用的量化对齐。随后可以将AABB仅解压 缩为整数,与当前正由降低精度的构建器处理的无论什么节点的坐标空间对齐。 类似的变体可以用不输出经压缩的层次体系但执行顶点的量化的构建器来实 现。
III.索引压缩
在本发明的一个实施例中,索引数组被压缩成索引压缩块的数组。图66 图示包括元数据6603和索引残差6602的索引压缩块6610的一个实施例。索 引数组不同于AABB数组,因为索引阵列必须被重新压缩,因为索引在构建过 程期间被分区/重新排序。
在许多传统的BVH构建器中,索引被表示为无符号整数,通常针对每基 元具有一个索引。索引数组的目的是指向基元AABB。每个AABB/基元可以 在存储器中被分配固定大小。因此,随机访问数组中的任何特定基元p或AABB a是可能的。然而,当AABB压缩导致针对每缓存行的可变数量的AABB时, 存储给定基元的AABB压缩块在压缩后不容易被确定。因此,存储传统索引与 本文描述的AABB压缩块不兼容。
在本发明的一个实施例中,用于标识基元AABB的位置的索引技术也允 许对索引本身的压缩。下面将两种新颖的技术称为块偏移索引(Block Offset Indexing,BOI)和分层式比特向量索引(Hierarchical Bit-Vector Indexing,HBI)。 这些索引实现方式可以在本发明的各实施例中单独地或组合地使用。此外,如 根据图63,这两种索引技术可以用作多级构建的一部分,并且这两种类型的索 引也可以用作同一BVH构建的一部分。这些索引技术允许BVH构建以与传统 BVH构建器类似的方式进行,但具有AABB和对应的索引数组两者的经压缩 的表示。
全局索引压缩常量
索引压缩采用适用于所有索引压缩块的一组全局索引压缩常量。下面描述 的两种索引压缩方案共享相同的全局常量,这些全局常量总结在下表D中。
Figure BDA0003815892730001311
Figure BDA0003815892730001321
表D
块偏移索引
在块偏移索引(BOI)中,常规单整数索引被改变为包含两个整数的结构, 其中一个整数标识压缩块6400,并且其中一个包括用于标识压缩块6400内的 基元AABB数据的偏移。新数据结构的一个实施例是根据以下代码序列生成的:
Figure BDA0003815892730001322
这里,blockIdx(块索引)存储对AABB压缩块的索引,并且blockOffset(块 偏移)引用块内的特定基元AABB(即,blockIdx与blockOffset结合提供基元 AABB的地址)。此信息足以在构建期间完全引用AABB压缩块内的特定 AABB。
在一个实施例中,为BVH构建中的每个基元生成这些结构之一,因此列 表的大小是可预测的。然而,给定针对每AABB压缩块的可变数量的AABB, 对于这些压缩块中的每一个压缩块,将存在可变数量的这些索引结构(例如, 对于每个AABB压缩块,并非blockOffset的所有可能的值都将存在)。因此, 为了正确地初始化块偏移索引的数组,有必要参考blockOffsets数组(例如, 参见表C中的代码序列),通过该blockOffsets数组可以与AABB压缩同时地、 或作为AABB压缩的子过程而确定每个AABB压缩块中的基元的数量。一旦 被初始化,块偏移索引就可以以与传统BVH构建器中所发现的传统索引基本 相同的方式来被处理。
传统BVH构建器中使用的单整数索引的大小典型地为4个字节。在一个 实施例中,26比特用于blockIdx,并且6比特用于blockOffset。在替代实施例 中,针对每个变量使用较少数量的比特以减少总体存储器占用空间(footprint)。 在一个实施例中,由于必须选择用于blockOffset的固定大小,这对每AABB 压缩块的基元的最大数量作出限制。在6比特的情况下,针对每AABB压缩 块可以表示最多64个基元。
块偏移索引要解决的剩余项目是压缩可以如何被实现。块偏移索引被增量 编码并按顺序打包到索引压缩块中。每个块都被打包有尽可能多的索引,并且 每当前一个块达到容量时新的索引压缩块就被启动。这以与AABB压缩块非常 类似的方式执行(如表C中所示),从而导致针对每索引压缩块的可变数量的 索引。
图66图示块偏移索引压缩块6610的一个示例,该块偏移索引压缩块6610 包括元数据6603,该元数据6603除了残差大小向量和种子向量之外还标识索 引的数量。在一个实施例中,将双通道编码用于索引残差6602,其中blockIdx 和blockOffset值被分别进行增量压缩。与AABB压缩块类似,索引压缩块6610 存储以下各项的指示:块中索引的数量、用于残差的比特数(作为残差大小向 量)、以及包括用于blockIdx的第一种子向量和用于blockOffset的第二种子 向量的种子向量。索引残差值6602包括由压缩产生的差值对。例如,索引残 差值可以包括:表示当前输入blockIdx值和先前输入blockIdx值之间的差的第一差值、以及表示当前输入blockOffset值和先前输入blockOffset值之间的差 的第二差值。序列中的第一blockIdx值和blockOffset值被逐字地存储在 seedVector字段中,该字段表示从其计算第一残差值的向量。
分层式比特向量索引
本发明的一个实施例使用被称为分层式比特向量索引(Hierarchical Bit-Vector Indexing,HBI)的另一基元索引压缩技术,其可以单独使用或与块 偏移索引(BOI)结合使用。HBI不像传统的整数索引和BOI两者,因为单个 HBI索引可以一次引用多个基元。事实上,HBI索引可以引用最多整个AABB 压缩块。
这种类型的索引的扩展结构如图67A-图67B中所示。每个HBI索引6700 由两个元素组成。blockIdx 6708指向给定的AABB压缩块,其起到与块偏移 索引中的对应元素相同的作用。第二分量是比特向量6701,其具有等于AABB 压缩块中允许的AABB的最大数量(即maxAABBsPerBlock)的比特数。比特 向量6701中的每个比特表示AABB压缩块中的对应元素是否由该索引引用。 例如,如果比特向量中的第三比特是“1”,则这表示AABB压缩块的第三AABB/ 基元由HBI索引引用。如果该比特为“0”,则该AABB/基元未被引用。
与BOI索引相比,每AABB压缩块的单个HBI索引6700在数组被初始 化时被创建。blockIdx值6708设置为从0开始的递增值,并且初始比特向量 6701设置为全1。由于分区发生在自上而下的构建器中,因此如果由给定HBI 索引6700所引用的所有基元都位于拆分平面的同一侧上,则可以简单地按原 样分将索引分区到列表的一侧中,类似于传统的整数索引。然而,如果HBI 索引6700引用拆分平面的两侧上的基元,则该索引必须被拆分成两个新的 HBI索引,其中一个HBI索引被放置在与左分区和右分区对应的两个新索引子 列表中的每一个中。为了拆分HBI索引,索引被复制,并且在索引的每个副本 中更新比特向量6701以反映由两个新索引引用的基元。这意味着数组中的 HBI索引的数量可以增长,并且索引的复制与在一些传统的BVH构建器中处 置空间拆分的方式有些类似。处置潜在增长的列表的简单方法是仅分配“最坏 情况”的存储器量。
可以使用对blockIdx分量6708的增量压缩将HBI索引6700打包到索引 压缩块中。此外,HBI索引还提供分层式压缩机会,这些HBI索引通过该分层 式压缩机会导出它们的名称。任何不跨越拆分平面的HBI索引都将使其比特向 量的所有元素都等于“1”。当将HBI索引打包到索引压缩块中时,可以使用单 比特标志(在本文中有时被称为比特向量占用标志)来指示整个比特向量是“全 1”。值“0”指示比特向量被逐字地存储在块中,并且值“1”指示向量是“全1”并 因此根本不被存储(除了标志之外)。因此,HBI索引从两种技术导出压缩: 增量编码和分层式比特向量。像BOI索引一样,HBI索引也以与AABB压缩 块非常类似的方式被打包到压缩块中。为了正确地执行此操作,压缩操作还必 须监视索引比特向量以决定是否必须逐字地存储任何比特向量,并将这一点纳 入针对块的所需的大小的考虑因素。
图67B示出可如何将HBI索引的序列编码到包括残差数据6704和元数据6701的HBI压缩块6710中。在这个实施例中,残差数据包括blockIdx残差6702 和分层式成员比特向量6703。如根据图63的多级构建情况,HBI索引旨在在 层次体系的顶部附近运行,或者在AABB压缩块最近已针对其被重新压缩的子 树的顶部附近运行。这是因为与其他索引方法相比,通过改变AABB压缩块中 的空间相干性更直接地影响HBI指数。事实上,虽然HBI索引提供压缩,但 最坏情况的情形实际上可导致索引数据的扩展(向上达到上界)。在构建过程 中转变到块偏移索引(BOI)或传统的整数索引可以避免这种情况,并且如果 最近尚未执行重新压缩,则可能会更有效。
构建层级之间的索引转变
如果在BVH构建中使用了BOI或HBI索引,并且构建转变到另一阶段(如 根据图63的多层级构建情况),则将有必要将索引解码为适合用于下一构建 阶段的形式。例如,在将块偏移索引用于树的较高层级并从经压缩的AABB 表示转变到传统的AABB表示的简单情况下,将有必要将块偏移索引解码为传 统的整数索引。块偏移索引可以在转变后被丢弃。
对于HBI索引,以及对于在采用不同的AABB压缩配置的两个经压缩的 构建层级之间的转变,将需要发生类似的转变。转变过程相对简单,因为块偏 移索引和分层式比特向量索引两者表示相同的基础信息的替代编码,并且还可 以始终被解码为引用原始基元集的传统整数索引。
对经压缩的索引数组进行分区
在自上而下的BVH构建中,有必要对整数索引列表进行分区/排序,以便 在构建期间递归并且进行索引排序以反映树结构。在传统的BVH构建器中, 此步骤是直接的,因为索引是常规的未经压缩的数据结构。然而,本文描述的 本发明的实施例导致新的挑战,因为必须对索引压缩块列表而不是索引列表进 行分区。此外,预测块的数量是不太可能的,直到所有索引都被压缩之后。由 于在每个分区步骤后重新压缩索引,因此在整个构建过程中都存在这一挑战。
虽然提前预测经压缩索引数组的大小是不太可能的,但如果我们知晓要压 缩的索引数量,则我们可以对数组的最大大小设置上界。在自上而下的BVH 构建器中,由节点分区产生的每个索引子阵列中的索引的数量典型地在分区发 生之前是已知的,并因此可以在每个分区步骤处针对这两个子数组导出上界。
在BOI的情况下,数组的最大大小在没有通过增量压缩实现对索引的压 缩时出现。通过将用于块的元数据的大小纳入考虑因素,预测块的最大数量, 并因此预测以字节为单位的最大大小是可能的。
在HBI索引的情况下,最大大小在没有实现对blockIdx的增量压缩时出 现,并且HBI索引被拆分到每个HBI索引仅表示单个基元的程度(每个索引 比特向量中仅设置一个比特)。通过将所有元数据纳入考虑因素,包括用于分 层式比特向量的第一层级的附加比特(比特向量占用标志),我们可以计算块 的最大数量,并由此计算针对给定数量的基元的以字节为单位最大大小。
考虑到可以对数组的大小设置上界,使用简单的技术来使用数组对来对索 引压缩块数组进行分区。如本节先前所讨论,这两个数组都基于索引类型被大 小调整为最大可能大小。在构建开始时,一组初始索引被写入该对中的数组中 的一个数组。对于每个层级,读取、解释来自一个数组的块,并将新压缩的块 写出到反映经分区的索引的第二数组。在递归时,可以切换数组中的每个数 组的角色,从而始终从刚被写入的数组进行读取。由于索引的排序正在改变以 反映分区,因此索引数组持续地被重新压缩。
由于可以预测分区中块的最大数量,因此可以将由分区产生的每个子数组 写入另一数组的位置中,使得始终可以容纳最大大小。这可以有效地导致数组 中的“间隙”,但仍然实现带宽压缩。如果以这种方式对索引分区,则BVH构 建器可以根据引用其基元的索引压缩块以及构建任务中的基元的数量来保持 对当前构建任务的开始/结束的跟踪。
空间拆分
在某些情况下,用于改善BVH遍历效率的广泛使用的技术是空间拆分的 使用。由于AABB不在构建的每个层级处被重新压缩,因此难以将构建本身期 间发生的空间拆分(如在一些相关工作中所见)合并到压缩方案中。然而,如 根据其他先前的设计,压缩方案应当与预拆分方法兼容。此类方案将一组 AABB递送给BVH构建,并且通常需要对构建本身进行很少的修改或不需要 对构建本身进行修改。
将这些预拆分方案与本发明的实施例结合的一种方式是预先准备浮点 AABB的数组,包括所有拆分基元(而不是按照表C的第23行计算它们), 并保留将它们往回链接到原始基元的ID的数组。随后,我们可以使用BOI或 HBI索引、或传统索引在构建期间引用这些AABB,并在需要时(诸如,在写 入叶节点时)将它们往回链接到原始基元。
图68图示GPU 2505的光线追踪引擎8000的一个实施例,该光线追踪引 擎8000具有用于执行本文所述的压缩和解压缩技术的压缩硬件逻辑6810和解 压缩硬件逻辑6808。然而,请注意,图68包括许多特定的细节,这些特定细 节对于符合本发明的根本性原理来说不是必需的。
示出了BVH构建器6807,其基于(例如,与当前图形图像相关联的)当 前的一组基元6806来构建BVH。在一个实施例中,BVH压缩逻辑6810与BVH 构建器6807协作地操作,以同时压缩由BVH构建器6807使用的底层数据以 生成数据的经压缩版本6812。具体地,如本文所述,压缩逻辑6810包括用于 生成AABB压缩块6400的边界框压缩器6825、以及用于生成索引压缩块6610 的索引压缩器6826。虽然在图68中被图示为单独的单元,但压缩逻辑6810可以集成在BVH构建器6807内。相反,BVH构建器对于遵守本发明的根本 性原理不是必需的。
当系统部件需要未经压缩的数据6814(例如,诸如BVH构建器6807)时, 解压缩逻辑6808实现本文描述的技术以对经压缩的数据6812进行解压缩。具 体地,索引解压缩器6836对索引压缩块6610进行解压缩,并且边界框解压缩 器6835对AABB压缩块6400进行解压缩以生成未经压缩的数据6814的未经 压缩的AABB。随后可由其他系统部件访问未经压缩的数据6814。
图68中所示的各种部件可以在硬件、软件或其任何组合中实现。例如, 某些部件可以在执行单元4001中的一个或多个上执行,而诸如遍历/相交单元 6803之类的其他部件可以在硬件中实现。
此外,基元6806、经压缩的数据6812和未经压缩额数据6814可以存储 在本地存储器/缓存6898和/或系统存储器(未示出)中。例如,在支持共享虚 拟存储器(sharedvirtual memory,SVM)的系统中,可以跨一个或多个本地存 储器和物理系统存储器映射虚拟存储器空间。如上文所提及,BVH压缩块可 以基于缓存层次体系中的缓存行的大小来生成(例如,以针对每缓存行适配一 个或多个压缩块)。
用于位移网格压缩的装置和方法
本发明的一个实施例使用用于可见性查询的光线追踪来执行路径追踪以 渲染逼真的图像。在此实现方式中,光线从虚拟相机投射并通过模拟场景被追 踪。随后执行随机采样以递增地计算最终图像。路径跟踪中的随机采样会致经 渲染的图像中出现噪声,这些噪声可以通过允许生成更多样本而被消除。此实 现方式中的样本可以是由单条光线产生的颜色值。
在一个实施例中,用于可见性查询的光线追踪操作依赖于在预处理阶段在 场景基元(例如,三角形、四边形等)上生成的包围体层次体系(BVH)(或 其他3D分层式布置)。使用BVH,渲染器可以快速确定光线和基元之间的最 近的相交点。
当(例如,诸如利用本文所述的遍历/相交电路)在硬件中加速这些光线 查询时,由于取得的三角形数据的量,可能会出现存储器带宽问题。幸运的是, 建模场景中的复杂性中的许多复杂性是由位移映射产生的,其中使用细分规则 对平滑的基础表面表示(诸如,细分表面)精细地进行曲面细分,以生成经曲 面细分的网格6991,如图69A所示。将位移函数6992应用于经精细地曲面 细分的网格的每个顶点,该网格典型地要么仅沿基础表面的几何法线位移,要 么位移到任意方向以生成位移网格6993。被添加到表面的位移量在范围内是 有限的;因此从基础表面非常大的位移是不频繁的。
本发明的一个实施例使用有损的水密性压缩来有效地压缩位移映射的网 格。具体而言,该实现方式相对于粗糙的基础网格来量化位移,该粗糙的基础 网格可以匹配基础细分网格。在一个实施例中,可以使用双线性内插将基础细 分网格的原始四边形细分为与位移映射具有相同准确性的网格。
图69B图示根据本文描述的实施例的压缩位移映射的网格6902以生成经 压缩的经位移网格6910的压缩电路/逻辑6900。在所示实施例中,位移映射电 路/逻辑6911从基础细分表面生成位移映射的网格6902。图70A图示其中基 元表面7000被精细地曲面细分以生成基础细分表面7001的示例。将位移函 数应用于基础细分表面7001的顶点以创建位移映射7002。
返回到图69B,在一个实施例中,量化器6912相对于粗糙的基础网格6903 量化位移映射的网格6902以生成经压缩的经位移网格6910,该经压缩的经位 移网格6910包括3D位移数组6904和与粗糙的基础网格6903相关联的基础坐 标6905。作为示例而非限制,图70B图示一组差向量d1-d4 7022,每个差异向 量与不同的经位移的顶点v1-v4相关联。
在一个实施例中,粗糙的基础网格7003是基础细分网格6301。替代地, 内插器6921使用双线性内插将基础细分网格的原始四边形细分为与位移映射 具有相同准确性的网格。
量化器6912确定从每个粗糙的基础顶点到对应的经位移的顶点v1-v4的 差向量d1-d4 7022,并在3D位移数组6904中组合差向量7022。以此方式, 仅使用四边形的坐标(基础坐标6905)和3D位移向量的数组6904来定义经 位移的网格。请注意,这些3D位移向量6904不一定与用于计算原始位移7002 的位移向量匹配,因为建模工具通常不会使用双线性内插来细分四边形,而是 应用更复杂的细分规则来创建要位移的平滑表面。
如图70C所示,两个相邻四边形7090-7091的网格将无缝地拼合在一起, 因为沿着边界7092,两个四边形7090-7091将评估为完全相同的顶点位置v5-v8。 由于针对相邻四边形7090-7091沿边7092存储的位移也相同,因此经位移的 表面将不具有任何裂缝。这个属性是重要的,因为这尤其意味着存储的位移的 准确性针对整个网格会任意地被降低,从而导致具有较低质量的被连接的经位 移的网格。
在一个实施例中,半精度浮点数用于对位移进行编码(例如,16比特浮 点值)。替代地或附加地,使用共享指数表示,该共享指数表示存储针对所有 三个顶点分量的仅一个指数并存储三个尾数。此外,由于位移的范围通常被很 好地划界,因此一个网格的位移可以使用按某个常量缩放的定点坐标来进行编 码,以获得足够的范围来编码所有位移。虽然本发明的一个实施例使用双线性 补片作为基础基元,仅使用平面三角形,但另一实施例使用三角形对来处置每 个四边形。
在图71中图示根据本发明的一个实施例的方法。该方法可在本文中所描 述的体系结构上实现,但不限于任何特定的处理器或系统体系结构。
在7101处,从基础细分表面生成位移映射的网格。例如,可以精细地对 基元表面进行曲面细分以生成基础细分表面。在7102处,生成或标识基础网 格(例如,在一个实施例中,诸如基础细分网格)。
在7103处,将位移函数应用于基础细分表面的顶点以创建差向量的3D 位移数组。在7104处,生成与基础网格相关联的基础坐标。如所提及,可以 将基础坐标与差向量结合使用以重构经位移的网格。在7105处,经压缩的经 位移网格被存储,其包括3D位移数组和基础坐标。
下一次从存储装置或存储器读取基元时(在7106处确定的),在7107 处从经压缩的经位移网格生成经位移的网格。例如,可以将3D位移数组应用 于基础坐标以重构经位移的网格。
用于有损网格基元的增强的有损经位移的网格压缩和硬件BVH遍历/相交
复杂的动态场景对于实时光线追踪实现具有挑战性。程序性表面、蒙皮动 画等需要甚至在第一条光线被发射之前对每一帧中的三角测量和加速结构的 更新。
本发明的一个实施例扩展了用于支持需要在补片边界处以水密性方式进 行评估双三次四边形或三角形补片的方法,而不是仅将双线性补片用作基础基 元。在一个实现方式中,将比特域(bitfiled)添加到有损网格基元,该比特域 指示隐式三角形是否有效。一个实施例还包括经修改的硬件块,该经修改的硬 件块扩展现有的曲面细分器以直接产生有损的经位移的网格(例如,如上文关 于图69A-图71所述),该有损的经位移的网格随后被向外存储到存储器。
在一个实现方式中,对BVH遍历单元的硬件扩展取得有损网格基元作为 输入,并为隐式引用的三角形/四边形的子集动态地提取边界框。所提取的边界 框采用与BVH遍历单元的光线-框测试电路(例如,下面描述的光线/框遍历单 元8930)兼容的格式。光线相对于动态生成的边界框相交测试的结果被传递到 光线-四边形/三角形相交单元8940,该光线-四边形/三角形相交单元8940提取 被包含在边界框中的相关三角形并使那些三角形相交。
一个实现方式还包括使用间接引用的顶点数据对有损网格基元的扩展(类 似于其他实施例),从而通过跨相邻网格基元共享顶点数据来减少存储器消耗。 在一个实施例中,使硬件BVH三角形相交器块的修改版本知晓输入是来自有 损的经位移的网格的三角形,从而允许它重新使用针对相邻三角形的边计算。 还向有损的经位移的网格压缩添加扩展,以处置运动模糊的几何。
如上所述,假设输入是具有任意维度的栅格网格,该输入栅格网格首先被 细分为具有固定分辨率的较小子栅格,诸如4x4顶点,如图72中所示。
如图73中所示,在一个实施例中,现在基于4x4输入顶点计算有损4x4 栅格基元结构(GridPrim)。一个实现方式根据以下代码序列进行操作:
Figure BDA0003815892730001411
在一个实现方式中,这些操作消耗100个字节:来自PrimLeafDesc的18 比特可以被保留以禁用各个三角形,例如,(按自上而下、从左到右顺序)比 特掩码000000000100000000b将禁用图74中所示的突出显示的三角形7401。
隐式三角形可以是3x3四边形(4x4顶点)或更多三角形。则这些三角形 中的许多拼合在一起,从而形成网格。掩码告诉我们是否要与三角形相交。如 果到达了洞,则停用每4x4栅格的各个三角形。这实现了较高精度和显著减少 的存储器使用:约5.5个字节/三角形,这是非常紧凑的表示。相比之下,如果 以全精度存储线性数组,则每个三角形占用48个和64个字节。
如图75中所示,硬件曲面细分器7550将补片曲面细分到4x4单位中的三 角形,并将它们向外存储到存储器,因此可以在它们之上构建BVH,并且可 以对它们进行光线追踪。在此实施例中,硬件曲面细分器7550被修改为直接 支持有损的经位移的栅格基元。硬件曲面细分单元7550可以直接生成有损栅 格基元并将它们向外存储到存储器,而不是生成各个三角形并将它们传递给栅 格化单元。
对硬件BVH遍历单元7550扩展,该硬件BVH遍历单元7550取得有损 栅格基元作为输入,并在运行时提取用于隐式引用的三角形/四边形的子集的边 界框。在图76中所示的示例中,从有损栅格提取九个边界框7601A-I(针对每 个四边形有一个边界框),并且这九个边界框作为特殊的九宽度的BVH节点 被传递给硬件BVH遍历单元7550以执行光线-框相交。
一个接一个地测试所有18个三角形是非常昂贵的。参见图77,一个实施 例为每个四边形提取一个边界框7601A-I(但是这仅是示例;可以提取任何数 量的三角形)。当读取三角形的子集并计算边界框时,生成N宽度的BVH节 点7700–针对每个四边形有一个子节点7601A-I。随后将该结构传递给硬件遍 历单元7710,该硬件遍历单元7710通过新构造的BVH来遍历光线。因此, 在这个实施例中,栅格基元被用于隐式BVH节点,从该隐式BVH节点可以确 定边界框。当生成边界框时,已知该边界框包含两个三角形。当硬件遍历单元 7710确定光线遍历边界框7601A-I中的一个边界框时,相同的结构被传递到光 线-三角形相交器7715以确定哪个边界框已被命中。即,如果边界框已被命中, 则对该边界框中包含的三角形执行相交测试。
在本发明的一个实施例中,这些技术被用作对光线三角形遍历7710和相 交单元7715的预剔除步骤。当可以仅使用BVH节点处理单元推断三角形时, 相交测试显著地更便宜。对于每个相交的边界框7601A-I,两个相应的三角形 被传递给光线追踪三角形/四边形相交单元7715以执行光线-三角形相交测试。
上述栅格基元和隐式BVH节点处理技术可以集成在本文所述的遍历/相 交单元中的任一个(诸如,下文描述的光线/框遍历单元8930)内或用作对本 文所述的遍历/相交单元的任一个(诸如,下文描述的光线/框遍历单元8930) 的预处理步骤。
在一个实施例中,此类4x4有损栅格基元的扩展用于支持具有两个时间步 长的运动模糊处理。以下代码序列中提供了一个示例:
Figure BDA0003815892730001431
运动模糊操作类似于在相机中模拟快门时间。为了对这种效果进行光线追 踪,从t0移动到t1,有两个三角形表示,一种用于t0,一种用于t1。在一个 实施例中,在它们之间执行内插(例如,在两个时间点的每一个处以0.5线性 地内插基元表示)。
加速结构(诸如,边界体层次体系(BVH)和k-d树)的缺点是它们需 要时间和存储器两者来被构建和存储。减少这种开销的一种方法是对加速数据 结构采用某种压缩和/或量化,这对BVH特别起作用,这自然地提供保守的递 增式编码。从好的方面来看,这可以显著减小加速结构的大小,通常将BVH 节点的大小减半。不利的地方是,压缩BVH节点也引发开销,这可能落入不 同的类别。首先,存在在遍历期间对每个BVH节点进行解压缩的显而易见的 成本;其次,特别是对于分层式编码方案,需要跟踪父信息略微使栈操作复杂 化;并且第三,保守地量化边界意味着边界框比未经压缩的边界框稍微更不紧 密,从而分别触发必须被遍历和相交的节点和基元数量的可测量的增加。
通过局部量化来压缩BVH是用于减小其大小的已知方法。n宽度的BVH 节点包含采用单精度浮点格式的其“n”个子节点的轴对齐的边界框(AABB)。 局部量化表达相对于父的AABB的“n”个子AABB,并以量化的例如8比特格 式存储这些值,从而减小BVH节点的大小。
整个BVH的局部量化引入了多个开销因素,因为(a)去量化的AABB 比原始单精度浮点AABB更粗糙,从而针对每条光线引入了附加的遍历和相交 步骤,并且(b)去量化操作本身是昂贵的,这增加了对每个光线遍历步骤的 开销。由于这些缺点,经压缩的BVH仅用于特定的应用场景,并没有被广泛 采用。
本发明的一个实施例采用技术来压缩边界体积层次体系中的头发基元的 叶节点,如在已转让给本申请的受让人的、2018年12月28日提交的题为 “Apparatus andMethod for Compressing Leaf Nodes of Bounding Volume Hierarchies(用于压缩边界体积层次体系的叶节点的装置和方法)”的共同未决 申请中所描述的。具体而言,如共同未决申请中所述,几组定向基元与父边界 框一起存储,从而消除叶节点中的子指针存储。随后使用相对于父框的角进行 量化的16比特坐标为每个基元存储定向边界框。最后,为每个基元组存储经 量化的法线以指示定向。这种方法可导致BVH头发基元的带宽和存储器占用空间的显著减少。
在一些实施例中,通过存储父边界框并使用较低精度相对于该父边界框对 N个子边界框(例如,8个子边界框)进行编码来压缩BVH节点(例如,对 于8宽度的BVH)。将此想法应用于BVH的每个节点的缺点在于,在每个节 点处,当使光线遍历通过该结构时引入一些解压缩开销,这可能会降低性能。
为了解决这个问题,本发明的一个实施例仅在BVH的最低层级处使用经 压缩的节点。这提供了以最优性能运行的较高BVH层级的优点(即,像框是 大的那样经常地触摸这些较高BVH层级,但它们中只有很少是这样),并且 在较低/最低层级上的压缩也非常有效,因为BVH的大多数数据处于(一个或 多个)最低层级中。
此外,在一个实施例中,还对存储被定向的边界框的BVH节点应用量化。 如下文所讨论,这些操作比轴对齐的边界框略微复杂一些。在一个实现方式中, 带有被定向的边界框的经压缩BVH节点的使用与仅在BVH的最低层级(或较 低层级)处使用经压缩的节点相结合。
因此,一个实施例通过引入经压缩的叶节点的单个专用层级同时将常规的 未经压缩的BVH节点用于内部节点来改进完全压缩的BVH。此方法背后的一 个动机是,压缩的几乎所有节省都来自BVH的最低层级(特别是4宽度和8 宽度的BVH,其占所有节点的绝大多数),而大多数开销来自内部节点。因 此,引入单层的专用“经压缩的叶节点”提供与完全压缩的BVH几乎相同(并 且在一些情况下甚至更好)的压缩增益,同时保持与未经压缩的BVH几乎相 同的遍历性能。
图80图示示例性光线追踪引擎8000,其执行本文描述的叶节点压缩和解 压缩操作。在一个实施例中,光线追踪引擎8000包括上述光线追踪核心中的 一个或多个光线追踪核心的电路。替代地,光线追踪引擎8000可在CPU的 核心上或其他类型的图形核心(例如,Gfx核心、张量核心等)上实现。
在一个实施例中,光线生成器8002生成光线,遍历/相交单元8003通过 包括多个输入基元8006的场景追踪这些光线。例如,诸如虚拟现实游戏之类 的应用可生成命令流,从这些命令流生成输入基元8006。遍历/相交单元8003 使光线遍历通过由BVH构建器8007生成的BVH 8005,并标识光线与基元8006 中的一个或多个基元相交所在之处的命中点。虽然被图示为单个单元,但是遍 历/相交单元8003可包括耦合至不同的相交单元的遍历单元。这些单元能以电 路、由GPU或CPU执行的软件/命令、或它们的任何组合来实现。
在一个实施例中,BVH处理电路/逻辑8004包括BVH构建器8007,该 BVH构建器8007基于场景中基元8006之间的空间关系生成如本文所述的 BVH 8005。此外,BVH处理电路/逻辑8004包括BVH压缩器8009和BVH解 压缩器8009,以用于分别对叶节点进行压缩和解压缩,如本文所述。出于说明 的目的,以下描述将集中于8宽度的BVH(BVH8)。
如图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倍(总共48个字节)。请注 意,此布局与现有实现方式不同,因为范围以全精度存储,这通常提供更严格 的边界但需要更多空间。
在一个实施例中,BVH解压缩器8026如下对QBVH8节点8100B进行解 压缩。维度i的经解压缩的下界可以通过 QBVH8.starti+(byte-to-float)QBVH8.loweri*QBVH8.extendi来计算,在CPU 4099上,其针对每维度和框需要5个指令:2次加载(开始、扩展)、字节到 整数加载+上转换、整数到浮点数转换和一次乘加。在一个实施例中,使用 SIMD指令并行地对所有8个经量化的子边界框8101B-8108B完成解压缩,这 向光线节点相交测试增加了大约10个指令的开销,从而使其至少比在标准的 未经压缩的节点情况下贵两倍。在一个实施例中,在CPU 4099的核心上执行 这些指令。替代地,相当的一组指令由光线追踪核心4050来执行。
在没有指针的情况下,QBVH8节点需要72个字节,而未经压缩的BVH8 节点需要192个字节,这导致减少因子为2.66倍。在8个(64比特)指针的 情况下,减少因子减少到1.88倍,这使得有必要解决处置叶指针的存储成本。
在一个实施例中,当仅将BVH8节点的叶层压缩为QBVH8节点时,8个 子8101-8108的所有子指针将仅引用叶基元数据。在一个实现方式中,通过在 QBVH8节点8100B本身之后直接存储所有引用的基元数据来利用这一事实, 如图81中所示。这允许将QBVH8的完整64比特子指针8110减少到仅8比 特偏移8122。在一个实施例中,如果基元数据是固定大小的,则完全跳过偏移 8122,因为它们可以直接从相交的边界框的索引和指向QBVH8节点8100B本 身的指针计算出。
当使用自上而下的BVH8构建器时,仅压缩BVH8叶层级仅需对构建过 程的略微修改。在一个实施例中,这些构建修改在BVH构建器8007中实现。 在递归构建阶段期间,BVH构建器8007跟踪基元的当前数量是否低于某一阈 值。在一个实现方式中,N×M是阈值,其中N是指BVH的宽度,M是BVH 叶内的基元数。对于BVH8节点并且例如针对每叶的四个三角形,阈值为32。 因此,对于具有少于32个基元的所有子树,BVH处理电路/逻辑8004将进入 特殊的代码路径,其中它将继续基于表面积启发式(surface area heuristic,SAH) 的拆分过程,但创建单个QBVH8节点8100B。当QBVH8节点8100B被最终 创建时,BVH压缩器8009随后收集所有引用的数据并将该基元数据复制到 QBVH8节点的正后方。
由光线追踪核心8150或CPU 8199执行的实际BVH8遍历仅略微受叶层 级压缩影响。本质上,叶层级QBVH8节点8100B被视为扩展叶类型(例如, 它被标记为叶)。这意味着常规的BVH8自上而下遍历继续进行,直到到达 QBVH节点8100B。此时,执行单个光线-QBVH节点相交,并且对于其所有 相交的子8101B-8108B,重建相应的叶指针并执行常规光线-基元相交。有趣 的是,基于相交距离对QBVH的相交的子8101B-8108B进行排序可能不提供 任何可衡量的益处,因为在大多数情况下,无论如何仅有单个子被光线相交。
叶层级压缩方案的一个实施例甚至允许通过提取共同特征来对实际基元 叶数据进行无损压缩。例如,经压缩的叶BVH(compressed-leaf BVH,CLBVH) 节点中的三角形很可能共享顶点/顶点索引和属性,比如相同的objectID(对象 ID)。通过针对每CLBVH节点近存储一次这些共享属性并在基元中使用小的 本地字节大小的索引,存储器消耗被进一步减少。
在一个实施例中,用于利用BVH叶内的公共空间相干几何特征的技术也 用于其他更复杂的基元类型。诸如头发片段之类的基元可能针对每BVH叶共 享共同的方向。在一个实施例中,BVH压缩器8009实现一种压缩方案,该压 缩方案将这种公共方向属性考虑在内,以高效式地压缩定向边界框(oriented bounding box,OBB),该定向边界框已被显示对于界定长对角基元类型是非 常有用的。
本文描述的叶层级经压缩的BVH仅在最低BVH层级引入BVH节点量化, 并因此允许附加的存储器减少优化,同时保持未经压缩的BVH的遍历性能。 由于仅最低层级处的BVH节点被量化,因此它的所有子都指向叶数据 8101B-8108B,这些叶数据8101B-8108B可以被持续地存储在存储器的块中或 一个或多个缓存行8098中。
该想法还可以应用于使用定向边界框(OBB)的层次体系,该定向边界框 典型地用于加速对头发基元的渲染。为了说明一个特定实施例,将评估在三角 形之上的标准8宽度的BVH的典型情况下的存储器减少。
8宽度的BVH节点8100的布局被表示为以下核心序列:
Figure BDA0003815892730001481
并需要存储器的276个字节。标准8宽度的经量化的节点的布局可以定义为:
Figure BDA0003815892730001482
并需要136个字节。
因为在叶层级仅使用经量化的BVH节点,因此所有子指针实际上将指向 叶数据8101A-8108A。在一个实施例中,通过将经量化的节点8100B及其子指 向的所有叶数据8101B-8108B存储在存储器8098的单个连续块中,经量化的 BVH节点8100B中的8个子指针被移除。保存子指针将经量化的节点布局减 少到:
Figure BDA0003815892730001483
Figure BDA0003815892730001491
这仅需要72个字节。由于存储器/缓存8098中的连续布局,现在可以通过以下 公式简单地计算第i个子的子指针:childPtr(i)=addr(QBVH8NodeLeaf)+ sizeof(QBVH8NodeLeaf)+i*sizeof(LeafDataType).
由于BVH的最低层级处的节点占BVH的整个大小的多于一半,因此本 文描述的仅叶层级压缩提供了减少到原始大小的0.5+0.5*72/256=0.64倍。
此外,具有较粗糙边界的开销和对经量化的BVH节点本身进行解压缩的 成本仅发生在BVH叶层级处(与当整个BVH被量化时的所有层级形成对照)。 因此,很大程度上避免了由于较粗糙的边界(由量化引入)而导致的通常相当 显著的遍历和相交开销。
本发明实施例的另一个益处是改善的硬件和软件预取效率。这是源于所有 叶数据存储在相对较小的连续存储器块或(一个或多个)缓存行中的事实。
由于BVH叶层级处的几何在空间上是一致的,因此QBVH8NodeLeaf节 点所引用的所有基元很可能共享共同的属性/特征,诸如,objectID、一个或多 个顶点等。因此,本发明的一个实施例通过移除基元数据重复来进一步减少存 储。例如,针对每QBVH8NodeLeaf节点可仅存储一次基元和相关联的数据, 从而进一步减少针对叶数据的存储器消耗。
下面将头发基元的有效界定描述为通过利用BVH叶层级处的共同几何属 性而实现的显著的存储器减少的一个示例。为了准确地界定头发基元(其是在 空间中定向的长而细的结构),一种众所周知的方法是计算定向边界框来紧密 地界定几何体。首先计算被对齐到头发方向的坐标空间。例如,z轴可以被确 定为指向头发方向,而x轴和y轴垂直于z轴。使用这一定向空间,现在可以 使用标准AABB来紧密地界定头发基元。使光线与此类定向边界相交需要首先 将光线变换到定向空间中,并随后执行标准的光线/框相交测试。
这种方法的问题是其存储器使用。变换到定向空间中需要9个浮点值,而 存储边界框需要附加的6个浮点值,总共产生60个字节。
在本发明的一个实施例中,BVH压缩器8025为空间上靠近在一起的多个 头发基元压缩该定向空间和边界框。然后可以将这些经压缩的边界存储在经压 缩的叶层级内,以紧密地界定存储在叶内的头发基元。在一个实施例中使用以 下方法来压缩定向边界。定向空间可以由彼此正交的三个归一化向量vx、vy和 vz来表达。通过将点p投影到这些轴上来实现将点p变换到该空间中:
px=dot(vx,p)
py=dot(vy,p)
pz=dot(vz,p)
由于向量vx、vy和vz被归一化,因此它们的分量在范围[-1,1]内。因此, 这些向量使用8比特有符号定点数来量化,而不是使用8比特有符号整数和常 量缩放来量化。这样生成了经量化的vx′、vy′和vz′。这种方法将对定向空间编码 所需的存储器从36个字节(9个浮点值)减少到仅9个字节(9个定点数,其 中每个定点数1个字节)。
在一个实施例中,通过利用所有向量彼此正交的事实,进一步减少了定向 空间的存储器消耗。因此,仅需存储两个向量(例如,py′和pz′),并且可以计 算出px′=cross(py′,pz′),进一步将所需的存储减少到仅六个字节。
剩下的是在经量化的定向空间内量化AABB。这里的问题在于,将点p 投影到该空间的经压缩的坐标轴上(例如,通过计算dot(vx′,p))产生具有潜 在地非常大范围的值(因为值p典型地被编码为浮点数)。出于该原因,将需 要使用浮点数对边界进行编码,从而减少潜在的节省。
为了解决这个问题,本发明的一个实施例首先将多个头发基元变换到空间 中,其中其坐标在范围[0,1/√3]内。这可以通过确定多个头发基元的世界空间 轴对齐的边界框b并使用首先向左侧先平移b.lower并随后在每个坐标中以 1/max(b.size.x,b.size.y,b.size.z)进行缩放来的变换T来完成:
Figure BDA0003815892730001511
一个实施例确保该变换之后的几何保持在范围[0,1/√3]内,因为随后经变 换的点到经量化的向量px'、py'或pz'上的投影保持在范围[-1,1]内。这意味着 曲线几何的AABB可以在使用T变换时被量化,并随后变换到经量化的定向 空间中。在一个实施例中,使用8比特有符号定点算术。然而,出于精度原因, 可以使用16比特有符号定点数(例如,使用16比特有符号整数和常量缩放进 行编码)。这将用于对轴对齐的边界框进行编码的存储器需求从24个字节(6 个浮点值)减少到仅12个字节(6个字)加上偏移b.lower(3个浮点数)和缩放(1个浮点数),它们被共享用于多个头发基元。
例如,要界定8个头发基元,本实施例将存储器消耗从8*60个字节=480 个字节减少到仅8*(6+12)+3*4+4=160个字节,这减少了3倍。通过首先使用 变换T来变换光线,随后使用经量化的vx′、vy′和vz′来投影光线,实现将光线 与这些经量化的定向边界相交。最终,光线与经量化的AABB相交。
上面描述的肥(fat)叶方法为甚至更多的压缩提供了机会。假设在肥BVH 叶中存在隐式的单个float3指针,其指向多个相邻GridPrims的共享顶点数据, 则每个网格基元中的顶点可以通过字节大小的索引(“vertex_index_*”)被间接 寻址,从而利用顶点共享。在图78中,顶点7801-7802是共享的——并以全 精度来存储。在该实施例中,共享顶点7801-7802仅存储一次,并且指向包含 多个唯一顶点的数组的索引被存储。因此,针对每时间戳仅存储4个字节,而 不是48个字节。以下代码序列中的索引用于标识共享顶点。
Figure BDA0003815892730001512
Figure BDA0003815892730001521
在一个实施例中,基元的共享边仅被评估一次以节省处理资源。例如,在 图79中,假设边界框由突出显示的四边形组成。与单独地使所有三角形相交 不同,本发明的一个实施例对三个共享边中的每一个执行一次光线-边计算。 因此,三个光线-边计算的结果跨四个三角形被共享(即,针对每个共享边仅 执行一个光线-边计算)。此外,在一个实施例中,结果被存储到片上存储器 (例如,相交器单元可直接访问的暂存器存储器/缓存)。
用于图形和数据结构的原子性(atomics)
“原子性”是必须作为单个单元完成的一组操作。某些原子性对图形处理 性能会是有益的,尤其是在执行计算着色器时。本发明的一个实施例包括各种 新原子性以改善图形处理性能,包括:
●进行钳位(clamp)的原子性
●‘z-测试的’原子性写入
●‘z-测试的’原子性累积
●用于环形缓冲器的原子性
I.用于钳位的原子性
钳位原子性的一个实施例指定目的地、类型值以及最小和最大钳位值。作 为实例,钳位原子性可以采用以下形式:
InterlockedAddClamp(destination,type value,type min,type max)
(InterlockedAddClamp(目的地,类型值,类型最小值,类型最大值)) 上述钳位操作原子性地将值加到目的地,并随后钳位到指定的最小值和最大值 (例如,对于高于最大值的任何值设置为最大值,并且对于低于最小值的任何 值设置为最小值)。
钳位原子性值可以是32比特、64比特或任何其他数据大小。此外,钳位 原子性可以对各种数据类型进行操作,包括但不限于uint(无符号整数)、float (浮点)、2xfp16、float2和4xfp16。
II.‘z-测试的’分散写入
Z-测试的分散写入可用于多种应用,包括例如:
●分散的立方体图渲染/体素化(例如,用于环境探测);
●分散的不完美反射阴影图(reflective shadow map,RSM)(类似于不 完美阴影图,但用于间接照明);和
●通过分散的“环境探测”更新的动态漫射全局照明风格的全局照明。
以下是可以在本发明的一个实施例中执行的比较交换指令的示例:InterlockedCmpXChg_type_cmp_op()
type=int,uint,float
cmp_op=less,greater,equal,less_equal,greater_equal,not_equal
e.g.:InterlockedDepthCmpXChg_float_less_equal()
(InterlockedCmpXChg_type_cmp_op()
类型=整数,无符号整数,浮点
cmp_op(比较_操作)=小于、大于、等于、小于_等于、大于_等于,不
_等于
例如:InterlockedDepthCmpXChg_float_less_equal())
在图82A中示出示例64比特目的地寄存器8201,其存储32比特深度值 8202和32比特有效载荷8203。在操作中,上述比较交换命令仅在新的浮点深 度值小于或等于存储的浮点值时交换有效载荷和深度。在一个实施例中, cmpxchg原子性是“远程”原子性,这意味着实际的比较和原子性更新不由发出 指令的EU完成,而是由靠近存储数据的LLC(或存储器控制器)的逻辑块完 成。
用于读-写字节地址缓冲器(Read-Write Byte Address Buffers,RWByteAddressBuffers)的示例高级着色语言(HLSL)内联函数(intrinsics)
在一个实施例中,仅HighCompValue具有要与64比特目的地中的高32 比特进行比较的类型。其余被假定为转换为32比特无符号整数(asuint()):
void RWByteAddressBuffer::InterlockedCompareHighExchange_Less(uintbyteAddress64,uint uHighCompVal,uint2 HighAndLowVal,out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareHighExchange_ LessEqual(uint byteAddress64,uint uHighCompVal,uint2 HighAndLowVal, out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareHighExchange_Greater(uintbyteAddress64,uint uHighCompVal,uint2 HighAndLowVal,out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareHighExchange_GreaterEqual(uint byteAddress64,uint uHighCompVal,uint2 HighAndLowVal, outuint2 HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareHighExchange_Equal(uintbyteAddress64,uint uHighCompVal,uint2 HighAndLowVal,out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareHighExchange_NotEqual(uint byteAddress64,uint uHighCompVal,uint2 HighAndLowVal,out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareHighExchange_Less(uintbyteAddress64,int iHighCompVal,uint2 HighAndLowVal,out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareHighExchange_ LessEqual(uint byteAddress64,int iHighCompVal,uint2 HighAndLowVal, out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareHighExchange_Greater(uintbyteAddress64,int iHighCompVal,uint2 HighAndLowVal,out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareHighExchange_GreaterEqual(uint byteAddress64,int iHighCompVal,uint2 HighAndLowVal, outuint2 HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareHighExchange_Equal(uintbyteAddress64,int iHighCompVal,uint2 HighAndLowVal,out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareHighExchange_NotEqual(uint byteAddress64,int iHighCompVal,uint2 HighAndLowVal,out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareHighExchange_Less(uintbyteAddress64,float fHighCompVal,uint2 HighAndLowVal,out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareHighExchange_ LessEqual(uint byteAddress64,float fHighCompVal,uint2 HighAndLowVal, out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareHighExchange_Greater(uintbyteAddress64,float fHighCompVal,uint2 HighAndLowVal,out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareHighExchange_GreaterEqual(uint byteAddress64,float fHighCompVal,uint2 HighAndLowVal, outuint2 HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareHighExchange_Equal(uintbyteAddress64,float fHighCompVal,uint2 HighAndLowVal,out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareHighExchange_NotEqual(uint byteAddress64,float fHighCompVal,uint2 HighAndLowVal,out uint2HighAndLowOrgVal)
用于目的地R的示例HLSL内联函数
HighCompValue具有要与64比特目的地处的高32比特进行比较的类型。 其余被假定为使用asuint()进行转换
所有这些内联函数采用类型`R`的`dest`参数,其可以是资源变量或共享存 储器变量。资源变量是对资源的标量引用,包括索引或字段引用。共享存储器 变量是使用`groupshared`关键字定义的变量。在任一情况下,类型都必须是 uint2或uint64。当`R`是共享存储器变量类型时,对`value`参数和`dest`所引用 的共享存储器寄存器执行操作。当`R`是资源变量类型时,对`value`参数和`dest` 所引用的资源位置执行操作。结果存储在`dest`所引用的共享存储器寄存器或资 源位置中:
void InterlockedCompareHighExchange_Less(R dest,uint uHighCompVal,uint2 HighAndLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareHighExchange_LessEqual(R dest,uintuHighCompVal,uint2 HighAndLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareHighExchange_Greater(R dest,uint uHighCompVal,uint2 HighAndLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareHighExchange_GreaterEqual(R dest,uintuHighCompVal,uint2 HighAndLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareHighExchange_Equal(R dest,uint uHighCompVal,uint2 HighAndLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareHighExchange_NotEqual(R dest,uintuHighCompVal,uint2 HighAndLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareHighExchange_Less(R dest,int iHighCompVal,uint2 HighAndLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareHighExchange_LessEqual(R dest,intiHighCompVal,uint2 HighAndLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareHighExchange_Greater(R dest,int iHighCompVal,uint2 HighAndLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareHighExchange_GreaterEqual(R dest,intiHighCompVal,uint2 HighAndLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareHighExchange_Equal(R dest,int iHighCompVal,uint2 HighAndLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareHighExchange_NotEqual(R dest,int iHighCompVal,uint2 HighAndLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareHighExchange_Less(R dest,float fHighCompVal,uint2 HighAndLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareHighExchange_LessEqual(R dest,floatfHighCompVal,uint2 HighAndLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareHighExchange_Greater(R dest,floatfHighCompVal,uint2 HighAndLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareHighExchange_GreaterEqual(R dest,floatfHighCompVal,uint2 HighAndLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareHighExchange_Equal(R dest,float fHighCompVal,uint2 HighAndLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareHighExchange_NotEqual(R dest,floatfHighCompVal,uint2 HighAndLowVal,out uint2 HighAndLowOrgVal)
III.‘z-测试的’分散累积
以下参照图82B-图82C描述两个实施例。图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
●e.g.:InterlockedCmpAccum_float_2xfp16_less()
■if the new float depth value is<the stored float depth value:
2.Exchange the stored depth value with the new one
3.Dest.Payload.lowfp16+=InputPayload.lowfp16
4.Dest.Payload.highfp16+=InputPayload.highfp16
(InterlockedCmpAdd_type1_type2_cmp_op()
●类型1=整数,无符号整数,浮点
●类型2=整数,无符号整数,浮点、2xfp16
●比较_操作=小于、大于、等于、小于_等于、大于_等于,不_等于
●例如:InterlockedCmpAccum_float_2xfp16_less()
■如果新的浮点深度值<存储的浮点深度值,则:
2.用新的深度值交换存储的深度值
3.Dest.Payload.lowfp16+=InputPayload.lowfp16
4.Dest.Payload.highfp16+=InputPayload.highfp16)
用于RWByteAddressBuffers的新的HLSL内联函数
仅HighCompValue具有要与64比特目的地处的高32比特进行比较的类 型。AddLowVal可以具有类型float`(浮点`)、int`(整数`)、uint`(无符号 整数`)和min16float2`:
void RWByteAddressBuffer::InterlockedCompareExchangeHighAddLow _Less(uint byteAddress64,uint uHighCompVal,type AddLowVal,out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareExchangeHighAddLow _LessEqual(uint byteAddress64,uint uHighCompVal,type AddLowVal, out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareExchangeHighAddLow _Greater(uint byteAddress64,uint uHighCompVal,type AddLowVal,out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareExchangeHighAddLow _GreaterEqual(uint byteAddress64,uint uHighCompVal,type AddLowVal, out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareExchangeHighAddLow _Equal(uint byteAddress64,uint uHighCompVal,type AddLowVal,out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareExchangeHighAddLow _NotEqual(uint byteAddress64,uint uHighCompVal,type AddLowVal, out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareExchangeHighAddLow _Less(uint byteAddress64,int iHighCompVal,type AddLowVal,out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareExchangeHighAddLow _LessEqual(uint byteAddress64,int iHighCompVal,type AddLowVal,out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareExchangeHighAddLow _Greater(uint byteAddress64,int iHighCompVal,type AddLowVal,out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareExchangeHighAddLow _GreaterEqual(uint byteAddress64,int iHighCompVal,type AddLowVal, out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareExchangeHighAddLow _Equal(uint byteAddress64,int iHighCompVal,type AddLowVal,out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareExchangeHighAddLow _NotEqual(uint byteAddress64,int iHighCompVal,type AddLowVal,out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareExchangeHighAddLow _Less(uint byteAddress64,float fHighCompVal,type AddLowVal,out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareExchangeHighAddLow _LessEqual(uint byteAddress64,float fHighCompVal,type AddLowVal, out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareExchangeHighAddLow _Greater(uint byteAddress64,float fHighCompVal,type AddLowVal,out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareExchangeHighAddLow _GreaterEqual(uint byteAddress64,float fHighCompVal,type AddLowVal, out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareExchangeHighAddLow _Equal(uint byteAddress64,float fHighCompVal,type AddLowVal,out uint2HighAndLowOrgVal)
void RWByteAddressBuffer::InterlockedCompareExchangeHighAddLow _NotEqual(uint byteAddress64,float fHighCompVal,type AddLowVal, out uint2HighAndLowOrgVal)
针对目的地R建议的新HLSL内联函数
仅HighCompValue具有要与64比特目的地处的高32比特进行比较的类 型。AddLowVal可以具有类型float`、int`、uint`和min16float2`:
void InterlockedCompareExchangeHighAddLow_LessEqual(R dest,uintuHighCompVal,type AddLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareExchangeHighAddLow_Greater(R dest,uintuHighCompVal,type AddLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareExchangeHighAddLow_GreaterEqual(R dest,uintuHighCompVal,type AddLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareExchangeHighAddLow_Equal(R dest,uintuHighCompVal,type AddLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareExchangeHighAddLow_NotEqual(R dest,uintuHighCompVal,type AddLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareExchangeHighAddLow_Less(R dest,intiHighCompVal,type AddLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareExchangeHighAddLow_LessEqual(R dest,intiHighCompVal,type AddLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareExchangeHighAddLow_Greater(R dest,intiHighCompVal,type AddLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareExchangeHighAddLow_GreaterEqual(R dest,intiHighCompVal,type AddLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareExchangeHighAddLow_Equal(R dest,intiHighCompVal,type AddLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareExchangeHighAddLow_NotEqual(R dest,intiHighCompVal,type AddLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareExchangeHighAddLow_Less(R dest,floatfHighCompVal,type AddLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareExchangeHighAddLow_LessEqual(R dest,floatfHighCompVal,type AddLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareExchangeHighAddLow_Greater(R dest,floatfHighCompVal,type AddLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareExchangeHighAddLow_GreaterEqual(R dest,floatfHighCompVal,type AddLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareExchangeHighAddLow_Equal(R dest,floatfHighCompVal,type AddLowVal,out uint2 HighAndLowOrgVal)
void InterlockedCompareExchangeHighAddLow_NotEqual(R dest,floatfHighCompVal,type AddLowVal,out uint2 HighAndLowOrgVal)
IV.用于环形缓冲器的原子性
环形缓冲器(或循环缓冲器)是数据结构,其包括单个固定大小的缓冲器, 该单个固定大小的缓冲器运行方式就好像它被端到端连接一样。循环缓冲器通 常用于缓冲数据流。本发明的一个实施例包括用于将条目附加到环形缓冲器和 使条目从环形缓冲器出栈的原子性。
最初AppendIndex(附加索引)和PopFrontIndex(往前出栈索引)为0。 为了原子性地附加或出栈,一个实施例使用特殊的64比特原子性。利用这些 原子性,GPU线程可以例如在环形缓冲器的容量限制内实现产生方-消耗方方 案。硬件看门狗可以唤醒等待环形缓冲器的内核。
以下代码序列说明根据本发明的一个实施例的用于添加条目以及使条目 从环形缓冲器出栈的原子性操作:
a.环形缓冲器附加
Figure BDA0003815892730001611
Figure BDA0003815892730001621
b.环形缓冲器PopFront(往前出栈)
Figure BDA0003815892730001622
c.示例用例
i.使用InterlockedAppend、利用可用数量的条目初始化环形缓冲器
ii.许多线程运行并使用InterlockedPopFront临时挑选/分配条目
iii.使用InterlockedAppend将条目返回到环形缓冲器
iv.线程可以决定不等待条目并处理这一情况 用于多产生方样本和多消耗方样本的伪代码如在图84A-图84B中所示。
产生方伪代码样本在图84A中图示。对于此示例,假设 job_entry_ready_buffer(作业_条目_准备好_缓冲器)被初始化为全零,并且 job_entry_consumed_buffer(作业_条目_消耗_缓冲器)被初始化为全1:
消耗方伪代码样本在图84B中图示。对于此示例,假设 job_entry_ready_buffer被初始化为全零,并且job_entry_consumed_buffer被初 始化为全1。
图83A图示根据一个实施例实现的示例环形缓冲器。显示了环形缓冲器 往回出栈(pop back)操作,其中条目N、N+1等被出栈并存储在环形缓冲器 条目0、1等中。图83B图示64比特目的地寄存器8211,该64比特目的地寄 存器8211根据以下代码序列存储附加索引值8212和往前出栈索引值8213:
Figure BDA0003815892730001631
V.原子性乘法操作
乘法原子性的一个实施例指定目的地和类型值。作为示例,乘法原子性可 以采用以下形式:
InterlockedMultiply(destination,type value)
(InterlockedMultiply(目的地,类型值))
在一个实施例中,乘法操作原子性地将指定数据类型的值与目的地中的值 地相乘,目的地中的值可以是相同的数据类型或不同的数据类型。
作为示例而非限制,乘法原子性值可以是4比特、8比特、16比特、32 比特和64比特整数以及16比特、32比特和64比特浮点值。这些值可以是有 符号或无符号的。此外,可以基于最小数据元素大小执行多个并行乘法操作。 例如,浮点乘法电路可以被配置用于执行单个32比特浮点乘法或双16比特浮 点乘法。诸如Bfloat16或TensorFloat16之类的等格式可用于高效地执行并行 乘法。类似地,整数乘法器可以能够执行单个32比特乘法、双16比特乘法、 四个8比特乘法或八个4比特乘法。可以使用各种其他类型的数据格式和并行 操作,同时仍然符合本发明的根本性原理,包括例如2x FP16,float2,4x FP16, 11_11_10FP and2x 11_11_10FP。
这些原子性可用于多种目的,包括机器学习操作、加权混合顺序独立透明 度(Order Independent Transparency,OIT)或不透明度阴影图。
用于图形处理器管理的分片资源的装置和方法
本发明的一个实施例改善了用户写入的GPU程序可以缓存和重新使用存 储在缓冲器或纹理中的数据的效率。该实施例还提供了大型程序性计算的资源 的逻辑表示,这些资源同时可以也可以不物理地适配在GPU存储器中。
在本发明的一个实施例中,新的分片资源由GPU定义和管理,本文中称 为GPU管理的分片资源或GPU管理的缓冲器。在一个实现方式中,缓冲器或 其他分片存储资源包含最多N个固定大小的存储器块。不同的GPU体系结构 可以支持不同的最大块数(N)。
在一个实施例中,GPU管理的分片资源用于在着色器之间高效地共享数 据——即,其中一个着色器充当针对一个或多个“消耗方”着色器的“产生方”。 例如,产生方着色器可以生成消耗方着色器可以在不涉及与CPU交互的情况 下使用的程序性更新的内容。作为另一示例,在光线追踪实现方式中,可能需 要在遍历时更新各种形式的蒙皮动画。一个着色器可以对网格的一小部分进行 蒙皮,将结果存储在分片资源中,而无需CPU干预。当其他光线追踪同一部 分时,它们可以从分片资源在本地访问数据,而无需访问主存储器。
图85A图示用于实现GPU管理的分片资源8531的体系结构的一个实施 例。图形处理器8521包括调度器8510,用于调度一组执行单元4001上的着色 器8511A-8511B。着色器的执行需要对由资源管理器8512管理的分片资源8531 的访问。在下面提供的示例中,一个着色器8511A被指定为“产生方”,其将其 结果存储在分片资源8531中,而另一个着色器8511B是“消耗方”,其使用由 产生方着色器8511A生成的结果。因此,产生方着色器8511A需要访问以 向分片资源8521写入,而消耗方着色器8511B需要对分片资源8531的读取 访问。然而,应当注意,产生方/消耗方体系结构不是遵守本发明的根本性原理 所必需的。
在一个实现方式中,分片资源8531包括片上片存储器或片缓冲器,其存 储片大小的数据块0-(N-1)。“片”大小可以基于图形处理器8521的体系结构和 图形处理管线的配置而变化。在一个实施例中,图形处理管线被配置用于使用 分片资源8531来执行基于片的推迟的渲染、基于片的即时模式渲染和/或其他 形式的基于片的图形处理。
在一个实施例中,执行单元(EU)4001或其他处理单元使用散列值或其 他形式的ID 8501(例如,在一个实施例中为64比特散列)来请求块。资源管 理器8512确定块是否存在于包括N个固定大小块的分片资源8531内。如果没 有找到此类块,则缓冲器管理器8510驱逐最近最少使用(least recently used, LRU)的块或选择未使用的块(如果它存在的话)。响应8502用给定的散列 值标识缓冲器管理器8510标记为“已使用”的所分配的块。在一个实现方式中, 还返回标志,该标志指示块是新的。被替换的最近最少使用的块丢失了它存储 的旧内容。如果该块已经存在,则返回标志,该标志指示该块已经存在,不过, 它被返回。
虽然被示为图形处理器8521内的部件,但分片资源8531可以在图形处理 器8521外部的存储器(诸如,系统存储器或系统级缓存)内实现。
在GPU的EU 4001上执行的某些类别的着色器8511A-B先验地已知需要 存储器块。例如,这些着色器可以总是在波的通道中执行。在一个实施例中, 调度这些着色器8511A-B的执行的调度器8510从系统生成的值构造64比特 ID/散列。例如,在光线追踪的上下文中,一个实施例使用InstanceID(实例ID) 和GeometryID(几何ID)来构造唯一的64比特散列。然而,可以使用多种其 他系统生成的变量。
在此实施例中,调度器8510经由资源管理器8512检查是否已经存在为 64比特散列分配的分片资源8531的块。如果存在,则在块已经包含缓存的数 据并且该数据可以被着色器消耗的假设下执行着色器8511A-B,并且着色器被 调度在EU 4001上。只要使用被缓存的数据的、锁定存储器的块的着色器正在 执行,资源管理器8512就锁定该块,使其不被重新使用。当着色器由一个或 多个EU 4001执行时,着色器使用块ID 8501来更新分片资源8531中的块, 并且对于某些操作,从资源管理器8512接收响应8502。
在一个实施例中,如果调度器8510最初发现不存在具有给定的64比特散 列的块,则资源管理器8512定位未使用的块或使用已被分配且当前未处于使 用中的最近最少使用的块(或其他块)。如果它无法定位此类块,则资源管理 器8512可推迟着色器的执行,直到此类块变得可用。当一个块可用时,只要 着色器正在执行并且调度着色器,分片资源管理器8512就锁定分片资源块, 使其不被重新使用。可以将标志传递给着色器以指示该块是空的并且着色器可 以使用它来生成和存储数据。在将数据写入分片资源块之后,着色器可以继续 执行,就好像分片资源块及其数据已经可用一样。
返回到上面的消耗方/产生方示例,如果所请求的散列在池中无效,则产 生方着色器8511A可以被调度以生成程序性资源8531的新颖的块或片。此类 所请求的散列可以由一个或多个消耗方着色器8511B生成,资源管理器8512 将阻止该一个或多个消耗方着色器8511B,直到它们的请求被填充。
在一个实施例中,分片资源块被驱逐到固态设备8515或其他高速存储介 质。SSD8515或其他存储设备可以在本地被集成在与图形处理器8521相同的 衬底和/或卡上,并且可以被配置用于在内部图形处理器8521上下文切换期间 保存分片资源块和其他数据。
图85B中图示根据一个实施例的方法。该方法可在上述体系结构的上下 文内实现,但并不限于任何特定的体系结构。
在8551处,调度器评估要被调度以供进行执行的下一个着色器,并且在 8552处,确定要用于标识分片资源块的散列ID(例如,使用本文描述的技术 中的一个或多个)。在8553处,调度器使用散列ID查询分片资源管理器。
如果在8554处确定已经为此散列ID分配了块,则在8555处,分片资源 管理器锁定该分片资源块,并且在8556处,着色器在执行期间使用该分片资 源块。分片资源块随后可以在着色器完成时被解锁,除非它使用消耗方着色器 的散列ID被锁定,该消耗方着色器在当前(产生方)着色器完成后将需要数 据。在任何情况下,过程返回到8551以调度下一个着色器。
如果在8554处,没有利用散列ID被标识的分片资源块,则分片资源管理 器将分片资源块指派给散列ID并且可以将标志分配给着色器,该标志指示该 着色器可以使用该分片资源块。如所提及,分片资源管理器可以从分片资源块 驱逐现有数据以将分片资源块指派给当前着色器。在8555处,分片资源块被 锁定,并且在8556处,着色器在执行期间使用分片资源块。
GPU管理的分片缓冲器8531可以以多种方式被使用。例如,通道的SIMD 波想要进入由无绑定线程调遣器捆包的同一相交着色器框(如下所述)。在运 行相交着色器之前,硬件从缓冲器管理器8510请求块。
可以以不同的方式生成64比特散列。例如,在一个实施例中,64比特散 列是与帧计数器结合的当前光线遍历实例的InstanceID。如果块是新的,则硬 件可以启动用户计算着色器,该用户计算着色器在波的通道内运行,该用户计 算着色器随后填充块(例如,利用蒙皮三角形)。如果块是旧的,则着色器可 能无法被启动。相交着色器随后被执行,并被提供有指向该块的指针。相交着 色器随后可以执行光线/三角形相交和/或可以为用于光线/三角形相交的硬件 指令提供支持(如本文所述)。替代地,该块可以设计为仅包含三角形。在这 种情况下,硬件对这些三角形进行迭代(而不在它们之上构建BVH),并且 可例如更新最近命中着色器或调用到任何命中着色器中。各种其他用例可以利 用如上所述的GPU管理的分片资源8531。
用于高效惰性(lazy)BVH构建的装置和方法
复杂的动态场景对于实时光线追踪实现具有挑战性。程序性表面、蒙皮动 画等需要甚至在第一条光线被发射之前对每一帧中的三角测量和加速结构的 更新。
惰性构建“按需”评估场景元素,如由光线遍历驱动。帧的渲染以粗糙的加 速结构(如前一帧的场景图或层次体系)开始,然后渐进地为在遍历期间被光 线命中的对象构建新需要的加速结构。可以有效地将不可见的对象排除在构造 过程之外。然而,这些技术并不容易利用当前的系统和API实现,因为对于计 算实例可见性必要的较高层级(即,每对象)的可编程性不被支持。
本发明的一个实施例支持用于实时光线追踪的多轮次惰性构建 (multi-passlazy build,MPLB),其利用经扩展的编程模型来解决这些问题。 其允许在每次光线调遣期间跟踪实例层级的遍历,并且选择性地仅为渲染时潜 在可见的几何构建底部层级加速结构(bottom level acceleration structure, BLAS)。类似于一些自适应采样技术,如本文所述的MPLB可需要在同一组 像素上的多次光线调遣,以将光线重新发射到场景的先前未被构建的部分,但 本发明的某些实施例包括用于使这种开销最小化的技术,诸如,假设帧到帧的 一致性和经栅格化的主要可见性。这些技术可以提供与一次性构建器相比的构 建复杂性的显著降低,而平均而言仅伴随遍历成本的略微增加。
图86A图示用于执行如本文所述的惰性构建操作的按需(或“惰性”)构建 器8607的一个实施例。此外,该实施例包括用于暂停光线遍历的遍历暂停电 路/逻辑8620。光线遍历暂停电路/逻辑8620可以在硬件、软件或其任何组合 中实现。光线栈存储8605在遍历被暂停时存储暂停的光线栈8610(如本文中 更详细地所描述)。此外,GPU侧的命令调度在不由CPU进行监督的情况下 在执行单元4001上启动惰性构建任务和光线延拓。遍历原子性也用于减少着 色器开销。
缺失底部层级加速结构(BLAS)经历时的遍历暂停
在一个实现方式中,使用具有遍历着色器扩展的编程模型,以便以编程方 式标记缺失实例(例如,BVH8005的底部层级加速结构),以便可以在单独 的轮次中识别和更新它们。然后要么执行不完整的遍历,要么中止遍历。
为了渲染最终像素,可能需要重新启动对应像素的主着色器,从而导致若 干重复的遍历和着色器执行操作。在一个实施例中,当遍历被暂停时,遍历暂 停逻辑8620将整个光线上下文8610(光线栈、延拓等)备份到片外存储器8605 中。在一个实施例中,该遍历暂停是由驱动器管理的内联函数(例如, SuspendTraversal());然而,本发明的根本性原理不限于此实现方式。此外, 主机侧的新DispatchRay()变体(由CPU 3199执行)重新调度来自光线上下文 8610的暂停的光线栈,以继续遍历着色器执行。
用于构建和调遣的GPU侧命令调度
当前惰性构建实现方式的另一个显著开销是CPU 3199回读的持续要求和 BVH构建器8007的条件调度以及GPU 2505上的光线调遣。为了改善效率, 在一个实现方式中,BVH处理电路/逻辑8004与光线遍历8003异步地运行BVH 构建。在构建任务完成后,光线追踪引擎8000执行光线调遣以从光线上下文8610继续被暂停的光线栈。
用于减少遍历着色器开销的遍历原子性
当前实现方式的一个问题在于,如果实例丢失(未被构建),则若干光线 可能会遍历它,并标记它以供惰性构建器8607更新它。可以通过仅一个遍历 着色器调用完成的简单任务被数百次或更多的调用重复。遍历着色器不是资源 密集型的,但它具有用于启动、执行输入/输出功能和存储结果的显著开销。
在本发明的一个实施例中,未被构建的实例叶可以被标记为“原子性”节点。 原子性节点可以一次被仅一条光线地被遍历。一旦光线穿过原子性节点,该原 子性节点就被锁定,并且该原子性节点在遍历着色器执行的结束时被解锁。在 一个实施例中,遍历着色器将节点的状态设置为“无效”,这即使在锁被释放之 后也防止光线进入该节点。这允许遍历硬件跳过节点,或暂停光线的遍历,而 无需执行新的遍历着色器。
在一个实施例中,对于原子性节点,使用某些互斥体/条件语义而不是常 规原子性语义。例如,如果遍历电路/逻辑8003将光线遍历到代理节点,则它 尝试锁定该节点。如果这在节点已被锁定时失败,则遍历电路/逻辑8003自动 地执行“suspendRay(暂停光线)”而不返回到EU 4001。如果锁定被成功地执 行,则遍历电路/逻辑8003处理代理节点。
使用遍历着色器对加速结构的惰性构建
本发明的一个实施例根据图86B中所示的处理流程进行操作。作为概述, 按需构建器8607在确定为潜在可见的几何实例8660之上构建加速结构。潜在 可见的实例8660由预构建器8655基于来自G缓冲器8650的主要可见性数据 和指示前一帧中的可见性的可见性历史数据8651生成。潜在可见的实例8660 也可以基于可见底部层级加速结构(BLAS)映射8675来确定,该可见BLAS 映射8675指示包括可见基元的加速结构的底部层级节点。在一个实施例中, 可见BLAS映射8675响应于由遍历逻辑8670执行的遍历操作而持续被更新,该遍历逻辑8670可以包括在图形处理器的执行单元上执行的专用遍历电路和/ 或遍历着色器。
按需构建器8607生成与潜在可见的实例8660相关联的加速结构的那些部 分。光线生成着色器8678基于遍历单元8670遍历通过加速结构部分的加速结 构的这些部分选择性地生成光线。遍历单元8670向按需构建器8670通知其用 于遍历所需的附加加速结构节点,并更新由光线生成着色器8678使用的BLAS 像素掩码8677(例如,光线生成着色器8678仅为未被掩码的像素生成光线) 和可见的BLAS映射8675。
因此,按需构建器8706在潜在可见的实例8660上选择性地构建底部层级 加速结构,并且实例可见性在光线遍历8670期间被更新。不像先前的实现方 式,本发明的实施例在多个轮次中操作,以避免复杂的光线调度。这个想法类 似于最近的纹理空间着色方法,其中使用可见性驱动的纹素标记来避免最终渲 染之前的冗余着色。
在操作中,首先构建用于在前一轮次中被标记为潜在可见的空的实例的 BLAS。在第二轮次中,光线生成着色器8678选择性地将光线重新拍摄到未完 成的像素,其中使用遍历着色器来记录更多潜在可见的空的实例或完成像素。 每次迭代后,不完整像素的数量减少,直到没有剩下遍历空的实例的光线。
本发明的一个实施例使用GPU栅格化器和光线追踪硬件一起执行混合渲 染。这是因为在创建G缓冲器8650时,容易获得场景中的所有实例的主要可 见性。因此,这些实施例中的预构建器8655通过使用该数据高效地构建初始 加速结构来利用混合渲染。在第一次迭代之前,潜在可见的实例8660被标记 在这个预构建启发式中(如下文所讨论)。
下面的代码序列是抽象的高级着色器语言(HLSL),其描述了使用一些 内联函数和用户函数描述的遍历着色器的一个实施例:
Figure BDA0003815892730001701
Figure BDA0003815892730001711
SkipTraversal()内联函数被定义为忽略当前实例并继续在更高层级的加速 结构中的遍历。如所提及,可见底部层级加速结构(BLAS)映射8675用于 记录加速结构构建器和遍历着色器中常用的实例可见性。如图86C中所示,可 见BLAS映射8675的一个实施例包含:与每个BLAS ID 8674相关联的、指示 实例所引用的BLAS可见性的标志8676,以及指示BLAS是否已经被构建的 两个标志-Built_Full(构建_满)和Built_Empty(构建_空)。此外,将布尔标 志trav_valid(遍历_有效)添加到光线有效载荷,以保持对遍历状态的跟踪, 该遍历状态可用于检查光线到目前为止是否已遇到空的实例。
在一个实施例中,遍历着色器中的可见性被保守地更新,因为所有经遍历 的实例对于当前光线都是潜在可见的。因此,首要任务是针对当前实例的对应 BLAS将可见性标志设置为“真”。遍历着色器还将可见性历史(vis_history)标 志设置为“真”,以在下一帧中重新使用该标志(上述代码序列的第9行)。 接下来,基于当前实例的状态(空或满)和光线状态(即trav_valid值)确定 遍历目的地。如图86D中所示,这被分类为三个状态8690-8692。
对于空的实例8690,对应的像素掩码会被重置(第15行),以便在下一 轮次中重新拍摄光线。随后通过在光线有效载荷中设置trav_valid标志(第16 行)使当前遍历无效。最后,通过调用SkipTraversal()继续TLAS遍历。
对于满的实例和无效遍历情况8691,当前实例具有已构建的BLAS,但光 线到目前为止已遇到空的实例(即trav_valid为“假”)。因为光线最终将再次 射向当前像素,因此可以跳过BLAS遍历(第20行)。
对于满的实例和有效遍历8692,由于光线通常在没有空的实例的情况下 遍历加速结构,因此遍历着色器取得当前实例的BLAS并继续遍历。如果光线 保持有效性直到遍历结束,则光线通常将调用并执行最近命中或未命中着色器。
否则,那些着色器在不执行其代码的情况下返回控制并完成当前轮次,这 避免用于次级光线的硬件光线遍历和着色器启动的开销。在下一个轮次中,光 线再次仅射向具有“假”掩码的像素,并且针对对那些像素的有效遍历被尝试。
对于加速结构构建操作,取决于可见性比特掩码的可见性标志,构建实例 的BLAS或创建空的实例。潜在可见的实例通常构造BLAS(BUILD_FULL), 并且不可见实例仅计算几何的边界框并将其打包在TLAS的叶节点中 (BUILD_EMPTY)。其他两个标志也被引用,指示在前一次轮次中是否已经 为当前对象执行了BUILD_FULL或BUILD_EMPTY操作。通过检查这些标志, 可以避免在构建-遍历循环的不同迭代中对同一对象的重复操作。
一旦完成针对对象的BLAS构建过程,就将通过在这些BLAS上构建 TLAS来构建最终的加速结构。TLAS仅在第一轮次中被重建并在其余轮次中 被修整,因为所有对象的边界框在第一轮次中已经能够被建立。
如上所述,本发明的一个实施例执行多个轮次,这使得它有时为同一像素 冗余地发射光线。这是因为当前轮次应当弥补前一轮次中的无效遍历。这可能 导致冗余的硬件光线遍历和着色器调用。然而,一个实施例通过应用像素掩码 将遍历成本的这种开销仅限制于对应于无效遍历的像素。
此外,甚至在第一条光线被遍历之前(例如,通过预构建器8655),使 用不同的技术来标识潜在可见的BLAS(并构建它们)。使用G缓冲区8650, 可以标记可能被主光线遍历的直接可见的实例。此外,假设存在大量帧到帧一 致性;因此,在前一帧中被遍历的实例的BLAS也是预先构建的。这两种技 术的结合大大减少了构建-遍历迭代的数量。
用于材料剔除掩码的装置和方法
现有的光线追踪API使用8比特剔除掩码来跳过针对某些几何实例的光线 遍历。这例如用于防止特定对象投射阴影,或用于隐藏对象以防反射。此特征 允许在单个加速结构中表示不同的几何子集,而不是为每个子集构建单独的加 速结构。8比特掩码中的比特设置可用于平衡遍历性能和资源开销,该资源开 销用于维护多个加速结构。例如,如果掩码中的比特被设置为0,则可以忽略 对应的实例。
渲染引擎可以将多个几何实例与资产相关联,并且每个几何实例可以包含 多个材料。然而,当前的光线追踪API仅允许以实例的粒度来指定剔除掩码。 这意味着对不同的材料具有不同的剔除掩码的资产不能使用标准剔除。作为应 变方法,当前的实现方式使用任何命中着色器来忽略相交,这是昂贵且复杂的。
如图87中所示,本发明的一个实施例逐材料地暴露这些掩蔽控制。具体 而言,一个实现方式包括基于N比特材料的剔除掩码8701以跳过针对与某些 材料相关联的几何实例的部分的光线遍历。在一个实施例中,使用8比特基于 材料的剔除掩码,但本发明的根本性原理不限于该实现方式。与现有实现方式 形成对照,基于材料的剔除掩码8701被暴露,并且可以被遍历电路/逻辑8003 利用以用于逐材料地以及逐实例地进行实例剔除。
在一个特定的实现方式中,N比特剔除掩码8701存储在命中组8700内, 从而提供固定功能的每材料剔除并减轻对昂贵的任何命中着色器应变办法的 需要。如本文所使用的“命中组”8700是API对象,该API对象包含用于处理 命中场景中给定对象的光线的一组着色器。该组着色器可以包括例如最近命中 着色器、任何命中着色器和(对于程序性几何而言)相交着色器。在一个实现 方式中,基于材料的剔除掩码8701与命中组8700相关联,作为附加数据片。
为了将剔除掩码8701与命中组8700相关联,剔除掩码8701可以被存储 在API提供以供实现方式使用的32字节着色器记录内(例如,经由如本文所 述的记录ID来标识)。然而,请注意,本发明的根本性原理不限于用于将剔 除掩码与命中组相关联的任何特定技术。
在一个实施例中,遍历/相交电路8003以基于材料的剔除掩码8701为基 础直接剔除潜在命中。例如,掩码值0可指示应当剔除具有对应材料的实例。 替代地或附加地,可以通过在驱动器内注入任何命中着色器来模拟此行为。
几何图像加速器和方法
几何图像是三维(3D)三角形网格到二维(2D)域中的映射。具体而言, 几何图像可以将几何表示为经量化的点的2D数组。对应的图像数据(诸如, 颜色和法线)也可以使用相同的隐式表面参数化被存储在2D数组中。由2D 数组表示的2D三角形网格由具有隐式连通性的顶点位置的规则栅格来定义。
在本发明的一个实施例中,通过将3D三角形网格映射到2D平面中来形 成几何图像,从而产生由顶点位置的规则栅格定义的隐含的三角形连通性。所 得到的2D几何图像可以在图形管线内以各种方式进行处理,包括使用纹理映 射(mipmap)进行下采样和上采样。
如图88中所示,本发明的一个实施例通过在几何图像域上生成四叉树结 构8850来执行光线追踪,其中每个四叉树节点8800、8810-8813在2D三角形 网格8820的顶点位置上存储轴对齐的边界框(AABB)。如所图示,每个节点 8800、8810-8813存储相关联的AABB的最小和最大坐标,该AABB包含三角 形和/或顶点中的一个或多个。这导致极其正则化且非常容易计算的结构。
一旦在2D三角形网格上构造了AABB,就可以使用本文中关于本发明的 各种实施例所描述的AABB来执行光线追踪操作。例如,可以执行遍历操作以 确定光线遍历BVH的底部层级节点8810-8813中的一个。然后可以对光线测 试与2D网格的相交,并且光线可命中如本文中所述(例如,根据与2D三角 形网格相关联的材料)生成和处理的结果(如果有的话)。
如所图示,在一个实施例中,存储/压缩逻辑8850被配置用于将AABB压 缩和/或存储为双图像金字塔8855,一个存储最小值,并且一个存储最大值。 在此实施例中,针对几何图像开发的不同压缩方案可用于压缩最小值和最大值 图像金字塔。
以上关于图88描述的四叉树结构8850、8860-8861可由BVH构建器8007 来生成。替代地,四叉树结构可以由不同组的电路和/或逻辑来生成。
用于光线追踪的框-框测试和加速碰撞检测的装置和方法
图89A-图89B图示根据本发明的一个实施例的光线追踪体系结构。多个 执行单元8910执行与光线追踪操作相关的着色器和其他程序代码。在执行单 元(EU)8910中的一个上执行的“Traceray”函数触发光线状态初始化器8920, 以对追踪通过包围体层次体系(BVH)的当前光线(经由光线ID/描述符被标 识)所需的状态(例如,被存储在存储器缓冲器8918中的栈5121中或本地或 系统存储器3198中的其他数据结构中)进行初始化。
在一个实施例中,如果Traceray函数标识出先前遍历操作已部分地完成的 光线,则状态初始化器8920使用唯一的光线ID从存储器3198中的一个或多 个缓冲器8918加载相关联的光线追踪数据4902和/或栈5121。如所提及,存 储器3198可以是片上存储器/本地存储器或缓存和/或系统级存储器设备。
如关于其他实施例所讨论,可以维持跟踪数组5249以存储针对每条光线 的遍历进度。如果当光线线已经部分地遍历BVH,则状态初始化器8920可以 使用跟踪数组5249来确定在其处重新开始的BVH层级/节点。
遍历和光线框测试单元8930使光线遍历通过BVH。当在BVH的叶节点 内已标识出基元时,实例/四边形相交测试器8940对光线测试与基元(例如, 一个或多个基元四边形)的相交,从集成在图形处理器的缓存层次体系内的光 线追踪缓存8960(此处显示为被耦合到L1缓存8970)取回相关联的光线/着 色器记录。实例/四边形相交测试器8940在本文中有时简称为相交单元(例如, 图51中的相交单元5103)。
光线/着色器记录被提供给线程调遣器8950,该线程调遣器8950至少部分 地使用本文描述的无绑定线程调遣技术将新线程调遣到执行单元8910。在一个 实施例中,光线/框遍历单元8930包括上述遍历/栈跟踪逻辑5248,该遍历/栈 跟踪逻辑5248跟踪并存储针对跟踪数组5249内的每条光线的遍历进度。
渲染中的一类问题可以被映射到测试框与其他包围体或框的碰撞(例如, 由于重叠)。此类框查询可用于枚举查询边界框内的几何以用于各种应用。例 如,框查询可用于在光子映射期间收集光子,枚举可能影响查询点(或查询区 域)的所有光源,和/或搜索距某个查询点最近的表面点。在一个实施例中,框 查询在与光线查询相同的BVH结构上的操作;因此,用户可以追踪通过某个 场景的光线,并在同一场景上执行框查询。
在本发明的一个实施例中,对于光线追踪硬件/软件,框查询与光线查询 类似地处理,其中光线/框遍历单元8930使用框/框操作而不是光线/框操作来 执行遍历。在一个实施例中,遍历单元8930可以使用与用于光线/框操作的相 同的一组特征以用于框/框操作,包括但不限于运动模糊、掩码、标志、最近命 中着色器、任何命中着色器、未命中着色器和遍历着色器。本发明的一个实施 例向每个光线追踪消息或指令(例如,如本文所述的TraceRay)添加比特,以 指示该消息/指令与BoxQuery(框查询)操作相关联。在一个实现方式中, BoxQuery在(例如,分别使用标准调遣操作和无绑定线程调遣操作的)同步 和异步光线追踪两者模式下被启用。
在一个实施例中,一旦经由该比特设置为BoxQuery模式,光线追踪硬件 /软件(例如,遍历单元8930、实例/四边形相交测试器8940等)就将与光线 追踪消息/指令相关联的数据解释为框数据(例如,三个维度中的最小/最大值)。 在一个实施例中,如前所述,遍历加速结构被生成和维护,但是框被初始化来 代替用于每个主StackID(栈ID)的光线。
在一个实施例中,不对框查询执行硬件实例化。然而,可以使用遍历着色 器在软件中模拟实例化。因此,当在框查询期间到达实例节点时,硬件可以将 该实例节点作为程序性节点来处理。由于这两个结构的头部是相同的,因此这 意味着硬件将调用存储在实例节点的头部中的着色器,该着色器随后可以继续 实例内部的点查询。
在一个实施例中,设置光线标志以指示实例/四边形相交测试器8940将接 受第一次命中并结束搜索(例如,ACCEPT_FIRST_HIT_AND_END_SEARCH 标志)。当这个光线标志未被设置时,相交的子根据他们距查询框的距离从前 到后被输入,类似于光线查询。在搜索距某个点最近的几何时,这种遍历顺序 显著地改善性能,就像光线查询的情况一样。
本发明的一个实施例使用任何命中着色器来过滤掉假肯定命中。例如,虽 然硬件可能无法在叶层级执行准确的框/三角形测试,但它将保守地报告命中叶 节点的所有三角形。此外,当搜索框被任何命中着色器缩小时,即使叶节点框 可能不再与经缩小的查询框重叠,硬件也可以将出栈的叶节点的基元返回为命 中。
如图89A中所指示,可由执行单元(EU)8910发出框查询,该EU 8910 向硬件发送消息/命令(即,Traceray)。随后处理如上所述继续进行——即, 通过状态初始化器8920、光线/框遍历逻辑8930、实例/四边形相交测试器8940 和无绑定线程调遣器8950。
在一个实施例中,通过将查询框的下界存储在与光线原点相同的位置中、 将上界存储在与光线方向相同的位置中、并将查询半径存储到远值中,框查询 重新使用如用于光线查询的MemRay数据布局。
Figure BDA0003815892730001771
使用此MemBox布局,硬件使用框[下界-半径,上界+半径]来执行查询。 因此,所存储的边界在每个维度上扩展了L0范数中的某一半径。此查询半径 对于容易地缩小搜索区域(例如,用于最近点搜索)可以是有用的。
由于MemBox布局仅重新使用MemRay布局的光线原点、光线方向和Tfar成员,因此无需为光线查询更改硬件中的数据管理。相反,数据像光线数据一 样被存储在内部存储装置(例如,光线追踪缓存8960和L1缓存8970)中, 并且将仅针对框/框测试以不同方式解释。
在一个实施例中,由光线/状态初始化单元8920和光线/框遍历单元8930 执行以下操作。来自TraceRay消息中的附加比特“BoxQueryEnable”在状态初 始化器8920中被管线化(影响其跨消息的紧凑),从而向每个光线/框遍历单 元8930提供BoxQueryEnable设置的指示。
光线/框遍历单元8930随每条光线存储“BoxQueryEnable”,从而将该比特 作为带有初始光线加载请求的标签进行发送。当所请求的光线数据从存储器接 口被返回时,通过经设置的BoxQueryEnable,倒数计算被绕过,并且替代地为 RayStore中的所有部件(即,根据框而不是光线)加载不同的配置。
光线/框遍历单元8930将BoxQueryEnable比特管线化到底层测试逻辑。 在一个实施例中,根据以下配置设置来修改光线框数据路径。如果BoxQueryEnable==1,则框的平面不被改变,因为它基于光线方向的x分量、 y分量和z分量的符号而改变。绕过对光线框而言不必要的针对光线执行的检 查。例如,假设查询框没有INF或NAN,因此这些检查在数据路径中被绕过。
在一个实施例中,在由命中确定逻辑进行处理之前,执行另一加操作以确 定值下界+半径(基本上是来自命中的t-值)和下界-半径。此外,在命中“实例 节点”(在硬件实例化实现方式中)时,命中确定逻辑不计算任何变换,而是 使用实例节点中的着色器ID来启动相交着色器。
在一个实施例中,当BoxQueryEnable被设置时,光线/框遍历单元8930 不对任何命中着色器执行NULL着色器查找。此外,当BoxQueryEnable被设 置时,当有效节点是QUAD(四边形)、MESHLET(小网格)类型时,光线/ 框遍历单元8930调用相交着色器,就像它在更新存储器中的潜在命中信息后 将调用ANY HIT SHADER(任何命中着色器)一样。
在一个实施例中,在每个多核心组3100A中(例如,在光线追踪核心3150 内)提供图89A所示的各种部件的单独集合。在该实现方式中,每个多核心组 3100A可以在不同的一组光线数据和/或框数据上并行地操作以执行如本文所 述的遍历和相交操作。
用于光线追踪的小网格压缩和解压缩的装置和方法
如上所述,“小网格”是通过几何分区而创建的网格的子集,其包括基于相 关联属性的数量的某个数量的顶点(例如,16个、32个、64个、256个等)。 小网格可以被设计为共享尽可能多的顶点,以允许在渲染期间顶点重复使用。 这种分区可以被预先计算以避免运行时处理,或者可以在每当网格被绘制时在 运行时被动态地执行。
本发明的一个实施例执行小网格压缩以减少针对底部层级加速结构 (BLAS)的存储需求。该实施例利用小网格表示具有类似顶点的较大网格的 小的片的事实,以允许在128B的数据块内的高效压缩。然而,要注意,本发 明的根本性原理不限于任何特定的块大小。
可以在对应的包围体层次体系(BVH)被构建并在BVH消耗点处被解压 缩时(例如,由光线追踪硬件块)执行小网格压缩。在下面描述的某些实施例 中,在L1缓存(有时称为“LSC单元”)和光线追踪缓存(有时称为“RTC单 元”)之间执行小网格解压缩。如本文所述,光线追踪缓存是由光线遍历/相交 硬件使用的高速本地缓存。
在一个实施例中,在硬件中加速小网格压缩。例如,如果执行单元(EU) 路径支持解压缩(例如,以潜在地支持遍历着色器执行),则网格解压缩可以 集成在L1缓存之外的公共路径中。
在一个实施例中,使用消息来发起对存储器中128B的块的小网格压缩。 例如,4X64B的消息输入可以被压缩为输出到着色器的128B的块。在此实 现方式中,在BVH中添加额外的节点类型以指示与经压缩的小网格的关联。
图89B图示用于小网格压缩的一个特定实现方式,包括集成在光线追踪 集群内的小网格压缩块(meshlet compression block,RTMC)9030和小网格解 压缩块(meshletdecompression block,RTMD)9090。当从执行着色器的执行 单元8910向(例如,在光线追踪核心3150内的)光线追踪集群传送新消息时, 调用小网格压缩9030。在一个实施例中,该消息包括四个64B阶段和128B写 入地址。来自EU 8910的消息指令小网格压缩块9030在本地存储器3198(和 /或系统存储器,取决于实现方式)中将顶点和相关的小网格数据定位在何处。 小网格压缩块9030随后执行如本文所述的小网格压缩。经压缩的小网格数据 随后可以经由存储器接口9095存储在本地存储器3198和/或光线追踪缓存 8960中,并由实例/四边形相交测试器8940和/或遍历/相交着色器访问。
在图89B中,小网格收集和解压缩块9090可以收集针对小网格的经压缩 的数据并将数据解压缩成多个64B的块。在一个实现方式中,仅经解压缩的小 网格数据被存储在L1缓存8970内。在一个实施例中,在基于节点类型(例如, 叶节点,经压缩)和基元ID取得BVH节点数据时,小网格解压缩被激活。遍 历着色器还可以使用与光线追踪实现方式的其余部分相同的语义来访问经压 缩的小网格。
在一个实施例中,小网格压缩块9030接受来自EU 8910的输入三角形的 数组并产生经压缩的128B小网格叶结构。该结构中的连续三角形的对形成四 边形。在一个实现方式中,如下面的代码序列中所指示,EU消息包括最多14 个顶点和三角形。经压缩的小网格经由存储器接口9095被写入存储器、在消 息中所提供的地址处。
在一个实施例中,着色器计算用于小网格的集合的比特预算,并因此地址 被提供,使得占用空间压缩是可能的。仅针对可压缩的小网格发起这些消息。
Figure BDA0003815892730001801
Figure BDA0003815892730001811
在一个实施例中,小网格解压缩块9090对来自128B的小网格两个连续 的四边形(128B)进行解压缩,并将经解压缩的数据存储在L1缓存8970中。 L1缓存8970中的标签跟踪每个经解压缩的四边形的索引(包括三角形索引) 和小网格地址。光线追踪缓存8960以及EU 8910可以从L1缓存8970中取得 64B经解压缩的四边形。在一个实施例中,如下所示,EU8910通过向L1缓 存8960发出MeshletQuadFetch(小网格四边形取得)消息来取得经解压缩的 四边形。可以发出单独的消息以用于取得四边形的前32个字节和后32个字节。
如下所示,着色器可以从四边形结构访问三角形顶点。在一个实施例中, “if”语句被“sel”指令替换。
Figure BDA0003815892730001812
在一个实施例中,光线追踪缓存8960可以通过提供小网格地址和四边形 索引直接从L1缓存8970库取得经解压缩的四边形。
Figure BDA0003815892730001813
小网格压缩过程
在为诸如几何属性(例如,标志和掩码)之类的固定开销分配比特后,将 小网格的数据添加到经压缩的块,同时基于(pos.x,pos.y,pos.z)与(base.x,base.y, base.z)(其中基值包括列表中的第一个顶点的位置)相比的增量来计算剩余的 比特预算。类似地,也可以计算prim-ID增量。由于增量与第一个顶点进行比 较,因此以低等待时间解压缩更便宜。基础位置和primID以及增量比特的宽 度是数据结构中恒定开销的一部分。对于偶数三角形的剩余顶点,位置增量和 prim-ID增量被存储在不同的64B的块上,以便并行地将它们打包。
使用这些技术,BVH构建操作在经由存储器接口9095写出经压缩的数据 时对存储器消耗较低的带宽。此外,在一个实施例中,将经压缩的小网格存储 在L3缓存中允许以相同的L3缓存大小对更多BVH数据的存储。在一种工作 实现方式中,超过50%的网格以2:1被压缩。在使用带有经压缩的小网格的BVH 时,存储器处的带宽节省导致功率节省。
用于计算和光线追踪管线中的无绑定线程调遣和工作组/线程抢占的装置 和方法
如上所述,无绑定线程调遣(BTD)是在不支持共享本地存储器(SLM) 或存储器屏障的实现方式中解决针对光线追踪的SIMD分散问题的方法。本发 明的实施例包括对可用于解决针对各种计算模型的SIMD分散的广义BTD的 支持。在一个实施例中,具有线程组屏障和SLM的任何计算调遣都可以产生 无绑定子线程,并且所有线程都可以经由BTD被重新分组和调遣以改善效率。 在一个实现方式中,针对每父线程一次准许一个无绑定子线程,并且准许起始 线程和无绑定子线程共享它们的SLM空间。仅当最终会聚的父线程终止(即,执行EOT)时,才释放SLM和屏障两者。一个特定实施例允许在可调用模式 内进行放大,从而允许多于一个的子线程被生成的树遍历情况。
图90以图形方式图示可由SIMD管线同步处理的初始线程集9000。例如, 线程9000可以作为工作组被调遣和同步执行。然而,在该实施例中,初始同 步线程集9000可以生成多个分散生成的线程9001,这些分散生成的线程9001 可以在本文描述的异步光线追踪体系结构内产生其他生成的线程9011。最终, 会聚生成线程9021返回到原始线程集9000,该原始线程集9000随后可以继续 同步执行,从而根据跟踪数组5249根据需要恢复上下文。
在一个实施例中,无绑定线程调遣(BTD)功能通过在执行和完成后父线 程的恢复(分散后,并随后会聚生成)期间持续存在来支持SIMD16和SIMD32 模式、可变通用寄存器(general purpose register,GPR)使用、共享本地存储 器(SLM)和BTD屏障。本发明的一个实施例包括用于恢复父线程的硬件管 理的实现方式以及SLM和屏障资源的软件管理的取消引用。
在本发明的一个实施例中,以下术语具有以下含义:
可调用模式:由无绑定线程调遣生成的线程处于“可调用模式”。这些线程 可以访问继承的共享本地存储器空间,并且可以可选地在可调用模式下每线程 地生成线程。在该模式下,线程对工作组层级的屏障无访问权。
工作组(Workgroup,WG)模式:当线程正以与标准线程调遣所调遣的 组成的SIMD通道相同的方式执行时,这些线程被定义为处于工作组模式。在 该模式下,线程具有对工作组层级的屏障以及共享本地存储器的访问权。在一 个实施例中,线程调遣响应于发起仅计算上下文的“计算走查器”命令而被发起。
普通生成:也称为常规生成线程9011(图90),每当一个可调用对象调 用另一个时,就发起普通生成。此类生成线程被认为处于可调用模式。
分散生成:如图90所示,当线程从工作组模式转变到可调用模式时,分 散生成线程9001被触发。分散生成的变量是SIMD宽度和固定功能线程ID (fixed function threadID,FFTID),这些参数是子组统一的。
会聚生成:当线程从可调用模式往回转变到工作组模式时,执行会聚生成 线程9021。会聚生成的变量是每通道的FFTID,以及指示通道的栈是否为空的 掩码。必须通过检查返回站点处的每通道的栈指针的值来动态地计算此掩码。 编译器必须计算此掩码,因为这些可调用线程可递归地相互调用。没有经设置 的会聚比特的会聚生成中的通道将表现得像普通生成。
在不允许共享本地存储器或屏障操作的一些实现方式中,无绑定线程调遣 解决了针对光线追踪的SIMD分散问题。此外,在本发明的一个实施例中,BTD 用于使用多种计算模型来解决SIMD分散。具体而言,具有线程组屏障和共享 本地存储器的任何计算调遣都可以生成无绑定的子线程(例如,针对每父线程 一次一个子线程),并且所有相同的线程都可以由BTD重新分组和调遣,以 得到更高的效率。此实施例允许起始线程与其子线程共享其共享本地存储器空 间。仅在最终会聚的父线程终止(如线程结束(end of thread,EOT)指示符所 指示的)时才释放共享本地存储器分配和屏障。本发明的一个实施例还提供可 调用模式内的放大,从而允许多于一个的子线程被生成的树遍历情况。
尽管不限于此,但本发明的一个实施例在不由任何SIMD通道提供对放大 的支持的系统上实现(即,仅允许以分散或会聚生成线程的形式的单个未完成 的SIMD通道)。此外,在一个实现方式中,(FFTID,BARRIER_ID,SLM_ID) 的32b在调遣线程时被发送到BTD启用的调遣器8950。在一个实施例中,在 启动线程并将该信息发送到无绑定线程调遣器8950之前,所有这些空间被释 放。在一个实现方式中,一次仅单个上下文是活动的。因此,流氓(rogue)内 核即使在篡改FFTID之后也无法访问其他上下文的地址空间。
在一个实施例中,如果StackID(栈ID)分配被启用,则当线程终止时将 不再取消引用共享本地存储器和屏障。相反,仅在线程终止时所有相关联的 StackID都已被释放的情况下,它们才被取消引用。一个实施例通过确保 StackID被适当释放来防止固定功能线程ID(FFTID)泄漏。
在一个实施例中,屏障消息被指定为从发送线程显式地获取屏障ID。这 对于在无绑定线程调遣调用之后启用屏障/SLM使用是必要的。
图91图示用于执行如本文所述的无绑定线程调遣和线程/工作组抢占的体 系结构的一个实施例。此实施例的执行单元(EU)8910支持对线程执行掩码 9150-9153的直接操纵,并且每个BTD生成消息支持FFTID引用计数,这对 于在会聚生成9021的完成之后重新生成父线程是重要的。因此,本文描述的 光线追踪电路支持BTD生成和TraceRay消息的附加的消息变体。在一个实施 例中,BTD启用的调遣器8950维护分散生成线程9001上的原始SIMD通道的 每FFTID(如由线程调遣所指派)计数,并为会聚生成线程9021倒计数以启 动父线程9000的恢复。
在执行期间可对各种事件进行计数,这些事件包括但不限于:常规生成 9011执行;分散生成执行9001;会聚生成事件9021;FFTID计数器达到最小 阈值(例如,0);以及针对(FFTID、BARRIER_ID、SLM_ID)执行的加载。
在一个实施例中,通过BTD启用的线程允许共享本地存储器(SLM)和 屏障分配(即,遵守ThreadGroup语义)。BTD启用的线程调遣器8950将FFTID 释放和屏障ID释放与线程结束(end of thread,EOT)指示(例如,经由特定 消息)解耦。
在一个实施例中,为了支持来自计算线程的可调用着色器,驱动器管理的 缓冲器9170用于存储跨无绑定线程调遣的工作组信息。在一个特定实现方式 中,驱动器管理的缓冲器9170包括多个条目,其中每个条目与不同的FFTID 相关联。
在一个实施例中,在状态初始化器8920内,分配两个比特来指示管线生 成类型,该管线生成类型被纳入为针对消息压缩的考虑因素。对于分散消息, 状态初始化器8920还纳入以下各项作为考虑因素:来自消息的FFTID、以及 来自具有去往光线/框遍历块8930或无绑定线程调遣器8950的每个SIMD通道 的管线的FFTID。对于会聚生成9021,存在针对消息中的每个SIMD通道的 FFTID、以及具有用于光线/框遍历单元8930或无绑定线程调遣器8950的每个 SIMD通道的管线FFTID。在一个实施例中,光线/框遍历单元8930还使生成 类型(包括会聚生成9021)管线化。具体而言,在一个实施例中,光线/框遍 历单元8930管线化并存储具有用于TraceRay消息的每个光线会聚生成9021 的FFTID。
在一个实施例中,线程调遣器8950具有专用接口以提供以下数据结构以 准备调遣具有经设置的无绑定线程调遣启用比特的新线程:
Figure BDA0003815892730001851
无绑定线程调遣器8950还使用三个附加比特来处理线程结束(EOT)消 息:Release_FFTID(释放_FFTID)、Release_BARRIER_ID(释放_屏障_ID)、 Release_SLM_ID(释放_SLM_ID)。如所提及,线程结束(EOT)消息不一定 释放/取消引用与ID相关联的所有分配,而仅释放/取消引用具有经设置的释放 比特的分配。典型的用例是当分散生成9001被发起时,生成线程产生EOT消 息,但释放比特未被设置。生成线程在会聚生成9021之后的延拓将产生另一 个EOT消息,但这次具有经设置的释放比特。仅在这个阶段,所有的每线程资源才将被回收。
在一个实施例中,无绑定线程调遣器8950实现新接口以加载FFTID、 BARRIER_ID、SLM_ID和通道计数。无绑定线程调遣器8950将所有该信息存 储在FFTID可寻址存储装置9121中,该FFTID可寻址存储装置9121具有一 定数量条目的深度(max_fftid,在一个实施例中为144个条目的深度)。在一 个实现方式中,BTD启用的调遣器8950响应于任何常规生成9011或分散生成 9001而使用用于每个SIMD通道的该标识信息,逐FFTID地执行对FFTID可 寻址存储装置9121的查询,并将线程数据存储在如上所述的排序缓冲器(参 见例如图42中的内容可寻址存储器4201)中。这导致SIMD通道地在排序缓 冲器4201中存储附加的数据量(例如,24比特)。
在接收到会聚生成消息后,对于从状态初始化器8920或光线/框遍历块 8930到无绑定线程调遣器8950的每个SIMD通道,每FFTID的计数递减。当 给定的父的FFTID计数器变为零时,利用原始的执行掩码9150-9153并利用由 排序电路4008中的会聚生成消息提供的延拓着色器记录4201来调度整个线 程。
本发明的不同实施例可以根据不同的配置进行操作。例如,在一个实施例 中,由线程执行的所有分散生成9001必须具有匹配的SIMD宽度。此外,在 一个实施例中,SIMD通道不得在相关执行掩码9150-9153内设置了 ConvergenceMask(会聚掩码)比特的情况下执行会聚生成9021,除非某个较 早的线程使用相同的FFTID执行了分散生成。如果使用给定的StackID执行分 散生成9001,则必须在下一个分散生成之前发生会聚生成9021。
如果线程中的任何SIMD通道执行分散生成,则所有通道最终都必须执行 分散生成。已执行分散生成的线程可能不会执行屏障,否则将发生死锁。该限 制对于在分散的控制流中启用生成是必要的。直到所有通道都已分散并重新会 聚才能重新生成父子组(parent subgroup)。
线程必须在执行任何生成后最终终止以保证向前进展。如果在线程终止之 前执行了多次生成,则可能发生死锁。在一个特定实施例中,遵循以下不变量, 但本发明的根本性原理不限于此:
●由线程执行的所有分散生成必须具有匹配的SIMD宽度。
●SIMD通道不得在相关执行掩码9150-9153内设置了ConvergenceMask 比特的情况下执行会聚生成,除非某个较早的线程使用相同的FFTID执行了分 散生成。
●如果使用给定的StackID执行分散生成,则必须在下一个分散生成之前 发生会聚生成。
●如果线程中的任何SIMD通道执行分散生成,则所有通道最终都必须执 行分散生成。已执行分散生成的线程可能不会执行屏障,否则将发生死锁。该 限制在分散的控制流内实现生成。直到所有通道都已分散并重新会聚才能重新 生成父子组。
●线程必须在执行任何生成后最终终止以保证向前进展。如果在线程终止 之前执行了多次生成,则可能发生死锁。
在一个实施例中,BTD启用的调遣器8950包括线程抢占逻辑9120以用 于抢占某些类型的工作负载/线程的执行以释放资源用于执行其他类型的工作 负载/线程。例如,本文描述的各种实施例可以执行计算工作负载和图形工作负 载(包括光线追踪工作负载)两者,计算工作负载和图形工作负载可以以不同 的优先级运行和/或具有不同的等待时间要求。为了解决每个工作负载/线程的 要求,本发明的一个实施例暂停光线遍历操作,以释放执行资源用于更高优先 级的工作负载/线程或否则将无法满足指定的等待时间要求的工作负载/线程。
如上面关于图52A-图52B所描述,一个实施例减少了对于使用短栈 5203-5204在遍历操作期间存储有限数量的BVH节点的遍历的存储需求。这些 技术可以由图91中的实施例使用,其中光线/框遍历单元8930高效地使条目入 栈到短栈5203-5204和从短栈5203-5204出栈,以确保所需的BVH节点 5290-5291可用。此外,当遍历操作被执行时,遍历/栈跟踪器5248更新跟踪 数据结构(本文中称为跟踪数组5249),以及相关的栈5203-5204和光线追踪 数据4902。使用这些技术,当光线的遍历被暂停和重新启动时,遍历电路/逻 辑8930可以查阅跟踪数据结构5249并访问相关的栈5203-5204和光线追踪数 据4902,以在BVH内、与光线被停止的相同位置处对该光线开始遍历操作。
在一个实施例中,如本文中所述,线程抢占逻辑9120确定何时要抢占一 组遍历线程(或其他线程类型)(例如,为更高优先级的工作负载/线程释放资 源),并通知光线/框遍历单元8930,使得它可以暂停处理当前线程中的一个 以释放资源用于处理更高优先级的线程。在一个实施例中,通过在遍历在旧线 程上完成之前为新线程调遣指令来简单地执行该“通知”。
因此,本发明的一个实施例包括对以下两者的硬件支持:在工作组模式(即, 其中工作组的所有线程被同步地执行)下操作的同步光线追踪、以及使用无绑 定线程调遣的异步光线追踪。与要求工作组中的所有线程在执行抢占之前完成 的当前系统相比,这些技术极大地改善了性能。相比之下,本文描述的实施例 可以通过密切跟踪遍历操作、仅存储重新启动所需的数据以及在适当时使用短 栈来执行栈级和线程级抢占。这些技术是可能的,至少部分地因为光线追踪加 速硬件和执行单元8910经由以每光线层级和每BVH层级被管理的持久存储器 结构3198进行通信。
当如上所述生成Traceray消息并且存在抢占请求时,光线遍历操作可在各 个阶段被抢占,所述各个阶段包括:(1)尚未开始,(2)部分地被完成并被 抢占,(3)在没有无绑定线程调遣的情况下遍历完成,以及(4)遍历完成但 具有无绑定线程调遣。如果尚未开始遍历,则在恢复光线追踪消息时不需要来 自跟踪数组5249的附加数据。如果遍历被部分地完成,则遍历/栈跟踪器5248 将根据需要使用光线追踪数据4902和栈5121读取跟踪数组5249以确定在哪 里恢复遍历。遍历/栈跟踪器5248可以使用指派给每条光线的唯一ID来查询 跟踪数组5249。
如果遍历完成,并且没有无绑定线程调遣,则可以使用存储在跟踪数组 5249(和/或其他数据结构4902、5121)中的任何命中信息来调度无绑定线程 调遣。如果遍历完成并且存在无绑定线程调遣,则恢复无绑定线程并恢复执行 直到完成。
在一个实施例中,跟踪数组5249包括用于飞行中光线的每个唯一光线ID 的条目,并且每个条目可以包括用于对应线程的执行掩码9150-9153中的一个。 或者,执行掩码9150-9153可以被存储在单独的数据结构中。在任一实现方式 中,跟踪数组5249中的每个条目可以包括1比特值或与1比特值相关联,以 指示当光线/框遍历单元8930在抢占之后恢复操作时是否需要重新提交对应的 光线。在一个实现方式中,此1比特值在线程组(即,工作组)内被管理。该 比特可以在光线遍历的开始时被设置为1,并且可以在光线遍历完成时被重置 回0。
本文描述的技术允许与光线遍历相关联的遍历线程被其他线程(例如,计 算线程)抢占,而无需等待遍历线程和/或整个工作组完成,从而改善与高优先 级和/或低等待时间线程相关联的性能。此外,由于本文描述的用于跟踪遍历进 度的技术,遍历线程可以在它停止的地方重新启动,从而节省大量的处理周期 和资源使用。此外,上述实施例允许工作组线程生成无绑定线程并提供用于重 新会聚以返回原始SIMD体系结构状态的机制。这些技术有效地将光线追踪和 计算线程的性能提高了一数量级。
用于数据并行光线追踪的装置和方法
在科学可视化中(但也在电影和其他领域中),数据集正日益增长到无法 由单个节点处理的大小。对于离线算法(主要在电影中),这通常通过分页、 缓存和核心外(out-of-core)技术来处置;但是当需要交互式设置时(例如, 石油和天然气的可视化、大数据/HPC环境中的科学可视化、交互式电影内容 预览等),这就不再可能了。在这种情况下,绝对有必要使用某种形式的数据 并行渲染,其中数据跨多个不同的节点被分区——使得整个数据可以跨所有节 点进行存储——并且其中这些节点在渲染所需的图像时协作。
本发明的实施例包括用于在跨多个计算节点的数据分布式光线追踪的上 下文中减少用于传输光线和/或体积块的带宽的装置和方法。例如,图92图示 包括多个光线追踪节点9210-9213的光线追踪集群9200,这些光线追踪节点 9210-9213并行地执行光线追踪操作,从而潜在地组合在节点中的一个节点上 的结果。在所示体系结构中,光线追踪节点9210-9213经由网关9220通信地 耦合到客户端侧光线追踪应用9230。
在下面的描述中将假设多个节点9210-9213共同持有光线追踪数据。每个 此类节点9210-9213可以包含一个或多个CPU、GPU、FPGA等,并且可以在 这些资源中的各个资源上或这些资源的组合上执行计算。在一个实施例中,计 算节点9210-9213通过诸如Infiniband、OmniPath或NVLink(仅举几例)之类 的某种形式的网络9215相互通信。数据可以跨这些节点9210-9213的存储器 进行分配,因为使用渲染器的应用本身已经对数据进行了分区(诸如,ParaView、 Visit等之类的许多原位算法或并行中间件就是这种情况),或者因为渲染器已 经创建了此分区。
为了在此类环境中进行并行渲染,有多种算法选择:基于合成的方法使每 个节点渲染其本地数据的镜像,并使用深度和/或α合成来组合这些部分结果。 数据转发(或缓存)方法计算给定节点上给定光线(或像素、路径等)的操作, 检测此光线/像素/路径需要存在于另一节点上的数据的无论什么时候,并按需 取得此数据。基于光线转发的方法不将数据转发到需要它的光线,而是将光线 发送到数据所在的位置:当节点检测到光线需要处理另一节点的数据时,它将 该光线发送到拥有该数据的节点。
在这些选择当中,合成是最简单且最广泛地被使用的;然而它只适用于相 对简单的渲染效果,并且不能轻易用于诸如阴影、反射、环境光遮蔽、全局照 明、体积散射、体积阴影之类的效果。用户正更频繁地需要的此类效果需要某 种光线追踪:在这种情况下,数据并行渲染要么将数据取到光线,要么将光线 发送到数据。这两种方法以前都使用过,并且它们的局限性是很好理解的。具 体而言,这两种方法都受到高带宽要求的影响,要么通过在周围发送最多数十 亿条光线(用于光线转发),要么通过使每个节点9210-9213取得最多数十亿 字节的数据(用于数据转发),或者通过这两者(当两者的结合被使用时)。
尽管网络带宽正在急剧上升,但数据大小和/或光线计数也在上升,这意 味着该带宽实际上很快就会成为性能的限制因素。事实上,这通常是无法实现 交互性能的唯一原因,除非在非常简单化的设置下(诸如,仅主光线渲染,在 这种情况下人们可能也已经使用了合成)。
本发明的一个实施例聚焦于这样的核心思想,即,在实践中,数据的非常 大的部分对于给定的帧通常实际上并不重要。例如,在体渲染中,用户经常使 用“传递函数”来强调数据的某些区域,其中不太感兴趣的数据被设置为完全透 明。显然,仅会遍历“不感兴趣的”数据的光线不会需要取得该数据(或被发送 到该数据),并且相应的带宽可以被节省。类似地,对于基于表面的光线追踪, 如果光线穿过另一节点拥有的空间的区域,但实际上不与那里的任何三角形相 交,那么它实际上不需要与该另一节点的三角形交互。
一个实施例以使用在本文中被称为用于节点的数据的“代理”9230-9233 的形式将“空白空间跳过”和“边界体积”的概念从各个节点扩展到数据并行渲染。 具体而言,每个节点计算其自身的数据的非常低的存储器占用空间代理 9230-9233,使得该代理提供对该数据进行近似或保守地界定该数据的能力。 所有节点9210-9213然后交换它们的代理9230-9233,使得每个节点拥有每个 其他节点的代理。例如,存储在节点9210上的代理9230将包括来自节点 9211-9213的代理数据。当节点需要通过另一节点所拥有的空间区域来追踪光 线时,该节点首先通过它自身的该节点代理的副本来追踪这条光线。如果该代 理保证将不会发生有意义的交互,则该节点可以跳过发送该光线/取得该数据, 从而节省这样做所需的带宽。
图93图示根据本发明的一个实施例的光线追踪节点9210的附加细节。体 积细分模块9265将体积细分为多个分区,分区中的每一个分区由不同的节点 来处理。工作数据集9360包括用于要由节点9210处理的分区的数据。代理生 成模块9250基于工作数据集9360生成代理9340。代理9340被传送到其他光 线追踪节点9211-9213中的每一个,这些其他光线追踪节点9211-9213如本文 所述使用代理来剔除不需要的数据。类似地,分别在节点9211-9213上生成的 代理9341-9343被传送到节点9210。光线追踪引擎9315使用本地存储的工作 数据集9360和由经互连的节点9211-9213中的每一个节点提供的代理 9341-9343两者来执行光线追踪操作。
图94图示以下示例:其中,在体积渲染的上下文中,给定的体数据集9400 过大而无法在一个节点上被渲染,因此它被分区为多个块9401-9404(在这种 情况下为2x2集合)。如图95中所示,这个被逻辑分区的体积随后跨不同的 节点9210-9213分布,每个节点保留体积的一部分。
传统上,每当节点想要发送穿过其他节点的空间区域的光线时,该节点必 须要么将该光线发送到那些节点,要么取得那些节点的数据。例如,在图96中, 节点9210追踪穿过节点9211-9213所拥有的空间的光线。
如图97中所示,在一个实施例中,每个节点9210-9213分别计算用于数 据9401-9404中的其一部分的本地代理9240-9243,其中代理是在大小上(显 著地)更小、但允许对该节点的数据进行近似或保守地界定该节点的数据的任 何种类的对象。例如,在一个实施例中,每个节点计算通常称为“宏单元栅格” 的内容;其为较低分辨率的栅格,其中每个单元对应于输入体积中的单元的区 域,并且其中每个此类单元存储例如该区域中的最小和最大标量值(在单节点 渲染的上下文中,这通常用于“空间跳过”)。在所示示例中,每个节点9210-9213 为数据中的其部分计算一个此类代理9240-9243。在一个实施例中,所有节点随后交换它们相应的代理,直到每个节点都具有针对每个节点的所有代理,如 图98中所示。
如果对于给定的传递函数设置,仅数据值中的一些数据值实际上是感兴趣 的(在某种意义上,它们不是完全透明的),则可以在代理中保守地检测到这 一点(就像传统的单节点空间跳过所进行的一样)。这在图99中被图示为区 域9940-9943。
此外,由于每个节点都具有其他节点的代理,因此每个节点还可以基于其 针对这些节点所具有的代理来保守地界定其他节点的哪些区域是感兴趣的,如 图100中所示。如果节点9210必须追踪跨越节点9211-9213的数据区域的光 线,则该光线可以被投影到代理上并在那里被遍历,如虚线箭头所指示。这指 示虽然光线确实穿过节点9210-9212所拥有的空间,但实际上仅节点9212包 含任何感兴趣的区域,因此该光线可以被转发到节点9212(如在图100中由实 线箭头所指示),而无需在节点9210上进行处理或发送到节点9211(或者, 在缓存上下文中,数据可以仅从节点9210被取得,而不是从9211和9212两 者被取得)。
在图101中图示根据本发明的一个实施例的方法。该方法可在上文所描述 的体系结构的上下文内实现,但并不限于任何特定的处理体系结构或系统体系 结构。
在10101处,体积被逻辑地细分为多个分区(N),并且在10102处,与 N个分区相关联的数据被分布到N个不同节点(例如,在一个实施例中,针对 每节点一个分区)。在10103处,每个节点为其相应的分区计算代理,并将该 代理发送给其他节点。在10104处,使用代理对当前光线或光线组(例如,光 束)执行遍历/相交操作,从而潜在地忽略代理内的、与操作无关的某些区域。 如所提及,对于给定的传递函数设置,仅数据值中的一些数据值实际上是感兴 趣的(例如,因为它们不是完全透明的)。这可以在代理中被保守地检测到, 就像单节点空间跳过所进行的一样。如果在10105处确定光线与代理交互,则 在10106处,(一条或多条)光线被发送到与代理相关联的节点或从该节点取 回数据。随后在10107处,选择下一条光线或光线组。
当然,本文描述的实施例取决于实际数据、光线分布、传递函数等。 然而,数据看起来与以上提供的示例非常类似的情况并不少见。显然,对 于导致显著地更不“稀疏”的分类后数据集的数据集/传递函数(即,传递函 数后的数据集被应用),代理将不会有太大帮助。然而,在那种情况下, 光线将可能很快终止,并因此不必非常频繁地在节点之间被发送,并且也 不产生过多的带宽。本质上,最大的问题情况是在其中大量数据为稀疏的 以及在其中光线跨许多节点行进的那些情况,并且那些问题正是在其中本 文描述的技术最有效的情况。
用于利用着色器调用图分析进行光线追踪的装置和方法
虽然就着色器如何被调遣和执行而言,光线追踪本质上是“黑盒”,但 着色器执行模式直接影响光线追踪引擎的可调试性和性能。
某些光线追踪实现方式对可以捆包到单个SIMD线程中的着色器记录 执行施加限制。例如,在本申请的受让人开发的无绑定线程调遣(BTD) 单元中,某些光线追踪硬件着色器记录只能在相同的双子切片(Dual Sub Slice,DSS)的范围内被捆包(例如,参见图52A和相关联的文本)。此 外,如果两个着色器记录调遣随着时间的推移分散开,则由于有限的缓冲 器空间,它们可能无法被捆包在一起。这两个限制可能导致执行关键路径 (诸如,一个子切片被分配比另一子切片更多的工作),并且还可导致具 有低SIMD通道使用率的硬件线程。
本文所指的“子切片”或“切片”包括光线追踪引擎的定义的子集。子切 片可以包括对指定数量的光线独立执行遍历和相交所需的所有光线追踪硬 件资源。例如,图52A分别图示双光线区块5201-5202和对应的双栈 2403-2404。在一个实施例中,每个光线区块5201-5202包括多个条目,用 于存储从存储器加载的对应的多个传入光线5206。对应的栈5203和5204 分别包括从存储器读取并且在本地存储以供进行光线处理的所选择的BVH 节点数据5290-5291。
图102图示其中着色器记录1-4在两个子切片1和2内被调遣的示例。 在此示例中,为子切片1内的光线1和光线2调遣的着色器记录4的两个 实例10201无法成组,因为着色器调用被间隔过多的时间。着色器记录3 的两个实例10202无法成组,因为它们位于不同的子切片中。此外,如10203 所指示,跨子切片调遣的工作不平衡。
现有技术(诸如,使用硬件度量和着色器二进制插桩方法)不提供必 要的细节层级来启用对光线追踪性能的调试。例如,这些技术无法用于确 定为什么某些着色器调用随着时间的推移而分散开、产生大的关键路径的 着色器调用的调用栈、以及可以被改变/移除以解决问题的主光线或次级光 线。
本发明的实施例包括用于生成光线追踪着色器调用图的技术,该光线 追踪着色器调用图在所执行的着色器记录之间建立关系并将这些关系绑定 到它们被执行的范围内的光线。这些实施例还使用于光线追踪着色器调度 的瓶颈分析自动化。这进而允许应用开发人员对如何改变光线分布或要优 化什么着色器做出加权决策。
本发明的一个实施例包括图103中所示的操作阶段。该图示的方法可 在本文中描述的各种系统体系结构上执行,但不限于任何特定的体系结构。
第一阶段10301执行光线追踪着色器的二进制插桩和追踪数据收集。 鉴于光线追踪着色器可以由某些编译器(例如,诸如,英特尔图形编译器 (Intel Graphics Compiler,IGC)拆分成多个块并且对DispatchRaysIndex (调遣光线索引)的追踪是资源密集型操作这一事实,插桩是复杂的。因 此,在一个实施例中,在特定点处添加插桩代码,使得可以重构执行简档 并且可以测量性能数据,但同时最小化所引入的开销。下面提供针对一个 实施例的具体细节。
在下一阶段10302中,调用图被重构。在重构阶段10302中,在已执 行着色器之后,收集的数据被处理并转换为性能数据(例如,指令块时序、 SIMD占用值等)。该数据的关联由具体的着色器记录来构建,并且着色器 记录被映射到发源主光线。
在阶段10303中,重构的调用图被映射到着色器源代码。因为编译器 可以将一个光线追踪着色器内联到另一个以达到优化目的,因此在二进制 代码和源代码之间可能没有一对一的映射。因此,在一个实施例中,从编 译器取回二进制代码范围与原始源代码之间的映射,该编译器可以被配置 用于在着色器编译期间累积该信息。使用此信息,追踪点被映射到源代码 上,从而允许将着色器调用图中的块指派给代码的对应部分以进行进一步 分析。
在阶段10304中,标识性能瓶颈和改进机会。一个实施例使用所构造 的着色器调用图来定位阻止对线程调遣器(例如,BTD)进行分组的高效 着色器记录的低效执行模式。例如,这些低效的执行模式可包括标识以下 实例:同一着色器记录分散在多个双子切片上的实例、着色器记录的执行 随着时间的推移过于分散并因此产生低SIMD占用率的实例,以及执行关 键路径的实例。
在最终阶段10305中,生成优化推荐。例如,基于问题的类型,可以 建议优化步骤,诸如,最小化针对特定主光线的次级光线的数量,改变光 线投射模式以增加与特定着色器记录调用相关的命中局部性,以及优化落 入关键路径的特定着色器。
参见图104,在一个实现方式中,各个阶段由光线追踪优化平台10400 来执行,该平台10400可以被实现为用于优化光线追踪着色器和相关联的 程序代码的工具。平台10400可以以软件、硬件或它们的任何组合来实现。 例如,光线追踪优化平台10400包括逻辑10411-10415,用于实现关于图 103描述的对应阶段10301-10305。
二进制着色器10401被提供作为对二进制插桩引擎10411的输入,该 二进制插桩引擎10411执行第一阶段10301——光线追踪着色器的二进制 插桩和追踪数据收集。执行所得的经插桩的着色器(10402),并收集执行 数据以供调用图重构逻辑10412用于重构调用图(即,阶段10302)。
从编译器10404提供源代码到二进制代码范围的映射,该编译器10404 被配置用于在着色器编译期间累积该信息。使用此信息,着色器源映射逻 辑10413将追踪点映射到源代码上(阶段10303),从而允许将着色器调用 图中的块指派给代码的对应部分以供进一步分析。
效率分析模块10414分析结果以标识性能瓶颈和改进机会(阶段 10304)。优化逻辑10415随后生成推荐的优化动作(阶段10305)。
推荐的优化动作10305可以推荐列表的形式提供给终端用户。替代地 或附加地,某些类型的优化动作10305可以根据用户请求被自动地执行。 例如,光线追踪优化平台10400可以提供自动修复程序代码中检测到的低 效率中的一个或多个低效率的选项,并且将在由用户确认后这么做。
提供了针对本发明的一个特定实施例的以下附加细节。然而,应当注 意,这些具体细节中的许多细节不是遵守本发明的根本性原理所必需的。
在一个实施例中,着色器ID是唯一地标识着色器的值,诸如,由编译 器生成的散列值。着色器记录索引是对于对应的未命中、命中组或可调用 着色器表中的着色器记录的索引。着色器记录本身可以包括着色器和本地 根签名。
在一个实施例中,以下附加术语具有以下含义:
●“调遣光线索引”包括用于光线调遣网格的宽度维度和高度维度的x值和 y值。
●“TID”是唯一地标识图形处理器上的线程的线程标识符。
●“SIMD通道调遣掩码”是指定哪些SIMD通道对于特定的着色器调用是 活动的掩码。
●“RTDispatchGlobals”是用于所有光线追踪着色器调用的全局变量。
●“LocalArg”是指特定着色器调用本地的变量,并作为指针提供给特定着 色器调用。
●“StackID”是指源自同一“主”光线(例如,RayGen着色器中的TraceRay 内联函数)的着色器调用的调用栈。该调用栈可以经由“StackID Release(栈 ID释放)”标志经设置的发送指令被移动到空闲StackID的池。
●“EOT”是指线程消息的结束。
1.光线追踪着色器的二进制插桩和追踪收集
在第一阶段10301(着色器的二进制插桩和追踪收集)中,光线追踪 优化平台10400的二进制插桩逻辑添加对不同数据进行采样的二进制插桩 追踪点。光线追踪着色器通常由编译器拆分为多个块,诸如,具有多个延 拓着色器记录的单个主着色器记录。这些块可以在不同的执行单元(EU) 和硬件线程上运行,但在同一子切片(例如,某些实现方式中的DSS)内。 这使得对在特定EU处和给定时间用户着色器或着色器记录实际被执行的 内容的追踪复杂化。为了解决这个问题,每个二进制块在每个“入口点”上 和在每个对应的EOT消息之前被插桩。在一个实施例中,对ShaderID和 LocalArgPtr(其在处理后阶段被转换为ShaderRecordIndex)执行追踪。
图105图示其中光线追踪着色器10511被编译器10404拆分成块10515 的示例。二进制着色器插桩和追踪收集逻辑10301随后将插桩代码添加到 块10515。如在10502处所指示的,在每个入口点(例如,在10521A-C处) 上和在每个EOT之前(例如,在10522处)添加追踪插桩代码。
性能特性对于对具体的瓶颈类型进行分类是重要的。当不能够积累足 够的类似着色器记录时,无绑定线程调遣可掩蔽掉一些通道。在一个实施 例中,为了分析这个问题,SIMD通道调遣掩码在每个主着色器记录的开始 处被采样,该SIMD通道调遣掩码被转换为每着色器的SIMD通道占用值 (例如,被占用通道的百分比)。此外,在每个主/延拓着色器记录“入口点” 处和在每个EOT消息之前收集时间戳,以便表征针对每个着色器的执行等 待时间。
为了将所有着色器记录执行组织成每主光线的集群,并追踪它们的调 用顺序,光线追踪优化平台10400的一个实施例追踪DispatchRaysIndex, 该DispatchRaysIndex是需要使用来自编译器10404的静态数据和在运行时 追踪的动态数据(例如,图104中的执行数据)两者进行计算的函数。此 外,光线追踪优化平台10400的一个实施例每通道地执行这些计算,因为 每个SIMD通道可以处理来自完全不同光线的着色器:
DispatchRaysIndex[lane]=F(static_data,dynamic_data[lane])
(DispatchRaysIndex[通道]=F(静态_数据,动态_数据[通道]))
为了避免相关联的开销,光线追踪优化平台10400的一个实施例将仅 在每个主着色器记录和延拓着色器记录的开始处追踪StackID和子切片ID (例如,DSS ID或SS ID),并且将仅在“StackID Free(栈ID空闲)”消 息之前追踪DispatchRaysIndex。追踪[StackID,SS ID]对的开销是低的,因 为它们是从寄存器读取的,并且唯一地标识由主光线投射触发的着色器执 行链,直到“StackIDFree”消息被发送。
该技术在图106中示出,图106图示StackID和DSS ID被追踪以及结 果被存储在着色器记录1和着色器记录2的开始处的概况分析缓冲器10601 中。仅响应于StackIDRelease指示符(指示StackID被释放)的变化,将追 踪为DispatchRaysIndex收集并被存储在概况分析缓冲器10601中的数据。 因此,光线追踪优化平台10400的这个实施例追踪单个DispatchRaysIndex, 这足以将整个执行链映射到特定光线。
在尚未将StackID或DispatchRayIndex指派给光线的情况下,可以直 接在光线生成(RayGen)着色器内部执行对DispatchRayIndex的确定。例 如,在一个实施例中,编译器10404向二进制插桩引擎10301提供光线追 踪片大小(例如,线程组),二进制插桩引擎10301随后按如下方式计算 RayGen着色器内的X索引、Y索引(对于16x16的片和每片SIMD8=32个线 程):
X偏移=i+8*(TID&1),其中i=0,1,2…7
Y偏移=TID/2
X索引=GroupIDX*16+X偏移
Y索引=GroupIDY*16+Y偏移
总之,在一个实施例中,被采样用于分析的数据包括以下各项中的一 项或多项:ShaderID和LocalArgPtr、SIMD通道调遣掩码、追踪时间戳、 栈ID和子切片ID、DispatchRayIndex和“StackIDFree”消息。随后如本文所 述使用这些采样值来标识和修复低效状况。
2.调用图重构
光线追踪优化平台10400的调用图重构逻辑10302处理从经插桩的着 色器10402收集的数据,以重构着色器调用顺序并将其映射到主光线。
以下示例追踪简档将用于解释。然而,应当注意,本发明的根本性原 理不限于这一特定数据集。为了简单起见,这里的DSS ID相同的,但重要 的是,栈ID在DSS范围内是唯一的,因此在操作中,这一点应当被考虑 在内:
Figure BDA0003815892730001991
表E
参考表E中的数据,StackID和DSS ID的组合唯一地标识了主光线和 所有相关联的次级光线。然而,由于StackID可以被释放并重新用于未来的 光线,因此所有StackIDFree消息都必须被纳入到分析中作为考虑因素。 DispatchRaysIndex值定义已被执行的具体的主光线。着色器散列值和着色 器记录索引值分别定义针对特定光线被执行的着色器代码和着色器记录。
说道这里,上面的追踪示例可以被分解为以下语句:
●存在由条目1-2和5-6表示的两条主光线。
●第一主光线(1-2)生成由条目3-4表示的次级光线。
●这两条主光线执行相同的着色器A,但分别在不同的着色器记录- SR0和SR2-的范围内执行。
●次级光线在着色器记录SR1范围内执行着色器B。
这进而产生图107中所示的执行流程,图107图示最初由与着色器A 关联的着色器记录0 10700和着色器记录2 10702处理的两条主光线 (TraceRay(0,0)和TraceRay(1,1))。与着色器B相关联的着色器记录1 10701处理由第一主光线(TraceRay(0,0))生成的次级光线。
3.映射到着色器源代码
如所提及,因为编译器可以将一个光线追踪着色器内联到另一光线追 踪着色器中以达到优化目的,因此这不是在二进制代码和源代码之间的一 对一的映射。因此,为了执行映射,着色器源映射逻辑从编译器10404取 回二进制代码范围到原始源代码之间的源-行映射(source-line-mapping)。 在一个实现方式中,编译器10404被配置用于在着色器编译期间累积该数 据。使用该信息,着色器源映射逻辑10413将追踪点映射到源代码上。这 允许将着色器调用图中的块指派给代码的对应部分以及相关联的性能数据 (例如,时序和SIMD通道使用)以供进一步分析。
4-5.标识性能瓶颈和推荐优化
在一个实施例中,效率分析逻辑10414使追踪性能数据、GPU度量和 着色器执行模式相关联,以标识不同类别的问题,优化器逻辑10415使用 这些不同类别的问题来呈现优化推荐。
作为示例而非限制,所追踪的时间戳和GPU度量(性能数据)可以指 示处理资源的一些部分(例如,双子切片(DSS))比其他部分更频繁地 被占用。同时,着色器调用图可显示大量终止的主光线(例如,经由 MissShader调用)。效率分析逻辑10414可以将此标识为由于早期光线终 止而导致的不平衡,并且优化器逻辑10415可以建议减少经由未命中着色器在早期终止的光线的数量。
作为另一示例,所追踪的时间戳和GPU度量可以指示处理资源的一些 部分(例如,双子切片(DSS))比其他部分更频繁地被占用,而着色器 调用图可以显示产生关键路径(例如,执行时间最长或生成最多光线的路 径)的着色器记录。效率分析逻辑10414可以将此标识别为由于着色器记 录依赖性而导致的不平衡,并且优化器逻辑10415可以建议针对该着色器 记录优化着色器或通过分析其父着色器调用来尝试将其从关键路径移除。
替代地,性能数据可以指示针对特定着色器记录的低SIMD占用,而 着色器调用图示出DSS上的各个着色器记录调用经由长度大不相同(例如, 差异大于阈值)的路径而源起。效率分析逻辑10414可以将此问题标识为 着色器记录调用随时间的推移分散过远,并且优化器逻辑10415可以建议 切割较长的调用路径以增加时间上的调用局部性(例如,经由移除次级光 线)。
类似地,性能数据可以指示针对特定着色器记录的低SIMD占用,而 着色器调用图显示在分布在双子切片上的光线中调用了同一主着色器记录。 效率分析逻辑10414可以将此问题标识为着色器记录调用分散在双子切片 上,并且优化器逻辑10415可以建议改变光线投射模式以增加相对于调遣 片(例如,32x 32的片)的局部性。
当然,以上仅是示例。本发明的根本性原理可以用各种不同类型的性 能数据和着色器调用图来实现,从而产生不同的分析结果和优化。
示例
以下是本发明的不同实施例的示例实现方式。
示例1.一种方法,包括:执行对光线追踪着色器的二进制插桩;追 踪光线追踪着色器的执行以生成执行度量;基于执行度量构造着色器调用 图;将着色器调用图映射到着色器源代码以生成源代码图;基于源代码图 确定光线追踪着色器执行中的低效率;以及基于低效率标识优化动作。
示例2.如示例1的方法,其中,构造着色器调用图进一步包括:将 执行度量与光线追踪着色器的着色器记录相关联。
示例3.如示例2的方法,其中,构造着色器调用图进一步包括:将 着色器记录映射到主光线。
示例4.如示例1的方法,进一步包括:将执行度量转换为性能数据; 以及使用性能数据构造着色器调用图。
示例5.如示例1的方法,其中,将着色器调用图映射到着色器源代 码进一步包括:确定二进制代码范围与源代码之间的源-行映射;以及使用 源-行映射将追踪点映射到源代码。
示例6.如示例1的方法,其中,确定光线追踪着色器执行中的低效 率包括:标识第一处理资源分配,该第一处理资源分配比第二处理资源分 配负荷更重。
示例7.如示例6的方法,其中,第一处理资源分配包括第一双子切 片(DSS),并且第二处理资源分配包括第二DSS。
示例8.如示例7的方法,其中,响应于着色器调用图指示高于阈值 的终止主光线的数量,所确定的低效率包括由于早期光线终止而导致的不 平衡,并且优化动作包括减少经由未命中着色器在早期终止的光线的数量。
示例9.如示例1的方法,其中,确定光线追踪着色器执行中的低效 率包括针对特定着色器记录的低SIMD占用,并且优化动作包括:切割较 长的调用路径以增加时间上的调用局部性,或改变光线投射模式以增加相 对于调遣片的局部性。
示例10.如示例9的方法,其中,优化动作中的一个优化动作是基于分 析着色器调用图而被选择的。
示例11.一种装置,包括:二进制插桩引擎,用于执行对光线追踪着色 器的二进制插桩,并用于追踪光线追踪着色器的执行以生成执行度量;调 用图构造逻辑,用于基于执行度量构造着色器调用图;着色器源映射逻辑, 用于将着色器调用图映射到着色器源代码以生成源代码图;效率分析逻辑, 用于基于源代码图确定光线追踪着色器执行中的低效率;以及优化逻辑, 用于基于低效率标识优化动作。
示例12.如示例11的装置,其中,为了构造着色器调用图,调用图构 造逻辑用于将执行度量与光线追踪着色器的着色器记录相关联。
示例13.如示例12的装置,其中,为了构造着色器调用图,调用图构 造逻辑用于将着色器记录映射到主光线。
示例14.如示例11的装置,其中,二进制插桩引擎用于将执行度量转 换为性能数据,并且着色器调用图构造逻辑用于使用性能数据来构造调用 图。
示例15.如示例11的装置,其中,为了将着色器调用图映射到着色器 源代码,着色器源代码映射逻辑用于:确定二进制代码范围与源代码之间 的源-行映射;以及使用源-行映射将追踪点映射到源代码。
示例16.如示例11的装置,其中,为了确定光线追踪着色器执行中的 低效率,效率分析逻辑用于标识第一处理资源分配,该比第二处理资源分 配负荷更重。
示例17.如示例16的装置,其中,第一处理资源分配包括第一双子切 片(DSS),并且第二处理资源分配包括第二DSS。
示例18.如示例17的装置,其中,响应于着色器调用图指示高于阈值 的终止主光线的数量,效率分析逻辑用于确定由于早期光线终止而导致的 不平衡,并且优化逻辑用于指示减少经由未命中着色器在早期终止的光线 的数量。
示例19.如示例11的装置,其中,效率分析逻辑用于确定针对特定着 色器记录的低SIMD占用,并且优化逻辑用于:切割较长的调用路径以增 加时间上的调用局部性,或改变光线投射模式以增加相对于调遣片的局部 性。
示例20.如示例19的装置,其中,优化逻辑用于:基于分析着色器调 用图,切割较长的调用路径以增加时间上的调用局部性,或改变光线投射 模式以增加相对于调遣片的局部性。
示例21.一种机器可读介质,具有存储于其上的程序代码,所述程序代 码当由机器执行时,使所述机器执行以下操作:执行对光线追踪着色器的 二进制插桩;追踪光线追踪着色器的执行以生成执行度量;基于执行度量 构造着色器调用图;将着色器调用图映射到着色器源代码以生成源代码图; 基于源代码图确定光线追踪着色器执行中的低效率;以及基于低效率标识 优化动作。
示例22.如示例21的机器可读介质,其中,构造着色器调用图还包括: 将执行度量与光线追踪着色器的着色器记录相关联。
示例23.如示例22的机器可读介质,其中,构造着色器调用图还包括: 将着色器记录映射到主光线。
示例24.如示例21的机器可读介质,进一步包括用于使机器执行以下 操作的程序代码:将执行度量转换为性能数据;以及使用性能数据构造着 色器调用图。
示例25.如示例21的机器可读介质,其中,将着色器调用图映射到着 色器源代码进一步包括:确定二进制代码范围与源代码之间的源-行映射; 以及使用源-行映射将追踪点映射到源代码。
示例26.如示例21的机器可读介质,其中,确定光线追踪着色器执行 中的低效率包括:标识第一处理资源分配,该第一处理资源分配比第二处 理资源分配负荷更重。
示例27.如示例26的机器可读介质,其中,第一处理资源分配包括第 一双子切片(DSS),并且第二处理资源分配包括第二DSS。
示例28.如示例27的机器可读介质,其中,响应于着色器调用图指示 高于阈值的终止主光线的数量,所确定的低效率包括由于早期光线终止而 导致的不平衡,并且优化动作包括减少经由未命中着色器在早期终止的光 线的数量。
示例29.如示例21的机器可读介质,其中,确定光线追踪着色器执行 中的低效率包括针对特定着色器记录的低SIMD占用,并且优化动作包括: 切割较长的调用路径以增加时间上的调用局部性,或更改光线投射模式以 增加相对于调遣片的局部性。
示例30.如示例29的机器可读介质,其中,优化动作中的一个优化动 作是基于分析着色器调用图而被选择的。
本发明的实施例实现对各种着色器执行低效率的分析,否则由于唯一 的光线追踪着色器执行模型,因而利用现有分析技术不可能检测到这些各 种着色器执行低效率。
本发明的实施例可包括上文已经描述的各步骤。这些步骤可以被具体化 为机器可执行指令,这些机器可执行指令可以用于使通用或专用处理器执行这 些步骤。替代地,这些步骤可由包含用于执行这些步骤的硬接线逻辑的特定硬 件部件来执行,或者由经编程的计算机部件和定制硬件部件的任何组合来执行。
如本文中所描述,指令可以指诸如专用集成电路(ASIC)之类的硬件的 特定配置,该专用集成电路被配置用于执行某些操作或者具有预定功能或存储 在被具体化在非暂态计算机可读介质中的存储器中的软件指令。因此,可以使 用在一个或多个电子设备(例如,端站、网络元件等)上存储并执行的代码和 数据来实现附图中示出的技术。此类电子设备使用计算机机器可读介质(在内 部和/或通过网络与其他电子设备)存储和传送代码和数据,计算机机器可读介 质诸如非暂态计算机机器可读存储介质(例如,磁盘;光盘;随机存取存储器; 只读存储器;闪存设备;相变存储器)以及暂态计算机机器可读通信介质(例如,电、光、声或其他形式的传播信号——诸如,载波、红外信号、数字信号 等)。
此外,此类电子设备典型地包括耦合到一个或多个其他部件(诸如,一个 或多个存储设备(非暂态机器可读存储介质)、用户输入/输出设备(例如,键 盘、触摸屏和/或显示器)、以及网络连接)的一个或多个处理器的集合。处理 器的集合与其他部件的耦合典型地通过一个或多个总线和桥接器(也被称为总 线控制器)。承载网络通信量的存储设备和信号分别表示一个或多个机器可读 存储介质和机器可读通信介质。因此,给定电子设备的存储设备典型地存储用 于在该电子设备的一个或多个处理器的集合上执行的代码和/或数据。当然,可 以使用软件、固件、和/或硬件的不同组合来实现本发明的实施例的一个或多个 部分。贯穿此具体实施方式,出于解释的目的,阐述了众多特定细节以便提供 对本发明的透彻理解。然而,对于本领域的技术人员而言将显而易见的是,可 以在没有这些特定细节中的一些细节的情况下实现本发明。在某些实例中,未 详细地描述公知结构和功能以避免使本发明的主题模糊。因此,本发明的范围 和精神应当根据所附权利要求来判定。

Claims (25)

1.一种方法,包括:
执行对光线追踪着色器的二进制插桩;
追踪所述光线追踪着色器的执行以生成执行度量;
基于所述执行度量构造着色器调用图;
将所述着色器调用图映射到着色器源代码以生成源代码图;
基于所述源代码图确定光线追踪着色器执行中的低效率;以及
基于所述低效率标识优化动作。
2.如权利要求1所述的方法,其中,构造所述着色器调用图进一步包括:
将所述执行度量与光线追踪着色器的着色器记录相关联。
3.如权利要求2所述的方法,其中,构造所述着色器调用图进一步包括:
将所述着色器记录映射到主光线。
4.如权利要求1至3中任一项所述的方法,进一步包括:
将所述执行度量转换为性能数据;以及
使用所述性能数据构造所述着色器调用图。
5.如示例1至4中任一项所述的方法,其中,将所述着色器调用图映射到着色器源代码进一步包括:
确定二进制代码范围与所述源代码之间的源-行映射;以及
使用所述源-行映射将追踪点映射到所述源代码。
6.如示例1至5中任一项所述的方法,其中,确定光线追踪着色器执行中的低效率包括:标识第一处理资源分配,所述第一处理资源分配比第二处理资源分配负荷更重。
7.如权利要求6所述的方法,其中,所述第一处理资源分配包括第一双子切片DSS,并且所述第二处理资源分配包括第二DSS。
8.如权利要求7所述的方法,其中,响应于所述着色器调用图指示高于阈值的终止主光线的数量,所确定的低效率包括由于早期光线终止而导致的不平衡,并且所述优化动作包括减少经由未命中着色器在早期终止的光线的数量。
9.如权利要求1至8中任一项所述的方法,其中,确定光线追踪着色器执行中的低效率包括针对特定着色器记录的低SIMD占用,并且所述优化动作包括:切割较长的调用路径以增加时间上的调用局部性,或改变光线投射模式以增加相对于调遣片的局部性。
10.如权利要求9所述的方法,其中,所述优化动作中的一个优化动作是基于分析所述着色器调用图而被选择的。
11.一种装置,包括:
二进制插桩引擎,用于执行对光线追踪着色器的二进制插桩,并用于追踪所述光线追踪着色器的执行以生成执行度量;
调用图构造逻辑,用于基于所述执行度量构造着色器调用图;
着色器源映射逻辑,用于将所述着色器调用图映射到着色器源代码以生成源代码图;
效率分析逻辑,用于基于所述源代码图确定光线追踪着色器执行中的低效率;以及
优化逻辑,用于基于所述低效率标识优化动作。
12.如权利要求11所述的装置,其中,为了构造所述着色器调用图,所述调用图构造逻辑用于将执行度量与光线追踪着色器的着色器记录相关联。
13.如权利要求例12所述的装置,其中,为了构造所述着色器调用图,所述调用图构造逻辑用于将所述着色器记录映射到主光线。
14.如权利要求11至13中任一项所述的装置,其中,所述二进制插桩引擎用于将所述执行度量转换为性能数据,并且所述着色器调用图构造逻辑用于使用所述性能数据来构造所述调用图。
15.如权利要求11至14中任一项所述的装置,其中,为了将所述着色器调用图映射到着色器源代码,所述着色器源代码映射逻辑用于:
确定二进制代码范围与所述源代码之间的源-行映射;以及
使用所述源-行映射将追踪点映射到所述源代码。
16.如权利要求11至15中任一项所述的装置,其中,为了确定光线追踪着色器执行中的低效率,所述效率分析逻辑用于标识第一处理资源分配,所述第一处理资源分配比第二处理资源分配负荷更重。
17.如权利要求16所述的装置,其中,所述第一处理资源分配包括第一双子切片DSS,并且所述第二处理资源分配包括第二DSS。
18.如权利要求17所述的装置,其中,响应于所述着色器调用图指示高于阈值的终止主光线的数量,所述效率分析逻辑用于确定由于早期光线终止而导致的不平衡,并且所述优化逻辑用于指示减少经由未命中着色器在早期终止的光线的数量。
19.如权利要求11至18中的任一项所述的装置,其中,所述效率分析逻辑用于确定针对特定着色器记录的低SIMD占用,并且所述优化逻辑用于:切割较长的调用路径以增加时间上的调用局部性,或改变光线投射模式以增加相对于调遣片的局部性。
20.如权利要求19所述的装置,其中,所述优化逻辑用于:基于分析所述着色器调用图,切割较长的调用路径以增加时间上的调用局部性,或改变光线投射模式以增加相对于调遣片的局部性。
21.一种机器可读介质,具有存储于其上的程序代码,所述程序代码当由机器执行时,使所述机器执行以下操作:
执行对光线追踪着色器的二进制插桩;
追踪所述光线追踪着色器的执行以生成执行度量;
基于所述执行度量构造着色器调用图;
将所述着色器调用图映射到着色器源代码以生成源代码图;
基于所述源代码图确定光线追踪着色器执行中的低效率;以及
基于所述低效率标识优化动作。
22.如权利要求21所述的机器可读介质,其中,构造所述着色器调用图进一步包括:
将所述执行度量与光线追踪着色器的着色器记录相关联。
23.如权利要求22所述的机器可读介质,其中,构造所述着色器调用图进一步包括:
将所述着色器记录映射到主光线。
24.如权利要求21至23中任一项所述的机器可读介质,进一步包括使所述机器执行以下操作的程序代码:
将所述执行度量转换为性能数据;以及
使用所述性能数据构造所述着色器调用图。
25.如权利要求21至24中任一项所述的机器可读介质,其中,将所述着色器调用图映射到着色器源代码进一步包括:
确定二进制代码范围与所述源代码之间的源-行映射;以及
使用所述源-行映射将追踪点映射到所述源代码。
CN202211026423.1A 2021-09-25 2022-08-25 用于利用着色器调用图分析进行光线追踪的装置和方法 Pending CN115861517A (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US17/485,399 US20230104199A1 (en) 2021-09-25 2021-09-25 Apparatus and method for ray tracing with shader call graph analysis
US17/485,399 2021-09-25

Publications (1)

Publication Number Publication Date
CN115861517A true CN115861517A (zh) 2023-03-28

Family

ID=85477051

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211026423.1A Pending CN115861517A (zh) 2021-09-25 2022-08-25 用于利用着色器调用图分析进行光线追踪的装置和方法

Country Status (3)

Country Link
US (1) US20230104199A1 (zh)
CN (1) CN115861517A (zh)
DE (1) DE102022124603A1 (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117233723B (zh) * 2023-11-14 2024-01-30 中国电子科技集团公司第二十九研究所 一种基于cnn类激活图的雷达跟踪包络提取方法

Also Published As

Publication number Publication date
DE102022124603A1 (de) 2023-03-30
DE102022124603A8 (de) 2023-06-29
US20230104199A1 (en) 2023-04-06

Similar Documents

Publication Publication Date Title
US11995767B2 (en) Apparatus and method for compressing ray tracing acceleration structure build data
US12002145B2 (en) Apparatus and method for efficient graphics processing including ray tracing
US11087522B1 (en) Apparatus and method for asynchronous ray tracing
JP7494258B2 (ja) ツリー構造データ削減のための装置および方法
CN113409434A (zh) 用于节流光线追踪流水线的设备和方法
EP4246449A1 (en) Apparatus and method for accelerating bvh builds by merging bounding boxes
CN113496540A (zh) 用于执行稳定和短等待时间排序操作的装置和方法
EP4246448A1 (en) Apparatus and method for acceleration data structure re-braiding with camera position
CN117581267A (zh) 用于同步光线追踪的栈访问扼制
CN115775197A (zh) 用于利用重要性采样的随机拼贴照明的装置和方法
US20230267676A1 (en) Apparatus and Method for Environment Probe Guided Light Sampling
US11989817B2 (en) Apparatus and method for high quality ray-traced level of detail transitions
EP4246450A1 (en) Apparatus and method for biased bvh traversal path
US20240233238A1 (en) Apparatus and method for intra-bvh level-of-detail selection
US20240020911A1 (en) Apparatus and Method for Routing Data from Ray Tracing Cache Banks
CN115861517A (zh) 用于利用着色器调用图分析进行光线追踪的装置和方法
US20230350641A1 (en) Apparatus and method for generating a quasi-random sequence
US20230298126A1 (en) Node prefetching in a wide bvh traversal with a stack
US12131420B2 (en) Apparatus and method for approximate puzzlepiece compositing
US20230297508A1 (en) Apparatus and method for hardware-accelerated texture lookup and interpolation
EP4280161A1 (en) Apparatus and method for bounding volume hierarchy (bvh) construction with stochastic processing
US20230394739A1 (en) Apparatus and Method for Approximate Puzzlepiece Compositing

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination