我想创建一个从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
和它的作品。