Using CMake to link to a TPL that was compiled with NVCC

371 Views Asked by At

How do I properly link my project to a TPL (CHOLMOD) that employs CUDA?

I want to link my CMake project to CHOLMOD (libcholmod.so). CHOLMOD was compiled separately with -GPU_BLAS, which is simply a flag that enables GPU functionality. The CHOLMOD library comes with several demos that allow the user to test that the library is functioning and working properly with the GPU. These tests all pass, and monitoring the GPU activity confirms these passes.

Now, I want to link my CMake project to gain access to libcholmod.so. I have done this with a simple FindCholmod.cmake file:

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 (where I've ensured I am finding the same libraries used during CHOLMOD compilation):

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)

Of course I have similar FindMetis, FindOpenBlas, and FindLapack files. I then link everything:

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})

Using this method, I can successfully gain access to CHOLMOD library of functions within my CMake project. In fact, it runs well, but it is just not accessing the GPU despite my following the CHOLMOD userguide to set export CHOLMOD_USE_GPU=1 and in cpp Common->useGPU=1.

My question is, how do I properly link my project to a TPL (CHOLMOD) that employs CUDA? My project contains no cuda code, beyond the link to the precompiled libcholmod.so. Do I need to set my CMake compiler to NVCC, even though libcholmod.so is already compiled with NVCC?

Additional CHOLMOD details: CHOLMOD uses some rules to decide if a matrix should be factorized on the GPU or not: CHOLMOD_ND_ROW_LIMIT, CHOLMOD_ND_COL_LIMIT, CHOLMOD_POTRF_LIMIT, CHOLMOD_GPU_SKIP I have ensured that my test matrix satisfies these criteria.

0

There are 0 best solutions below