驱动开发系列71 - GLSL编译器实现 - 指令选择
一:概述
在GLSL语言里,变量大致分为两类:第一类是Uniform 变量,对所有线程(一个 wavefront里的所有线程)都是相同的值,编译器会把这些变量放到SGPR(Scalar General Purpose Registers)里面。第二类是Varing 变量,每个线程的值都不同,编译器会放到VGPR(Vector General Purpose Registers)里面。
在GPU架构中,指令类别大致分为两类:第一类是标量类别(SOP),标量是单个值,或单一数据类型;与之相对的是向量类别(VOP),同时处理多个数据元素。
在本文中,介绍下GLSL的IR是如何转换成GPU指令的。 指令选择是编译过程中的一个关键步骤,主要作用是将中间表示(IR)转换为目标硬件的机器指令序列。在这一过程中,编译器会根据目标硬件的特性,进行一系列的优化,以提高程序的执行效率,减少资源浪费,确保编译器生产的代码能够在目标硬件上高效运行。
二:指令选择过程
在编译过程中,IR通常是一个硬件无关的抽象表示,包含了程序的基本逻辑和结构,但还不包含具体的硬件指令,指令选择会根据目标架构的指令集定义对IR进行模式匹配。对于每个IR中的操作符,编译器会尝试匹配到目标机器指令中的相应模式。一旦IR的操作符被转换为特定的目标指令,编译器需要确定如何访问数据,数据可能保存在寄存器中,内存中或通过某些特定的地址模式进行访问。寄存器分配是将虚拟寄存器映射到实际硬件寄存器的过程。在转换为目标指令后,