VS2015 配置cuda8.0

总结如下:

1  官网下载和系统匹配的cuda 软件  https://developer.nvidia.com/cuda-downloads

2  直接使用默认选项安装 

3 设置环境变量: 
安装完毕后,在计算机上点右键,打开属性->高级系统设置->环境变量,可以看到系统中多了CUDA_PATH和CUDA_PATH_V8_0两个环境变量,接下来,还要在系统中添加以下几个环境变量: 
  CUDA_SDK_PATH = C:\ProgramData\NVIDIA Corporation\CUDA Samples\v8.0 
  CUDA_LIB_PATH = %CUDA_PATH%\lib\x64 
  CUDA_BIN_PATH = %CUDA_PATH%\bin 
  CUDA_SDK_BIN_PATH = %CUDA_SDK_PATH%\bin\win64 
CUDA_SDK_LIB_PATH = %CUDA_SDK_PATH%\common\lib\x64 
因为安装路径是默认的,所以添加的路径分别是下面这样的: 
CUDA_PATH 
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0 
CUDA_PATH_V8_0 
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0 
CUDA_SDK_PATH 
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v8.0 
CUDA_LIB_PATH 
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64 
CUDA_BIN_PATH 
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin 
CUDA_SDK_BIN_PATH 
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v8.0\bin\win64 
CUDA_SDK_LIB_PATH 
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v8.0\common\lib\x64 
然后,在系统变量 PATH 的末尾添加: 
 ;%CUDA_LIB_PATH%;%CUDA_BIN_PATH%;%CUDA_SDK_LIB_PATH%;%CUDA_SDK_BIN_PATH%; 
;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin;C:\ProgramData\NVIDIA Corporation\CUDA Samples\v8.0\common\lib\x64;C:\ProgramData\NVIDIA Corporation\CUDA Samples\v8.0\bin\win64; 
重新启动计算机

4 VS 配置:

  • 1.打开vs2013并创建一个空win32程序,创建一个cuda_samples的解决方案和cuda_test1项目: 
  • 2.右键源文件–>添加–>新建项,如下图所示:

  • 3.选择NIVIDIA CUDA7.5中 CUDA C/C++file,并在名称那填上cuda_main

  • 4.选择cuda_test1,点击右键–>项目依赖项–>自定义生成

  • 5.选择CUDA7.5

  • 6.点击cuda_main.cu的属性

    1. 在配置属性–>常规–>项类型–>选择“CUDA C/C++”

5 项目配置 

5.1 包含目录配置

  • 1.右键点击项目属性–>属性–>配置属性–>VC++目录–>包含目录
  • 2.添加包含目录: 
    $(CUDA_PATH)\include

5.2 库目录配置

  • 1.VC++目录–>库目录
  • 2.添加库目录: 
    $(CUDA_PATH)\lib\x64

5.3 依赖项

    1. 配置属性–>连接器–>输入–>附加依赖项
    1. 添加库文件: 
      cublas.lib 
      cuda.lib 
      cudadevrt.lib 
      cudart.lib 
      cudart_static.lib 
      nvcuvid.lib 
      OpenCL.lib

注意:添加nvcuvenc.lib库文件,编译时,报找不到该文件的错误。去掉后,程序也能运行

6 测试程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// 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 端起始地址
    // 连续元素之间的存储间隔
    );
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 在显存中的地址(结果矩阵)
    //
    );
// 同步函数
cudaThreadSynchronize();
// 从 显存 中取出运算结果至 内存中去
cublasGetVector(M*M, // 要取出元素的个数
    sizeof(float), // 每个元素大小
    d_C, // GPU 端起始地址
    1, // 连续元素之间的存储间隔
    h_C, // 主机端起始地址
    // 连续元素之间的存储间隔
    );
// 打印运算结果
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;
}

7 运行结果:

运行结果如下图所示:

8 注意事项:

注意选择VS编译选项为X64

posted @ 2017-11-27 20:13  匿名者2  阅读(6772)  评论(0编辑  收藏  举报