我想从 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
它有效。