一种面向GPU的双调归并排序方法技术

技术编号:7917498 阅读:452 留言:0更新日期:2012-10-25 02:22
本发明专利技术公开了一种面向GPU的双调排序方法和系统,通过一个线程操作向量来模拟多个比较器,多个线程并行执行归并排序,其中对同一个工作组内的线程同步使用同步函数来完成,对不同工作组内的线程同步通过CPU完成,进一步的可以使用多个向量来模拟更大长度向量,在排序过程中改变比较器操作数的写回地址,对内存读写进行优化。本发明专利技术在节省存储空间的基础上,有效地减少CPU和GPU之间的同步次数、减少执行指令的总量和延时、增加GPU计算单元的利用率。

【技术实现步骤摘要】
—种面向GPU的双调归并排序方法本专利技术涉及一种数据排序方法,特别是一种面向GPU的基于OpenCL规范的双调归并排序方法。
技术介绍
排序是计算机应用中最常见的操作之一,随着并行处理技术的进一步发展,并行排序已经成为一个非常重要的研究领域。通常将并行排序分为两类一类是直接排序,能够直接实现序列的排序;另一类是归并排序,即可以将多个有序列快速合并为一个有序列。在现有技术中,大部分的排序方法都需要开辟新的内存空间来存储排序中间步骤的结果,例如常见的快速排序、基数排序和并行排序算法中的桶排序等。双调归并排序方法 能够直接在待排序列的存储空间进行数据交换,有效节省了内存开销。目前AMD的OpenCL软件开发套件(SDK)中包含了 OpenCL版本的双调排序方法在GTO上的实现。其双调排序程序能够充分利用GPU的流处理器,但是排序中的同步工作完全由CPU部分完成,工作组间的线程同步需要进行上下文的切换,从而影响计算效率。因此,在节省存储空间的基础上,如何有效减少CPU和GPU之间的同步次数、减少执行指令的总量和延时、增加GPU计算单元的利用率等是本专利技术要解决的技术问题。
技术实现思路
本专利技术的目的是为了有效减少CPU和GPU之间的同步次数、减少执行指令的总量和延时、增加GPU计算单元的利用率。为了实现上述目的,本专利技术提供了一种面向GPU的双调归并排序方法,包括如下步骤(I)将共享内存中的待排序列数据拷贝到GPU设备局部内存中;(2)判断是否需要进行向量内排序,若需要则由一个线程操作向量模拟L个比较器,多个线程并行执行归并排序;(3)将排序结果由GPU设备局部内存拷贝到共享内存中。本专利技术还提供了一种面向GPU的双调归并排序系统,包括如下模块用于将共享内存中的待排序列数据拷贝到GPU设备局部内存中的模块;用于判断是否需要进行向量内排序,若需要则由一个线程操作向量模拟L个比较器,多个线程并行执行归并排序的模块;用于将排序结果由GPU设备局部内存拷贝到共享内存中的模块。本专利技术的一种优选方案为多个线程并行执行归并排序时,对于同一个工作组内的线程同步使用同步函数来完成,对于不同工作组内的线程间同步通过CPU完成。本专利技术的另一优选方案为当一个工作组内的比较器本次和下次操作数都存在于该工作组的局部内存时,使用同步函数同步工作组内线程;当一个工作组内的比较器本次和下次操作数存放在不同的工作组局部内存时,由CPU参与线程的同步。本专利技术的另一优选方案为由一个线程来模拟LXM个比较器,操作2XM个向量进行比较交换操作,每个线程内向量运算指令顺序执行。本专利技术的另一优选方案为在排序过程中,改变比较器操作数的写回地址,以使局部内存读操作的地址连续,同时为防止线程间数据读写冲突,设置每个线程将需要操作的数据读入寄存器再进行比较交换操作。本专利技术的另一优选方案为在排序一组向量时,若该组向量的前半部分向量不连续,则将该前半部分向量中的后半部与该后半部分向量中的后半部交换位置后,再执行写回共享内存的操作。本专利技术的另一优选方案为在排序一组向量时,若该组向量的前半部分向量不连续,后半部分向量连续,则将该前半部分向量中的前半部与该后半部分向量中的前半部交换位置后,再执行写回共享内存的操作。附图说明 图I为双调归并排序网络的原理图;图2为本专利技术的由CPU端执行的主机程序流程;图3为本专利技术的GPU双调归并排序方法执行过程。具体实施例方式下面通过附图和实施例,对本专利技术的技术方案做进一步的详细描述。本专利技术主要通过以下几种方式,对现有技术中GPU双调归并排序方法做出改进一、使用向量模拟多个比较器在传统的GPU双调归并排序方法中,一条线程作为一个比较器(compare andconditionally interchange),待排序列长度为比较器数的2倍。可以将比较器第一次分组,通过组号即可确定所排列的数据段是按升序还是降序排列,同时可以将比较器二次分组,通过组号能够得到该比较器操作的序列元素的位置,图I是拥有4个比较器的双调归并排序网络的简单原理示意。而在实际应用的测试中发现,仅使用单数据项进行比较的传统双调排序方法在运行中算术逻辑单元(ALU)的使用率偏低,为解决该技术问题,本专利技术提出一种引入向量计算的双调归并排序方法,以提高算术逻辑单元的利用率。对2N个数字进行基于标量的双调归并排序,需要N个比较器,同步次数为(IgN/lg2+2)*(lgN/lg2+l)/2-l。而使用长度为L的向量,使得一个线程由模拟一个比较器变为模拟L个比较器,在进行双调归并排序时,同步次数减少为(2+lgN/lg2-2*lgL/lg2)*(lgN/lg2-2*lgL/lg2+l)/2-l。同时使用向量可以减少线程数,即减少需要执行的指令数。排序同等规模数据时,使用长度为L的向量的指令数为基于标量的指令数的1/L,从而将大大减少计算的时间,提高排序计算的效率。二、向量同步操作优化在GPU运算中线程同步是高开销的操作,不同的同步方法产生的开销差别很大。在OpenCL规范中,一个工作组(work-group)内的线程(work_item)同步可以使用同步函数完成,同步过程不需要CPU参与,不涉及上下文(context)切换,因而该同步方法开销低。而工作组间的线程同步必须通过切换上下文到CPU设备来完成,该同步方法开销高。若GPU—个工作组内可包含的线程数为ITEMS,使用长度为L的向量进行排序操作,当(N/L>lgITEMS/lg2)时,需要CPU同步的次数为(l+lgN/lg2-2*lgL/lg2-lgITEMS/lg2)*(lgN/lg2-2*lgL/lg2_lgITEMS/lg2)/2 ;而当(N/L〈=lgITEMS/lg2)时,需要CPU同步的次数为0,即完全使用同步函数来进行线程内同步。基于上述分析,为了将同步开销降到最低,本实施例的方案中混合使用两种同步方法,当一个工作组内的比较器本次和下次操作数都存在于该工作组的局部内存时,使用同步函数同步工作组内线程;当一个工作组内的比较器本次和下次操作数存放在不同的工作组局部内存时,CPU参与所有线程的同步。三、使用多个向量模拟更大长度向量 由于在GPU运算中,向量指令允许的向量长度有限制,为使单个线程模拟超过最大向量长度数的比较器,可以使用单线程操作2组多个向量实现。使用标量的情况下,一个线程模拟一个比较器操作2个标量进行比较交换;使用L长度的向量情况下,一个线程模拟L个比较器操作2个向量进行比较交换。为使单个线程模拟超过向量指令允许的最大向量长度数的比较器,本实施例的方案中,使用单线程操作2组向量,每组向量中包含多个向量。即L长度向量情况下一个线程模拟L*M个比较器操作2*M个向量进行比较交换。单线程操作2组M个L长度向量,即相当于使用M个L长度向量模拟M*L长度向量,从而增加单个工作组内处理的数据量。对于排序2N个元素,使用M个L长度向量模拟M*L长度向量,与实施例一、二中使用L长度向量相比,在执行相同数量向量运算指令下将(l+2*lgN/lg2-2*lgITEMS/lg2-2*lgM*lg2)*lgM/lg2条需CPU参与的同步转换为单线程内向量运算指令顺序执行所蕴含的隐式同步或同步函数同步,隐式同步的开销要小于CPU本文档来自技高网...

【技术保护点】
一种面向GPU的双调归并排序方法,其特征在于包括如下步骤:(1)将共享内存中的待排序列数据拷贝到GPU设备局部内存中;(2)判断是否需要进行向量内排序,若需要则由一个线程操作向量模拟L个比较器,多个线程并行执行归并排序;(3)将排序结果由GPU设备局部内存拷贝到共享内存中。

【技术特征摘要】

【专利技术属性】
技术研发人员:迟学斌王珏阚圣哲聂宁明郎显宇
申请(专利权)人:中国科学院计算机网络信息中心
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1