8

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

内核.cu

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

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

内核.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

它有效。

4

2 回答 2

7

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

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

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

于 2013-05-08T12:41:29.173 回答
0

在 Visual Studio 中,您还可以通过以下选项将其编译为 .dll 而不是 .obj 文件:

调试 -> -项目名称- 属性 -> 配置属性 -> 配置类型

将选项从 Application(.exe) 更改为 Dynamic Library(.dll)

编译后的dll可以在DEBUG文件夹或者RELEASE文件夹中找到

于 2016-11-14T10:17:38.680 回答