type
status
date
slug
summary
tags
icon
password
一、 什么是LLPC?
LLPC(LLVM Pipeline compile)建立在LLVM现有的用于AMD gpu的着色器编译基础设施上,以生成与PAL的管道ABI兼容的代码对象。
LLPC和正常的LLVM结构一样,包含了三个部分:①front-end(前端) ②middle-end(中端) ③back-end(后端)。虽然说结构一致,但是输入的东西和一些结构上的东西不太一样。
在这里放一个LLPC运行的官方流程图:

二、 前端在干什么事情?
可以看到前端有两个进口流程,说明是有两种不同的编译方式:
其中前端编译器同时具有管道状态和各个着色器。
1、管道编译:
对于管道编译,使用BuilderContext::CreatePipeline创建 Pipeline 对象,然后使用其方法将管道状态传递给它(也就是要创建CreateInfoPipeline):
SetShaderStageMask
SetOptions(设置管道调整选项,包括 NGG 选项)
SetShaderOptions(设置每个着色器的调整选项)
SetUserDataNodes
SetDeviceIndex
SetVertexInputDescriptions
SetColorExportState
SetGraphicsState(设置输入组件、视口和光栅器状态)

2、着色器编译:
将输入 SPIR-V 转换为适合 LGC 的 LLVM IR。运行一些“降低”的过程来帮助实现这种转变。将各个着色器 IR 模块链接到单个管线 IR 模块。SPIR-V 转换器基于 Khronos SPIR-V-to-LLVM 转换器。
其中前端编译器只有一个着色器,尚不知道它与任何管道的关系。在这里,前端使用 Builder 编译着色器,然后进行管道编译,其中输入着色器是来自各个着色器编译的 IR。(也就是走的图上的SPIR-V shader->set shader modes->Builder->shader modes->PipelineState)
首先使用Builder::Set*ShaderMode来自输入语言的调用来设置着色器模式(FP 模式、useSubgroupSize 标志、曲面细分模式、几何模式、片段模式、工作组大小)。然后创建或处理 IR 模块,使用 Builder 调用生成新的 IR。
对于着色器编译,请调用Builder::RecordShaderModes以确保将模式记录到 IR 中。
对于着色器编译,已完成:此时的 IR 模块是编译的结果,可以存储起来并保留以供以后与其他着色器链接。

3、将着色器IR模块链接到管道IR模块
调用Pipeline::Link以将着色器 IR 模块链接到管道 IR 模块。

三、 中端在干什么?
1、对 LLVM IR 执行进一步降低,以获得llvm.amdgcn.*具有 AMDGPU 后端理解的内在函数的 LLVM IR,以及后端添加到 ELF 所需的 PAL 元数据。使 IR 符合 PAL ABI 的更改包括:
①、以特定于目标的方式合并着色器(GFX9+ 上合并 LS-HS 和 ES-GS;GFX10+ 上合并 NGG);
②、设置输入参数以在波调度时接收 SGPR 和 VGPR;
③、适当设置 PAL 元数据寄存器。
2、运行中端优化,其中大部分是标准的 LLVM 优化。
3、支持着色器、部分管道和整个管道编译:主要由pipelineLink指定Pipeline::irLink():

四、 后端在干什么?
所有常见的后端转换(指令选择、SIMD 控制流降低、调度、寄存器分配)。

五、 结果
结果是符合 PAL ABI 的 ELF。
补充:什么是PAL?什么是XGL?
其中 XGL 主要负责将 Vulkan API 命令转换为 PAL 命令。除了转换指令之外,它还使用基于 LLVM Pipeline Compiler(LLPC)库将 VkPipeline 的 Shader 编译为与 PAL 管道 ABI 兼容的代码对象。从 XGL 的职责可以看出,XGL 是比较薄的层次,驱动中大部分的工作代码都集中在 PAL 中。
PAL 是 AMD Radeon™ (GCN、RDNA及以上) 架构的硬件和操作系统的抽象层,运行在用户模式驱动中(UMD)中,是 UMD 的重要组成部分。PAL 接受来自于 XGL 转换过来的命令,在其内部根据所处硬件平台执行相应的硬件和操作系统指令。PAL 是相对较厚的驱动层,占据了基于 PAL 的 UMD 中的大部分代码量(除 LLPC 之外)。
PAL 内部的抽象级别并不是完全一致的,在功能相近的部分,抽象级别相对较高,在和硬件相关的不同部分,抽象级别相对较低。总体的原则是在不影响驱动性能的前提下尽可能共享更多的代码。
在架构上 XGL 是 PAL 的 Client,PAL 是 XGL 的 Server。
- 作者:JucanaYu
- 链接:https://jucanayu.top/article/aee1268d-5d71-468f-af73-0a259c0c9277
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。