您的位置:首页 > 其它

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

2010-01-12 02:50 274 查看
三、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表示依赖的库的路径,所以如果有时候一些dll或lab文件不在默认路径下,在这里可以添加路径!或者"$(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:产生优化代码,包括O0,O1,O2,O3,用于产生不同的指令集,现在一般采用O0(为优化,好处在于使host与device的生成代码相异度最小,不容易出差),这些优化的具体内容我还未找到详细说明,基本上也就是展开一些循环,函数,优化一些访存指令。但并不是自动优化最好,因为有时会得不到正确的结果,所以需要有深的认识才使用。
-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-prefix和dependency-drive-prefix.
6、驾驭CUDA编译方式的命令选项
这些主要用以控制CUDA的编译方式,如模拟形式等。没有太多需要注意的选项选择。
-deviceemu:生成用于GPGPU库 模拟的代码.
-use_fast_math: 使用快速数学计算库.
-e: 在ptx或gpu文件送入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的编译环境的配置。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: