VS2013+CUDA7.5配置

来源:互联网 发布:如何投诉网络运营商 编辑:程序博客网 时间:2024/05/16 00:29
  电脑配置:

    系统:WIN10 64位

    开发平台:VS 2013

    显卡:英伟达G卡

    CUDA版本:7.5

1.安装最新版CUDA
   https://developer.nvidia.com/cuda-downloads
   默认安装在C盘

2.配置环境变量
      
        CUDA_SDK_PATH = C:\ProgramData\NVIDIA Corporation\CUDA Samples\v7.5

     CUDA_LIB_PATH = %CUDA_PATH%\lib\x64

  CUDA_BIN_PATH = %CUDA_PATH%\bin

  CUDA_SDK_BIN_PATH = %CUDA_SDK_PATH%\bin\x64

  CUDA_SDK_LIB_PATH = %CUDA_SDK_PATH%\common\lib\x64

  然后,在系统变量 PATH 的末尾添加:

  ;%CUDA_LIB_PATH%;%CUDA_BIN_PATH%;%CUDA_SDK_LIB_PATH%;%CUDA_SDK_BIN_PATH%;
        备注:ProgramData为隐藏目录,要设置为显示

3.打开VS2013并建立一个空的win32控制台项目
   a.右键源文件 -> 添加 -> 新建项  选择CUDA C++/C文件
   b.右键工程 -> 生成自定义,选择CUDA 7.5
   c.右键项目 -> 属性 -> 配置属性 -> VC++目录,添加以下两个包含目录:
        C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\include
     C:\ProgramData\NVIDIA Corporation\CUDA Samples\v7.5\common\inc
  再添加以下两个库目录:
  C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\lib\x64
  C:\ProgramData\NVIDIA Corporation\CUDA Samples\v7.5\common\lib\x64
   d.右键项目 -> 属性 -> 配置属性 ->链接器 -> 常规 -> 附加库目录,添加以下目录:
  $(CUDA_PATH_V7_5)\lib\$(Platform)
   e.右键项目 -> 属性 -> 配置属性 ->链接器 -> 输入 -> 附加依赖项,添加以下库:
       其实就是  C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\lib\x64 目录下的库
       cublas.lib
      cublas_device.lib
      cuda.lib
      cudadevrt.lib
      cudart.lib
      cudart_static.lib
      cufft.lib
      cufftw.lib
     curand.lib
     cusolver.lib
     cusparse.lib
     nppc.lib
     nppi.lib
     npps.lib
     nvblas.lib
     nvcuvid.lib
     nvrtc.lib
     OpenCL.lib
   f.右键项目 -> 属性->项类型  选CUDA C/C++

   g.打开配置管理器
       
       平台改为x64

    4.测试
      
   
// CUDA runtime 库 + CUBLAS 库 #include "cuda_runtime.h"#include "cublas_v2.h"#include <time.h>#include <iostream>using namespace std;// 定义测试矩阵的维度int const M = 5;int const N = 10;int main() {       // 定义状态变量    cublasStatus_t status;    // 在 内存 中为将要计算的矩阵开辟空间    float *h_A = (float*)malloc (N*M*sizeof(float));    float *h_B = (float*)malloc (N*M*sizeof(float));        // 在 内存 中为将要存放运算结果的矩阵开辟空间    float *h_C = (float*)malloc (M*M*sizeof(float));    // 为待运算矩阵的元素赋予 0-10 范围内的随机数    for (int i=0; i<N*M; i++) {        h_A[i] = (float)(rand()%10+1);        h_B[i] = (float)(rand()%10+1);        }        // 打印待测试的矩阵    cout << "矩阵 A :" << endl;    for (int i=0; i<N*M; i++){        cout << h_A[i] << " ";        if ((i+1)%N == 0) cout << endl;    }    cout << endl;    cout << "矩阵 B :" << endl;    for (int i=0; i<N*M; i++){        cout << h_B[i] << " ";        if ((i+1)%M == 0) cout << endl;    }    cout << endl;        /*    ** GPU 计算矩阵相乘    */    // 创建并初始化 CUBLAS 库对象    cublasHandle_t handle;    status = cublasCreate(&handle);        if (status != CUBLAS_STATUS_SUCCESS)    {        if (status == CUBLAS_STATUS_NOT_INITIALIZED) {            cout << "CUBLAS 对象实例化出错" << endl;        }        getchar ();        return EXIT_FAILURE;    }    float *d_A, *d_B, *d_C;    // 在 显存 中为将要计算的矩阵开辟空间    cudaMalloc (        (void**)&d_A,    // 指向开辟的空间的指针        N*M * sizeof(float)    // 需要开辟空间的字节数    );    cudaMalloc (        (void**)&d_B,            N*M * sizeof(float)        );    // 在 显存 中为将要存放运算结果的矩阵开辟空间    cudaMalloc (        (void**)&d_C,        M*M * sizeof(float)        );    // 将矩阵数据传递进 显存 中已经开辟好了的空间    cublasSetVector (        N*M,    // 要存入显存的元素个数        sizeof(float),    // 每个元素大小        h_A,    // 主机端起始地址        1,    // 连续元素之间的存储间隔        d_A,    // GPU 端起始地址        1    // 连续元素之间的存储间隔    );    cublasSetVector (        N*M,         sizeof(float),         h_B,         1,         d_B,         1    );    // 同步函数    cudaThreadSynchronize();    // 传递进矩阵相乘函数中的参数,具体含义请参考函数手册。    float a=1; float b=0;    // 矩阵相乘。该函数必然将数组解析成列优先数组    cublasSgemm (        handle,    // blas 库对象         CUBLAS_OP_T,    // 矩阵 A 属性参数        CUBLAS_OP_T,    // 矩阵 B 属性参数        M,    // A, C 的行数         M,    // B, C 的列数        N,    // A 的列数和 B 的行数        &a,    // 运算式的 α 值        d_A,    // A 在显存中的地址        N,    // lda        d_B,    // B 在显存中的地址        M,    // ldb        &b,    // 运算式的 β 值        d_C,    // C 在显存中的地址(结果矩阵)        M    // ldc    );        // 同步函数    cudaThreadSynchronize();    // 从 显存 中取出运算结果至 内存中去    cublasGetVector (        M*M,    //  要取出元素的个数        sizeof(float),    // 每个元素大小        d_C,    // GPU 端起始地址        1,    // 连续元素之间的存储间隔        h_C,    // 主机端起始地址        1    // 连续元素之间的存储间隔    );        // 打印运算结果    cout << "计算结果的转置 ( (A*B)的转置 ):" << endl;    for (int i=0;i<M*M; i++){            cout << h_C[i] << " ";            if ((i+1)%M == 0) cout << endl;    }        // 清理掉使用过的内存    free (h_A);    free (h_B);    free (h_C);    cudaFree (d_A);    cudaFree (d_B);    cudaFree (d_C);    // 释放 CUBLAS 库对象    cublasDestroy (handle);    getchar();        return 0;}





1 0
原创粉丝点击