天天看點

MFC中使用CUDA5.0的方法(VS2010環境)

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,确定。

MFC中使用CUDA5.0的方法(VS2010環境)

3、還是右擊“解決方案資料總管”中的項目名稱,點選“添加-建立篩選器”,建立一個篩選器,取名為“CUDA”。

MFC中使用CUDA5.0的方法(VS2010環境)

4、右擊建立的篩選器,點選“添加-建立項”,可以發現建立檔案的對話空中已經多出了兩個CUDA的選項,我們可以從這裡直接添加cu和cuh檔案,一般我們可以分别添加一個cu和一個cuh檔案。

MFC中使用CUDA5.0的方法(VS2010環境)
MFC中使用CUDA5.0的方法(VS2010環境)

5、右擊cu檔案,點選屬性,在“正常-項類型”中選擇“CUDA C/C++”,點選确定。注意:是cu檔案才這麼配置,cuh檔案千萬别動它。

MFC中使用CUDA5.0的方法(VS2010環境)

6、右擊工程名,選“屬性”,在“配置屬性-連結器-輸入-附加依賴項”中加上cudart.lib和uafxcwd.lib。

MFC中使用CUDA5.0的方法(VS2010環境)

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);

        }

執行結果:

MFC中使用CUDA5.0的方法(VS2010環境)

繼續閱讀