使用nvcc从CUDA创建DLL

mac*_*las 5 dll cuda nvcc

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

内核

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

void hello(const char *s) {
        printf("Hello %s\n", s);
}/*
Run Code Online (Sandbox Code Playgroud)

内核

#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
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下方法创建DLL 之后先生成一个kernel.o对象,如下所示:nvccg++

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
Run Code Online (Sandbox Code Playgroud)

它工作正常并生成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;
}
Run Code Online (Sandbox Code Playgroud)

编译为:

g++ -o app.exe main.c -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include" -L. -lkernel
Run Code Online (Sandbox Code Playgroud)

结果是执行开始时出现内存访问错误。

不过,如果我使用相同的命令在.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
Run Code Online (Sandbox Code Playgroud)

而且不起作用。

.cpp和.c

Warning: .drectve `/DEFAULTLIB:"LIBCMT" /DEFAULTLIB:"OLDNAMES" /EXPORT:hello ' unrecognized
Run Code Online (Sandbox Code Playgroud)

而且有效。

mac*_*las 7

解决了。我仍然不知道为什么会发生(也许是因为没有像 Robert Crovella 所说的那样使用官方编译器),但是用这个替换了两个用于制作 DLL 的命令是有效的:

nvcc -o kernel.dll --shared kernel.cu
Run Code Online (Sandbox Code Playgroud)

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