基于访存分歧的gpu核心程序重组优化方法

文档序号:6397142阅读:233来源:国知局
专利名称:基于访存分歧的gpu核心程序重组优化方法
技术领域
本发明涉及GPU核心程序(即GPU Kernel)重组优化方法,尤指基于访存分歧的GPU Kernel重组优化方法。
背景技术
近年来,GPU (Graphics Processing Unit,图形处理单元)强大的计算能力、海量线程并发的执行模式以及灵活的编程模型,使得GPU已经广泛应用于分子动力学模拟、生物起源分析、气象预测等众多高性能计算领域。面对面对大规模的GPGPU (General Purposecomputing on Graphics Processing Units)应用映射,标准的单核心程序(Kernel)模式无法满足大规模应用程序的需求。GPU核心程序(GPU Kernel)就是运行在GPU上的程序段,通常程序员会将程序中计算密集、运行耗时的核心子程序移植到GPU上加速,运行在GPU上这样的核心子程序通常称为 GPU Kernel。面对大规模的GPGPU应用程序,其GPU Kernel数目多达数十上百个。为了提高如此多GPU Kernel的调度效率,最大限度开发程序并行性,多GPU Kernel重组优化技术成为提高程序运行效率的有效途径。目前GPU Kernel重组优化方法主要有以下几种:(I)基于Kernel并发的多Kernel合并。NVIDIA第二代统一架构之前的GPU体系结构是不支持多Kernel并发执行的,为了让独立的GPU Kernel能够并发执行,多Kernel合并是多Kernel并发执行的有效方法。NVIDIA第二代统一架构GPU虽然能够并发多Kernel同时执行,但是并发Kernel的数量也是极其有限的,因此,多Kernel合并方法可以提高多Kernel之间的并行性,缓解多Kernel顺序执行的压力,减少多Kernel启动开销,开发利用多Kernel之间的并行性,提高GPU程序的运行效率。(2)基于GPU共享存储器的多Kernel合并。如果GPU Kernel之间存在数据依赖关系,即一个Kernel的输出刚好是另一个Kernel的输入,为了避免各Kernel顺序访问长延迟的全局存储器,可以将存在输入输出数据依赖关系的多个Kernel合并成一个独立的GPU Kernel,在GPU Kernel内显式管理GPU共享存储器作为数据传输中介,避免全局存储器的访问,提高访存效率,同时减少GPU Kernel数目,减少了 GPU Kernel启动开销并且有利于Kernel调度,提高GPU程序运行效率。(3)基于程序分支的多Kernel重组。不同于传统的CPU体系结构,GPU将片上绝大部分资源用于计算,GPU中的控制单元和分支预测部件相对匮乏。如何在GPU Kernel中避免线程分支,对于提高GPU Kernel的执行效率至关重要,因此,有学者提出将同一 GPUKernel中的不同程序分支分离出来组建不同的GPU Sub-Kernel,然后将具有相同执行路径的GPU Sub-Kernel合并组成一个新的GPU GPU Kernel,实验基于程序分支的GPU Kernel重组可以有效避免GPU线程分支而造成的线程等待与同步,显著提高了 GPU Kernel的执行效率。上述三类GPU Kernel重组优化方法,在一定程度上,面向具体的大规模GPU应用优化加速都可以提高GPU Kernel的执行效率,提升GPU应用程序的性能。但是,上述三类GPU Kernel重组优化方法忽略了 GPU线程存储访问模式对GPU Kernel的执行效率的影响。实践中,GPU线程的访存行为特征将严重影响GPU Kernel的执行效率。因此,如何从实践应用出发,解决因为GPU线程的访存行为特征导致的GPU系统效率低和GPU应用性能差的难题是本领域技术人员关注的重要技术问题。GPU线程的访存行为特征可以分为以下两类:(I) Kernel中的线程访问一片连续的存储空间,这也是一种理想化的GPU线程的访存行为特征,在这种访存行为特征下GPU Kernel执行效率最高;(2) Kernel中的线程访存行为出现跳跃特征,即各线程访问不同的存储器空间或是非连续访问同一存储器空间的间断存储单元。GPU线程的访存行为特征中Kernel线程出现跳跃特征的访存行为称之为GPU线程访存分歧。SIMD (Single Instruction Multiple Data,单指令多数据)加速已经成为提升体系结构效能的有效方法,GPU体系结构就是一种典型的SIMD加速体系结构。SIMD加速的工作模式是以GPU线程访问一段连续的存储空间为基础。如果GPU线程的存储访问行为出现了跳跃特征,不仅不能提升 系统效能,加速GPU应用,还会严重影响GPU系统效能和GPU应用程序运行效率。重组优化出现访存分歧的GPU线程是提升GPU系统性能和GPU应用程序运行效率的关键技术和方法。因此,通过GPU Kernel重组方法来消除GPU线程访存分歧,能够最大限度提升GPU系统效能和GPU应用程序运行效率。目前还没有公开文献涉及相关技术方案。

发明内容
本发明要解决的技术问题在于:针对大规模多GPU Kernel应用执行效率低的问题,提出一种基于访存分歧的GPU Kernel重组优化方法,以提升大规模GPU Kernel的执行效率和应用程序性能。为了解决上述技术问题,本发明的具体技术方案为:第一步、采用Create方法为GPU程序的每个Kernel函数构建访存行为特征表。Create方法的具体步骤是:为GPU程序的每个Kernel函数建立一张访存行为特征表,访存行为特征表包含四个字段,分别为:线程编号Tid、线程访问的存储器类型MemT、线程访问的数据大小Size和访问的存储空间逻辑地址Addr。线程编号Tid表示线程在该Kernel函数域中的唯一编号;线程访问的存储器类型MemT表示线程访问的存储器类型,存储器类型包括全局存储器Global、共享存储器Shared Memory、纹理存储器Texture Memory和常量存储器Constant Memory ;线程访问的数据大小Size表示该线程访问的数据占据存储空间字节的数目;线程访问的存储空间逻辑地址Addr表明线程操作计算需要的数据存放的地址空间。第二步、采用Record方法记录各Kernel函数中各线程的访存轨迹。Record方法的具体步骤是:2.1扫描GPU核心程序,定义GPU核心程序中Kernel函数的函数编号Kid依次为
O,I,…i,…M-1,其中,O ( i〈M,M为GPU核心程序中Kernel函数的数目;并定义编号为i的Kernel函数启动的线程数目为Ti,则访存行为特征表的总数为M ;编号为i的Kernel函数对应的访存行为特征表的表项数目为该Kernel函数启动的线程数目1\。将GPU程序中的Kernel线程的访问访存轨迹信息写入访存行为特征表对应的表项和字段;2.2初始化」=0;2.3获取函数编号为j的Kernel函数启动的线程数目Ir并初始化k=0 ;2.4将函数编号为j的Kernel函数的第k线程的访存轨迹信息分别写入访存行为特征表的字段TicU MemT> Size和Addr,更新k=k+l ;2.5 如果 k ( T厂I,转 2.4 ;否则转 2.6 ;2.6 更新 j=j+l ;2.7 如果 j ( M-1,转 2.3,否则转 2.8 ;2.8各Kernel函数中各线程的访存轨迹信息记录完毕,执行第三步。第三步、访存分歧判断。根据每个Kernel函数中的GPU线程的访存地址,判断同一 Kernel函数中的GPU线程中的线程访存是否出现访存分歧。判断方法如下:3.1 初始化 j=0 ;3.2获取函数编号为j的Kernel函数启动的线程数目Tj,定义该Kernel函数访问的存储器类型集合Sj为空,即& =0,并定以分歧地址集合Aj为空,即為=0,初始化m=0 ;3.3查询访存行为特征表获取线程Tm访问的存储器类型表示第m个线程Tm的访问存储器类 型。如果与线程Tm+1访问的存储器类型riff不同,则判定线程Tm与线程m+1出现访存分歧,将出现分歧的存储器类型添加到集合Sj中,即<=&和T:,T [ Sf,执行3.4 ;否则直接执行3.4 ;3.4查询访存行为特征表获取线程Tm访问的存储空间逻辑地址7;^ η示第m个线程^的访问存储空间逻辑地址。如果f与第m+1个线程访问的存储空间逻辑地址rif'的差值不等于线程Tm访问的数据的大小,则判定线程Tm与线程Tm+1出现访存分歧,将出现分歧的访问存储器类型和线程地址构成的二元组集合和
)}依次并入集合 Aj 中,即{(^ΒΓ,Γ ..)}υ為和{(TT'Cf》U4,执行 3.5 ;否贝U,直接执行3.5 ;3.5更新m=m+l,如果HKTj-1,转3.2 ;否则,表示线程访问存储器类型比较判断没有结束,执行3.6 ;3.6 更新 j=j+l ;3.7如果j ( M-1,转3.2,否则,表明已没有Kernel函数需要进行访存分歧判断,执行3.8。3.8各Kernel函数访存分歧判断完毕,如果\ = 0并且為=0,则表示不存在访存分歧,直接结束优化,转第五步,否则,进行GPU Kernel重组优化,转第四步。第四步、基于访存分歧的GPU Kernel重组优化。对GPU核心程序中出现访存分歧的GPU Kernel进行重组优化主要包含两个步骤:将GPU Kernel分裂成为多个不存在访存分歧的子Kernel ;将访存连续的子Kernel融合成一个新的GPU Kernel。4.1将基于访存分歧的GPU Kernel分裂。将出现访存分歧的GPU Kernel分裂成为多个不存在访存分歧的子Kernel,方法如下:
4.1.1 初始化 j=0 ;4.1.2获取集合Sj的元素个数,即,将函数编号为j的Kernel分裂成为力〃》^个子 Kernel ;4.1.3查询函数编号为j的Kernel对应的访存行为特征表,获取具有相同访问存储器类型的线程集合,得到#"^%,个线程集合,以每个线程集合为线程块组织一个子Kernel ;4.1.4 更新 j=j+Ι ;4.1.5如果」彡 M-1,转 4.1.2,否则,执行 4.1.6 ;4.1.6基于存储器类型的GPU Kernel分裂完毕,转4.1.7。4.1.7 初始化 j=0 ;4.1.8如果Sj为空,即j Sf = 0,转4.1.9 ;否则,为Kernel分裂后的GPU程序中的每个Kernel函数构建访存行为特征表,转第一步;4.1.9如果」彡 M-1,转 4.1.8 ;否则,转 4.1.10 ;4.1.10 初始化 j=0 ;4.1.11获取集合Aj的元素个数,即将函数编号为j的Kernel分裂成为个子 Kernel ; 4.1.12查询函数编号为j的Kernel对应的访存行为特征表,以^中元素为界将函数编号为j的Kernel分裂成为#个子Kernel ;4.1.13 更新 j=j+l ;4.1.14 如果 j ( M-1,转 4.1.11,否则,转 4.1.15 ;4.1.15 初始化 j=0 ;4.1.16 如果 Aj 为空,SP,為=0,转 4.1.17 ;否则,转 4.1.11 ;4.1.17 如果 j 彡 M-1,转 4.1.8 ;否则,转 4.2。4.2对连续访存的GPU Kernel进行融合。经过Kernel分裂形成后的GPU核心程序可能存在Kernel碎片,影响GPU Kernel运行效率。将具有相同存储器访问的连续访存线程融合为一个新的较大的GPU Kernel可以显著提升GPU系统效率和应用程序性能,这时进行融合的Kernel包括分裂后形成的Kernel和没有分裂的Kernel,如Kernell分裂成了 Kernelll和Kernel 12,Kerne12并没有分裂,但是Kernel融合需要综合考虑Kernelll、Kernel 12和Kerne12进行融合形成新的Kernel。具体的Kernel融合方法如下:4.2.1采用Create方法为第4.1步处理后的GPU程序中的每个Kernel函数构建访存行为特征表,再采用Record方法记录各Kernel函数中各线程的访存轨迹;4.2.2 初始化 j=0 ;4.2.3查询4.2.1构建的访存轨迹特征表,获取函数编号为j和j+Ι的Kernel的线程访问存储器类型,如果函数编号为j的Kernel (表示为Kernel j)的线程访问存储器类型与编号为j+Ι的Kernel (表示为Kernelj+Ι)相同,转4.2.4 ;否则转4.2.6 ;4.2.4查询访存轨迹特征表,获取Kernelj和Kernelj+Ι访问的一片连续空间的起始地址和终止地址以及最后一个线程访问的数据大小。如果函数Kernelj的线程访问地址连续空间的终止地址与Kernel j+Ι的起始地址相差Kernel j中最后一个线程访问的数据大小或是Kernelj+Ι的线程访问地址连续空间的终止地址与Kernelj的起始地址相差Kernelj中最后一个线程访问的数据大小,贝Ij判定Kernel j与Kernel j+Ι访问的是一片连续的存储空间,转4.2.5 ;否则,转4.2.6 ;4.2.5对Kernel j与Kernel j+Ι进行融合操作,具体操作方法为:采用背景技术中基于Kernel并发的多Kernel合并方法将Kernelj与Kernel j+1中的线程重新合并,组织成为一个较大的新的GPU Kernel。4.2.6 更新 j=j+1 ;4.2.7如果j〈M_l,转4.2.3 ;否则,执行第五步。第五步、结束。采用本发明可以达到以下技术效果:1.缓解了 GPU程序访存压力,提高GPU系统的访存效率;2.加快了 GPU应用程序的运行速度并且提高了 GPU系统的资源利用率。


图1为访存行为特征表结构。图2为基于访存分歧的GPU Kernel重组优化总体流程图
具体实施例方式图1为访存行为特征表结构,具体的特征表建立方式如下:为GPU程序的每个Kernel函数建立一张访存行为特征表,访存行为特征表包含四个字段,分别为:线程编号Tid、线程访问的存储器类型MemT、线程访问的数据大小Size和访问的存储空间逻辑地址Addr。线程编号Tid表示线程在该Kernel函数域中的唯一编号;线程访问的存储器类型MemT表示线程访问的存储器类型,存储器类型包括全局存储器Global、共享存储器Shared Memory、纹理存储器Texture Memory和常量存储器ConstantMemory ;线程访问的数据大小Size表示该线程访问的数据占据存储空间字节的数目;线程访问的存储空间逻辑地址Addr表明线程操作计算需要的数据存放的地址空间。图2为本发明的总体流程图,其具体实施步骤如下:第一步、构建访存行为特征表。第二步、记录各Kernel函数中各线程的访存轨迹。第三步、访存分歧判断。第四步、基于访存分歧的GPU Kernel重组优化。4.1基于访存分歧的GPU Kernel分裂。4.2基于连续访存的GPU Kernel融合。第五步、结束。
权利要求
1.一种基于访存分歧的GPU核心程序重组优化方法,其特征在于包括以下步骤: 第一步、采用Create方法构建访存行为特征表,具体步骤是:为GPU程序的每个Kernel函数建立一张访存行为特征表,访存行为特征表包含四个字段,分别为:线程编号Tid、线程访问的存储器类型MemT、线程访问的数据大小Size和访问的存储空间逻辑地址Addr ;线程编号Tid表示线程在该Kernel函数域中的唯一编号;线程访问的存储器类型MemT表示线程访问的存储器类型;线程访问的数据大小Size表示该线程访问的数据占据存储空间字节的数目;线程访问的存储空间逻辑地址Addr表明线程操作计算需要的数据存放的地址空间; 第二步、采用Record方法记录各Kernel函数中各线程的访存轨迹,具体步骤是: .2.1扫描GPU核心程序,定义GPU核心程序中Kernel函数的函数编号Kid依次为.0,1,…i,…M-1,其中,0 ≤i〈M,M为GPU核心程序中Kernel函数的数目;并定义编号为i的Kernel函数启动的线程数目为Ti,则访存行为特征表的总数为M ;编号为i的Kernel函数对应的访存行为特征表的表项数目为Ti JfGPU程序中的Kernel线程的访问访存轨迹信息写入访存行为特征表对应的表项和字段; .2.2初始化J=0 ; .2.3获取函数编号为j的Kernel函数启动的线程数目Ir并初始化k=0 ; .2.4将函数编号为j的Kernel函数的第k线程的访存轨迹信息分别写入访存行为特征表的字段 Tid、MemT、Size 和 Addr,更新 k=k+l ; .2.5如果k ≤ T1-1,转2.4 ;否则转2.6 ;.2.6 更新 j=j+l ; .2.7如果j≤M-1,转2.3,否则转2.8 ; .2.8各Kernel函数中各线程的访存轨迹信息记录完毕,执行第三步; 第三步、根据每个Kernel函数中的GPU线程的访存地址,判断同一 Kernel函数中的GPU线程中的线程访存是否出现访存分歧,方法如下: .3.1初始化j=0 ; .3.2获取函数编号为j的Kernel函数启动的线程数目Tj,定义该Kernel函数访问的存储器类型集合Sj为空,即Sj=Φ,并定以分歧地址集合Aj为空,即Aj=0,初始化m=0 ; .3.3查询访存行为特征表获取线程Tm访问的存储器类型TMomTm,TMomTm表示第m个线程Tm的访问存储器类型,如果TMomTm与线程Tm+1访问的存储器类型TMomTm+1不同,则判定线程Tm与线程m+1出现访存分歧,将出现分歧的存储器类型添加到集合Sj中,即TMomTm sj和TMomTm+1 Sj,执行3.4 ;否则直接执行3.4 ; .3.4查询访存行为特征表获取线程Tm访问的存储空间逻辑地址TAddrm,TAddrm表示第m个线程Tm的访问存储空间逻辑地址,如果TAddrm与第m+1个线程访问的存储空间逻辑地址的差值不等于线程!^方问的数据的大小,则判定线程^与线程Tm+1出现访存分歧,将出现分歧的访问存储器类型7;ff和线程地址构成的二元组集合
全文摘要
本发明公开了一种基于访存分歧的GPU核心程序重组优化方法,目的是提升大规模GPUKernel的执行效率和应用程序性能。技术方案是先采用Create方法构建访存行为特征表,再采用Record方法记录各Kernel函数中各线程的访存轨迹,接着根据每个Kernel函数中的GPU线程的访存地址判断同一Kernel函数中的GPU线程中的线程访存是否出现访存分歧,然后基于访存分歧的GPU Kernel重组优化,包括基于访存分歧的GPUKernel分裂和基于连续访存的GPU Kernel融合两步。采用本发明可解决大规模多GPU Kernel应用执行效率低的问题,提升大规模GPU Kernel的执行效率和应用程序性能。
文档编号G06F9/50GK103150157SQ201310000459
公开日2013年6月12日 申请日期2013年1月3日 优先权日2013年1月3日
发明者甘新标, 刘杰, 迟利华, 晏益慧, 徐涵, 胡庆丰, 王志英, 苏博, 朱琪, 刘聪 申请人:中国人民解放军国防科学技术大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1