在cpu-gpu异构框架下遍历固定半径内邻居的自适应并行算法

文档序号:9708143阅读:598来源:国知局
在cpu-gpu异构框架下遍历固定半径内邻居的自适应并行算法
【技术领域】
[0001]本发明属于高性能计算领域,具体地说是一种基于自适应并行方法在CPU-GPU异 构框架下的新的遍历固定半径内邻居的并行算法,涉及到SIMD架构,GPU硬件特性,异构平 台下的任务调度与负载均衡,数据交互策略,计算机图形学以及仿真等。
【背景技术】
[0002] FNN问题是处理在多维度欧几里德空间中,所有在给定距离内的点与点之间的交 互的问题。而固定网格算法是其中最被广泛使用的方法,特别是在数值方法中。这个算法广 泛应用于自然环境的模拟,生物仿真,行为模拟以及三维重建。通过这个算法,可以将构建 邻居信息的时间复杂度降到〇(wn)(如果使用不基于比较的排序算法),而遍历邻居的时间 复杂度降为〇(3 kwnN),其中w是排序关键字长度,η是空间中点的数量,k是空间维度,N是每 一个单元格中点的数量的上限。
[0003] 为了提升上述算法的性能,一个可行的方案是在多核处理器,特别是诸如GPU这种 S頂D加速器上来实现上述算法。由于这个算法非常适合并行化,因此在GPU上已经有了一些 针对这个算法比较成熟的并行模型。并且这些传统的并行模型能够在点密度比较低的情况 下得到非常好的性能。在传统并行模型中,GPU内核程序的线程网格中所包含的线程数量是 和空间中点的数量是相同的。然后这些线程被直接划分为包含线程数量相同的几个线程 块,然后在GHJ中以这些线程块为单位进行调度运算。每个线程所作的工作就是读取它们所 负责的那一个点的一个邻居点的信息然后做一些运算,如此循环直到所有邻居都访问到 了。每个线程块的工作就是读取其所负责的所有点的所有邻居,并做相应的运算。
[0004] 然而,随着点密度的提升,传统的并行模型的性能下降得非常厉害。这是由于传统 方法会带来一个线程块中的不同线程的负载不均衡以及内存访问的不一致。这是由于这种 简单的线程划分策略导致的:一个线程块内的线程所负责的点往往会分布在几个不同的单 元格中,而不同单元格中的点的邻居以及邻接单元格中点的数量都是不一致的,从而导致 串行化的内存访问以和分支的产生。并且由于这种不一致性,很难利用GHJ中的层次线程和 存储单元的特性。图1就展示了传统并行模式下的状况,其中网格块是代表了在当前循环中 有点正在被访问的单元格,虚线方块是已经被访问过的单元格,c是一个线程块所负责点所 分布的单元格的数量,这个迭代循环会持续次,其中nc是邻接单元格的数量, nPlj是线程块内第j个单元格的第i个邻接单元格中点的数量。
[0005] 另一方面,随着GPGPU技术的不断发展,在一些诸如⑶DA和OpenCL这些主流的 GPGPU平台上,自适应并行技术(在这些主流平台上被称为动态并行)被逐渐得到支持。而这 个技术能够使得计算资源按需分配。从而避免了上一段所说的对计算和存储资源的浪费, 从而增加了系统的并行效率。
[0006] 同时,目前主流的主机往往配备有CPU和GPU。传统的并行模型往往会利用主机中 最适合的处理器(CPU或GPU)来计算某个指定问题,而其他设备则闲置了,这是对计算资源 的浪费。而针对固定网格算法来处理固定半径内的邻居问题,特别是在GPGPU的出现开始, 往往只交给GPU来处理。尽管CPU在处理这个问题方面性能不及GPU,但是合理利用CPU的计 算资源来协助GHJ还是一项非常有意义的工作。 发明內容
[0007] 本发明的目的是提供一种在CPU-GPU异构框架下遍历固定半径内邻居的自适应并 行算法,该算法在于充分利用主流单节点主机的所有计算能力,来更快速地用基于固定网 格算法来处理FNN问题。
[0008] 本发明的目的是这样实现的:
[0009] 一种在CPU-GPU异构框架下遍历固定半径内邻居的自适应并行算法,它包括以下 步骤:a)基于固定网格法将空间划分为互不相交的单元格,通过遍历邻接单元格中的点来 寻找所有在固定范围内的其他点;
[0010] b)GPU自适应并行模型
[0011] i)大量GPU内核程序的组织与调度
[0012] 1)从CPU上发射GPU父内核程序,该内核程序中每一个线程负责空间中一个单元格 的计算;
[0013] 2)每个父内核程序线程计算其所负责的单元格内的点的数量、点在内存中的存储 范围、计算这些点所需要的线程及内存资源;
[0014] 3)每个父内核程序线程根据所需要的线程以及内存资源,使用GPU动态并行快速 地为其所负责的单兀格发射一个GPU子内核程序来负责该单兀格中点的计算;子内核程序 中的线程数量依赖于单元格中点的数量;
[0015] ii)GPU内存访问优化
[0016 ] 1)为每个子内核程序中的线程块在共享内存中开辟足够存放W个点的必要数据的 空间;其中,W是sn?硬件能够同时执行的指令数量;在时下主流的GPU中这个值为32;
[0017] 2)每个子内核程序中的线程块中的前W个线程读取W个邻居点的数据到共享内存 中;通过GPU全局内存的合并访问从而在一次全局内存访问中读取多个点的数据;
[0018] 3)每个子内核程序中的线程读取在共享内存中的W个邻居信息并做相应的处理;
[0019] 4)重复本步骤2)和3)直到对于该子内核程序所负责的单元格的所有邻接点的数 据都被访问过;
[0020] c)CPU-GPU协同计算模型:
[0021 ]根据GPU自适应并行模型的缺陷,让CPU协同计算 [0022] i) CPU-GPU数据传输优化
[0023] CPU和GPU使用不同的存储空间,当需要进行数据同步时,两者进行频繁的数据交 换,优化步骤具体包括:
[0024] 1)任务分配策略:将包含点少的单元格交给CPU处理,其余的给GPU处理;
[0025] 2)将计算工作进行分组:将整个计算区域分成几个子区域,点根据其在空间中的 位置信息来确定其所在的子区域;计算将以子区域为单位计算,为了区域间的负载均衡,每 个子区域所包含的点的个数是相近的;
[0026] 3)重叠计算与数据传输:以本步骤2)中所分的子区域为单位进行计算;当一个子 区域中的点计算完毕后,马上将结果传到对端即CPU计算完毕后将结果传到GPU的存储空间 中,反之亦然;
[0027] 4)新的数据组织方式:将给CPU和GPU处理的点的数据集中在一起,得以较小的成 本调度大量的数据,并减少大量的冗余计算;
[0028] 5)根据上述要求,建立一套新的空间中点的排序规则,将点的数据在计算之前进 行排序,能够高效访问和快速定位;使用以上信息构成一个用于对点的数据进行排序的哈 希值,并根据该值使用基数排序或者计数排序对点的数据进行排序;
[0029] ii)负载均衡策略
[0030]使用动态负载均衡策略,以保证CPU和GPU能根据自己的计算能力的特性,分配到 适合的工作以及合理的工作量;
[0031] 1)-组指代单元格中点的数量的阀值来决定某个点是由CPU还是GPU来计算;为每 一个计算工作分组设定一个阀值;
[0032] 2)如果CPU和GPU的运算时间之比在[α,β] (〇〈α〈β〈1)范围之内,则不调整两者的工 作量;
[0033] 3)如果GPU的耗时较低,则直接调整一组阀值中的其中一个来增加 GPU的工作量; [0034] 4)如果CPU耗时较低,将使用如下方法增加 CPU的工作量:
[0035] a)预测更改了阀值之后的CPU计算量Wf = w〇+WA,其中Wf为预测工作量,w。为原有工 作量,w△为工作增加量;
[0036] b)预测计算时间q =4# f,其中,tcpu为上一次计算CPU的耗时,%为预测耗时;
[0037] c)判断% <U?X及,其中,tgpu为上一次计算GPU的耗时,如果是真,则修改阀值以 增加 CPU的计算量。
[0038]本发明的有益效果:
[0039] 本发明被运用于SPH方法模拟流体,并以此来检测其性能,SPH方法中有密度计算 和力计算两个部分涉及到FNN问题。GPGPU平台使用的是CUDA,并且使用自己开发的CPU-GPU 异构框架,CPU方面的多线程框架是基于生产者消费者模型开发,这个模型被广泛运用于处 理大规模并发事务的多线程服务器中。
【附图说明】
[0040] 图1为传统并行模式中GPU全局内存的串行访问过程图;
[0041 ]图2为只适用GPU动态并行而没有CPU协同计算的范例图;
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1