CUDA 6.0 安装及配置( WIN7 64位 / 英伟达G卡 / VS2010 )
前言
本文讲解如何在VS 2010开发平台中搭建CUDA开发环境
当前配置:
系统:WIN7 64位
开发平台:VS 2010
显卡:英伟达G卡
CUDA版本:6.0
若配置不一样,请勿参阅本文。
第一步
点击这里下载 cuda最新版,目前最高版本是6.0。下载完毕后得到 cuda_6.0.37_winvista_win7_win8.1_general_64.exe 文件。
第二步
运行安装程序,弹出安装过程中转文件路径设定框:
这个路径随便填无所谓,安装完后就会自动删除的,我就直接设置为默认的。
第三步
等待系统帮你检测当前平台是否适合搭建CUDA:
第四步
检测完毕后,正式进入CUDA安装界面:
同意并继续
第五步
然后选择安装模式:
为了完全安装所有功能,选择自定义模式安装。
第六步
接下来勾选要安装的组件:
全部勾上
第七步
接下来要设置三个安装路径:
这三个路径安装的是什么在日后的文章中将会解释,目前先不理会,直接安装到默认路径。点击下一步之后开始正式安装。
第八步
安装完毕后,可以看到系统中多了CUDA_PATH和CUDA_PATH_V6_0两个环境变量,接下来,还要在系统中添加以下几个环境变量:
CUDA_SDK_PATH = C:\ProgramData\NVIDIA Corporation\CUDA Samples\v6.0\common
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
然后,在系统变量末尾添加:
;%CUDA_LIB_PATH%;%CUDA_BIN_PATH%;%CUDA_SDK_LIB_PATH%;%CUDA_SDK_BIN_PATH%;
第九步
重新启动计算机以使环境变量生效
第十步
打开VS2010并建立一个空的win32控制台项目:
附加选项那里请把“空项目”打钩:
第十一步
右键源文件 -> 添加 -> 新建项 如下图所示:
在打开的对话框中选择新建一个CUDA格式的源文件:
第十二步
右键工程 -> 生成自定义 如下图所示:
在弹出的对话框中勾选“CUDA 6.0 *****"选项:
第十三步
右键源代码文件 1.cu -> 属性 如下图所示:
项类型选择 C/C++ 编译器:
第十四步
右键项目 -> 属性 -> 配置属性 -> VC++目录,添加以下两个包含目录:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.0\include
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v6.0\common\inc
再添加以下两个库目录:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.0\lib\x64
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v6.0\common\lib\x64
第十五步
右键项目 -> 属性 -> 配置属性 ->连接器 -> 常规 -> 附加库目录,添加以下目录:
$(CUDA_PATH_V6_0)\lib\$(Platform)
如下图所示:
第十六步
右键项目 -> 属性 -> 配置属性 ->连接器 -> 输入 -> 附加依赖项,添加以下库:
cudart.lib cublas.lib cublas_device.lib nvblas.lib
如下图所示:
第十七步
打开配置管理器,如下图所示:
点击 新建,如下图所示:
选择 X64 平台:
好了,至此平台已经完全搭建完毕,可用以下代码进行测试:
1 /* Includes, system */ 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <string.h> 5 6 /* Includes, cuda */ 7 #include <cuda_runtime.h> 8 #include <cublas_v2.h> 9 #include <helper_cuda.h> 10 11 /* Matrix size */ 12 #define N (275) 13 14 /* Host implementation of a simple version of sgemm */ 15 static void simple_sgemm(int n, float alpha, const float *A, const float *B, 16 float beta, float *C) 17 { 18 int i; 19 int j; 20 int k; 21 22 for (i = 0; i < n; ++i) 23 { 24 for (j = 0; j < n; ++j) 25 { 26 float prod = 0; 27 28 for (k = 0; k < n; ++k) 29 { 30 prod += A[k * n + i] * B[j * n + k]; 31 } 32 33 C[j * n + i] = alpha * prod + beta * C[j * n + i]; 34 } 35 } 36 } 37 38 /* Main */ 39 int main(int argc, char **argv) 40 { 41 cublasStatus_t status; 42 float *h_A; 43 float *h_B; 44 float *h_C; 45 float *h_C_ref; 46 float *d_A = 0; 47 float *d_B = 0; 48 float *d_C = 0; 49 float alpha = 1.0f; 50 float beta = 0.0f; 51 int n2 = N * N; 52 int i; 53 float error_norm; 54 float ref_norm; 55 float diff; 56 cublasHandle_t handle; 57 58 int dev = findCudaDevice(argc, (const char **) argv); 59 60 if (dev == -1) 61 { 62 return EXIT_FAILURE; 63 } 64 65 /* Initialize CUBLAS */ 66 printf("simpleCUBLAS test running..\n"); 67 68 status = cublasCreate(&handle); 69 70 if (status != CUBLAS_STATUS_SUCCESS) 71 { 72 fprintf(stderr, "!!!! CUBLAS initialization error\n"); 73 return EXIT_FAILURE; 74 } 75 76 /* Allocate host memory for the matrices */ 77 h_A = (float *)malloc(n2 * sizeof(h_A[0])); 78 79 if (h_A == 0) 80 { 81 fprintf(stderr, "!!!! host memory allocation error (A)\n"); 82 return EXIT_FAILURE; 83 } 84 85 h_B = (float *)malloc(n2 * sizeof(h_B[0])); 86 87 if (h_B == 0) 88 { 89 fprintf(stderr, "!!!! host memory allocation error (B)\n"); 90 return EXIT_FAILURE; 91 } 92 93 h_C = (float *)malloc(n2 * sizeof(h_C[0])); 94 95 if (h_C == 0) 96 { 97 fprintf(stderr, "!!!! host memory allocation error (C)\n"); 98 return EXIT_FAILURE; 99 } 100 101 /* Fill the matrices with test data */ 102 for (i = 0; i < n2; i++) 103 { 104 h_A[i] = rand() / (float)RAND_MAX; 105 h_B[i] = rand() / (float)RAND_MAX; 106 h_C[i] = rand() / (float)RAND_MAX; 107 } 108 109 /* Allocate device memory for the matrices */ 110 if (cudaMalloc((void **)&d_A, n2 * sizeof(d_A[0])) != cudaSuccess) 111 { 112 fprintf(stderr, "!!!! device memory allocation error (allocate A)\n"); 113 return EXIT_FAILURE; 114 } 115 116 if (cudaMalloc((void **)&d_B, n2 * sizeof(d_B[0])) != cudaSuccess) 117 { 118 fprintf(stderr, "!!!! device memory allocation error (allocate B)\n"); 119 return EXIT_FAILURE; 120 } 121 122 if (cudaMalloc((void **)&d_C, n2 * sizeof(d_C[0])) != cudaSuccess) 123 { 124 fprintf(stderr, "!!!! device memory allocation error (allocate C)\n"); 125 return EXIT_FAILURE; 126 } 127 128 /* Initialize the device matrices with the host matrices */ 129 status = cublasSetVector(n2, sizeof(h_A[0]), h_A, 1, d_A, 1); 130 131 if (status != CUBLAS_STATUS_SUCCESS) 132 { 133 fprintf(stderr, "!!!! device access error (write A)\n"); 134 return EXIT_FAILURE; 135 } 136 137 status = cublasSetVector(n2, sizeof(h_B[0]), h_B, 1, d_B, 1); 138 139 if (status != CUBLAS_STATUS_SUCCESS) 140 { 141 fprintf(stderr, "!!!! device access error (write B)\n"); 142 return EXIT_FAILURE; 143 } 144 145 status = cublasSetVector(n2, sizeof(h_C[0]), h_C, 1, d_C, 1); 146 147 if (status != CUBLAS_STATUS_SUCCESS) 148 { 149 fprintf(stderr, "!!!! device access error (write C)\n"); 150 return EXIT_FAILURE; 151 } 152 153 /* Performs operation using plain C code */ 154 simple_sgemm(N, alpha, h_A, h_B, beta, h_C); 155 h_C_ref = h_C; 156 157 /* Performs operation using cublas */ 158 status = cublasSgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N, N, N, N, &alpha, d_A, N, d_B, N, &beta, d_C, N); 159 160 if (status != CUBLAS_STATUS_SUCCESS) 161 { 162 fprintf(stderr, "!!!! kernel execution error.\n"); 163 return EXIT_FAILURE; 164 } 165 166 /* Allocate host memory for reading back the result from device memory */ 167 h_C = (float *)malloc(n2 * sizeof(h_C[0])); 168 169 if (h_C == 0) 170 { 171 fprintf(stderr, "!!!! host memory allocation error (C)\n"); 172 return EXIT_FAILURE; 173 } 174 175 /* Read the result back */ 176 status = cublasGetVector(n2, sizeof(h_C[0]), d_C, 1, h_C, 1); 177 178 if (status != CUBLAS_STATUS_SUCCESS) 179 { 180 fprintf(stderr, "!!!! device access error (read C)\n"); 181 return EXIT_FAILURE; 182 } 183 184 /* Check result against reference */ 185 error_norm = 0; 186 ref_norm = 0; 187 188 for (i = 0; i < n2; ++i) 189 { 190 diff = h_C_ref[i] - h_C[i]; 191 error_norm += diff * diff; 192 ref_norm += h_C_ref[i] * h_C_ref[i]; 193 } 194 195 error_norm = (float)sqrt((double)error_norm); 196 ref_norm = (float)sqrt((double)ref_norm); 197 198 if (fabs(ref_norm) < 1e-7) 199 { 200 fprintf(stderr, "!!!! reference norm is 0\n"); 201 return EXIT_FAILURE; 202 } 203 204 /* Memory clean up */ 205 free(h_A); 206 free(h_B); 207 free(h_C); 208 free(h_C_ref); 209 210 if (cudaFree(d_A) != cudaSuccess) 211 { 212 fprintf(stderr, "!!!! memory free error (A)\n"); 213 return EXIT_FAILURE; 214 } 215 216 if (cudaFree(d_B) != cudaSuccess) 217 { 218 fprintf(stderr, "!!!! memory free error (B)\n"); 219 return EXIT_FAILURE; 220 } 221 222 if (cudaFree(d_C) != cudaSuccess) 223 { 224 fprintf(stderr, "!!!! memory free error (C)\n"); 225 return EXIT_FAILURE; 226 } 227 228 /* Shutdown */ 229 status = cublasDestroy(handle); 230 231 if (status != CUBLAS_STATUS_SUCCESS) 232 { 233 fprintf(stderr, "!!!! shutdown error (A)\n"); 234 return EXIT_FAILURE; 235 } 236 237 exit(error_norm / ref_norm < 1e-6f ? EXIT_SUCCESS : EXIT_FAILURE); 238 }
小结
不论什么开发环境的搭建,都应该确保自己电脑的硬件配置,软件版本和参考文档的一致,这样才能确保最短的时间内完成搭建,进入到具体的开发环节。