浅析CUDA编译流程与配置方法_第1页
浅析CUDA编译流程与配置方法_第2页
浅析CUDA编译流程与配置方法_第3页
浅析CUDA编译流程与配置方法_第4页
浅析CUDA编译流程与配置方法_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、浅析cuda编译流程与配置方法(1) 发表时间:2010-01-06nvcc是一种编译器驱动,通过命令行选项可以在不同阶段启动不同的工具完成编译工作,其目的在于隐藏了复杂的cuda编译细节,并且它不是一个特殊的cuda编译驱动而是在模仿一般的通用编译驱动如gcc,它接受一定的传统编译选项如宏定义,库函数路径以及编译过程控制等。 不知不觉做cuda程序已经有大半年的时间了,参加cuda校园竞赛也得到一个优秀作品奖,也算是对自己的一个肯定,但是从来没有好好整理和记录自己的技术应用心得。由于最近实验室要求统一自己的cuda软件开发环境,当然一个大问题就是编译选项如何配置。原先一直使用网上勇哥提供的向

2、导自动配置好的环境,以及参照模仿sdk下的一些模板进行配置,这样就做了这么久,但是boss的意思是要我们自己更多的掌握,也就是要知其所以然。故我在自己的技术博客里将分几次把我从cuda提供的关于nvcc里整理出来的一些东西贴出来!欢迎有兴趣的朋友交流讨论。那么就从cuda编译流程的介绍开始吧!不畏浮云遮望眼,只缘身在最高层!要真正了解cuda程序的编译和像高手一样自如的进行nvcc配置,第一步在我看来,就是整体上把握cuda程序的编译流程。所以开篇还是要看起来很务虚的介绍下基本的程序编译框架。一、cuda编译流程简介nvcc是一种编译器驱动,通过命令行选项可以在不同阶段启动不同的工具完成编译工

3、作,其目的在于隐藏了复杂的cuda编译细节,并且它不是一个特殊的cuda编译驱动而是在模仿一般的通用编译驱动如gcc,它接受一定的传统编译选项如宏定义,库函数路径以及编译过程控制等。cuda程序编译的路径会因在编译选项时设置的不同cuda运行模式而不同,如模拟环境的设置等。nvcc封装了四种内部编译工具,即在c:cudabin目录下的nvopencc(c:cudaopen64bin),ptxas,fatbin,cudafe。nvcc的工作流程说明如下:首先是对输入的cu文件有一个预处理过程,这一过程包括的步骤有将该源文件里的宏以及相关引用文件扩展开,然后将预编译已经产生的与c有关的cuda系统

4、定义的宏扩展开,并合并分支编译的结果。预处理后,首先将预处理的结果送给cuda前端,即cudafe。通过cudafe分离源文件,然后调用不同的编译器分别编译。cudafe被称为cuda frontend,会被调用两次,完成两个工作:一是将主机代码与设备代码分离,生成gpu文件,二是对gpu文件进行dead code analysis,传给nvopencc。 nvopencc生成ptx文件传给ptxas,最后将cubin或ptx传给fatbin。同时,在编译阶段cuda源代码对c语言所扩展的部分将被转成regular ansi c的源文件,也就可以由一般的c编译器进行更多的编译和连接。也即是设备

5、代码被编译成ptx(parallel thread execution)代码或二进制代码,host代码则以c文件形式输出,在编译时可将设备代码链接到所生成的host代码,将其中的cubin对象作为全局初始化数据数组包含进来,但此时,kernel执行配置也要被转换为cuda运行启动代码,以加载和启动编译后的kernel。在使用cuda驱动api时,可单独执行ptx代码或cubin对象,而忽略nvcc编译得到的host代码。另外,nvcc的各个编译阶段以及行为是可以通过组合输入文件名和选项命令进行选择的。它是不区分输入文件类型的,如object, library or resource files

6、,仅仅把当前要执行编译阶段需要的文件传递给linker。以上是我个人对cuda编译过程的一个阐述,我想再结合下图就应该可以对cuda的编译驱动nvcc有个整体的把握了吧!浅析cuda编译流程与配置方法(2) 发表时间:2010-01-14在我们的工程文件编译选项的命令行下加入c:cudabinnvcc.exe,表示启动nvcc,要成功启动nvcc首先必须保证所需绑定的一般的c/c+编译器如vs下的cl,在编译器搜索路径范围内,一般默认目录下,如: c:cudabinnvcc.exe -ccbin c:program filesmicrosoft visual studio 8vcbin,又或是

7、,$(cuda_bin_path)nvcc.exe -ccbin $(vcinstalldir)bin。 二、nvcc启动与配置说明1、nvcc的启动条件在我们的工程文件编译选项的命令行下加入c:cudabinnvcc.exe,表示启动nvcc,要成功启动nvcc首先必须保证所需绑定的一般的c/c+编译器如vs下的cl,在编译器搜索路径范围内,一般默认目录下,如:c:cudabinnvcc.exe -ccbin c:program filesmicrosoft visual studio 8vcbin,又或是,$(cuda_bin_path)nvcc.exe -ccbin $(vcinstal

8、ldir)bin。而windows平台下编译选项-compiler-bindir是当编译器cl不在默认路径时用来重新设定路径,另外windows平台下,nvcc 需要能定位到脚本vsvars.bat(这个脚本必须先于cl编译器执行,因为它将指定cl编译器正确运行所需的环境参数),也是通过-compiler-bindir 来重新指定。cuda提供了一个用于检查是否是启动nvcc编译的宏:_cudacc_2、nvcc的profile文件在nvcc所在的目录里有一个nfile,它定义了nvcc在cuda中的目录结构,它对于nvcc使用者来说不像是作为一个配置文件,而是提供了指定cuda

9、 toolkit中的bin和lib等目录的参数变量如path, ld_library_path等,打开这个文件可以看到如下的内容:path += $(top)/extools/bin;$(top)/open64/bin;$(top)/bin;$(top)/lib;includes += -i$(top)/include -i$(top)/include/cudart $(_space_)libraries =+ $(_space_) /libpath:$(top)/lib cudart.libcudafe_flags +=opencc_flags +=ptxas_flags +=来简单介绍下里

10、面的语法:# 是注释符name = :赋值name ?= :条件赋值name += :首部增加name =+ :尾部增加可通过以下任一种风格对所要赋值的环境变量字符串进行赋值: %name% :dos style $(name) :make style其中,nvcc定义了一个指定该profile文件所在目录的宏 _here_,它会根据nvcc的调用方式返回绝对或相对路径。同样,nvcc使用宏 _space_来代表空格字符,使用如下: includes += -i./common $(_space_) 去掉宏_space_就会造成粘合效应,如 i./common-iapps 。还可以看到prof

11、ile文件中使用+=时$(_space_)放在后面,而使用=+时则放在了前面,就是因为这个原因。3、nvcc启动所需要使用的几个变量在第一个部分,已经说明了nvcc在进行编译时的主要工作流程,以下几个变量就是nvcc自身控制各个编译阶段所需要使用的相关变量。(1)compiler-bindir 用于指定主机编译器所在的目录,可以使用编译选项-compiler-bindir进行修改。(2)includes这个字符串扩展nvcc的命令选项xcompiler,它也定义一些附加的include目录,在实际的编译选项语法范围内,如linux下的gcc 语法或windows下的cl 语法。(3)libra

12、ries这个字符串扩展nvcc的命令选项xlinker,它也定义一些附加的库文件和库文件目录,在实际的编译选项语法范围内,如linux下的gcc 语法或windows下的cl 语法。 (4)ptxas_flags这个字符串扩展nvcc的命令选项xptxas,它主要是给cuda内部工具ptxas传递一些命令。(5)cudafe_flags这个字符串扩展nvcc的命令选项-xcudafe,它主要是给cuda内部工具cudafe传递一些命令。 (6)opencc_flags这个字符串扩展nvcc的命令选项xopencc,它主要是给cuda内部工具nvopencc传递一些命令。 注意:cuda提供的几

13、个内部工具在c:cudabin目录下分别是ptxas,fatbin,cudafe,nvopencc(c:cudaopen64bin)。另外在使用cuda编程环境向导后可在vs2005中的项目-属性-cuda-backends中设置相关命令浅析cuda编译流程与配置方法(3) 发表时间:2010-01-14nvcc的选项命令形式大概有以下3类:boolean (flag-)选项,单值选项和列表(multivalued-)选项。 下面是使用规则举例: -o file -o=file -idir1,dir2 -i=dir3 -i dir4,dir5 每一个选项命令都有两个名字,全称和简写,例如i就是

14、-include-path的简称,注本文后面的选项命令说明均只列出简称,详细见参考资料1。一般来说,全称多用于述,简称多用于实际使用。 三、nvcc的命令选项的分析说明nvcc的选项命令形式大概有以下3类:boolean (flag-)选项,单值选项和列表(multivalued-)选项。下面是使用规则举例:-o file -o=file -idir1,dir2 -i=dir3 -i dir4,dir5每一个选项命令都有两个名字,全称和简写,例如i就是-include-path的简称,注本文后面的选项命令说明均只列出简称,详细见参考资料1。一般来说,全称多用于述,简称多用于实际使用。编译选项可

15、按用途分为以下7大类:1、指定编译阶段的选项这类选项主要用来控制编译的阶段,用以制定哪些阶段的输入文件要被编译,如-ptx、-cuda、-gpu等等。最经常用到的是-c,用来生成object文件。2、file and path specifications指定相关文件的路径及名称的命令选项下面这几个用于文件和路径说明命令是我们最常见:-o :指定输出文件的位置和名称。 如-o $(configurationname)$(inputname).obj $(inputfilename)表示将$(inputfilename)作为输入文件,$(configurationname)$(inputname

16、).obj为输出路径及文件名-include:指定预处理和编译时预先需要包含的头文件。-l:指定链接时需要的库文件,另外这些库文件的搜索路径必须已经被命令选项-l指定。 -d :指定预处理和编译时需要的宏,如-d_debug -d_console-u :取消一个宏定义 -i:指定包含文件的搜索路径,如 -ic:cudainclude -ic:programdatanvidia corporationnvidia gpu computing sdkccommoninc -i表示依赖的库的路径,所以如果有时候一些dll或lab文件不在默认路径下,在这里可以添加路径!或者$(cuda_bin_pat

17、h)nvcc.exe -ccbin $(vcinstalldir)bin-isystem:specify system include search paths.-l:指定库文件的搜索路径.-odir:指定输出文件的目录,这选项也为代码生成步骤指定合适的输出目录做准备,与命令选项-generate-dependencies直接相关,如-odir debug-ccbin:指定host编译器的所在路径,如-ccbin $(vcinstalldir)bin或者c:program filesmicrosoft visual studio 8vcbin3、调整编译器和链接器行为的选项-g:产生可调试代码

18、,这是调试模式下是必需的-g:产生可调试的设备代码-o:产生优化代码,包括o0,o1,o2,o3,用于产生不同的指令集,现在一般采用o0(为优化,好处在于使host与device的生成代码相异度最小,不容易出差),这些优化的具体内容我还未找到详细说明,基本上也就是展开一些循环,函数,优化一些访存指令。但并不是自动优化最好,因为有时会得不到正确的结果,所以需要有深的认识才使用。-m: 指定平台结构32 vs 64位. 一般可不用,常见的如-m 32。4、内部编译工具的控制命令选项这个主要是为nvcc封装的五种内部编译工具传递一些行为说明的命令,可以通过基本命令-h,即显示工具的帮助命令了解更多。

19、我暂时还没整理出来。另一个基本命令-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

20、1, 12 bytes cmem14 这里对上例进行一个简单的解释,smem表示共享存储器,这个地方它被分成了两个部分,第一个表示总共声明的共享存储器大小,后者表示系统在存储段中分配的数据总量:共享存储器中的device函数参数块和局部存储器中的线程索引信息。cmem表示常量存储器的使用情况,这里就是使用了一个20bytes的变量和一个长度为14的单位12byte的数组-xopencc -list:source=on:包含在工具ptx中产生的源文件这些选项的配置可自行配置,也可以在cuda开发环境向导里的属性-cuda-backends进行配置。5、对编译驱动进行引导的命令选项这些选项主要用于

21、对nvcc的行为提供指引,现阶段对我们比较有用的是keep选项。-dryrun: 不执行nvcc产生的编译命令而只是列出它们。-v: 列出nvcc产生的编译命令,不影响其执行。-keep: 保留各步骤产生的中间文件.-save-temps: 同-keep.-noprof: 不使用file文件引导编译-clean: 可逆转nvcc的行为,当其被指定时,所有编译阶段都不执行,而且所有nvcc在其它时候产生的非临时文件都将被删除,keep用于调试,clean则用于去掉那些调试文件。-run-args: 与-r联用用于指定运行时的命令行参数。-idp: windows平台下,所有的命令行参数相关的文件名在执行前都需要转成本地格式,这一选项当前的开发环境表示的绝对路径,如使用-idp /cygwin/ 为 cyg

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论