CUDA 编译相关
nvcc 编译过程
nvcc 编译分为两个阶段
首先将 .cu
编译为面向 虚拟架构 的 .ptx
代码 (stage1)
然后将 .ptx
编译为面向 实际架构 的 二进制代码 (stage2)
实际架构 需要兼容 虚拟架构
在运行时,若二进制代码可以直接在 GPU 上运行,则直接运行,否则 如果文件中包含 虚拟架构 代码,GPU 驱动动态将代码编译为二进制代码 (JIT compiler)
-arch
选项
-arch
选项指定第一阶段的虚拟架构,包括 compute_30
, compute_75
...
-code
选项
-code
选项指定最终包含的代码
nvcc 第二阶段的实际架构,包括 sm_30
, sm_75
...
也可用于指定包含的虚拟架构代码,包括 compute_30
, compute_75
...
-gencode
选项
-arch
和 -code
可以指定不同的虚拟架构,但只有一种实际架构-gencode
使用不同的虚拟架构,在目标文件中包含面向多种虚拟架构的 ptx 代码和多种实际架构的二进制代码
-gencode arch=compute_50,code=sm_50
-gencode arch=compute_61,code=compute_61