2013-05-07 144 views
2

我想從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 

和它的作品。

+0

如果重命名.CU文件的.cpp,而不是.C它仍然可以工作,會發生什麼編譯後的dll? – 2013-05-07 16:44:32

+0

在Linux上對我來說工作很好(沒有'dllimport'和'-fPIC')。當我使用詳細模式('nvcc -v')時,我可以看到'nvcc'默認在C++模式下調用'gcc'('gcc -x C++ ...')。 – BenC 2013-05-08 02:17:12

+0

@Robert它也適用於.cpp。 – machlas 2013-05-08 07:31:33

回答

1

已解決。我仍然不知道爲什麼發生了(也許是因爲沒有使用官方編譯器像羅伯特Crovella說的),但將通過這一個做一個DLL的兩個命令的工作原理:

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

注意雙破折號(nvcc以這種方式工作),以及直接創建它的事實,而不是先創建.o,然後從對象中創建DLL。

0

在visual studio中,你也可以將它編譯成.dll而不是a。> - - 項目名稱 - 屬性 - >配置屬性 - >配置類型

變化從應用程序文件(.exe),以動態庫選項

DEBUG:通過選項導航OBJ文件文件(.dll)

你可以找到在debug文件夾或發行文件夾