VS2013下CUDA 7.5安装

来源:互联网 发布:淘宝购物行为评级 编辑:程序博客网 时间:2024/05/22 10:30

VS2013下CUDA 7.5安装

1 环境搭建

1.  安装vs2013,若安装失败可能是卸载不干净,只能重装系统

若重装后还失败,尝试删除或改名C:\Windows\SoftwareDistribution文件夹

 

2.官网下载CUDA 7.5,安装

 

3.安装完成后,系统变量的环境变量多了两个

CUDA_PATH_V7_5

C:\Program Files\NVIDIA GPU ComputingToolkit\CUDA\v7.5

CUDA_PATH

C:\Program Files\NVIDIA GPU ComputingToolkit\CUDA\v7.5

环境变量Path也多了:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\bin

C:\Program Files\NVIDIA GPU ComputingToolkit\CUDA\v7.5\libnvvp

C:\Program Files (x86)\NVIDIACorporation\PhysX\Common

4.进入 C:\ProgramData\NVIDIACorporation\CUDA Samples\v7.5\1_Utilities\deviceQuery中

打开deviceQuery_vs2012.sln,右键生成(在debug和release两种模式下分别编译)


进入C:\ProgramData\NVIDIA Corporation\CUDA Samples\v7.5\bin\win64\Debug

和C:\ProgramData\NVIDIA Corporation\CUDASamples\v7.5\bin\win64\Release分别执行deviceQuery.exe,看结果是否PASS



结果=pass,表示通过

 

2 Cuda编程测试:

1.      打开VS2013并建立一个空的win32控制台项目



2.      右键源文件——添加——新建项,选nvidia cuda7.5下面的cuda c++ 文件类型,创建test.cu



3.      右键test.cu——属性,在左侧的常规——项类型,下拉菜单,选择cuda c/c++


4.      将测试代码放入test.cu(代码转自网络)

 

//CUDA runtime 库+ CUBLAS 库

#include"cuda_runtime.h"

#include"cublas_v2.h"

 

#include<time.h>

#include<iostream>

 

usingnamespace std;

 

// 定义测试矩阵的维度

intconst M = 5;

intconst N = 10;

 

intmain()

{  

    // 定义状态变量

    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;

}

5.      ctrl+F5执行


3 cuda工程搭建

1)      如图,打开VS2013并建立一个NVIDIACUDA 7.5项目,命名为cuda。


2)      如图4-10,在“解决方案资源管理器”一栏中右键cuda项目,添加新建项,选择类型为C++文件。


3)      在C++文件中填入相应cuda代码。

4)      如图4-11,右键cuda项目——属性——配置属性——C/C++——常规——附加包含目录,增加一项C:\ProgramData\NVIDIA Corporation\CUDA Samples\v7.5\common\inc.


该操作为是为了使工程找到所需的头文件<helper_string.h>,<helper_cuda.h>和<helper_functions.h>,他们都在路径C:\ProgramData\NVIDIACorporation\CUDA Samples\v7.5\common\inc下。

5)      如图4-12,,设置链接器——输入——附加依赖项,添加一项cusparse.lib,否则将无法解析的CUSPARSE库函数名,出现如下错误:

错误         8     error LNK2019: 无法解析的外部符号cusparseSnnz,该符号在函数 "float * __cdecl getMatrix(int &,int &,int&)" (?getMatrix@@YAPEAMAEAH00@Z) 中被引用   

 

6)   如下图,注意检查途中红框处解决方案平台的类型,设置为x64(本实验所用cuda环境是64版本,选win32会导致不兼容而无法编译)。


7)      ctrl+F5,开始编译执行程序,结果如下:


0 0
原创粉丝点击