分享
GPU Driver & Runtime
输入“/”快速插入内容
GPU Driver & Runtime
飞书用户54
2024年12月14日修改
2024年3月17日创建
782
885
SPIR-V
设计为硬件驱动的输入程序表示
Standard Portable Intermediate Representation (SPIR)
1.
稳定的字节码。注重于字节码的高效处理并提供强兼容性。
2.
GPU 领域专用。着眼于 GPU 领域的行业标准规范
是为表示 OpenCL 设备程序 (kernel) 而设计的,它锁定了某一版本的 LLVM IR,使用 LLVM 内联函数 (intrinsic) 和元数据 (metadata) 来定义 OpenCL 的计算原语以及定义。 但 Khronos Group 逐渐意识到 LLVM IR 实在不适合这种任务,遂转向了设计与开发 SPIR-V。
SPIR-V 是多个 Khronos API 共用的中间语言,包括 Vulkan, OpenGL, 以及 OpenCL。
完整的 GPU 编译器被分为两部分
1.
通过离线工具链从高层次源代码生成 SPIR-V
2.
通过驱动内部编译器将 SPIR-V 在线编译成机器码。
GPU Driver 内要有 compiler 的。
SPIR-V 更侧重于驱动内部二次编译的高效,核心是字节码。
其编码有很多简化驱动二次编译的考量,像是用各种提前的显示声明来避免运行时复杂的分析。
SPIR-V 并没有在规范中指定内存表示或者文本表示,这些都是实现 SPIR-V 标准规范的工具链自行定义的。 比如 SPIRV-Tools 有其自己的
内存表示
和
文本表示
, 同样 MLIR 中的
SPIR-V dialect
也是。
SPIR-V 的 IR 部分和 LLVM IR 相差并不太大。 SPIR-V 借鉴了很多 LLVM IR 的设计——它同样是由控制流、基本块、以及静态单赋值来表示程序。 指令的粒度和 LLVM IR 也相差不大。
SPIR-V 中独特的部分在于对很多 GPU 概念的原生支持。 这种支持通过很多 SPIR-V 独有的机制来实现,比如
decorations
,
builtins
, 以及特殊的指令(像是
导数计算
、
图像取样
)。 另外为了支持图形图像和高性能计算的两种使用场景, SPIR-V 中有许多执行
模型
和
模式
。 当然,对图形图像也有
structured control flow
的特殊需求。
一个 GPU 为主的标准规范需要原生支持各种 GPU 概念,能够提供不同等级的扩展需求, 以及提供稳定和兼容的字节码。 这些需求并不符合 LLVM IR 的设计理念,所以 Khronos Group 推出了 SPIR-V。 但是设计一套中间表示只是个开始,围绕其开发和维护整套工具链需要持续不断的工程投入。 SPIR-V 与 LLVM IR 完全无关,SPIR-V 的编译器栈无法利用现有的 LLVM 库。 所以 SPIR-V 的整个栈是从头开始独立开发的,从汇编、反汇编,一步步到各种语言的编译器和优化。 如果我们当时能够有一套帮助开发编译器的基础设施——
Reference
https://www.xilinx.com/products/technology/ai-engine.html
https://www.xilinx.com/content/dam/xilinx/support/documents/white_papers/EW2020-Deep-Learning-Inference-AICore.pdf
https://www.xilinx.com/content/dam/xilinx/support/documents/white_papers/wp506-ai-engine.pdf
https://docs.nvidia.com/cuda/cuda-driver-api/api-sync-behavior.html
cuda 的 runtime 和 driver api 看起来都是不开源的。
AMD 的开源。
浅谈Cuda driver API
https://zhuanlan.zhihu.com/p/111602648
https://dl.acm.org/doi/abs/10.1145/3542929.3563467