Skip to content

Commit

Permalink
Merge pull request #1504 from lucbv/modular_build
Browse files Browse the repository at this point in the history
Modular build: allowing to build components independently
  • Loading branch information
lucbv authored Sep 15, 2022
2 parents 764a8ff + a1f7c17 commit c916223
Showing 887 changed files with 1,429 additions and 3,121 deletions.
172 changes: 162 additions & 10 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -54,8 +54,8 @@ KOKKOSKERNELS_PACKAGE()
IF (NOT KOKKOSKERNELS_HAS_TRILINOS)
SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/")
KOKKOSKERNELS_ADD_OPTION(
"ENABLE_EXAMPLES"
OFF
"ENABLE_EXAMPLES"
OFF
BOOL
"Whether to build examples. Default: OFF"
)
@@ -105,8 +105,14 @@ IF (KokkosKernels_INSTALL_TESTING)
# Still need to figure out which backends
INCLUDE(cmake/kokkos_backends.cmake)
# Only build the tests
# Assume that all components have been enabled
KOKKOSKERNELS_ADD_TEST_DIRECTORIES(common/unit_test)
KOKKOSKERNELS_ADD_TEST_DIRECTORIES(batched/dense/unit_test)
KOKKOSKERNELS_ADD_TEST_DIRECTORIES(batched/sparse/unit_test)
KOKKOSKERNELS_ADD_TEST_DIRECTORIES(blas/unit_test)
KOKKOSKERNELS_ADD_TEST_DIRECTORIES(graph/unit_test)
KOKKOSKERNELS_ADD_TEST_DIRECTORIES(sparse/unit_test)
KOKKOSKERNELS_ADD_TEST_DIRECTORIES(perf_test)
KOKKOSKERNELS_ADD_TEST_DIRECTORIES(unit_test)
KOKKOSKERNELS_ADD_EXAMPLE_DIRECTORIES(example)
ELSE()
# Regular build, not install testing
@@ -204,33 +210,179 @@ ELSE()
INCLUDE(cmake/kokkoskernels_features.cmake)
INCLUDE(cmake/kokkos_requirements.cmake)
# ==================================================================
# Enable Library Components
# ==================================================================
INCLUDE(cmake/kokkoskernels_components.cmake)
# ==================================================================
# CMake Summary
# ==================================================================
MESSAGE("")
MESSAGE("=======================")
MESSAGE("KokkosKernels ETI Types")
MESSAGE("Kokkos Kernels ETI Types")
MESSAGE(" Devices: ${DEVICE_LIST}")
MESSAGE(" Scalars: ${SCALAR_LIST}")
MESSAGE(" Ordinals: ${ORDINAL_LIST}")
MESSAGE(" Offsets: ${OFFSET_LIST}")
MESSAGE(" Layouts: ${LAYOUT_LIST}")
MESSAGE("")
MESSAGE("KokkosKernels TPLs")
MESSAGE("Kokkos Kernels components")
MESSAGE(" COMMON: ON")
MESSAGE(" BATCHED: ${KokkosKernels_ENABLE_BATCHED}")
MESSAGE(" BLAS: ${KokkosKernels_ENABLE_BLAS}")
MESSAGE(" GRAPH: ${KokkosKernels_ENABLE_GRAPH}")
MESSAGE(" SPARSE: ${KokkosKernels_ENABLE_SPARSE}")
MESSAGE("")
MESSAGE("Kokkos Kernels TPLs")
FOREACH(TPL ${KOKKOSKERNELS_TPL_LIST})
PAD_STRING("${TPL}:" TPL_PADDED 12)
MESSAGE(" ${TPL_PADDED} ${${TPL}_FOUND_INFO}")
ENDFOREACH()
MESSAGE("=======================")
MESSAGE("")
# Skip building Kokkos Kernels if we are doing an installation test
ADD_SUBDIRECTORY(src)



## configure the library
KOKKOSKERNELS_CONFIGURE_FILE(KokkosKernels_config.h)

SET(KK_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR})

#I don't want the complexity of sometimes interface/sometimes not
#Just minimally force an empty dummy file
SET(HEADERS)
SET(SOURCES common/src/dummy.cpp)

# ETI infrastructure to be used by components
include(cmake/kokkoskernels_eti.cmake)
SET(ETI_HEADERS)

LIST(APPEND HEADERS ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}_config.h)

# Only enable requested components
# if nothing requested, build everything
# to recover original behavior.
INCLUDE(common/CMakeLists.txt)
IF (KokkosKernels_ENABLE_BATCHED)
INCLUDE(batched/CMakeLists.txt)
ENDIF()
IF (KokkosKernels_ENABLE_BLAS)
INCLUDE(blas/CMakeLists.txt)
ENDIF()
IF (KokkosKernels_ENABLE_GRAPH)
INCLUDE(graph/CMakeLists.txt)
ENDIF()
IF (KokkosKernels_ENABLE_SPARSE)
INCLUDE(sparse/CMakeLists.txt)
ENDIF()

FOREACH(DIR ${KK_INCLUDE_DIRS})
KOKKOSKERNELS_INCLUDE_DIRECTORIES(${DIR})
APPEND_GLOB(HEADERS ${DIR}/*.hpp)
ENDFOREACH()
# MESSAGE("HEADERS: ${HEADERS}")


# For now, don't add the ETI headers to complete list of headers
# This will break some IDEs and won't properly display headers in the file list
# However, because of the behavior of TRIBITS_ADD_LIBRARY
# I can't add the ETI headers with them getting double-installed
# with a bunch of headers in the wrong location
# This doesn't change pre-existing behavior before the ETI changes
#LIST(APPEND HEADERS ${ETI_HEADERS})
#-----------------------------------------------------------------------------

KOKKOSKERNELS_ADD_LIBRARY(
kokkoskernels
HEADERS ${HEADERS}
SOURCES ${SOURCES}
)

# It does not seem to be possible to automatically have headers installed
# in the correct subdirectory structure using HEADERS and ADD_LIBRARY with tribits
# Force the specializations to be installed in a subdirectory
INSTALL(FILES ${ETI_HEADERS} DESTINATION ${KOKKOSKERNELS_HEADER_INSTALL_DIR}/generated_specializations_hpp/)

IF (KOKKOSKERNELS_HAS_TRILINOS)
#no linking commands required - tribits does this
ELSE()
ADD_LIBRARY(Kokkos::kokkoskernels ALIAS kokkoskernels)
TARGET_LINK_LIBRARIES(kokkoskernels PUBLIC Kokkos::kokkos)
FOREACH(DIR ${KK_INCLUDE_DIRS})
TARGET_INCLUDE_DIRECTORIES(kokkoskernels PUBLIC $<BUILD_INTERFACE:${DIR}>)
ENDFOREACH()
TARGET_INCLUDE_DIRECTORIES(kokkoskernels PUBLIC
$<INSTALL_INTERFACE:${KOKKOSKERNELS_HEADER_INSTALL_DIR}>)
ENDIF()

IF (KOKKOS_ENABLE_SYCL)
SET(KOKKOSKERNELS_INTEL_ARCHS ${Kokkos_ARCH})
LIST(FILTER KOKKOSKERNELS_INTEL_ARCHS INCLUDE REGEX ".*INTEL.*")
LIST(LENGTH KOKKOSKERNELS_INTEL_ARCHS KOKKOSKERNELS_INTEL_ARCHS_NUM)
IF(KOKKOSKERNELS_INTEL_ARCHS_NUM GREATER_EQUAL 1)
IF (NOT BUILD_SHARED_LIBS)
MESSAGE(SEND_ERROR
"At the moment, we require KokkosKernels (and Kokkos) to be built as "
"shared libraries to allow querying free and total device memory!"
)
ENDIF()
TARGET_LINK_LIBRARIES(kokkoskernels PUBLIC ze_loader)
ENDIF()
ENDIF()

KOKKOSKERNELS_LINK_TPL(kokkoskernels PUBLIC LAPACK)
KOKKOSKERNELS_LINK_TPL(kokkoskernels PUBLIC BLAS)
KOKKOSKERNELS_LINK_TPL(kokkoskernels PUBLIC CBLAS)
KOKKOSKERNELS_LINK_TPL(kokkoskernels PUBLIC LAPACKE)
KOKKOSKERNELS_LINK_TPL(kokkoskernels PUBLIC SUPERLU)
KOKKOSKERNELS_LINK_TPL(kokkoskernels PUBLIC CHOLMOD)
KOKKOSKERNELS_LINK_TPL(kokkoskernels PUBLIC MKL)
KOKKOSKERNELS_LINK_TPL(kokkoskernels PUBLIC CUBLAS)
KOKKOSKERNELS_LINK_TPL(kokkoskernels PUBLIC CUSPARSE)
KOKKOSKERNELS_LINK_TPL(kokkoskernels PUBLIC ROCBLAS)
KOKKOSKERNELS_LINK_TPL(kokkoskernels PUBLIC ROCSPARSE)
KOKKOSKERNELS_LINK_TPL(kokkoskernels PUBLIC METIS)
KOKKOSKERNELS_LINK_TPL(kokkoskernels PUBLIC ARMPL)
KOKKOSKERNELS_LINK_TPL(kokkoskernels PUBLIC MAGMA)



IF (KokkosKernels_ENABLE_INSTALL_TEST)
ADD_SUBDIRECTORY(install_test)
MESSAGE("The install test has been enabled, you will need to peform: make install before running the tests otherwise install_test will fail")
ENDIF ()
KOKKOSKERNELS_ADD_TEST_DIRECTORIES(perf_test)
KOKKOSKERNELS_ADD_TEST_DIRECTORIES(unit_test)
KOKKOSKERNELS_ADD_EXAMPLE_DIRECTORIES(example)
IF(KokkosKernels_ENABLE_TESTS OR KokkosKernels_ENABLE_TESTS_AND_PERFSUITE)
SET(GTEST_SOURCE_DIR ${KOKKOSKERNELS_TOP_SOURCE_DIR}/tpls/gtest)

KOKKOSKERNELS_ADD_TEST_LIBRARY(
kokkoskernels_gtest
HEADERS ${GTEST_SOURCE_DIR}/gtest/gtest.h
SOURCES ${GTEST_SOURCE_DIR}/gtest/gtest-all.cc
)
# Disables pthreads, this is a problem for serial builds in Trilinos & Sierra if it's enabled.
TARGET_COMPILE_DEFINITIONS(kokkoskernels_gtest PUBLIC "-DGTEST_HAS_PTHREAD=0")
TARGET_INCLUDE_DIRECTORIES(kokkoskernels_gtest PUBLIC $<BUILD_INTERFACE:${GTEST_SOURCE_DIR}>)

#Gtest minimally requires C++11
TARGET_COMPILE_FEATURES(kokkoskernels_gtest PUBLIC cxx_std_11)
ENDIF()
KOKKOSKERNELS_ADD_TEST_DIRECTORIES(common/unit_test)
IF (KokkosKernels_ENABLE_BATCHED)
KOKKOSKERNELS_ADD_TEST_DIRECTORIES(batched/dense/unit_test)
KOKKOSKERNELS_ADD_TEST_DIRECTORIES(batched/sparse/unit_test)
ENDIF()
IF (KokkosKernels_ENABLE_BLAS)
KOKKOSKERNELS_ADD_TEST_DIRECTORIES(blas/unit_test)
ENDIF()
IF (KokkosKernels_ENABLE_GRAPH)
KOKKOSKERNELS_ADD_TEST_DIRECTORIES(graph/unit_test)
ENDIF()
IF (KokkosKernels_ENABLE_SPARSE)
KOKKOSKERNELS_ADD_TEST_DIRECTORIES(sparse/unit_test)
ENDIF()
IF (KokkosKernels_ENABLE_ALL_COMPONENTS)
KOKKOSKERNELS_ADD_TEST_DIRECTORIES(perf_test)
KOKKOSKERNELS_ADD_EXAMPLE_DIRECTORIES(example)
ENDIF()

KOKKOSKERNELS_PACKAGE_POSTPROCESS()
IF (KokkosKernels_ENABLE_DOCS)
44 changes: 0 additions & 44 deletions KokkosKernels_dummy.cpp

This file was deleted.

21 changes: 21 additions & 0 deletions batched/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Adding source directory to the build
LIST(APPEND KK_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/batched/src)

LIST(APPEND KK_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/batched/dense/src)
LIST(APPEND KK_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/batched/dense/impl)
LIST(APPEND KK_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/batched/dense/unit_test)

LIST(APPEND KK_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/batched/sparse/src)
LIST(APPEND KK_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/batched/sparse/impl)
LIST(APPEND KK_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/batched/sparse/unit_test)

IF (NOT KokkosKernels_ENABLE_BLAS)
LIST(APPEND KK_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/blas/impl)
LIST(APPEND KK_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/blas/tpls)
APPEND_GLOB(HEADERS ${PACKAGE_SOURCE_DIR}/blas/impl/KokkosBlas_util.hpp)
LIST(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/batched/KokkosBatched_Util.cpp)
ENDIF()

# Adding unit-tests
KOKKOSKERNELS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/batched)
KOKKOSKERNELS_INCLUDE_DIRECTORIES(REQUIRED_DURING_INSTALLATION_TESTING ${CMAKE_CURRENT_SOURCE_DIR}/batched)
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
115 changes: 115 additions & 0 deletions batched/dense/unit_test/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
#####################
# #
# Add include files #
# #
#####################

KOKKOSKERNELS_INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/test_common)
KOKKOSKERNELS_INCLUDE_DIRECTORIES(REQUIRED_DURING_INSTALLATION_TESTING ${PACKAGE_SOURCE_DIR}/test_common)

KOKKOSKERNELS_INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/src)
KOKKOSKERNELS_INCLUDE_DIRECTORIES(REQUIRED_DURING_INSTALLATION_TESTING ${PACKAGE_SOURCE_DIR}/src)

KOKKOSKERNELS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/batched)
KOKKOSKERNELS_INCLUDE_DIRECTORIES(REQUIRED_DURING_INSTALLATION_TESTING ${CMAKE_CURRENT_SOURCE_DIR}/batched)

KOKKOSKERNELS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/batched/dense/src)
KOKKOSKERNELS_INCLUDE_DIRECTORIES(REQUIRED_DURING_INSTALLATION_TESTING ${CMAKE_CURRENT_SOURCE_DIR}/batched/dense/src)
KOKKOSKERNELS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/batched/dense/impl)
KOKKOSKERNELS_INCLUDE_DIRECTORIES(REQUIRED_DURING_INSTALLATION_TESTING ${CMAKE_CURRENT_SOURCE_DIR}/batched/dense/impl)

IF (NOT KokkosKernels_ENABLE_BLAS)
KOKKOSKERNELS_INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/blas/src)
KOKKOSKERNELS_INCLUDE_DIRECTORIES(REQUIRED_DURING_INSTALLATION_TESTING ${PACKAGE_SOURCE_DIR}/blas/src)
KOKKOSKERNELS_INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/blas/impl)
KOKKOSKERNELS_INCLUDE_DIRECTORIES(REQUIRED_DURING_INSTALLATION_TESTING ${PACKAGE_SOURCE_DIR}/blas/impl)
ENDIF()

#####################
# #
# Define unit-tests #
# #
#####################

#####################
# #
# Add GPU backends #
# #
#####################
IF (KOKKOS_ENABLE_CUDA)
KOKKOSKERNELS_ADD_UNIT_TEST(
batched_dla_cuda
SOURCES
${PACKAGE_SOURCE_DIR}/test_common/Test_Main.cpp
backends/Test_Cuda_Batched_Dense.cpp
COMPONENTS batched_dla
)
ENDIF ()

IF (KOKKOS_ENABLE_HIP)
KOKKOSKERNELS_ADD_UNIT_TEST(
batched_dla_hip
SOURCES
${PACKAGE_SOURCE_DIR}/test_common/Test_Main.cpp
backends/Test_HIP_Batched_Dense.cpp
COMPONENTS batched_dla
)
ENDIF ()

IF (KOKKOS_ENABLE_SYCL)
KOKKOSKERNELS_ADD_UNIT_TEST(
batched_dla_sycl
SOURCES
${PACKAGE_SOURCE_DIR}/test_common/Test_Main.cpp
backends/Test_SYCL_Batched_Dense.cpp
COMPONENTS batched_dla
)
ENDIF ()

IF (KOKKOS_ENABLE_OPENMPTARGET)
# KOKKOSKERNELS_ADD_UNIT_TEST(
# batched_dla_openmptarget
# SOURCES
# ${PACKAGE_SOURCE_DIR}/test_common/Test_Main.cpp
# backends/Test_OpenMPTarget_Batched_Dense.cpp
# COMPONENTS batched_dla
# )
ENDIF ()



#####################
# #
# Add CPU backends #
# #
#####################
IF (KOKKOS_ENABLE_SERIAL)
KOKKOSKERNELS_ADD_UNIT_TEST(
batched_dla_serial
SOURCES
${PACKAGE_SOURCE_DIR}/test_common/Test_Main.cpp
backends/Test_Serial_Batched_Dense.cpp
COMPONENTS batched_dla
)
ENDIF ()

IF (KOKKOS_ENABLE_OPENMP)
KOKKOSKERNELS_ADD_UNIT_TEST(
batched_dla_openmp
SOURCES
${PACKAGE_SOURCE_DIR}/test_common/Test_Main.cpp
backends/Test_OpenMP_Batched_Dense.cpp
COMPONENTS batched_dla
)
ENDIF ()

IF (KOKKOS_ENABLE_THREADS)
KOKKOSKERNELS_ADD_UNIT_TEST(
batched_dla_threads
SOURCES
${PACKAGE_SOURCE_DIR}/test_common/Test_Main.cpp
backends/Test_Threads_Batched_Dense.cpp
COMPONENTS batched_dla
)
ENDIF ()

File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Loading

0 comments on commit c916223

Please sign in to comment.