CUDA dll的创建与测试.docx_第1页
CUDA dll的创建与测试.docx_第2页
CUDA dll的创建与测试.docx_第3页
CUDA dll的创建与测试.docx_第4页
CUDA dll的创建与测试.docx_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

CUDA dll的创建与测试创建dll第一步新建一个win32dll项目。选择dll自动生成了dll相关的框架。库函数入口点DllMain:第二步,添加CUDA函数相关的文件CUDAdll.cuh和CUDAdll.cu并设置框架属性。为其设置生成属性:CUDAdll.cuh文件设置项目“生成自定义”选择CUDA4.0并打钩设置CUDAdll.cu文件的生成属性,选择CUDA C/C+。此时如果编译该dll项目,会出现问题,报错如下:1Link:1所有输出均为最新。1正在创建库 D:elecmymfctestVS2010pGPUDemosCUDAdlltestDebugCUDAdlltest.lib和对象 D:elecmymfctestVS2010pGPUDemosCUDAdlltestDebugCUDAdlltest.exp1CUDAdll.cu.obj : error LNK2019:无法解析的外部符号 _cudaRegisterFatBinary4,该符号在函数 void _cdecl _sti_cudaRegisterAll_42_tmpxft_00000e60_00000000_3_CUDAdll_cpp1_ii_564e775d(void) (?_sti_cudaRegisterAll_42_tmpxft_00000e60_00000000_3_CUDAdll_cpp1_ii_564e775dYAXXZ)中被引用1CUDAdll.cu.obj : error LNK2019:无法解析的外部符号 _cudaUnregisterFatBinary4,该符号在函数 void _cdecl _cudaUnregisterBinaryUtil(void) (?_cudaUnregisterBinaryUtilYAXXZ)中被引用1D:elecmymfctestVS2010pGPUDemosCUDAdlltestDebugCUDAdlltest.dll : fatal error LNK1120: 2个无法解析的外部命令11生成失败。意思是链接的时候出错了,找不到链接外部符号,原因是缺少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)#endifextern 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 /引入导出函数声明头文件/初始化CUDAextern 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 = 1)/验证主计算能力,即计算能力的第一位数是否大于1printf(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文件:通过微软的VC+6.0或者VS2010安装时带的Tools中的Depends工具打开CUDAdlltest.dll,可以看到导出的函数和变量:需要注意的是前面在CUDAdll.cuh中输入内容中红色部分的指定编译方式宏很重要,如果没有该部分就会导出上图中VS在创建工程时默认给出导出示例函数和变量(包含该函数的两个文件CUDAdlltest.h和CUDAdlltest.cpp实际上没有用到仅作为比对,可以删去)都带有Visual C+自己的修饰符号,在win32默认的控制台程序中调用这些函数往往由于有修饰而加载时出现找不到函数的情况,而且在外部C语言程序/编译方式下无法正常运行。测试dll创建一个测试前面生成的dll的工程项目选择win32控制台项目自动生成框架如下:首先使用动态加载DLL的方式:在testCUDAdll.cpp中输入程序如下:#include stdafx.h#include /引入C函数库#include #include /显示/动态加载链接测试typedef void(*DLLFUNC)(void);/声明需要从dll中调用的函数原型的函数指针int _tmain(int argc, _TCHAR* argv)HINSTANCE hcudaDll=LoadLibrary(_T(CUDAdlltest.dll);/动态地加载CUDAdlltest.dllif (hcudaDll)DLLFUNC dllFun=(DLLFUNC)GetProcAddress(hcudaDll,showHelloCuda);/获得函数指针if (dllFun)dllFun();/执行showHelloCuda函数elseprintf(Can not find the function in dll!);/可能由于函数名错误FreeLibrary(hcudaDll);/动态地卸载CUDAdlltest.dllelseprintf(Load dll fail!);return 0;将CUDAdlltest.dll文件复制到测试程序.exe文件的目录下,编译之后运行结果如下:可见程序执行正确。使用CUDAdlltest.lib静态链接方式测试:在testCUDAdll.cpp中输入程序如下:#include stdafx.h#include /引入C函数库#include #include #pragma comment(lib,CUDAdlltest.lib)/引用库文件/导出函数的声明 extern C是不可少的extern C int count;/已导出的全局变量extern C bool InitCUDA(void);/已导出的CUDA初始化函数extern C void showHelloCuda(void); /已导出的测试函数/隐式/静态加载链接测试int _tmain(int argc, _TCHAR* argv)showHelloCuda();/调用库中的函数return 0;将CUDAdlltest.lib文件复制到工程目录下以及将CUDAdlltest.dll文件复制到测试程序.exe文件的目录下,编译并运行程序,结果同上:通过在VS平台将CUDA相关的函数(CUDA的编译器windows版本现在只能在VS平台中使用)封装成dll库之后就可以在Visual C+6.0平台中使用了,这是个非常好的方法。例如上面的测试程序在VC6.0的控制台程序中如下:#include stdafx.h#include /引入C函数库#include #include #pragma comment(lib,CUDAdlltest.lib)/引用库文件/导出函数的声明 extern C是不可少的extern C int count;/已导出的全局变量extern C bool InitCUDA(void);/已导出的CUDA初始化函数extern C void showHelloCuda(void); /已导出的测试函数int main(int argc, char* argv)showHelloCuda();/调用库中的函数return 0;不过VS平台上创建的工程默认是Unicode字符集的,即前面的那个dll库文件是Unicode字符集的如果直接将其拷贝到VC6.0默认创建的MBCS多字节字符集测试工程中,编译能通过,但是如果有字符操作的函数运行可能会出错,因而需要将字符集也设置为库创建时相同的字符集,程序中也可能要做相应的修改。最后给出本文的三个测试程序(一个是库文件程序,另外两个是VS2010平台和VisualC+6.0平台下的测试程序,可以方便地作为CUDA dl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论