У меня есть два решателя для приложения, один в 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 недоступен в системе. Есть идеи?
Переменные, определенные в среде 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
вариант, когда вы указываете вашу команду компиляции.