我的一个应用程序有两个求解器,一个用 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))
问题是主文件包含 utilCUDA.h,即使系统中没有 nvcc。有什么想法吗?
最佳答案
编译时,make 环境中定义的变量不会自动显示在源代码级别。引用this question/answer ,在您为 CUDA 与非 CUDA 使用设置 make 变量的 Makefile 部分中,执行以下操作:
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
顺便说一句,如果您尝试使用nvcc
编译.cpp
文件,您可能不会获得预期的结果。如果您需要这样做,请使用 nvcc -x cu
option当您指定编译命令时。
关于c++ - 动态包含一个 CUDA 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24620557/