我有一个基于CMake的C++/CUDA项目。目前我正在使用CMake 3.11和CUDA 9.0,我读到现在CUDA是CMake中的一流语言,所以我可以简单地添加.cu
文件,它会自动调用NVCC编译器来处理它们。在此之前,我们必须使用find_package(CUDA)
等,但现在这是一个不推荐使用的功能。
现在的问题是:我们如何编译仍然使用CUDA主机库的普通.cpp
文件?cudaMalloc
、cudaFree
等。到目前为止,我的解决方案是set_source_files_properties(file.cpp PROPERTIES LANGUAGE CUDA)
,但我觉得这不是正确的做法。由于该文件不包含设备代码,因此应该使用GCC编译器进行编译,包括并链接到CUDA库。
这种方法的另一个问题是,它很快就会传播到项目的其余部分。假设一个头文件定义了一个包含dims3
变量的结构,那么#include
这个头的每个.cpp
文件都需要被视为CUDA文件。
我们如何编译仍然使用CUDA主机库的普通.cpp文件?
使用常规C++编译器。没有必要将它们视为CCD_ 10。
我最近在我的这个存储库中切换到了CMake的原生CUDA支持。我现在有:
add_executable(device_management
EXCLUDE_FROM_ALL examples/by_runtime_api_module/device_management.cpp)
add_executable(execution_control
EXCLUDE_FROM_ALL examples/by_runtime_api_module/execution_control.cu)
这两个都使用运行时API(实际上,他们使用我的C++化包装器,它使用运行时API-但大多数包装器都只是头(,但第二个包装器中有一个内核,所以我将其作为.cu
,并由CUDA编译。.cpp
通过简单的旧GCC构建并运行良好。