我想從CUDA代碼(kernel.cu
)創建一個.dll文件,以便從外部C程序中使用此庫。經過一番嘗試,我在.cu文件中留下了一個簡單的C函數。碼如下:使用nvcc從CUDA創建DLL
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是否有所不同。
.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
和它的作品。
如果重命名.CU文件的.cpp,而不是.C它仍然可以工作,會發生什麼編譯後的dll? – 2013-05-07 16:44:32
在Linux上對我來說工作很好(沒有'dllimport'和'-fPIC')。當我使用詳細模式('nvcc -v')時,我可以看到'nvcc'默認在C++模式下調用'gcc'('gcc -x C++ ...')。 – BenC 2013-05-08 02:17:12
@Robert它也適用於.cpp。 – machlas 2013-05-08 07:31:33