于异构平台的面向高维数据的词汇树构建方法_2

文档序号:9810364阅读:来源:国知局
问的数据放置到共享内存上,具体包括三个部分:(I)数据压缩访问:将多个数据合并为一次访问,充分利用GPU内存访问的带宽;(2)数据重构:基于面向高维特征点和高维特征点维度的并行模式,采取不同的数据重构策略,提高GPU主存的访问效率;(3)数据块逆向遍历和对数据块加载顺序的优化:在节点处理的循环中改变数据块的处理顺序,减少数据传输次数。
[0020](I)采用数据压缩的内存访问方式
访问主存时一次读取的带宽会远大于读取一个维度数据所需要的数据量,如果每次只读取一个维度的数据,就会浪费很多带宽。所以在每次读取数据时将多个维度的数据拼接成与带宽匹配的数据一次读取,这样就能充分利用每一次内存访问的带宽。对于分类的过程,一个点中相邻的多个维度会放在一起,作为一个数据读取,而对于求和的过程,将相邻的多个点的同一个维度抽取出来进行拼接,作为一个数据读取。
[0021](2)进行数据重构
特征节点的原始数据是按维度紧密存储的,这不利于分类时GPU的Warp中GPU主存访问优化的要求。在分类的过程中,采用的是以高维特征点为目标的并行方法,在这种方式下,线程与线程间的任务相互独立,耦合度小。由于一个warp里面的线程会合并GPU主存访问请求,GPU主存数据准备好后会统一返回给这些线程,所以如果warp中的所有线程在一次访存过程中访问的是连续的内存区域,就可以获得最好的性能。对数据进行重构,目的就是为了使warp中线程访问数据时,数据在GPU主存中的分布是连续的,即warp访问的特征点的同一维在GPU主存中应该是连续的。考虑到数据压缩访问的要求,还需要将同一个点的多个维度先作为一块存放,再和相邻点的相同维度一起存放。具体重构方式如图1所示;求和过程的重构则要将一组特征点的同一维度一起存放以适应压缩访问的要求。
[0022](3)逆向的数据块遍历和对数据块加载顺序的优化
对于大于GPU内存的节点,由于节点大小大于GPU主存的容量,所以需要将其划分为多个数据块依次放入GHJ中进行处理。将数据块设计成小于GPU内存的一半,在使用GPU生成新节点的时候就能使用GHJ的第二个工作流进行数据装载的工作,将下一块数据块装载在GPU的另一半内存上。这样GHJ可以尽可能地将两个任务并行化,最大化地利用GPU的处理能力。
[0023]数据块的处理顺序也需要进行优化。由于节点的处理会循环多次,那么对数据块也会进行多次遍历,所以在遍历的过程中要减少数据块的读取次数。前一循环的结尾数据块在后一循环开始时仍然会储存在GPU主存中,所以让相邻的两个循环以逆向的方向进行数据块的遍历处理,这样每一个GHJ在头部和尾部都可以节省一次数据块载入的工作。这对于数据块较少的节点来说能够节约许多等待时间,假如一个节点有三个数据块,由一个GPU来处理,有50次循环,原本要加载150次,而现在只需加载101次,那么就能节约1/3的装载时间。
[0024]第三步,将子节点放入队列中。
[0025]当前节点生成的K个子节点中,超过预定的层数L或者特征点过少的节点不会被放入队列,其余节点会被放到相应节点中。
[0026]第四步,重复第一至第三步的过程,当队列为空时,高维词汇树的构建工作完成。
【附图说明】
[0027]图1为用于分类的数据重构方式,以及数据压缩访问的示意图。
[0028]图2为多GPU大节点处理方式示意图。
[0029]图3为多GPU小节点处理方式示意图。
[0030]图4为节点处理算法整体过程示意图。
[0031]图5为节点处理流程图。
【具体实施方式】
[0032]下面将结合本发明的【附图说明】本发明的【具体实施方式】。本发明主要利用了异构平台中图形处理器强大的并行计算能力与可编程性,实现对高维词汇树构建过程的加速。具体流程如图5所示,具体步骤如下:
(I)从文件中读取特征点数据,创建初始节点,放入任务队中,交由建树程序运行。
[0033](2)主线程从队列头部获取一个节点,根据节点大小选择生成新节点的实现方式,协调GPU间的工作负载:
(a)大型节点:该节点无法整体载入到GPU内存上,将节点划分为可以放入单个GPU内存的数据块,将数据块依次交由不同的GPU处理,直至所有数据块处理完毕。为了将下一个数据块提早复制到GPU的内存中,要尽量使内存传输的时间与运算时间重合,此时放入GPU的内存的节点会小于内存大小的一半。这样另一半就可以使用新的GPU工作流进行下一个数据块的传输工作。完成一次所有数据块的处理后,下一次循环处理数据块时将会对数据块逆向遍历,以减少头尾的数据块载入次数。GPU在处理大型节点时的协作方式如图2所示,每次GPU工作完成都需要进行同步。对于分类,在每个数据块的工作完成后,将分类结果复制到主机内存中结果数组的相应段落上。对于更新中心点的求和过程,在每个工作快完成后,将结果累加到结果数组上;
另外,对于大型节点中的一类特例,也就是重构数据无法存储在GPU主存中的节点,采取以下的策略:在当前GPU对数据块运行分类或者更新中心点的操作时,下一块数据块在进行数据传输工作,而对于之后的一块数据块,要使用主机端的线程对其进行数据重组织工作;
(b)普通节点和碎片化节点:此时GPU间的协同方式如图3所示。对于普通节点,不需要划分数据块,只需要将整个节点放入GPU中对其进行处理即可。对于碎片化节点,也就是可以多个合并,一起放入GPU中处理的节点。由于每个节点的中心点不同,每个节点所累加的和数组也不同。无论是分类还是求和,共享内存都只能存放一个节点所需的共享数据,所以每个线程块都只能处理一个节点而每个节点必须使用整数个线程块,这个特性也导致了小节点必须占用一整块节点大小的GPU主存,这会产生很大的空间浪费。所以要设定一个总规模的阈值,这个阈值会根据GHJ内存的大小和线程总数来决定,确保节点实际占用的内存不会超出GPU内存的大小。这样,就能在GPU的计算过程中尽量多的节点放入GPU中,充分利用GHJ的多线程处理能力,处理更多数据。
[0034](3)对于单GPU的结构,在处理时大型节点时它会依次处理所有的数据块,在处理小型节点时会一次处理队列中的节点。此时不需要负载均衡的策略。
[0035](4)生成新节点,其过程如图4所示,主要分为两个部分,对每个高维特征点分类与更新中心点,而更新中心点又分为求和与求平均,由于求平均的计算量较少,故而放在主机中进行。在每次处理过程结束后,判断中心点是否改变,假如改变,就继续直到中心点不再变化为止。
[0036](5)在分类过程中,每个线程会负责完成一个高维特征点的分类工作,通过计算多维距离,找到最近的中心点。由于节点存储在全局内存中,访问延迟非常长,为了减少对其引用,每次读取多个维度数据,同时计算所有中心点的距离,并保存这些临时变量。由于计算过程对中心点以及临时距离的频繁引用,应该将其存储到共享内存中。但是共享内存极其有限,所以无法在该线程块中计算有不同中心点的第二个节点。每个线程块完成中心点的计算后,将结果存储到全局数组中。
[0037](6)在求和的过程中,线程块中的线程会依次读取多个维度的数据,累加到局部和上。由于每个线程明确了自己所处理的维度,所以只需要确保维度正确即可。完成当前数据后,线程会跳过这些数据读取下一组相同维度的数据,这就要求线程块中的线程必须是维度的倍数,以保证线程读取的下一组数据也是相同维度的数据。
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1