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

文档序号:9810364
于异构平台的面向高维数据的词汇树构建方法
【技术领域】
[0001]本发明属于并行处理器技术领域,具体涉及一种基于异构平台处理能力的面向高维数据的词汇树(Vocabulary Tree)构建方法。
【背景技术】
[0002]随着大数据时代的到来,海量数据已经渗透到社会的每一个行业,对于海量数据的处理已经成为议论的热点。在图像检索领域,大量的数据图片给检索带来了前所未有的困难。根据资料显示,Facebook每天上传的图片量达到3.5亿,数据量达到7PB,对于如此庞大的数据,如何快速有效的检索从而提供更好的用户体验变成了巨大的挑战。高维Vocabulary Tree(词汇树)的提出有效地提高了图像识别方面的性能,该算法首先用局部特征提取算法对图像提取特征点,然后将这些图像特征点的集合通过聚类的方法生成数据词汇,接着采用TF-1DF的加权方法,使得图片的检索时间能够有效地缩短。
[0003]虽然高维词汇树的提出有效地高了图像检索的效率,但是基于大数据图片的高维词汇树的构建过程仍然十分耗时,一百万张图片,包含了四亿多个特征点,而每个特征点都是由64维或者128构成的高维数据,总数据量将近50GB,其建树过程需要花费64个小时。而假如要处理前文提到的Facebook的数据量,即使处理时间是线性增长的,也需要9000多个小时一一超过一年的时间。而一旦图像数据库发生改动,那就需要重新为新的图像数据集建树,如此长的建树时间给图像搜索应用带来极大的不便。因此提升高维词汇树构建过程的速度是十分必要的。
[0004]在过去的近十年时间内,图形处理器(GPU)不仅在图像处理方面发挥作用,在并行处理领域也得到了飞速的发展,而且在性能加速方面的能力也已经远远胜出CPU。由于GPU通用计算的编程模型(如CUDA、0penCL)逐渐成熟,越来越多复杂的、计算量大的难题都已经移植到GPU上处理,很多已经得到了解决并且在性能方面有很大提升。同时随着多核CPU处理器技术的出现,CPU强大的计算能力也不容忽视,超级计算机通常配置几百个CPU处理器。在GPU和多核CPU快速发展的情形下,完全能够利用这些强大的计算资源来提升构建高维词汇树的速度。而节点的处理算法中分类以及求和这两个数据密集型的过程又非常适合使用GPU进行加速。因此,高维词汇树的构建适合部署到异构处理平台(通用处理器和图形处理器(GPGPU)混合架构)上进行。本发明致力于利用异构平台处理器,以提升高维词汇树构建速度。

【发明内容】

[0005]本发明的目的在于提供一种高速的面向高维数据词汇树的构建方法。
[0006]本发明提供的面向高维数据的词汇树的构建方法,是基于异构平台(通用处理器和图形处理器(GPGPU)混合架构)的,包括:利用异构平台中图形处理器(GPU)强大的并行计算能力与可编程性,提升高维词汇树构建过程的速度;利用高维词汇树算法特性和图形处理器的内存访问模式优化算法;提出主机和图形处理器在高维词汇树算法运行过程中的协调策略。
[0007]在高维词汇树的构建中,计算量主要集中在节点生成的部分,所以本发明将高维词汇树中队列管理以及预处理工作放在主机端,生成新节点算法中的分类以及求和两个部分交由GPU进行处理。
[0008]词汇树的构建流程如下:
在运行建树程序前,将所有图片的高维特征点作为一整个节点放入队列中。之后,开始运行建树程序,建树过程根据主机端的主线程维护的队列进行。
[0009]第一步,程序从任务队列中取出待处理的节点,并将需要处理的数据传输到GPU的主存中。
[0010]由于高维词汇树的建树过程可以使用多个GPU合作,所以需要合理地调度任务,确保多个GPU的负载相近,否则会拖慢整个程序的进度。根据节点大小的不同,程序将采用不同的GPU协同策略,所以本程序将节点分为三种,并放到不同的队列中进行处理。在前一个队列处理完之前程序不会处理下一个队列中的节点。
[0011]第一种是大型节点。这类节点的大小超过GPU主存的容量,要将其划分为可以放入GPU中的数据块。如果是多GPU结构,每个GPU会依次拿取自己的数据块;如果是单GPU结构,该GPU会顺序处理所有的数据块。每次处理完所有数据块的分类或者求和之后,进行同步,并将结果汇总至主机端内存上的数组中,之后再进行下一部分的处理。在大型节点中还有一种特殊的超大型节点。一般节点的数据会在主机端预先重构完毕,而这种超大型节点的重构数据会超出主机端的主存容量,需要在GHJ进行处理的同时对其进行重构,以减少主机端内存的压力。
[0012]第二种是普通的节点,可以整块放入GPU内存中,不需要划分为数据块。在这一部分中,GPU会按顺序从队列中获取任务,处理完一个任务后即可取下一块任务。
[0013]最后,是碎片化节点。到了队列的尾部,高维词汇树的底层,会产生许多只有数百,数十个高维特征点的节点。GPU需要尽可能多的数据以充分利用GPU的计算能力,所以要放入尽量多的碎片化节点以填满GPU的内存,此时GPU每次可以处理上百个节点。
[0014]第二步,程序对节点进行处理,生成K个子节点。
[0015]首先,在节点中随机寻找K个高维特征点作为初始的中心点,然后对高维特征点进行分类处理,之后对每个分类求和,最后得到新的K个中心点;经过循环上述过程,至中心点结果不变后,得到K个新的中心点。
[0016]GPU上节点的处理工作有两部分:一是对每个高维特征点进行分类,二是对每个类别的高维特征点进行求和;由于这两部分都具有数据密集的特性,它们非常适合用GHJ进行并行加速。然而由于这两部分具有不同的计算模式和内存访问特点,如采用相同的并行模式很难充分利用GHJ的计算资源。因此,需要对它们采用不同的并行模式以提高并行性能。
[0017]对于分类计算,每个线程以高维特征点为任务目标,去完成分类任务。线程的任务是首先求出高维特征点与所有中心点的多维距离,然后确定与之距离最短的中心点,将结果存储到全局内存中。由于计算最短距离不适合由多个线程共同完成,所以在这里选择根据高维特征点进行处理的方式,线程会各自读取高维特征点进行处理。中心点的数据被存储在线程块的共享内存中,这是所有高维特征点公用的数据,放在共享内存中能够减少不必要的主存访问。当一个线程在处理完一个节点后,它会读取下一个要处理的高维特征点并循环直至处理完所有的节点。
[0018]对于求和计算,分类只需要共享中心点的数据进行读取即可,但是求和部分每个点都需要维护自己的局部和。假如不做改变,仍然根据点进行并行计算,每个线程所维护的局部和势必要放在全局内存上,那么每次累加的操作都会涉及到一次对全局内存的访问,这些主存访问都是不必要的,会对性能造成影响。所以,求和部分GPU按维度进行并行处理,一个线程块会处理一组节点,每个线程会负责特定的维度,每个线程只需要存储自己负责的维度的局部和即可,这样就能将局部和放在共享内存上,减少不必要的GPU主存访问。每次处理完一个点中的特定维度,线程会根据线程块中的总线程数累加一定的地址得到下一部分有相同维度的数据。最终,在这组节点中所有线程都完成累加后,会有特定的线程将各自负责的值累加到全局变量上。
[0019]除了并行算法,本发明还对于GPU中的内存访问进行了优化。在GPU中全局内存,也就是主存的访问速度非常慢,会比共享内存和寄存器慢数百倍,而共享内存的访问速度只会比寄存器慢数倍。所以本发明的优化目标是减少对全局内存的访问或者将经常访
再多了解一些
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1