编译流程
流程梳理
cuda的编译流程.drawio.txt
基本流程:
Device Code → PTX →(JIT or 静态编译)→ SASS(硬件汇编)→ 二进制
CUDA(GPU的部分)→ PTX → 直接使用JIT运行在GPU
CUDA(GPU的部分)→ PTX(不限定硬件) → SASS(限定硬件)→ 二进制 → 运行
图中出现的一些概念的简单解释:
-
PTX(Parallel Thread Execution)是NVIDIA为其GPU架构设计的一种虚拟中间表示语言,全称是Parallel Thread Execution ISA
可以理解为类似于Java的字节码,是一种面向GPU的汇编语言,但不是直接能被GPU硬件执行的机器码
它是可读的文本格式,一般作为CUDA C/C++等高级语言编译后的中间产物,供后续编译或仿真使用
PTX像汇编一样,描述了低级的指令和寄存器操作
PTX是一种虚拟ISA(中间表示),不是直接针对某一代GPU硬件;而传统汇编(如x86、ARM)是直接针对具体CPU的
PTX还会被进一步编译为SASS(即真正的NVIDIA GPU汇编指令,针对特定GPU架构,如Volta、Ampere等)
-
SASS(Streaming Assembler)是NVIDIA GPU的底层指令集架构,直接对应某一代GPU硬件
它是真正可以在GPU上执行的汇编指令,和x86/ARM汇编很像,但专为NVIDIA GPU设计
本质上,SASS就是GPU的“汇编”语言
NVIDIA官方并没有发布SASS的完整文档,而且它没有类似PTX那种规范的文本格式标准
-
我的理解:SASS和cubin就是一个东西(或者说一个阶段的产物),只是SASS是文本,cubin是二进制
fatbin
就是多个SM的cubin的打包?
nvcc的一些编译命令(用于生成中间产物)
# AI生成,未测试
# PTX
nvcc -arch=sm_70 -ptx kernel.cu -o kernel.ptx
# fatbin
nvcc -arch=sm_70 --fatbin kernel.cu -o kernel.fatbin
参考资料