os:windows7
显卡:Quad 600
vs2010
其他版本的安装配置过程类似。
1.查看本机配置,查看显卡类型是否支持NVIDIA GPU选中计算机-->右键属性-->设备管理器-->显示适配器:CUDA GPUs可以查到相应显卡的compute capability;
2.下载对应的cuda toolkit:cuda7.5工具包中已经包含了显卡驱动和sdk了。
CUDA Toolkit本次安装下载了cuda_7.5.18_windows.exe
默认安装路径可能是 例如:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0,记这个路径为SDK_PATH.
3.安装cuda toolkit
选择自定义安装,全选,中间会设置三个路径,根据自己的情况设置:
cuda toolkit:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5
cuda samples:C:\ProgramData\NVIDIA Corporation\CUDA Samples\v7.5
cuda document:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5
CUDA工具包安装完成后,我们还需要确认,CUDA是否已经正确安装,我们可以先检查nvcc编译器是否正确安装,在命令提示符窗口中输入:nvcc -V,回车查看是否有版本信息。若出现版本信息,则证明nvcc安装成功,如下图所示:
4.进入C:\ProgramData\NVIDIA Corporation\CUDA Samples\v7.5文件夹,选择Samples_vs2010.sln进行编译,然后打开C:\ProgramData\NVIDIA Corporation\CUDA Samples\v7.5\bin\win64\Release目录,打开cmd命令行,执行deviceQuery.exe会显示GPU显卡、CUDA版本等相关信息,最后一行显示:Result = PASS;说明安装成功。 注意:ProgramData这个文件是隐藏文件。
5.配置vs 2010
(1)启动vs 2010,选择win32控制台应用程序,空项目,添加cuda源文件
(2)右键项目,生成自定义,选择cuda7.5
(3)右键项目》属性》配置属性》链接器》常规》附加库目录
添加:$(CUDA_PATH_V7_5)\lib\$(Platform)
(4)右键项目》属性》配置属性》链接器》输入》附加依赖项
添加:cudart.lib
(5)右键点击源文件》属性》项类型》cuda c/c++
至此,设置完毕,也可以新建项目时直接选择cuda项目。
6.设置高亮
(1)设置c/c++关键字高亮
设置方法: 在VS2010的菜单 依次点击:“工具|选项|文本编辑器|文件扩展名”,在这个界面里: “编辑器”下拉选“Microsoft Visual C++”,在“Extension”文本框输入.cu 点击“添加”按钮 ,重复工作把.cuh 添加为vc++类型,点击确定按钮。 把全部.cu文件关闭,再打开,.cu文件C++关键字就高亮了。如果不行就重启VS2010。但是CUDA的关键字还是黑色的,下一步把CUDA关键自高亮显示。
(2)设置cuda关键字高亮
1、.cu文件中C/C++关键字高亮
这个设置是为了当编辑.cu文件时,让Visual Studio 2010把.cu文件里的C/C++语法高亮。其他的Visual Studio 2012、Visual Studio 2013也与此类似。
设置方法:
在Visual Studio 2010的菜单栏中,依次点击Tools > Options… > Text Editor > File Extension,在这个界面里的“Editor”下拉菜单中选“Microsoft Visual C++”,在“Extension”文本框里输入.cu,然后点击“Add”。相同的操作,把.cuh添加为“Microsoft Visual C++”。把全部.cu文件关闭,再打开,.cu文件中的C/C++关键字就高亮了。如果不行就重启Visual Studio 2010。但是CUDA的关键字还是黑色的,下一步把CUDA关键字高亮显示。
2、CUDA关键字高亮
为了让CUDA中的关键字,如__global__、__device__、dim3等之类的文字高亮,需要如下操作:
把“SDK_PATH\C\doc\syntax_highlighting\usertype.dat”该文件复制到“X:\Program Files (X86)\Microsoft Visual Studio 10.0\Common7\IDE\”目录下
这里“X:”指的是安装Visual Studio 2010的盘符。注意,这是针对WIN7 64位的情况。注意区别,在WIN7 64位系统下,不要复制到“X:\Program Files \Microsoft Visual Studio 10.0\Common7\IDE\”这个目录里,复制到这里CUDA关键字是不会高亮的。而如果你的WIN7是32位的,则可能正好是“X:\Program Files \Microsoft Visual Studio 10.0\Common7\IDE\”这个目录(因为32位下也只有这个目录),复制到这个目录下应该会高亮的(我没试过)。
再次强调:SDK_PATH要换成你安装SDK的实际路径,不要直接使用这个字符串。
还有种情况是,6.0版本的CUDA安装完成后貌似没有“usertype.dat”这个文件(我的CUDA7.5就是这种情况),这样便无法用上面的方法来操作了。看到网上有人提到,usertype.dat文件里面就是一堆CUDA扩展的关键字,如__global__、__host__、__device__、__constant__、__shared__、gridDim、blockIdx、blockDim、threadIdx、char1、char2等等。这样的话,一个解决方案就是,直接用低版本里的usertype.dat文件,而另外一个解决办法,就是自己直接写一个usertype.dat文件,这样可以随意添加遇到的关键字,方法就是:新建一个txt文档,按一个关键字一行的方式,把所有自己想高亮的关键字手动敲进去,完了把后缀.txt改为.dat即可。
按上述方法将usertype.dat放到指定目录下后,重启Visual Studio 2010,重新打开.cu文件,CUDA的关键字应该就高亮成蓝色的了。
3、CUDA 函数高亮及CUDA函数输入代码提示
实现这个功能就要使用VAssistX了。首先安装支持Visual Studio 2010的VAssistX。这个可以在CUDA安装前、后安装都行。
让VAssistX支持.cu文件,也就是当编辑.cu文件时,VAssistX帮我们实现高亮和代码完成功能
这个需要编辑注册表了。
首先关闭Visual Studio 2010,然后使用regedit打开注册表,找到如下位置:
HKEY_CURRENT_USER\Software\Whole Tomato\Visual Assist X\VANet10
在右边找到“ExtSource”项目,鼠标右键选修改,在原有文字后添加如下文字:.cu;.cuh;,确定后关闭注册表,重新打开Visual Studio 2010,VAssistX开始支持.cu及.cuh文件的语法高亮及代码完成。此时.cu文件了的CUDA函数是高亮的,使用函数名符号就会自动提示函数全称、参数类型等信息了。
但是红色波浪线也有可能是ASSIST X的UNDERLINE设置错误造成的,解决方法如下:
在VAssistX菜单栏 > Visual Assist X Options > 展开Advanced > Underlines > 把underlines spelling errors in comments and strings using的勾去掉就行
另外,我设置完之后仍然发现__global__有波浪线,不过相应的包含这两个头文件就行了:
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
(3)设置vassistx
http://ju.outofmemory.cn/entry/97435
7. 跑一个最简单的Cuda程序
好,现在我们先来看一个最简单的Cuda程序。就像你们学习C语言的时候,直接运行里一个打印“Hello,world”的程序之后老师才会开始跟你解释,我们边练边学。
#include __global__ void vector_add(const int *a, const int *b, int *c) { *c = *a + *b; } int main(void) { const int a = 2, b = 5; int c = 0; int *dev_a, *dev_b, *dev_c; cudaMalloc((void **)&dev_a, sizeof(int)); cudaMalloc((void **)&dev_b, sizeof(int)); cudaMalloc((void **)&dev_c, sizeof(int)); cudaMemcpy(dev_a, &a, sizeof(int), cudaMemcpyHostToDevice); cudaMemcpy(dev_b, &b, sizeof(int), cudaMemcpyHostToDevice); vector_add<<<1, 1>>>(dev_a, dev_b, dev_c); cudaMemcpy(&c, dev_c, sizeof(int), cudaMemcpyDeviceToHost); printf("%d + %d = %d, Is that right?\n", a, b, c); cudaFree(dev_a); cudaFree(dev_b); cudaFree(dev_c); return 0; }
先用nsight创建一个Cuda运行时项目,然后把代码抄进去,运行一下。
如果你喜欢命令行的方式,你可以把代码抄进一个文本里面,命名为vector_add.cu
,然后执行命令nvcc vector_add.cu
,然后执行编译生成的a.out
文件。
没错,nvcc就像gcc一样用,大多数功能都是相同的,至于.cu
这个后缀,这仅仅是个为了说明这是个cuda的程序而已。如果顺利的话,你应该会得到这样的结果输出
2 + 5 = 7. Is that right?
没错,得到这样的结果就说明的Cuda程序已经可以正确运行了。
现在,让我们来分析一下,上面的代码究竟做了些什么东西。
/* * 为了方便起见,我甚至把一些出错判断都去掉了。 * 比如申请内存空间,谁都没法保证内存一定有空间给你申请的不是吗? * 之所以这样,是为了方便我们看清楚一个基本的cuda程序的执行流程。 */ #include /* * 这个是要放在显卡上面跑的函数,除了前面多了一个__global__之外, * 这个函数其实很简单不是吗? */ __global__ void vector_add(const int *a, const int *b, int *c) { *c = *a + *b; } int main(void) { //这里定义了三个整形变量a,b和c。他们位于主存上。 const int a = 2, b = 5; int c = 0; //这里定义了三个整形指针。为什么要用指针? //因为这是在显存上申请空间,对于主机来说,它只能也只需要知道一个映射的地址就够了。 int *dev_a, *dev_b, *dev_c; //为三个指针申请显存空间,虽然只是一个int,4个字节的大小。 cudaMalloc((void **)&dev_a, sizeof(int)); cudaMalloc((void **)&dev_b, sizeof(int)); cudaMalloc((void **)&dev_c, sizeof(int)); //将内存上的数据复制到显存上,这里复制了a和b两个加数。 cudaMemcpy(dev_a, &a, sizeof(int), cudaMemcpyHostToDevice); cudaMemcpy(dev_b, &b, sizeof(int), cudaMemcpyHostToDevice); //调用那个要在显卡上面执行的函数。还记得main前面的那个函数么? vector_add<<<1, 1>>>(dev_a, dev_b, dev_c); //这里把dev_c上面的值复制到内存的变量c上。 cudaMemcpy(&c, dev_c, sizeof(int), cudaMemcpyDeviceToHost); //输出结果 printf("%d + %d = %d, Is that right?\n", a, b, c); //释放显存 cudaFree(dev_a); cudaFree(dev_b); cudaFree(dev_c); return 0; }
这就是一个简单的Cuda程序流程,在主机上准备好数据,然后把数据送到显卡,显卡处理好数据后,再把显卡送回到主机内存上。这个例子非常简单,相信如果你写过几个C语言的程序,很容易就看懂这段代码,毕竟有个几个函数,除了过了个cuda前缀之外,和平常使用的没有很多差别。
reference:
[1] http://www.jianshu.com/p/4fc2b3da2e3d
[2] https://bingliu221.gitbooks.io/learn-cuda-the-simple-way/content/chapter2.html