TensorRT及CUDA自学笔记006 PTX、PTX兼容性及二进制兼容性
PTX定义
- PTX是CUDA平台的一种虚拟机器和指令集,可以理解为一种CUDA平台的汇编语言
- 使用C编写的CUDA程序首先被转换成PTX指令集,PTX指令在经过优化后再转换为特定GPU架构对应的指令集,nvcc在编译程序时通常需要指定目标虚拟机架构和真实GPU架构
- PTX并非物理的GPU,它是对GPU计算能力和特性的抽象定义
PTX作用
- 为GPU演化提供稳定的ISA支持
- 为应用程序提供与GPU本地指令等效的性能,为上层C程序开发提供与GPU架构无关的ISA支持,这使得我们开发是时可以不用关注硬件层的指令集,专注上层应用开发即可。
- 为PTX代码生成器和转换器提供源码级的优化
CUDA定义的虚拟机架构
compute_x中的x指的是虚拟机架构的计算能力
CUDA定义的GPU架构
后者是GPU的物理(真实)架构,前者是一种虚拟架构,是在后者的物理的基础上的面向上层的一种抽象的架构。
CUDA将不同的物理架构的GPU抽象为不同计算能力等级的虚拟机架构,这样我们在上层能更好的使用这些GPU,同时,这种方式也提高了代码的兼容性
PTX兼容性
PTX中的某些指令只能在具有较高的计算能力(compute capability)的GPU上才能使用
较低计算能力的PTX可以在同级或更高级的GPU上运行,反之则不行
所以,为保证CUDA程序能充分的发挥GPU计算能力,我们要在代码编译阶段要设置计算能力,设置ptx文件的兼容性,如果设置的低一些,即计算能力要求低一些,那么该代码的兼容性就高一些,能运行的设备就多一些。
.
通过-arch来设置目标计算能力,设置ptx兼容性
nvcc main.cu -ptx
nvcc -arch=compute_50 main.cu -ptx
不指定arch他就会用默认的计算能力等级,-ptx确保生成ptx文件,不指定路径,就会默认使用输入文件的名字并保存在当前目录。
nvcc main.cu -ptx
//
// Generated by NVIDIA NVVM Compiler
//
// Compiler Build ID: CL-33191640
// Cuda compilation tools, release 12.2, V12.2.140
// Based on NVVM 7.0.1
//.version 8.2
.target sm_52
.address_size 64
nvcc -arch=compute_50 main.cu -ptx
//
// Generated by NVIDIA NVVM Compiler
//
// Compiler Build ID: CL-33191640
// Cuda compilation tools, release 12.2, V12.2.140
// Based on NVVM 7.0.1
//.version 8.2
.target sm_50
.address_size 64
二进制兼容性
- 二进制代码(binary code)是与特定GPU真实架构相关
- 二进制代码从低小代(minor version)到高小代(minor version)兼容,如8.1版本生成的cubin和exe到8.7版本是兼容的
- 二进制代码从高小代到低小代不兼容二进制,如8.7版本生成的cubin和exe到8.1版本是不兼容的
- 代码在大代间不兼容(major version),如7.x版本生成的cubin和exe和8.x版本是不兼容的
二进制兼容性设置
- 二进制兼容性必须和PTX兼容性同时设置
- 通常将PTX兼容性设置低、将二进制兼容性设置高
- 通过nvcc编译参数-code设置二进制兼容性