CUDA 5.0 separate compilation of library with cmake

后端 未结 4 1102
情话喂你
情话喂你 2020-12-05 11:59

The buildtime of my cuda library is increasing and so I thought that separate compilation introduced in CUDA 5.0 might help me. I couldn\'t figure out how to achieve separat

4条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-05 12:42

    I couldn't make it works using CUDA_ADD_EXECUTABLE so I created a function that makes a custom target to do so.

    function(add_cuda_exe_lib name files libraries is_lib)
        set (obj_list)
        foreach(file ${files})
            add_custom_command(
                OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${file}.o
                DEPENDS ${file} 
                COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --blue "Building NVCC Device object ${CMAKE_CURRENT_SOURCE_DIR}/${file}"
                COMMAND ${CUDA_NVCC_EXECUTABLE} ${CUDA_NVCC_FLAGS} -dc "${CMAKE_CURRENT_SOURCE_DIR}/${file}" -o "${CMAKE_CURRENT_BINARY_DIR}/${file}.o"
                COMMENT "Building ${CMAKE_CURRENT_SOURCE_DIR}/${file}"
                VERBATIM
            )
    
            LIST(APPEND obj_list ${CMAKE_CURRENT_BINARY_DIR}/${file}.o)
        endforeach()
    
        set (lib_list)
        LIST(APPEND lib_list "-lcudadevrt")
        foreach(library_name ${libraries})
            LIST(APPEND lib_list "-l${library_name}")
        endforeach()
    
        set (flags ${CUDA_NVCC_FLAGS})
        if (is_lib)
            LIST(APPEND flags "-dlink")
            set (obj_name "${CMAKE_CURRENT_BINARY_DIR}/${name}.so")
        else()
            set (obj_name "${CMAKE_CURRENT_BINARY_DIR}/${name}")
        endif()
    
        add_custom_target(${name} ALL 
            COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --red "Linking CXX executable ${name}"
            COMMAND ${CUDA_NVCC_EXECUTABLE} ${flags} ${obj_list} ${lib_list} -o ${obj_name}
            DEPENDS ${obj_list}
            COMMENT "Linking ${name}"
        )
    endfunction()
    
    function(add_cuda_exe name files libraries)
        add_cuda_exe_lib(${name} "${files}" "${libraries}" OFF)
    endfunction()
    
    function(add_cuda_lib name files libraries)
        add_cuda_exe_lib(${name} "${files}" "${libraries}" ON)
    endfunction()
    

    Now, to generate a lib, just use:

    add_cuda_lib(testar "devicemanager.cu;blub.cu" "")
    

    Or this to generate an executable:

    add_cuda_exe(testar "devicemanager.cu;blub.cu" "")
    

    The last param is a list of libs to be attached.

    I hope it helps.

提交回复
热议问题