图形处理单元中的3D加速结构的完全并行适当地构造

申请号 CN201310076982.8 申请日 2013-03-11 公开(公告)号 CN103440238A 公开(公告)日 2013-12-11
申请人 辉达公司; 发明人 泰罗·卡拉斯;
摘要 本 发明 涉及一种 图形处理单元 中的3D 加速 结构的完全并行适当地构造。一种用于并行地构造二叉基数树的系统和方法,该二叉基数树用作用于构造二级(secondary)树的构建 块 。公开了具有用于使 计算机系统 实施方法的计算机可执行指令的非暂时性计算机可读存储介质。该方法包括确定包括被索引化的基元 节点 的总数的多个基元,其中多个基元与层次树的叶节点相对应。该方法包括将多个基元排序。该方法包括以至多要求关于基元节点的总数成线性数量的临时存储的方式构建层次树。该方法包括与层次树的内部节点的祖先节点的一个或多个并行地构建该内部节点。
权利要求

1.一种具有计算机可执行指令的非暂时性计算机可读存储介质,所述计算机可执行指令用于使计算机系统实施包括以下步骤的方法:
确定包括被索引化的基元节点的总数的多个基元,其中所述多个基元与层次树的叶节点相对应;
将所述多个基元排序;以及
至多要求关于所述基元节点的总数成线性数量的临时存储地构建所述层次树;以及与所述层次树的内部节点的祖先节点的一个或多个并行地构建所述内部节点。
2.根据权利要求1所述的计算机可读存储介质,其中所述方法中的所述确定多个基元包括:
给每个基元分派莫顿码。
3.根据权利要求1所述的计算机可读存储介质,其中所述方法中的所述构建层次树包括:
构建包括所述基元节点和一个或多个内部节点的二叉基数树,使得每个内部节点与由各自的子树中的相对应的基元节点的基元所共享的最长公共前缀相对应。
4.根据权利要求3所述的计算机可读存储介质,其中所述方法中的所述构建二叉基数树包括:
并行地处理内部节点的任意子集。
5.根据权利要求3所述的计算机可读存储介质,其中所述方法中的所述构建二叉基数树包括:
对于与内部节点相对应的给定的节点索引,基于所述节点索引确定所述多个基元的基元索引的对应范围的方向,其中所述给定的节点索引包括所述对应范围中的开始的基元索引或结尾的基元索引;
确定所述对应范围的长度;
确定所述对应范围中的基元索引之间的最高不同位;以及
指派子节点索引用于和与所述最高不同位相关联的所述基元索引相对应的所述给定的节点索引。
6.根据权利要求5所述的计算机可读存储介质,其中所述方法中的所述确定方向进一步包括:
基于哪个邻居基元具有最多的索引匹配确定所述方向。
7.根据权利要求5所述的计算机可读存储介质,其中所述方法中的所述确定长度包括:
确定用于所述长度的最大值;以及
实施二分搜索以确定用于所述长度的实际值。
8.根据权利要求5所述的计算机可读存储介质,其中所述方法中的所述子节点索引之一包括叶节点。
9.根据权利要求5所述的计算机可读存储介质,其中所述方法进一步包括:
编号用于所述多个基元的索引;
使用用于所述多个基元的相同的编号方案,编号用于所述至少一个内部节点的索引,其中所述至少一个内部节点的总数包括基元的所述总数减1,并且其中用于内部节点的索引号的基元索引的范围包括所述多个基元中的相同的索引号。
10.一种计算机系统,包括:
处理器,以及
存储器,其耦连到所述处理器并且具有存储在其中的指令,如果所述指令由所述计算机系统所执行,那么使所述计算机系统执行包括下列步骤的方法:
确定包括被索引化的基元节点的总数的多个基元,其中所述多个基元与层次树的叶节点相对应;
将所述多个基元排序;以及
至多要求关于所述基元节点的总数成线性数量的临时存储地构建所述层次树;以及与所述层次树的内部节点的祖先节点的一个或多个并行地构建所述内部节点。
11.根据权利要求10所述的计算机系统,其中所述方法中的所述确定多个基元包括:
给每个基元指派莫顿码。
12.根据权利要求10所述的计算机系统,其中所述方法中的所述构建层次树包括:
构建包括所述基元节点和一个或多个内部节点的二叉基数树,使得每个内部节点与由各自的子树中的基元所共享的最长公共前缀相对应。
13.根据权利要求12所述的计算机系统,其中所述方法进一步包括:
基于所述基数树构建第二树。
14.根据权利要求12所述的计算机系统,其中所述方法中的所述构建二叉基数树包括:
并行地处理内部节点的任意子集。
15.根据权利要求12所述的计算机系统,其中所述方法中的所述构建二叉基数树包括:
对于与内部节点相对应的给定的节点索引,基于所述节点索引确定所述多个基元的基元索引的对应范围的方向,其中所述给定的节点索引包括所述对应范围中的开始的基元索引或结尾的基元索引;
确定所述对应范围的长度;
确定所述对应范围中的基元索引之间的最高不同位;以及
指派子节点索引用于和与所述最高不同位相关联的所述基元索引相对应的所述给定的节点索引。

说明书全文

图形处理单元中的3D加速结构的完全并行适当地构造

[0001] 相关申请的交叉引用
[0002] 本申请是2012年3月9日提交的、名为“FULLY PARALLEL IN-PLACE CONSTRUCTION OF3D ACCELERATION STRUCTURES ON A GPU”的临时专利申请61/609,156的变换并要求其优先权和权益,本文在此通过援引的方式对其全文加以合并。

背景技术

[0003] 近些年来,通用计算产生了一些用于构造层次包围盒(BVH)、八叉树以及k-d树的方法用于数百万的实时的基元。一些方法目标在于使用表面积启发式(surface area heuristic)最大化结果树的质量,而其他方法选择用增加的构造的速度换取树的质量。
[0004] 正确的质量与速度的权衡特别依靠于应用。树的质量在经常重新使用相同加速结构用于数百万的射线的射线追踪中通常是优选的。实时物理中的宽阶段(Broad-phase)碰撞检测和粒子交互表示其他极端,其中构造速度是首要重要的—必须在每个时间步长上重新构造加速结构,并且询问的数目通常相当小。此外,某些应用,诸如基于体素(voxel)的全局照明和表面重新构造,具体依靠规则的八叉树和k-d树,其中树的质量是固定的。
[0005] 目标在于最大化构造速度的现有方法的主要缺点是其以顺序方式生成节点层次,通常一次一级,因为必须在下一个可以开始之前完成每轮处理。这限制了其在树的顶级可达到的并行度的量,并可导致并行核心的严重的未充分利用。顺序处理具有小工作负载,已是当前GPU的瓶颈,当前GPU要求数万独立的并行线程以完全利用其计算能。可预计在将来随着并行核心的数目持续增加,问题甚至会更显著。顺序处理的另一个含义是现有方法以宽度优先(breadth-first)的次序输出层次,虽然考虑到数据所在位置和高速缓存命中率,深度优先的次序将通常是优选的。发明内容
[0006] 一种用于最大化诸如层次包围体(BVH)、八叉树以及k-d树的层次树的构造中的平行度的计算机实现的方法和系统。本发明的实施例提供用于构造BVH、八叉树以及k-d树的快速的方法,以便整体性能与可用核心的数目成线性比例,并且作为结果的数据结构总是按照严格的深度优先的次序。新颖的方法包括以完全数据并行的方式构造二叉基数树。二叉基数树随后用作用于有效地构造其他类型的树的构建
[0007] 在一个实施例中,公开了具有用于使计算机系统执行方法的计算机可执行指令的非暂时性计算机可读存储介质。方法包括确定包括被索引化的基元节点的总数的多个基元,其中多个基元与层次树的叶节点相对应。方法包括将多个基元排序。方法包括以至多要求关于基元节点的总数成线性数量的临时存储的方式构建层次树。方法还包括与层次树的内部节点的祖先节点的一个或多个并行地构建该内部节点。也就是说,与层次树的一个或多个内部节点的各自的祖先节点的一个或多个并行地构建该内部节点。
[0008] 在另一个实施例中,公开了计算机系统,包括处理器,以及耦连到该处理器并具有存储在其中的指令的存储器,该指令如果由计算机系统所执行,那么使计算机系统执行方法。方法包括确定包括被索引化的基元节点的总数的多个基元,其中多个基元与层次树的叶节点相对应。方法包括将多个基元排序。方法包括以至多要求关于基元节点的总数成线性数量的临时存储的方式构建层次树。方法还包括与层次树的内部节点的祖先节点的一个或多个并行地构建该内部节点。也就是说,与层次树的一个或多个内部节点的各自的祖先节点的一个或多个并行地构建该内部节点。
[0009] 在又一个实施例中,公开了包括用于为多个基元指派莫顿码的装置的系统,所述多个基元包括被索引化的基元节点的总数,其中多个基元与层次树的叶节点相对应。系统包括用于将多个基元排序的装置。系统包括用于以至多要求关于基元节点的总数成线性数量的临时存储的方式构建层次树的装置。系统还包括用于与层次树的内部节点的祖先节点的一个或多个并行地构建该内部节点的装置。也就是说,与层次树的一个或多个内部节点的各自的祖先节点一个或多个并行地构建该内部节点。
[0010] 在一个实施例中,公开了具有用于使计算机系统执行用于根据二叉树构造层次包围体的方法的计算机可执行指令的非暂时性计算机可读存储介质。方法包括提供二叉树,该二叉树包括多个叶节点和多个内部节点。多个内部节点的每个唯一地与2个子节点相关联,其中每个子节点包括内部节点或叶节点。方法还包括通过从多个叶节点朝向根节点向上遍历二叉树,确定多个包围体用于二叉树中的节点,其中每个父节点由稍后到达的相对应的子节点处理一次。
[0011] 在另一个实施例中,公开了系统用于根据层次树结构构建层次包围体。系统包括层次树生成器用于构建包括多个叶节点和多个内部节点的二叉树。多个内部节点的每个唯一地与2个子节点相关联,其中每个子节点包括内部节点或叶节点。系统还包括关系模块用于生成父指针用于二叉树中的每个节点。也就是说,当构建二叉树时,还生成从各自的子节点指向父节点的父指针。系统还包括调度器用于选择一个或多个叶节点用于由多个线程并行地处理。叶节点与路径相关联用于确定包围体,其中路径在叶节点处开始并且向上穿过二叉树穿过相关联的并相对应的父节点继续。系统还包括包围体生成器用于通过从多个叶节点朝向根节点向上遍历二叉树来确定多个包围体用于二叉树中的节点,其中每个父节点由稍后到达的相对应的子节点处理一次。系统还包括父节点遍历器用于在第一线程上从第一子节点原子地遍历到第一父节点,其中所述第一父节点与所述第一子节点和第二子节点相关联。系统还包括与父节点相关联的计数器用于确定第一父节点之前是否已在第二线程上由第二子节点所遍历到。包围体生成器配置为当第一父节点先前已在第二线程上由第二子节点所遍历到时,确定父包围体用于使用第一线程的第一父节点。
[0012] 在阅读接下来以各种图示所示出的实施例的详细描述后,本领域的普通技术人员将认识到本公开的各种实施例的这些和其他对象和优点。附图说明
[0013] 附图被包含在本说明书中并形成本说明书的一部分,并且其中同样的数字描绘同样的元素,附图示出了本公开的实施例,并且与描述一起意图解释本公开的原理。
[0014] 图1描绘了根据本公开的一个实施例的、适合用于实现本方法的示例性计算机系统的框图
[0015] 图2是根据本公开的一个实施例的、示出了用于并行地构造层次树的计算机实现的方法的流程图
[0016] 图3是根据本公开的一个实施例的、在基数树的构造期间所使用的有序二叉基数树(binary radix tree)的图。
[0017] 图4是根据本公开的一个实施例的、在图3中首先提出的、用于二叉基数树的节点层次布局的图。
[0018] 图5是根据本公开的一个实施例的、示出了用于并行地构造二叉基数树的方法的流程图。
[0019] 图6是根据本公开的一个实施例的、用于构造二叉基数树的伪代码的示图。
[0020] 图7是根据本发明的一个实施例的、配置为构造BVH的系统的框图。
[0021] 图8是根据本发明的一个实施例的、示出了用于并行地构造BVH的计算机实现的方法的流程图。
[0022] 图9是根据本发明的一个实施例的、示出了用于并行地构造BVH的、其中由稍后到达的子节点处理内部的父节点的计算机实现的方法的流程图900。

具体实施方式

[0023] 现在将对本公开的各种实施例进行详细参考,其示例在附图中示出。虽然结合这些实施例加以描述,但应理解其并不意图将本公开限定于这些实施例。相反,本公开意在涵盖可包括在如所附的权利要求所定义的本公开的精神和范围内的替代、修改以及等同物。此外,在本公开接下来的详细描述中,阐述了大量具体细节以提供对本公开的彻底理解。然而,应理解的是本公开可在没有这些具体细节的情况下加以实施。在其他实例中,未详细描述公知的方法、过程、部件和电路以避免对本公开的各方面内容造成不必要的混淆。
[0024] 注释和命名法
[0025] 接下来的部分详细描述以过程、逻辑块、处理以及对计算机存储器内的数据位的操作的其他象征性表示来提出。这些描述和表示是由数据处理领域技术人员用来向本领域的其他技术人员最有效地传达他们工作的实质所使用的手段。在本申请中,过程、逻辑块、处理等等,被设想为得出期望结果的步骤或指令的自洽序列。步骤利用物理量的物理操纵。通常,尽管不是必要地,这些量采用能在计算机系统中被存储、转移、组合、比较和另外操纵的电或磁信号的形式。已经证明,主要是出于共同使用的原因,将这些信号称为事务、位、值、元素、符号、字符、样本、像素等等有时是方便的。
[0026] 然而,要牢记的是,所有的这些和类似的术语都要与适当的物理量相关联,且仅仅是应用于这些量的便捷标签。除非特别声明,否则在下面的论述中很明显,应意识到贯穿本公开,利用术语诸如“排序”、“确定”、“构建”、“指派”等等的讨论,指的是计算机系统或类似的电子计算设备或处理器(如图1的系统100)的动作与处理(分别如图2和5的流程图200和500)。计算机系统或类似的电子计算设备对计算机系统存储器、寄存器或其他这类信息存储、传输或显示设备内以物理(电子)量表示的数据进行操纵和转换。
[0027] 图2是根据本发明的一个实施例的用于处理数据的计算机实现的方法的示例的流程图。虽然在流程图中公开了具体步骤,但这种步骤是示例性的。也就是说,本发明的实施例非常适合于实施流程图中列举的各种其他步骤或步骤的变化。
[0028] 围绕基于硬件的、配置为用于监视和执行指令的部件讨论了本发明的本文所描述的实施例。也就是说,本发明的实施例在微架构的硬件设备内实现,并配置为用于监视重要停滞情况以及实施适当的时钟控用于电源管理目的。
[0029] 本文描述的其他实施例可一般围绕着存在于某形式的计算机可读存储介质上的计算机可执行指令加以讨论,诸如由一台或多台计算机或其他设备执行的程序模块。以示例的方式但非限制,计算机可读存储介质可以包括非暂时性计算机存储介质和通信介质。通常,程序模块包括例程、程序、对象、组件、数据结构等等,其执行特定任务或实现特定的抽象数据类型。程序模块的功能可以在各种实施例按照期望加以组合或分布。
[0030] 计算机存储介质包括易失性和非易失性、可移动的和不可移动的以任意方法或技术实现的介质,用于存储信息诸如计算机可读指令、数据结构、程序模块或其他数据。计算机存储介质包括但不限于,随机存取存储器(RAM)、只读存储器(ROM)、电可擦可编程ROM(EEPROM)、闪速存储器或其他存储器技术、压缩光盘ROM(CD-ROM)、数字多用盘(DVD)或其他光学存储、盒式磁带、磁带、磁盘存储或其他磁性存储设备、或任意其他可用来存储期望信息并可访问以检索信息的介质。
[0031] 通信介质可体现计算机可执行指令、数据结构及程序模块,并包括任意信息递送介质。以示例的方式而非限制,通信介质包括有线介质诸如有线网络或直接有线连接,以及无线介质诸如声、射频(RF)、红外及其他无线介质。以上的任意组合也可包括在计算机可读介质范围内。
[0032] 图1是能够实现本公开的实施例的计算系统100的示例的框图。计算系统100广泛地表示能够执行计算机可读指令的任意单或多处理器计算设备或系统。计算系统100的示例包括但不限于,工作站、膝上型计算机、客户端终端、服务器、分布式计算系统、手持设备或任意其他计算系统或设备。在其最基本配置中,计算系统100可包括至少一个处理器110以及系统存储器140。
[0033] 中央处理单元(CPU)110和图形处理单元(GPU)120均耦连到存储器140。系统存储器140总地表示能够存储数据和/或其他计算机可读指令的任意类型或形式的易失性或非易失性存储设备或介质。系统存储器140的示例包括但不限于,RAM、ROM、闪速存储器或任意其他合适的存储器设备。在图1的示例中,存储器140是共享存储器,存储器靠其存储指令和数据用于CPU110和GPU120。可替代地,可以分别有专用于CPU110和GPU120的分开的存储器。存储器可包括缓冲区用于存储驱动显示屏130的像素数据。
[0034] 系统100包括用户接口160,在一个实现方案中,该用户接口包括屏上光标控制设备。用户接口可包括键盘鼠标和/或触摸屏设备(触摸板)。
[0035] CPU110和/或GPU120总地表示能够处理数据或翻译和执行指令的任意类型或形式的处理单元。在某些实施例中,处理器110和/或120可从软件应用或硬件模块接收指令。这些指令可使处理器110和/或120实施本文所描述和/或所示出的一个或多个示范性实施例的功能。例如,处理器110和/或120可单独地或与其他元件组合地实施监视、确定、选通以及检测或本文所描述的等等中的一个或多个和/或是用于单独地或与其他元件组合地实施上述操作的装置。处理器110和/或120还可实施本文所描述的和/或所示出的任意其他步骤、方法或过程和/或是用于实施本文所描述的和/或所示出的任意其他步骤、方法或过程的装置。
[0036] 在一些实施例中,可将包括计算机程序的计算机可读介质加载到计算系统100。存储在计算机可读介质上的计算机程序的所有或一部分可随后存储在系统存储器140和/或存储设备的各部分中。当由处理器110和/或120所执行时,被加载到计算系统100的计算机程序可使处理器110和/或120实施本文所描述的和/或所示出的示范性实施例的功能和/或是用于实施上述功能的装置。附加地或可替代地,可在固件和/或硬件中实现本文所描述的和/或所示出的示范性实施例。
[0037] 3D加速结构的并行构造
[0038] 图2是根据本公开的一个实施例的、示出了用于并行地构造层次树的计算机实现的方法的流程图200。在其他实施例中,流程图200在包括处理器和耦连到该处理器的存储器的计算机系统中实现,该存储器具有存储在其中的指令,该指令如果由计算机系统所执行那么使系统执行用于并行地构造层次树的方法。在又一个实施例中,用于实施方法的指令存储在具有计算机可执行指令的非暂时性计算机可读存储介质上,该计算机可执行指令用于使计算机系统实施用于并行地构造层次树的方法。在流程图200中所概括的方法可由图1的计算机系统100的一个或多个部件实现。
[0039] 在实践中,层次树用于图形中的实例以加速路径跟踪、实时射线追踪、碰撞检测、光子映射、基于体素的场景表示等。在实施例中,以并行方式快速地构造树。也就是说,在本发明的实施例中,从开始并行地处理层次树的所有层级是可能的。这避免了未充分利用,以及使性能与GPU的大小成线性比例。
[0040] 为了清楚起见,围绕构建层次包围体或BVH描述了图2的方法,但该方法也适合于构建基于指针的八叉树以及k-d树。
[0041] 在210,方法包括确定多个基元。该多个是相关联的以及包括被索引化的基元节点的总数。多个基元与正在生成的层次树的叶节点相对应。
[0042] 在一个实施例中,为多个基元的每个指派莫顿码(Morton code)。围绕BVH,例如,通过查找基元的包围盒的形心点、以及查看基元相对于场景包围盒的位表示,生成莫顿码用于每个基元。想法是扩展每个坐标的位,以及随后将其交错以形成单个位串。
[0043] 为继续使用BVH的示例,由位串X0Y0Z0X1Y1Z1定义用于包含在三维(3D)单位立方体内的给定点的莫顿码,其中该点的x坐标表示为:X0X1X2等,并且y和z坐标类似。可依据其轴对齐包围盒(AABB)的形心来定义任意(arbitrary)3D基元的莫顿码。在实践中,在实施例中,可将莫顿码限制到30或63位以将其分别存储为32-位或64-位整数。
[0044] 在220,方法包括根据其莫顿码将多个基元排序。例如,在BVH的情况中,这沿着空间填充曲线排列它们,使得在3D中彼此相靠近的基元可能在所排序的序列中到达附近。
[0045] 在230,方法包括至多要求关于基元节点的总数成线性数量的临时存储地构建层次树。也就是说,在本发明的实施例中,以仅要求关于输入基元的数目成线性数量的存储器的方式构建层次树。另外,在一个实施例中并行地构建或构造层次树。
[0046] 在240,方法包括与层次树的内部节点的祖先节点的一个或多个并行地构建内部节点。也就是说,与层次树的一个或多个内部节点各自的祖先节点的一个或多个并行地构建该内部节点。这样,在本发明的实施例中,与至少一个节点的祖先节点的至少一个并行地构造该至少一个节点。
[0047] 在本发明的实施例中,通过构造二叉基数树实施层次树的构造,二叉基数树根据莫顿码的集合所定义。例如,在BVH的情况中,生成了节点层次,其中每个子树与线性范围的所排序基元相对应。在现有技术中,二叉树通常用于将串数据索引化。在一个实施例中,输入是基元的集合,或多个定义叶节点的基元。在本实施例中,输入是所排序的莫顿码。进一步地,二叉基数树包括基元节点和一个或多个内部节点。每个内部节点与由在各自的子树中的相对应基元节点的基元所共享的最长公共前缀相对应。
[0048] 图3是根据本公开的一个实施例的二叉基数树300的图。具体地,基数树300是包括具有索引数字“0-7”的8个叶节点的有序二叉基数树。叶节点以辞典编纂的次序存储5-位键值(key)的集合。基元的叶节点示出为包括5-位,这用于说明目的,但可以是任意长度,如先前所描述。内部节点表示其公共前缀。进一步地,每个内部节点覆盖线性范围的键值,根据其第一不同位分区为2个子范围,下文将参考图4加以描述。
[0049] 具体地,给定表示为位串的n个键值k0,...,kn-1的集合,二叉基数树(也称Patricia树)是其公共前缀的层次表示。由叶节点表示键值,并且每个内部节点与由其各自的子树中的键值所共享的最长公共前缀相对应,如图3所示。
[0050] 与包含用于每个公共前缀的一个内部节点的前缀树相比较,基数树用仅一个孩子省略节点,在这个意义上来说其是紧凑的。因此,具有n个叶节点的每个二叉基数树准确地包含n-1个内部节点,如图3所示。在一个实施例中,子节点是叶节点。在一个实施例中,二重键值要求特别的关注。
[0051] 更具体地,在一个实施例中,仅考虑有序的树,其中每个节点的孩子、以及因此叶节点是按词典编篡的次序。这等同于要求键值的序列被排序,使由每个节点所覆盖的键值能够表示为线性范围[i,j]。使用δ(i,j)来表示在键值ki和kj之间的最长公共前缀的长度,排列意味着对于任意i',j'∈[i,j]有δ(i',j')≥δ(i,j)。通过比较给定节点的第一和最后的键值确定与给定节点相对应的前缀,其中保证其他键值共享相同前缀。
[0052] 实际上,每个内部节点根据其键值的第一不同位,即跟随δ(i,j)的一个将其键值分区。该位对于从ki开始的某数目的键值是0并且对于剩余的直到kj为止的那些是1。位是0的最后键值的索引被标记为“分离位置”,由γ∈[i,j-1]所表示。由于位对于kγ是0以及对于kγ+1是1,分离位置必须满足δ(γ;γ+1)=δ(i,j)。作为结果的子范围由[i,γ]和[γ+1,j]给出,以及进一步分别由左和右子节点所分区。
[0053] 如图3所示,根与全范围的键值[0;7]相对应。由于k3和k4在其第一位不同,范围在γ=3处分离,导致子范围[0,3]和[4,7]。左孩子进一步基于第三位将[0,3]在γ=1处分离,右孩子基于第二位将[4,7]在γ=4处分离。
[0054] 图4和5是示出了随后用来构造诸如BVH、八叉树、k-d树等的二级树的二叉基数树的构造的图。具体地,根据本公开的实施例,图4是用于在图3中首先提出的二叉基数树的节点层次布局的图,以及图5是示出了用于并行地构造二叉基数树的方法的流程图。
[0055] 图4是根据本公开的一个实施例的、在图3中首先提出的有序二叉基数树400的图,其中叶节点被编号为“0-7”并且与以词典编篡的次序所排序的5-位键值(例如莫顿码)的集合相关联。例如,叶节点“1”与5-位莫顿码“0-0-0-1-0”相关联以及叶节点“2”与5-位莫顿码“0-0-1-0-0”相关联。
[0056] 如图4所示,为了使能二叉基数树400的并行构造,通过图4中所示的布局,在内部节点索引410和(叶节点的)基元索引420之间建立连接。也就是说,在某种程度上指派内部节点的索引以使能不用依靠较早的结果来查找其孩子。具体地,如图4所示,每个内部节点已被指派“0-6”之间的索引,并且与相同索引的叶节点平地对齐。例如,内部节点索引3440与叶节点或基元索引3450水平地对齐。
[0057] 并且,由每个内部节点所覆盖的键值(例如叶节点)的范围由水平条以及分离位置所指示,分离位置对应于由圆所指示的键值之间不同的第一位。例如,内部节点索引“3”440与包括叶节点“0-3”的范围445(由水平条所示)相关联。分离位置由圆447所示,以及指示最高不同位在叶节点索引“1”460和“2”470之间。
[0058] 出于清楚和说明目的起见,叶节点和内部节点分别存储于2个分开的阵列L和I中。定义了图4中的节点布局,以便根节点430位于I0,并且其孩子以及任意内部节点的孩子的索引根据其各自的分离位置加以指派,将参考图5更完全地加以描述。例如,如果左孩子覆盖超过一个键值那么其位于Iγ,或如果其是叶那么位于Lγ。类似地,右孩子位于Iγ+1或Iγ+1,如图4所示。
[0059] 图4所示的节点布局的重要性质是属于每个内部节点的基元索引的范围包括其第一基元或叶节点、或其最后基元或叶节点并与之相一致。并且,根节点“0”430位于其范围[0;n-1]的开始,使得任意内部节点的左孩子位于其位置[i,γ]的结尾,以及右孩子位于其范围[γ+1;j]的开始。
[0060] 图5是根据本公开的一个实施例的、示出了用于并行地构造二叉基数树的计算机实现的方法的流程图500。在另一个实施例中,流程图500在包括处理器和耦连到该处理器的存储器的计算机系统内实现,该存储器具有存储在其中的指令,该指令如果由计算机系统所执行那么使该系统执行用于并行地构造层次树的方法。在又一个实施例中,用于实施方法的指令存储在具有计算机可执行指令的非暂时性计算机可读存储介质上,该计算机可执行指令用于使计算机系统实施用于并行地构造层次树的方法。在流程图500中所概括的方法可由图1的计算机系统100的一个或多个部件实现。
[0061] 在一个实施例中,图5中所概括的方法在图2的230中所概括的过程上扩展以构建层次树。具体地,通过分区基元或叶节点生成节点层次。在一个实施例中,通过构造根据表示叶节点的莫顿码的集合所定义的基数树实施分区。更具体地,通过穿过图3和4中所示的树布局在内部节点索引和叶节点的基元索引之间建立连接来实施节点层次的并行构造。也就是说,以使能不用依靠较早的结果来查找其子节点的方式指派用于内部节点的索引。通过该方式,没有同步在节点层次的层之间实施。并且,通过该方式,与层次树的一个或多个内部节点各自的祖先节点的一个或多个并行地构建该内部节点。
[0062] 具体地,为了构造二叉基数树,图5中所概括的过程确定由每个内部节点所覆盖的键值的范围,并且确定每个内部节点的孩子(因为这是二叉基数树所以是2个)。由于属于每个内部节点的基元索引的范围包括其第一基元或叶节点、或其最后基元或叶节点以及与之均相一致,如上文所述,所以确定了范围的一个结尾。通过观察邻居基元索引确定范围的另一个结尾。在那之后,通过借助例如如图4中所示出的节点布局查找分离位置可随后标识孩子,如下文所进一步描述的。
[0063] 在一个实施例中,使用图6中所示出的伪代码600实施了图5中所概括的过程,其中伪代码600构造二叉基数树。出于简便起见,在伪代码600中,当j [0,n-1]时,δ(i,j)=-1。更具体地,在一个实施例中,并行地处理每个内部节点Ii。
[0064] 在510,图5的方法包括,对于与内部节点相对应的给定的节点索引,基于节点索引确定多个基元的基元索引的对应范围的方向。在基数树内,每个内部节点属于基元索引的范围。更具体地,在所指派的索引的内部节点和具有相同索引号的基元索引之间存在关系。具体地,具有相同索引号的基元索引被包括在基元索引的对应范围中。进一步地,给定的节点索引包括在对应范围中的开始的基元索引或结尾的基元索引。
[0065] 具体地,根据邻居基元索引确定范围的方向。也就是说,通过观察邻居键值ki-1、ki、ki+1确定范围的“方向”。方向由d表示,以便d=+1指示范围在i开始,以及d=-1指示范围在i结尾。因为每个内部节点覆盖至少2个键值,ki和ki+d必须属于Ii-d,这作为图5的树结构的性质得到确定。另外,因为兄弟总是位于彼此相邻的位置,所以ki-d属于兄弟节点Ii-d,这作为图5的树结构的性质得到确定。
[0066] 更具体地,基于哪个邻居基元具有最多的索引匹配确定范围的方向。例如,在图4中,用于内部节点索引或“3”440的范围以基元索引或叶节点“3”450开始或结尾。通过将诸如基元索引“2”470和基元索引“4”480的邻居索引或叶节点与具有和内部节点相同的索引的基元索引(例如基元索引“3”450)相比较来确定方向。这样,基元索引“2”470具有“0-0-1-0-0”的莫顿码序列,基元索引“3”450具有“0-0-1-0-1”的莫顿码序列,以及基元索引“4”具有“1-0-0-1-1”的莫顿码序列。具有对基元索引“3”450的最多的匹配的基元索引是基元索引“2”470。这样,范围445的方向向左以包括基元索引“2”470,使得范围445包括基元索引“0-3”。
[0067] 例如,在伪代码600的行2-3确定方向。也就是说,属于Ii的键值共享必须与由定义的兄弟中的一个不同的公共前缀。这意味着用于前缀长度的下界由δmin=δ(i,i-d)给定,使得对于任意属于Ii的kj有δ(i,j)>δmin。通过将δ(i,i-1)与δ(i,i+1)相比较来满足该条件,并且选择δ使得δ(i,i+d)与较大的一个相对应,如伪代码600的行3中所示。
[0068] 在520,方法包括确定对应范围的长度。更具体地,在实施例中,确定最大值或上界用于长度。另外,在实施例中,通过实施二分搜索确定用于长度的实际值。具体地,通过搜索满足δ(i,i+ld)>δmin的最大l确定范围的其他结尾,如伪代码600中所提供的。在一个实施例中,通过从值“2”开始并以指数方式增加值直到其不再满足不等式为止来确定用于长度的二的次方的上界lmax>l,如伪代码600的行6-8中所示。一旦确定上界,就在范围[0;lmax-1]中使用二分搜索来确定长度“l”。想法是依次考虑l的每个位,从最高的一个开始,以及将其设置为1除非新值无法满足不等式,如伪代码600的行10-13中所示。随后由j=i+ld给定范围的其他结尾。
[0069] 在530,出于确定子索引用于与内部节点相对应的给定的索引的目的,方法包括确定对应范围中的基元索引之间的最高不同位。例如,在伪代码600中,δ(i,j)表示与Ii相对应的前缀的长度,由δnode所标记。这是用来通过实施对满足δ(i,i+sd)>δnode的最大s∈[0;l-1]的类似的二分搜索来查找分离位置γ,如伪代码600的行17-20所示。如果d=+1,那么γ由i+sd给定,因为这是属于左孩子的最高索引。如果d=-1,那么值减去值1以解释反向索引。
[0070] 例如,分离位置用于图4的内部节点“43”440。如所示,范围445的基元索引“0-3”之间的最高不同位在基元索引“1”460和“2”470之间。也就是说,基元索引“1”460具有“0-0-0-1-0”的莫顿码序列以及基元索引“2”470具有“0-0-1-0-0”的莫顿码序列。最高不同位发生在线490所示的第三位。
[0071] 并且,在540,方法包括指派子节点索引用于和与上文所确定的最高不同位相关联的基元索引相对应的给定的节点索引。例如,在图6的伪代码600中,给定i、j和γ,Ii的孩子覆盖范围[min(i,j);γ]和[γ+1;max(i;j)]。对于每个孩子,将其范围的开始和结尾相比较以查看其是否是叶,以及随后根据节点布局(例如图4)涉及在索引γ或γ+1处的相对应的节点,如图6的伪代码600的行23-24中所示。
[0072] 在一个实施例中,随着单个内核启动,图6的伪代码600中所呈现的算法在GPU上实现,其中每个线程负责一个内部节点。假定键值的长度固定,通过计算2个键值之间的逻辑的XOR和对作为结果的整数中的在前的(leading)零位进行计数可有效地评估δ(i,j)。
[0073] 在本发明的实施例中,图1-6中所构造的二叉基数树用来构造二级树。在一个实施例中,根据本公开的一个实施例,根据二叉基数树构造了BVH。具体地,按下列内容构造用于3D基元的集合的BVH:(1)根据其形心指派莫顿码用于每个基元,(2)将莫顿码排序,(3)构造二叉基数树,以及(4)指派包围盒用于每个内部节点。
[0074] 如果所有基元的莫顿码是唯一的,那么应注意的是二叉基数树在结构上与相对应的线性BVH是同样的—标识莫顿码之间的公共前缀等同于根据每个位递归地使基元成组(bucketing)。明确地处置复制莫顿码的情况,因为图6的构造算法依靠唯一的键值。在一个实施例中这通过用其索引的位表示来增扩每个键值来完成,即k0i=ki_i,其中_指示字符串连接。在实践中,不需要实际存储所增扩的键值,因为当评估δ(i;j)时如果ki=k j那么其足以简单地使用i和j作为后备(fallback)。
[0075] 依靠知悉位于每层级上的节点的集合是先验的的事实,用于线性BVH的先前的方法以自底向上的方式顺序地计算包围盒。在一个实施例中,呈现了不同的方法,其中并行地处理从叶节点到根的路径。每个线程从一个叶节点开始并使用在基数树构造期间记录的父指针走上树。线程被跟踪以使用原子的计数器确定多少线程已访问每个内部节点,使得当第二个开始处理节点时第一个线程立即终止。这样,每个节点精确地由一个线程所处理,导致 时间复杂性。无论何时检测到正由相同线程块处理由给定的内部节点所覆盖的所有叶,可使用更快的共享存储器原子减少全局原子的数目。
[0076] 图1-6中所构造的二叉基数树用来构造诸如八叉树的二级树。为构造八叉树用于点的集合,给定的莫顿码的每个3k-位前缀直接映射到在层级k的八叉树节点。通过查看相对应的二叉基数树的边缘,枚举这些前缀,使得将具有长度δparent的前缀的父亲与具有长度δchild的前缀的孩子相连接的边缘表示长度δparent+1,...,δchild的所有子前缀。这些之外, 可被3整除。在基数树构造期间评估这些计数,以及随后实施并行前缀求和以分配八叉树节点。通过查看每个基数树节点的直接祖先查找八叉树节点的父亲。
[0077] 处理因此包括7个步骤:(1)计算用于点的莫顿码,(2)将莫顿码排序,(3)通过比较相邻莫顿码的每对来标识复制物,即指出落入相同叶节点内的点,(4)使用并行缩并移除复制物,(5)构造二叉基数树,(6)实施并行前缀求和以分配八叉树节点,以及(7)查找每个节点的父亲。
[0078] 根据本公开的一个实施例,图1-6中所构造的二叉基数树用来构造诸如k-d树的二级树。在一个实施例中,由上文的步骤5所产生的基数树可被直接地翻译为在点上的k-d树。每个内部节点根据莫顿码中在其公共前缀之后的下一个位将点分区,等同于将其分类在3D中的轴对齐平面的一侧。长度δ的前缀与垂直于第d主轴的平面相对应,其中d=δmod(取余)3。平面的位置由0.BdBd+3...Bδ-31给定,其中Bi表示前缀的第i个位。
[0079] 构造层次包围体用于3D基元的集合
[0080] 在本发明的一个实施例中,构造了层次包围体(BVH)用于三维(3D)基元的集合。在其他实施例中,基元可以是任意(arbitrary)维度(例如2D,4D等等)。在一个实现方案中,根据先前关于图1-6所讨论的基数树构造BVH。例如,层次包围体用于将多个诸如三形的3D基元索引化。基元被分组为节点,以及每个节点存储完全包含底层基元的包围体。
分层次地重复分组,以便根节点覆盖整个场景。包围体有助于诸如当实施碰撞检测或射线追踪等时确定附加的信息。
[0081] 在本发明的实施例中,包围体完全包含意图在体中所包含的基元的集合。在一个实现方案中,包围体包括轴对齐包围盒(AABB)。
[0082] 图7是根据本发明的一个实施例的、配置为构造BVH的系统700的框图。具体地,系统700包括层次树生成器710,配置为构建包括多个叶节点和多个内部节点的二叉树。多个内部节点的每个唯一地与2个子节点相关联,其中每个子节点包括内部节点或叶节点。在一个实施例中,二叉树是使用图1-6中所先前描述的方法和系统所构建的基数树。在其他实施例中,二叉树的任意种类适合于提供用于包围体构造的层次,诸如当使用先前所构建的二叉树或层次用于在多个场景上构建多个层次包围体时。
[0083] 系统700还包括关系模块720用于生成父指针用于二叉树中的每个节点。也就是说,诸如从图1-6的系统和方法所生成的先前所生成的二叉树,为孩子提供关系和/或指针用于特定节点。关系模块720将关系倒转以便子节点与指向各自的父节点的父指针相关联。通过该方式,当使用自底向上遍历方法构建BVH时使用父指针。
[0084] 系统700还包括包围体生成器740用于确定多个包围体用于二叉树中的节点。更具体地,当构建二叉树中的各自的节点的包围体时,从树的多个叶节点朝向根节点向上遍历二叉树,使得并行地处理从叶节点到根节点的路径。并且,二叉树中的每个父节点由源自相对应的子节点的稍后到达的线程处理一次。
[0085] 在一个实施例中,系统700还包括调度器730用于选择一个或多个叶节点用于由多个线程并行地处理。也就是说,当构建包围体用于二叉树的内部节点时,调度器730为由包围体生成器740所使用的线程指派叶节点。例如,调度器730确定为哪个线程指派二叉树的哪个节点,更具体地,指派哪个叶节点,用于构建这些叶节点的包围体,以及用于随后的父节点。在一个实施例中,调度器被包括在处理核心和/或包括图形处理单元(GPU)的线程内或支持上述内容。
[0086] 图8是根据本发明的一个实施例的、示出了用于并行地构造BVH的计算机实现的方法的流程图800。在另一个实施例中,流程图800在包括处理器和耦连到该处理器的存储器的计算机系统内实现,该存储器具有存储在其中的指令,该指令如果由计算机系统所执行那么使系统执行用于并行地构造BVH的方法。在又一个实施例中,用于实施用于并行地构造BVH的方法的指令存储在具有计算机可执行指令的非暂时性计算机可读存储介质上,该计算机可执行指令用于使计算机系统实施用于并行地构造BVH的方法。在流程图中所概括的方法可由图1和7的系统100和700的一个或多个部件实现。
[0087] 在810,方法包括提供二叉树。在一个实施例中,二叉树是使用图1-6的系统和方法构造的基数树。例如,至多要求关于基元节点的总数成线性数量的临时存储地构建层次树。也就是说,以仅要求关于输入基元的数目成线性数量的存储器的方式构建层次树。更具体地,二叉树包括多个叶节点和多个内部节点。内部节点的每个唯一地与2个孩子相关联,其中每个子节点包括叶节点或另一个内部节点。
[0088] 在840,方法包括指派包围盒用于每个内部节点。生成用于每个节点的包围体,以便其如在二叉树中所建立的包含所有的底层基元。在一个实现方案中,通过从多个叶节点朝向根节点向上遍历二叉树,确定多个包围体用于二叉树中的节点,其中并行地处理从多个叶节点到根节点的多个路径。并且,每个父节点由源自相对应的子节点的稍后到达的线程处理一次。
[0089] 依靠知悉位于每级上的节点的集合是先验的的事实,用于构造线性BVH的先前的方法以自底向上的方式顺序地计算包围盒。也就是说,在确定用于下一层的包围体之前,每层级计算完成。本发明的实施例采取不同的方法,其中并行地处理从叶节点到根的路径。这是可能的,因为即使未知悉每个节点在哪个层级,但知悉节点之间的关系。这样,每个线程从一个叶节点开始并使用在二叉树构造期间所确定、生成以及记录的父指针走上树。
[0090] 在一个实施例中,确定父指针用于二叉树中的每个节点。例如,当构建二叉树时,在内部节点和其子节点的每个之间建立关系。也就是说,在二叉树内,知悉子节点用于相对应的父节点。这样,倒转关系是可确定的,使得对于每个节点(例如内部或叶),相对应的父节点是可确定的以及可指派的。在一个实现方案中,对于每个节点,指派指向其父节点的相对应的父指针。
[0091] 在一个实施例中,确定用于叶节点的包围体。在一个实施例中,在遍历二叉树之前,确定用于叶节点的包围体。在另一个实施例中,当线程出于确定叶节点的包围体的目的拾起或被指派以处理该叶节点时,确定用于该叶节点的包围体。在一个实现方案中,基于与相对应的叶节点或基元相关联的三角形的顶点,确定包围体用于叶节点。
[0092] 更具体地,图9是根据本发明的一个实施例的、示出了用于并行地构造BVH的、其中由稍后到达的线程处理内部的父节点的计算机实现的方法的流程图900。在另一个实施例中,流程图900在包括处理器和耦连到该处理器的存储器的计算机系统内实现,该存储器具有存储在其中的指令,该指令如果由计算机系统所执行那么使系统执行用于并行地构造BVH的方法,其中由稍后到达的子节点处理内部的父节点。在又一个实施例中,用于实施用于并行地构造BVH的方法的指令的指令存储在具有计算机可执行指令的非暂时性计算机可读存储介质上,其中由稍后到达的子节点处理内部的父节点,该计算机可执行指令用于使计算机系统实施用于并行地构造BVH的方法。在流程图900中所概括的方法可由图1和7的计算机系统100和700的一个或多个部件实现。
[0093] 在一个实施例中,使用原子的计数器跟踪访问每个内部节点的线程的数目。也就是说,当由与每个内部节点的子节点相关联的线程所遍历到时,每个内部节点被原子地处理。当允许对内部节点的第二线程处理节点以确定其包围体时,对内部节点的第一线程立即终止。例如,所有计数器以假状态开始,以及当被第一次访问时,计数器增大以指示真状态。访问内部节点的稍后到达的线程路径现在在节点处读取真状态,这指示其是稍后到达的线程。通过该方式,随着沿从叶节点到根节点的路径遍历二叉树,每个节点精确地由一个线程所处理。在一个实施例中,这导致 复杂性。
[0094] 具体地,在910,方法包括拾取未处理的叶节点以及将其设置为由特定第一线程所处理的当前节点。方法还包括从第一线程上的第一子节点(当前节点)沿源自叶节点的路径原子地遍历到第一父节点。第一父节点与第一子节点和第二子节点相关联。通过处理从叶节点到根节点的路径,并行地遍历了二叉树,并且二叉树中的每个节点被处理一次。
[0095] 在决策步骤920,方法包括确定父节点当由当前线程所处理时,是否在之前已由其子节点之一所遍历到。具体地,在920,确定第一父节点是否在之前已由不同的第二线程上的第二子节点所遍历到。在一个实现方案中,使用计数器确定正在尝试处理父节点的线程是否是稍后到达父节点的线程。其他实施例适合于用于确定线程是否与包括稍后到达父节点的子节点的路径相关联的其他方法。
[0096] 如果确定父节点第一次由线程所访问,那么方法前进到930,其中计数器增大。例如,计数器最初指示假状态,该假状态指示父节点未被访问。在读取假状态之后,计数器设置为真状态。此后,遍历到第一父节点的线程在950处终止。当第一父节点未由其子节点二者中任何一个所遍历到时,更具体地,当之前未由第二子节点所遍历到时,发生终止。
[0097] 在该情况下,在910被终止的线程选择另一个未处理的叶节点。处理新叶节点的线程从未处理的叶节点开始遍历二叉树。在一个实现方案中,用先前所描述的调度器选择叶节点。在一个实施例中,在线程束(warp)基础上收集线程的终止。也就是说,多处理单元(例如GPU)包括多个核心和/或线程,其中线程束包括使用相同指令并且并行地执行的一个或多个线程(例如32个线程)。例如,同时(例如在相同时钟周期上)对线程束中的所有线程应用图形管线中的指令。在另一个实施例中,线程束由块所收集,使得类似地对待线程块中的多个线程束。这样,无论何时检测到正由相同线程块处理由给定的内部节点所覆盖的所有叶,通过使用更快的共享存储器原子减少了全局原子的数目。
[0098] 另一方面,如果确定由与稍后到达的子节点相关联的线程访问了父节点,那么在940方法包括确定父包围体用于使用第一线程的第一父节点。在一个实施例中,所指派的父包围体完全包含第一子节点的第一包围体,以及第二子节点的第二包围体。此外,在一个实施例中,父包围体包括第一子包围体和第二子包围体的并集。在一个数学定义中,并集包括在第一子包围体和第二子包围体二者中的所有点的集合。
[0099] 在一个具体实施例中,第一子包围体包括第一轴对齐子包围盒,或第一子AABB。并且,第二子包围体包括第二子AABB。通过指派第一和第二子AABB的最小和最大x、y和z值来确定父包围体。
[0100] 例如,通过指派第一和第二子AABB的最小x值和最大x值来确定父包围体。也就是说,沿着x轴,来自第一和第二子AABB中任一个的最小的x值被选为用于父包围体的最小x值。类似地,来自第一和第二子AABB任一个的最大的x值被选为用于父包围体的最大x值。
[0101] 并且,为父包围体指派第一和第二子AABB的最小y值和最大y值。也就是说,沿着y轴,来自第一和第二子AABB任一个的最小的y值被选为用于父包围体的最小y值。类似地,来自第一和第二子AABB任一个的最大的y值被选为用于父包围体的最大y值。
[0102] 并且,未父包围体指派第一和第二子AABB的最小z值和最大z值。也就是说,沿着z轴,来自第一和第二子AABB任一个的最小的z值被选为用于父包围体的最小z值。类似地,来自第一和第二子AABB任一个的最大的z值被选为用于父包围体的最大z值。
[0103] 通过将父节点设置为新的当前节点,流程图900的方法在960继续。此后,线程行进回到920以确定新当前节点的新父节点是否在之前已经由其子节点之一所遍历到。通过该方式,线程向上遍历通过二叉树。
[0104] 因此,根据本公开的实施例,描述了提供根据二叉树的层次包围盒的构造中的最大并行度的系统和方法。
[0105] 同时,前述公开使用具体框图、流程图和示例阐述了各种实施例,每个框图部件、流程图步骤、操作和/或本文描述和/或示出的部件可单独地和/或共同地,通过使用各种不同的硬件、软件或固件(或其任意组合)配置来实现。另外,对包含在其他部件内的部件的任何公开应视为示例,因为可实现许多其他架构来达到相同的功能性。
[0106] 本文描述和/或示出的工艺参数和步骤顺序仅以示例方式给出并可按期望进行变化。举例来说,虽然本文示出和/或描述的步骤可能以特定的顺序示出或论述,但这些步骤不必按所示出或论述的顺序来实施。本文描述和/或示出的各种示范性方法也可以省略本文描述或示出的一个或多个步骤,或包括那些所公开步骤之外的附加步骤。
[0107] 虽然本文已围绕全功能计算系统描述和/或示出了各种实施例,但这些示范性实施例中的一个或多个可分布为各种各样的形式的程序产品,而与用来实际执行分布的计算机可读介质的特定类型无关。本文公开的实施例也可使用实施某些任务的软件模块来实现。这些软件模块可包括脚本、批处理或其他可被存储在计算机可读存储介质上或计算系统内的可执行文件。这些软件模块可以配置计算系统来实施一个或多个本文公开的示范性实施例。本文公开的软件模块中的一个或多个可在计算环境中实现。云计算环境可经由因特网提供各种服务和应用。这些基于云的服务(例如,软件即服务、平台即服务、基础设施即服务等等)可通过Web浏览器或其他远程接口访问。本文描述的各种功能可通过远程桌面环境或任何其他基于云计算的环境提供。
[0108] 前述的描述,出于解释的目的,已参考特定实施例进行了描述。然而,上述说明性的论述不旨在穷举或将本发明限制在所公开的明确形式上。鉴于以上教导,许多修改和变形是可能的。选择和描述实施例以最好地解释本发明的原理及其实际应用,从而使本领域的其他技术人员最好地利用本发明和具有各种适用于特定预期用途的修改的各种实施例。
[0109] 因此描述了根据本公开的实施例。虽然本公开已在特定实施例中加以描述,但应理解本公开不应被解释为限于这种实施例,而应根据以下的权利要求来进行解释。
QQ群二维码
意见反馈