CUDA dll的创建与测试

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CUDA dll的创建与测试创建dll

第一步新建一个win32dll项目。

选择dll

自动生成了dll相关的框架。库函数入口点DllMain:

第二步,添加CUDA函数相关的文件CUDAdll.cuh和CUDAdll.cu并设置框架属性。

为其设置生成属性:

CUDAdll.cuh文件

设置项目“生成自定义”

选择CUDA4.0并打钩

设置CUDAdll.cu文件的生成属性,选择CUDA C/C++。

此时如果编译该dll项目,会出现问题,报错如下:

1>Link:

1> 所有输出均为最新。

1> 正在创建库

D:\elec\mymfctest\VS2010p\GPUDemos\CUDAdlltest\Debug\CUDAdlltest.lib和对象D:\elec\mymfctest\VS2010p\GPUDemos\CUDAdlltest\Debug\CUDAdlltest.exp

1>CUDAdll.cu.obj : error LNK2019:无法解析的外部符号

___cudaRegisterFatBinary@4,该符号在函数"void __cdecl

__sti____cudaRegisterAll_42_tmpxft_00000e60_00000000_3_CUDAdll_cpp1_ii_564 e775d(void)"

(?__sti____cudaRegisterAll_42_tmpxft_00000e60_00000000_3_CUDAdll_cpp1_ii_5 64e775d@@YAXXZ)中被引用

1>CUDAdll.cu.obj : error LNK2019:无法解析的外部符号

___cudaUnregisterFatBinary@4,该符号在函数"void __cdecl

__cudaUnregisterBinaryUtil(void)" (?__cudaUnregisterBinaryUtil@@YAXXZ)中被引用

1>D:\elec\mymfctest\VS2010p\GPUDemos\CUDAdlltest\Debug\CUDAdlltest.dll : fatal error LNK1120: 2个无法解析的外部命令

1>

1>生成失败。

意思是链接的时候出错了,找不到链接外部符号,原因是缺少cuda的运行库,通过项目的链接输入中添加CUDA的运行库cudart.lib可以解决。

至此,在没有编辑cuda函数实现文件的情况下可以正常将项目编译成功,则表明基本上将CUDAdll的框架搭建成功了。

第三步,编辑CUDAdll的实现文件对应的函数。

在CUDAdll.cuh中输入内容如下:

#include //引入C函数库-实际上本程序就是应该以C的方式编译,尽管其后缀为cpp类型

#include

#include //引入CUDA运行时库头文件

#ifdef __cplusplus //指明函数的编译方式,以得到没有任何修饰的函数名extern "C"

{

#endif

#ifdef CUDADLLTEST_EXPORTS

#define CUDADLLTEST_API __declspec(dllexport) //导出符号宏定义

#else

#define CUDADLLTEST_API __declspec(dllimport)

#endif

extern CUDADLLTEST_API int count; //要导出的全局变量

CUDADLLTEST_API bool InitCUDA(void); //要导出的CUDA初始化函数 CUDADLLTEST_API void showHelloCuda(void); //要导出的测试函数

#ifdef __cplusplus

}

#endif

接着在在CUDAdll.cu中输入内容如下:

#include "stdafx.h" //引入预编译头文件

#include "CUDAdll.cuh" //引入导出函数声明头文件

//初始化CUDA

extern int count=0;

bool InitCUDA(void)//CUDA初始化函数

{

printf("Start to detecte devices.........\n");//显示检测到的设备数

cudaGetDeviceCount(&count);//检测计算能力大于等于1.0的设备数 if(count == 0){

fprintf(stderr, "There is no device.\n");

return false;

}

printf("%d device/s detected.\n",count);//显示检测到的设备数

int i;

for(i = 0; i < count; i++){//依次验证检测到的设备是否支持CUDA

cudaDeviceProp prop;

if(cudaGetDeviceProperties(&prop, i) == cudaSuccess) {//获得设备属性并验证是否正确

if(prop.major >= 1)//验证主计算能力,即计算能力的第一位数是否大于1

{

printf("Device %d: %s supports

CUDA %d.%d.\n",i+1,,prop.major,prop.minor);//显示检测到的设备支持的CUDA版本

break;

}

}

}

if(i == count) {//没有支持CUDA1.x的设备

fprintf(stderr, "There is no device supporting CUDA 1.x.\n");

return false;

}

cudaSetDevice(i);//设置设备为主叫线程的当前设备

return true;

}

void showHelloCuda(void)//测试CUDA初始化函数

{

if(!InitCUDA()) //初始化失败

{

printf("Sorry,CUDA has not been initialized.\n");

return;

}

printf("Hello GPU! CUDA has been initialized.\n");

}

输入完毕保存后进行编译,则将在Debug目录下输出对应的dll文件:

相关文档
最新文档