c++ - 动态包含一个 CUDA 文件

标签 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))

问题是主文件包含 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/

相关文章:

cuda - 使用 cudaMallocPitch 分配 2D 数组并使用 cudaMemcpy2D 复制

CUDA扭曲同步问题

c++ - 大文件上的 fwrite 字节损坏

c++ - 使用带有默认大小写和 lambda 函数的 switch 语句时出现 gcc 错误

c - sscanf 不兼容的指针类型

cuda - NVIDIA MPS(多进程服务器)和 CUDA Streams 是什么关系?

c++ - 像 Qt Creator 一样在 Visual Studio 中打开 Cmake 项目

c++ - memcmp 为相同(零值)位字段结构返回非零

c - 指向字符串的指针数组

c - 为什么 strtok() 拆分我什至没有传递给它的字符串?