динамически включать файл CUDA

0

У меня есть два решателя для приложения, один в C и другие в CUDA. Makefile определяет, доступен ли nvcc и автоматически переключается на использование решателя CUDA. В противном случае он должен использовать решатель C.

Я хотел включить заголовок решателя CUDA, только если nvcc обнаружен, поэтому я сделал это в файле main.cpp:

#if (NVCC_TEST == nvcc)
    #include "utilCUDA.h"
#endif

NVCC_TEST объявляется в Makefile следующим образом:

NVCC_RESULT := $(shell which nvcc 2> NULL)
NVCC_TEST := $(notdir $(NVCC_RESULT))

Проблема в том, что основной файл включает utilCUDA.h, даже когда nvcc недоступен в системе. Есть идеи?

Теги:
makefile
cuda
header-files

1 ответ

1
Лучший ответ

Переменные, определенные в среде make, автоматически не отображаются на уровне исходного кода при компиляции. Ссылаясь на этот вопрос/ответ, в разделе вашего файла Makefile, где вы устанавливаете переменные make для использования CUDA и non-CUDA, сделайте следующее:

        NVCC_RESULT := $(shell which nvcc 2> NULL)
        NVCC_TEST := $(notdir $(NVCC_RESULT))
ifeq ($(NVCC_TEST),nvcc)
        CC := nvcc
        CCFLAGS := -DUSE_CUDA
else
        CC := g++
        CCFLAGS := -DNO_CUDA
endif

Затем в вашем Makefile вы указываете команду компиляции, добавьте $(CCFLAGS) в командную строку компиляции. Любой исходный код, скомпилированный в этой командной строке, увидит это определение.

Затем в исходном коде вы можете:

#ifdef USE_CUDA
#include "utilCUDA.h"
#endif

#ifdef NO_CUDA
// whatever else you want to do.
#endif

Кстати, если вы попытаетесь скомпилировать файл .cpp с nvcc, вы, вероятно, не получите nvcc результатов. Если вам нужно сделать это, используйте nvcc -x cu вариант, когда вы указываете вашу команду компиляции.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню