CUDA5.0+VS2008+VisualAssist安装

CUDA5.0+VS2008+VisualAssist安装

转自:http://blog.163.com/qimo601@126/blog/static/15822093201352084242102/

1、软硬件环境

    操作系统:Windows7 台式工控机

    GPU:Geforce GT420(办公室另外一台台式机的显卡)

    开发环境:VisualStudio2008cuda_5.0.35_winvista_win7_win8_general_32-3VA_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项目测试代码
  1. #include "cuda_runtime.h"  
  2. #include "device_launch_parameters.h"  
  3.   
  4. #include   
  5. #include    
  6. cudaError_t addWithCuda(int *c, const int *a, const int *b, size_t size);  
  7.   
  8. __global__ void addKernel(int *c, const int *a, const int *b)  
  9. {  
  10.     int i = threadIdx.x + blockIdx.x * gridDim.x;  
  11.     c[i] = a[i] + b[i] + c[i] ;  
  12.           
  13.       
  14. }  
  15.   
  16. int main()  
  17. {  
  18.     const int arraySize = 10000;  
  19.     int a[arraySize] = { 1, 2, 3, 4, 5 };  
  20.       
  21.       
  22.     int b[arraySize] = { 10, 20, 30, 40, 50 };  
  23.       
  24.     for(int i = 0; i < arraySize; i++)  
  25.     {  
  26.         a[i] = i;  
  27.         b[i] = i*10;  
  28.     }  
  29.           
  30.     int c[arraySize] = { 0 };  
  31.    
  32.     clock_t start, finish;    
  33.     double duration;     
  34.     start = clock();    
  35.      
  36.       
  37.     // Add vectors in parallel.  
  38.     cudaError_t cudaStatus = addWithCuda(c, a, b, arraySize);  
  39.     if (cudaStatus != cudaSuccess) {  
  40.         fprintf(stderr, "addWithCuda failed!");  
  41.         return 1;  
  42.     }  
  43.   
  44.     for(int l = 0; l < arraySize; l++)  
  45.         printf("c[%d] = %d \n",l,c[l]);  
  46.   
  47.     // cudaThreadExit must be called before exiting in order for profiling and  
  48.     // tracing tools such as Nsight and Visual Profiler to show complete traces.  
  49.     cudaStatus = cudaThreadExit();  
  50.     if (cudaStatus != cudaSuccess) {  
  51.         fprintf(stderr, "cudaThreadExit failed!");  
  52.         return 1;  
  53.     }  
  54.   
  55.   
  56.     finish = clock();    
  57.     duration = (double)(finish - start) / CLOCKS_PER_SEC;    
  58.     printf( "%f seconds\n", duration );   
  59.       
  60.       
  61.     getchar();  
  62.     return 0;  
  63. }  
  64.   
  65. // Helper function for using CUDA to add vectors in parallel.  
  66. cudaError_t addWithCuda(int *c, const int *a, const int *b, size_t size)  
  67. {  
  68.     int *dev_a = 0;  
  69.     int *dev_b = 0;  
  70.     int *dev_c = 0;  
  71.     cudaError_t cudaStatus;  
  72.   
  73.     // Choose which GPU to run on, change this on a multi-GPU system.  
  74.     cudaStatus = cudaSetDevice(0);  
  75.     if (cudaStatus != cudaSuccess) {  
  76.         fprintf(stderr, "cudaSetDevice failed!  Do you have a CUDA-capable GPU installed?");  
  77.         goto Error;  
  78.     }  
  79.   
  80.     // Allocate GPU buffers for three vectors (two input, one output)    .  
  81.     cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(int));  
  82.     if (cudaStatus != cudaSuccess) {  
  83.         fprintf(stderr, "cudaMalloc failed!");  
  84.         goto Error;  
  85.     }  
  86.   
  87.     cudaStatus = cudaMalloc((void**)&dev_a, size * sizeof(int));  
  88.     if (cudaStatus != cudaSuccess) {  
  89.         fprintf(stderr, "cudaMalloc failed!");  
  90.         goto Error;  
  91.     }  
  92.   
  93.       
  94.     cudaStatus = cudaMalloc((void**)&dev_b, size * sizeof(int));  
  95.     if (cudaStatus != cudaSuccess) {  
  96.         fprintf(stderr, "cudaMalloc failed!");  
  97.         goto Error;  
  98.     }  
  99.   
  100.     // Copy input vectors from host memory to GPU buffers.  
  101.     cudaStatus = cudaMemcpy(dev_c, c, size * sizeof(int), cudaMemcpyHostToDevice);  
  102.     if (cudaStatus != cudaSuccess) {  
  103.         fprintf(stderr, "cudaMemcpy failed!");  
  104.         goto Error;  
  105.     }  
  106.     // Copy input vectors from host memory to GPU buffers.  
  107.     cudaStatus = cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);  
  108.     if (cudaStatus != cudaSuccess) {  
  109.         fprintf(stderr, "cudaMemcpy failed!");  
  110.         goto Error;  
  111.     }  
  112.   
  113.     cudaStatus = cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);  
  114.     if (cudaStatus != cudaSuccess) {  
  115.         fprintf(stderr, "cudaMemcpy failed!");  
  116.         goto Error;  
  117.     }  
  118.   
  119.     // Launch a kernel on the GPU with one thread for each element.  
  120.     addKernel<<<100, 100>>>(dev_c, dev_a, dev_b);  
  121.   
  122.     // cudaThreadSynchronize waits for the kernel to finish, and returns  
  123.     // any errors encountered during the launch.  
  124.     cudaStatus = cudaThreadSynchronize();  
  125.     if (cudaStatus != cudaSuccess) {  
  126.         fprintf(stderr, "cudaThreadSynchronize returned error code %d after launching addKernel!\n", cudaStatus);  
  127.         goto Error;  
  128.     }  
  129.   
  130.     // Copy output vector from GPU buffer to host memory.  
  131.     cudaStatus = cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);  
  132.     if (cudaStatus != cudaSuccess) {  
  133.         fprintf(stderr, "cudaMemcpy failed!");  
  134.         goto Error;  
  135.     }  
  136.   
  137.   
  138.       
  139. Error:  
  140.     cudaFree(dev_c);  
  141.     cudaFree(dev_a);  
  142.     cudaFree(dev_b);  
  143.       
  144.     return cudaStatus;  
  145. }  

你可能感兴趣的:(C,CUDA,VS2008,VisualAssist,C/C++,MFC)