您的位置:首页 > 理论基础

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

2012-12-08 19:44 513 查看
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&g
4000
t;>>(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);
        }
 
执行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cuda MFC 计算机视觉