diff --git a/CheckHostBlasReturnComplex.cmake b/CheckHostBlasReturnComplex.cmake index 78ae33515b..30063b1cc3 100644 --- a/CheckHostBlasReturnComplex.cmake +++ b/CheckHostBlasReturnComplex.cmake @@ -5,7 +5,12 @@ FUNCTION(CHECK_HOST_BLAS_RETURN_COMPLEX VARNAME) IF (KOKKOSKERNELS_HAS_TRILINOS) SET(CMAKE_REQUIRED_LIBRARIES ${TPL_BLAS_LIBRARIES}) ELSE() - SET(CMAKE_REQUIRED_LIBRARIES ${BLAS_LIBRARIES}) + # For TPLs, just pull out the required libraries from the target properies. + IF (KOKKOSKERNELS_ENABLE_TPL_ARMPL) + GET_TARGET_PROPERTY(CMAKE_REQUIRED_LIBRARIES KokkosKernels::ARMPL INTERFACE_LINK_LIBRARIES) + ELSE() + SET(CMAKE_REQUIRED_LIBRARIES ${BLAS_LIBRARIES}) + ENDIF() ENDIF() SET(SOURCE diff --git a/cmake/KokkosKernels_config.h.in b/cmake/KokkosKernels_config.h.in index c252f15bc0..7cb277baed 100644 --- a/cmake/KokkosKernels_config.h.in +++ b/cmake/KokkosKernels_config.h.in @@ -107,8 +107,9 @@ #cmakedefine KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV -/* if MKL, BLAS is also defined */ -#if defined(KOKKOSKERNELS_ENABLE_TPL_MKL) +/* if MKL or ARMPL, BLAS is also defined */ +#if defined(KOKKOSKERNELS_ENABLE_TPL_MKL) ||\ + defined(KOKKOSKERNELS_ENABLE_TPL_ARMPL) #if !defined(KOKKOSKERNELS_ENABLE_TPL_BLAS) #define KOKKOSKERNELS_ENABLE_TPL_BLAS #endif diff --git a/cmake/Modules/FindTPLARMPL.cmake b/cmake/Modules/FindTPLARMPL.cmake index 4a0f485192..62e1e33ea3 100644 --- a/cmake/Modules/FindTPLARMPL.cmake +++ b/cmake/Modules/FindTPLARMPL.cmake @@ -1,15 +1,24 @@ +# Both the armpl_mp and armpl libraries define the same public symbol names. +# In order to link against the openmp armpl symbols, instruct cmake to link against armpl_mp. +# In order to link against the default armpl symbols, instruct cmake to link against armpl. +IF(KOKKOSKERNELS_INST_EXECSPACE_OPENMP) + SET(ARMPL_LIB armpl_mp) +ELSE() + SET(ARMPL_LIB armpl) +ENDIF() + IF (ARMPL_LIBRARY_DIRS AND ARMPL_LIBRARIES) KOKKOSKERNELS_FIND_IMPORTED(ARMPL INTERFACE LIBRARIES ${ARMPL_LIBRARIES} LIBRARY_PATHS ${ARMPL_LIBRARY_DIRS}) ELSEIF (ARMPL_LIBRARIES) KOKKOSKERNELS_FIND_IMPORTED(ARMPL INTERFACE LIBRARIES ${ARMPL_LIBRARIES}) ELSEIF (ARMPL_LIBRARY_DIRS) - KOKKOSKERNELS_FIND_IMPORTED(ARMPL INTERFACE LIBRARIES armpl LIBRARY_PATHS ${ARMPL_LIBRARY_DIRS}) + KOKKOSKERNELS_FIND_IMPORTED(ARMPL INTERFACE LIBRARIES amath ${ARMPL_LIB} LIBRARY_PATHS ${ARMPL_LIBRARY_DIRS}) ELSEIF (DEFINED ENV{ARMPL_DIR}) SET(ARMPL_ROOT $ENV{ARMPL_DIR}) KOKKOSKERNELS_FIND_IMPORTED(ARMPL INTERFACE LIBRARIES amath - armpl + ${ARMPL_LIB} LIBRARY_PATHS ${ARMPL_ROOT}/lib HEADERS @@ -25,8 +34,14 @@ ENDIF() TRY_COMPILE(KOKKOSKERNELS_TRY_COMPILE_ARMPL ${KOKKOSKERNELS_TOP_BUILD_DIR}/tpl_tests ${KOKKOSKERNELS_TOP_SOURCE_DIR}/cmake/compile_tests/armpl.cpp - LINK_LIBRARIES -larmpl -lgfortran -lamath -lm + LINK_LIBRARIES -l${ARMPL_LIB} -lgfortran -lamath -lm OUTPUT_VARIABLE KOKKOSKERNELS_TRY_COMPILE_ARMPL_OUT) IF(NOT KOKKOSKERNELS_TRY_COMPILE_ARMPL) MESSAGE(FATAL_ERROR "KOKKOSKERNELS_TRY_COMPILE_ARMPL_OUT=${KOKKOSKERNELS_TRY_COMPILE_ARMPL_OUT}") +ELSE() + # KokkosKernels::ARMPL is an alias to the ARMPL target. + # Let's add in the libgfortran and libm dependencies for users here. + GET_TARGET_PROPERTY(ARMPL_INTERFACE_LINK_LIBRARIES KokkosKernels::ARMPL INTERFACE_LINK_LIBRARIES) + SET(ARMPL_INTERFACE_LINK_LIBRARIES "${ARMPL_INTERFACE_LINK_LIBRARIES};-lgfortran;-lm") + SET_TARGET_PROPERTIES(ARMPL PROPERTIES INTERFACE_LINK_LIBRARIES "${ARMPL_INTERFACE_LINK_LIBRARIES}") ENDIF() diff --git a/cmake/kokkoskernels_features.cmake b/cmake/kokkoskernels_features.cmake index 2212332b7d..6f4561f664 100644 --- a/cmake/kokkoskernels_features.cmake +++ b/cmake/kokkoskernels_features.cmake @@ -24,7 +24,7 @@ KOKKOSKERNELS_FEATURE_DEPENDS_ON_TPLS( # Fortran Complex BLAS # ================================================================== -IF (KOKKOSKERNELS_ENABLE_TPL_BLAS OR KOKKOSKERNELS_ENABLE_TPL_MKL) +IF (KOKKOSKERNELS_ENABLE_TPL_BLAS OR KOKKOSKERNELS_ENABLE_TPL_MKL OR KOKKOSKERNELS_ENABLE_TPL_ARMPL) INCLUDE(CheckHostBlasReturnComplex.cmake) CHECK_HOST_BLAS_RETURN_COMPLEX(KOKKOSKERNELS_TPL_BLAS_RETURN_COMPLEX) ENDIF() diff --git a/cmake/kokkoskernels_tpls.cmake b/cmake/kokkoskernels_tpls.cmake index 3aebad11b5..2bdcda1e81 100644 --- a/cmake/kokkoskernels_tpls.cmake +++ b/cmake/kokkoskernels_tpls.cmake @@ -420,11 +420,12 @@ KOKKOSKERNELS_ADD_TPL_OPTION(MKL OFF "Whether to enable MKL") KOKKOSKERNELS_ADD_TPL_OPTION(MAGMA OFF "Whether to enable MAGMA") KOKKOSKERNELS_ADD_TPL_OPTION(CBLAS OFF "Whether to enable CBLAS") KOKKOSKERNELS_ADD_TPL_OPTION(LAPACKE OFF "Whether to enable LAPACKE") +KOKKOSKERNELS_ADD_TPL_OPTION(ARMPL OFF "Whether to enable ARMPL") # Set F77_BLAS_MANGLE macro based on Fortran-C interface (unless already set # by Trilinos or user) IF ("${F77_BLAS_MANGLE}" STREQUAL "") - IF (KOKKOSKERNELS_ENABLE_TPL_BLAS OR KOKKOSKERNELS_ENABLE_TPL_MKL OR KOKKOSKERNELS_ENABLE_TPL_MAGMA) + IF (KOKKOSKERNELS_ENABLE_TPL_BLAS OR KOKKOSKERNELS_ENABLE_TPL_MKL OR KOKKOSKERNELS_ENABLE_TPL_MAGMA OR KOKKOSKERNELS_ENABLE_TPL_ARMPL) ENABLE_LANGUAGE(C) ENABLE_LANGUAGE(Fortran) INCLUDE(FortranCInterface) @@ -468,7 +469,6 @@ ENDIF() KOKKOSKERNELS_ADD_TPL_OPTION(CHOLMOD OFF "Whether to enable CHOLMOD") KOKKOSKERNELS_ADD_TPL_OPTION(SUPERLU OFF "Whether to enable SUPERLU") KOKKOSKERNELS_ADD_TPL_OPTION(METIS OFF "Whether to enable METIS") -KOKKOSKERNELS_ADD_TPL_OPTION(ARMPL OFF "Whether to enable ARMPL") # We need to do all the import work IF (NOT KOKKOSKERNELS_HAS_TRILINOS) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 22c17b5247..57b5394107 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -437,4 +437,5 @@ KOKKOSKERNELS_LINK_TPL(kokkoskernels PUBLIC MKL) KOKKOSKERNELS_LINK_TPL(kokkoskernels PUBLIC CUBLAS) KOKKOSKERNELS_LINK_TPL(kokkoskernels PUBLIC CUSPARSE) KOKKOSKERNELS_LINK_TPL(kokkoskernels PUBLIC METIS) +KOKKOSKERNELS_LINK_TPL(kokkoskernels PUBLIC ARMPL) # Not yet here KOKKOSKERNELS_LINK_TPL(kokkoskernels PUBLIC MAGMA)