一种基于GPU片上的数据处理方法
技术领域
本发明是关于计算机领域,具体涉及数据分析和并行计算领域,尤其涉及一种基于GPU片上的数据处理方法。
背景技术
GPU早期用于图形处理,之后逐渐用于一般的计算任务,利用GPU的众核特性进行并行计算,加速任务处理。虽然GPU的每个性能在计算能力上弱于CPU的性能,但其内核数量远多于CPU内核。实验表明,对于一般可并行的计算任务而言,GPU的性能可达到CPU的数十倍。由于GPU结构的特殊性,一般用于对可高度并行的任务进行加速,而对于其他任务的加速效果可能尚不足以弥补CPU与GPU之间转换所消耗的代价。通常情况下,在多数实际***部署中,任务处理以CPU为主,其中可高度并行的部分使用GPU处理,提高任务处理速度。
由于GPU的计算吞吐率的增长速度远大于其片下存储带宽的增长,因此要充分合理的利用片上存储才能有效的利用GPU的计算资源。不同GPU片上存储的容量增长速度不同,如寄存器文件的容量增长速度比共享资源的容量增长速度快很多,因此在一个GPU上的最优化执行代码并不一定适用于其他GPU。现有的GPU程序性能优化方法主要通过修改GPU程序代码,受限于应用程序类别和GPU设备参数,该优化方法的通用性和可移植性较差。
对于应用开发者而言,手动调节片上存储的问题主要表现在:一是GPU的三类片上存储均对性能有所影响,但对于某个应用中指定的数据元素而言,很难确定合适的片上存储资源的分配情况;二是不同时期GPU之间资源的发展是非线性的,因此不同GPU的最优化片上资源使用情况也不同。
发明内容
本发明提出一种GPU片上的数据处理方法,对给定的GPU程序自动进行片上存储空间的优化,从而提高GPU程序的处理性能。
为了达到上述目的,本发明采用的技术方案为:
一种基于GPU片上的数据处理方法,包括以下步骤:分析GPU程序代码,统计当前GPU片上共享存储空间的所有数组变量;将统计得到的所有数组变量按访问次数排序;选择访问次数最高的数组变量从共享存储空间迁移到寄存器或L1缓存;若迁移后的***性能优于迁移前的性能,则从共享存储空间中迁移出更多的数组变量,否则终止。
优选的,统计当前GPU片上共享存储空间的所有数组变量,包括采用变量统计流程(CollectArray)统计当前GPU程序中存储在片上共享存储空间的所有数组变量。
优选的,变量统计流程(CollectArray)包括:分析编程序代码;找出其中所有存储在片上共享存储空间内的数组变量,记为SMArray。
优选的,统计当前GPU片上共享存储空间的所有数组变量,包括采用参数统计流程(Collectlnfo)统计每个共享存储数组变量的相关参数。
优选的,参数统计流程(Collectlnfo)包括:统计SMArray中每个共享存储数组变量的参数信息,包括访问次数、是否被多线程访问以及下标是否为常数三个参数;对于SMArray中某个数组变量arrayi而言,其访问次数记为arrayi.count。依次遍历GPU程序,若数组变量arrayi的该次访问在条件语句中,则假设本次访问有一半的概率可被执行,即arrayi.count+=0.5;若本次访问在循环体内且循环次数为常数,则访问次数arrayi.count+=loops,若循环体次数为变量则arrayi.count+=loops_app,其中loops表示常量的循环次数,loops_app表示近似的非常量的循环次数;loops_app是经验值;对于SMArray中某个数组变量arrayi而言,该参数记为arrayi.threads,如果数组变量arrayi在某次访问中被多个线程访问则arrayi.threads=true,否则arrayi.threads=false;对于SMArray中某个数组变量arrayi而言,该参数记为arrayi.constant,如果数组变量arrayi的长度为常量则arrayi.constant=true,否则arrayi.constant=false。
优选的,将统计得到的所有数组变量按访问次数排序,包括采用变量排序流程(SortArray)将所有共享存储数组变量按其访问次序从高到低排序,具体为:调用程序开发平台集成的快速排序函数;将SMArray中的数组变量按照每个数组变量的访问次数从高到低排序。
优选的,选择访问次数最高的数组变量从共享存储空间迁移到寄存器或L1缓存,包括采用变量迁移流程(PromoteArray)将部分共享存储数组变量从共享存储空间迁移到其他片上存储空间。
优选的,变量迁移流程(PromoteArray)包括:选择当前SMArray中访问次数最高的数组变量arrayi;若arrayi.threads=false且arrayi.constant=true,则arrayi迁移到寄存器中,否则迁移到L1缓存中;进一步判断若arrayi.threads=false且arrayi.constant=false,则arrayi迁移到L1缓存的局部存储空间中;否则迁移到L1缓存的全局存储空间中。
优选的,若迁移后的***性能优于迁移前的性能,则从共享存储空间中迁移出更多的数组变量,否则终止包括:估算数组变量arrayi迁移后的任务处理时间new_runtime,若new_runtime>current_runtime,则撤销本次迁移操作并终止整个优化过程;否则将数组变量arrayi从SMArray中删除,并重复执行PromoteArray()算法。
一种采用基于GPU片上的数据处理方法的数据处理设备,数据处理设备内部设有GPU(图形处理器)。
与现有技术相比,本发明的优点和积极效果在于:
1、本发明可以与传统的提升GPU程序性能的方法共同使用,在传统的优化方法基础上进一步提高性能;
2、可以自主执行,不需要应用程序开发者手动对GPU程序修改;
3、适用性很广,可以适用于各种类型的GPU应用程序以及当前所有的GPU设备,但对性能的提升程度与具体的应用类型和GPU设备有关。
附图说明
通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本申请的其它特征、目的和优点将会变得更明显:
图1总体方案流程框图
图2变量统计流程框图
图3参数统计流程框图
图4变量排序流程框图
图5变量迁移流程框图
图6变量迁移流程框图
具体实施方式
本发明提出一种基于GPU片上的数据处理方法,对给定的GPU程序自动进行片上存储空间的优化,从而提高GPU程序的处理性能。
CollectArray():用于统计当前GPU程序中的所有共享存储数组变量;
Collectlnfo():用于统计每个共享存储数组变量的相关参数;
SortArray():用于将共享存储数组变量按访问次数的降序排序;
PromoteArray():用于确定将那些共享存储数据变量的迁移到其他存储空间;
CollectVariables():用于优化共享存储数组变量及其相关参数的统计过程;
下面结合附图和实施例对本申请作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释相关发明,而非对该发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与发明相关的部分。
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。
总体方案如下,如图1所示:
101、首先分析GPU程序代码,统计当前片上共享存储空间的所有数组变量,包括每个数组变量的访问次数、是否用于多线程通信、数组下表是否为常量等参数。
102、其次将统计得到的所有数组变量按访问次数排序。
103、然后选择访问次数最高的数组变量从共享存储空间迁移到寄存器或L1缓存。
104、若迁移后的***性能优于迁移前的性能,则从共享存储空间中迁移出更多的数组变量,否则终止优化流程。
具体实施方式如下,变量统计流程框图如图2所示:
201、分析代码:首先利用GPU程序编译工具对当前GPU程序进行编译。
202、找出变量:然后找出其中所有存储在片上共享存储空间内的数组变量。
203、记为SMArray。
参数统计流程框图如图3所示:
301、统计参数:统计SMArray中每个共享存储数组变量的参数信息,包括访问次数、是否被多线程访问以及下标是否为常数三个参数。
302、arrayi的长度为常量:对于SMArray中某个数组变量arrayi而言,该参数记为arrayi.constant,如果数组变量arrayi的长度为常量则arrayi.constant=true,否则arrayi.constant=false。
303、arrayi的次数为常量:对于SMArray中某个数组变量arrayi而言,其访问次数记为arrayi.count。依次遍历GPU程序,若数组变量arrayi的该次访问在条件语句中,则假设本次访问有一半的概率可被执行,即arrayi.count+=0.5;若本次访问在循环体内且循环次数为常数,则访问次数arrayi.count+=loops,若循环体次数为变量则arrayi.count+=loops_app,其中loops表示常量的循环次数,loops_app表示近似的非常量的循环次数。loops_app是经验值,其获取方法如下:统计开源的GPU标准测试程序或其他业务相关的GPU程序在运行过程中,每个循环次数为不确定的循环体的实际执行次数,然后将其累加并求得平均执行次数即为loops的近似取值。
304、arrayi被多线程访问:对于SMArray中某个数组变量arrayi而言,该参数记为arrayi.threads,如果数组变量arrayi在某次访问中被多个线程访问则arrayi.threads=true,否则arrayi.threads=false。
变量排序流程框图如图4所示:
401、调用程序开发平台集成的快速排序函数。
402、按访问次数排序:将SMArray中的数组变量按照每个数组变量的访问次数从高到低排序。
变量迁移流程框图如图5、图6所示:
变量迁移是一个迭代过程,每次迭代判断是否需要将当前SMArray中访问次数最高的共享存储数组变量迁移到其他存储空间。
501、arrayi迁移到寄存器:首先选择当前SMArray中访问次数最高的数组变量arrayi而言,若arrayi.threads=false且arrayi.constant=true,则arrayi迁移到寄存器中。
502、arrayi迁移到L1缓存的局部存储空间:进一步判断若arrayi.threads=false且arrayi.constant=false,则arrayi迁移到L1缓存的局部存储空间中。
503、arrayi迁移到L1缓存的全局存储空间:否则迁移到L1缓存的全局存储空间中。
600、然后,估算数组变量arrayi迁移后的任务处理时间new_runtime,若new_runtime>current_runtime,则撤销本次迁移操作并终止整个优化过程;否则将数组变量arrayi从SMArray中删除,并重复执行PromoteArray()算法。
变量统计和参数统计在执行过程中需要多次遍历GPU程序,时间开销较大。为了提高***的效率,变量统计和参数统计在执行可同时执行,在一次遍历GPU程序的过程中完成SMArray及每个数组变量所有参数的统计。因为在GPU程序中变量需要先声明后才能使用,因此可以确定每个数组变量arrayi是否存储在共享存储空间中,然后再统计arrayi.count、arrayi.threads、arrayi.constant等相关参数。
具体算法表述如下:
其中,所述Kernal和List均为GPU程序的变量类型,kernal为当前的GPU程序,SMArray为kernal中所有共享存储数组变量的列表,!EOF(kernal)表示顺序遍历kernal程序直到遍历完整个程序为止,arrayi表示kernal中的一个共享存储数组变量,SMArray.add(arrayi)表示将arrayi表***到列表SMArray中,arrayi.count参数为浮点类型,表示数组变量arrayi的访问次数,arrayi.threads和arrayi.constant参数均为布尔类型,分别表示数组变量arrayi是否被多线程访问和是否为常数下标,access表示对数组变量arrayi的访问。
通过上述过程,提供一种GPU片上的数据处理方法,可以与当前的更新设备和手动优化GPU程序的方法项结合,适用于各类GPU应用程序也可以在各种GPU设备上进行移植,尤其适用于大数据领域,可以对GPU程序的性能进行一定的提升。
以上描述仅为本申请的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本申请中所涉及的发明范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离所述发明构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本申请中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。