如何将我的项目正确链接到使用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)?我的项目不包含cuda代码,超出预编译libcholmod.so的链接。我是否需要将我的CMake编译器设置为NVCC,即使libcholmod.so已经使用NVCC编译了?
其他CHOLMOD详情:
CHOLMOD使用一些规则来决定矩阵是否应该在GPU上分解:CHOLMOD_ND_ROW_LIMIT, CHOLMOD_ND_COL_LIMIT, CHOLMOD_POTRF_LIMIT, CHOLMOD_GPU_SKIP
我已经确保我的测试矩阵满足这些标准。