一种通过死代码移除来加快GPU运行速度的方法技术

技术编号:8593808 阅读:307 留言:0更新日期:2013-04-18 06:57
本发明专利技术公开了一种通过死代码移除来加快GPU运行速度的方法,目的是提出一种通过死代码移除来加速GPU运行速度的方法,提高大规模GPU核心程序的执行和编译效率。技术方案是先为大规模GPU核心程序中的所有函数构建状态检测表;记录函数基本信息,初始化状态检测表;静态分析GPU程序;接着运行GPU核心程序,记录GPU核心程序运行时信息,更新状态检测表各函数检测表字段的状态,然后标识死代码、死代码最终确认,根据最终得到的死代码集合D,删除死代码。本发明专利技术通过移除运行时不执行的死代码,减少了GPU核心程序的代码体积,也减小了最终生成的汇编代码体积,从而提高GPU中SIMD指令调度的命中率,显著提高大规模GPU核心程序的运行效率。

【技术实现步骤摘要】

本专利技术涉及加快大规模GPU核心程序运行速度的方法,尤指通过移除死代码来加快GPU运行速度的方法。
技术介绍
GPU (Graphics Processing Unit,图形处理单元)过去通常用于图形图像应用领域,现在也广泛应用于加速各种通用的并行算法和应用。这些算法和应用在GPU上的核心程序通常都比较简单,一般只有上百行代码。但是对于一些具有实际应用价值的大规模应用程序,如非确定性粒子输运程序MCNP (Monte Carlo N-particle, N粒子蒙特卡罗方法),其GPU实现的核心代码通常上万行,同时在具体程序执行时存在大量死代码。与CPU相比,GPU的指令缓存较少,从而对生成的汇编代码的大小很敏感。并且GPU —般采用_inline_指令对子函数进行内联,编译时需要对整个核心程序进行全局优化。死代码的存在既增大了生成的汇编代码体积,又降低了全局优化的效果,严重影响了 GPU运行速度。目前加快GPU运行速度的方法主要有以下几种(I)将只读数据布局于GPU常量存储空间来提高访存速度。(2)将频繁访问的数据布局于GPU片上共享存储器来提高访存速度。(3 )通过接合式访问GPU全局内存来提高访存速度。(4)调整GPU核心程序线程块大小来提高寄存器资源利用率和程序执行效率。上述四类方法都存在局限性。GPU常量存储器容量有限且只能存放只读数据;GPU片上共享存储器容量有限且存在体冲突(bank conflicts) ;GPU全局内存存在访存延迟高的问题;调整大型GPU核心程序线程块大小通常只能逐一尝试来确定最优的线块大小,效率低。死代码就是程序执行过程中可能执行但实际运行时并没有执行的代码段。死代码的存在将增大汇编代码体积,严重影响程序优化和调度,降低程序运行效率。对于一些具有实际应用价值的大规模应用程序而言,其GPU核心程序汇编代码体积已经相当可观,同时GPU指令缓存空间却相当有限,GPU核心程序中死代码的存在将增加GPU指令缓存的压力,浪费GPU宝贵的指令缓存空间,严重影响GPU核心代码的调度和优化,延长GPU核心代码的运行时间。因此死代码的删除对于提高大规模GPU程序执行效率和加快程序运行速度至关重要。BODIK提出了编译优化过程中识别无用赋值语句的方法;SffEENEY提出了面向对象的不可达子程序的检测方法;χι提出了无用函数参数的检测方法;张广梅从程序的控制结构出发实现了无效程序分支的检测。上述死代码检测技术均以编译为基础,侧重于死代码检测技术基本原理的推导和证明,理论证明详实可信,但是实际应用复杂,可操作性差,不利于推广应用。对于具有实际应用价值的大规模GPU核心程序,移除死代码可以显著增加程序的执行效率,因此,如果能够检测和删除死代码,必定能够加快GPU运行速度,但是目前还没有公开文献研究相关技术方案。
技术实现思路
本专利技术要解决的技术问题在于针对大型GPU核心程序存在执行效率不高的问题,在保证程序正确性的前提下,提出一种通过死代码移除来加速GPU运行速度的方法,提高大规模GPU核心程序的执行和编译效率。为了解决上述技术问题,本专利技术的具体技术方案为第一步、构建函数状态检测表。为大规模GPU核心程序中的所有函数构建状态检测表,状态检测表的表项数为GPU核心程序中函数的个数。状态检测表共包含六个字段,分别为函数编号ID、函数名称Name、调用标记Callee、静态分析标记Static、动态执行标记Dynamic和删除标记Del。函数编号ID为函数的全局唯一标记,函数名称Name表示函数的名字;调用标记Callee表示函数是否被程序调用,调用标记Callee为true表示函数被程序调用过,Callee为false表示函数没有被程序调用过;静态分析标记Static表示对函数模块进行静态分析后判断其是否会执行,Static为true表示函数在程序执行时可能会运行,Static为false表示函数在 程序执行时不会运行;动态执行标记Dynamic表示程序运行时函数是否被执行,Dynamic为true表明函数在程序运行时运行过,Dynamic为false表明函数在程序运行时没有运行过;删除标记Del表示函数代码段能否被删除,Del为true表明函数代码段是死代码应该删除,若Del为false表明函数代码段不是死代码不应删除。第二步、记录函数基本信息。扫描程序代码,从O开始给GPU核心程序中每个函数代码段分配唯一函数编号并将分配的函数编号写入状态检测表的ID字段中,并将函数编号为q的函数名记录于ID字段为q的状态检测表的表项的Name字段中。对于有N个函数的GPU核心程序,则状态检测表有N个表项,N个表项的ID字段为O N-1,O彡q彡N-1。第三步、初始化状态检测表。初始化状态检测表中所有表项的函数的调用标记Callee为true ;初始化所有表项的函数的静态分析标记Static为true ;初始化所有表项的函数的动态执行标记Dynamic为true ;初始化所有表项的函数的删除标记Del为false。第四步、对GPU程序源码进行静态分析,通过静态分析结果更新状态检测表各函数检测表字段的状态,具体方法如下4.1获取状态检测表的表项总数N,初始化q=0 ;4. 2如果状态检测表表项q对应的函数不会被调用,则置该表项对应的字段Callee 为 false,否则置为 true ;4. 3如果状态检测表表项q对应的字段Callee为true,则置该表项对应的字段Static 为 true,否则置字段 Static 为 false ;4. 4更新q=q+l,如果q〈N,转4. 2 ;否则,转第五步。第五步、运行GPU核心程序,记录GPU核心程序运行时信息,更新状态检测表各函数检测表字段的状态,具体方法如下5.1获取状态检测表的表项总数N,初始化q=0 ;5. 2如果状态检测表表项q对应的函数没有被执行,则置该表项对应的字段Dynamic 为 false,否则置字段 Dynamic 为 true5. 3如果表项q对应的字段Static和Dynamic均为false,则置该表项对应字段Del为true,否则置字段Del为false ;5. 4更新q=q+l,如果q〈N,转5. 2 ;否则,转第六步。第六步、死代码标识。定义集合Stl, S1,…Sr·· Ssh均为空集,依据状态检测表中各字段的定义,表项字段Del为true对应的函数即为死代码函数。将状态检测表中表项字段Del为true对应的第一个函数并入集合S。,将状态检测表中表项字段Del为true对应的第二个函数并入集合S1,…,将状态检测表中表项字段Del为true对应的第M个函数并入集合Ssh,其中,O ( i〈M彡N,M为标识为死代码的函数个数。第七步、死代码最终确认。具体方法如下7.1初始化死代码函数集合为空D =0,定义变量j=0 ;7. 2使用GPU核心程序对应的语言注释标识将Sj对应的函数代码段注释,使得该函数代码段不运行;7. 3运行将S」注释后的程序,比较运行结果,若结果正确,更新死代码集合D=D U Sj ;否则,转 7.4 ;7. 4删除当前S」对应的函数代码段的注释;7. 5j=j+l ;7. 6如果j〈M,转7. 2 ;否本文档来自技高网
...

【技术保护点】
一种通过死代码移除来加快GPU运行速度的方法,其特征在于包括以下步骤:第一步、为大规模GPU核心程序中的所有函数构建状态检测表,状态检测表的表项数为GPU核心程序中函数的个数;状态检测表共包含六个字段,分别为:函数编号ID、函数名称Name、调用标记Callee、静态分析标记Static、动态执行标记Dynamic和删除标记Del;函数编号ID为函数的全局唯一标记,函数名称Name表示函数的名字;调用标记Callee表示函数是否被程序调用,调用标记Callee为true表示函数被程序调用过,Callee为false表示函数没有被程序调用过;静态分析标记Static表示对函数模块进行静态分析后判断其是否会执行,Static为true表示函数在程序执行时可能会运行,Static为false表示函数在程序执行时不会运行;动态执行标记Dynamic表示程序运行时函数是否被执行,Dynamic为true表明函数经在程序运行时运行过,Dynamic为false表明函数在程序运行时没有运行过;删除标记Del表示函数代码段能否被删除,Del为true表明函数代码段是死代码应该删除,若Del为false表明函数代码段不是死代码不应删除;第二步、记录函数基本信息:扫描程序代码,从0开始给GPU核心程序中每个函数代码段分配唯一函数编号并将分配的函数编号写入状态检测表的ID字段中,并将函数编号为q的函数名记录于ID字段为q的状态检测表的表项的Name字段中;对于有N个函数的GPU核心程序,则状态检测表有N个表项,N个表项的ID字段为0~N?1,0≤q≤N?1;第三步、初始化状态检测表:初始化状态检测表中所有表项的函数的调用标记Callee为true;;初始化所有表项的函数的静态分析标记Static为true;初始化所有表项的函数的动态执行标记Dynamic为true;初始化所有表项的函数的删除标记Del为true;第四步、对GPU程序源码进行静态分析,通过静态分析结果更新状态检测表各函数检测表字段的状态,具体方法如下:4.1获取状态检测表的表项总数N,初始化q=0;4.2如果状态检测表表项q对应的函数不会被调用,则置该表项对应的字段Callee为false,否则置为true;4.3如果状态检测表表项q对应的字段Callee为true,则置该表项对应的字段Static为true,否则置字段Static为false;4.4更新q=q+1,如果q...

【技术特征摘要】
1.一种通过死代码移除来加快GPU运行速度的方法,其特征在于包括以下步骤 第一步、为大规模GPU核心程序中的所有函数构建状态检测表,状态检测表的表项数为GPU核心程序中函数的个数;状态检测表共包含六个字段,分别为函数编号ID、函数名称Name、调用标记Callee、静态分析标记Static、动态执行标记Dynamic和删除标记Del ; 函数编号ID为函数的全局唯一标记,函数名称Name表示函数的名字;调用标记Callee表示函数是否被程序调用,调用标记Callee为true表示函数被程序调用过,Callee为false 表示函数没有被程序调用过;静态分析标记Static表示对函数模块进行静态分析后判断其是否会执行,Static为true表示函数在程序执行时可能会运行,Static为false表示函数在程序执行时不会运行;动态执行标记Dynamic表示程序运行时函数是否被执行, Dynamic为true表明函数经在程序运行时运行过,Dynamic为false表明函数在程序运行时没有运行过;删除标记Del表示函数代码段能否被删除,Del为true表明函数代码段是死代码应该删除,若Del为false表明函数代码段不是死代码不应删除;第二步、记录函数基本信息扫描程序代码,从O开始给GPU核心程序中每个函数代码段分配唯一函数编号并将分配的函数编号写入状态检测表的ID字段中,并将函数编号为q 的函数名记录于ID字段为q的状态检测表的表项的Name字段中;对于有N个函数的GPU 核心程序,则状态检测表有N个表项,N个表项的ID字段为O N-1,O < q < N-1 ;第三步、初始化状态检测表初始化状态检测表中所有表项的函数的调用标记Callee 为true ;;初始化所有表项的函数的静态分析标记Static为true ;初始化所有表项的函数的动态执行标记Dynamic为true ;初始化所有表项的函数的删除标记Del为true ;第四步、对GPU程序源码进行静态分析,通过静态分析结果更新状态检测表各函数检测表字段的状态,具体方法如下.4.1获取状态检测表的表项总数N,初始化q=0 ;.4.2如果状态检测表表项q对应的函数不会被调用,则置该表项对应的字段Callee为 false,否则置为true ;.4.3如果状态检测表表项q对应的字...

【专利技术属性】
技术研发人员:迟利华刘杰胡庆丰晏益慧龚春叶甘新标徐涵蒋杰杨博
申请(专利权)人:中国人民解放军国防科学技术大学
类型:发明
国别省市:

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

1