zoukankan      html  css  js  c++  java
  • CUDA编程之环境配置

    VS2015+CUDA8.0环境配置

    Anyway,在这里记录下正确的配置方式:

    1、首先,上官网下载对应vs版本的CUDA toolkit:

    https://developer.nvidia.com/cuda-toolkit-50-archive

    (记住vs2010对应CUDA5.0,vs2013对应CUDA7.5,vs2015对应CUDA8.0)

    2、接着,直接安装,记得在安装过程中如果你不想换你原有的显卡驱动的话,就选择自定义不安装driver;否则如果你直接选“精简”又不安装驱动,则CUDA安装无法成功。

    3、安装完成之后,进入C:Program FilesNVIDIA GPU Computing ToolkitCUDAv8.0 之后可以看到有好几个文件夹:bin、lib 、include等等,这就表明安装成功了

    4、接下来,看看如何创建一个利用cuda编程的项目,打开vs创建项目时,你可以看到有了新的项目类型:

    但是我们这里教你如何在一个空项目中编译cu文件,所以我们还是 创建一个vc++的空项目,接着创建一个新的cpp文件和cu文件

    test.cpp代码如下:

    [cpp] view plain copy
     
    1. #include <time.h>  
    2. #include <stdlib.h>  
    3. #include <stdio.h>  
    4.   
    5. //这里不要忘了加引用声明  
    6. extern "C" void MatrixMultiplication_CUDA(const float* M, const float* N, float* P, int Width);  
    7.   
    8. //构造函数...  
    9. //析构函数...  
    10.   
    11. // 产生矩阵,矩阵中元素0~1  
    12. void matgen(float* a, int Width)  
    13. {  
    14.     int i, j;  
    15.     for (i = 0; i < Width; i++)  
    16.     {  
    17.         for (j = 0; j < Width; j++)  
    18.         {  
    19.             a[i * Width + j] = (float)rand() / RAND_MAX + (float)rand() / (RAND_MAX*RAND_MAX);  
    20.         }  
    21.     }  
    22. }  
    23.   
    24. //矩阵乘法(CPU验证)  
    25. void MatrixMultiplication(const float* M, const float* N, float* P, int Width)  
    26. {  
    27.     int i, j, k;  
    28.     for (i = 0; i < Width; i++)  
    29.     {  
    30.         for (j = 0; j < Width; j++)  
    31.         {  
    32.             float sum = 0;  
    33.             for (k = 0; k < Width; k++)  
    34.             {  
    35.                 sum += M[i * Width + k] * N[k * Width + j];  
    36.             }  
    37.             P[i * Width + j] = sum;  
    38.         }  
    39.     }  
    40. }  
    41.   
    42. double MatrixMul_GPU()  
    43. {  
    44.     float *M, *N, *Pg;  
    45.     int Width = 1024;   //1024×1024矩阵乘法  
    46.     M = (float*)malloc(sizeof(float)* Width * Width);  
    47.     N = (float*)malloc(sizeof(float)* Width * Width);  
    48.     Pg = (float*)malloc(sizeof(float)* Width * Width); //保存GPU计算结果  
    49.   
    50.     srand(0);  
    51.   
    52.     matgen(M, Width);           //产生矩阵M  
    53.     matgen(N, Width);           //产生矩阵N  
    54.   
    55.     double timeStart, timeEnd;  //定义时间,求时间差用  
    56.     timeStart = clock();  
    57.     MatrixMultiplication_CUDA(M, N, Pg, Width);         //GPU上计算  
    58.     timeEnd = clock();  
    59.   
    60.     free(M);  
    61.     free(N);  
    62.     free(Pg);  
    63.     return timeEnd - timeStart;  
    64. }  
    65.   
    66. double MatrixMul_CPU()  
    67. {  
    68.     float *M, *N, *Pc;  
    69.     int Width = 1024;   //1024×1024矩阵乘法  
    70.     M = (float*)malloc(sizeof(float)* Width * Width);  
    71.     N = (float*)malloc(sizeof(float)* Width * Width);  
    72.     Pc = (float*)malloc(sizeof(float)* Width * Width);  //保存CPU计算结果  
    73.   
    74.     srand(0);  
    75.   
    76.     matgen(M, Width);           //产生矩阵M  
    77.     matgen(N, Width);           //产生矩阵N  
    78.   
    79.     double timeStart, timeEnd; //定义时间,求时间差用  
    80.     timeStart = clock();  
    81.     MatrixMultiplication(M, N, Pc, Width);              //CPU上计算  
    82.     timeEnd = clock();  
    83.   
    84.     free(M);  
    85.     free(N);  
    86.     free(Pc);  
    87.     return timeEnd - timeStart;  
    88. }  
    89.   
    90. //////////////////////////////////////////////////////////////////////////  
    91. int main()  
    92. {  
    93.     printf("CPU use time %g ", MatrixMul_CPU());  
    94.     printf("GPU use time %g ", MatrixMul_GPU());  
    95.     system("pause");  
    96.     return 0;  
    97. }  
     

    test.cu代码如下:

    [cpp] view plain copy
     
    1. ////CUDAtest.cu  
    2.   
    3. #include "cuda_runtime.h"    
    4. #include "device_launch_parameters.h"  
    5.   
    6. #define TILE_WIDTH 16  
    7.   
    8. // 核函数  
    9. // __global__ static void MatrixMulKernel(const float* Md,const float* Nd,float* Pd,int Width)  
    10. __global__ void MatrixMulKernel(const float* Md, const float* Nd, float* Pd, int Width)  
    11. {  
    12.     //计算Pd和Md中元素的行索引  
    13.     int Row = blockIdx.y * TILE_WIDTH + threadIdx.y; //行  
    14.     int Col = blockIdx.x * TILE_WIDTH + threadIdx.x; //列  
    15.   
    16.     float Pvalue = 0.0;  
    17.     for (int k = 0; k < Width; k++)  
    18.     {  
    19.         Pvalue += Md[Row * Width + k] * Nd[k * Width + Col];  
    20.     }  
    21.     //每个线程负责计算P中的一个元素  
    22.     Pd[Row * Width + Col] = Pvalue;  
    23. }  
    24.   
    25. // 矩阵乘法(CUDA中)  
    26. // 在外部调用,使用extern  
    27. extern "C" void MatrixMultiplication_CUDA(const float* M, const float* N, float* P, int Width)  
    28. {  
    29.     cudaSetDevice(0);  //设置目标GPU   
    30.   
    31.     float *Md, *Nd, *Pd;  
    32.     int size = Width * Width * sizeof(float);//字节长度  
    33.   
    34.     cudaMalloc((void**)&Md, size);  
    35.     cudaMalloc((void**)&Nd, size);  
    36.     cudaMalloc((void**)&Pd, size);  
    37.   
    38.     //Copies a matrix from the memory* area pointed to by src to the memory area pointed to by dst  
    39.     cudaMemcpy(Md, M, size, cudaMemcpyHostToDevice);  
    40.     cudaMemcpy(Nd, N, size, cudaMemcpyHostToDevice);  
    41.   
    42.     //  
    43.     dim3 dimGrid(Width / TILE_WIDTH, Width / TILE_WIDTH);   //网格的维度  
    44.     dim3 dimBlock(TILE_WIDTH, TILE_WIDTH);                  //块的维度  
    45.     MatrixMulKernel <<< dimGrid, dimBlock >>>(Md, Nd, Pd, Width);  
    46.   
    47.     cudaMemcpy(P, Pd, size, cudaMemcpyDeviceToHost);  
    48.     //释放设备上的矩阵  
    49.     cudaFree(Md);  
    50.     cudaFree(Nd);  
    51.     cudaFree(Pd);  
    52. }  


    接下来就是第三方库的链接了,首先呢,你得右击项目,打开项目属性

    分别在可执行文件目录下输入:C:Program FilesNVIDIA GPU Computing ToolkitCUDAv8.0in

    在包含目录下输入:C:Program FilesNVIDIA GPU Computing ToolkitCUDAv8.0include

    在库目录下输入:C:Program FilesNVIDIA GPU Computing ToolkitCUDAv8.0libWin32

    之后在链接器/输入/附加依赖项中输入:C:Program FilesNVIDIA GPU Computing ToolkitCUDAv8.0libWin32目录下的所有lib文件的文件名

    这时,如果你急于立马编译的话,你就会发现报错了:大致的意思是extern修饰的函数被应用,无法解析的外部命令

    因为这时其实编译器没有编译cu文件,所以cpp文件中无法引用cu文件里的函数。

    最关键的一步来了:

    右击项目,点击生成依赖 项,选择“生成自定义”,然后勾选cuda


    之后右击test.cu文件打开属性,修改“项目类型”如下:


    大功告成,愉快的调试吧

  • 相关阅读:
    JDK 5 ~ 10 新特性倾情整理!
    软件设计师-面向对象
    软件设计师-系统开发基础
    软件设计师-网络与信息安全
    软件设计师-数据库系统
    软件设计师-操作系统
    软件设计师-计算机系统知识
    DbParameter
    软件设计师-算法
    android studio快捷键
  • 原文地址:https://www.cnblogs.com/lyx2018/p/7840325.html
Copyright © 2011-2022 走看看