Как я могу скомпилировать код CUDA, а затем связать его с проектом С++?
Я ищу помощь при запуске проекта с участием CUDA. Моя цель - иметь проект, который я могу скомпилировать в компиляторе native g++, но использует код CUDA. Я понимаю, что мне нужно скомпилировать код CUDA в компиляторе nvcc, но из моего понимания я могу каким-то образом скомпилировать код CUDA в файл кубика или файл ptx.
Вот мои вопросы:
- Как использовать nvcc для компиляции в файл кубика или файл ptx? Мне не нужен -c или что-то еще?
- Какой тип файла я хочу использовать?
- Какие команды g++ правильно компилируют и связывают проект вместе?
Предположим следующее:
- У меня есть файл с именем main.cpp, который имеет в нем главную функцию и включает cuda.h.
- У меня есть еще один файл cudaFunc.cu, в котором есть код CUDA. Скажем, например, что я хочу добавить два целых массива, которые существуют в main.cpp.
Ответы
Ответ 1
Мне удалось решить мою проблему с помощью нескольких разных постов, включая эти. Не забывайте, что если вы используете 64-битную машину для связи с 64-битной библиотекой! Это кажется очевидным, но для клоунов, как я, это то, что я забыл. Вот файл make, который я сейчас использую... если вы сможете переварить этот файл make, вы сможете сделать то, что я пытался сделать, - это отдельная компиляция кода cuda и другого кода G++. Также имейте в виду, что у вас должны быть компиляторы gcc, G++ в определенных версиях (я использую G++ -4.4, и он работает для меня) В любом случае, вот файл make...
all: program
program: cudacode.o
g++ -o program -L/usr/local/cuda/lib64 -lcuda -lcudart main.cpp cudacode.o
cudacode.o:
nvcc -c -arch=sm_20 cudacode.cu
clean: rm -f *.o program
Надеюсь, вы увидите, что первым делом я скомпилирую cudacode (который был сохранен как .cu
) с использованием компилятора nvcc
и опции -c
(также обратите внимание, что вы можете удалить -arch=sm_20
). Это создало cudacode.o
. Затем я использую компилятор G++ с опцией -o
и связываюсь с библиотекой lib64 и связываю библиотеки -lcuda
и -lcudart
вместе с компиляцией моего main.cpp
и затем связываю cudacode.o
. Надеюсь, это поможет кому-то!
Ответ 2
Мой ответ на этот недавний вопрос скорее всего описывает то, что вам нужно.
Пара дополнительных заметок:
- Вам не нужно компилировать
.cu
в файл .cubin
или .ptx
. Вам необходимо скомпилировать его в объектный файл .o
, а затем связать его с объектными файлами .o
из ваших файлов .cpp, скомпилированных с g++.
- Помимо помещения кода ядра cuda в
cudaFunc.cu
, вам также необходимо поместить в этот файл функцию-обертку C или C++, которая запускает ядро (если только вы не используете API драйвера CUDA, что маловероятно и не рекомендуется), Также добавьте файл заголовка с прототипом этой функции-оболочки, чтобы вы могли включить его в свой код C++, который должен вызывать код CUDA. Затем вы связываете файлы вместе, используя стандартную линию связи g++.
Ответ 3
Я обнаружил, что связывание скомпилированного объектного кода cuda с g++ может быть проблематичным.
Попробуйте выполнить его следующим образом:
all:
nvcc cudafile.cu mainfile.cpp -o executable
clean: rm -rf *.o