分享

使用nvcc从CUDA创建 DLL

 LibraryPKU 2018-03-20

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

kernel.cu

#include 
#include"kernel.h"
void hello(const char *s) {
 printf("Hello %sn", 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

我尝试首先使用 nvcc 生成一个 kernel.o 对象,然后使用 g++ 创建 DLL,如下所示:

nvcc -c kernel.cu -o kernel.o
g++ -shared -o kernel.dll kernel.o -L"C:Program FilesNVIDIA GPU Computing ToolkitCUDAv5.0libx64" -lcudart

它工作正常并生成 kernel.dll 。 为了测试DLL文件,我编写了这个简单的程序 main.c:

#include 
#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 FilesNVIDIA GPU Computing ToolkitCUDAv5.0include" -L. -lkernel

当执行开始时产生内存访问错误。

但是,如果我在. c ( 因为它只是C 代码) 中重命名. cu 文件,使用相同的命令,它就。 nvcc的输出更改,因为我知道,因为它使用默认的C 编译器而不是使用ipqos一个。

你觉得这跟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

而且它。

【Note】

已经解决。我仍然不知道为什么发生了( 也许是因为没有使用像罗伯特。com这样的正式的官方编译器),但是替换了这两个命令作为一个程序:

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

注意双击( nvcc以此方式工作),以及直接创建一个 .o 而不是创建第一个,然后从对象创建 DLL 。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多