买专利,只认龙图腾
首页 专利交易 科技果 科技人才 科技服务 商标交易 会员权益 IP管家助手 需求市场 关于龙图腾
 /  免费注册
到顶部 到底部
清空 搜索

【发明授权】基于代码融合编译框架的OpenCL编译器设计方法和系统_中国科学院计算技术研究所_201910106880.3 

申请/专利权人:中国科学院计算技术研究所

申请日:2019-02-02

公开(公告)日:2021-01-08

公开(公告)号:CN109933327B

主分类号:G06F8/41(20180101)

分类号:G06F8/41(20180101)

优先权:

专利状态码:有效-授权

法律状态:2021.01.08#授权;2019.07.19#实质审查的生效;2019.06.25#公开

摘要:本发明涉及一种基于代码融合编译框架的OpenCL编译器设计方法和系统,包括:基于共享内存提供主机‑内核代码融合编译框架,在编译器的中间表示——AST层上实现不同端代码的融合;WII‑CFG图用来刻画Kernel代码被实例化成众多线程后,线程之间的指令执行行为,亦即分析工作组内平台特征敏感的程序执行行为;主机‑内核代码联合的数据流分析,用来发掘跨越主机端或内核端的数据流关系以及线程之间的数据流关系,以分析两端代码之间的数据相关性;基于前述分析实施针对性的代码优化,并生成汇编代码进而结束编译过程。本发明能面向不同加速设备,针对主机端代码、Kernel代码同时开展分析,充分发掘线程间优化机会,使得OpenCL程序获得良好的性能可移植性。

主权项:1.一种基于代码融合编译框架的OpenCL编译器设计方法,其特征在于,包括:步骤1、获取OpenCL源程序,将该源程序中主机端代码编译为主机抽象语法树,获取该抽象语法树中内核启动函数的内核代码文件,编译该内核代码文件得到内核抽象语法树,并将其存入共享内存,从该共享内存中取回并重构所有该内核抽象语法树,得到融合该主机抽象语法树和该内核抽象语法树的融合抽象语法树;步骤2、基于该融合抽象语法树得到该主机抽象语法树和该内核抽象语法树各自的控制流图,并增加函数调用边和函数返回边连接两者的控制流图,得到内联控制流图,根据目标平台特征的WII函数,得到内核的工作项中指令在相应目标平台上的执行顺序,在内联控制流图刻画该执行顺序,得到WII-CFG图;步骤3、通过分析内核代码的函数传参,以及主机端与设备端之间数据传输OpenCLAPI函数调用的参数,得到主机端变量和内核变量之间的对应关系作为第一分析结果,并对该WII-CFG图进行数据流分析,得到第二分析结果;步骤4、根据该第一分析结果和该第二分析结果,对该融合抽象语法树中内核代码进行优化,得到优化抽象语法树;步骤5、将该优化抽象语法树经编译器翻译后输出优化后的主机代码和内核代码作为编译结果。

全文数据:基于代码融合编译框架的OpenCL编译器设计方法和系统技术领域本发明涉及编译器的研发和优化技术领域,特别是涉及一种面向OpenCL语言和异构平台的编译框架设计和编译器实现方法和系统。背景技术近年来异构架构已成为主流架构,无论是从全球TOP500超级计算机榜单上排名前三的皆是异构平台、异构平台数量超过100上,或是从处理器核+加速设备的架构广泛出现在服务器、个人电脑、终端设备上,都体现出这一点。异构计算系统通常由CPU与一个或多个加速设备在片上或主板上相互连接组成,其中CPU负责复杂的控制、调度等工作,而加速设备则负责大规模并行计算或专业领域的计算任务。于异构并行编程模型而言,NVIDIA公司推出的CUDA和KhronosGroup发布的OpenCL是当今主流的两种异构并行编程模型,其中后者是可适用于多种加速设备的跨平台的并行编程模型,具有比前者更为广泛的应用范围。异构并行计算框架下,目标代码异构是编译工具设计的一项重要挑战。异构程序代码分为主机Host端和设备Device端两部分,相应地运行在CPU端和加速设备端,从功能上前者负责数据初始化、数据交换和加速设备控制、后者负责并行执行核心计算,亦即这两部分代码的编译目标平台是不一致的、其优化目标也不尽相同。目前的异构并行程序采用分离编译的模式,独立地编译并优化运行在不同设备上的代码。分离编译模式下,不同设备的编译工具相互独立,可以针对不同设备生成充分优化的代码。例如NVIDIACUDA编译系统nvccNVIDIACompilerCollection,AMDOpenCL编译运行框架等大多数成功商业化的编译系统,都是基于这种分离编译的方法设计的。然而分离编译模式忽略了异构代码之间的关联。例如在OpenCL程序中,主机代码和内核代码完全独立,无需共享编译时信息。但实际上,主机代码通过调用OpenCLAPI来控制内核代码的运行,从而与加速设备作交互。而编译内核代码时由于是完全独立编译,编译器将无法获知主机代码的相关信息,比如传入参数的信息、数组的布局信息、工作组workgroup信息等,限制了内核代码的优化机会,不利于提高生成代码的质量。对于异构并行计算框架的代码编译和优化,“分离”与“融合”是编译器一直要考虑的问题。一方面最终代码运行在异构平台上,需要将不同端的代码分开编译并加入额外的复杂机制包括链接机制、运行机制等;另一方面,不同端的代码之间存在相关性,需要获知这些信息才能对代码进行深度优化。从代码的深度优化角度出发,融合编译是很必要的。为了异构代码深度优化和改善OpenCL性能可移植性的目标,本方法提供一种主机-内核代码融合编译的OpenCL编译器设计方法,采用源源转换方式提供优化后的程序代码,旨在融合编译主机代码和内核代码以实现全程序级的分析和优化,发掘线程内和线程间的优化机会,同时针对OpenCL程序性能可移植性较差的特点为程序提供跨平台的良好性能可移植性。与前人工作不同在于,提出主机-内核代码融合编译框架及其构建方法,并基于此提出两个编译基础设施——建模工作项执行顺序的、平台特征相关的WII-CFG图和主机-内核代码联合的数据流分析,用于指导内核代码的针对性优化。本方法涉及的编译器设计,包含四个主要部分:1基于共享内存提供主机-内核代码融合编译框架,在编译器的中间表示——AST层上实现不同端代码的融合;2WII-CFG图Work-ItemInterleavingCFG用来刻画Kernel代码被实例化成众多线程后,线程之间的指令执行行为,亦即分析工作组内平台特征敏感的程序执行行为;3主机-内核代码联合的数据流分析,用来发掘跨越主机端或内核端的数据流关系以及线程之间的数据流关系,以分析主机端代码和Kernel代码之间的数据相关性;4基于前述分析实施针对性的代码优化,并生成汇编代码进而结束编译过程。发明内容于OpenCL程序而言,性能可移植性差是广受关注的重要问题,为此我们提出了基于主机-内核代码融合编译框架的编译器设计方法,包含WII-CFG图和主机-内核代码联合的数据流分析两项编译基础设施,旨在为OpenCL程序提供深度优化的基础和良好的性能可移植性。为了分析线程或称Work-Item之间的优化机会,本方法针对一个工作组Work-Group内的线程展开分析和优化。具体地说,本发明公开了一种基于代码融合编译框架的OpenCL编译器设计方法,其中包括:步骤1、获取OpenCL源程序,将该源程序中主机端代码编译为主机抽象语法树,获取该抽象语法树中内核启动函数的内核代码文件,编译该内核代码文件得到内核抽象语法树,并将其存入共享内存,从该共享内存中取回并重构所有该内核抽象语法树,得到融合该主机抽象语法树和该内核抽象语法树的融合抽象语法树;步骤2、基于该融合抽象语法树得到该主机抽象语法树和该内核抽象语法树各自的控制流图,并增加函数调用边和函数返回边指令连接两者的控制流图,得到内联控制流图,根据目标平台特征的WII函数,得到内核的工作项中指令在相应目标平台上的执行顺序,在内联控制流图刻画该执行顺序,得到WII-CFG图;步骤3、通过分析内核代码的函数传参,以及主机端与设备端之间数据传输OpenCLAPI函数调用的参数,得到主机端变量和内核变量之间的对应关系作为第一分析结果,并对该WII-CFG图进行数据流分析,得到第二分析结果;步骤4、根据该第一分析结果和该第二分析结果,对该融合抽象语法树中内核代码进行优化,得到优化抽象语法树;步骤5、将该优化抽象语法树经编译器翻译后输出优化后的主机代码和内核代码作为编译结果。所述的基于代码融合编译框架的OpenCL编译器设计方法,其中步骤2包括:根据内核代码的该目标平台上线程执行方式,得到该目标平台的WII函数,用于计算内核中工作项的指令在该目标平台上的执行顺序。所述的基于代码融合编译框架的OpenCL编译器设计方法,其中该步骤3具体包括:分析内核函数的传入实参变量和形参变量之间的对应关系,以及主机端与设备端之间数据传输OpenCLAPI函数调用的参数,得到主机端变量和内核变量之间的对应关系作为第一分析结果,对该WII-CFG图进行数据流分析,得到第二分析结果,包括主机端代码和内核代码的不同变量之间的定义-使用链和活跃期。所述的基于代码融合编译框架的OpenCL编译器设计方法,其中步骤4中包括该优化具体包括:线程合并步骤,根据该第二分析结果中的定义-使用链,识别线程间的冗余操作,将执行该冗余操作的多个线程合并成一个粗粒度线程,以减少线程间的代码冗余;数据布局步骤,根据该第一分析结果、该第二分析结果中的定义-使用链和目标平台的线程组织执行方式,从线程内连续或者线程间连续中择优一种布局,并实施代码变换;向量化步骤,根据该第二分析结果中的活跃期和定义-使用链,向量化线程间和线程内代码。所述的基于代码融合编译框架的OpenCL编译器设计方法,其中还包括:步骤6、将该编译结果按照OpenCL编译过程调用本地编译器编译后运行。本发明还公开了一种基于代码融合编译框架的OpenCL编译器设计系统,其中包括:模块1、获取OpenCL源程序,将该源程序中主机端代码编译为主机抽象语法树,获取该抽象语法树中内核启动函数的内核代码文件,编译该内核代码文件得到内核抽象语法树,并将其存入共享内存,从该共享内存中取回并重构所有该内核抽象语法树,得到融合该主机抽象语法树和该内核抽象语法树的融合抽象语法树;模块2、基于该融合抽象语法树得到该主机抽象语法树和该内核抽象语法树各自的控制流图,并增加函数调用边和函数返回边指令连接两者的控制流图,得到内联控制流图,根据目标平台特征的WII函数,得到内核的工作项中指令在相应目标平台上的执行顺序,在内联控制流图刻画该执行顺序,得到WII-CFG图;模块3、通过分析内核代码的函数传参,以及主机端与设备端之间数据传输OpenCLAPI函数调用的参数,得到主机端变量和内核变量之间的对应关系作为第一分析结果,并对该WII-CFG图进行数据流分析,得到第二分析结果;模块4、根据该第一分析结果和该第二分析结果,对该融合抽象语法树中内核代码进行优化,得到优化抽象语法树;模块5、将该优化抽象语法树经编译器翻译后输出优化后的主机代码和内核代码作为编译结果。所述的基于代码融合编译框架的OpenCL编译器设计系统,其中模块2包括:根据内核代码的该目标平台上线程执行方式,得到该目标平台的WII函数,用于计算内核中工作项的指令在该目标平台上的执行顺序。所述的基于代码融合编译框架的OpenCL编译器设计系统,其中该模块3具体包括:分析内核函数的传入实参变量和形参变量之间的对应关系,以及主机端与设备端之间数据传输OpenCLAPI函数调用的参数,得到主机端变量和内核变量之间的对应关系作为第一分析结果,对该WII-CFG图进行数据流分析,得到第二分析结果,包括主机端代码和内核代码的不同变量之间的定义-使用链和活跃期。所述的基于代码融合编译框架的OpenCL编译器设计系统,其中模块4中包括该优化具体包括:线程合并模块,根据该第二分析结果中的定义-使用链,识别线程间的冗余操作,将执行该冗余操作的多个线程合并成一个粗粒度线程,以减少线程间的代码冗余;数据布局模块,根据该第一分析结果、该定义-使用链和目标平台的线程组织执行方式,从线程内连续或者线程间连续中择优一种布局,并实施代码变换;向量化模块,根据该第二分析结果中的活跃期和定义-使用链,向量化线程间和线程内代码。所述的基于代码融合编译框架的OpenCL编译器设计系统,其中还包括:模块6、将该编译结果按照OpenCL编译过程调用本地编译器编译后运行。本发明的技术效果包括:本发明的OpenCL编译器设计方法,涵盖改进的编译框架、扩展的分析技术和针对性地优化手段,能面向不同加速设备,针对主机端代码、Kernel代码同时开展分析,充分发掘线程间优化机会,使得OpenCL程序获得良好的性能可移植性。附图说明图1为各平台WII函数图表;图2为WII-CFG图;图3为主机端和Kernel代码之间的变量对应关系图表;图4为编译过程流程图。具体实施方式为了解决上述技术问题,本发明实施方式包括:A.主机-内核代码融合:首先,主机端代码经编译器生成中间表示—抽象语法树ASTHostAST。然后,遍历该AST,当遇到内核启动函数比如clCreateProgramWithSource函数时,获知内核代码文件名,并启动子进程调用编译器编译内核代码文件得到KernelAST,存入共享内存并结束子进程。再次,从共享内存缓冲区中取回并重构所有内核代码的AST,使得HostAST和KernelAST实现了融合。B.基于WII-CFG图的控制流分析:目的在于面向特定的Kernel代码的目标平台构建融合后代码的WII-CFG图,为后续的数据流分析和代码优化提供基础。首先,基于上述融合后的AST构建内联的控制流图CFG,controlflowgraph,其表示了HostAST主机抽象语法树和KernelAST内核抽象语法树各自的CFG构建方法同传统的CFG构建,并增加calledge函数调用边和returnedge函数返回边连接了两者的CFG。然后,根据Kernel代码的目标平台上线程执行方式,即工作组WorkGroup内的线程以序列化方式逐一执行,还是若干线程以并行方式执行,得出该平台的WIIWork-ItemInterleaving函数,用于计算出kernel的某个工作项Work-Item中某指令在相应目标平台上的执行顺序。再次,基于WII函数细化CFG,在其上刻画Kernel指令的执行顺序,由此得到WII-CFG图。C.联合的数据流分析:首先,分析出主机端代码和Kernel代码之间的数据相关性或称数据的对应关系。通过分析Kernel函数的传入实参变量和形参变量之间的对应关系,以及分析这些传入的实参变量相关的数据传输即相关的OpenCLAPI函数调用,例如clEnqueueWriteBuffer、clEnqueueReadBuffer等的参数,可以获得主机端变量和Kernel变量之间的对应关系作为第一分析结果本发明中视为别名关系。其次,在WII-CFG图上采用传统的数据流分析方法,开展主机端-设备端代码联合的数据流分析,包括主机端代码和Kernel代码的不同变量之间以及不同线程间的变量之间的别名关系、定义-使用链、活跃期分析等。D.代码优化:利用前述分析的结果进行代码优化,提高Kernel代码性能。首先,线程合并优化旨在将若干线程合并成一个粗粒度线程,减少线程间的代码冗余。经前述数据流分析得到的不同线程间变量的定义-使用链,可识别出线程间的冗余操作,也正是线程合并的优化对象。其次,数据布局优化旨在根据目标平台的线程组织执行方式,从两种数据布局——线程内连续或者线程间连续中择优一种布局,并实施代码变换。经前述数据流分析得到的主机端代码和Kernel代码的变量之间的别名关系和定义-使用链,可用于指导合法的数据布局的代码变换。再次,激进地向量化优化旨在对线程间、线程内代码进行向量化优化。其代码变换涉及相关变量的定义、使用的语句改变,同样依赖于数据流分析得出的精确的定义-使用链和活跃期分析结果。E.代码生成及后编译过程:对优化后的融合AST从中分离出主机代码和内核代码,经我们的编译器翻译后输出优化后的主机代码和内核代码即优化后的OpenCL程序源码。后续这些代码可按常规OpenCL编译过程调用本地编译器编译、生成binary然后运行。为让本发明的上述特征和效果能阐述的更明确易懂,下文特举实施例,并配合说明书附图作详细说明如下。本发明整个流程图如图4所示包括:步骤1,生成融合的AST。即输入OpenCL源程序,进行融合编译后得到主机-内核代码融合的AST。首先,主机端代码经编译器生成中间表示——抽象语法树ASTHostAST。然后,遍历该AST,当遇到内核启动函数比如clCreateProgramWithSource函数时,获知内核代码文件名,并开辟共享内存空间供本进程与其子进程做通信;然后,启动子进程调用编译器编译内核代码文件得到KernelAST,存入共享内存并结束子进程。再次,从共享内存空间中取回所有内核代码的AST,至此本进程可同时访问HostAST和KernelAST,实现了两个AST的融合。其中共享内存是进程间通信的方式之一,共享内存允许两个或多个进程共享一个给定的存储区,这一段存储区可以被两个或两个以上的进程映射至自身的地址空间中,一个进程写入共享内存的信息,可以被其他使用这个共享内存的进程,通过一个简单的内存读取操作读出,从而实现了进程间的通信。步骤2,基于WII-CFG图的控制流分析。目的在于面向特定的Kernel代码的目标平台构建融合后代码的WII-CFG图,为后续的数据流分析和代码优化提供基础。包括:2.1基于前述的融合AST构建内联的CFG图。基于上述融合后的AST构建内联的控制流图inlined-CFG图,其表示了HostAST和KernelAST各自的CFG构建方法同传统的CFG构建,同时,Kernel代码是由主机端代码启动或称调用,存在着被调用与调用的关系,于是增加calledge函数调用边和returnedge函数返回边将Host-CFG和Kernel-CFG连接起来。2.2根据目标平台特征得出WIIWork-ItemInterleaving函数,用于计算出kernel的某个Work-Item中某指令在相应目标平台上的执行顺序。同一个Work-Group内的Work-Item执行顺序是平台依赖的,最常见的有两种——序列化执行和数据并行化执行,前者是各Work-Item依次执行Work-Item0执行完毕,才开始执行Work-Item1。。。,以AMD公司的CPU、Tilera公司的TileGX系列众核芯片、国产申威众核芯片SW26010为代表;后者是相邻的若干Work-Item内指令被并行地执行Work-Item0。。。Work-Itemi各自的insn0并行执行后,才执行Work-Item0。。。Work-Itemi各自的insn1,然后执行各自的insn2。。。,比如SIMT模式的NVIDIA-GPU芯片、相邻线程指令在运行时被自动转成向量指令执行的IntelCPU、XeonPhi芯片。具体如图1所示,其中tid表示线程号,由OpenCLSpecification,线程tid最多有三个维度tid0、tid1、tid2,tid即为tid0、tid1、tid2计算得到的全局线程id。2.3基于WII函数细化CFG,即在KernelCFG上进行简单的实例化扩展,将Kernel静态指令实例化成与线程tid相关的线程内的指令,并依据WII函数对线程指令标示其执行顺序,得到WII-CFG图。如图2所示,图2为WII-CFG图,其中a为内联的CFG图;b为序列化的Kernel目标平台上WII-CFG图;c为数据并行化的Kernel目标平台上WII-CFG图并行度为2,将内联的CFG图根据WII函数得出的指令执行顺序作细化,得到面向序列化执行平台的和面向数据并行化执行平台的WII-CFG图如以图2所示。步骤3,联合的数据流分析。首先,分析得出主机端和Kernel的变量之间对应关系,然后在WII-CFG图上进行传统的数据流分析,具体包括:3.1获得主机端变量包括数组变量或数组指针和Kernel中变量的对应关系这里也称为别名关系。通过分析Kernel函数的传入实参和形参的对应关系,以及数据传输相关的OpenCLAPI函数调用的参数,包括clEnqueueWriteBuffer、clEnqueueReadBuffer、clEnqueueMapBuffer、clSetKernelArg函数等数据传输相关函数,主要面向Kernel代码中传入的实参变量由此获知其对应的主机端变量。举例说明。分析源码如图3a所示,则:1分析Kernel函数的传入实参和形参,可得如下对应关系:d_fker0th=f;d_pker1th=p;d_nker2th=n;nNker3th=N;nAker4th=A;2分析数据传输相关API函数的参数,可得如下对应关系:d_nh_n;d_ph_p;h_fd_f;从而得出主机端和Kernel代码的变量对应关系。如图3b所示。其中对应关系例如d_fker0th=f意为传入实参d_f相当于形参ker0th=f,即符号意为“相当于”。3.2在WII-CFG图上采用传统的数据流分析方法,开展主机端-设备端联合的数据流分析,包括主机端、设备端的代码中变量之间以及不同线程间的变量之间的别名关系、定义-使用链、活跃期分析等,便于后续开展数据布局等优化。仍以图3为例,基于3.1的分析结果已获知nKernel代码中的与h_n、d_n的对应关系,再经数据流分析可知其定义点实际为主机端代码中对h_n的赋值。这样的数据流分析结果利于后续的优化分析和代码变换。步骤4,代码优化。利用前述分析的结果进行代码优化,提高Kernel代码的执行性能。主要新增三种改善性能可移植性的针对性优化:4.1线程合并优化。经前述数据流分析得到的不同线程间的变量定义-使用链,可识别出线程间的冗余操作。针对这些线程间存在的代码局部冗余,可通过有选择地合并在某一维度相邻cf个线程假定选择在j维度合并,Work-Group包含localsize0*local1*local2个Work-Item,则有:cf=1个线程,在不影响并行度相关性能下,去除冗余的计算或访存或同步操作,改善代码性能。在主机端代码和Kernel代码做相应修改。4.2数据布局优化。根据前述2.2,将加速设备的特征大体分为序列化执行和数据并行化执行两种,由此也根据设备特征从两种数据布局——线程内连续适合序列化执行或者线程间连续适合数据并行化执行中择优出一种布局,并相应修改主机端代码和Kernel代码中相关数组或变量的定义和使用利用数据流分析得到的信息,包括主机端代码、Kernel代码的变量之间的别名关系和定义-使用链。仍以图3代码为例,当面向数据并行化执行的加速设备,Kernel代码应采用线程间连续的数据布局,而源码中的nKernel代码中的的使用idx=n[tid+j*A]语句已经是线程间连续的,故无须改变原来的数据布局。当面向序列化执行的加速设备,Kernel代码应采用线程内连续的数据布局,而源码中的nKernel代码中的应进行数据布局优化,改变n的使用语句改成:idx=n[tid*N+j],同时为了程序正确性,其实际定义语句也相应修改主机端的h_n[i+j*nA]=neighborIter[i][j]语句改成:h_n[i*nN+j]=neighborIter[i][j]。4.3激进地向量化优化。Kernel代码实际执行中将被实例化成众多线程并发地执行,从向量化优化角度而言,于线程间、线程内都有向量化机会。根据具体硬件的SIMD指令宽度,对Kernel代码先进行线程间代码的自动向量化,再进行线程内的自动向量化。其代码变换涉及相关变量的定义、使用的语句改变,同样依赖于数据流分析得出的精确的定义-使用链和活跃期分析结果。步骤5,代码生成及后编译过程。对优化后的融合AST从中分离出主机代码和内核代码,经我们的编译器翻译后输出优化后的主机代码和内核代码即优化后的OpenCL程序源码。后续这些代码可按常规OpenCL编译过程调用本地编译器编译然后运行。以下为与上述方法实施例对应的系统实施例,本实施方式可与上述实施方式互相配合实施。上述实施方式中提到的相关技术细节在本实施方式中依然有效,为了减少重复,这里不再赘述。相应地,本实施方式中提到的相关技术细节也可应用在上述实施方式中。本发明还公开了一种基于代码融合编译框架的OpenCL编译器设计系统,其中包括:模块1、获取OpenCL源程序,将该源程序中主机端代码编译为主机抽象语法树,获取该抽象语法树中内核启动函数的内核代码文件,编译该内核代码文件得到内核抽象语法树,并将其存入共享内存,从该共享内存中取回并重构所有该内核抽象语法树,得到融合该主机抽象语法树和该内核抽象语法树的融合抽象语法树;模块2、基于该融合抽象语法树得到该主机抽象语法树和该内核抽象语法树各自的控制流图,并增加函数调用边和函数返回边指令连接两者的控制流图,得到内联控制流图,根据目标平台特征的WII函数,得到内核的工作项中指令在相应目标平台上的执行顺序,在内联控制流图刻画该执行顺序,得到WII-CFG图;模块3、通过分析内核代码的函数传参,以及主机端与设备端之间数据传输OpenCLAPI函数调用的参数,得到主机端变量和内核变量之间的对应关系作为第一分析结果,并对该WII-CFG图进行数据流分析,得到第二分析结果;模块4、根据该第一分析结果和该第二分析结果,对该融合抽象语法树中内核代码进行优化,得到优化抽象语法树;模块5、将该优化抽象语法树输入至编译器,翻译后输出优化后的主机代码和内核代码作为编译结果。所述的基于代码融合编译框架的OpenCL编译器设计系统,其中模块2包括:根据内核代码的该目标平台上线程执行方式,得到该目标平台的WII函数,用于计算内核中工作项的指令在该目标平台上的执行顺序。所述的基于代码融合编译框架的OpenCL编译器设计系统,其中该模块3具体包括:分析内核函数的传入实参变量和形参变量之间的对应关系,以及主机端与设备端之间数据传输OpenCLAPI函数调用的参数,得到主机端变量和内核变量之间的对应关系作为第一分析结果,对该WII-CFG图进行数据流分析,得到第二分析结果,包括主机端代码和内核代码的不同变量之间的定义-使用链和活跃期。所述的基于代码融合编译框架的OpenCL编译器设计系统,其中模块4中包括该优化具体包括:线程合并模块,根据该第二分析结果中的定义-使用链,识别线程间的冗余操作,将执行该冗余操作的多个线程合并成一个粗粒度线程,以减少线程间的代码冗余;数据布局模块,根据该第一分析结果、该第二分析结果中的定义-使用链和目标平台的线程组织执行方式,从线程内连续或者线程间连续中择优一种布局,并实施代码变换;向量化模块,根据该第二分析结果中的活跃期和定义-使用链,向量化线程间和线程内代码。所述的基于代码融合编译框架的OpenCL编译器设计系统,其中还包括:模块6、将该编译结果按照OpenCL编译过程调用本地编译器编译后运行。本发明的技术效果包括:1、主机-内核代码融合编译框架。于OpenCL程序而言,数组或变量的定义和使用之间往往是超出内核代码范围的,主机代码还指定了工作项Work-Group的组织参数亦即包含多少个Work-Item。于是,深度分析和优化OpenCL程序,就需要基于主机端代码和内核代码的融合编译框架。技术效果:在编译器的分析阶段,能同时获得主机端代码中间表示和Kernel代码中间表示,并能同时展开分析。2、融合控制流图WII-CFG。不同的加速设备上硬件架构和运行时线程组织执行方式有差异,这导致来自不同线程即Work-Item的指令在执行顺序上因加速设备差异而有不同。针对目标加速设备,我们得出相应WII函数用于计算线程内指令的执行顺序,进而以WII-CFG图表达主机端代码CFG、Kernel代码CFG,同时表达不同线程的指令执行顺序。技术效果:可作为分析不同加速设备上线程间代码执行行为的基础设施。通过扩展传统CFG图,能同时表示主机端代码CFG和Kernel代码CFG,以及Kernel的不同线程实例的指令执行顺序,体现了加速设备的运行时特征,可发掘线程间优化机会。3、主机-内核代码联合的数据流分析。是基于传统的数据流分析技术的扩展,扩展有两方面:1通过对OpenCL的传参和数据传输API的参数做分析,获得主机代码变量与设备端代码变量之间的对应关系。2基于WII-CFG的数据流分析,开展主机端-设备端代码联合的数据流分析,包括不同端的代码中变量之间以及不同线程间的变量之间的别名关系、定义-使用链、活跃期分析等。利于开展线程间的优化。技术效果:可进行超过主机代码范围或Kernel代码范围的数据流分析,可进行面向多线程代码的变量定义-使用分析,便于开展线程间数据和计算相关的优化。虽然本发明以上述实施例公开,但具体实施例仅用以解释本发明,并不用于限定本发明,任何本技术领域技术人员,在不脱离本发明的构思和范围内,可作一些的变更和完善,故本发明的权利保护范围以权利要求书及其均等范围者为准。

权利要求:1.一种基于代码融合编译框架的OpenCL编译器设计方法,其特征在于,包括:步骤1、获取OpenCL源程序,将该源程序中主机端代码编译为主机抽象语法树,获取该抽象语法树中内核启动函数的内核代码文件,编译该内核代码文件得到内核抽象语法树,并将其存入共享内存,从该共享内存中取回并重构所有该内核抽象语法树,得到融合该主机抽象语法树和该内核抽象语法树的融合抽象语法树;步骤2、基于该融合抽象语法树得到该主机抽象语法树和该内核抽象语法树各自的控制流图,并增加函数调用边和函数返回边连接两者的控制流图,得到内联控制流图,根据目标平台特征的WII函数,得到内核的工作项中指令在相应目标平台上的执行顺序,在内联控制流图刻画该执行顺序,得到WII-CFG图;步骤3、通过分析内核代码的函数传参,以及主机端与设备端之间数据传输OpenCLAPI函数调用的参数,得到主机端变量和内核变量之间的对应关系作为第一分析结果,并对该WII-CFG图进行数据流分析,得到第二分析结果;步骤4、根据该第一分析结果和该第二分析结果,对该融合抽象语法树中内核代码进行优化,得到优化抽象语法树;步骤5、将该优化抽象语法树经编译器翻译后输出优化后的主机代码和内核代码作为编译结果。2.如权利要求1所述的基于代码融合编译框架的OpenCL编译器设计方法,其特征在于,步骤2包括:根据内核代码的该目标平台上线程执行方式,得到该目标平台的WII函数,用于计算内核中工作项的指令在该目标平台上的执行顺序。3.如权利要求1或2所述的基于代码融合编译框架的OpenCL编译器设计方法,其特征在于,该步骤3具体包括:分析内核函数的传入实参变量和形参变量之间的对应关系,以及主机端与设备端之间数据传输OpenCLAPI函数调用的参数,得到主机端变量和内核变量之间的对应关系作为第一分析结果,对该WII-CFG图进行数据流分析,得到第二分析结果,包括主机端代码和内核代码的不同变量之间的定义-使用链和活跃期。4.如权利要求3所述的基于代码融合编译框架的OpenCL编译器设计方法,其特征在于,步骤4中包括该优化具体包括:线程合并步骤,根据该第二分析结果中的定义-使用链,识别线程间的冗余操作,将执行该冗余操作的多个线程合并成一个粗粒度线程,以减少线程间的代码冗余;数据布局步骤,根据该第一分析结果、该第二分析结果中的定义-使用链和目标平台的线程组织执行方式,从线程内连续或者线程间连续中择优一种布局,并实施代码变换;向量化步骤,根据该第二分析结果中的活跃期和定义-使用链,向量化线程间和线程内代码。5.如权利要求1所述的基于代码融合编译框架的OpenCL编译器设计方法,其特征在于,还包括:步骤6、将该编译结果按照OpenCL编译过程调用本地编译器编译后运行。6.一种基于代码融合编译框架的OpenCL编译器设计系统,其特征在于,包括:模块1、获取OpenCL源程序,将该源程序中主机端代码编译为主机抽象语法树,获取该抽象语法树中内核启动函数的内核代码文件,编译该内核代码文件得到内核抽象语法树,并将其存入共享内存,从该共享内存中取回并重构所有该内核抽象语法树,得到融合该主机抽象语法树和该内核抽象语法树的融合抽象语法树;模块2、基于该融合抽象语法树得到该主机抽象语法树和该内核抽象语法树各自的控制流图,并增加函数调用边和函数返回边指令连接两者的控制流图,得到内联控制流图,根据目标平台特征的WII函数,得到内核的工作项中指令在相应目标平台上的执行顺序,在内联控制流图刻画该执行顺序,得到WII-CFG图;模块3、通过分析内核代码的函数传参,以及主机端与设备端之间数据传输OpenCLAPI函数调用的参数,得到主机端变量和内核变量之间的对应关系作为第一分析结果,并对该WII-CFG图进行数据流分析,得到第二分析结果;模块4、根据该第一分析结果和该第二分析结果,对该融合抽象语法树中内核代码进行优化,得到优化抽象语法树;模块5、将该优化抽象语法树输入至编译器,翻译后输出优化后的主机代码和内核代码作为编译结果。7.如权利要求6所述的基于代码融合编译框架的OpenCL编译器设计系统,其特征在于,模块2包括:根据内核代码的该目标平台上线程执行方式,得到该目标平台的WII函数,用于计算内核中工作项的指令在该目标平台上的执行顺序。8.如权利要求6或7所述的基于代码融合编译框架的OpenCL编译器设计系统,其特征在于,该模块3具体包括:分析内核函数的传入实参变量和形参变量之间的对应关系,以及主机端与设备端之间数据传输OpenCLAPI函数调用的参数,得到主机端变量和内核变量之间的对应关系作为第一分析结果,对该WII-CFG图进行数据流分析,得到第二分析结果,包括主机端代码和内核代码的不同变量之间的定义-使用链和活跃期。9.如权利要求8所述的基于代码融合编译框架的OpenCL编译器设计系统,其特征在于,模块4中包括该优化具体包括:线程合并模块,根据该第二分析结果中的定义-使用链,识别线程间的冗余操作,将执行该冗余操作的多个线程合并成一个粗粒度线程,以减少线程间的代码冗余;数据布局模块,根据该第一分析结果、该定义-使用链和目标平台的线程组织执行方式,从线程内连续或者线程间连续中择优一种布局,并实施代码变换;向量化模块,根据该第二分析结果中的活跃期和定义-使用链,向量化线程间和线程内代码。10.如权利要求6所述的基于代码融合编译框架的OpenCL编译器设计系统,其特征在于,还包括:模块6、将该编译结果按照OpenCL编译过程调用本地编译器编译后运行。

百度查询: 中国科学院计算技术研究所 基于代码融合编译框架的OpenCL编译器设计方法和系统

免责声明
1、本报告根据公开、合法渠道获得相关数据和信息,力求客观、公正,但并不保证数据的最终完整性和准确性。
2、报告中的分析和结论仅反映本公司于发布本报告当日的职业理解,仅供参考使用,不能作为本公司承担任何法律责任的依据或者凭证。