2013-05-07 8 views
2

Я хочу создать .dll из кода CUDA (kernel.cu), чтобы использовать эту библиотеку из внешней программы на языке C. После некоторых попыток я просто оставил простую функцию C в файле .cu. Код следующим образом:Создание DLL из CUDA с помощью nvcc

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 

Результата является ошибкой доступа к памяти при запуске выполнения.

Тем не менее, если я переименую файл .cu в .c (как только код C), используя те же команды, он действительно работает. Как мне известно, выход nvcc изменяется, поскольку использует C-компилятор по умолчанию C вместо CUDA.

Как вы думаете, это проблема, связанная с nvcc? Или я ошибаюсь?

EDIT: Я забыл информацию, которая может быть важной. Предупреждения появляются при первом вызове 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 ли он по-прежнему работает? –

+0

Хорошо работает для меня в Linux (ну, без 'dllimport' и с' -fPIC'). Когда я использую подробный режим ('nvcc -v'), я вижу, что' nvcc' вызывает 'gcc' в режиме C++ по умолчанию (' gcc -x C++ ... '). – BenC

+0

@Robert Он также работает с .cpp. – machlas

ответ

1

Решено. Я до сих пор не знаю, почему произошло (возможно, это происходит из-за не используя официальный компилятор, как Роберт Crovella сказал), но заменяя две команды для создания DLL этой одной работы:

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

Обратите внимание на двойной dash (nvcc работает таким образом) и факт его создания вместо создания первого .o, а затем создания DLL из объекта.

0

В визуальной студии вы также можете скомпилировать ее в DLL, а не в.OBJ файл с помощью навигации по опциям:

DEBUG - имя Project - -> Свойства> Конфигурация - - Свойства> Конфигурация Тип

Изменить вариант из приложения (.exe) в динамической библиотеке (.dll)

вы можете найти библиотеку DLL после компиляции в DEBUG папке или RELEASE папку

Смежные вопросы