在Win10下安裝CUDA8.0,並使用VS2013測試;
機器配置:
Windows 10
VS 2013
CUDA8.0
CUDA 8.0:下載地址
CUDA其他版本:下載地址
1. 安裝CUDA 8.0
雙擊安裝下載的.exe文件,然后選擇解壓路徑,如下圖,解壓到哪里無所謂,安裝成功會自動刪除;
解壓完成后,得到如下圖:
- 精簡:安裝所有CUDA模塊,並覆蓋掉當前的NVIDIA驅動程序;(說實話,容易出問題)
- 自定義:選擇自己想要安裝的模塊,此處選擇這里;
選擇自定義后,出現下圖所示:
下面幾個模塊准確具體有什么用,不能100%確定,但能大概才出來:
- CUDA:這個是必須的,下面有CUDA Runntime、Samples一些東西;
- NVIDIA GeForce Experience:這個好像是為了更好的游戲體驗,之前安裝顯卡驅動程序時也提示是否安裝,果斷拒絕了;
- Other components:這里的PhysX好像也是為了游戲體驗來的;
- Driver components:這個就要慎重了,意思就是重新安裝顯卡驅動程序;如果之前已經成功安裝驅動程序,這里就不用選了;如果之前沒安裝驅動程序,建議還是去官網上單獨下載驅動程序進行安裝吧;
選擇好需要安裝的模塊,就要選擇安裝路徑了,我的選擇如下圖:
- 在如圖所示位置建立相應文件夾,然后再指定安裝路徑;
安裝成功后;Ctrl+R,打開cmd:
nvcc -V
輸出版本信息,則表明安裝成功;
配置環境變量
將F:\CUDA\NVIDIA GPU Computing Tookit\CUDA\v8.0\lib\x64
添加的系統變量的path中;
2. 安裝CuDNN
下載對應CUDA 8.0版本的CuDNN:下載鏈接
(如果安裝的是其他版本的CUDA,注意CuDNN的版本)
下載完成后,解壓得到一個名為cuda的文件夾;將該文件夾下的文件復制到上一步安裝的CUDA中;注意對應的文件夾;
./cuda/bin/**.dll 復制到 ./NVIDIA GPU Computing Tookit/CUDA/v8.0/bin/
./cuda/include/**.dll 復制到 ./NVIDIA GPU Computing Tookit/CUDA/v8.0/include/
./cuda/lib/x64/**.dll 復制到 ./NVIDIA GPU Computing Tookit/CUDA/v8.0/lib/x64/
安裝完成;
3. 測試1
使用VS2013打開./cuda/v8.0/Samples_vs2013.sln;
加載完成后,執行本地Windows編譯,最后輸出成功,見下圖;
4. 測試2
在VS2013上配置CUDA;
4.1 新建項目並進行配置
- 打開VS2013,新建空白項目,設置項目名稱、位置信息,如下圖;
-
在源文件添加—>新建項—>NVIDIA CUDA 8.0—>CUDA C/C++ File,命名為hello.cu,如下圖;
hello.cu右鍵—>屬性—>配置屬性—>常規—>項類型,配置如下圖;
- 在項目上右鍵—>生成依賴項—>生成自定義—>選擇CUDA 8.0,如下圖;
- 在項目上右鍵—>屬性—>常規—>配置管理器—>活動解決方案平台(新建)—>鍵入或選擇新平台(選擇x64),如下圖;
- 項目右鍵—>屬性—>VC++目錄—>包含目錄,如下圖,添加;
F:\CUDA\NVIDIA GPU Computing Tookit\CUDA\v8.0\include
- 項目右鍵—>屬性—>VC++目錄—>庫目錄,如下圖,添加;
F:\CUDA\NVIDIA GPU Computing Tookit\CUDA\v8.0\lib\x64
- 項目右鍵—>屬性—>鏈接器—>常規,如下圖,添加;
$(CUDA_PATH_V8_0)\lib\$(Platform)
- 項目右鍵—>屬性—>鏈接器—>輸入—>附加依賴項,如下圖,添加;
注意:不同版本的CUDA,下面的lib是不同的;當然,一個項目也不一定需要所有的lib;
具體有哪些lib,位於:F:\CUDA_Dev_Doc_Sam\v8.0\lib\x64;
cublas.lib
cublas_device.lib
cuda.lib
cudadevrt.lib
cudart.lib
cudart_static.lib
cudnn.lib
cufft.lib
cufftw.lib
curand.lib
cusolver.lib
cusparse.lib
nppc.lib
nppi.lib
nppial.lib
nppicc.lib
nppicom.lib
nppidei.lib
nppif.lib
nppig.lib
nppim.lib
nppist.lib
nppisu.lib
nppitc.lib
npps.lib
nvblas.lib
nvcuvid.lib
nvgraph.lib
nvml.lib
nvrtc.lib
OpenCL.lib
4.2 編譯
在上面建的hello.cu文件中添加下面代碼:
// CUDA runtime 庫 + CUBLAS 庫
#include <cuda_runtime.h>
#include <cublas_v2.h>
#include <device_launch_parameters.h>
#include <time.h>
#include <iostream>
# pragma warning (disable:4819)
using namespace std;
bool initDevice(void)
{
int cnt, i;
cudaGetDeviceCount(&cnt);
if (cnt < 0){
cout << "Can not find CUDA device" << endl;
return false;
}
for (i = 0; i < cnt; i++){
cudaDeviceProp porp;
if (cudaGetDeviceProperties(&porp, i) == cudaSuccess){
if (porp.major >= 1) {
break;
}
}
}
if (i == cnt){
cout << "< 1.0" << endl;
}
return true;
}
__global__ void kernel_compute(float *model, float *input, float *output)
{
int idx_x, idx_y;
idx_y = blockIdx.x;
idx_x = idx_y * blockDim.x + threadIdx.x;
float sum = 0;
for (int i = 0; i < 9; i++){
sum += input[idx_x] * model[i];
}
//printf("%3d %d %2.6f %2.6f\n", idx_x, idx_y, sum, input[idx_x]);
output[idx_x] = sum;
}
/*block ---> row*/
int buildMaps(float *model, float *input, float *output, int height, int width)
{
initDevice();
float *dev_m = NULL, *dev_i = NULL, *dev_o = NULL;
int size = height * width;
cudaMalloc((void **)&dev_m, 9 * sizeof(float));
cudaMalloc((void **)&dev_i, size * sizeof(float));
cudaMalloc((void **)&dev_o, size * sizeof(float));
cudaMemcpy(dev_m, model, 9 * sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(dev_i, input, size * sizeof(float), cudaMemcpyHostToDevice);
dim3 grid(height, 1, 1);
dim3 block(width, 1, 1);
kernel_compute << <grid, block >> > (dev_m, dev_i, dev_o);
cudaMemcpy(output, dev_o, size * sizeof(float), cudaMemcpyDeviceToHost);
return 0;
}
新建main.cpp文件;
#include <iostream>
#include <Windows.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
extern int buildMaps(float *model, float *input, float *output, int height, int width);
void show(float *ptr, int height, int width, char *str)
{
cout << str << " : " << endl;
for (int h = 0; h < height; h++){
for (int w = 0; w < width; w++){
int cnt = h * width + w;
printf("%5.5f ", ptr[cnt]);
}
cout << endl;
}
}
#define width 5
#define size (width * width)
int main()
{
float *model = (float *)malloc(9 * sizeof(float));
float *input = (float *)malloc(size * sizeof(float));
float *output = (float *)malloc(size * sizeof(float));
if (!model || !input || !output){
std::cout << "Malloc Error" << endl;
exit(-1);
}
for (int i = 0; i < 9; i++){
model[i] = (float)(i);
}
srand((unsigned)time(0));
for (long long int i = 0; i < size; i++){
input[i] = ((rand() % 100) * 1.f) / (rand() % 100 + 1);
}
buildMaps((float *)model, (float *)input, output, width, width);
show(model, 3, 3, "model");
show(input, width, width, "input");
show(output, width, width, "output");
int a;
cin >> a;
}
編譯,輸出結果為: