浅谈编译(三)

gewenbin
gewenbin
gewenbin
188
文章
15
评论
2020年12月26日19:31:20 评论 497

Vulkan

1. Vulkan简介

Vulkan是Khronos组织制定的“下一代”开放的图形显示API,是与DirectX12能够匹敌的GPU API标准。

这里我们仅仅讨论Vulkan着色器相关内容,与OpenGL的着色器需要使用GLSL语言编写不同的是,Vulkan着色器必须以二进制字节码的格式使用,而不是像GLSL这样具有比较好的可读性的语法。此字节格式称为SPIR-V,它可以与Vulkan和OpenCL一同使用。这是一种可以编写图形和计算着色器的格式。

使用二进制字节码格式的优点之一是使得GPU厂商编写将着色器代码转换为本地代码的编译器复杂度减少了很多。经验表明使用可读性比较强的语法,比如GLSL,一些GPU厂商能相当灵活地理解这个标准。这会导致一种情况发生,比如编写好,并在一个厂商的GPU运行的不错的着色器程序,可能在其他的GPU厂商的GPU驱动程序上运行异常,可能是语法的问题,或者更糟的是不同GPU厂商编写的编译器差异,导致着色器运行错误。如果直接使用编译好的二进制字节码格式,可以避免这种情况。

但是,并不意味着我们要手写字节码。Khronos发布了与厂商无关的编译器,它将GLSL编译成SPIR-V。该编译器用于验证着色器代码是否符合标准,并生成与Vulkan功能运行的SPRIR-V二进制文件。除此之外还可以将此编译器作为库在运行时编译生成SPRI-V,安卓平台就是如此使用。

2. Vulkan中编译框架

由于Vulkan规范中规定了Vulkan接口只能使用SPIR-V IR,所以Vulkan驱动省去了从GLSL语言编译成SPIR-V IR这一编译前端的工作,而只需要实现SPIR-V IR的优化和SPIR-V IR转换成具体的GPU硬件指令这两步骤,如下所示:

浅谈编译(三)

下面这张图能更详细的展示这种关系:

浅谈编译(三)

在实际的Vulkan驱动中,可能会将SPIR-V IR进一步转换成其他IR来进行优化,比如在Mesa的AMD GPU的Vulkan驱动中就将SPIR-V转换成LLVM IR进行优化,如下所示:

浅谈编译(三)

  • 首先将SPIR-V IR转换成LLPC IR
  • 接着将LLPC IR转换成LLVM IR
  • 最后将LLVM IR转换成GCN指令
gewenbin
  • 本文由 发表于 2020年12月26日19:31:20
  • 转载请务必保留本文链接:http://www.databusworld.cn/9820.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: