CUDA:nvcc编译参数示例
前言
nvcc中有控制程序兼容性的参数,本节主要讲这些参数,如果对原理想有了解见CUDA:NVCC编译过程和兼容性详解
CMake中的参数写法和命令行的写法都有。
多种编译写法
虚拟架构+真实框架
这种编译要编译成唯一的结果,即确定GPU对象,写法如下:
set(CUDA_NVCC_FLAGS -arch=compute_60;-code=sm_61)
或
set(CUDA_NVCC_FLAGS -arch=compute_50;-code=sm_50)
或
set(CUDA_NVCC_FLAGS -arch=compute_50;-code=sm_52)
或
set(CUDA_NVCC_FLAGS -arch=compute_50;-code=sm_53)
或
set(CUDA_NVCC_FLAGS -arch=compute_50;-code=sm_50,sm_52,sm_53)
根据实际情况选择
JIT即时编译
要真实和虚拟都使用compute_
set(CUDA_NVCC_FLAGS -arch=compute_60;-code=compute_60)
或
set(CUDA_NVCC_FLAGS -arch=compute_50;-code=compute_50)
或
set(CUDA_NVCC_FLAGS -arch=compute_30;-code=compute_30)
根据实际情况选择
当GPU计算能力低于编译的虚拟框架时,JIT将失败。
fatbinary
即在code处多加了compute_x
set(CUDA_NVCC_FLAGS -arch=compute_60;-code=compute_60,sm_60,sm_61)
或
set(CUDA_NVCC_FLAGS -arch=compute_50;-code=compute_50,sm_52,sm_53)
或
set(CUDA_NVCC_FLAGS -arch=compute_30;-code=compute_30,sm_30,sm_35)
根据实际情况选择
简写的方式
简写的方式实现的功能和上面是一样的,要自己对应,但需要写的少
简写1
nvcc x.cu --gpu-architecture=sm_52
nvcc x.cu --gpu-architecture=compute_50
对应等同于
nvcc x.cu --gpu-architecture=compute_52 --gpu-code=sm_52,compute_52
nvcc x.cu --gpu-architecture=compute_50 --gpu-code=compute_50
简写2
在cuda9.0:
nvcc x.cu
等同于
nvcc x.cu --gpu-architecture=compute_30 --gpu-code=sm_30,compute_30
多代兼容性写法
之前的写法只能保证GPU选择指定编译的某个代的程序,本节通过编译成多个代,实现GPU更好的选择自己的大代和自己的小代的目的。
Cmake:
set(CUDA_NVCC_FLAGS
-gencode arch=compute_20,code=sm_20;
-gencode arch=compute_20,code=sm_21;
-gencode arch=compute_30,code=sm_30;
-gencode arch=compute_35,code=sm_35;
-gencode arch=compute_50,code=sm_50;
-gencode arch=compute_52,code=sm_52;
-gencode arch=compute_60,code=sm_60;
-gencode arch=compute_61,code=sm_61;
-gencode arch=compute_61,code=compute_61;
)
命令行
-gencode arch=compute_20,code=sm_20 \
-gencode arch=compute_20,code=sm_21 \
-gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=sm_50 \
-gencode arch=compute_50,code=compute_50
应用
在平时写程序的时候,在自己知道自己GPU的情况下,以虚拟架构+真实框架的方式,使用最合适的版本,这样编译快且性能好,在程序发布的时候要用多代兼容性写法,保证程序的兼容性。