暂时了解的有三种编译调试运行方法:
一:直接在终端用下面的命令进行编译调试运行
(1):运行程序
按照上一篇文章所述,安装好cuda软件以后,就可以使用”nvcc -V“命令查看所用到的编译器版本,
本人用版本信息来自:“Cuda compilation tools, release 3.2, V0.2.1221”。
自己创建一个目录,在里面新建 cu 文件,写入代码,保存,即可使用终端切换到相应目录下进行编译 了,
编译命令:nvcc -o filename filename.cu,即可将 .cu 文件编译成可执行文件,如果有语法错误,
此时将会报错,如果没有,其他错误将会在运行时报错,使用 ./filename 运行程序,即可。
(2):调试程序
如果程序有误但是没能看到结果或者相关信息,不妨加入调试信息:nvcc -o filename filename.cu -g ,
即可添加调试信息,之后使用gdb运行:gdb ./filename 即可进入可执行文件,输入命令:r,
即可运行具有调试信息的程序,看到错误结果的相关信息,再找出错误之处,修改 再编译。
(3):错误查找
在CUDA里面,有很好的查错函数,本人一般用其中两个:CUT_CHECK_ERROR (),CUDA_SAFE_CALL(),
前者可以接受最近一次 的cudaerror_t异常,且输出 相应的错误类型,比如像检测一个核函数是否正确执行,
可以在执行语句之后加 入:CUT_CHECK_ERROR(“Kernel execution failed”);运行时如果出错,
将会报告并且输出错误类型;而后者直接输出错误类型,例如想要知道某复制语句是否成功,
可以在将语句改写 成:CUDA_SAFE_CALL(cudaMemcpy(d_data, data, size, cudaMemcpyHostToDevice));
运行时如果出错,将会直接输出错误类型。
上述函数使用时必须包含头文件 cutil.h,添加方法见第四点。
(4):添加路径
如何添加路径呢?使用 "-I path" 参数输入,例如想要添加的头文件为 cutil.h,则在 .cu 文件将其包括进去
,查看其属性可以知道其位置,为:/home/user/NVIDIA_GPU_Computing_SDK/C/common/inc,
那么编译的时候命令可以写成:nvcc -I /home/user/NVIDIA_GPU_Computing_SDK/C/common/inc -o filename filename.cu,
这样编译器就会找到该文件并调用了,其他路径的添加类似。
实例:
部分同学纠结在ubuntu下面使用什么编辑器书写代码,其实用ubuntu自带的记事本就行,
将文件后缀改为.cu即可。下面我们先来编写第一个cuda程序。将其命名为“helloworld.cu”。
#include<stdio.h>
__global__ void helloFromGPU(void)
{
printf("Hello World from GPU!\n");
}
int main(void)
{
printf("Hello World from CPU!\n");
helloFromGPU<<<1,10>>>();
cudaDeviceReset();
return 0;
}
其中__global__表示后面的函数交由GPU处理,通常GPU编程包含以下五步
(1)分配GPU内存
(2)将CPU的内容拷贝给GPU内存
(3)调用CUDA的内核函数进行处理
(4)将GPU处理完的数据拷贝给CPU
(5)释放GPU的内存
上述代码中__global__之后的内容为内核函数<<<>>>代表从主线程到设备端代码的调用,
里面的参数10代表调用10个线程。
打开终端,进入cu文件所在的文件夹输入
nvcc -o helloworld helloworld.cu
1
输出结果应为
Hello World from CPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
二:利用Makefile编程(用师妹总结的与你之前跑的例程就可以了)
创建一个Makefile,然后输入命令就可以了:
filename : filename.cu
nvcc -o filename filename.cu
在终端使用命令:make filename,即可编译生成可执行文件,如果有多个 .cu 文件要编译,
也可以写在同一个Makefile里面,改变 “make filename” 中的 “filename” 即可编译生成不同的可执行文件。
三:利用装了对应jetpack版本的ubuntu电脑做交叉编译调试运行,有相应的博客收藏