一种抽象目标码架构的着色语言机器码生成方法及装置
技术领域
本发明属于着色语言编译器技术领域,具体涉及着色语言编译器后端一种抽象目标码架构的机器码生成方法。
背景技术
着色语言编译器通常由3部分组成:编译器前端、机器无关代码优化器、编译器后端,常规的着色语言编译器流程如图1所示。其中编译器后端部分主要包括目标机器代码的生成,着色器硬件资源的分配和管理,机器相关代码的优化等功能。其中目标机器代码生成是着色语言编译器后端设计的一项关键技术,也是编译器后端设计的一个难点,该功能过程复杂,代码量很大。
传统的着色语言编译器后端代码生成模块直接将中间表示代码(IR)生成机器目标代码,代码生成模块与目标机器指令高度耦合,常规代码生成模块如图2所示。然而着色器硬件单元是随着GPU技术的发展不断发展,GPU着色器目标机器指令也在不断变化,这导致了着色语言编译器后端代码生成模块也需要不断更新变化,由于编译器代码生成模块功能庞大复杂,代码开发和维护难度非常大。另外,着色语言编译器后端程序通常需要能够兼容多款型号的着色器硬件版本,不同型号的着色器目标机器指令通常也存在一定的差异,这样也导致编译器后端目标机器码生成模块异常复杂,不利于该模块的设计、开发和维护。
发明内容
本发明提出了一种抽象目标码架构的着色语言机器码生成方法及装置,通过引入抽象目标码架构,来解决着色语言编译器后端开发和维护难度大、代码生成模块庞大复杂等问题。
本发明第一方面,提出一种抽象目标码架构的着色语言机器码生成方法,所述方法包括:
S1、根据GPU着色器的具体类型定义一套通用的着色器抽象目标指令;
S2、通过着色语言编译器后端将着色语言程序的中间表示代码转换成步骤S1中所定义的抽象目标指令;
S3、根据抽象目标指令与实际GPU目标机器指令的映射关系设计指令映射表;
S4、将所述抽象目标指令与所述指令映射表进行模式匹配,将所述抽象目标指令转换成GPU着色器可执行的目标机器指令。
优选的,所述步骤S1中,所述抽象目标指令包括基本的控制、算术运算操作以及着色语言标准定义的函数操作,单条抽象目标指令的操作数数量和类型与实际GPU目标机器指令保持一致。
优选的,所述步骤S2中,所述着色语言程序中间表示代码是指从着色语言编译器前端输出并经过机器无关代码优化后的中间表示形式,所述中间表示代码包括但不限于三地址码表示、基于LLVM的中间表示。
优选的,所述步骤S3中,若同一类型的GPU着色器下包括多个不同型号的GPU着色器,则不同型号的GPU着色器逻辑上对应不同的指令映射表。
优选的,所述指令映射表根据执行性能进行优先级排序;所述指令映射表中的抽象目标指令与实际GPU目标机器指令是多对多的映射关系。
优选的,所述步骤S4的具体过程为:
根据着色器的具体类型匹配出与具体型号的GPU着色器所对应的指令映射表,搜索所对应的指令映射表中的抽象目标指令序列,匹配所述指令映射表的抽象目标指令模式,匹配成功后将所述抽象目标指令序列替换成对应的GPU目标机器指令序列,相应的操作数也对应到目标机器指令的操作数上,最终生成可执行的目标机器指令。
本发明第二方面,提供一种抽象目标码架构的着色语言机器码生成装置,所述装置包括:
抽象目标指令定义模块:用于根据具体类型的着色器指令特征定义一套抽象的着色器目标指令;
抽象目标代码生成模块:用于解析着色语言程序的中间表示代码,将所述中间表示代码转化为抽象目标指令代码,并管理硬件资源的使用;
指令映射表设计模块:用于根据抽象目标指令与实际目标机器指令的映射关系,设计指令映射表结构;
模式匹配替换模块:用于将所述抽象目标指令与所述指令映射表的数据项进行模式匹配,将所述抽象目标指令替换为实际目标机器指令,完成着色语言编译器后端部分目标机器代码的生成。
优选的,所述抽象目标指令定义模块所定义的抽象目标指令包括基本的控制、算术运算操作以及着色语言标准定义的函数操作,单条抽象目标指令的操作数数量和类型与实际GPU目标机器指令保持一致。
优选的,所述抽象目标代码生成模块中,所述着色语言程序中间表示代码是指从着色语言编译器前端输出并经过机器无关代码优化后的中间表示形式,所述中间表示代码包括但不限于三地址码表示、基于LLVM的中间表示。
优选的,所述指令映射表中的抽象目标指令与实际GPU目标机器指令是多对多的映射关系;若同一类型的GPU着色器下包括多个不同型号的GPU着色器,则不同型号的GPU着色器逻辑上对应不同的指令映射表。
本发明的有益效果是:
本发明将优化后的着色语言程序中间表示表示代码(IR)转换成一种抽象目标代码,再通过模式匹配抽象目标代码与具体着色器机器码的映射关系表,最终转化成GPU可执行的目标机器码。该方法引入的抽象目标代码能够将编译器后端目标代码的生成部分与具体GPU着色器机器代码进行解耦,能够大幅提升着色语言编译器后端程序的模块化水平,降低编译器后端开发的难度。
附图说明
为了更清楚地说明本发明的技术方案,下面将对本发明技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为传统的着色语言编译器流程示意图;
图2为传统的着色语言编译器后端代码生成模块示意图;
图3为本发明提供的抽象目标码架构的着色语言机器码生成方法流程示意图;
图4为本发明提供的抽象目标码架构原理示意图。
具体实施方式
本发明定义了一种针对OpenGL着色语言特征的抽象目标代码,将着色语言程序中间表示代码生成一种抽象目标代码,再通过模式匹配抽象目标代码与具体着色器机器码的映射关系表,转化成最终GPU可执行的目标机器码。
为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,下面所描述的实施例仅是本发明一部分实施例,而非全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
请参阅图3,本发明提供的一种抽象目标码架构的着色语言机器码生成方法流程示意图,所述方法包括:
S1、定义一套抽象目标指令
针对标准OpenGL着色语言的具体功能,结合具体类型的着色器指令特点,定义一种针对OpenGL着色语言特征的抽象目标指令(抽象目标码),该抽象目标码主要是从着色语言具体功能的角度定义的“理想”GPU着色器目标代码,同时又充分考虑具体着色器的指令架构特点,可看作是某类型着色器下不同型号的着色器的一种“通用”着色器伪机器码,同时与GPU着色器的真实目标机器码较接近。部分抽象目标指令类型参考如下:
SL_NOP,SL_MOV,SL_SAT,SL_ABS,SL_JMP,SL_ADD,SL_MUL,SL_SUB,SL_POW,SL_RSQ,SL_LOG,SL_FRAC,SL_SIN,SL_COS,SL_TAN,SL_TEXLDPROJ,SL_TEXBIAS,SL_TEXLOD等等。
进一步的,这些抽象目标指令包括基本的控制和算术运算操作,也包括着色语言标准定义的函数操作,单条指令的操作数数量和类型与GPU实际目标机器指令码需要保持一致。
S2、将着色语言程序的中间表示代码转换成抽象目标指令
进一步的,所述着色语言程序中间表示代码是指从着色语言编译器前端输出并经过机器无关代码优化后的中间表示形式,所述中间表示代码包括但不限于三地址码表示、基于LLVM的中间表示等形式。着色语言编译器后端先解析中间表示代码,将中间表示代码转化为抽象目标指令代码,并管理硬件资源的使用,如寄存器资源和统一常量单元的管理使用,转化出来的抽象目标指令已包含寄存器和统一常量的编号信息,也即抽象目标指令已经实现与硬件资源的具体对接。
S3、设计指令映射表
根据抽象目标指令与实际GPU目标机器指令的映射关系设计指令映射表,指令映射表列举了所有可能的抽象目标指令与真实GPU目标机器指令的映射关系,指令映射表需要保证所有的抽象目标指令都能替换为GPU目标机器指令,根据执行性能进行优先级排序,确保高效率的目标指令序列能够被优先被匹配成功。由于抽象目标指令与目标机器指令非常接近,指令映射表映射关系简单,指令映射表的结构相对比较简单。表1为某型号GPU指令映射关系示例及其说明。
表1某型号GPU指令映射关系示例
注:指令中数字表示操作数代号,代号跟随的“.w”表示向量的w分量,t1表示临时寄存器代号。
指令映射表中的抽象目标码与GPU实际目标机器指令是多对多的关系,可能存在多条抽象目标指令只对应单条GPU实际目标机器码的情况,也可能存在单条抽象目标指令对应多条GPU实际目标机器码的情况,如某些GPU型号无法支持部分OpenGL标准超越函数,这种情况下单个抽象指令需要有多条GPU机器指令组合实现。
具体实现时,可采用结构体数据来保存指令映射表,即某一型号的GPU着色器对应一个指令映射表结构体。一般同一类型的GPU着色器下包括多个不同型号的GPU着色器,则不同型号的GPU着色器逻辑上对应不同的指令映射表,用于适应GPU着色器目标指令的具体差异。同一类型下不同型号的GPU着色器对应的不同的指令映射表也可以组成一个总的指令映射表结构体,该指令映射表结构体可根据GPU的不同特征选择差异化的映射分支,从而将GPU目标指令或GPU着色器型号的变化局限在指令映射表数据结构体中,实现对不同型号GPU目标指令的解耦,有利于具备复杂功能和设计难度的目标代码生成模块的开发和维护。
S4、将所述抽象目标指令与所述指令映射表进行模式匹配,将所述抽象目标指令转换成GPU着色器可执行的目标机器指令
根据着色器的具体类型匹配出与具体型号的GPU着色器所对应的指令映射表,搜索所对应的指令映射表中的抽象目标指令序列,匹配所述指令映射表的抽象目标指令模式,匹配成功后将所述抽象目标指令序列替换成对应的GPU目标机器指令序列,相应的操作数也对应到目标机器指令的操作数上,最终生成可执行的目标机器指令(着色语言机器码)。
图4为本发明提供的抽象目标码架构的原理示意图,本发明所述方法通过引入抽象目标码架构,实际上是将传统着色语言编译器后端的目标机器代码生成部分分解成两个独立模块:抽象目标代码生成模块和模式匹配替换模块。
抽象目标代码生成模块承担了大部分代码生成功能,用于将着色语言程序中间表示指令生成抽象目标代码,由于所定义的抽象目标指令是一种“理想”的目标机器指令,可在目标机器指令特征相近的不同GPU着色器之间通用,因此抽象层抽象目标代码通常很稳定,着色语言标准也相对稳定,不需要随GPU机器指令的变化而改变,因而具有复杂功能的抽象目标代码生成模块功能将比较稳定,可以实现对不同型号GPU目标指令的解耦,有利于具备复杂功能和设计难度的目标代码生成模块的开发和维护。
模式匹配替换模块实现将抽象目标指令与指令映射表数据进行块模式匹配,找出抽象目标指令对应的真实GPU目标机器指令,并替换成目标机器指令。该模式匹配替换模块功能也稳定,与具体型号的GPU目标指令没有耦合关系。指令映射表数据反映抽象目标指令与真实GPU机器指令的映射关系,与多种型号的GPU机器指令高度耦合。通过这种设计架构,实现将GPU机器指令的变化局限在一个指令映射表数据体中,对于着色器机器指令的变化,指令映射表可以根据硬件特征标识进行区分,满足当前硬件特征的映射模式才会参与匹配,这样通过维护指令映射表数据实现对GPU目标机器指令的优化。由于维护和更新一段指令映射表数据比一段复杂代码容易得多,从而大幅降低了编译器后端开发和维护的复杂度。
本发明还提供一种抽象目标码架构的着色语言机器码生成装置,所述装置包括:
抽象目标指令定义模块:用于根据标准OpenGL着色语言的具体功能以及具体类型的着色器指令特点定义一套抽象的着色器目标指令;进一步的,所述抽象目标指令定义模块所定义的抽象目标指令包括基本的控制、算术运算操作以及着色语言标准定义的函数操作,单条抽象目标指令的操作数数量和类型与实际GPU目标机器指令保持一致。
抽象目标代码生成模块:用于解析着色语言程序的中间表示代码,将所述中间表示代码转化为抽象目标指令代码,并管理硬件资源的使用;进一步的,所述抽象目标代码生成模块中,所述着色语言程序中间表示代码是指从着色语言编译器前端输出并经过机器无关代码优化后的中间表示形式,所述中间表示代码包括但不限于三地址码表示、基于LLVM的中间表示。
指令映射表设计模块:用于根据抽象目标指令与实际目标机器指令的映射关系,设计指令映射表;进一步的,所述指令映射表中的抽象目标指令与实际GPU目标机器指令是多对多的映射关系;若同一类型的GPU着色器下包括多个不同型号的GPU着色器,则不同型号的GPU着色器逻辑上对应不同的指令映射表。本装置采用指令映射表结构体数据定义了抽象目标指令与具体GPU机器指令的对照映射关系,将GPU硬件指令的差异隔离在该结构体数据中,实现其他模块对GPU硬件指令的去藕,有利于软件的开发和维护。
模式匹配替换模块:用于将所述抽象目标指令与所述指令映射表进行模式匹配,将所述抽象目标指令替换为实际目标机器指令,完成着色语言编译器后端部分目标机器代码的生成。
本发明提出了一种抽象目标码架构的着色语言机器码生成方法及装置,所述方法属于着色语言编译器后端目标机器码生成的一种方法,该方法将优化后的着色语言程序中间表示代码生成一种抽象目标代码,再通过模式匹配抽象目标代码与具体着色器机器码的映射关系表,转化成最终GPU可执行的目标机器码。该方法引入的抽象目标代码能够将编译器后端目标代码的生成部分与具体GPU着色器机器代码进行解耦,能够大幅提升着色语言编译器后端程序的模块化水平,降低编译器后端开发的难度。
以上装置实施例与方法实施例是一一对应的,装置实施例简略之处,参见方法实施例即可。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述,在此不再赘述。
专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的模块、单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能性一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应超过本发明的范围。结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机储存器、内存、只读存储器、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其他形式的存储介质中。
以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制,尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。