CUDA5.0+VS2008+VisualAssist安装
转自:http://blog.163.com/qimo601@126/blog/static/15822093201352084242102/
1、软硬件环境
操作系统:Windows7 台式工控机
GPU:Geforce GT420(办公室另外一台台式机的显卡)
开发环境:VisualStudio2008、cuda_5.0.35_winvista_win7_win8_general_32-3、VA_X_Setup1845
2、软件准备
CUDA官方网站https://developer.nvidia.com/cuda-downloads
CUDA5.0安装包下载(CUDA5.0已经集成了,显卡驱动、CUDA ToolKit、 CUDA SDK 代码例子)
VA_X_Setup1845下载
3、安装过程
3.1先安装VS2008,再安装VisualAssist X
VA是为了方便程序编写,不是必须安装。
3.2 CUDA5.0 installer安装过程
直接默认安装,自动安装CUDA Toolkit、CUDA SDK code samples ,和开发者驱动。
CUDAToolkit 默认安装目录:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0
CUDA SDK 的默认安装目录:C:\ProgramData\NVIDIA Corporation\CUDA Samples\v5.0


3.3 配置环境变量
安装完成Toolkit和SDK后,已自动配置好系统环境变量。可以查看系统环境变量,发现自动新建如下变量:
CUDA_PATH = C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\
CUDA_PATH_V5_0 = C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\
NVCUDASAMPLES_ROOT = C:\ProgramData\NVIDIA Corporation\CUDA Samples\v5.0\
NVCUDASAMPLES5_0_ROOT = C:\ProgramData\NVIDIA Corporation\CUDA Samples\v5.0\
NVTOOLSEXT_PATH = C:\Program Files\NVIDIA GPU Computing Toolkit\nvToolsExt\
Path = C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\bin\;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\libnvvp\;C:\Program Files\NVIDIA Corporation\PhysX\Common;C:\Program Files\Intel\iCLS Client\;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\OpenCL SDK\2.0\bin\x86;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;c:\Program Files\Microsoft SQL Server\90\Tools\binn\;C:\Qt\4.7.4\bin

运行CUDA自带的实例,如下错误

3.4 重启计算机,上述问题就不会出错了
在vs2008上建立一个CUDA测试项目

编译成功!

4 CUDA C/C++关键字及函数高亮显示
4.1 .cu 文件中C/C++关键字高亮
这个设置是让Visual Studio2008 在编辑.cu 文件时,把.cu 文件里的C/C++语法高亮。设置方法: 在Visual Studio 2008 的菜单依次选“ Tools|Options|Text Editor|File Extension(工具|选项|文本编辑器|文件扩展名)”,在该窗口中将“Editor(编辑器)”下拉框选择“Microsoft Visual C++”,在“Extension(扩展名)”文本框中输入cu 点击“Add(添加)”按钮,重复工作把cuh 添加为Visual C++类型,添加完成后点击“OK(确定)”按钮,如图1 所示。
重启Visual Studio 2008 后,.cu 文件C++关键字就高亮了。然而此时CUDA的关键字还是黑色的,下一步把CUDA 关键自高亮显示。
4.2 CUDA 关键字高亮设置
为了让CUDA 的关键字,如__device__、dim3 等的文字高亮,需按如下步骤设置:
将C:\ProgramData\NVIDIA Corporation\CUDA Samples\v5.0\doc\syntax_highlighting\visual_studio_8 目录下的usertype.dat 文件复制到C:\Program Files\Microsoft Visual Studio9.0\Common7\IDE\ 目录下( 对x64 位Win7 系统为X:\Program Files(X86)\Microsoft Visual Studio 9.0\Common7\IDE\)。【当然我本机还装有Qt项目,所以我直接把新旧usertype.dat文件合并了。】
重启Visual Studio 2008后打开.cu 文件,CUDA 的关键字应该变成蓝色了。
4.3 CUDA 函数高亮,及CUDA 函数输入代码提示
实现这个功能需要使用Visual Assist X,如果没有安装支持Visual Studio 2008
的Visual Assist X,这部分功能无法实现。这里只是为使编写代码更加方便,对
与CUDA 程序的开发无实质性障碍。
如果已经安装Visual Assist X,可以通过以下两步实现需要的功能。
1)使Visual Assist X 支持CUDA 函数高亮和代码完成
在Visual Studio 2008的菜单里依次选择:“ VAssistX|Visual assist X
Options|Projects|C/C++Directories”,在该界面的“Platform”下拉框中选择Custom,在“Show Directories for”下拉框中选择Other include files, 然后在下面的输入框里,新建、添加如下路径,如图2:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v5.0\common\inc
2)使Visual AssistX 支持.cu 文件
使Visual Assist X 实现.cu 文件高亮和代码完成功能,需要编辑注册表。在修改注册表时,为避免带来不必要的错误请先关闭Visual Studio 2008。使用Win+R组合键打开“运行”窗口,键入入regedit 命令(register edit 的缩写)打开注册表,找到如下位置:HKEY_CURRENT_USER\Software\Whole Tomato\Visual Assist
X\VANet9。在右边找到ExtSource 项目,鼠标右键选修改,在原有文字后添加如下文字:.cu;.cuh; 确定后关闭注册表。重新打开Visual Studio 2008,Visual Assist X 便开始支持.cu 及.cuh 文件的语法高亮及代码完
成。此时.cu 文件的CUDA 函数是高亮的,使用函数名符号就会自动提示函数全称,参数类型等信息。
参考:
1、 CUDA5.0 + Visual Studio 2010 的环境配置
2、 CUDA安装
3、 CUDA的安装
注:CUDA项目测试代码
- #include "cuda_runtime.h"
- #include "device_launch_parameters.h"
-
- #include <stdio.h>
- #include <time.h>
- cudaError_t addWithCuda(int *c, const int *a, const int *b, size_t size);
-
- __global__ void addKernel(int *c, const int *a, const int *b)
- {
- int i = threadIdx.x + blockIdx.x * gridDim.x;
- c[i] = a[i] + b[i] + c[i] ;
-
-
- }
-
- int main()
- {
- const int arraySize = 10000;
- int a[arraySize] = { 1, 2, 3, 4, 5 };
-
-
- int b[arraySize] = { 10, 20, 30, 40, 50 };
-
- for(int i = 0; i < arraySize; i++)
- {
- a[i] = i;
- b[i] = i*10;
- }
-
- int c[arraySize] = { 0 };
-
- clock_t start, finish;
- double duration;
- start = clock();
-
-
- // Add vectors in parallel.
- cudaError_t cudaStatus = addWithCuda(c, a, b, arraySize);
- if (cudaStatus != cudaSuccess) {
- fprintf(stderr, "addWithCuda failed!");
- return 1;
- }
-
- for(int l = 0; l < arraySize; l++)
- printf("c[%d] = %d \n",l,c[l]);
-
- // cudaThreadExit must be called before exiting in order for profiling and
- // tracing tools such as Nsight and Visual Profiler to show complete traces.
- cudaStatus = cudaThreadExit();
- if (cudaStatus != cudaSuccess) {
- fprintf(stderr, "cudaThreadExit failed!");
- return 1;
- }
-
-
- finish = clock();
- duration = (double)(finish - start) / CLOCKS_PER_SEC;
- printf( "%f seconds\n", duration );
-
-
- getchar();
- return 0;
- }
-
- // Helper function for using CUDA to add vectors in parallel.
- cudaError_t addWithCuda(int *c, const int *a, const int *b, size_t size)
- {
- int *dev_a = 0;
- int *dev_b = 0;
- int *dev_c = 0;
- cudaError_t cudaStatus;
-
- // Choose which GPU to run on, change this on a multi-GPU system.
- cudaStatus = cudaSetDevice(0);
- if (cudaStatus != cudaSuccess) {
- fprintf(stderr, "cudaSetDevice failed! Do you have a CUDA-capable GPU installed?");
- goto Error;
- }
-
- // Allocate GPU buffers for three vectors (two input, one output) .
- cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(int));
- if (cudaStatus != cudaSuccess) {
- fprintf(stderr, "cudaMalloc failed!");
- goto Error;
- }
-
- cudaStatus = cudaMalloc((void**)&dev_a, size * sizeof(int));
- if (cudaStatus != cudaSuccess) {
- fprintf(stderr, "cudaMalloc failed!");
- goto Error;
- }
-
-
- cudaStatus = cudaMalloc((void**)&dev_b, size * sizeof(int));
- if (cudaStatus != cudaSuccess) {
- fprintf(stderr, "cudaMalloc failed!");
- goto Error;
- }
-
- // Copy input vectors from host memory to GPU buffers.
- cudaStatus = cudaMemcpy(dev_c, c, size * sizeof(int), cudaMemcpyHostToDevice);
- if (cudaStatus != cudaSuccess) {
- fprintf(stderr, "cudaMemcpy failed!");
- goto Error;
- }
- // Copy input vectors from host memory to GPU buffers.
- cudaStatus = cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);
- if (cudaStatus != cudaSuccess) {
- fprintf(stderr, "cudaMemcpy failed!");
- goto Error;
- }
-
- cudaStatus = cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);
- if (cudaStatus != cudaSuccess) {
- fprintf(stderr, "cudaMemcpy failed!");
- goto Error;
- }
-
- // Launch a kernel on the GPU with one thread for each element.
- addKernel<<<100, 100>>>(dev_c, dev_a, dev_b);
-
- // cudaThreadSynchronize waits for the kernel to finish, and returns
- // any errors encountered during the launch.
- cudaStatus = cudaThreadSynchronize();
- if (cudaStatus != cudaSuccess) {
- fprintf(stderr, "cudaThreadSynchronize returned error code %d after launching addKernel!\n", cudaStatus);
- goto Error;
- }
-
- // Copy output vector from GPU buffer to host memory.
- cudaStatus = cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);
- if (cudaStatus != cudaSuccess) {
- fprintf(stderr, "cudaMemcpy failed!");
- goto Error;
- }
-
-
-
- Error:
- cudaFree(dev_c);
- cudaFree(dev_a);
- cudaFree(dev_b);
-
- return cudaStatus;
- }