【发布时间】:2018-10-13 18:42:58
【问题描述】:
我想在使用 cmake 构建系统的现有 C++ 代码库中添加 cuda 代码。我从 NVIDIA 找到了一篇文章(下面的链接),它准确地展示了它是如何完成的,除了它使用 make build。我是 cmake 构建系统的新手,但我通过阅读和试验本网站其他链接的内容进行了很好的尝试。至今没有成功!有人知道吗?如果是,请指导我。
https://devblogs.nvidia.com/separate-compilation-linking-cuda-device-code/
这是我的 CMakeLists.txt 文件
cmake_minimum_required(VERSION 3.5.1)
message(STATUS "CMake version: ${CMAKE_VERSION}")
project(CUDAwithC)
find_package(CUDA 9.1 REQUIRED)
INCLUDE(FindCUDA)
INCLUDE_DIRECTORIES(/usr/local/cuda-9.1/include include)
set(SOURCE_FILES src/app.cpp src/particle.cpp src/v3.cpp)
cuda_add_executable(
tee ${SOURCE_FILES}
)
set(
CUDA_NVCC_FLAGS
${CUDA_NVCC_FLAGS};
-x cu -gencode -arch=compute_20 -dc
)
target_link_libraries(
tee /usr/local/cuda/lib64/libcudart.so
)
【问题讨论】:
-
cuda 9.1 不支持
-arch=compute_20。 This 可能感兴趣。使用它而不是-dc标志。如果您在 SO 上的cuda标记上进行一些搜索,您会发现有关单独编译的其他问题,这些问题可能有您想要的。试试this search -
@RobertCrovella,来自 Nvidia 的帖子将 cuda 代码添加到 cpp 文件中,但 stackoverflow 上的其他帖子侧重于处理 .cu 文件和 .cpp 文件。我找不到任何引用链接中提到的方法的答案。
-
您找不到任何与
CUDA_SEPARABLE_COMPILATION属性相关的答案?我给了你一个返回几个例子的搜索链接。 -
嗨@RobertCrovella 非常感谢您的建议。我可以用 cmake 构建代码。有效的解决方案:将所有 .cpp 文件转换为 .cu 文件并设置 cuda_seperable_complaition。但是,我仍然不明白整个想法。所有文件都有一些 CUDA 特定的关键字和扩展名 .cu 所以,这些文件必须由 nvcc 编译而不设置 cuda_seperable_complaition 那么为什么它只在 seperable_compliation 上工作?如果我不启用它,那么它会为没有任何 cuda 特定关键字的函数出现链接错误。请解释一下好吗?
-
可分离编译在nvcc manual中描述。每当您在一个编译单元中有设备代码并调用另一个编译单元中的设备代码时,都需要它。如果您的项目中有这样的场景,那么简单地将所有内容转换为 .cu 文件并使用 nvcc 进行编译是不够的。您还必须启用可分离编译。除此之外,我无法解释您的项目的任何具体内容,因为您没有给出任何完整的示例。