linux nvcc未找到命令,NVCC CUDA编译流程

一、CUDA编译流程简介

Nvcc是一种编译器驱动,通过命令行选项可以在不同阶段启动不同的工具完成编译工作,其目的在于隐藏了复杂的CUDA编译细节,并且它不是一个特殊的CUDA编译驱动而是在模仿一般的通用编译驱动如gcc,它接受一定的传统编译选项如宏定义,库函数路径以及编译过程控制等。所有非CUDA编译步骤扔给通用的C编译器,在Windows下是MS的“cl”编译器,而在Linux下是gcc。CUDA程序编译的路径会因在编译选项时设置的不同CUDA运行模式而不同,如模拟环境的设置等。nvcc封装了四种内部编译工具,即在C:\CUDA\bin目录下的nvopencc(C:\CUDA\open64\bin),ptxas,fatbin,cudafe。Nvcc的工作流程说明如下:

首先是对输入的cu文件有一个预处理过程,这一过程包括的步骤有将该源文件里的宏以及相关引用文件扩展开,然后将预编译已经产生的与C有关的CUDA系统定义的宏扩展开,并合并分支编译的结果。CUDA源文件经过预处理过程后会生成具有.cup后缀名的经过预处理的源文件,经过预处理的源文件是再现程序bug的最好形式。通常,这个预处理过程是隐式完成的,如果想要显示执行,可以用命令nvcc

-E x.cu -o x.cup或nvcc -E x.cu > x.cup来实现。???

预处理后,首先将预处理的结果送给CUDA前端,即CUDAfe。通过CUDAfe分离源文件,然后调用不同的编译器分别编译。cudafe被称为CUDA

frontend,会被调用两次,完成两个工作:一是将主机代码与设备代码分离,生成gpu文件,二是对gpu文件进行dead

code analysis,传给nvopencc,未来的版本可能没有第二次调用。

Nvopencc生成ptx文件传给ptxas,最后将cubin或ptx传给fatbin组合成一个设备代码描述符。

同时,在编译阶段CUDA源代码对C语言所扩展的部分将被转成regular ANSI

C的源文件,也就可以由一般的C编译器进行更多的编译和连接。也即是设备代码被编译成ptx(parallel thread

execution)代码和/或二进制代码,host代码则以C文件形式输出,在编译时可将设备代码描述符链接到所生成的host代码,将其中的cubin对象作为全局初始化数据数组包含进来,但此时,kernel执行配置也要被转换为CUDA运行启动代码,以加载和启动编译后的kernel。在调用CUDA驱动API时,CUDA运行时系统会查看这个描述符,根据当前的GPU

load一块具有合适ISA的image,然后便可单独执行ptx代码或cubin对象,而忽略nvcc编译得到的host代码。

另外,Nvcc的各个编译阶段以及行为是可以通过组合输入文件名和选项命令进行选择的。它是不区分输入文件类型的,如object,

library or resource files,仅仅把当前要执行编译阶段需要的文件传递给linker。

可以用-dryrun命令来列出nvcc编译的步骤的所有。命令列出的命令列表包括5种类型

(1)标准变量的定义,如_HERE_和_SPACE_?;

(2)执行nvcc.profile时对环境变量的赋值;

(3)对VS安装的宏进行定义(从--compiler-bindir引申出来);

(4)执行vsvars32.bat获得的环境变量赋值;

(5)nvcc生成?的命令。

以上是我个人对CUDA编译过程的一个阐述,我想再结合下图就应该可以对CUDA的编译驱动nvcc有个整体的把握了吧!

你可能感兴趣的:(linux,nvcc未找到命令)