【问题标题】:Compiling/adding cuda code to existing project (CMake)将 cuda 代码编译/添加到现有项目 (CMake)
【发布时间】:2017-08-21 18:40:01
【问题描述】:

我正在尝试通过 CUDA 代码将现有项目的一部分移植到 GPU。我了解 cmake 具有单独处理 .cu 文件的选项(find_cuda ...),但我仍在试图弄清楚如何在现有项目的上下文中使用这个生态系统。

我的问题如下。假设我有一个带有 cmake 配置文件 (CMakeLists) 的现有 C++ 项目。当前优雅地(如果可能)包含 CUDA 内核的做法是什么?能否以某种方式构造 CMakeList,仅在 GPU 存在时编译 .cu 文件?

我目前的想法是创建一个单独的文件夹,其中仅存在 CUDA 相关代码,然后将其编译为静态库。是这样的吗?

【问题讨论】:

    标签: c++ cmake cuda


    【解决方案1】:

    将 CUDA 文件放在单独的文件夹中是我推荐的方式,但不是必需的。基本原则是将所有 .cu 文件收集在一个 CMake 变量中(我们称之为 CUDA_SRC),并将所有 .cpp 文件收集在一个不同的变量中(称之为 SRC)。现在您编译这两个文件并将它们放在一起。 find_package(CUDA) 提供的变量CUDA_FOUND 可用于确定您的系统上是否安装了CUDA。不需要为 cuda 文件使用静态库,但我会在这里向您展示两种方式。

    在您的顶级 cmake 文件中,您希望有这样的东西来查找 CUDA 并设置一些 nvcc 标志:

    find_package(CUDA QUIET)
    if(CUDA_FOUND)
        include_directories(${CUDA_INCLUDE_DIRS})
        SET(ALL_CUDA_LIBS ${CUDA_LIBRARIES} ${CUDA_cusparse_LIBRARY} ${CUDA_cublas_LIBRARY})
        SET(LIBS ${LIBS} ${ALL_CUDA_LIBS})
        message(STATUS "CUDA_LIBRARIES: ${CUDA_INCLUDE_DIRS} ${ALL_CUDA_LIBS}")
        set(CUDA_PROPAGATE_HOST_FLAGS ON)
        set(CUDA_SEPARABLE_COMPILATION OFF)
        list( APPEND CUDA_NVCC_FLAGS -gencode=arch=compute_30,code=compute_30 )
        list( APPEND CUDA_NVCC_FLAGS -gencode=arch=compute_52,code=sm_52 )
    endif()
    

    使用静态 CUDA 库

    if(CUDA_FOUND)
         #collect CUDA files
         FILE(GLOB_RECURSE CUDA_SRC  *.cu)
         #build static library
         CUDA_ADD_LIBRARY(my_cuda_lib ${CUDA_SRC} STATIC)
         SET(LIBS ${LIBS} ${my_cuda_lib})
    endif()
    
    #collect cpp files
    FILE(GLOB_RECURSE SRC  *.cpp)
    
    #compile .cpp files and link it to all libraries
    add_executable(${PROG_NAME} ${SRC})
    target_link_libraries(${PROG_NAME} ${LIBS} )
    

    没有静态 CUDA 库

    FILE(GLOB_RECURSE SRC  *.cpp)
    
    if(CUDA_FOUND)
        #compile cuda files and add the compiled object files to your normal source files
        FILE(GLOB_RECURSE CUDA_SRC  *.cu)
        cuda_compile(cuda_objs ${CUDA_SRC})
        SET(SRC ${SRC} ${cuda_objs})
    endif()
    
    #compile .cpp files and link it to all libraries
    add_executable(${PROG_NAME} ${SRC})
    target_link_libraries(${PROG_NAME} ${LIBS} )
    

    【讨论】:

    • 太棒了,这正是我想知道的。
    • 好吧,我刚遇到这个问题/答案,这个答案对我不起作用,它只是导致我得到这个 CMake 错误:(target_link_libraries):无法为目标指定链接库“/ usr/local/cuda-10.2/lib64/libcudart_static.a" 不是由这个项目构建的。我在这里发布了一个新问题:stackoverflow.com/questions/68320042/… 关于这个问题
    猜你喜欢
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2015-06-26
    • 2020-08-17
    • 2017-11-12
    • 2012-03-14
    相关资源
    最近更新 更多