CUDA: MFC中的联调CUDA方法实例

CUDA: MFC中的联调CUDA方法实例

本文我们为大家介绍CUDA与MFC联调的实现。

  SDK中程序的编译

  例如我们的SDK安装路径“C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\projects\deviceQuery”中可以找到deviceQuery的工程文件。

  当我们把这个文件夹拷贝到其他目录下时,会出现找不到头文件的错误,如“找不到cutil.h”。为什么会出现这种情况呢?我们注意到在deviceQuery中对其的引用#include ,是在系统目录下的。这个系统目录在C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\common\inc中可以找到cutil.h头文件。

  通过查看deviceQuery.cu的属性,通过观察“命令行”:

  "$(CUDA_BIN_PATH)\nvcc.exe" -ccbin "$(VCInstallDir)bin" -c -D_DEBUG -DWIN32 -D_CONSOLE -D_MBCS -Xcompiler /EHsc,/W3,/nologo,/Wp64,/Od,/Zi,/RTC1,/MTd -I"$(CUDA_INC_PATH)" -I./ -Ihttp://www.cnblogs.com/common/inc -o $(ConfigurationName)\deviceQuery.obj deviceQuery.cu

  注意红色下划线部分,带便往上退两个文件夹,然后进入commom文件夹中的inc文件夹。再比较之前的两个路径,这正好是deciceQuery.sin文件到cutil.h的一个访问的过程。

SDK中程序的编译

SDK中程序的编译

  当我们将工程文件拷贝到新的目录下时,这样的一个访问方式必然会失效。于是我们需要做如下的一些设置。

SDK中程序的编译

  1. 首先我们需要将C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\bin\win32文件目录下的四个文件夹分别添加到环境变量里。

  具体的操作方法是:”我的电脑” ->属性->高级->环境变量PATH,注意路径都是全路径,每个变量间用“;”分隔。

SDK中程序的编译

  2. 注意到这里面的系统变量NVSDKCUDA_ROOTC:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK

SDK中程序的编译

  我们在转移了工程文件目录后,只需要将命令行进行修改。即将之前的红线部分作如下修改:

  "$(CUDA_BIN_PATH)\nvcc.exe" -ccbin "$(VCInstallDir)bin" -c -D_DEBUG -DWIN32 -D_CONSOLE -D_MBCS -Xcompiler /EHsc,/W3,/nologo,/Wp64,/Od,/Zi,/RTC1,/MTd -I"$(CUDA_INC_PATH)" -I./ -I"$(NVSDKCUDA_ROOT)/common/inc" -o $(ConfigurationName)\deviceQuery.obj deviceQuery.cu

  3. 此外我们还需要将“项目属性”的“链接器”做对应的修改。然后该程序即可正常编译运行。

SDK中程序的编译

  MFC中应用CUDA程序

  本章建立一个MFC工程,然后在该工程中添加对cu文件中CUDA程序的调用。本章还可参考SDK中的程序示例cppIntegration。

  配置VisualStudio环境配置准备工作

  语法高亮:将d:\programming\cuda\sdk\doc\syntax_highlighting\visual_studio_8里面的usertype.dat文件copy到Microsoft Visual Studio 8\Common7\IDE目录下面(如果已经存在,就追加到原来的后面)。

  设置VS2005环境(因为本程序将不仅仅是在cu文件中使用CUDA函数了,其中还包括在cpp文件中使用,所以需要包括这些库):

  进入Tools|Options|Projects and Solutions|VC++Directories 添加:

  Include files:

  d:\programming\cuda\toolkit\include

  d:\programming\cuda\sdk\common\inc

  Library files:

  d:\programming\cuda\toolkit\lib

  d:\programming\cuda\sdk\common\lib

  Source files:

d:\programming\cuda\sdk\common\src

  文本编辑器设置:进入VC++ Project Settings:C/C++ File extensions:添加*.cu,在Text editor-File extension:添加cu 对应editor到Microsoft VC++ editor。

  Visual Assist X设置(如果需要安装的话):关闭已经所有打开的Visual studio,安装VA,之后进入注册表编辑器:HKEY_CURRENT_USER\Software\Whole Tomato\VANet8 找到右边的ExtSource项,将其值添加.cu;.cuh;之后关闭,再次打开VS2005即可。)

  创建全局函数和头文件

  首先我们在头文件和资源文件中建立全局函数以供调用:

  这里的testcuda函数采用extern关键字声明C语言扩展。

MFC中应用CUDA程序

MFC中应用CUDA程序

  我们在查看类视图的时候就可以看到该全局函数:

MFC中应用CUDA程序

  创建CUDA代码

  为了标示清楚,我们首先创建了一个名为CUDA的筛选器,然后在该筛选器中分别创建名为first.cu和first_kernel.cu的两个源代码文件。然后其中添加代码如下:

#include "stdio.h"
#include "cutil.h"
#include "first_kernel.cu"

extern "C" void runtest(float *source, int datalen, float *result)
{
    int count;
    cudaGetDeviceCount(&count);
    if(count == 0) {
        fprintf(stderr, "There is no device.\n");
         *result=-1;
    }
    int i;
    for(i = 0; i < count; i++) {
        cudaDeviceProp prop;
        if(cudaGetDeviceProperties(&prop, i) == cudaSuccess) {
            if(prop.major >= 1) {
                break;
            }
        }
    }
    if(i == count) {
        fprintf(stderr, "There is no device supporting CUDA 1.x.\n");
         *result=-1;
    }
     float *d_source, *d_result;
     cudaMalloc((void**)&d_source, datalen * sizeof(float));
     cudaMalloc((void**)&d_result, sizeof(float));
     cudaMemcpy(d_source, source, datalen * sizeof(float), cudaMemcpyHostToDevice);
kernel<<<1,256,0>>>(d_source,datalen,d_result); cudaMemcpy(result,d_result,sizeof(float),cudaMemcpyDeviceToHost); cudaFree(d_source); cudaFree(d_result); }

  以及在first_kernel.cu中添加的内核函数(即并行部分):

#ifndef _FIRST_KERNEL_H_
#define _FIRST_KERNEL_H_

__global__ void kernel(float *source,int len,float *result)
{
     int i;
     float sum;
     sum=0;
     for(i=0;i<len;i++)
         sum+=*(source+i);

     *result=sum;
}

#endif

修改链接器设置

  首先是first.cu的属性设置:

  将“常规”中的工具一项设为“自定义生成工具”。

  然后在命令行中参考3.1中的设置方式。这里需要注意的是“附加依赖项”为first_kernel.cu.

修改链接器设置

修改链接器设置

  而在first_kernel.cu中的属性设置,我们需要将这个存放内核函数的文件“从生成中排除”。

修改链接器设置

  最后是设置项目的属性,仍旧参照3.1在“项目属性”的“链接器”的属性中作一些改动。

修改链接器设置

  在“项目属性”的“链接器”的“输入”中加入附加依赖项库文件cudart.lib。

修改链接器设置

  最后便可以编译运行程序了。


http://write.blog.csdn.net/postedit

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cuda检测工具 devicequery.zip(不含源代码,源代码在cuda sdk 8.0里) deviceQuery.exe Starting... CUDA Device Query (Runtime API) version (CUDART static linking) Detected 1 CUDA Capable device(s) Device 0: "GeForce GTX 760" CUDA Driver Version / Runtime Version 9.2 / 8.0 CUDA Capability Major/Minor version number: 3.0 Total amount of global memory: 2048 MBytes (2147483648 bytes) ( 6) Multiprocessors, (192) CUDA Cores/MP: 1152 CUDA Cores GPU Max Clock rate: 1137 MHz (1.14 GHz) Memory Clock rate: 3004 Mhz Memory Bus Width: 256-bit L2 Cache Size: 524288 bytes Maximum Texture Dimension Size (x,y,z) 1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096) Maximum Layered 1D Texture Size, (num) layers 1D=(16384), 2048 layers Maximum Layered 2D Texture Size, (num) layers 2D=(16384, 16384), 2048 layers Total amount of constant memory: 65536 bytes Total amount of shared memory per block: 49152 bytes Total number of registers available per block: 65536 Warp size: 32 Maximum number of threads per multiprocessor: 2048 Maximum number of threads per block: 1024 Max dimension size of a thread block (x,y,z): (1024, 1024, 64) Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535) Maximum memory pitch: 2147483647 bytes Texture alignment: 512 bytes Concurrent copy and kernel execution: Yes with 1 copy engine(s) Run time limit on kernels: Yes Integrated GPU sharing Host Memory: No Support host page-locked memory mapping: Yes Alignment requirement for Surfaces: Yes Device has ECC support: Disabled CUDA Device Driver Mode (TCC or WDDM): WDDM (Windows Display Driver Model)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值