我有一个应用程序的两个解算器,一个在C中,另一个在CUDA中。 Makefile检测nvcc是否可用并自动切换为使用CUDA解算器。否则,它应该使用C求解器。
我想在检测到nvcc时才包含CUDA求解器的标题,所以我在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))
问题是即使nvcc在系统中不可用,主文件也包含utilCUDA.h。有什么想法吗?
答案 0 :(得分:1)
在编译时,make环境中定义的变量不会自动显示在源代码级别。参考this question/answer,在Makefile中为CUDA和非CUDA用法设置make变量的部分中,执行以下操作:
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)
添加到编译命令行。在该命令行中编译的任何源代码都将看到define。
然后在您的源代码中,您可以执行以下操作:
#ifdef USE_CUDA
#include "utilCUDA.h"
#endif
#ifdef NO_CUDA
// whatever else you want to do.
#endif
顺便说一句,如果您尝试使用.cpp
编译nvcc
文件,则可能无法获得预期的结果。如果需要这样做,请在指定编译命令时使用nvcc -x cu
option。