文档章节

如何封装CUDA类库,编译成dll以供其他工程调用

周卓
 周卓
发布于 2014/06/05 16:34
字数 741
阅读 860
收藏 7

环境:win7_64 VS2010 CUDA6.0 VAX Quadro410

安装配置CUDA环境,这里就不详细介绍了。

一、手动建立CUDA工程

  1. 打开VS2010,新建空白项目,起名为 test2。 

  2. 在解决方案管理器中,右键点击工程test2,生成自定义,选择CUDA6.0

  3. 添加头文件 t.h,注意这里t.cuh,也是可以的,但是为了外观上等同于纯C\C++类库,写成.h

  4. 添加源文件 t.cu ,右键点击t.cu,属性,常规,项类型,选择CUDA C/C++。

    这样一个手动建立的CUDA工程就配置好了。

二、建立CUDA类库,并生成dll

  1. 在t.h中,写上函数声明,包含两类函数,一是KERNEL函数,使用GPU的并行计算;二是调用KERNEL函数的普通C函数。这两类函数必须放到cu文件中,由CUDA编译器编译,内容如下:

#ifndef _TEST2_H
#define _TEST2_H//防御重复编译
#ifdef _DLLEXPORTING//dll到处符号宏定义
#define TEST2_DLLDECL __declspec(dllexport)
#else
#define TEST2_DLLDECL __declspec(dllimport)
#endif
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
//这两个头文件是CUDA必备,但是你右键->打开文档“”的时候VS却不能找到。不需要你手动设置路径,只需要在 右键工程->生成自定义 中,选择CUDA,VS即可自动找到包含路径
#include <stdio.h>
__global__ void addKernel(int *c, const int *a, const int *b);//这个是KERNEL函数,不能作为类库外部接口
cudaError_t TEST2_DLLDECL  addWithCuda(int *c, const int *a, const int *b, unsigned int size);//这个C函数,内部调用了KERNEL函数,只能放在cu文件中,使用CUDA编译器编译。使用__declspec(dllimport)调用声明,作为dll的接口供外部调用。

    2.在t.cu中写入两个函数的实现,如下:

#include "t.h"
__global__ void addKernel(int *c, const int *a, const int *b)
{
    int i = threadIdx.x;
    c[i] = a[i] + b[i];
}
cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size)
{
 //其他代码省略
        addKernel<<<1, size>>>(dev_c, dev_a, dev_b);
        //其他代码省略
 return cudaStatus;
}

    3.工程属性,CUDA C\C++中,选择Host ,Proprocessor Definition 中,添加_DLLEXPORTING

    4.在工程属性中,设置生成目标为DLL,这样会生成,dll,lib,pdb,等几种文件

三、普通C++工程调用CUDA类库dll

  1. 在相同解决方案中新建工程,在工程属性中,链接器,常规,附加库目录,添加上一步生成的lib所在的目录;在链接器,输入,附加依赖项,添加test2.lib;保证你生成的exe和dll在同一目录下。

  2. 工程,右键,生成自定义,选择CUDA

  3. 虽然CUDA编译器参与了生成过程,但是这个工程就是普通的C、C++工程, 自身使用VC编译器,你只需要添加#include“..\\test2\\test2.h”就行了

© 著作权归作者所有

共有 人打赏支持
周卓
粉丝 5
博文 7
码字总数 3519
作品 0
沈阳
私信 提问
使用Visual Studio,几步实现Python C++扩展,以及DLL调用

decodeFile(PyObject self, PyObject args){ } static PyMethodDef methods[] = { }; import DynamsoftBarcodeReader formats = { } def initLicense(license): def decodeFile(fileName): i......

yushulx
2015/05/26
0
0
[CLI/C++].NET托管代码和非托管代码的相互调用

场景三:现有C++原代码,包装后供C#调用。 C++的原代码,实际上可以直接编译成托管代码。MFC也好ATL也好……这样看起来在.NET中最强大的编程语言就是C++了:它不仅可以编写托管 程序,甚至可...

Yong_Luo
2010/10/01
0
0
[Unity3d]调用自己封装的dll,假装让自己也牛B一把吧

之前总感觉会封装dll组件的都是大牛级别的程序员做的事情,然后供给菜鸟级别的调用。感觉为了保护自己的源码不会被他人知道,然后就封装一个dll供人家调用,那样就觉得很牛,今天我也尝试摸索...

丁小未
2013/12/04
7.1K
0
c++调用matlab生成的Dll动态连接库

点击打开链接 http://download.csdn.net/detail/nuptboyzhb/4228429 c++调用matlab生成的Dll动态连接库 实验平台: matlab 7.0(R2009a) VC++6.0 思路: 1. 设置matlab的编译器,使用外部的V...

长平狐
2012/10/08
2.4K
0
lib 和 dll 文件的区别和联系

什么是lib文件,lib和dll的关系如何? (1) lib是编译时需要的,dll是运行时需要的。 如果要完成源代码的编译,有lib就够了。 如果也使动态连接的程序运行起来,有dll就够了。 在开发和调试阶段...

laymanxia
2014/05/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

用any-loader封装jQuery的XHR —— 随便写着玩系列

哎,都说没人用JQuery啦,叫你别写这个。 其实我也是好高骛远使用过npm上某个和某个很出名的XHR库,嗯,认识我的人都知道我喜欢喷JQ,以前天天喷,见面第一句,你还用JQ,赶紧丢了吧。但我也...

曾建凯
今天
1
0
聊聊storm的AggregateProcessor的execute及finishBatch方法

序 本文主要研究一下storm的AggregateProcessor的execute及finishBatch方法 实例 TridentTopology topology = new TridentTopology(); topology.newStream("spout1", spout......

go4it
今天
3
0
大数据教程(7.5)hadoop中内置rpc框架的使用教程

博主上一篇博客分享了hadoop客户端java API的使用,本章节带领小伙伴们一起来体验下hadoop的内置rpc框架。首先,由于hadoop的内置rpc框架的设计目的是为了内部的组件提供rpc访问的功能,并不...

em_aaron
今天
5
0
CentOS7+git+github创建Python开发环境

1.准备CentOS7 (1)下载VMware Workstation https://pan.baidu.com/s/1miFU8mk (2)下载CentOS7镜像 https://mirrors.aliyun.com/centos/ (3)安装CentOS7系统 http://blog.51cto.com/fengyuns......

枫叶云
昨天
3
0
利用ibeetl 实现selectpicker 的三级联动

1. js 直接写在html页面上面,ibeetl 就可以动态地利用后台传上来的model List ,不需要每次点击都要ajax请求后台 2. 使用selectpicker 的时候,除了对selecct option的动态处理后,还需要 $("#...

donald121
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部