发明名称 一种通过死代码移除来加快GPU运行速度的方法
摘要 本发明公开了一种通过死代码移除来加快GPU运行速度的方法,目的是提出一种通过死代码移除来加速GPU运行速度的方法,提高大规模GPU核心程序的执行和编译效率。技术方案是先为大规模GPU核心程序中的所有函数构建状态检测表;记录函数基本信息,初始化状态检测表;静态分析GPU程序;接着运行GPU核心程序,记录GPU核心程序运行时信息,更新状态检测表各函数检测表字段的状态,然后标识死代码、死代码最终确认,根据最终得到的死代码集合D,删除死代码。本发明通过移除运行时不执行的死代码,减少了GPU核心程序的代码体积,也减小了最终生成的汇编代码体积,从而提高GPU中SIMD指令调度的命中率,显著提高大规模GPU核心程序的运行效率。
申请公布号 CN103049304A 申请公布日期 2013.04.17
申请号 CN201310020549.2 申请日期 2013.01.21
申请人 中国人民解放军国防科学技术大学 发明人 迟利华;刘杰;胡庆丰;晏益慧;龚春叶;甘新标;徐涵;蒋杰;杨博
分类号 G06F9/45(2006.01)I 主分类号 G06F9/45(2006.01)I
代理机构 国防科技大学专利服务中心 43202 代理人 郭敏
主权项 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表明函数代码段不是死代码不应删除;第二步、记录函数基本信息:扫描程序代码,从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&lt;N,转4.2;否则,转第五步。第五步、运行GPU核心程序,记录GPU核心程序运行时信息,更新状态检测表各函数检测表字段的状态,具体方法如下:5.1获取状态检测表的表项总数N,初始化q=0;5.2如果状态检测表表项q对应的函数不会被调用,则置该表项对应的字段Callee为false,否则置为true;5.3如果表项q对应的字段Static和字段Dynamic均为false,则置该表项对应字段Del为true,否则置字段Del为false;5.4更新q=q+1,如果q&lt;N,转5.2;否则,转第六步;第六步、死代码标识:定义集合S<sub>0</sub>,S<sub>1</sub>,…S<sub>i</sub>…S<sub>M-1</sub>均为空集,将状态检测表中表项字段Del为true对应的第一个函数并入集合S<sub>0</sub>,将状态检测表中表项字段Del为true对应的第二个函数并入集合S<sub>1</sub>,…,将状态检测表中表项字段Del为true对应的第M个函数并入集合S<sub>M-1</sub>,其中,0≤i&lt;M≤N,M为标识为死代码的函数个数;第七步、死代码最终确认,具体方法如下:7.1初始化死代码函数集合为空<img file="FDA00002755704700021.GIF" wi="162" he="61" />定义变量j=0;7.2使用GPU核心程序对应的语言注释标识将S<sub>j</sub>对应的函数代码段注释,使得该函数代码段不运行;7.3运行经将S<sub>j</sub>注释后的程序,比较运行结果,若结果正确,更新死代码集合D=D∪S<sub>j</sub>;否则,转7.4;7.4删除当前S<sub>j</sub>对应的函数代码段的注释;7.5j=j+1;7.6如果j&lt;M,转7.2;否则,转第八步;第八步、根据最终得到的死代码集合D,进行死代码删除,具体流程如下:8.1获取死代码集合D的元素个数P,0≤P≤M≤N,定义变量k=0;8.2删除死代码集合D中第k个元素对应的函数代码段;8.3更新k=k+1,如果k&lt;P,转8.2;否则,转第九步;第九步、优化结束。
地址 410073 湖南省长沙市开福区德雅路109号