Как правильно связать мой проект с TPL (CHOLMOD), в котором используется CUDA?
Я хочу связать свой проект CMake с CHOLMOD (libcholmod.so). CHOLMOD был скомпилирован отдельно с -GPU_BLAS, который является просто флагом, который включает функциональность GPU. Библиотека CHOLMOD поставляется с несколькими демонстрационными примерами, которые позволяют пользователю проверить, работает ли библиотека и работает ли она правильно с графическим процессором. Все эти тесты пройдены, и мониторинг активности графического процессора подтверждает эти проходы.
Теперь я хочу связать свой проект 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})
Используя этот метод, я могу успешно получить доступ к библиотеке функций CHOLMOD в моем проекте CMake. На самом деле, он работает хорошо, но он просто не обращается к графическому процессору, несмотря на то, что я следовал указаниям руководства пользователя CHOLMOD export CHOLMOD_USE_GPU=1
и в CPP Common->useGPU=1
,
Мой вопрос заключается в том, как правильно связать мой проект с TPL (CHOLMOD), в котором используется CUDA? Мой проект не содержит кода 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
Я убедился, что моя тестовая матрица удовлетворяет этим критериям.
Задача ещё не решена.
Других решений пока нет …