我想从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
和它的作品。
如果重命名.CU文件的.cpp,而不是.C它仍然可以工作,会发生什么编译后的dll? – 2013-05-07 16:44:32
在Linux上对我来说工作很好(没有'dllimport'和'-fPIC')。当我使用详细模式('nvcc -v')时,我可以看到'nvcc'默认在C++模式下调用'gcc'('gcc -x C++ ...')。 – BenC 2013-05-08 02:17:12
@Robert它也适用于.cpp。 – machlas 2013-05-08 07:31:33