利用gpu片上树群实现二维数据近邻搜索的并行方法

文档序号:6500673阅读:226来源:国知局
利用gpu片上树群实现二维数据近邻搜索的并行方法
【专利摘要】本发明提供一种利用GPU片上树群实现二维数据近邻搜索的并行方法,涉及基于NVIDIA的GPU+CUDA计算架构的高效四分树群数据结构和基于此数据结构的并行搜索近邻算法,该方法能够为各种应用中的近邻搜索提供性能加速。根据本发明,该方法包括步骤:将数据拷贝到GPU全局存储;在GPU片上存储中构建四分树群,将数据点组织到树群内;并行在GPU片上存储中搜索若干四分树,为每个数据点查找出其一定范围内的邻居;根据具体应用需要对查找到的邻居做进一步的计算处理。该并行近邻搜索方法性能优越,在图像处理、地理信息系统等领域具有重要的应用价值。
【专利说明】利用GPU片上树群实现二维数据近邻搜索的并行方法

【技术领域】
[0001]本发明涉及树型数据结构和并行计算,具体涉及四分树群的构建、基于该数据结构的近邻搜索和GPU+CUDA架构编程。

【背景技术】
[0002]四分树是一种用于组织二维空间数据的多层次树状数据结构,在树内每个非叶节点最多有四个子节点。它将一个正方形区域规则地划分为4个子区域,每一个子区域再分为4个子区域,如此逐次划分,直至所有子区域最多只包含一个数据点为止。四分树的优点是空间关系隐含在数据模型之中,检索和处理速度较快。该数据结构被广泛用于图像处理、地理信息系统和机器人等领域中的近邻搜索。
[0003]图形处理器(GPU)是当前蓬勃发展的并行计算平台。它起源于图形渲染,现在已出现高级语言支持GPU上的便捷编程。NVIDIA为其GPU提供了 Compute Unified DeviceArchitecture (CUDA)编程模型,拥有类C语言的编程接口。结合CUDA的GPU提供了强大的计算能力和非常高的存储带宽,适合于高度并行、计算密集的应用。比如:NVIDIA TeslaC2070拥有1.03TFL0PS/s的单精度浮点峰值和144GB/s的带宽峰值。尽管计算能力强大,但NVIDIA GPU的花销较低,而且普遍存在于PC或工作站等不太昂贵的机器中。目前,GPU+CUDA架构已被应用于加速各个科学计算领域中的计算密集型处理。
[0004]在硬件层次,支持CUDA的GPU是一些单指令多数据流(SMD)流多处理器(streammultiprocessor)的集合,每个流多处理器有32个流处理器(stream processor)。比如:NVIDIA Tesla C2070处理器有14个流多处理器,共448个流处理器。每个流多处理器有一个容量有限的快速片上共享存储,可被一个流多处理器内的所有流处理器共享。每个流处理器拥有一定数量的32位寄存器。流多处理器之间通过延迟较高的片外全局/设备存储进行通信。全局存储可被主机读写,而且在同一程序的不同核函数之间是一致的。共享存储显式地由程序员管理。与CPU相比,GPU将更多的晶体管用于制作计算单元,因此GPU的浮点计算峰值比CPU高一个数量级。同时,NVIDIA的特殊优化使得GPU的带宽也比CPU高一个数量级。
[0005]在软件层次,CUDA模型是大量并行执行线程的集合,CUDA程序以线程并行的模式执行。由主机控制调度、GPU实际执行的基本任务单元称为核函数,其形式和功能类似C语言中定义的函数。计算被组织成由一些线程块构成的线程网格(见图2)。在指令层次,同一个线程块内的32个连续线程构成一个最小执行单元,称为线程warp。一个线程块是一批次同一时刻在同一流多处理器上SMD并行运行的线程warp的集合。每个流多处理器同一时刻并发执行一个或多个线程块。对于任一线程,它的索引被用于确定其应该处理的数据。同一个线程块内的线程通过片上共享存储进行通信。
[0006]建立在NVIDIA的GPU+CUDA并行计算架构上的四分树将能极大地提升基于四分树的近邻搜索的性能。然而,CUDA计算模型被认为不适合诸如建树和搜索树之类的不规则计算;目前,使用CUDA在GPU上建立一个树型数据结构方面的工作较少。Zhou Kun等在GPU上构建了一个针对多维数据的KD-tree,他们将树的节点信息等存储在GPU的全局存储上,并使用该数据结构加速图像渲染中的光线追踪和K个最近邻搜索。一个混合的四分树构建方法首先在CPU上构建树的顶部若干层,然后将数据传输到GPU全局存储,在其上构建树的剩余层。该方法也将四分树建在访问延迟较高的GPU全局存储上。而且,没有正式出版的文档或公布的代码可供参考。
[0007]在大体运动模拟中,计算天体间的重力影响涉及找出每个天体的大量邻居,特别是对单个天体重力影响最大的周围临近的邻居。Martin和Keshav在NVIDIA的GPU+CUDA架构上实现了一个高性能的N-body并行模拟算法,在模拟中他们构建了一个八分树,以加速查找每个天体的近邻。实验证明该基于CUDA的八分树极大提升了模拟算法的性能。不过,该树型结构仍然构建在延迟较高的全局存储上。
[0008]在此类问题的研究中,现有工作集中于在GPU的全局存储上构建一个单一的树型数据结构。这样的策略导致大量效率较低的无法优化的对全局存储的访问,而且由于线程竞争着将数据点插入到树中,致使CUDA程序的线程并行度较低,性能受到很大影响。


【发明内容】

[0009]本发明的目的是提供一种基于NVIDIA的GPU+CUDA计算架构的高效四分树群和基于此数据结构的并行搜索近邻的方法,能够为各种应用中的近邻搜索提供性能加速。
[0010]为实现上述目的,一种利用GPU片上树群实现二维数据近邻搜索的并行方法,步骤如下:
[0011](I)将待组织的数据拷贝到GPU全局存储;
[0012](2)在GPU片上存储中构建四分树群,将数据点组织到树群内;
[0013](3)并行在GPU片上存储中搜索若干四分树,为每个数据点查找出其一定范围内的邻居;
[0014](4)根据应用需要对查找到的邻居做进一步的计算处理。
[0015]与以往已在GPU上实现的树型数据结构不同,本发明利用GPU高速但有限的片上存储实现四分树的构建和搜索,极大地提升了存储访问的效率。同时,树群以每个CUDA线程块为单位实现一棵较小的四分树,线程并行度相对一个单一的四分树要高许多倍,从而提升了建树的效率。该基于四分树群的近邻搜索算法性能优越,在图像处理和计算机仿真等领域中具有重要的应用价值。

【专利附图】

【附图说明】
[0016]图1利用GPU片上树群实现二维数据近邻搜索的结构
[0017]图2主机端代码的顺序执行和设备端代码的并行执行
[0018]图3区域格的二维层次递归划分
[0019]图4区域格四分树形式的数据点组织

【具体实施方式】
[0020]本发明的核心思想是构建一种可驻留于GPU高速片上存储的数据结构-四分树群,使用其组织各种应用中的数据点,在计算中作为加速数据结构,提升并行为全部数据点查找近邻的性能。
[0021]下面结合附图和算法实现伪码详细描述本发明中的数据结构、该数据结构的构建和使用该数据结构并行搜索数据点的近邻等算法。
[0022](I)数据点的组织
[0023]四分树群是一个包含了大量规模较小的CUDA四分树的森林。本发明将整个数据点部署区域等分为大量正方形区域格,使得每个区域格包含不多于设定阈值数目的数据点(实验测试中阈值设定为64,即每个区域格最多包含64个数据点)。每个区域格中的数据点用一个CUDA四分树组织起来。如图3所示,一个区域格首先划分为四个更小、均等的区域小格,然后每个区域小格再迭代划分,直到其包含不多于一个的数据点。最终,图3区域格内的所有数据点组织到了图4所示的CUDA四分树中,空间相近的数据点在树中互为兄弟节点。
[0024]与一棵大树相比,树群可最大化建树时的CUDA线程并行度;每个CUDA四分树较小,可完全驻留在GPU快速片上存储中,避免了访问全局存储招致的高延迟,能带来相当可观的性能提升。
[0025]⑵GPU片上存储构建四分树群
[0026]首先,数据集由内存复制到GPU全局存储。依据数据分布的范围和对分布密度的经验预估将数据分布区域划分成区域格。每个线程持有一个数据点,根据其坐标将其划归到特定的区域格中。如果每个区域格包含的数据点数大于设定的阈值,则每个区域格分裂为四个更小的区域格;反之,停止数据点的划归。
[0027]在生成四分树群时,每个CUDA线程块负责一个区域格,构建一棵CUDA-quadtree。其中,每个线程持有一个数据点,将其插入树中。为了便利在CUDA-quadtree中搜索近邻,每个区域子格的中心点和边长组合构成“虚节点”以代表该区域,即CUDA-quadtree中的非叶节点。比如:以区域格的中心点和区域格边长组合四分树的“根虚节点”,代表该区域格覆盖的区域。假设一个区域格内最多有η个数据点,则生成的四分树最大可能占用空间为η*4+1,据此在共享存储上分配一固定大小的数组,以保存四分树信息。该信息数组逆序填充,即当有新数据点插入到CUDA-quadtree时,在数组已保存的数据点前一空白处存储新数据点信息。
[0028]如表I伪码所示,线程插入数据点是一个反复尝试的过程,其间线程竞争获取一次插入机会。首先,线程O初始化“根虚节点”并创建四个空叶节点。然后,每个线程根据持有数据点在区域格中的位置寻找合适的叶节点执行插入操作。当这样的位置找到后,一个竞争胜出线程对其添加唯一写入权限锁,独占该位置,插入持有的数据点(将该数据点写入信息数组),释放该位置,退出插入操作。如果一个线程竞争失败,没有锁住合适的叶节点,则该线程等待下一次机会重新尝试前述插入操作。然而,在第二轮中,一个线程找到并锁住的叶节点位置已经被其他插入的数据点占用。于是,该线程创建一个带有四个空叶节点的子树,插入到该位置,并将原有节点和自己持有的数据点插入到该子树的叶节点中,释放该位置,退出插入操作。其余线程继续如表一所示继续尝试,直到其持有的数据点插入到CUDA-quadtree的一个叶节点中。最后,线程块内线程协同一次性以访存效率最优的数据融合方式将四分树信息数组写入全局存储。
[0029]表IGPU片上数据点插入的伪码示例

【权利要求】
1.一种利用GPU片上树群实现二维数据近邻搜索的并行方法,包括步骤: (1)将待组织的数据拷贝到GPU全局存储; (2)在GPU片上存储中构建四分树群,将数据点组织到树群内; (3)并行在GPU片上存储中搜索若干四分树,为每个数据点查找出其一定范围内的邻居; (4)根据应用需要对查找到的邻居做进一步的计算处理。
2.按照权利要求1所述的方法,其特征在于所述的方法充分利用GPU高效的片上存储,构建四分树群和搜索四分树群的工作均在该存储中进行,构建好的四分树由线程协同以访存最优的存储融合的方式写入全局存储;在搜索四分树时,以相同的方式将四分树由全局存储读入片上存储,然后再进行搜索。
3.按照权利要求1所述的方法,其特征在于所构建的数据结构为由许多四分树组成的树群,每个线程块负责一个四分树的构建和搜索,以便保证数据结构能够载入有限的片上存储和保证CUDA线程并行度尽可能大。
4.按照权利要求1所述的方法,其特征在于每个线程负责一个数据点,在四分树的构建过程中将该数据点插入到四分树中,在近邻搜索过程中为一个数据点搜索其周围的邻居。
5.按照权利要求1所述的方法,其特征在于为数据点搜索近邻时逐一将四分树以访存最优的方式载入片上存储,在高效的片上存储中完成查找工作。
【文档编号】G06F17/30GK104050175SQ201310078697
【公开日】2014年9月17日 申请日期:2013年3月13日 优先权日:2013年3月13日
【发明者】易卫东, 菅立恒 申请人:中国科学院大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1