使用nvcc从CUDA创建DLL

时间:2013-05-07 16:04:46

标签: dll cuda nvcc

我想从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

它有效。

2 个答案:

答案 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
相关问题