我想从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)
而且有效。
解决了。我仍然不知道为什么会发生(也许是因为没有像 Robert Crovella 所说的那样使用官方编译器),但是用这个替换了两个用于制作 DLL 的命令是有效的:
nvcc -o kernel.dll --shared kernel.cu
Run Code Online (Sandbox Code Playgroud)
请注意双破折号(nvcc 以这种方式工作),以及直接制作它而不是先创建.o然后从对象制作 DLL的事实。
| 归档时间: |
|
| 查看次数: |
5910 次 |
| 最近记录: |