您的位置:首页 > 其它

CUDA在VS2010下5.5设置

2015-05-01 19:22 190 查看
在开始学习之前,首先要做的就是找到一本好的教材,要知道一本好的教材可以让我们更加轻松地入门。在看了一些个CUDA编程相关的教材之后,我向大家推荐的一本教材叫做《GPU高性能编程CUDA实战》。本教材相比其他的教材而言,它讲得比较细,对于一些我们可能不太明白的知识点做了详细的说明。而且这本教材以层层深入的方式向我们展示了GPU的世界,从而引领我们进入CUDA编程的大门。其他的教材的话我建议的是《深入浅出谈CUDA》以及《CUDA编程指南》,前一本书可以和《GPU高性能编程CUDA实战》这本书一起看,我建议先看《深入浅出谈CUDA》,然后再看《GPU高性能编程CUDA实战》,这样理解起来能够更加的透彻。

介绍完了教材,接下来我们就可以进入CUDA的世界了。首先就是需要一个具有NVIDIA显卡的电脑,因为CUDA只能够支持NVIDIA的显卡,其他的显卡(例如ATI)是不能够进行CUDA编程的。有了硬件平台,接下来我们需要的就是编程环境了。由于本人是在windows下进行的学习,所以我推荐的是VS2010+CUDA 5.5。VS2010的下载与安装这里就不再赘述,CUDA5.5是集成的CUDA ToolKit和SDK于一身的软件,可以到NVIDIA Developer Zone去下载,下载地址https://developer.nvidia.com/cuda-downloads,有了工具我们就可以进行CUDA编程了。

CUDA安装好之后,就可以配置VS2010的cuda环境了,此时cuda已经和你的vs绑定好了。于是我们就可以开始我们的第一个cuda程序:

1.创建一个cuda项目

由于安装cuda5.5的时候已经和vs2010绑定,所以直接可以创建一个cuda项目。选择cuda 5.5 runtime就可以。

此时vs2010会自动为这个项目添加一个cuda程序:kernel.cu。直接编译这个.cu文件,可能会出现"转换到 COFF 期间失败: 文件无效或损坏"这样的错误信息,修改如下所示:

右键->工程属性->配置属性-> 清单工具->输入和输出->嵌入清单,选择[否]。

2.CUDA C/C++关键字和函数高亮显示

在上面.cu文件中发现CUDA C/C++的关键字__global__等没有高亮显示,而且还有下划曲线。下面进行CUDA C/C++关键字和函数的语法高亮显示,配置Visual AssistX 函数高亮,代码提示等功能。

下面是关于代码高亮的设置。共三个设置

2.1.cu文件中C/C++关键字高亮

这个设置是让VS2010编辑.cu文件时,把.cu文件里的C/C++语法高亮。

设置方法: 在VS2010的菜单 依次点击:“工具|选项|文本编辑器|文件扩展名”,在这个界面里: “编辑器”下拉框选“Microsoft Visual C++”,在“Extension”文本框输入.cu 点击“添加”按钮 ,重复工作把.cuh 添加为vc++类型,点击确定按钮。 把全部.cu文件关闭,再打开,.cu文件C++关键字就高亮了。如果不行就重启VS2010。但是CUDA的关键字还是黑色的,下一步把CUDA关键自高亮显示。

2.2.CUDA关键字高亮

为了让CUDA的关键字,如__device__、dim3之类的文字高亮,需要如下步骤:

把SDK_PATH\C\doc\syntax_highlighting\usertype.dat复制到X:\Program Files (X86)\Microsoft Visual Studio 10.0\Common7\IDE\ 目录下

这里 X:是安装VS2010盘符,这是win7 64位下的路径。

注意:win7 64系统不要复制到这个目录里,复制到这里是不会CUDA关键字高亮的:

X:\Program Files \Microsoft Visual Studio 10.0\Common7\IDE\

(如果你的win7是32位的,可能正好是上面这个目录,应该会高亮的,这是win7 64位和32位的差别)

再次强调:SDK_PATH要换成你安装SDK的实际路径,不要直接使用这个字符串。

VS2010需要重启,重启后打开.cu文件,CUDA的关键字应该变成蓝色了。

2.3. CUDA 函数高亮,及CUDA函数输入代码提示

实现这个功能就要使用VAssistX了。 首先安装支持VS2010的Visual AssistX, 在CUDA 安装前、后安装都行。需要两步实现需要的功能:

a) 让Visual AssistX支持CUDA函数高亮和代码完成。在VS2010菜单里依次点击: “VAssistX->Visual assist X Options->Projects->C/C++Directories”在这个界面的 “Platform”下拉框选 Custom,在“Show Directories for..“下拉框选 Other include files, 然后在下面的输入框里,新建、添加三个路径,点击确定,三个路径分别如下:

SDK_PATH的\c\common\inc

SDK_PATH的\shared\inc

X:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\include

这里SDK_PATH要用你安装的SDK路径代替,X:是你的CUDA toolkit安装盘符。

这样分别在这三个目录里面的.h文件定义的函数和类型VAssistX会帮我们在编辑文件时候实现高亮和完成代码。如果少包含一个路径,这个目录里的.h定义的函数和类型就不会高亮和提示了。

b)让Visual AssistX支持.cu文件,也就让Visual AssistX帮我们实现.cu文件高亮和代码完成功能,需要编辑注册表。首先关闭VS2010,点击开始菜单输入regedit打开注册表,找到如下位置:HKEY_CURRENT_USER\Software\Whole Tomato\Visual Assist X\VANet10。在右边找到ExtSource项目,鼠标右键选修改,在原有文字后添加如下文字:.cu;.cuh; 确定后

关闭注册表,重新打开vs2010,Visual AssistX开始支持.cu及.cuh文件的语法高亮及代码完成。此时.cu文件的CUDA函数是高亮的,使用函数名符号就会自动提示函数全称,参数类型等信息了。

经过上面的安装,开发程序应该没问题了,但会发现有如下的问题:

1. VS2010显示.cu文件时,有很多CUDA函数下有波浪线

2. 在.cu文件里使用VS2010的“Go to definition”功能查无法找到CUDA函数的定义。

这两个问题的原因是VS2010不认识这些函数,没有指定它们在那个头文件里包含的。解决方法其实是一样的,把CUDA tookit 和CUDA SDK的头文件路径加到VS2010的VC++目录里面。

CUDA编程主要做的就是和GPU打交道,在和这样的一个陌生的家伙交流之前,我们需要做的就是先得认识和熟悉这个家伙。

在深入研究如何编写设备代码之前,我们需要通过某种机制来判断计算机中当前有哪些设备,以及每个设备都支持哪些功能。幸运的是,可以通过一个非常简单的接口来获得这种信息。首先,我们希望知道在系统中有多少个设备是支持CUDA架构的,并且这些设备能够运行基于CUDA C编写的核函数。要获得CUDA设备的数量.可以调用cudaGetDeviceCount()。这个函数的作用从色的名字就可以看出来。在调用cudaGetDeviceCount()后,可以对每个设备进行迭代、井查询各个设备的相关信息。CUDA运行时将返回一个cudaDevice
Prop类型的结构,其中包含了设备的相关属性。我们可以获得哪些属性?从CUDA 3.0开始,在cudaDeviceProp结构中包含了以下信息:

[cpp] view
plaincopy

struct cudaDeviceProp

{

char name[256]; //标识设备的ASCII字符串

size_t totalGlobalMem; //设备上全局内存的总量,单位为字节

size_t sharedMemPerBlock; //在一个线程块(Block)中可使用的共享内存总量,单位为字节

int regsPerBlock; //每个线程块中可用的32位寄存器数量

int warpSize; //在一个线程束(warp)中包含的线程数量

size_t memPitch; /在内存复制中最大的修正量(Pitch),单位为字节

int maxThreadsPerBlock; //在一个线程块中包含的最大线程数目

int maxThreadsDim[3]; //在多维线程块数组中,每一维包含的最大线程数量

int maxGridSize [3]; //在一个线程格(Grid)中,每一维可以包含的线程块的数量

size_t totalConstMem; //常量内存的总量

int major; //设备计算功能集的主版本号

int minor; //设备计算功能集的次版本号

int clockRate; //

size_t textureAlignment; //设备的纹理对齐要求

int deviceoverlap; //一个布尔类型值,表示设备是否可以同时执行一个cudaMemory()调用和一个核函数调用

int multiProcessorCount; //设备上多处理器的数量

int kernelExecTimeoutEnabled; //一个布尔值,表示该设备上执行的核函数是否存在运行时限制

int integrated; //一个布尔值,表示设备是否是一个集成的GPU

int canMapHostMemory; //一个布尔值,表示设备是否将主机内存映射到cuda设备地址空间

int computeMode; //表示设备的计算模式:默认,独占或禁止

int maxTexture1D; //一维纹理的最大大小

int maxTexture2D[2]; //二维纹理的最大维数

int maxTexture3D[3]; //三维纹理的最大维数

int maxTexture2DArray[3]; //二维纹理数组的最大维数

int concurrentKernels ; //一个布尔值,表示设备是否支持在同一个上下文中同时执行多个核函数

};

设备属性的使用

通过上面的结构体,我们大致了解了设备的属性,然后我们就可以通过这个结构体来查询设备属性了。可能会有人问,到底我们需要这些设备属性来干嘛,别着急,以后在编写相关性能优化的代码的时候,就知道了解这些属性的好处了。现在我们只需要知道方法就可以了。

首先我们可以通过两个函数,第一个就是上面的cudaGetDeviceCount()来选择设备,然后循环地通过getDeviceProperties()来获得设备的属性,之后我们就可以通过这样的一个结构体变量将设备的属性值获取出来。

[cpp] view
plaincopy

#include <cuda_runtime.h>

#include <iostream>

using namespace std;

int main()

{

cudaDeviceProp prop;

int count;

cudaGetDeviceCount(&count);

for(int i = 0 ; i < count ; i++)

{

cudaGetDeviceProperties(&prop,i);

cout<<"the information for the device : "<<i<<endl;

cout<<"name:"<<prop.name<<endl;

cout<<"the memory information for the device : "<<i<<endl;

cout<<"total global memory:"<<prop.totalGlobalMem<<endl;

cout<<"total constant memory:"<<prop.totalConstMem<<endl;

cout<<"threads in warps:"<<prop.warpSize<<endl;

cout<<"max threads per block:"<<prop.maxThreadsPerBlock<<endl;

cout<<"max threads dims:"<<prop.maxThreadsDim[0]<<" "<<prop.maxThreadsDim[1]<<

" "<<prop.maxThreadsDim[2]<<endl;

cout<<"max grid dims:"<<prop.maxGridSize[0]<<" "<<

prop.maxGridSize[1]<<" "<<prop.maxGridSize[2]<<endl;

}

return 0;

}

我这边只是获取一部分的属性值,只是和大家介绍一下,具体的属性值可以按照这样的方法来获取。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: