CUDA dll的创建与测试
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
#include
#include
#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文件: