Я хочу создать .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
и она работает.
Что произойдет, если переименовать файл .CU в .cpp вместо .c ли он по-прежнему работает? –
Хорошо работает для меня в Linux (ну, без 'dllimport' и с' -fPIC'). Когда я использую подробный режим ('nvcc -v'), я вижу, что' nvcc' вызывает 'gcc' в режиме C++ по умолчанию (' gcc -x C++ ... '). – BenC
@Robert Он также работает с .cpp. – machlas