浅析CUDA编译流程与配置方法(3)

三、Nvcc的命令选项的分析说明

Nvcc的选项命令形式大概有以下3类:boolean (flag-)选项,单值选项和列表(multivalued-)选项。

下面是使用规则举例:

-o file

-o=file

-Idir1,dir2 -I=dir3 -I dir4,dir5

每一个选项命令都有两个名字,全称和简写,例如–I就是--include-path的简称,注本文后面的选项命令说明均只列出简称,详细见参考资料1。一般来说,全称多用于述,简称多用于实际使用。

编译选项可按用途分为以下7大类:

1、指定编译阶段的选项

这类选项主要用来控制编译的阶段,用以制定哪些阶段的输入文件要被编译,-ptx-cuda-gpu等等。最经常用到的是-c,用来生成object文件。

2File and path specifications指定相关文件的路径及名称的命令选项

下面这几个用于文件和路径说明命令是我们最常见:

-o :指定输出文件的位置和名称。 -o $(ConfigurationName)/$(InputName).obj $(InputFileName)表示将$(InputFileName)作为输入文件,$(ConfigurationName)/$(InputName).obj为输出路径及文件名

-include:指定预处理和编译时预先需要包含的头文件。

-l:指定链接时需要的库文件,另外这些库文件的搜索路径必须已经被命令选项'-L'指定。

-D :指定预处理和编译时需要的宏,如-D_DEBUG -D_CONSOLE

-U 取消一个宏定义

-I:指定包含文件的搜索路径,如 -I"C:/CUDA/include" -I"C:/ProgramData/NVIDIA Corporation/NVIDIA GPU Computing SDK/C/common/inc"  -I表示依赖的库的路径,所以如果有时候一些dlllab文件不在默认路径下,在这里可以添加路径!或者"$(CUDA_BIN_PATH)/nvcc.exe" -ccbin "$(VCInstallDir)bin"

-isystem:指定系统的包含引用文件的搜索路径

-L指定库文件的搜索路径.

-odir指定输出文件的目录,这选项也为代码生成步骤指定合适的输出目录做准备,与命令选项--generate-dependencies直接相关,如-odir "Debug"

-ccbin指定host编译器的所在路径,-ccbin "$(VCInstallDir)bin"或者"C:/Program Files/Microsoft Visual Studio 8/VC/bin"

3、调整编译器和链接器行为的选项

-g:产生可调试代码,这是调试模式下是必需的

-G:产生可调试的设备代码

-O:产生优化代码,包括O0O1O2O3,用于产生不同的指令集,现在一般采用O0(为优化,好处在于使hostdevice的生成代码相异度最小,不容易出差),这些优化的具体内容我还未找到详细说明,基本上也就是展开一些循环,函数,优化一些访存指令。但并不是自动优化最好,因为有时会得不到正确的结果,所以需要有深的认识才使用。

-m: 指定平台结构32 vs 64. 一般可不用,常见的如-m 32

4、内部编译工具的控制命令选项

这个主要是为nvcc封装的五种内部编译工具传递一些行为说明的命令,可以通过基本命令-h,即显示工具的帮助命令了解更多。我暂时还没整理出来。另一个基本命令-V可以显示工具的版本信息。

例如在命令行下键入nvcc – Xptxas –h就可以显示ptx工具的帮助信息。

这里特别说明一个很实用的命令选项,-Xptxas –v:显示代码生成的统计结果,也就是会显示经过编译分析得到的device函数对寄存器和存储器的使用情况。如下例:

nvcc -Xptxas –v acos.cu

ptxas info : Compiling entry function 'acos_main'

ptxas info : Used 4 registers, 60+56 bytes lmem, 44+40 bytes smem,

20 bytes cmem[1], 12 bytes cmem[14]

这里对上例进行一个简单的解释,smem表示共享存储器,这个地方它被分成了两个部分,第一个表示总共声明的共享存储器大小,后者表示系统在存储段中分配的数据总量:共享存储器中的device函数参数块和局部存储器中的线程索引信息。cmem表示常量存储器的使用情况,这里就是使用了一个20bytes的变量和一个长度为14的单位12byte的数组

-Xopencc -LIST:source=on:包含在工具ptx中产生的源文件

这些选项的配置可自行配置,也可以在CUDA开发环境向导里的属性->CUDA->backends进行配置。

 

5、对编译驱动进行引导的命令选项

这些选项主要用于对nvcc的行为提供指引,现阶段对我们比较有用的是keep选项。

-dryrun: 不执行nvcc产生的编译命令而只是列出它们。

-v: 列出nvcc产生的编译命令,不影响其执行。

-keep: 保留各步骤产生的中间文件.

-save-temps: --keep.

-noprof: 不使用nvcc.profile文件引导编译

-clean: 可逆转nvcc的行为,当其被指定时,所有编译阶段都不执行,而且所有nvcc在其它时候产生的非临时文件都将被删除,keep用于调试,clean则用于去掉那些调试文件。

-run-args: -R联用用于指定运行时的命令行参数。

-idp: Windows平台下,所有的命令行参数相关的文件名在执行前都需要转成本地格式,这一选项当前的开发环境表示的绝对路径,如使用'-idp /cygwin/' CygWin 构建环境。

-ddp: Windows平台下,生成依赖文件(如选项-M),所有的文件名 都需要转成'make' 使用实例可识别的,在Windows格式里有一些'make'实例对绝对路径中的冒号存在识别问题,这些依赖于'make' 被编译的环境,为一个CygWin make使用'-ddp /cygwin/'予以说明,或者就采用本地Windows格式而不进行说明。

-dp: 指定 <prefix>作为input-drive-prefixdependency-drive-prefix.

6、驾驭CUDA编译方式的命令选项

这些主要用以控制CUDA的编译方式,如模拟形式等。没有太多需要注意的选项选择。

-deviceemu:生成用于GPGPU 模拟的代码.

-use_fast_math: 使用快速数学计算库.

-e: ptxgpu文件送入cubin编译阶段使用:指定哪些global函数必须生成代码,默认情况是所有global函数。

-host-compilation: 指定CUDA源文件中host的语言类型C vs. C++,允许的参数有C, c, C++ and c++. --host-compilation C++

7、驾驭GPU代码生成的命令选项

这个部分的选项命令主要控制代码生成,比较复杂,但现阶段对我的作用不大,它主要用在外部链接,GPU的虚拟和实际平台代码生成,以及多GPU代码生成等方面。有一个基本原则:前一个阶段的虚拟代码版本必须低于后面的实际代码生成,对于GPU代码编译我会在继续了解CUDA底层的运行机制后在下一节给出说明。

 

到此配置基本完成了如CUDA编译命令选项的全面分析说明。希望大家都明白如何进行nvcc的编译环境的配置。

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值