Вам не нужно все компилировать с помощью nvcc.Ваше предположение, что вы можете просто скомпилировать свой код CUDA с помощью NVCC и оставить все остальное (кроме ссылок), правильно.Вот подход, который я бы использовал, чтобы начать.
Добавьте 1 новый заголовок (например, myCudaImplementation.h) и 1 новый исходный файл (с расширением .cu, например, myCudaImplementation.cu).Исходный файл содержит вашу реализацию ядра , а также a (host) C-функцию-обертку, которая вызывает ядро с соответствующей конфигурацией выполнения (aka <<<>>>
) и аргументами.Заголовочный файл содержит прототип для функции-оболочки C.Давайте назовем эту функцию-оболочку runCudaImplementation()
Я бы также предоставил другую функцию хоста C в исходном файле (с прототипом в заголовке), которая запрашивает и конфигурирует имеющиеся устройства GPU и возвращает trueесли это успешно, ложь, если нет.Давайте назовем эту функцию configureCudaDevice()
.
Теперь в вашем исходном 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
Теперь, поскольку вы поместили весь свой код 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, для которых этот пост может быть полезен .