CUDA:nvcc编译参数示例

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的情况下,以虚拟架构+真实框架的方式,使用最合适的版本,这样编译快且性能好,在程序发布的时候要用多代兼容性写法,保证程序的兼容性。

你可能感兴趣的:(CUDA:nvcc编译参数示例)