Udacity的这个CUDA课程非常不错,提供了一个在线的编辑、编译、运行平台,我们可以直接在web上完成代码编辑、提交、查看运行结果,但是,有时候,面对比较复杂的问题,我们还是希望能够有一个本地的环境来执行这些代码,并且实现debug,调试代码,所以这篇博客主要是介绍如何在Visual Studio环境下完成代码的编译执行过程。
下面以第一单元的彩色图转灰度图为例子来讲解,我这里是VS2012的环境,VS2010类似。
先去Github上下载官方代码,这些代码与课程网站上的有一些区别,一是文件更全,二是代码会多一些输入输出。这是Github地址https://github.com/udacity/cs344
如下图所示:
分割线在此
******************************************************************************************************************************************
******************************************************************************************************************************************
1、在开始之前,务必先把CUDA、OpenCV环境配置好,可以参考前面的博文http://blog.csdn.net/suda072605/article/details/20079099。
搞定环境配置之后,就可以开始了,新建工程,注意是CUDA的工程。
2、移除kernel.cu文件,这个是没用的,右键点击“kernel.cu”,右键移除并删除。
3、把从Github上下载的HW1文件夹中所有.h、.cpp文件、.cu文件、.jpg文件拷贝到该工程目录下。如下图
4、在solution中加入这些文件,包括所有.h、cpp文件、.cu文件。右键工程名-》选择添加-》现有项,如下图所示
5、开始编译,ctrl+alt+F7。发现有很多错误,如下图所示。
查阅代码后,发现这是因为在main函数中有一句这样的语句:
#include "HW1.cpp"
这是有问题的,因为我们在工程中已经引用了HW1.cpp,现在main函数中又出现了,这会导致HW1.cpp中的函数二次定义,这是不允许的。可以多次声明,但是不能多次定义。
详细的解释如下:
所谓 #include 的意思呢,就是把另一个文件里的东西复制到这里来,无论你的文件后缀是 h 还是 cpp 都是一样的。上述的错误是怎么产生的呢?你可以试试写 a.cpp 和 b.cpp 两个文件,两个文件中有一模一样的两个函数,是不是产生了和你的问题中同样的错误?因为你有两个一模一样的函数,编译器不知道怎么区分它们了。现在把 a.cpp 中的内容全部去掉,换成 #include "b.cpp",VC在编译的时候,首先将 #include "b.cpp" 替换成了 b.cpp 的内容,于是就和刚才的情形一致了。这时再进行编译,当然就会出一样的错误了。
那么 .h 文件为什么没有类似的问题呢?一是 .h 文件并没有定义,都是一些声明,声明可以重复多次(你只是在告诉编译器,工程中有这么个东西,具体在哪,请到别处找找),而定义不行。二是 VC 并不会编译 .h 文件,如果你把项目中的 .h 文件全部移除(不是删除!),程序照样可以编译。
总之,如果你要调用另一个 .cpp 文件中的函数,只要在使用它的文件中声明一下就可以了。比如:"int Foo( int a, int b );"(注意没有函数体) 这个声明告诉编译器你要一个名叫 Foo, 接受两个整型参数,返回整型的函数,编译器自动会帮你去找。只要项目中任一个 .cpp 文件定义了这样一个函数,编译器就可以找到。
现在,假设你有很多个函数,并且有很多个 .cpp 文件要用到它们,那么,岂不是需要在每个文件中写上一大堆的声明?这便是 #include 的用武之地了。在一个 .h 文件写上所有的声明,然后在每个 .cpp 文件中 #include 它,于是编译器就会把 #include "xx.h" 替换成 xx.h 文件中的实际内容,于是你的每个 .cpp 文件中都有这些声明了,都可以自由地使用这些函数了。所以,为了解决上述出现的问题,只要我们把HW1.cpp从工程中移除即可(注意是移除,不是删除)。编译成功,如下图所示。
6、至此,工程就建好了,接下来修改student_func.cu中的代码,参考http://blog.csdn.net/suda072605/article/details/17657203,重新编译。
7、为了可以直接在debug版本下输入参数,省去用命令行的麻烦,我们还可以在solution属性中,添加要打开的图片名字,如下图所示。
8、ctrl+F5,执行程序,查看输出。
生成的结果图如下
好了,至此,就完成了在VS2012环境下的所有工作,可以开始尽情编程了!