nvcc编译器参数

nvcc编译器参数

参考:
http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html
https://www.cnblogs.com/shrimp-can/p/5567518.htm

  • nvcc编译器参数
  • 示例

    nvcc编译器参数

    nvcc是cuda程序的编译器,了解它的一些关键参数有利于我们更加从容,更加准确的构建自己的CUDA项目。所有的编译器参数可参考官方网站的文档
    下面就例举和重点讨论一些参数:
    一、指定编译阶段
    主要指定编译的阶段是最基本的编译参数。
    -cuda -cubin -fatbin -gpu -E
    -ptx:parallel thread execution (PTX)
    -c :最常使用,编译每个.c/.cc/.cpp/.cxx/.cu输入文件为object文件
    -dc -dw -dlink -link
    -lib :编译所有的输入文件为object文件,并且把结果添加到指定的library输出文件
    -run
    二、文件和路径配置
    -o :指定输出文件的位置和名称
    -include :指定预处理和编译时预先需要包L小写文件
    -l(L小写) :指定链接时需要的库文件
    -D :指定预处U :取消宏定义
    -I(大写I) :指定包含文件的搜索路径
    -isystem :指定系统包含的引用文件的搜索路径
    -L :指定库文件的搜索路径
    -odir :指定输出文件的目录
    -ccbin :指定host编译器所在路径
    -cudart :指定CUDA runtime library使用类型(none,shared,static),-认为stat
    –x {c|c++|cu} 式指定输入文件的语言,而不是让编译器根据文件名后缀选择默认值。此选项的允许值。c,c ++,cu。
    -ldir :指定包含libdevice库文件目录
    三、指定编译器、连接器的行为
    -pg
    -g :产生可调式代码,调试模式下必须的
    -G :产生可调式的设备代码
    -lineinfo :为设备代码产生行number信息
    -O :产生优化代码 ,包括O0,O1,O2,O3,用于产生不同的指令集
    -ftemplate-backtrace-limit -shared -x -std -nohdinitlist -nohdmoveforward -expt-relaxed-constexpr
    -m :指定平台结构32 vs 64
    四、编译工具内部选项
    -Xcompiler -Xlinker -Xarchive -Xptxas -Xnvlink
    -Xptxas -v:显示代码生成的统计结果
    -Xptxas -dlcm=cg:关闭L1cache
    -Xptxas -dlcm=ca:将L1cache增加到48KB(默认为16KB,和shared memory一共64KB)
    五、编译驱动引导选项
    -noprof -dryrun
    -v :列出nvcc产生的编译命令,不影响其执行
    -keep :保留各步骤产生的中间文件,用于调试
    -keep-dir -save-temps
    -clean :逆转nvcc的行为
    -run-args
    idp -ddp -dp -MT -nodlink
    六、CUDA编译方式选项
    -default-stream
    七、操纵GPU不同代代码生成的选项
    -arch :指定NVIDIA虚拟GPU架构类的名称,nvcc使用指定的真实体系结构及其最接近的虚拟体系结构作为有效的体系结构值。
    -code 指定NVIDIA GPU的名称来组合和优化PTX。
    -gencode:使用相同的虚拟化体系-arch将生成代码分配到不同的真实GPU上。
    -rdc -e
    -maxrregcount :指定GPU函数可使用的最大寄存器数量
    -use_fast_math -ftz -prec-div -prec-sqrt-fmad
    八、通用工具选项
    -res-usage:显示GPU代码的资源使用情况,如寄存器和内存。当–relocatable-device-code = true时,–nvlinkoptions=–verbose 否则–ptxasoptions=–verboe。
    -optf:包含命令行参数从文件中。

    示例

    nvcc使用一个重要的参数是虚拟框架(通用虚拟体系结构可以为一个或多个GPU生成可执行代码,-arch)和真实GPU的参数(-code)。如:
    我的电脑是 Pascal架构,所以可以用compute_60:
    nvcc x.cu --gpu-architecture=compute_60 --gpu-code=sm_61,sm_62也可简写为nvcc x.cu -arch=compute_60 -code=sm_61,sm_62

    sm_xy是GPU的命名规范,x是GPU的代号,y是版本号。
    -arch是虚拟化的框架
    -code是真实的现有GPU。
    code要高于arch的版本
    高版本(高代)的GPU可以兼容低版本的虚拟框架如:
    nvcc x.cu -arch=compute_60 -code=sm_60
    高版本的GPU可以兼容低版本的GPU,但要显式表达如(显式添加了compute_50):
    nvcc x.cu -arch=compute_50 -code=sm_50,compute_50
    两个sm(sm_61,sm_62)版本是共同优化的意义。
    -arch,-code表明一个或多个GPU使用一个共同的虚拟化框架。
    -arch,-encode是用于分布式的GPUs集群指令

nvcc x.cu是最简单的编译器指令它是
nvcc x.cu --gpu-architecture=compute_30 --gpucode=sm_30,compute_30的默认形式。
nvcc x.cu -O3-O3是一种默认编译器优化方式。g++等编译器也有此参数