Windows下安裝CUDA8.0


在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 新建項目並進行配置

  1. 打開VS2013,新建空白項目,設置項目名稱、位置信息,如下圖;

  1. 在源文件添加—>新建項—>NVIDIA CUDA 8.0—>CUDA C/C++ File,命名為hello.cu,如下圖;

    hello.cu右鍵—>屬性—>配置屬性—>常規—>項類型,配置如下圖;

  1. 在項目上右鍵—>生成依賴項—>生成自定義—>選擇CUDA 8.0,如下圖;

  1. 在項目上右鍵—>屬性—>常規—>配置管理器—>活動解決方案平台(新建)—>鍵入或選擇新平台(選擇x64),如下圖;

  1. 項目右鍵—>屬性—>VC++目錄—>包含目錄,如下圖,添加;
F:\CUDA\NVIDIA GPU Computing Tookit\CUDA\v8.0\include
  1. 項目右鍵—>屬性—>VC++目錄—>庫目錄,如下圖,添加;
F:\CUDA\NVIDIA GPU Computing Tookit\CUDA\v8.0\lib\x64

  1. 項目右鍵—>屬性—>鏈接器—>常規,如下圖,添加;
$(CUDA_PATH_V8_0)\lib\$(Platform)

  1. 項目右鍵—>屬性—>鏈接器—>輸入—>附加依賴項,如下圖,添加;

注意:不同版本的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;
}

編譯,輸出結果為:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM