GPU API 内部隐藏着一个编译器问题,而这个问题与可移植性有关。如果每个驱动都必须解析高层源代码,驱动的复杂性就会上升,而且每种语言都需要一条通往每个运行时的路径。这使得新的前端难以获得支持。

Khronos 在 2015 年的举措是将中间层标准化。SPIR-V 1.0 定义了一种紧凑的二进制中间语言,用于图形着色器和计算内核。OpenCL 2.1 保证能够消费它,而 Vulkan 则将其采纳为着色器输入。

巧妙之处在于这种拆分:前端生成 SPIR-V,驱动消费 SPIR-V。Khronos 表示,这降低了内置高层编译器的复杂性,鼓励了语言多样性,提高了可移植性,并允许部分编译和反射在离线状态下进行。

让驱动消费 IR,而不是源代码

二进制 IR 由 Khronos 完整规定,因此供应商可以在不拥有源语言的情况下优化后端。

在 Vulkan 和 OpenCL 中使用相同的 IR,为工具构建者提供了一个同时面向图形和计算的统一目标。

离线编译减少了运行时的着色器工作,并使验证、反射和工具支持变得更加容易。

开源翻译器、汇编器和反汇编器在发布之初帮助培育了生态系统。

一种标准的中间形式可以将 N 对 M 的编译器问题转化为两个更小的市场:众多前端和众多经过优化的后端。

SPIR-V 成为 Vulkan 和 OpenCL 工具链的核心部分。其统一规范现在涵盖了自 1.0 以来的所有版本,Khronos 继续将其作为多种图形和计算 API 之下的可移植二进制层进行维护。

从这里,追溯依据

参考来源

  1. Khronos Releases OpenCL 2.1 and SPIR-V 1.0 Specifications for Heterogeneous Parallel Programming Khronos Group · khronos.org ·
  2. SPIR-V Specification Khronos Group · registry.khronos.org