从CUDA使用NVCC创建DLL(Creating DLL from CUDA using nvcc

2019-09-02 04:41发布

我想创建一个从CUDA代码(一个.dll kernel.cu为了使用这个库从外部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是不同的。

。随着

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

和它的作品。

Answer 1:

解决了。 我仍然不知道为什么发生了(不知是不是因为不使用官方的编译器像罗伯特Crovella说的),但将作出一个DLL通过这一个工程的两个命令:

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

注意双破折号(NVCC这种方式工作),并使其直接,而不是创造一流的事实.o然后从对象制作DLL。



Answer 2:

在Visual Studio中,你也可以把它通过选项导航编译成一个.dll文件,而不是一个obj文件:

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

从更改应用程序文件(.exe)的选项,以动态库文件(.dll)

您可以在debug文件夹或文件夹释放后编制查找DLL



文章来源: Creating DLL from CUDA using nvcc
标签: dll cuda nvcc