Сборка программы GPL C с модулем CUDA - PullRequest
12 голосов
/ 20 февраля 2012

Я пытаюсь изменить программу GPL, написанную на C. Моя цель - заменить один метод реализацией CUDA, что означает, что мне нужно скомпилировать с nvcc вместо gcc.Мне нужна помощь в создании проекта, а не в его реализации (вам не нужно ничего знать о CUDA C, чтобы помочь, я не думаю).

Я впервые пытаюсь изменить проект на Cумеренная сложность, которая включает в себя .configure и Makefile.Честно говоря, я впервые за долгое время что-то делал на C, включая что-то, связанное с gcc или g ++, поэтому я довольно растерян.

Меня не очень интересует изучение configure и Makefiles - этобольше эксперимента.Я хотел бы увидеть, насколько хорошо идет реализация проекта, прежде чем тратить время на создание правильного сценария сборки.(Не желая учиться по мере необходимости, просто пытаюсь дать представление о масштабах).

С учетом сказанного, каковы мои варианты создания этого проекта?У меня множество вопросов ...

  • Я попытался добавить "CC = nvcc" в файл configure.in после AC_PROG_CC.Похоже, это сработало - выход из запуска configure и make показал nvcc в качестве компилятора.Однако make не удалось скомпилировать исходный файл с ядром CUDA, не распознав специфический синтаксис CUDA.Я не знаю почему, надеялся, что это просто сработает.

  • Можно ли скомпилировать исходный файл с помощью nvcc, а затем включить его на этапе компоновки в процессе make дляосновная программа?Если так, то как?(Этот вопрос может не иметь смысла - я действительно ржавый в этом)

  • Какой правильный способ сделать это?

  • Есть либыстрый и грязный способ, который я мог бы использовать для целей тестирования?

  • Есть ли какой-нибудь секретный инструмент, который все используют для установки и понимания этих файлов конфигурации и Makefile?Это даже хуже, чем скрипты Apache Ant, к которым я привык (Да, я вне своего царства)

1 Ответ

19 голосов
/ 21 февраля 2012

Вам не нужно все компилировать с помощью nvcc.Ваше предположение, что вы можете просто скомпилировать свой код CUDA с помощью NVCC и оставить все остальное (кроме ссылок), правильно.Вот подход, который я бы использовал, чтобы начать.

  1. Добавьте 1 новый заголовок (например, myCudaImplementation.h) и 1 новый исходный файл (с расширением .cu, например, myCudaImplementation.cu).Исходный файл содержит вашу реализацию ядра , а также a (host) C-функцию-обертку, которая вызывает ядро ​​с соответствующей конфигурацией выполнения (aka <<<>>>) и аргументами.Заголовочный файл содержит прототип для функции-оболочки C.Давайте назовем эту функцию-оболочку runCudaImplementation()

  2. Я бы также предоставил другую функцию хоста C в исходном файле (с прототипом в заголовке), которая запрашивает и конфигурирует имеющиеся устройства GPU и возвращает trueесли это успешно, ложь, если нет.Давайте назовем эту функцию configureCudaDevice().

  3. Теперь в вашем исходном C-коде, где вы обычно вызываете реализацию своего ЦП, вы можете сделать это.

    // must include your new header
    #include "myCudaImplementation.h"
    
    // at app initialization
    // store this variable somewhere you can access it later
    bool deviceConfigured = configureCudaDevice;          
    ...                             
    // then later, at run time
    if (deviceConfigured) 
        runCudaImplementation();
    else
        runCpuImplementation(); // run the original code
    
  4. Теперь, поскольку вы поместили весь свой код CUDA в новый файл .cu, вам нужно только скомпилировать этот файл с помощью nvcc.Все остальное остается прежним, за исключением того, что вы должны ссылаться в объектном файле, который выводит nvcc.например,

    nvcc -c -o myCudaImplementation.o myCudaImplementation.cu <other necessary arguments>
    

Затем добавьте myCudaImplementation.o в вашу линию ссылок (что-то вроде :) g ++ -o myApp myCudaImplementation.o

Теперь, если у вас есть комплексПриложение для работы с которым использует configure и уже имеет сложный make-файл, оно может быть более сложным, чем приведенное выше, но это общий подход.В итоге вы не хотите компилировать все ваши исходные файлы с помощью nvcc, только .cu.Используйте ваш хост-компилятор для всего остального.

Я не специалист по конфигурированию, поэтому не могу помочь.Вы можете запустить configure для генерации make-файла, а затем отредактировать этот make-файл - это не будет общим решением, но поможет вам начать работу.

Обратите внимание, что в некоторых случаях вам также может понадобитьсячтобы отделить ваши файлы .cu от ссылки на них.В этом случае вам нужно использовать отдельные функции компиляции и компоновки NVCC, для которых этот пост может быть полезен .

...