Создание DLL из CUDA с помощью nvcc



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



Kernel.cu



#include <stdio.h>
#include "kernel.h"

void hello(const char *s) {
printf("Hello %sn", s);
}/*


Ядро.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 FilesNVIDIA GPU Computing ToolkitCUDAv5.0libx64" -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 FilesNVIDIA GPU Computing ToolkitCUDAv5.0include" -L. -lkernel


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



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



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



EDIT : я забыл кое-какую информацию, которая может быть важный. Предупреждения появляются при первом вызове g++ (при создании dll), и они различаются в зависимости от того, является ли .cu .С или .СРР.



.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


И это работает.

717   2  

2 ответов:

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

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

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

В visual studio вы также можете сделать его компиляцию в a .DLL вместо себя .obj-файл, перейдя по опциям:

DEBUG - > - имя проекта - свойства - > свойства конфигурации - > тип конфигурации

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

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

Comments

    Ничего не найдено.