写在前面:
非常不情愿,可是干活需要,因此就入了CUDA的坑,只能算是萌新一枚。刚开始配置的时候,总是要走不少的弯路,大家都是这么过来的,只不过身为码农,踩过的坑还是尽量标记一下为好,不然时间长了,又得重来一遍。
言归正传,本人的笔记本电脑显卡是GeForce 710M,根据CUDA官网的介绍,计算能力是2.1,不过也没关系了,能跑就行。
查询网址:https://developer.nvidia.com/cuda-gpus#collapseOne
看了很多人的博客,比较主流的搭配是CUDA6.5 +VS2010,所以我也随大流吧。(主要是笔记本上安装了VS2010,我懒得卸载了,在安装其他的,只不过后来发生的事,让我不得不把它卸载了再装一遍,这是后话,到时后再说。)
过程都差不多,可以说很容易,我感觉其他人说的更清楚一点,在这里贴上些大牛的链接镇楼。
http://blog.csdn.net/augusdi/article/details/12833235
进入正文:
1 .CUDA6.5 的下载:
https://developer.nvidia.com/cuda-toolkit-65
注意下载的版本是Desktop(台式机)还是Notebook(笔记本),由于我的笔记本是64位的,因此选择图中下载。
2.安装cuda
2.1 CUDA的安装文件
直接双击exe文件,弹出后,首先会监测一下你的运行环境,如果找不到Nividia对应的显卡设备,他会提示你是否要继续安装。这里面nvidia的显卡,最起码也是GeForce 410M以上的,要不是无法编写CUDA的(看前面的计算能力介绍)。
2.2 它会监测你的电脑是否支持cuda的搭建,等待就行
2.3 系统检查
2.4 选择同意并继续
2.5 选择自定义安装
2.6 简单粗暴全选
2.7 安装的位置,默认(不过记录一下最好)
2.8 下一步安装就行,等10-20分钟就好了
3. 配置CUDA的环境变量
安装完后自动添加三个环境变量:
CUDA_PATH C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5
CUDA_PATH_V6_5 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5
CUDA_PATH_V6_5 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5
CUDA_SDK_PATH C:\ProgramData\NVIDIA Corporation\CUDA Samples\v6.5
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v6.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
%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%;
搞定
4.重新启动计算机让环境变量生效
5.在安装路径下找到C:/ProgramData/NVIDIA Corporation/CUDA Samples/v6.5/其中的Samples_vs2010.sln
打开VS2010的上图所示的工程(本人打开的时候发生了点小插曲,后面再说),编译,这个花的时间有点长,大约1个多小时吧,最后还有几个编译不过(不过这并不影响)。
6.接下来是cuda的安装成功与否
的监测了,这个步骤用在上图bin目录下的
deviceQuery.exe 和 bandwithTest.exe
在dos下,分别找到这个文件夹,运行二者即可
图中的CUDA Capacity Major 是2.1,正是我们显卡的计算能力。当然好的显卡都能达到6.5了,货比货得扔啊。
7.第一个CUDA项目
打开VS2010并建立一个CUDA 6.5 RunTime项目,它会帮你生成一系列的文件,测试是一个cu的文件,编译,运行。
代码如下,可以拿来观摩:
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size);
__global__ void addKernel(int *c, const int *a, const int *b)
{
int i = threadIdx.x;
c[i] = a[i] + b[i];
}
int main()
{
const int arraySize = 5;
const int a[arraySize] = { 1, 2, 3, 4, 5 };
const int b[arraySize] = { 10, 20, 30, 40, 50 };
int c[arraySize] = { 0 };
// Add vectors in parallel.
cudaError_t cudaStatus = addWithCuda(c, a, b, arraySize);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "addWithCuda failed!");
return 1;
}
printf("{1,2,3,4,5} + {10,20,30,40,50} = {%d,%d,%d,%d,%d}\n",
c[0], c[1], c[2], c[3], c[4]);
// cudaDeviceReset must be called before exiting in order for profiling and
// tracing tools such as Nsight and Visual Profiler to show complete traces.
cudaStatus = cudaDeviceReset();
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaDeviceReset failed!");
return 1;
}
getchar();
return 0;
}
// Helper function for using CUDA to add vectors in parallel.
cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size)
{
int *dev_a = 0;
int *dev_b = 0;
int *dev_c = 0;
cudaError_t cudaStatus;
// Choose which GPU to run on, change this on a multi-GPU system.
cudaStatus = cudaSetDevice(0);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaSetDevice failed! Do you have a CUDA-capable GPU installed?");
goto Error;
}
// Allocate GPU buffers for three vectors (two input, one output) .
cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(int));
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaMalloc failed!");
goto Error;
}
cudaStatus = cudaMalloc((void**)&dev_a, size * sizeof(int));
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaMalloc failed!");
goto Error;
}
cudaStatus = cudaMalloc((void**)&dev_b, size * sizeof(int));
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaMalloc failed!");
goto Error;
}
// Copy input vectors from host memory to GPU buffers.
cudaStatus = cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaMemcpy failed!");
goto Error;
}
cudaStatus = cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaMemcpy failed!");
goto Error;
}
// Launch a kernel on the GPU with one thread for each element.
addKernel<<<1, size>>>(dev_c, dev_a, dev_b);
// Check for any errors launching the kernel
cudaStatus = cudaGetLastError();
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "addKernel launch failed: %s\n", cudaGetErrorString(cudaStatus));
goto Error;
}
// cudaDeviceSynchronize waits for the kernel to finish, and returns
// any errors encountered during the launch.
cudaStatus = cudaDeviceSynchronize();
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaDeviceSynchronize returned error code %d after launching addKernel!\n", cudaStatus);
goto Error;
}
// Copy output vector from GPU buffer to host memory.
cudaStatus = cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaMemcpy failed!");
goto Error;
}
Error:
cudaFree(dev_c);
cudaFree(dev_a);
cudaFree(dev_b);
return cudaStatus;
}
结果:
至此,安装和检查工作算是全都做完了。
后记:我在安装的时候出了点小意外,就是在第5步打开那个amples_vs2010.sln的时候,提示我vs2010的部分内容在安装CUDA的时候进行了更新,现在要用VS2010,需要全部都更新。什么需要下载Microsoft sevice pack 1,下了好几个版本补丁,按上去没啥用,于是又把vs2010 卸载了再安装一遍(此处有作者的叹息声),之后进行下面的步骤。
第一回正经八百的写博客,累死我了。虽然多是重复记录别人的经历,但是整理的过程就是学习的过程,希望自己能够保持下去。
参考:
https://wenku.baidu.com/view/9893ec57763231126edb11b8.html
http://blog.csdn.net/u013241840/article/details/41831939