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,确定。
![](http://img.my.csdn.net/uploads/201212/08/1354967128_4671.png)
3、还是右击“解决方案资源管理器”中的项目名称,点击“添加-新建筛选器”,新建一个筛选器,取名为“CUDA”。
![](http://img.my.csdn.net/uploads/201212/08/1354967134_5478.png)
4、右击新建的筛选器,点击“添加-新建项”,可以发现新建文件的对话空中已经多出了两个CUDA的选项,我们可以从这里直接添加cu和cuh文件,一般我们可以分别添加一个cu和一个cuh文件。
![](http://img.my.csdn.net/uploads/201212/08/1354967139_1809.png)
![](http://img.my.csdn.net/uploads/201212/08/1354967144_7223.png)
5、右击cu文件,点击属性,在“常规-项类型”中选择“CUDA C/C++”,点击确定。注意:是cu文件才这么配置,cuh文件千万别动它。
![](http://img.my.csdn.net/uploads/201212/08/1354967148_2622.png)
6、右击工程名,选“属性”,在“配置属性-链接器-输入-附加依赖项”中加上cudart.lib和uafxcwd.lib。
![](http://img.my.csdn.net/uploads/201212/08/1354967152_4085.png)
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);
}
执行结果:
1、安装软件:CUDA5.0将开发驱动程序、Toolkit和GPUComputing SDK整合到一个安装文件中,安装过程也很简洁。如果需要单步调试CUDA程序,还需要安装NSight。(软件下载可以从http://www.nvidia.cn/object/cuda-cn.html找到)。
2、新建一个MFC项目,具体设置可以根据自己的需要。之后右击解决方案管理器中的项目名称,选“生成自定义…”,在弹出的对话空中勾选CUDA5.0,确定。
![](http://img.my.csdn.net/uploads/201212/08/1354967128_4671.png)
3、还是右击“解决方案资源管理器”中的项目名称,点击“添加-新建筛选器”,新建一个筛选器,取名为“CUDA”。
![](http://img.my.csdn.net/uploads/201212/08/1354967134_5478.png)
4、右击新建的筛选器,点击“添加-新建项”,可以发现新建文件的对话空中已经多出了两个CUDA的选项,我们可以从这里直接添加cu和cuh文件,一般我们可以分别添加一个cu和一个cuh文件。
![](http://img.my.csdn.net/uploads/201212/08/1354967139_1809.png)
![](http://img.my.csdn.net/uploads/201212/08/1354967144_7223.png)
5、右击cu文件,点击属性,在“常规-项类型”中选择“CUDA C/C++”,点击确定。注意:是cu文件才这么配置,cuh文件千万别动它。
![](http://img.my.csdn.net/uploads/201212/08/1354967148_2622.png)
6、右击工程名,选“属性”,在“配置属性-链接器-输入-附加依赖项”中加上cudart.lib和uafxcwd.lib。
![](http://img.my.csdn.net/uploads/201212/08/1354967152_4085.png)
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);
}
执行结果:
![](http://img.my.csdn.net/uploads/201212/08/1354967158_5255.png)
相关文章推荐
- VS2010环境下用ANSI C创建DLL和使用方法(转)
- 【Tesseract-OCR】在VS2010环境下使用的方法---精简快速入门之总结
- 在VS2010里MFC对话框中使用OpenGL绘图,添加的控件不显示的一种解决方法
- CUDA5.5+vs2010 环境配置 7.5也可以使用 亲自试过
- VS2010环境使用MFC操作读取excel2003文件
- CUDA5.0 + VS2010环境配置
- 用VS2010构建MASM的编程环境,开始使用MASM(翻译自《Inetl汇编语言程序设计》一书的作者Kip R. Irvine的文章Getting Started with MASM),两种方法搭建IA-32汇编设计环境
- VS2010环境下用ANSI C创建DLL和使用方法
- VS2010环境下MFC使用DataGrid绑定数据源
- VS2010环境下MFC使用DataGrid绑定数据源
- VS2010使用MFC创建绿色软件及单文档和多文档及一个解决方案包含多个项目的解决方法
- VS2008 MFC 与CUDA5.0环境设置及程序运行
- VS2010 MFC中tab control使用方法
- vs2010下MFC中使用CMFCToolBar在图标下显示文本方法
- VS2010环境下MFC使用DataGrid绑定数据源以及控件注册问题解决
- VS2010MFC项目在WinXP环境下关闭时报内存错误解决方法
- 使用VS2010开发的MFC Ribbon应用程序运行后关闭了属性界面、输出界面、类视图、通知栏等再次恢复方法
- VS2010环境使用MFC操作读取excel2010文件
- Linux开发环境搭建与使用——ubuntu物理机安装方法-wubi
- linux系统下使用apt-get install 方法安装lamp环境