使用不同的编译器、C++ 和 CUDA 创建条件 Makefile

问题描述 投票:0回答:0

我一直在尝试创建一个执行以下操作的

Makefile
。我有一个调用
C++
函数的
CUDA
程序,所以我有一组
.cpp
.cu
文件,所有
CUDA
内核都在
.cu
文件中。

对于每个内核调用,我也有该函数的 CPU 版本,所以我的

.cpp
文件中的代码看起来像这样

if (with_cuda)
{
    call_kernel(parameters);
}
else
{
    call_cpu_function(parameters);
}

call_kernel
函数在
.cu
文件中定义,然后调用实际内核
kernel<<<X,X>>>(...)
.

我希望能够在没有

GPU
CUDA
工具包的系统中编译我的程序。我可以很容易地用一些宏封装调用内核的函数,例如,上面的代码可能看起来像

if (with_cuda)
{
#ifdef WITH_CUDA
    call_kernel(parameters);
#endif
}
else
{
    call_cpu_function(parameters);
}

然后在没有

g++ files.cpp
支持的情况下通过
CUDA
编译,或者
nvcc files.cpp other_files.cu -DWITH_CUDA

我应该用相同的宏将所有其他包含封装到

CUDA
库等
#ifdef...

我如何制作一个

Makefile
来查找已安装的
CUDA
工具包,然后使用
nvcc
进行编译,或者如果未安装则使用
g++
进行编译?我研究过使用 cmake 直接编写
Makefile
,或者使用配置脚本编写 autoconf,但我很迷茫,所以我愿意使用任何其他可能更可取的方法。

此外,如果对内核的每次调用的宏封装不是执行此类操作的标准或最佳方法,我也很乐意改变我的处理方式。我可以看到一个潜在的问题,即除了宏

if
之外,每个调用都必须像上面的代码一样执行
ifdef
语句,所以我可能会在没有
CUDA
的情况下进行编译。尽管如此,无论出于何种原因,bool
with_cuda
都设置为 true,并且没有调用任何函数,所以我明白为什么这可能不是一个好的解决方案。

c++ makefile compilation cuda
© www.soinside.com 2019 - 2024. All rights reserved.