我一直在尝试创建一个执行以下操作的
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,并且没有调用任何函数,所以我明白为什么这可能不是一个好的解决方案。