Cuda5.0相比之前的版本安裝配置方法友善了不少,使用者隻需下載下傳一個安裝包(之前的版本是三個)安裝後就可使用,無需其他的手工配置。并且在VS2010可以直接選擇添加*.cu和*.cuh檔案,省下了大量的操作。下面說一下MFC中使用CUDA5.0的具體方法:
1、安裝軟體:CUDA5.0将開發驅動程式、Toolkit和GPUComputing SDK整合到一個安裝檔案中,安裝過程也很簡潔。如果需要單步調試CUDA程式,還需要安裝NSight。(軟體下載下傳可以從http://www.nvidia.cn/object/cuda-cn.html找到)。
2、建立一個MFC項目,具體設定可以根據自己的需要。之後右擊解決方案管理器中的項目名稱,選“生成自定義…”,在彈出的對話空中勾選CUDA5.0,确定。
3、還是右擊“解決方案資料總管”中的項目名稱,點選“添加-建立篩選器”,建立一個篩選器,取名為“CUDA”。
4、右擊建立的篩選器,點選“添加-建立項”,可以發現建立檔案的對話空中已經多出了兩個CUDA的選項,我們可以從這裡直接添加cu和cuh檔案,一般我們可以分别添加一個cu和一個cuh檔案。
5、右擊cu檔案,點選屬性,在“正常-項類型”中選擇“CUDA C/C++”,點選确定。注意:是cu檔案才這麼配置,cuh檔案千萬别動它。
6、右擊工程名,選“屬性”,在“配置屬性-連結器-輸入-附加依賴項”中加上cudart.lib和uafxcwd.lib。
7、至此我們的配置就完成了,大家可以寫一個程式試試,下面我給出了一個例程,如果能運作成功,說明已經大功告成了。大家可以找一個CUDA4.0的配置教程對照一下,CUDA5.0的使用确實比以前的版本友善不少。另外,需要VS高亮CUDA函數、VA自動提示CUDA函數和NSight的配置可以檢視相關的說明,配置跟以前方法大緻相同。
8、用顯示卡處理運算時間超過5s的程式時windows會顯示顯示卡驅動程式響應,并恢複,這樣會中斷程式的運作。我們可以修改系統資料庫中HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers裡面的TdrLevel項(沒有就建立一個,DWORD值),把鍵值改為0.
//Computing.cuh檔案内容-------------------------------------------------------------------------
#ifndef _CUDACOMPUTING_CUH_
#define _CUDACOMPUTING_CUH_
int vvmain(int* c);
#endif
//Computing.cu檔案内容----------------------------------------------------------------------------
#include "CudaComputing.cuh"
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
cudaError_t addWithCuda(int *c, const int *a, const int *b, size_tsize);
__global__ void addKernel(int *c, const int *a, const int *b)
{
int i = threadIdx.x;
c[i] = a[i] + b[i];
}
int vvmain(int* c)
{
const int arraySize = 5;
const int a[arraySize] = {1, 2, 3, 4, 5 };
const int b[arraySize] = {10, 20, 30, 40, 50 };
// Add vectors inparallel.
cudaError_t cudaStatus =addWithCuda(c, a, b, arraySize);
if (cudaStatus !=cudaSuccess) {
return 1;
}
// cudaDeviceReset must becalled before exiting in order for profiling and
// tracing tools such asNsight and Visual Profiler to show complete traces.
cudaStatus =cudaDeviceReset();
if (cudaStatus !=cudaSuccess) {
return 1;
}
return 0;
}
// Helper function for using CUDA to add vectors in parallel.
cudaError_t addWithCuda(int *c, const int *a, const int *b, size_tsize)
{
int *dev_a = 0;
int *dev_b = 0;
int *dev_c = 0;
cudaError_t cudaStatus;
// Choose which GPU to runon, change this on a multi-GPU system.
cudaStatus =cudaSetDevice(0);
if (cudaStatus !=cudaSuccess) {
goto Error;
}
// Allocate GPU buffersfor three vectors (two input, one output) .
cudaStatus =cudaMalloc((void**)&dev_c, size * sizeof(int));
if (cudaStatus !=cudaSuccess) {
goto Error;
}
cudaStatus =cudaMalloc((void**)&dev_a, size * sizeof(int));
if (cudaStatus !=cudaSuccess) {
goto Error;
}
cudaStatus =cudaMalloc((void**)&dev_b, size * sizeof(int));
if (cudaStatus !=cudaSuccess) {
goto Error;
}
// Copy input vectors fromhost memory to GPU buffers.
cudaStatus =cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);
if (cudaStatus !=cudaSuccess) {
goto Error;
}
cudaStatus =cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);
if (cudaStatus !=cudaSuccess) {
goto Error;
}
// Launch a kernel on theGPU with one thread for each element.
addKernel<<<1,size>>>(dev_c, dev_a, dev_b);
// cudaDeviceSynchronizewaits for the kernel to finish, and returns
// any errors encounteredduring the launch.
cudaStatus =cudaDeviceSynchronize();
if (cudaStatus !=cudaSuccess) {
goto Error;
}
// Copy output vector fromGPU buffer to host memory.
cudaStatus = cudaMemcpy(c,dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);
if (cudaStatus !=cudaSuccess) {
goto Error;
}
Error:
cudaFree(dev_c);
cudaFree(dev_a);
cudaFree(dev_b);
return cudaStatus;
}
//在View類中包含Computing.cuh頭檔案,并添加一個菜單響應,響應程式如下
intc[5];
CString str1;
if(vvmain(c) == 0){
str1.Format(L"%d,%d,%d,%d,%d",c[0],c[1],c[2],c[3],c[4]);
MessageBox(str1);
}
執行結果: