天天看点

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环境)

继续阅读