我想从CUDA代码(kernel.cu
)创建一个.dll,以便从外部C程序中使用该库。经过一些尝试,我只是在.cu文件中留下了一个简单的C函数。代码如下:
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 :(得分:1)
解决。我仍然不知道为什么会发生(可能是因为没有像Robert Crovella那样使用官方编译器),但是用这个命令替换这两个命令就可以了:
nvcc -o kernel.dll --shared kernel.cu
请注意双破折号(nvcc以这种方式工作),以及直接创建它而不是先创建.o
然后从对象创建DLL的事实。
答案 1 :(得分:0)
在visual studio中,您还可以通过浏览选项将其编译为.dll而不是.obj文件:
DEBUG - &gt; - 项目名称 - 属性 - &gt;配置属性 - &gt;配置类型
将选项从Application(.exe)更改为Dynamic Library(.dll)
您可以在DEBUG文件夹或RELEASE文件夹
中编译后找到dll