【IT168 技术】CUDA的DLL开发其实和一般的C/C++的DLL开发是一个原理,当然,DLL的开发就有几种方式,这里就讲最容易理解的,也最直接的方式,然后把代码放出来。大家自己可以琢磨一下其它的方式。
1. 创建DLL
用我的Wizard 可以创建一个DLL项目工程:
选择DLL项目,然后可以看到下面的项目文件结构:
其中sampe_cu.h文件为头文件,stdafx.h和stdafx.cpp是windows的加载的相关文件,这里可以不用理会,DLL_Test.cpp是其中的一个导出函数文件,也是声明了DkkMain的入口函数,这里是在DLL创建,加载,卸载的时候需要处理的一些内容,这里如果不熟悉DLL也不用管它。
针对CUDA,这里我们就来看sample.cu文件:
/************************************************************************/
/* HelloCUDA */
/************************************************************************/
int TestHelloCUDA(void)
{
if(!InitCUDA()) {
return 0;
}
char *device_result = 0;
char host_result[12] ={0};
CUDA_SAFE_CALL( cudaMalloc((void**) &device_result, sizeof(char) * 11));
unsigned int timer = 0;
CUT_SAFE_CALL( cutCreateTimer( &timer));
CUT_SAFE_CALL( cutStartTimer( timer));
HelloCUDA<<<1, 1, 0>>>(device_result, 11);
CUT_CHECK_ERROR("Kernel execution failed/n");
CUDA_SAFE_CALL( cudaThreadSynchronize() );
CUT_SAFE_CALL( cutStopTimer( timer));
printf("Processing time: %f (ms)/n", cutGetTimerValue( timer));
CUT_SAFE_CALL( cutDeleteTimer( timer));
CUDA_SAFE_CALL( cudaMemcpy(&host_result, device_result, sizeof(char) * 11, cudaMemcpyDeviceToHost));
printf("%s/n", host_result);
CUDA_SAFE_CALL( cudaFree(device_result));
//CUT_EXIT(argc, argv);
return 0;
}
/* HelloCUDA */
/************************************************************************/
int TestHelloCUDA(void)
{
if(!InitCUDA()) {
return 0;
}
char *device_result = 0;
char host_result[12] ={0};
CUDA_SAFE_CALL( cudaMalloc((void**) &device_result, sizeof(char) * 11));
unsigned int timer = 0;
CUT_SAFE_CALL( cutCreateTimer( &timer));
CUT_SAFE_CALL( cutStartTimer( timer));
HelloCUDA<<<1, 1, 0>>>(device_result, 11);
CUT_CHECK_ERROR("Kernel execution failed/n");
CUDA_SAFE_CALL( cudaThreadSynchronize() );
CUT_SAFE_CALL( cutStopTimer( timer));
printf("Processing time: %f (ms)/n", cutGetTimerValue( timer));
CUT_SAFE_CALL( cutDeleteTimer( timer));
CUDA_SAFE_CALL( cudaMemcpy(&host_result, device_result, sizeof(char) * 11, cudaMemcpyDeviceToHost));
printf("%s/n", host_result);
CUDA_SAFE_CALL( cudaFree(device_result));
//CUT_EXIT(argc, argv);
return 0;
}
这个就是sample.cu文件里面的实现的dll的接口函数,当然还有一个def文件,这个文件是用来做动态导出用的,看看def文件:
LIBRARY "DLL_Test"
EXPORTS
TestHelloCUDA
EXPORTS
TestHelloCUDA
这个是sample.def文件的内容,这个文件是为了能动态导出DLL里面的函数接口而用的。编译器通过这个文件把声明的TestHelloCUDA,接口导出。
编译,就可以在相应的目录里面得到一个xxxx.dll文件.