dynamic包含一个CUDA文件

时间:2014-07-07 21:55:03

标签: c++ c cuda makefile header-files

我有一个应用程序的两个解算器,一个在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。有什么想法吗?

1 个答案:

答案 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