2013-05-07 123 views
2

我想从CUDA代码(kernel.cu)创建一个.dll文件,以便从外部C程序中使用此库。经过一番尝试,我在.cu文件中留下了一个简单的C函数。码如下:使用nvcc从CUDA创建DLL

kernel.cu

#include <stdio.h> 
#include "kernel.h" 

void hello(const char *s) { 
     printf("Hello %s\n", s); 
}/* 

kernel.h当

#ifndef KERNEL_H 
#define KERNEL_H 

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

#ifdef __cplusplus 
extern "C" { 
#endif 

void __declspec(dllexport) hello(const char *s); 

#ifdef __cplusplus 
} 
#endif 

#endif // KERNEL_H 

我试图首先生成kernel.o对象与nvcc和我用g++用于创建DLL作为以下之后:

nvcc -c kernel.cu -o kernel.o 
g++ -shared -o kernel.dll kernel.o -L"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\lib\x64" -lcudart 

它工作正常,并生成kernel.dll。要测试的DLL文件我写了这个简单的程序main.c

#include <stdio.h> 

#ifdef __cplusplus 
extern "C" { 
#endif 

void __declspec (dllimport) hello(const char *s); 

#ifdef __cplusplus 
} 
#endif 

int main(void) { 
     hello("World"); 
     return 0; 
} 

编译:

g++ -o app.exe main.c -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include" -L. -lkernel 

结果是一个内存访问错误开始执行时。不过,如果我用.c重命名.cu文件(因为它只是C代码),使用相同的命令,它确实可行。据我所知,nvcc的输出更改,因为它使用默认的C编译器而不是CUDA。

你觉得这是nvcc的问题吗?或者我犯了什么错误?

编辑:我忘了一些可能很重要的信息。在第一次调用g ++(创建dll时)时出现警告,根据.cu .c或.cpp是否有所不同。

.CU

Warning: .drectve `/FAILIFMISMATCH:"_MSC_VER=1600" /FAILIFMISMATCH:"_ITERATOR_DEBUG_LEVEL=0" 
/DEFAULTLIB:"libcpmt" /DEFAULTLIB:"LIBCMT" /DEFAULTLIB:"OLDNAMES" /EXPORT:hello ' unrecognized 

,它不工作。

的.cpp和.C

Warning: .drectve `/DEFAULTLIB:"LIBCMT" /DEFAULTLIB:"OLDNAMES" /EXPORT:hello ' unrecognized 

和它的作品。

+0

如果重命名.CU文件的.cpp,而不是.C它仍然可以工作,会发生什么编译后的dll? – 2013-05-07 16:44:32

+0

在Linux上对我来说工作很好(没有'dllimport'和'-fPIC')。当我使用详细模式('nvcc -v')时,我可以看到'nvcc'默认在C++模式下调用'gcc'('gcc -x C++ ...')。 – BenC 2013-05-08 02:17:12

+0

@Robert它也适用于.cpp。 – machlas 2013-05-08 07:31:33

回答

1

已解决。我仍然不知道为什么发生了(也许是因为没有使用官方编译器像罗伯特Crovella说的),但将通过这一个做一个DLL的两个命令的工作原理:

nvcc -o kernel.dll --shared kernel.cu 

注意双破折号(nvcc以这种方式工作),以及直接创建它的事实,而不是先创建.o,然后从对象中创建DLL。

0

在visual studio中,你也可以将它编译成.dll而不是a。> - - 项目名称 - 属性 - >配置属性 - >配置类型

变化从应用程序文件(.exe),以动态库选项

DEBUG:通过选项导航OBJ文件文件(.dll)

你可以找到在debug文件夹或发行文件夹