如何正确地将我的项目链接到使用 CUDA 的 TPL (CHOLMOD)?
我想将我的 CMake 项目链接到 CHOLMOD (libcholmod.so)。CHOLMOD 是使用 -GPU_BLAS 单独编译的,它只是一个启用 GPU 功能的标志。CHOLMOD 库附带几个演示,允许用户测试该库是否正常运行并与 GPU 一起正常工作。这些测试都通过了,监控 GPU 活动可以确认这些通过。
现在,我想链接我的 CMake 项目以访问 libcholmod.so。我用一个简单的 FindCholmod.cmake 文件做到了这一点:
FIND_LIBRARY(CHOLMOD_LIBRARIES NAMES libcholmod.so PATHS /usr/local/SuiteSparse/lib)
FIND_LIBRARY(AMD_LIBRARY NAMES amd libamd PATHS /usr/local/SuiteSparse/lib)
FIND_LIBRARY(CAMD_LIBRARY NAMES camd libcmd PATHS /usr/local/SuiteSparse/lib)
FIND_LIBRARY(COLAMD_LIBRARY NAMES colamd libcolamd PATHS /usr/local/SuiteSparse/lib)
FIND_LIBRARY(CCOLAMD_LIBRARY NAMES ccolamd libccolamd PATHS /usr/local/SuiteSparse/lib)
FIND_LIBRARY(SUITESPARSE_LIBRARY NAMES SuiteSparse libsuitesparseconfig.so
PATHS /usr/local/SuiteSparse/lib)
FIND_PATH(CHOLMOD_INCLUDE_DIR cholmod.h PATH /usr/local/SuiteSparse/include)
MESSAGE(STATUS "FOUND CHOLDMOD " ${CHOLMOD_LIBRARIES})
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Cholmod DEFAULT_MSG CHOLMOD_LIBRARIES
CHOLMOD_INCLUDE_DIR AMD_LIBRARY CAMD_LIBRARY COLAMD_LIBRARY CCOLAMD_LIBRARY
SUITESPARSE_LIBRARY)
MARK_AS_ADVANCED(CHOLMOD_LIBRARIES CHOLMOD_INCLUDE_DIR AMD_LIBRARY CAMD_LIBRARY COLAMD_LIBRARY CCOLAMD_LIBRARY SUITESPARSE_LIBRARY)
FindCublas.cmake (我确保找到在 CHOLMOD 编译期间使用的相同库):
FIND_LIBRARY(CUBLAS_LIBRARY NAMES libcublas.so PATHS /usr/lib/x86_64-linux-gnu )
FIND_LIBRARY(CUDART_LIBRARY NAMES libcudart.so PATHS /usr/lib/x86_64-linux-gnu )
FIND_PATH(CUDA_INCLUDE_DIR cuda.h PATHS /usr/local/cuda-8.0/include)
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(CuBlas DEFAULT_MSG CUBLAS_LIBRARY CUDART_LIBRARY CUDA_INCLUDE_DIR)
MARK_AS_ADVANCED(CUBLAS_LIBRARY CUDART_LIBRARY CUDA_INLUCDE_DIR)
当然,我也有类似的 FindMetis、FindOpenBlas 和 FindLapack 文件。然后我链接所有内容:
SET(LINKLIBS "${LINKLIBS};${CHOLMOD_LIBRARIES};${AMD_LIBRARY};${CAMD_LIBRARY};${COLAMD_LIBRARY};${CCOLAMD_LIBRARY};${OPENBLAS_LIBRARY};${METIS_LIBRARY};${LAPACK_LIBRARY};${CUBLAS_LIBRARY};${CUDART_LIBRARY};${SUITESPARSE_LIBRARY}")
INCLUDE_DIRECTORIES(${METIS_INCLUDE_DIR} ${CHOLMOD_INCLUDE_DIR} ${CUDA_INCLUDE_DIR})
使用这种方法,我可以成功地访问我的 CMake 项目中的 CHOLMOD 函数库。事实上,它运行良好,但它只是没有访问 GPU,尽管我遵循 CHOLMOD 用户指南来设置export CHOLMOD_USE_GPU=1
和在 cpp 中Common->useGPU=1
。
我的问题是,如何正确地将我的项目链接到使用 CUDA 的 TPL (CHOLMOD)?除了指向预编译的 libcholmod.so 的链接之外,我的项目不包含 cuda 代码。即使 libcholmod.so 已经使用 NVCC 编译,我是否需要将我的 CMake 编译器设置为 NVCC?
其他 CHOLMOD 详细信息:CHOLMOD 使用一些规则来决定是否应在 GPU 上分解矩阵:CHOLMOD_ND_ROW_LIMIT, CHOLMOD_ND_COL_LIMIT, CHOLMOD_POTRF_LIMIT, CHOLMOD_GPU_SKIP
我已确保我的测试矩阵满足这些标准。