CUDA DLL 开发流程

结合了几篇文章的方法,前半部分主要参考 http://hi.baidu.com/yilinghl/item/a94b63959e89a3f028164739

需要补充的一点是,编写DLL工程时,需要添加链接器,方法如 http://www.cnblogs.com/chunshan/archive/2011/08/15/2139992.html 所示,在Linker | Input中添加 cudart.lib。

后半部分调用CUDA DLL主要参考:

http://blog.csdn.net/openhero/article/details/4059411

http://www.cnblogs.com/c1230v/articles/1401448.html

http://www.cppblog.com/amyvmiwei/archive/2008/01/02/40202.html

步骤总结起来就是:

1. 新建DLL工程,在工程上单击右键 -> 生成自定义,勾选CUDA;

2. 进入工程属性页,选择Linker | Input,添加 cudart.lib;

3. 新建CUDA文件,编写代码,Release 生成dll和lib;

4. 新建调用工程,编写代码,生成,将dll和lib复制到新工程exe同目录下,运行。

主要代码:

cuda.cu

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

__global__ void vecAdd(int *a, int *b, int *c)
{
	int i = threadIdx.x;
	c[i] = a[i] + b[i];
}

bool cudaVecAdd(int *a, int *b, int *c, int n)
{
	int *dev_a;
	int *dev_b;
	int *dev_c;
	cudaError_t cudaStatus;
	cudaStatus = cudaSetDevice(0);
	if (cudaStatus != cudaSuccess) {
		return false;
	}
	cudaMalloc((void**)&dev_a, n * sizeof(int));
	cudaMemcpy(dev_a, a, n * sizeof(int), cudaMemcpyHostToDevice);
	cudaMalloc((void**)&dev_b, n * sizeof(int));
	cudaMemcpy(dev_b, b, n * sizeof(int), cudaMemcpyHostToDevice);
	cudaMalloc((void**)&dev_c, n * sizeof(int));
	vecAdd<<<1, n>>>(dev_a, dev_b, dev_c);
	cudaDeviceSynchronize();
	cudaMemcpy(c, dev_c, n * sizeof(int), cudaMemcpyDeviceToHost);
	cudaFree(dev_a);
	cudaFree(dev_b);
	cudaFree(dev_c);
	return true;
}

CUDA_dll.cpp

bool cudaVecAdd(int *a, int *b, int *c, int n);

extern "C" _declspec(dllexport) bool cuda_vec_add(int *a, int *b, int *c, int n)
{
	return cudaVecAdd(a, b, c, n);
}

test.cpp

#include "stdafx.h"
#include <Windows.h>

typedef int (*HFUNC)(int *a, int *b, int *c, int n);

int _tmain(int argc, _TCHAR* argv[])
{
	int a[2] = {1, 2};
	int b[2] = {3, 4};
	int c[2] = {0, 0};
	HINSTANCE hDll = LoadLibrary(__T("CUDA_dll.dll"));
	if (hDll)
	{
		HFUNC hFun = (HFUNC)GetProcAddress(hDll, "cuda_vec_add");
		if (hFun)
		{
			hFun(a, b, c, 2);
			printf("%d %d\n", c[0], c[1]);
		}
	}
	return 0;
}


上面是动态调用DLL,静态调用方法如下:

1. 将dll文件复制到DEBUG目录下,lib文件复制到工程文件下;

2. 将dll的头文件包含到工程目录下;

3. 直接在程序中调用即可。


CUDA_dll.h

#pragma comment(lib, "CUDA_dll.lib")
extern "C" _declspec(dllimport) bool cuda_vec_add(int *a, int *b, int *c, int n);

test.cpp

#include "CUDA_dll.h"

int _tmain(int argc, _TCHAR* argv[])
{
	int a[2] = {1, 2};
	int b[2] = {3, 4};
	int c[2] = {0, 0};
	cuda_vec_add(a, b, c, 2);
	printf("%d %d\n", c[0], c[1]);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值