Подтвердить что ты не робот

Как я могу скомпилировать код CUDA, а затем связать его с проектом С++?

Я ищу помощь при запуске проекта с участием CUDA. Моя цель - иметь проект, который я могу скомпилировать в компиляторе native g++, но использует код CUDA. Я понимаю, что мне нужно скомпилировать код CUDA в компиляторе nvcc, но из моего понимания я могу каким-то образом скомпилировать код CUDA в файл кубика или файл ptx.

Вот мои вопросы:

  • Как использовать nvcc для компиляции в файл кубика или файл ptx? Мне не нужен -c или что-то еще?
  • Какой тип файла я хочу использовать?
  • Какие команды g++ правильно компилируют и связывают проект вместе?

Предположим следующее:

  • У меня есть файл с именем main.cpp, который имеет в нем главную функцию и включает cuda.h.
  • У меня есть еще один файл cudaFunc.cu, в котором есть код CUDA. Скажем, например, что я хочу добавить два целых массива, которые существуют в main.cpp.
4b9b3361

Ответ 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

Мой ответ на этот недавний вопрос скорее всего описывает то, что вам нужно.

Пара дополнительных заметок:

  1. Вам не нужно компилировать .cu в файл .cubin или .ptx. Вам необходимо скомпилировать его в объектный файл .o, а затем связать его с объектными файлами .o из ваших файлов .cpp, скомпилированных с g++.
  2. Помимо помещения кода ядра 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