下面我將介紹如何再vs2017中配置cuda項目, 我的顯卡型號GeForce GTX 950M,安裝前需先確認電腦顯卡是否支持cuda9.1
- 到官網下載cuda toolkit
https://developer.nvidia.com/cuda-91-download-archive?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exelocal
先使用base installer就可以 - 安裝完可以查看下面教程
https://blog.csdn.net/u013165921/article/details/77891913
- 設置環境變量
CUDA_SDK_PATH = C:\ProgramData\NVIDIA Corporation\CUDA Samples\v9.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
# 可以在cmd中使用 set cuda 查看
- 監測cuda是否安裝成功
在cmd中運行bandwidthTest.exe, deviceQuery.exe
- vs2017配置
- 點擊cuda_main.cu的屬性,在配置屬性–>常規–>項類型–>選擇“CUDA C/C++”。
1.x64
2.1 包含目錄配置
1.右鍵點擊項目屬性–>屬性–>配置屬性–>VC++目錄–>包含目錄
2.添加包含目錄:
$(CUDA_PATH)\include
2.2 庫目錄配置
1.VC++目錄–>庫目錄
2.添加庫目錄:
$(CUDA_PATH)\lib\x64
2.3 依賴項
配置屬性–>鏈接器–>輸入–>附加依賴項
添加庫文件:
cublas.lib
cuda.lib
cudadevrt.lib
cudart.lib
cudart_static.lib
nvcuvid.lib
OpenCL.lib
注意:添加nvcuvenc.lib庫文件,編譯時,報找不到該文件的錯誤。去掉後,程序也能運行
- 測試
記得修改運行的平臺
// 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 端起始地址
1 // 連續元素之間的存儲間隔
);
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 在顯存中的地址(結果矩陣)
M // ldc
);
// 同步函數
cudaThreadSynchronize();
// 從 顯存 中取出運算結果至 內存中去
cublasGetVector(
M*M, // 要取出元素的個數
sizeof(float), // 每個元素大小
d_C, // GPU 端起始地址
1, // 連續元素之間的存儲間隔
h_C, // 主機端起始地址
1 // 連續元素之間的存儲間隔
);
// 打印運算結果
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;
}
結果如下:
編譯時可能會有vs版本太新的問題
https://blog.csdn.net/shenpibaipao/article/details/79519533
在之前的vs安裝器上更新vs,安裝上vs2015,需要在之前的vs2017複製一些文件到vs2015相應的文件夾中
將 C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\BuildCustomizations 中的四個文件複製到 C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\v140\BuildCustomizations 中,具體看編譯錯誤提示(有時需要重啓vs才能生效)