From 773534c5e68b2495639e0458cac5588d6e13485c Mon Sep 17 00:00:00 2001 From: Growl Date: Sun, 7 Jun 2026 02:52:20 +0800 Subject: [PATCH 01/46] CMake: fix LIBXS and LIBXSTREAM discovery and revise default option --- CMakeLists.txt | 321 ++++++++++++++---------------- cmake/CompilerConfiguration.cmake | 2 +- cmake/dependencies.cmake | 4 +- src/CMakeLists.txt | 58 +----- src/cmake/DBCSRConfig.cmake.in | 79 +++++++- tests/CMakeLists.txt | 13 +- 6 files changed, 250 insertions(+), 227 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d2744f6c431..7ee3e499e4d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,15 +73,22 @@ set(dbcsr_APIVERSION ${VERSION_MAJOR}.${VERSION_MINOR}) # OPTIONS include(CMakeDependentOption) -option(BUILD_SHARED_LIBS "Build shared libraries" ON) +option(BUILD_SHARED_LIBS "Build shared libraries" OFF) option(USE_OPENMP "Build with OpenMP support" ON) -option(USE_MPI "Build with MPI support" ON) -option(USE_MPI_F08 "Build with the mpi_f08 module support" OFF) +option(USE_MPI "Build with MPI support" OFF) option(BUILD_TESTING "Build dbcsr unit tests" OFF) +option(USE_LIBXS "Use LIBXS for host-side Small Matrix Multiplication" OFF) +option(USE_LIBXSMM "Use LIBXSMM for JIT-compiled GEMM kernels" OFF) +option(WITH_CUDA_PROFILING "Enable profiling within CUDA" OFF) +option(WITH_HIP_PROFILING "Enable profiling within HIP" OFF) + +cmake_dependent_option( + USE_MPI_F08 "Build with the mpi_f08 module support" ON "${USE_MPI}" OFF +)# MPI_F08 is a module included in MPI cmake_dependent_option( - WITH_C_API "Build the C API (ISO_C_BINDINGS)" ON "USE_MPI" OFF + WITH_C_API "Build the C API (ISO_C_BINDINGS)" ON "${USE_MPI}" OFF )# the ISO_C_BINDINGS require MPI unconditionally -cmake_dependent_option(WITH_EXAMPLES "Build the examples" ON "USE_MPI" OFF +cmake_dependent_option(WITH_EXAMPLES "Build the examples" ON "${USE_MPI}" OFF )# all examples require MPI set(TEST_MPI_RANKS @@ -116,9 +123,6 @@ set(WITH_GPU_PARAMS "${WITH_GPU}") set_property(CACHE WITH_GPU PROPERTY STRINGS ${SUPPORTED_CUDA_ARCHITECTURES} ${SUPPORTED_HIP_ARCHITECTURES}) -option(WITH_CUDA_PROFILING "Enable profiling within CUDA" OFF) -option(WITH_HIP_PROFILING "Enable profiling within HIP" OFF) - # ================================================================================================= # LANGUAGES AND TESTING enable_language(Fortran) @@ -150,69 +154,55 @@ endif () set(CMAKE_POSITION_INDEPENDENT_CODE ON) # LIBXS provides host-side batched GEMM for all backends. LIBXSMM provides JIT -# kernels within LIBXS (optional, auto-detected). Set LIBXSROOT to use a -# prebuilt installation, or let FetchContent download it. Set USE_LIBXS=OFF to -# disable entirely. +# kernels within LIBXS and is optional. Prefer already installed packages and +# standard CMake/pkg-config search paths before falling back to FetchContent. include(FetchContent) include(cmake/dependencies.cmake) -option(USE_LIBXS "Use LIBXS for host-side Small Matrix Multiplication" ON) find_package(PkgConfig QUIET) -set(LIBXSROOT - "" - CACHE PATH "Root directory of a prebuilt LIBXS (skips FetchContent)") + +set(DBCSR_USE_LIBXSMM FALSE) + if (USE_LIBXS) - # Try prebuilt: pkg-config > explicit root > path probing - if (NOT LIBXSROOT AND PkgConfig_FOUND) - pkg_check_modules(_LIBXS QUIET libxs) - if (_LIBXS_FOUND) - pkg_get_variable(LIBXSROOT libxs prefix) - endif () + set(_dbcsr_libxs_pkg_names libxs) + if (BUILD_SHARED_LIBS) + list(PREPEND _dbcsr_libxs_pkg_names libxs-shared) + else () + list(PREPEND _dbcsr_libxs_pkg_names libxs-static) endif () - if (NOT LIBXSROOT) - foreach (_dir "${CMAKE_SOURCE_DIR}/../libxs" "$ENV{HOME}/libxs" - "/opt/libxs") - if (EXISTS "${_dir}/include/libxs.f") - set(LIBXSROOT "${_dir}") + + if (PkgConfig_FOUND) + foreach (_dbcsr_libxs_pkg IN LISTS _dbcsr_libxs_pkg_names) + pkg_check_modules(DBCSR_LIBXS QUIET IMPORTED_TARGET GLOBAL + ${_dbcsr_libxs_pkg}) + if (DBCSR_LIBXS_FOUND) break() endif () endforeach () endif () - if (LIBXSROOT AND EXISTS "${LIBXSROOT}/include/libxs.f") - set(_dbcsr_suffixes_save ${CMAKE_FIND_LIBRARY_SUFFIXES}) - if (BUILD_SHARED_LIBS) - set(CMAKE_FIND_LIBRARY_SUFFIXES .so .dylib) - else () - set(CMAKE_FIND_LIBRARY_SUFFIXES .a) - endif () - find_library( - LIBXS_LIBRARY - NAMES xs - PATHS "${LIBXSROOT}/lib" - NO_DEFAULT_PATH) - if (NOT LIBXS_LIBRARY) - set(CMAKE_FIND_LIBRARY_SUFFIXES ${_dbcsr_suffixes_save}) - find_library( - LIBXS_LIBRARY - NAMES xs - PATHS "${LIBXSROOT}/lib" - NO_DEFAULT_PATH) - endif () - set(CMAKE_FIND_LIBRARY_SUFFIXES ${_dbcsr_suffixes_save}) - if (LIBXS_LIBRARY) - message(STATUS "Using prebuilt LIBXS from ${LIBXSROOT}") - else () - message( - STATUS "LIBXS source found at ${LIBXSROOT} -- building as subdirectory") - set(LIBXS_FORTRAN - ON - CACHE BOOL "" FORCE) - set(LIBXS_SHARED - ${BUILD_SHARED_LIBS} - CACHE BOOL "" FORCE) - add_subdirectory("${LIBXSROOT}" "${CMAKE_BINARY_DIR}/_deps/libxs-build") - set(LIBXS_FETCHED TRUE) - endif () + + if (DBCSR_LIBXS_FOUND) + set(LIBXS_FOUND TRUE) + set(LIBXS_INCLUDE_DIRS ${DBCSR_LIBXS_INCLUDE_DIRS}) + set(LIBXS_LINK_LIBRARIES PkgConfig::DBCSR_LIBXS) + set(LIBXS_LIBRARY TRUE) + message(STATUS "Using prebuilt LIBXS from pkg-config") else () + find_path(LIBXS_INCLUDE_DIRS NAMES libxs.h PATH_SUFFIXES include) + find_library(LIBXS_LIBRARY NAMES xs) + if (LIBXS_INCLUDE_DIRS AND LIBXS_LIBRARY) + set(LIBXS_FOUND TRUE) + set(LIBXS_LINK_LIBRARIES ${LIBXS_LIBRARY}) + message(STATUS "Using prebuilt LIBXS") + endif () + endif () + + if (LIBXS_FOUND AND NOT TARGET DBCSR::LIBXS) + add_library(DBCSR::LIBXS INTERFACE IMPORTED GLOBAL) + target_include_directories(DBCSR::LIBXS INTERFACE "${LIBXS_INCLUDE_DIRS}") + target_link_libraries(DBCSR::LIBXS INTERFACE ${LIBXS_LINK_LIBRARIES}) + endif () + + if (NOT LIBXS_FOUND) message(STATUS "LIBXS not found locally -- downloading via FetchContent") FetchContent_Declare( libxs @@ -226,61 +216,52 @@ if (USE_LIBXS) CACHE BOOL "" FORCE) FetchContent_MakeAvailable(libxs) set(LIBXS_FETCHED TRUE) - set(LIBXSROOT "${libxs_SOURCE_DIR}") + set(LIBXS_FOUND TRUE) + set(LIBXS_INCLUDE_DIRS "${libxs_SOURCE_DIR}/include") + set(LIBXS_LINK_LIBRARIES libxs::libxs) + if (NOT TARGET DBCSR::LIBXS) + add_library(DBCSR::LIBXS INTERFACE IMPORTED GLOBAL) + target_link_libraries(DBCSR::LIBXS INTERFACE libxs::libxs) + target_include_directories(DBCSR::LIBXS INTERFACE "${LIBXS_INCLUDE_DIRS}") + endif () endif () - # Optional LIBXSMM for JIT-compiled GEMM kernels - option(USE_LIBXSMM "Use LIBXSMM for JIT-compiled GEMM kernels" ON) + if (USE_LIBXSMM) - set(LIBXSMMROOT - "" - CACHE PATH "Root directory of LIBXSMM (optional)") - if (NOT LIBXSMMROOT) - foreach (_dir "${LIBXSROOT}/../libxsmm" "$ENV{HOME}/libxsmm") - if (EXISTS "${_dir}/include/libxsmm.h") - set(LIBXSMMROOT "${_dir}") + set(_dbcsr_libxsmm_pkg_names libxsmm) + if (BUILD_SHARED_LIBS) + list(PREPEND _dbcsr_libxsmm_pkg_names libxsmm-shared) + else () + list(PREPEND _dbcsr_libxsmm_pkg_names libxsmm-static) + endif () + + if (PkgConfig_FOUND) + foreach (_dbcsr_libxsmm_pkg IN LISTS _dbcsr_libxsmm_pkg_names) + pkg_check_modules(DBCSR_LIBXSMM QUIET IMPORTED_TARGET GLOBAL + ${_dbcsr_libxsmm_pkg}) + if (DBCSR_LIBXSMM_FOUND) break() endif () endforeach () endif () - if (LIBXSMMROOT AND EXISTS "${LIBXSMMROOT}/include/libxsmm.h") - set(_dbcsr_suffixes_save ${CMAKE_FIND_LIBRARY_SUFFIXES}) - if (BUILD_SHARED_LIBS) - set(CMAKE_FIND_LIBRARY_SUFFIXES .so .dylib) - else () - set(CMAKE_FIND_LIBRARY_SUFFIXES .a) - endif () - find_library( - LIBXSMM_LIBRARY - NAMES xsmm - PATHS "${LIBXSMMROOT}/lib" - NO_DEFAULT_PATH) - if (NOT LIBXSMM_LIBRARY) - set(CMAKE_FIND_LIBRARY_SUFFIXES ${_dbcsr_suffixes_save}) - find_library( - LIBXSMM_LIBRARY - NAMES xsmm - PATHS "${LIBXSMMROOT}/lib" - NO_DEFAULT_PATH) - endif () - set(CMAKE_FIND_LIBRARY_SUFFIXES ${_dbcsr_suffixes_save}) - if (LIBXSMM_LIBRARY) - message(STATUS "Using prebuilt LIBXSMM from ${LIBXSMMROOT}") - else () - message( - STATUS - "LIBXSMM source found at ${LIBXSMMROOT} -- building as subdirectory" - ) - set(XSMM_STATIC - ON - CACHE BOOL "" FORCE) - add_subdirectory("${LIBXSMMROOT}" - "${CMAKE_BINARY_DIR}/_deps/libxsmm-build") - set(LIBXSMM_FETCHED TRUE) - get_target_property(_xsmm_srcs xsmm SOURCES) - list(FILTER _xsmm_srcs EXCLUDE REGEX "binaryexport_generator") - set_target_properties(xsmm PROPERTIES SOURCES "${_xsmm_srcs}") - endif () + + if (DBCSR_LIBXSMM_FOUND) + set(LIBXSMM_FOUND TRUE) + set(LIBXSMM_INCLUDE_DIRS ${DBCSR_LIBXSMM_INCLUDE_DIRS}) + set(LIBXSMM_LINK_LIBRARIES PkgConfig::DBCSR_LIBXSMM) + set(DBCSR_USE_LIBXSMM TRUE) + message(STATUS "Using prebuilt LIBXSMM from pkg-config") else () + find_path(LIBXSMM_INCLUDE_DIRS NAMES libxsmm.h PATH_SUFFIXES include) + find_library(LIBXSMM_LIBRARY NAMES xsmm) + if (LIBXSMM_INCLUDE_DIRS AND LIBXSMM_LIBRARY) + set(LIBXSMM_FOUND TRUE) + set(LIBXSMM_LINK_LIBRARIES ${LIBXSMM_LIBRARY}) + set(DBCSR_USE_LIBXSMM TRUE) + message(STATUS "Using prebuilt LIBXSMM") + endif () + endif () + + if (NOT LIBXSMM_FOUND) message( STATUS "LIBXSMM not found locally -- downloading via FetchContent") FetchContent_Declare( @@ -291,8 +272,9 @@ if (USE_LIBXS) ON CACHE BOOL "" FORCE) FetchContent_MakeAvailable(libxsmm) - set(LIBXSMMROOT "${libxsmm_SOURCE_DIR}") set(LIBXSMM_FETCHED TRUE) + set(DBCSR_USE_LIBXSMM TRUE) + set(LIBXSMM_INCLUDE_DIRS "${libxsmm_SOURCE_DIR}/include") get_target_property(_xsmm_srcs xsmm SOURCES) list(FILTER _xsmm_srcs EXCLUDE REGEX "(binaryexport_generator|gemm_driver)") @@ -371,87 +353,92 @@ if (USE_ACCEL MATCHES "opencl") list(APPEND CMAKE_PREFIX_PATH "$ENV{CUDA_PATH}") endif () find_package(OpenCL REQUIRED) - # LIBXS is required for the OpenCL backend - if (NOT LIBXS_LIBRARY AND NOT LIBXS_FETCHED) + + if (NOT USE_LIBXS OR NOT TARGET DBCSR::LIBXS) message( FATAL_ERROR "LIBXS not found. OpenCL backend requires LIBXS (USE_LIBXS=ON).") endif () - # Locate LIBXSTREAM: prebuilt > pkg-config > path probing > FetchContent - set(LIBXSTREAMROOT - "" - CACHE PATH "Root directory of a prebuilt LIBXSTREAM (skips FetchContent)") - if (NOT LIBXSTREAMROOT AND PkgConfig_FOUND) - pkg_check_modules(_LIBXSTREAM QUIET libxstream) - if (_LIBXSTREAM_FOUND) - pkg_get_variable(LIBXSTREAMROOT libxstream prefix) - endif () + + set(_dbcsr_libxstream_pkg_names libxstream) + if (BUILD_SHARED_LIBS) + list(PREPEND _dbcsr_libxstream_pkg_names libxstream-shared) + else () + list(PREPEND _dbcsr_libxstream_pkg_names libxstream-static) endif () - if (NOT LIBXSTREAMROOT) - foreach (_dir "${CMAKE_SOURCE_DIR}/../libxstream" "$ENV{HOME}/libxstream" - "/opt/libxstream") - if (EXISTS "${_dir}/include/libxstream.h") - set(LIBXSTREAMROOT "${_dir}") + + if (PkgConfig_FOUND) + foreach (_dbcsr_libxstream_pkg IN LISTS _dbcsr_libxstream_pkg_names) + pkg_check_modules(DBCSR_LIBXSTREAM QUIET IMPORTED_TARGET GLOBAL + ${_dbcsr_libxstream_pkg}) + if (DBCSR_LIBXSTREAM_FOUND) break() endif () endforeach () endif () - if (LIBXSTREAMROOT AND EXISTS "${LIBXSTREAMROOT}/include/libxstream.h") - set(_dbcsr_suffixes_save ${CMAKE_FIND_LIBRARY_SUFFIXES}) - if (BUILD_SHARED_LIBS) - set(CMAKE_FIND_LIBRARY_SUFFIXES .so .dylib) - else () - set(CMAKE_FIND_LIBRARY_SUFFIXES .a) - endif () - find_library( - LIBXSTREAM_LIBRARY xstream - PATHS "${LIBXSTREAMROOT}/lib" - NO_DEFAULT_PATH) - if (NOT LIBXSTREAM_LIBRARY) - set(CMAKE_FIND_LIBRARY_SUFFIXES ${_dbcsr_suffixes_save}) - find_library( - LIBXSTREAM_LIBRARY xstream - PATHS "${LIBXSTREAMROOT}/lib" - NO_DEFAULT_PATH) + + if (DBCSR_LIBXSTREAM_FOUND) + set(LIBXSTREAM_FOUND TRUE) + set(LIBXSTREAM_INCLUDE_DIRS ${DBCSR_LIBXSTREAM_INCLUDE_DIRS}) + set(LIBXSTREAM_LINK_LIBRARIES PkgConfig::DBCSR_LIBXSTREAM) + message(STATUS "Using prebuilt LIBXSTREAM from pkg-config") + else () + find_path(LIBXSTREAM_INCLUDE_DIRS NAMES libxstream.h PATH_SUFFIXES include) + find_library(LIBXSTREAM_LIBRARY NAMES xstream) + if (LIBXSTREAM_INCLUDE_DIRS AND LIBXSTREAM_LIBRARY) + set(LIBXSTREAM_FOUND TRUE) + set(LIBXSTREAM_LINK_LIBRARIES ${LIBXSTREAM_LIBRARY}) + message(STATUS "Using prebuilt LIBXSTREAM") endif () - set(CMAKE_FIND_LIBRARY_SUFFIXES ${_dbcsr_suffixes_save}) - if (LIBXSTREAM_LIBRARY) - message(STATUS "Using prebuilt LIBXSTREAM from ${LIBXSTREAMROOT}") - else () + endif () + + if (LIBXSTREAM_FOUND) + find_program(LIBXSTREAM_OPENCL_SCRIPT NAMES tool_opencl.sh + PATH_SUFFIXES scripts) + find_path(LIBXSTREAM_SMM_DIR NAMES smm_acc.c PATH_SUFFIXES samples/smm) + if (NOT LIBXSTREAM_OPENCL_SCRIPT OR NOT LIBXSTREAM_SMM_DIR) message( - STATUS - "LIBXSTREAM source found at ${LIBXSTREAMROOT} -- building as subdirectory" - ) - set(LIBXSROOT - "${LIBXSROOT}" - CACHE PATH "" FORCE) - set(LIBXSTREAM_SHARED - ${BUILD_SHARED_LIBS} - CACHE BOOL "" FORCE) - add_subdirectory("${LIBXSTREAMROOT}" - "${CMAKE_BINARY_DIR}/_deps/libxstream-build") - set(LIBXSTREAM_FETCHED TRUE) + FATAL_ERROR + "LIBXSTREAM was found, but its OpenCL helper script or SMM samples were not found.") endif () - else () + if (NOT TARGET DBCSR::LIBXSTREAM) + add_library(DBCSR::LIBXSTREAM INTERFACE IMPORTED GLOBAL) + target_include_directories(DBCSR::LIBXSTREAM + INTERFACE "${LIBXSTREAM_INCLUDE_DIRS}") + target_link_libraries(DBCSR::LIBXSTREAM + INTERFACE ${LIBXSTREAM_LINK_LIBRARIES}) + endif () + endif () + + if (NOT LIBXSTREAM_FOUND) message( STATUS "LIBXSTREAM not found locally -- downloading via FetchContent") FetchContent_Declare( libxstream GIT_REPOSITORY ${LIBXSTREAM_GIT_REPOSITORY} GIT_TAG ${LIBXSTREAM_GIT_TAG}) - set(LIBXSROOT - "${LIBXSROOT}" - CACHE PATH "" FORCE) set(LIBXSTREAM_SHARED ${BUILD_SHARED_LIBS} CACHE BOOL "" FORCE) FetchContent_MakeAvailable(libxstream) - set(LIBXSTREAMROOT "${libxstream_SOURCE_DIR}") set(LIBXSTREAM_FETCHED TRUE) + set(LIBXSTREAM_FOUND TRUE) + set(LIBXSTREAM_INCLUDE_DIRS "${libxstream_SOURCE_DIR}/include") + set(LIBXSTREAM_LINK_LIBRARIES libxstream::libxstream) + set(LIBXSTREAM_OPENCL_SCRIPT "${libxstream_SOURCE_DIR}/scripts/tool_opencl.sh") + set(LIBXSTREAM_SMM_DIR "${libxstream_SOURCE_DIR}/samples/smm") + if (NOT TARGET DBCSR::LIBXSTREAM) + add_library(DBCSR::LIBXSTREAM INTERFACE IMPORTED GLOBAL) + target_link_libraries(DBCSR::LIBXSTREAM INTERFACE libxstream::libxstream) + target_include_directories(DBCSR::LIBXSTREAM + INTERFACE "${LIBXSTREAM_INCLUDE_DIRS}") + endif () endif () - message(STATUS "Using LIBXSTREAM from ${LIBXSTREAMROOT}") - # Kernel build script and common OpenCL headers - set(DBCSR_OPENCL_SCRIPT "${LIBXSTREAMROOT}/scripts/tool_opencl.sh") + + message(STATUS "Using LIBXSTREAM") + set(DBCSR_OPENCL_SCRIPT "${LIBXSTREAM_OPENCL_SCRIPT}") + set(DBCSR_LIBXSTREAM_SMM_DIR "${LIBXSTREAM_SMM_DIR}") + list(GET LIBXSTREAM_INCLUDE_DIRS 0 DBCSR_LIBXSTREAM_INCLUDE_DIR) endif () if (USE_ACCEL MATCHES "cuda|hip") diff --git a/cmake/CompilerConfiguration.cmake b/cmake/CompilerConfiguration.cmake index a8a94c16f67..2e3719bfb84 100644 --- a/cmake/CompilerConfiguration.cmake +++ b/cmake/CompilerConfiguration.cmake @@ -168,6 +168,6 @@ set(CMAKE_C_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG}) # Suppress GFortran runtime warnings when LIBXS provides the wrapper if (CMAKE_Fortran_COMPILER_ID STREQUAL "GNU" - AND NOT USE_ASAN AND (LIBXS_FETCHED OR LIBXS_LIBRARY)) + AND NOT USE_ASAN AND USE_LIBXS AND TARGET DBCSR::LIBXS) add_link_options("-Wl,--wrap=_gfortran_runtime_warning_at") endif () diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 6fb3b421d60..3d492153084 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -1,7 +1,7 @@ set(LIBXS_GIT_REPOSITORY "https://github.com/hfp/libxs.git") -set(LIBXS_GIT_TAG "1a9fad72958a07f28e7514c19328162485c3c358") +set(LIBXS_GIT_TAG "ab416130f8c9f7edb8c1bf3d3abaf402f61d0fe0") set(LIBXSTREAM_GIT_REPOSITORY "https://github.com/hfp/libxstream.git") -set(LIBXSTREAM_GIT_TAG "eb9acbb55f83e65572add7569c2aa0a6f38a5a41") +set(LIBXSTREAM_GIT_TAG "8015f5461e5d1fee08024ddf20b38ea4400fbc24") set(LIBXSMM_GIT_TAG "0cea22fdc34ec54bc59ffb47a43cb3e28b26d3e0") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 714adadbf94..e428a4aa131 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -137,7 +137,7 @@ elseif (USE_ACCEL MATCHES "cuda") endif () # OpenCL backend: SMM from LIBXSTREAM samples, ACC from LIBXSTREAM library -set(DBCSR_SMM_DIR "${LIBXSTREAMROOT}/samples/smm") +set(DBCSR_SMM_DIR "${DBCSR_LIBXSTREAM_SMM_DIR}") set(DBCSR_OPENCL_SRCS "${DBCSR_SMM_DIR}/smm_acc.c" "${DBCSR_SMM_DIR}/smm_trans.c" "${DBCSR_SMM_DIR}/smm_params.c" "${DBCSR_SMM_DIR}/smm_kernel.c") @@ -186,13 +186,9 @@ elseif (USE_ACCEL MATCHES "cuda") "${ACC_ARCH_NUMBER}") endif () -if (LIBXS_FETCHED) +if (USE_LIBXS AND TARGET DBCSR::LIBXS) target_compile_definitions(dbcsr PRIVATE __LIBXS __BLAS) - target_link_libraries(dbcsr PRIVATE libxs::libxs ${BLAS_LIBRARIES}) -elseif (LIBXS_LIBRARY) - target_compile_definitions(dbcsr PRIVATE __LIBXS __BLAS) - target_include_directories(dbcsr PRIVATE "${LIBXSROOT}/include") - target_link_libraries(dbcsr PRIVATE ${LIBXS_LIBRARY} ${BLAS_LIBRARIES}) + target_link_libraries(dbcsr PRIVATE DBCSR::LIBXS ${BLAS_LIBRARIES}) endif () if (BLAS_LIBRARIES MATCHES "mkl_") @@ -201,19 +197,19 @@ endif () if (LIBXSMM_FETCHED) target_compile_definitions(dbcsr PRIVATE __LIBXSMM) - target_include_directories(dbcsr PRIVATE "${LIBXSMMROOT}/include") + target_include_directories(dbcsr PRIVATE "${LIBXSMM_INCLUDE_DIRS}") set_target_properties( xsmm PROPERTIES INTERFACE_INCLUDE_DIRECTORIES - "$") + "$") install( TARGETS xsmm EXPORT DBCSRTargets ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}") target_link_libraries(dbcsr PRIVATE xsmm) -elseif (LIBXSMM_LIBRARY) +elseif (LIBXSMM_FOUND) target_compile_definitions(dbcsr PRIVATE __LIBXSMM) - target_include_directories(dbcsr PRIVATE "${LIBXSMMROOT}/include") - target_link_libraries(dbcsr PRIVATE ${LIBXSMM_LIBRARY}) + target_include_directories(dbcsr PRIVATE "${LIBXSMM_INCLUDE_DIRS}") + target_link_libraries(dbcsr PRIVATE ${LIBXSMM_LINK_LIBRARIES}) endif () if (APPLE) @@ -297,38 +293,7 @@ if (USE_ACCEL) if (USE_ACCEL MATCHES "opencl") target_compile_definitions(dbcsr PRIVATE __LIBXSTREAM) - target_include_directories(dbcsr PRIVATE "${LIBXSTREAMROOT}/include" - "${DBCSR_SMM_DIR}") - if (NOT LIBXS_FETCHED) - target_include_directories(dbcsr PRIVATE "${LIBXSROOT}/include") - endif () - if (LIBXSTREAM_FETCHED) - set(LIBXSTREAM_LINK libxstream::libxstream) - else () - set(_dbcsr_suffixes_save ${CMAKE_FIND_LIBRARY_SUFFIXES}) - if (BUILD_SHARED_LIBS) - set(CMAKE_FIND_LIBRARY_SUFFIXES .so .dylib) - else () - set(CMAKE_FIND_LIBRARY_SUFFIXES .a) - endif () - find_library( - LIBXSTREAM_LIBRARY xstream - PATHS "${LIBXSTREAMROOT}/lib" - NO_DEFAULT_PATH) - if (NOT LIBXSTREAM_LIBRARY) - set(CMAKE_FIND_LIBRARY_SUFFIXES ${_dbcsr_suffixes_save}) - find_library( - LIBXSTREAM_LIBRARY xstream - PATHS "${LIBXSTREAMROOT}/lib" - NO_DEFAULT_PATH) - endif () - set(CMAKE_FIND_LIBRARY_SUFFIXES ${_dbcsr_suffixes_save}) - if (NOT LIBXSTREAM_LIBRARY) - message( - FATAL_ERROR "libxstream library not found in ${LIBXSTREAMROOT}/lib") - endif () - set(LIBXSTREAM_LINK ${LIBXSTREAM_LIBRARY}) - endif () + target_include_directories(dbcsr PRIVATE "${DBCSR_SMM_DIR}") # Generate smm_kernels.h from .cl kernel sources set(DBCSR_SMM_KERNELS "${DBCSR_SMM_DIR}/kernels/multiply.cl" "${DBCSR_SMM_DIR}/kernels/transpose.cl") @@ -336,7 +301,7 @@ if (USE_ACCEL) set(DBCSR_SMM_GENHDR "${DBCSR_SMM_DIR}/smm_kernels.h") add_custom_command( OUTPUT "${DBCSR_SMM_GENHDR}" - COMMAND "${DBCSR_OPENCL_SCRIPT}" -I "${LIBXSTREAMROOT}/include" + COMMAND "${DBCSR_OPENCL_SCRIPT}" -I "${DBCSR_LIBXSTREAM_INCLUDE_DIR}" ${DBCSR_SMM_KERNELS} ${DBCSR_SMM_PARAMS} "${DBCSR_SMM_GENHDR}" DEPENDS "${DBCSR_OPENCL_SCRIPT}" ${DBCSR_SMM_KERNELS} ${DBCSR_SMM_PARAMS} COMMENT "Generating OpenCL SMM kernel header") @@ -358,8 +323,7 @@ if (USE_ACCEL) $<$:roctx64> $<$:roctracer64> $<$:OpenCL::OpenCL> - $<$:${LIBXSTREAM_LINK}> - $<$:$,libxs::libxs,${LIBXS_LIBRARY}>> + $<$:DBCSR::LIBXSTREAM> ) endif () diff --git a/src/cmake/DBCSRConfig.cmake.in b/src/cmake/DBCSRConfig.cmake.in index 3d6c8115e29..42bc689853d 100644 --- a/src/cmake/DBCSRConfig.cmake.in +++ b/src/cmake/DBCSRConfig.cmake.in @@ -14,6 +14,44 @@ if (@USE_OPENMP@) find_dependency(OpenMP) endif () +if (@USE_LIBXS@) + set(DBCSR_USE_LIBXS @USE_LIBXS@) + find_package(PkgConfig QUIET) + set(_dbcsr_libxs_pkg_names libxs) + if (@BUILD_SHARED_LIBS@) + list(PREPEND _dbcsr_libxs_pkg_names libxs-shared) + else () + list(PREPEND _dbcsr_libxs_pkg_names libxs-static) + endif () + foreach (_dbcsr_libxs_pkg IN LISTS _dbcsr_libxs_pkg_names) + pkg_check_modules(DBCSR_LIBXS QUIET IMPORTED_TARGET GLOBAL + ${_dbcsr_libxs_pkg}) + if (DBCSR_LIBXS_FOUND) + break() + endif () + endforeach () + if (DBCSR_LIBXS_FOUND) + if (NOT TARGET DBCSR::LIBXS) + add_library(DBCSR::LIBXS INTERFACE IMPORTED) + target_link_libraries(DBCSR::LIBXS INTERFACE PkgConfig::DBCSR_LIBXS) + endif () + else () + find_path(DBCSR_LIBXS_INCLUDE_DIRS NAMES libxs.h PATH_SUFFIXES include) + find_library(DBCSR_LIBXS_LIBRARY NAMES xs) + if (DBCSR_LIBXS_INCLUDE_DIRS AND DBCSR_LIBXS_LIBRARY AND NOT TARGET DBCSR::LIBXS) + add_library(DBCSR::LIBXS INTERFACE IMPORTED) + set_target_properties( + DBCSR::LIBXS PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${DBCSR_LIBXS_INCLUDE_DIRS}" + INTERFACE_LINK_LIBRARIES + "${DBCSR_LIBXS_LIBRARY}") + endif () + endif () + if (NOT TARGET DBCSR::LIBXS) + message(FATAL_ERROR "LIBXS is required by this DBCSR installation.") + endif () +endif () + if ("@USE_ACCEL@" MATCHES "cuda") set(DBCSR_USE_ACCEL @USE_ACCEL@) enable_language(CUDA) @@ -29,11 +67,48 @@ if ("@USE_ACCEL@" MATCHES "hip") endif () if ("@USE_ACCEL@" MATCHES "opencl") + set(DBCSR_USE_ACCEL @USE_ACCEL@) find_dependency(OpenCL) + find_package(PkgConfig QUIET) + set(_dbcsr_libxstream_pkg_names libxstream) + if (@BUILD_SHARED_LIBS@) + list(PREPEND _dbcsr_libxstream_pkg_names libxstream-shared) + else () + list(PREPEND _dbcsr_libxstream_pkg_names libxstream-static) + endif () + foreach (_dbcsr_libxstream_pkg IN LISTS _dbcsr_libxstream_pkg_names) + pkg_check_modules(DBCSR_LIBXSTREAM QUIET IMPORTED_TARGET GLOBAL + ${_dbcsr_libxstream_pkg}) + if (DBCSR_LIBXSTREAM_FOUND) + break() + endif () + endforeach () + if (DBCSR_LIBXSTREAM_FOUND) + if (NOT TARGET DBCSR::LIBXSTREAM) + add_library(DBCSR::LIBXSTREAM INTERFACE IMPORTED) + target_link_libraries(DBCSR::LIBXSTREAM + INTERFACE PkgConfig::DBCSR_LIBXSTREAM) + endif () + else () + find_path(DBCSR_LIBXSTREAM_INCLUDE_DIRS NAMES libxstream.h + PATH_SUFFIXES include) + find_library(DBCSR_LIBXSTREAM_LIBRARY NAMES xstream) + if (DBCSR_LIBXSTREAM_INCLUDE_DIRS AND DBCSR_LIBXSTREAM_LIBRARY AND NOT TARGET DBCSR::LIBXSTREAM) + add_library(DBCSR::LIBXSTREAM INTERFACE IMPORTED) + set_target_properties( + DBCSR::LIBXSTREAM + PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${DBCSR_LIBXSTREAM_INCLUDE_DIRS}" + INTERFACE_LINK_LIBRARIES "${DBCSR_LIBXSTREAM_LIBRARY}") + endif () + endif () + if (NOT TARGET DBCSR::LIBXSTREAM) + message(FATAL_ERROR "LIBXSTREAM is required by this DBCSR installation.") + endif () endif () -if (@USE_LIBXSMM@) - set(DBCSR_USE_LIBXSMM @USE_LIBXSMM@) +if (@DBCSR_USE_LIBXSMM@) + set(DBCSR_USE_LIBXSMM @DBCSR_USE_LIBXSMM@) if (NOT TARGET xsmm) find_library(DBCSR_LIBXSMM_LIBRARY xsmm PATHS "@LIBXSMMROOT@/lib" NO_DEFAULT_PATH) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 85c3dbae1f6..713e0d9c5e6 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -75,7 +75,7 @@ set(DBCSR_TESTS_FTN if (USE_ACCEL) set(DBCSR_TESTS_BACKEND dbcsr_acc_test) - if (LIBXS_LIBRARY OR LIBXS_FETCHED) + if (TARGET DBCSR::LIBXS) list(APPEND DBCSR_TESTS_BACKEND acc_bench) endif () endif () @@ -191,16 +191,13 @@ if (NOT USE_MPI) if (BLAS_LIBRARIES MATCHES "mkl_") target_compile_definitions(${dbcsr_test_backend} PRIVATE __MKL) endif () - if (LIBXS_FETCHED) - target_link_libraries(${dbcsr_test_backend} PRIVATE libxs::libxs) - elseif (LIBXS_LIBRARY) - target_include_directories(${dbcsr_test_backend} - PRIVATE "${LIBXSROOT}/include") + if (TARGET DBCSR::LIBXS) + target_link_libraries(${dbcsr_test_backend} PRIVATE DBCSR::LIBXS) endif () - if (LIBXSMM_LIBRARY) + if (LIBXSMM_FOUND OR LIBXSMM_FETCHED) target_compile_definitions(${dbcsr_test_backend} PRIVATE __LIBXSMM) target_include_directories(${dbcsr_test_backend} - PRIVATE "${LIBXSMMROOT}/include") + PRIVATE "${LIBXSMM_INCLUDE_DIRS}") endif () # register unittest executable with CMake add_test(NAME ${dbcsr_test_backend} COMMAND ./${dbcsr_test_backend}) From d21268a379d8f18af5927c8b290ad78154f05f78 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 6 Jun 2026 19:01:24 +0000 Subject: [PATCH 02/46] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- CMakeLists.txt | 37 ++++++++++++++++++++++++++----------- src/CMakeLists.txt | 26 ++++++++++++-------------- 2 files changed, 38 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7ee3e499e4d..6001f0d12ee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,9 +82,8 @@ option(USE_LIBXSMM "Use LIBXSMM for JIT-compiled GEMM kernels" OFF) option(WITH_CUDA_PROFILING "Enable profiling within CUDA" OFF) option(WITH_HIP_PROFILING "Enable profiling within HIP" OFF) -cmake_dependent_option( - USE_MPI_F08 "Build with the mpi_f08 module support" ON "${USE_MPI}" OFF -)# MPI_F08 is a module included in MPI +cmake_dependent_option(USE_MPI_F08 "Build with the mpi_f08 module support" ON + "${USE_MPI}" OFF) # MPI_F08 is a module included in MPI cmake_dependent_option( WITH_C_API "Build the C API (ISO_C_BINDINGS)" ON "${USE_MPI}" OFF )# the ISO_C_BINDINGS require MPI unconditionally @@ -187,7 +186,10 @@ if (USE_LIBXS) set(LIBXS_LIBRARY TRUE) message(STATUS "Using prebuilt LIBXS from pkg-config") else () - find_path(LIBXS_INCLUDE_DIRS NAMES libxs.h PATH_SUFFIXES include) + find_path( + LIBXS_INCLUDE_DIRS + NAMES libxs.h + PATH_SUFFIXES include) find_library(LIBXS_LIBRARY NAMES xs) if (LIBXS_INCLUDE_DIRS AND LIBXS_LIBRARY) set(LIBXS_FOUND TRUE) @@ -251,7 +253,10 @@ if (USE_LIBXS) set(DBCSR_USE_LIBXSMM TRUE) message(STATUS "Using prebuilt LIBXSMM from pkg-config") else () - find_path(LIBXSMM_INCLUDE_DIRS NAMES libxsmm.h PATH_SUFFIXES include) + find_path( + LIBXSMM_INCLUDE_DIRS + NAMES libxsmm.h + PATH_SUFFIXES include) find_library(LIBXSMM_LIBRARY NAMES xsmm) if (LIBXSMM_INCLUDE_DIRS AND LIBXSMM_LIBRARY) set(LIBXSMM_FOUND TRUE) @@ -383,7 +388,10 @@ if (USE_ACCEL MATCHES "opencl") set(LIBXSTREAM_LINK_LIBRARIES PkgConfig::DBCSR_LIBXSTREAM) message(STATUS "Using prebuilt LIBXSTREAM from pkg-config") else () - find_path(LIBXSTREAM_INCLUDE_DIRS NAMES libxstream.h PATH_SUFFIXES include) + find_path( + LIBXSTREAM_INCLUDE_DIRS + NAMES libxstream.h + PATH_SUFFIXES include) find_library(LIBXSTREAM_LIBRARY NAMES xstream) if (LIBXSTREAM_INCLUDE_DIRS AND LIBXSTREAM_LIBRARY) set(LIBXSTREAM_FOUND TRUE) @@ -393,13 +401,19 @@ if (USE_ACCEL MATCHES "opencl") endif () if (LIBXSTREAM_FOUND) - find_program(LIBXSTREAM_OPENCL_SCRIPT NAMES tool_opencl.sh - PATH_SUFFIXES scripts) - find_path(LIBXSTREAM_SMM_DIR NAMES smm_acc.c PATH_SUFFIXES samples/smm) + find_program( + LIBXSTREAM_OPENCL_SCRIPT + NAMES tool_opencl.sh + PATH_SUFFIXES scripts) + find_path( + LIBXSTREAM_SMM_DIR + NAMES smm_acc.c + PATH_SUFFIXES samples/smm) if (NOT LIBXSTREAM_OPENCL_SCRIPT OR NOT LIBXSTREAM_SMM_DIR) message( FATAL_ERROR - "LIBXSTREAM was found, but its OpenCL helper script or SMM samples were not found.") + "LIBXSTREAM was found, but its OpenCL helper script or SMM samples were not found." + ) endif () if (NOT TARGET DBCSR::LIBXSTREAM) add_library(DBCSR::LIBXSTREAM INTERFACE IMPORTED GLOBAL) @@ -425,7 +439,8 @@ if (USE_ACCEL MATCHES "opencl") set(LIBXSTREAM_FOUND TRUE) set(LIBXSTREAM_INCLUDE_DIRS "${libxstream_SOURCE_DIR}/include") set(LIBXSTREAM_LINK_LIBRARIES libxstream::libxstream) - set(LIBXSTREAM_OPENCL_SCRIPT "${libxstream_SOURCE_DIR}/scripts/tool_opencl.sh") + set(LIBXSTREAM_OPENCL_SCRIPT + "${libxstream_SOURCE_DIR}/scripts/tool_opencl.sh") set(LIBXSTREAM_SMM_DIR "${libxstream_SOURCE_DIR}/samples/smm") if (NOT TARGET DBCSR::LIBXSTREAM) add_library(DBCSR::LIBXSTREAM INTERFACE IMPORTED GLOBAL) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e428a4aa131..488604e30b7 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -311,20 +311,18 @@ if (USE_ACCEL) target_link_libraries( dbcsr - PRIVATE - $<$:CUDA::cudart> - $<$:CUDA::cuda_driver> - $<$:CUDA::cublas> - $<$:CUDA::nvrtc> - $<$:CUDA::nvToolsExt> - $<$:roc::hipblas> - $<$:hiprtc::hiprtc> - $<$:hip::host> - $<$:roctx64> - $<$:roctracer64> - $<$:OpenCL::OpenCL> - $<$:DBCSR::LIBXSTREAM> - ) + PRIVATE $<$:CUDA::cudart> + $<$:CUDA::cuda_driver> + $<$:CUDA::cublas> + $<$:CUDA::nvrtc> + $<$:CUDA::nvToolsExt> + $<$:roc::hipblas> + $<$:hiprtc::hiprtc> + $<$:hip::host> + $<$:roctx64> + $<$:roctracer64> + $<$:OpenCL::OpenCL> + $<$:DBCSR::LIBXSTREAM>) endif () # ================================================================================================= From 172bb2ec9004d18ed513358e90cebef28cc11a86 Mon Sep 17 00:00:00 2001 From: Growl Date: Sun, 7 Jun 2026 03:05:18 +0800 Subject: [PATCH 03/46] Default MPI_F08 OFF --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6001f0d12ee..f8646b862e0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,7 +82,7 @@ option(USE_LIBXSMM "Use LIBXSMM for JIT-compiled GEMM kernels" OFF) option(WITH_CUDA_PROFILING "Enable profiling within CUDA" OFF) option(WITH_HIP_PROFILING "Enable profiling within HIP" OFF) -cmake_dependent_option(USE_MPI_F08 "Build with the mpi_f08 module support" ON +cmake_dependent_option(USE_MPI_F08 "Build with the mpi_f08 module support" OFF "${USE_MPI}" OFF) # MPI_F08 is a module included in MPI cmake_dependent_option( WITH_C_API "Build the C API (ISO_C_BINDINGS)" ON "${USE_MPI}" OFF From ef3018e137070d1ace2d1823432fe724b3e21c80 Mon Sep 17 00:00:00 2001 From: Growl Date: Sun, 7 Jun 2026 03:16:30 +0800 Subject: [PATCH 04/46] Adjust GitHub Actions workflow --- .github/workflows/testing-linux.yml | 30 ++++++++++++++++++++--------- .github/workflows/testing-macos.yml | 2 -- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/.github/workflows/testing-linux.yml b/.github/workflows/testing-linux.yml index 5837342ecc1..77046390cf3 100644 --- a/.github/workflows/testing-linux.yml +++ b/.github/workflows/testing-linux.yml @@ -33,7 +33,7 @@ jobs: matrix: use_mpi: [MPI=ON, MPI=OFF] use_openmp: [OPENMP=ON, OPENMP=OFF] - use_smm: [LIBXSMM=ON, LIBXSMM=OFF] + smm_backend: [BLAS, LIBXS, LIBXSMM] mpi_suffix: [openmpi, mpich] exclude: - use_mpi: MPI=OFF @@ -49,15 +49,26 @@ jobs: run: | mkdir -p build cd build + case "${{ matrix.smm_backend }}" in + BLAS) + smm_flags="-DUSE_LIBXS=OFF -DUSE_LIBXSMM=OFF" + ;; + LIBXS) + smm_flags="-DUSE_LIBXS=ON -DUSE_LIBXSMM=OFF" + ;; + LIBXSMM) + smm_flags="-DUSE_LIBXS=ON -DUSE_LIBXSMM=ON" + ;; + esac cmake -G Ninja \ -DCMAKE_BUILD_TYPE=Coverage \ -DBUILD_TESTING=ON \ -DUSE_${{ matrix.use_mpi }} \ -DUSE_${{ matrix.use_openmp }} \ - -DUSE_${{ matrix.use_smm }} \ + ${smm_flags} \ -DMPI_EXECUTABLE_SUFFIX=.${{ matrix.mpi_suffix }} \ -DMPIEXEC_PREFLAGS="$([ "${{ matrix.mpi_suffix }}" = "openmpi" ] && echo "-mca btl ^openib --allow-run-as-root --oversubscribe")" \ - -DLCOV_ARGS="--test-name;${{ matrix.use_mpi }}-${{ matrix.use_openmp }}-${{ matrix.use_smm }}-cpu" \ + -DLCOV_ARGS="--test-name;${{ matrix.use_mpi }}-${{ matrix.use_openmp }}-${{ matrix.smm_backend }}-cpu" \ -DTEST_MPI_RANKS=auto \ .. @@ -72,19 +83,19 @@ jobs: - name: Generate coverage info run: | cmake --build build -- cov-info - mv build/coverage.info build/coverage-Linux-${{ matrix.use_mpi }}-${{ matrix.use_openmp }}-${{ matrix.use_smm }}-cpu.info + mv build/coverage.info build/coverage-Linux-${{ matrix.use_mpi }}-${{ matrix.use_openmp }}-${{ matrix.smm_backend }}-cpu.info - name: Upload coverage data uses: actions/upload-artifact@v4 with: - name: coverage-data-${{ matrix.use_mpi }}-${{ matrix.use_openmp }}-${{ matrix.use_smm }}-${{ matrix.mpi_suffix }} + name: coverage-data-${{ matrix.use_mpi }}-${{ matrix.use_openmp }}-${{ matrix.smm_backend }}-${{ matrix.mpi_suffix }} path: build/coverage-*.info - name: Upload coverage data (generated files) uses: actions/upload-artifact@v4 - if: matrix.use_mpi == 'MPI=ON' && matrix.use_openmp == 'OPENMP=ON' && matrix.use_smm == 'LIBXSMM=OFF' && matrix.mpi_suffix == 'openmpi' + if: matrix.use_mpi == 'MPI=ON' && matrix.use_openmp == 'OPENMP=ON' && matrix.smm_backend == 'BLAS' && matrix.mpi_suffix == 'openmpi' with: - name: coverage-data-${{ matrix.use_mpi }}-${{ matrix.use_openmp }}-${{ matrix.use_smm }}-${{ matrix.mpi_suffix }}-generated-files + name: coverage-data-${{ matrix.use_mpi }}-${{ matrix.use_openmp }}-${{ matrix.smm_backend }}-${{ matrix.mpi_suffix }}-generated-files path: | build/src/dbcsr.h build/src/tensors/dbcsr_tensor.h @@ -137,7 +148,7 @@ jobs: strategy: matrix: use_openmp: [OPENMP=ON] - use_smm: [LIBXSMM=ON] + use_libxsmm: [LIBXSMM=ON] steps: - uses: actions/checkout@v4 @@ -153,7 +164,8 @@ jobs: -DCMAKE_BUILD_TYPE=Debug \ -DBUILD_TESTING=ON \ -DUSE_${{ matrix.use_openmp }} \ - -DUSE_${{ matrix.use_smm }} \ + -DUSE_LIBXS=ON \ + -DUSE_${{ matrix.use_libxsmm }} \ -DUSE_ACCEL=opencl \ -DWITH_EXAMPLES=ON \ .. diff --git a/.github/workflows/testing-macos.yml b/.github/workflows/testing-macos.yml index 712540b099f..27dd9ca19f7 100644 --- a/.github/workflows/testing-macos.yml +++ b/.github/workflows/testing-macos.yml @@ -14,7 +14,6 @@ jobs: matrix: use_mpi: [MPI=ON] use_openmp: [OPENMP=ON] - use_smm: [SMM=blas] blas_impl: [accelerate,openblas] mpi_suffix: [mpich] # Brew openmpi doesn't provide mpi.mod @@ -44,7 +43,6 @@ jobs: -DBUILD_TESTING=ON \ -DUSE_${{ matrix.use_mpi }} \ -DUSE_${{ matrix.use_openmp }} \ - -DUSE_${{ matrix.use_smm }} \ $([ "${{ matrix.blas_impl }}" = "openblas" ] && echo '-DCMAKE_PREFIX_PATH=/usr/local/opt/openblas') \ -DMPIEXEC_PREFLAGS="$([ "${{ matrix.mpi_suffix }}" = "openmpi" ] && echo "-mca btl ^openib --allow-run-as-root")" \ -DTEST_MPI_RANKS=auto \ From dcf79936082d78e7cf8577da609066258b997faf Mon Sep 17 00:00:00 2001 From: Growl Date: Sun, 7 Jun 2026 03:26:11 +0800 Subject: [PATCH 05/46] Adjust Fedora RPM-build --- .github/workflows/testing-linux.yml | 1 + CMakeLists.txt | 4 +--- tools/fedora/dbcsr.spec | 18 +++++++++++++++--- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/.github/workflows/testing-linux.yml b/.github/workflows/testing-linux.yml index 77046390cf3..6af50fbc9c4 100644 --- a/.github/workflows/testing-linux.yml +++ b/.github/workflows/testing-linux.yml @@ -149,6 +149,7 @@ jobs: matrix: use_openmp: [OPENMP=ON] use_libxsmm: [LIBXSMM=ON] + use_libxs: [LIBXS=ON] steps: - uses: actions/checkout@v4 diff --git a/CMakeLists.txt b/CMakeLists.txt index f8646b862e0..8d3413bbf8e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -422,9 +422,7 @@ if (USE_ACCEL MATCHES "opencl") target_link_libraries(DBCSR::LIBXSTREAM INTERFACE ${LIBXSTREAM_LINK_LIBRARIES}) endif () - endif () - - if (NOT LIBXSTREAM_FOUND) + else () message( STATUS "LIBXSTREAM not found locally -- downloading via FetchContent") FetchContent_Declare( diff --git a/tools/fedora/dbcsr.spec b/tools/fedora/dbcsr.spec index 50311314341..b8704749e52 100644 --- a/tools/fedora/dbcsr.spec +++ b/tools/fedora/dbcsr.spec @@ -1,4 +1,5 @@ -# Currently does not build with opencl/libxsmm +# OpenCL support requires packaged libxs/libxstream/libxsmm dependencies. +# Keep it disabled until those packages are available in Fedora. %bcond_with opencl # No openmpi on i668 with openmpi 5 in Fedora 40+ @@ -26,6 +27,8 @@ BuildRequires: gcc-gfortran BuildRequires: make BuildRequires: flexiblas-devel %if %{with opencl} +BuildRequires: libxs-devel +BuildRequires: libxstream-devel BuildRequires: libxsmm-devel %endif BuildRequires: python3-fypp @@ -109,15 +112,24 @@ export CXXFLAGS="%{optflags} -fPIC" export FFLAGS="%{optflags} -fPIC" %cmake \ -DCMAKE_INSTALL_Fortran_MODULES=%{_fmoddir} \ + -DBUILD_SHARED_LIBS=ON \ + -DBUILD_TESTING=ON \ -DUSE_MPI=OFF \ - %{?with_opencl:-DUSE_ACCEL=opencl -DUSE_SMM=libxsmm} + -DUSE_LIBXS=OFF \ + -DUSE_LIBXSMM=OFF \ + %{?with_opencl:-DUSE_ACCEL=opencl -DUSE_LIBXS=ON -DUSE_LIBXSMM=ON} %cmake_build for mpi in %{mpi_list} do module load mpi/$mpi-%{_arch} %cmake \ -DCMAKE_INSTALL_Fortran_MODULES=$MPI_FORTRAN_MOD_DIR \ - %{?with_opencl:-DUSE_ACCEL=opencl -DUSE_SMM=libxsmm} \ + -DBUILD_SHARED_LIBS=ON \ + -DBUILD_TESTING=ON \ + -DUSE_MPI=ON \ + -DUSE_LIBXS=OFF \ + -DUSE_LIBXSMM=OFF \ + %{?with_opencl:-DUSE_ACCEL=opencl -DUSE_LIBXS=ON -DUSE_LIBXSMM=ON} \ -DCMAKE_INSTALL_PREFIX:PATH=$MPI_HOME \ -DCMAKE_INSTALL_LIBDIR:PATH=$MPI_LIB \ -DUSE_MPI_F08=ON \ From 3cea686aee1978a0ef33aa1c457fd9149d4e51d7 Mon Sep 17 00:00:00 2001 From: Growl Date: Sun, 7 Jun 2026 03:28:14 +0800 Subject: [PATCH 06/46] Switch to FetchContent if no OpenCL helper found in libxstream --- CMakeLists.txt | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8d3413bbf8e..e3de0d57011 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -401,21 +401,35 @@ if (USE_ACCEL MATCHES "opencl") endif () if (LIBXSTREAM_FOUND) - find_program( - LIBXSTREAM_OPENCL_SCRIPT - NAMES tool_opencl.sh - PATH_SUFFIXES scripts) - find_path( - LIBXSTREAM_SMM_DIR - NAMES smm_acc.c - PATH_SUFFIXES samples/smm) + set(_dbcsr_libxstream_prefix_hints) + if (DBCSR_LIBXSTREAM_PREFIX) + list(APPEND _dbcsr_libxstream_prefix_hints + "${DBCSR_LIBXSTREAM_PREFIX}") + endif () + foreach (_dbcsr_libxstream_include_dir IN LISTS LIBXSTREAM_INCLUDE_DIRS) + get_filename_component( + _dbcsr_libxstream_prefix "${_dbcsr_libxstream_include_dir}/.." + ABSOLUTE) + list(APPEND _dbcsr_libxstream_prefix_hints + "${_dbcsr_libxstream_prefix}") + endforeach () + + find_program( + LIBXSTREAM_OPENCL_SCRIPT + NAMES tool_opencl.sh + HINTS ${_dbcsr_libxstream_prefix_hints} + PATH_SUFFIXES scripts bin) + find_path( + LIBXSTREAM_SMM_DIR + NAMES smm_acc.c + HINTS ${_dbcsr_libxstream_prefix_hints} + PATH_SUFFIXES samples/smm share/libxstream/samples/smm) if (NOT LIBXSTREAM_OPENCL_SCRIPT OR NOT LIBXSTREAM_SMM_DIR) message( - FATAL_ERROR - "LIBXSTREAM was found, but its OpenCL helper script or SMM samples were not found." - ) - endif () - if (NOT TARGET DBCSR::LIBXSTREAM) + STATUS + "Prebuilt LIBXSTREAM was found, but its OpenCL helper script or SMM samples were not found -- downloading via FetchContent") + set(LIBXSTREAM_FOUND FALSE) + elseif (NOT TARGET DBCSR::LIBXSTREAM) add_library(DBCSR::LIBXSTREAM INTERFACE IMPORTED GLOBAL) target_include_directories(DBCSR::LIBXSTREAM INTERFACE "${LIBXSTREAM_INCLUDE_DIRS}") From dca5e4482c88bf19ed1f505f6141baf0d18bca8a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 6 Jun 2026 19:30:15 +0000 Subject: [PATCH 07/46] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .github/workflows/testing-linux.yml | 1 - CMakeLists.txt | 46 ++++++++++++++--------------- 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/.github/workflows/testing-linux.yml b/.github/workflows/testing-linux.yml index 6af50fbc9c4..77046390cf3 100644 --- a/.github/workflows/testing-linux.yml +++ b/.github/workflows/testing-linux.yml @@ -149,7 +149,6 @@ jobs: matrix: use_openmp: [OPENMP=ON] use_libxsmm: [LIBXSMM=ON] - use_libxs: [LIBXS=ON] steps: - uses: actions/checkout@v4 diff --git a/CMakeLists.txt b/CMakeLists.txt index e3de0d57011..8096d588a6d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -401,33 +401,31 @@ if (USE_ACCEL MATCHES "opencl") endif () if (LIBXSTREAM_FOUND) - set(_dbcsr_libxstream_prefix_hints) - if (DBCSR_LIBXSTREAM_PREFIX) - list(APPEND _dbcsr_libxstream_prefix_hints - "${DBCSR_LIBXSTREAM_PREFIX}") - endif () - foreach (_dbcsr_libxstream_include_dir IN LISTS LIBXSTREAM_INCLUDE_DIRS) - get_filename_component( - _dbcsr_libxstream_prefix "${_dbcsr_libxstream_include_dir}/.." - ABSOLUTE) - list(APPEND _dbcsr_libxstream_prefix_hints - "${_dbcsr_libxstream_prefix}") - endforeach () - - find_program( - LIBXSTREAM_OPENCL_SCRIPT - NAMES tool_opencl.sh - HINTS ${_dbcsr_libxstream_prefix_hints} - PATH_SUFFIXES scripts bin) - find_path( - LIBXSTREAM_SMM_DIR - NAMES smm_acc.c - HINTS ${_dbcsr_libxstream_prefix_hints} - PATH_SUFFIXES samples/smm share/libxstream/samples/smm) + set(_dbcsr_libxstream_prefix_hints) + if (DBCSR_LIBXSTREAM_PREFIX) + list(APPEND _dbcsr_libxstream_prefix_hints "${DBCSR_LIBXSTREAM_PREFIX}") + endif () + foreach (_dbcsr_libxstream_include_dir IN LISTS LIBXSTREAM_INCLUDE_DIRS) + get_filename_component(_dbcsr_libxstream_prefix + "${_dbcsr_libxstream_include_dir}/.." ABSOLUTE) + list(APPEND _dbcsr_libxstream_prefix_hints "${_dbcsr_libxstream_prefix}") + endforeach () + + find_program( + LIBXSTREAM_OPENCL_SCRIPT + NAMES tool_opencl.sh + HINTS ${_dbcsr_libxstream_prefix_hints} + PATH_SUFFIXES scripts bin) + find_path( + LIBXSTREAM_SMM_DIR + NAMES smm_acc.c + HINTS ${_dbcsr_libxstream_prefix_hints} + PATH_SUFFIXES samples/smm share/libxstream/samples/smm) if (NOT LIBXSTREAM_OPENCL_SCRIPT OR NOT LIBXSTREAM_SMM_DIR) message( STATUS - "Prebuilt LIBXSTREAM was found, but its OpenCL helper script or SMM samples were not found -- downloading via FetchContent") + "Prebuilt LIBXSTREAM was found, but its OpenCL helper script or SMM samples were not found -- downloading via FetchContent" + ) set(LIBXSTREAM_FOUND FALSE) elseif (NOT TARGET DBCSR::LIBXSTREAM) add_library(DBCSR::LIBXSTREAM INTERFACE IMPORTED GLOBAL) From c57fccd893fd0413c445dd9ba4f6ddfc2a8074e5 Mon Sep 17 00:00:00 2001 From: Growl Date: Sun, 7 Jun 2026 03:35:23 +0800 Subject: [PATCH 08/46] Fix regression --- CMakeLists.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8096d588a6d..f620512ddb0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -83,11 +83,11 @@ option(WITH_CUDA_PROFILING "Enable profiling within CUDA" OFF) option(WITH_HIP_PROFILING "Enable profiling within HIP" OFF) cmake_dependent_option(USE_MPI_F08 "Build with the mpi_f08 module support" OFF - "${USE_MPI}" OFF) # MPI_F08 is a module included in MPI + "USE_MPI" OFF) # MPI_F08 is a module included in MPI cmake_dependent_option( - WITH_C_API "Build the C API (ISO_C_BINDINGS)" ON "${USE_MPI}" OFF + WITH_C_API "Build the C API (ISO_C_BINDINGS)" ON "USE_MPI" OFF )# the ISO_C_BINDINGS require MPI unconditionally -cmake_dependent_option(WITH_EXAMPLES "Build the examples" ON "${USE_MPI}" OFF +cmake_dependent_option(WITH_EXAMPLES "Build the examples" ON "USE_MPI" OFF )# all examples require MPI set(TEST_MPI_RANKS @@ -279,7 +279,8 @@ if (USE_LIBXS) FetchContent_MakeAvailable(libxsmm) set(LIBXSMM_FETCHED TRUE) set(DBCSR_USE_LIBXSMM TRUE) - set(LIBXSMM_INCLUDE_DIRS "${libxsmm_SOURCE_DIR}/include") + set(LIBXSMM_INCLUDE_DIRS "${libxsmm_SOURCE_DIR}/include" + "${libxsmm_BINARY_DIR}/include") get_target_property(_xsmm_srcs xsmm SOURCES) list(FILTER _xsmm_srcs EXCLUDE REGEX "(binaryexport_generator|gemm_driver)") From a8863a65d3506e671af2a2137c91f8cf7747462c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 6 Jun 2026 20:13:52 +0000 Subject: [PATCH 09/46] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- CMakeLists.txt | 5 +++-- src/CMakeLists.txt | 4 ++-- tests/CMakeLists.txt | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f620512ddb0..8fbedf45226 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -160,6 +160,7 @@ include(cmake/dependencies.cmake) find_package(PkgConfig QUIET) set(DBCSR_USE_LIBXSMM FALSE) +set(LIBXSMM_COMPILE_DEFINITIONS "") if (USE_LIBXS) set(_dbcsr_libxs_pkg_names libxs) @@ -279,8 +280,8 @@ if (USE_LIBXS) FetchContent_MakeAvailable(libxsmm) set(LIBXSMM_FETCHED TRUE) set(DBCSR_USE_LIBXSMM TRUE) - set(LIBXSMM_INCLUDE_DIRS "${libxsmm_SOURCE_DIR}/include" - "${libxsmm_BINARY_DIR}/include") + set(LIBXSMM_INCLUDE_DIRS "${libxsmm_SOURCE_DIR}/include") + set(LIBXSMM_COMPILE_DEFINITIONS LIBXSMM_DEFAULT_CONFIG) get_target_property(_xsmm_srcs xsmm SOURCES) list(FILTER _xsmm_srcs EXCLUDE REGEX "(binaryexport_generator|gemm_driver)") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 488604e30b7..cfe90ee3a3d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -196,7 +196,7 @@ if (BLAS_LIBRARIES MATCHES "mkl_") endif () if (LIBXSMM_FETCHED) - target_compile_definitions(dbcsr PRIVATE __LIBXSMM) + target_compile_definitions(dbcsr PRIVATE __LIBXSMM ${LIBXSMM_COMPILE_DEFINITIONS}) target_include_directories(dbcsr PRIVATE "${LIBXSMM_INCLUDE_DIRS}") set_target_properties( xsmm PROPERTIES INTERFACE_INCLUDE_DIRECTORIES @@ -207,7 +207,7 @@ if (LIBXSMM_FETCHED) ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}") target_link_libraries(dbcsr PRIVATE xsmm) elseif (LIBXSMM_FOUND) - target_compile_definitions(dbcsr PRIVATE __LIBXSMM) + target_compile_definitions(dbcsr PRIVATE __LIBXSMM ${LIBXSMM_COMPILE_DEFINITIONS}) target_include_directories(dbcsr PRIVATE "${LIBXSMM_INCLUDE_DIRS}") target_link_libraries(dbcsr PRIVATE ${LIBXSMM_LINK_LIBRARIES}) endif () diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 713e0d9c5e6..4ae06d72f04 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -195,7 +195,7 @@ if (NOT USE_MPI) target_link_libraries(${dbcsr_test_backend} PRIVATE DBCSR::LIBXS) endif () if (LIBXSMM_FOUND OR LIBXSMM_FETCHED) - target_compile_definitions(${dbcsr_test_backend} PRIVATE __LIBXSMM) + target_compile_definitions(${dbcsr_test_backend} PRIVATE __LIBXSMM ${LIBXSMM_COMPILE_DEFINITIONS}) target_include_directories(${dbcsr_test_backend} PRIVATE "${LIBXSMM_INCLUDE_DIRS}") endif () From 4c3d1d6d64227f931ea7cc4b7e7188158b6362dc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 6 Jun 2026 20:31:52 +0000 Subject: [PATCH 10/46] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/CMakeLists.txt | 6 ++++-- tests/CMakeLists.txt | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cfe90ee3a3d..3a77a9bd567 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -196,7 +196,8 @@ if (BLAS_LIBRARIES MATCHES "mkl_") endif () if (LIBXSMM_FETCHED) - target_compile_definitions(dbcsr PRIVATE __LIBXSMM ${LIBXSMM_COMPILE_DEFINITIONS}) + target_compile_definitions(dbcsr PRIVATE __LIBXSMM + ${LIBXSMM_COMPILE_DEFINITIONS}) target_include_directories(dbcsr PRIVATE "${LIBXSMM_INCLUDE_DIRS}") set_target_properties( xsmm PROPERTIES INTERFACE_INCLUDE_DIRECTORIES @@ -207,7 +208,8 @@ if (LIBXSMM_FETCHED) ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}") target_link_libraries(dbcsr PRIVATE xsmm) elseif (LIBXSMM_FOUND) - target_compile_definitions(dbcsr PRIVATE __LIBXSMM ${LIBXSMM_COMPILE_DEFINITIONS}) + target_compile_definitions(dbcsr PRIVATE __LIBXSMM + ${LIBXSMM_COMPILE_DEFINITIONS}) target_include_directories(dbcsr PRIVATE "${LIBXSMM_INCLUDE_DIRS}") target_link_libraries(dbcsr PRIVATE ${LIBXSMM_LINK_LIBRARIES}) endif () diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 4ae06d72f04..50cb549c41a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -195,7 +195,8 @@ if (NOT USE_MPI) target_link_libraries(${dbcsr_test_backend} PRIVATE DBCSR::LIBXS) endif () if (LIBXSMM_FOUND OR LIBXSMM_FETCHED) - target_compile_definitions(${dbcsr_test_backend} PRIVATE __LIBXSMM ${LIBXSMM_COMPILE_DEFINITIONS}) + target_compile_definitions( + ${dbcsr_test_backend} PRIVATE __LIBXSMM ${LIBXSMM_COMPILE_DEFINITIONS}) target_include_directories(${dbcsr_test_backend} PRIVATE "${LIBXSMM_INCLUDE_DIRS}") endif () From 9d5553ff50a7690279d711695ca266d30bd02b7b Mon Sep 17 00:00:00 2001 From: Growl Date: Sun, 7 Jun 2026 04:45:44 +0800 Subject: [PATCH 11/46] Fix Fedora RPM-build error --- examples/dbcsr_tensor_example_2.cpp | 70 ++++++++++++++--------------- tests/dbcsr_tensor_test.cpp | 70 ++++++++++++++--------------- 2 files changed, 68 insertions(+), 72 deletions(-) diff --git a/examples/dbcsr_tensor_example_2.cpp b/examples/dbcsr_tensor_example_2.cpp index 5346c5ae4d2..f20a7e71295 100644 --- a/examples/dbcsr_tensor_example_2.cpp +++ b/examples/dbcsr_tensor_example_2.cpp @@ -148,28 +148,29 @@ int main(int argc, char* argv[]) { } // block sizes - std::vector blk1, blk2, blk3, blk4, blk5; - // blk indices of non-zero blocks - std::vector nz11, nz12, nz13, nz21, nz22, nz24, nz25, nz33, nz34, nz35; - - blk1 = {3, 9, 12, 1}; - blk2 = {4, 2, 3, 1, 9, 2, 32, 10, 5, 8, 7}; - blk3 = {7, 3, 8, 7, 9, 5, 10, 23, 2}; - blk4 = {8, 1, 4, 13, 6}; - blk5 = {4, 2, 22}; - - nz11 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3}; - nz12 = {2, 4, 4, 4, 5, 5, 6, 7, 9, 10, 10, 0, 0, 3, 6, 6, 8, 9, 1, 1, 4, 5, 7, 7, 8, 10, 10, 1, 3, 4, 4, 7}; - nz13 = {6, 2, 4, 8, 5, 7, 1, 7, 2, 1, 2, 0, 3, 5, 1, 6, 4, 7, 2, 6, 0, 3, 2, 6, 7, 4, 7, 8, 5, 0, 1, 6}; + std::vector blk1 = {3, 9, 12, 1}; + std::vector blk2 = {4, 2, 3, 1, 9, 2, 32, 10, 5, 8, 7}; + std::vector blk3 = {7, 3, 8, 7, 9, 5, 10, 23, 2}; + std::vector blk4 = {8, 1, 4, 13, 6}; + std::vector blk5 = {4, 2, 22}; - nz21 = {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3}; - nz22 = {0, 2, 3, 5, 9, 1, 1, 3, 4, 4, 5, 5, 5, 6, 6, 8, 8, 8, 9, 10, 0, 2, 2, 3, 4, 5, 7, 8, 10, 10, 0, 2, 3, 5, 9, 10}; - nz24 = {2, 4, 1, 2, 1, 2, 4, 0, 0, 3, 1, 2, 3, 0, 3, 2, 3, 3, 1, 0, 2, 0, 0, 2, 3, 2, 3, 1, 1, 2, 0, 0, 2, 1, 4, 4}; - nz25 = {0, 2, 1, 0, 0, 1, 2, 0, 2, 0, 1, 2, 1, 0, 2, 1, 2, 1, 0, 1, 2, 0, 1, 2, 1, 1, 1, 2, 0, 1, 0, 2, 1, 0, 2, 1}; - - nz33 = {1, 3, 4, 4, 4, 5, 5, 7}; - nz34 = {2, 1, 0, 0, 2, 1, 3, 4}; - nz35 = {2, 1, 0, 1, 2, 1, 0, 0}; + // blk indices of non-zero blocks + std::vector nz11 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3}; + std::vector nz12 = {2, 4, 4, 4, 5, 5, 6, 7, 9, 10, 10, 0, 0, 3, 6, 6, 8, 9, 1, 1, 4, 5, 7, 7, 8, 10, 10, 1, 3, 4, 4, 7}; + std::vector nz13 = {6, 2, 4, 8, 5, 7, 1, 7, 2, 1, 2, 0, 3, 5, 1, 6, 4, 7, 2, 6, 0, 3, 2, 6, 7, 4, 7, 8, 5, 0, 1, 6}; + + std::vector nz21 = { + 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3}; + std::vector nz22 = { + 0, 2, 3, 5, 9, 1, 1, 3, 4, 4, 5, 5, 5, 6, 6, 8, 8, 8, 9, 10, 0, 2, 2, 3, 4, 5, 7, 8, 10, 10, 0, 2, 3, 5, 9, 10}; + std::vector nz24 = { + 2, 4, 1, 2, 1, 2, 4, 0, 0, 3, 1, 2, 3, 0, 3, 2, 3, 3, 1, 0, 2, 0, 0, 2, 3, 2, 3, 1, 1, 2, 0, 0, 2, 1, 4, 4}; + std::vector nz25 = { + 0, 2, 1, 0, 0, 1, 2, 0, 2, 0, 1, 2, 1, 0, 2, 1, 2, 1, 0, 1, 2, 0, 1, 2, 1, 1, 1, 2, 0, 1, 0, 2, 1, 0, 2, 1}; + + std::vector nz33 = {1, 3, 4, 4, 4, 5, 5, 7}; + std::vector nz34 = {2, 1, 0, 0, 2, 1, 3, 4}; + std::vector nz35 = {2, 1, 0, 1, 2, 1, 0, 0}; // (13|2)x(54|21)=(3|45) // distribute blocks @@ -223,14 +224,12 @@ int main(int argc, char* argv[]) { dbcsr_t_distribution dist3 = nullptr; // (13|2)x(54|21)=(3|45) - std::vector map11, map12, map21, map22, map31, map32; - - map11 = {0, 2}; - map12 = {1}; - map21 = {3, 2}; - map22 = {1, 0}; - map31 = {0}; - map32 = {1, 2}; + std::vector map11 = {0, 2}; + std::vector map12 = {1}; + std::vector map21 = {3, 2}; + std::vector map22 = {1, 0}; + std::vector map31 = {0}; + std::vector map32 = {1, 2}; if (mpi_rank == 0) std::cout << "Creating dist objects..." << '\n' << std::endl; @@ -286,13 +285,12 @@ int main(int argc, char* argv[]) { // cn : indices to be contracted // noncn : indices not to be contracted // mapn : how nonc indices map to tensor 3 - std::vector c1, nonc1, c2, nonc2, map1, map2; - c1 = {0, 1}; - nonc1 = {2}; - c2 = {0, 1}; - nonc2 = {2, 3}; - map1 = {0}; - map2 = {1, 2}; + std::vector c1 = {0, 1}; + std::vector nonc1 = {2}; + std::vector c2 = {0, 1}; + std::vector nonc2 = {2, 3}; + std::vector map1 = {0}; + std::vector map2 = {1, 2}; int unit_nr = -1; if (mpi_rank == 0) unit_nr = 6; diff --git a/tests/dbcsr_tensor_test.cpp b/tests/dbcsr_tensor_test.cpp index 47f1897b795..522d061de32 100644 --- a/tests/dbcsr_tensor_test.cpp +++ b/tests/dbcsr_tensor_test.cpp @@ -155,28 +155,29 @@ int main(int argc, char* argv[]) { // block sizes - std::vector blk1, blk2, blk3, blk4, blk5; - // blk indices of non-zero blocks - std::vector nz11, nz12, nz13, nz21, nz22, nz24, nz25, nz33, nz34, nz35; - - blk1 = {3, 9, 12, 1}; - blk2 = {4, 2, 3, 1, 9, 2, 32, 10, 5, 8, 7}; - blk3 = {7, 3, 8, 7, 9, 5, 10, 23, 2}; - blk4 = {8, 1, 4, 13, 6}; - blk5 = {4, 2, 22}; - - nz11 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3}; - nz12 = {2, 4, 4, 4, 5, 5, 6, 7, 9, 10, 10, 0, 0, 3, 6, 6, 8, 9, 1, 1, 4, 5, 7, 7, 8, 10, 10, 1, 3, 4, 4, 7}; - nz13 = {6, 2, 4, 8, 5, 7, 1, 7, 2, 1, 2, 0, 3, 5, 1, 6, 4, 7, 2, 6, 0, 3, 2, 6, 7, 4, 7, 8, 5, 0, 1, 6}; + std::vector blk1 = {3, 9, 12, 1}; + std::vector blk2 = {4, 2, 3, 1, 9, 2, 32, 10, 5, 8, 7}; + std::vector blk3 = {7, 3, 8, 7, 9, 5, 10, 23, 2}; + std::vector blk4 = {8, 1, 4, 13, 6}; + std::vector blk5 = {4, 2, 22}; - nz21 = {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3}; - nz22 = {0, 2, 3, 5, 9, 1, 1, 3, 4, 4, 5, 5, 5, 6, 6, 8, 8, 8, 9, 10, 0, 2, 2, 3, 4, 5, 7, 8, 10, 10, 0, 2, 3, 5, 9, 10}; - nz24 = {2, 4, 1, 2, 1, 2, 4, 0, 0, 3, 1, 2, 3, 0, 3, 2, 3, 3, 1, 0, 2, 0, 0, 2, 3, 2, 3, 1, 1, 2, 0, 0, 2, 1, 4, 4}; - nz25 = {0, 2, 1, 0, 0, 1, 2, 0, 2, 0, 1, 2, 1, 0, 2, 1, 2, 1, 0, 1, 2, 0, 1, 2, 1, 1, 1, 2, 0, 1, 0, 2, 1, 0, 2, 1}; - - nz33 = {1, 3, 4, 4, 4, 5, 5, 7}; - nz34 = {2, 1, 0, 0, 2, 1, 3, 4}; - nz35 = {2, 1, 0, 1, 2, 1, 0, 0}; + // blk indices of non-zero blocks + std::vector nz11 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3}; + std::vector nz12 = {2, 4, 4, 4, 5, 5, 6, 7, 9, 10, 10, 0, 0, 3, 6, 6, 8, 9, 1, 1, 4, 5, 7, 7, 8, 10, 10, 1, 3, 4, 4, 7}; + std::vector nz13 = {6, 2, 4, 8, 5, 7, 1, 7, 2, 1, 2, 0, 3, 5, 1, 6, 4, 7, 2, 6, 0, 3, 2, 6, 7, 4, 7, 8, 5, 0, 1, 6}; + + std::vector nz21 = { + 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3}; + std::vector nz22 = { + 0, 2, 3, 5, 9, 1, 1, 3, 4, 4, 5, 5, 5, 6, 6, 8, 8, 8, 9, 10, 0, 2, 2, 3, 4, 5, 7, 8, 10, 10, 0, 2, 3, 5, 9, 10}; + std::vector nz24 = { + 2, 4, 1, 2, 1, 2, 4, 0, 0, 3, 1, 2, 3, 0, 3, 2, 3, 3, 1, 0, 2, 0, 0, 2, 3, 2, 3, 1, 1, 2, 0, 0, 2, 1, 4, 4}; + std::vector nz25 = { + 0, 2, 1, 0, 0, 1, 2, 0, 2, 0, 1, 2, 1, 0, 2, 1, 2, 1, 0, 1, 2, 0, 1, 2, 1, 1, 1, 2, 0, 1, 0, 2, 1, 0, 2, 1}; + + std::vector nz33 = {1, 3, 4, 4, 4, 5, 5, 7}; + std::vector nz34 = {2, 1, 0, 0, 2, 1, 3, 4}; + std::vector nz35 = {2, 1, 0, 1, 2, 1, 0, 0}; // (13|2)x(54|21)=(3|45) // distribute blocks @@ -231,14 +232,12 @@ int main(int argc, char* argv[]) { void* dist3 = nullptr; // (13|2)x(54|21)=(3|45) - std::vector map11, map12, map21, map22, map31, map32; - - map11 = {0, 2}; - map12 = {1}; - map21 = {3, 2}; - map22 = {1, 0}; - map31 = {0}; - map32 = {1, 2}; + std::vector map11 = {0, 2}; + std::vector map12 = {1}; + std::vector map21 = {3, 2}; + std::vector map22 = {1, 0}; + std::vector map31 = {0}; + std::vector map32 = {1, 2}; if (mpi_rank == 0) std::cout << "Creating dist objects..." << '\n' << std::endl; @@ -290,13 +289,12 @@ int main(int argc, char* argv[]) { // cn : indices to be contracted // noncn : indices not to be contracted // mapn : how nonc indices map to tensor 3 - std::vector c1, nonc1, c2, nonc2, map1, map2; - c1 = {0, 1}; - nonc1 = {2}; - c2 = {0, 1}; - nonc2 = {2, 3}; - map1 = {0}; - map2 = {1, 2}; + std::vector c1 = {0, 1}; + std::vector nonc1 = {2}; + std::vector c2 = {0, 1}; + std::vector nonc2 = {2, 3}; + std::vector map1 = {0}; + std::vector map2 = {1, 2}; int unit_nr = -1; From f7b99f5d5277d76012d5d172ed02db81995e3d61 Mon Sep 17 00:00:00 2001 From: Growl Date: Sun, 7 Jun 2026 20:52:36 +0800 Subject: [PATCH 12/46] Move dependency finding into Find*.cmake --- CMakeLists.txt | 232 +-------------------------------- cmake/FindLIBXS.cmake | 106 +++++++++++++++ cmake/FindLIBXSMM.cmake | 136 +++++++++++++++++++ cmake/FindLIBXSTREAM.cmake | 146 +++++++++++++++++++++ src/CMakeLists.txt | 4 + src/cmake/DBCSRConfig.cmake.in | 86 +----------- 6 files changed, 404 insertions(+), 306 deletions(-) create mode 100644 cmake/FindLIBXS.cmake create mode 100644 cmake/FindLIBXSMM.cmake create mode 100644 cmake/FindLIBXSTREAM.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 8fbedf45226..612b8d9556f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -152,142 +152,17 @@ endif () # they can be linked into shared libraries. set(CMAKE_POSITION_INDEPENDENT_CODE ON) -# LIBXS provides host-side batched GEMM for all backends. LIBXSMM provides JIT -# kernels within LIBXS and is optional. Prefer already installed packages and -# standard CMake/pkg-config search paths before falling back to FetchContent. -include(FetchContent) -include(cmake/dependencies.cmake) -find_package(PkgConfig QUIET) - set(DBCSR_USE_LIBXSMM FALSE) set(LIBXSMM_COMPILE_DEFINITIONS "") +set(LIBXSMM_FETCHED FALSE) if (USE_LIBXS) - set(_dbcsr_libxs_pkg_names libxs) - if (BUILD_SHARED_LIBS) - list(PREPEND _dbcsr_libxs_pkg_names libxs-shared) - else () - list(PREPEND _dbcsr_libxs_pkg_names libxs-static) - endif () - - if (PkgConfig_FOUND) - foreach (_dbcsr_libxs_pkg IN LISTS _dbcsr_libxs_pkg_names) - pkg_check_modules(DBCSR_LIBXS QUIET IMPORTED_TARGET GLOBAL - ${_dbcsr_libxs_pkg}) - if (DBCSR_LIBXS_FOUND) - break() - endif () - endforeach () - endif () - - if (DBCSR_LIBXS_FOUND) - set(LIBXS_FOUND TRUE) - set(LIBXS_INCLUDE_DIRS ${DBCSR_LIBXS_INCLUDE_DIRS}) - set(LIBXS_LINK_LIBRARIES PkgConfig::DBCSR_LIBXS) - set(LIBXS_LIBRARY TRUE) - message(STATUS "Using prebuilt LIBXS from pkg-config") - else () - find_path( - LIBXS_INCLUDE_DIRS - NAMES libxs.h - PATH_SUFFIXES include) - find_library(LIBXS_LIBRARY NAMES xs) - if (LIBXS_INCLUDE_DIRS AND LIBXS_LIBRARY) - set(LIBXS_FOUND TRUE) - set(LIBXS_LINK_LIBRARIES ${LIBXS_LIBRARY}) - message(STATUS "Using prebuilt LIBXS") - endif () - endif () - - if (LIBXS_FOUND AND NOT TARGET DBCSR::LIBXS) - add_library(DBCSR::LIBXS INTERFACE IMPORTED GLOBAL) - target_include_directories(DBCSR::LIBXS INTERFACE "${LIBXS_INCLUDE_DIRS}") - target_link_libraries(DBCSR::LIBXS INTERFACE ${LIBXS_LINK_LIBRARIES}) - endif () - - if (NOT LIBXS_FOUND) - message(STATUS "LIBXS not found locally -- downloading via FetchContent") - FetchContent_Declare( - libxs - GIT_REPOSITORY ${LIBXS_GIT_REPOSITORY} - GIT_TAG ${LIBXS_GIT_TAG}) - set(LIBXS_FORTRAN - ON - CACHE BOOL "" FORCE) - set(LIBXS_SHARED - ${BUILD_SHARED_LIBS} - CACHE BOOL "" FORCE) - FetchContent_MakeAvailable(libxs) - set(LIBXS_FETCHED TRUE) - set(LIBXS_FOUND TRUE) - set(LIBXS_INCLUDE_DIRS "${libxs_SOURCE_DIR}/include") - set(LIBXS_LINK_LIBRARIES libxs::libxs) - if (NOT TARGET DBCSR::LIBXS) - add_library(DBCSR::LIBXS INTERFACE IMPORTED GLOBAL) - target_link_libraries(DBCSR::LIBXS INTERFACE libxs::libxs) - target_include_directories(DBCSR::LIBXS INTERFACE "${LIBXS_INCLUDE_DIRS}") - endif () - endif () - + find_package(LIBXS REQUIRED) if (USE_LIBXSMM) - set(_dbcsr_libxsmm_pkg_names libxsmm) - if (BUILD_SHARED_LIBS) - list(PREPEND _dbcsr_libxsmm_pkg_names libxsmm-shared) - else () - list(PREPEND _dbcsr_libxsmm_pkg_names libxsmm-static) - endif () - - if (PkgConfig_FOUND) - foreach (_dbcsr_libxsmm_pkg IN LISTS _dbcsr_libxsmm_pkg_names) - pkg_check_modules(DBCSR_LIBXSMM QUIET IMPORTED_TARGET GLOBAL - ${_dbcsr_libxsmm_pkg}) - if (DBCSR_LIBXSMM_FOUND) - break() - endif () - endforeach () - endif () - - if (DBCSR_LIBXSMM_FOUND) - set(LIBXSMM_FOUND TRUE) - set(LIBXSMM_INCLUDE_DIRS ${DBCSR_LIBXSMM_INCLUDE_DIRS}) - set(LIBXSMM_LINK_LIBRARIES PkgConfig::DBCSR_LIBXSMM) - set(DBCSR_USE_LIBXSMM TRUE) - message(STATUS "Using prebuilt LIBXSMM from pkg-config") - else () - find_path( - LIBXSMM_INCLUDE_DIRS - NAMES libxsmm.h - PATH_SUFFIXES include) - find_library(LIBXSMM_LIBRARY NAMES xsmm) - if (LIBXSMM_INCLUDE_DIRS AND LIBXSMM_LIBRARY) - set(LIBXSMM_FOUND TRUE) - set(LIBXSMM_LINK_LIBRARIES ${LIBXSMM_LIBRARY}) - set(DBCSR_USE_LIBXSMM TRUE) - message(STATUS "Using prebuilt LIBXSMM") - endif () - endif () - - if (NOT LIBXSMM_FOUND) - message( - STATUS "LIBXSMM not found locally -- downloading via FetchContent") - FetchContent_Declare( - libxsmm - GIT_REPOSITORY "https://github.com/libxsmm/libxsmm.git" - GIT_TAG ${LIBXSMM_GIT_TAG}) - set(XSMM_STATIC - ON - CACHE BOOL "" FORCE) - FetchContent_MakeAvailable(libxsmm) - set(LIBXSMM_FETCHED TRUE) - set(DBCSR_USE_LIBXSMM TRUE) - set(LIBXSMM_INCLUDE_DIRS "${libxsmm_SOURCE_DIR}/include") - set(LIBXSMM_COMPILE_DEFINITIONS LIBXSMM_DEFAULT_CONFIG) - get_target_property(_xsmm_srcs xsmm SOURCES) - list(FILTER _xsmm_srcs EXCLUDE REGEX - "(binaryexport_generator|gemm_driver)") - set_target_properties(xsmm PROPERTIES SOURCES "${_xsmm_srcs}") - endif () + find_package(LIBXSMM REQUIRED) endif () +elseif (USE_LIBXSMM) + message(WARNING "USE_LIBXSMM=ON requires USE_LIBXS=ON; ignoring USE_LIBXSMM.") endif () # =================================== BLAS & LAPACK, PkgConfig @@ -359,7 +234,6 @@ if (USE_ACCEL MATCHES "opencl") if (DEFINED ENV{CUDA_PATH}) list(APPEND CMAKE_PREFIX_PATH "$ENV{CUDA_PATH}") endif () - find_package(OpenCL REQUIRED) if (NOT USE_LIBXS OR NOT TARGET DBCSR::LIBXS) message( @@ -367,100 +241,8 @@ if (USE_ACCEL MATCHES "opencl") "LIBXS not found. OpenCL backend requires LIBXS (USE_LIBXS=ON).") endif () - set(_dbcsr_libxstream_pkg_names libxstream) - if (BUILD_SHARED_LIBS) - list(PREPEND _dbcsr_libxstream_pkg_names libxstream-shared) - else () - list(PREPEND _dbcsr_libxstream_pkg_names libxstream-static) - endif () - - if (PkgConfig_FOUND) - foreach (_dbcsr_libxstream_pkg IN LISTS _dbcsr_libxstream_pkg_names) - pkg_check_modules(DBCSR_LIBXSTREAM QUIET IMPORTED_TARGET GLOBAL - ${_dbcsr_libxstream_pkg}) - if (DBCSR_LIBXSTREAM_FOUND) - break() - endif () - endforeach () - endif () - - if (DBCSR_LIBXSTREAM_FOUND) - set(LIBXSTREAM_FOUND TRUE) - set(LIBXSTREAM_INCLUDE_DIRS ${DBCSR_LIBXSTREAM_INCLUDE_DIRS}) - set(LIBXSTREAM_LINK_LIBRARIES PkgConfig::DBCSR_LIBXSTREAM) - message(STATUS "Using prebuilt LIBXSTREAM from pkg-config") - else () - find_path( - LIBXSTREAM_INCLUDE_DIRS - NAMES libxstream.h - PATH_SUFFIXES include) - find_library(LIBXSTREAM_LIBRARY NAMES xstream) - if (LIBXSTREAM_INCLUDE_DIRS AND LIBXSTREAM_LIBRARY) - set(LIBXSTREAM_FOUND TRUE) - set(LIBXSTREAM_LINK_LIBRARIES ${LIBXSTREAM_LIBRARY}) - message(STATUS "Using prebuilt LIBXSTREAM") - endif () - endif () - - if (LIBXSTREAM_FOUND) - set(_dbcsr_libxstream_prefix_hints) - if (DBCSR_LIBXSTREAM_PREFIX) - list(APPEND _dbcsr_libxstream_prefix_hints "${DBCSR_LIBXSTREAM_PREFIX}") - endif () - foreach (_dbcsr_libxstream_include_dir IN LISTS LIBXSTREAM_INCLUDE_DIRS) - get_filename_component(_dbcsr_libxstream_prefix - "${_dbcsr_libxstream_include_dir}/.." ABSOLUTE) - list(APPEND _dbcsr_libxstream_prefix_hints "${_dbcsr_libxstream_prefix}") - endforeach () - - find_program( - LIBXSTREAM_OPENCL_SCRIPT - NAMES tool_opencl.sh - HINTS ${_dbcsr_libxstream_prefix_hints} - PATH_SUFFIXES scripts bin) - find_path( - LIBXSTREAM_SMM_DIR - NAMES smm_acc.c - HINTS ${_dbcsr_libxstream_prefix_hints} - PATH_SUFFIXES samples/smm share/libxstream/samples/smm) - if (NOT LIBXSTREAM_OPENCL_SCRIPT OR NOT LIBXSTREAM_SMM_DIR) - message( - STATUS - "Prebuilt LIBXSTREAM was found, but its OpenCL helper script or SMM samples were not found -- downloading via FetchContent" - ) - set(LIBXSTREAM_FOUND FALSE) - elseif (NOT TARGET DBCSR::LIBXSTREAM) - add_library(DBCSR::LIBXSTREAM INTERFACE IMPORTED GLOBAL) - target_include_directories(DBCSR::LIBXSTREAM - INTERFACE "${LIBXSTREAM_INCLUDE_DIRS}") - target_link_libraries(DBCSR::LIBXSTREAM - INTERFACE ${LIBXSTREAM_LINK_LIBRARIES}) - endif () - else () - message( - STATUS "LIBXSTREAM not found locally -- downloading via FetchContent") - FetchContent_Declare( - libxstream - GIT_REPOSITORY ${LIBXSTREAM_GIT_REPOSITORY} - GIT_TAG ${LIBXSTREAM_GIT_TAG}) - set(LIBXSTREAM_SHARED - ${BUILD_SHARED_LIBS} - CACHE BOOL "" FORCE) - FetchContent_MakeAvailable(libxstream) - set(LIBXSTREAM_FETCHED TRUE) - set(LIBXSTREAM_FOUND TRUE) - set(LIBXSTREAM_INCLUDE_DIRS "${libxstream_SOURCE_DIR}/include") - set(LIBXSTREAM_LINK_LIBRARIES libxstream::libxstream) - set(LIBXSTREAM_OPENCL_SCRIPT - "${libxstream_SOURCE_DIR}/scripts/tool_opencl.sh") - set(LIBXSTREAM_SMM_DIR "${libxstream_SOURCE_DIR}/samples/smm") - if (NOT TARGET DBCSR::LIBXSTREAM) - add_library(DBCSR::LIBXSTREAM INTERFACE IMPORTED GLOBAL) - target_link_libraries(DBCSR::LIBXSTREAM INTERFACE libxstream::libxstream) - target_include_directories(DBCSR::LIBXSTREAM - INTERFACE "${LIBXSTREAM_INCLUDE_DIRS}") - endif () - endif () + find_package(OpenCL REQUIRED) + find_package(LIBXSTREAM REQUIRED) message(STATUS "Using LIBXSTREAM") set(DBCSR_OPENCL_SCRIPT "${LIBXSTREAM_OPENCL_SCRIPT}") diff --git a/cmake/FindLIBXS.cmake b/cmake/FindLIBXS.cmake new file mode 100644 index 00000000000..27bdf640e12 --- /dev/null +++ b/cmake/FindLIBXS.cmake @@ -0,0 +1,106 @@ +# Locate LIBXS for DBCSR. +# +# This module first searches already installed packages through pkg-config and +# standard CMake search paths. When it is used from the DBCSR build tree and no +# local installation is found, it falls back to FetchContent. +# +# Result variables: +# LIBXS_FOUND +# LIBXS_INCLUDE_DIRS +# LIBXS_LINK_LIBRARIES +# LIBXS_FETCHED +# +# Imported target: +# DBCSR::LIBXS + +include(FindPackageHandleStandardArgs) +include("${CMAKE_CURRENT_LIST_DIR}/dependencies.cmake" OPTIONAL) + +if (NOT DEFINED DBCSR_FETCH_MISSING_DEPS) + if (PROJECT_NAME STREQUAL "dbcsr") + set(DBCSR_FETCH_MISSING_DEPS ON) + else () + set(DBCSR_FETCH_MISSING_DEPS OFF) + endif () +endif () + +set(LIBXS_FETCHED FALSE) +set(_dbcsr_libxs_prefix_hints) +if (DEFINED PACKAGE_PREFIX_DIR) + list(APPEND _dbcsr_libxs_prefix_hints "${PACKAGE_PREFIX_DIR}") +endif () +find_package(PkgConfig QUIET) + +set(_dbcsr_libxs_pkg_names libxs) +if (DEFINED BUILD_SHARED_LIBS) + if (BUILD_SHARED_LIBS) + list(PREPEND _dbcsr_libxs_pkg_names libxs-shared) + else () + list(PREPEND _dbcsr_libxs_pkg_names libxs-static) + endif () +else () + list(PREPEND _dbcsr_libxs_pkg_names libxs-static libxs-shared) +endif () + +if (PkgConfig_FOUND) + foreach (_dbcsr_libxs_pkg IN LISTS _dbcsr_libxs_pkg_names) + pkg_check_modules(DBCSR_LIBXS QUIET IMPORTED_TARGET GLOBAL + ${_dbcsr_libxs_pkg}) + if (DBCSR_LIBXS_FOUND) + break() + endif () + endforeach () +endif () + +if (DBCSR_LIBXS_FOUND) + set(LIBXS_INCLUDE_DIRS ${DBCSR_LIBXS_INCLUDE_DIRS}) + set(LIBXS_LINK_LIBRARIES PkgConfig::DBCSR_LIBXS) + message(STATUS "Using prebuilt LIBXS from pkg-config") +else () + find_path( + LIBXS_INCLUDE_DIRS + NAMES libxs.h + HINTS ${_dbcsr_libxs_prefix_hints} + PATH_SUFFIXES include) + find_library( + LIBXS_LIBRARY + NAMES xs + HINTS ${_dbcsr_libxs_prefix_hints}) + if (LIBXS_INCLUDE_DIRS AND LIBXS_LIBRARY) + set(LIBXS_LINK_LIBRARIES ${LIBXS_LIBRARY}) + message(STATUS "Using prebuilt LIBXS") + endif () +endif () + +if ((NOT LIBXS_INCLUDE_DIRS OR NOT LIBXS_LINK_LIBRARIES) + AND DBCSR_FETCH_MISSING_DEPS) + include(FetchContent) + message(STATUS "LIBXS not found locally -- downloading via FetchContent") + FetchContent_Declare( + libxs + GIT_REPOSITORY ${LIBXS_GIT_REPOSITORY} + GIT_TAG ${LIBXS_GIT_TAG}) + set(LIBXS_FORTRAN + ON + CACHE BOOL "" FORCE) + set(LIBXS_SHARED + ${BUILD_SHARED_LIBS} + CACHE BOOL "" FORCE) + FetchContent_MakeAvailable(libxs) + set(LIBXS_FETCHED TRUE) + set(LIBXS_INCLUDE_DIRS "${libxs_SOURCE_DIR}/include") + set(LIBXS_LINK_LIBRARIES libxs::libxs) +endif () + +find_package_handle_standard_args(LIBXS DEFAULT_MSG LIBXS_INCLUDE_DIRS + LIBXS_LINK_LIBRARIES) + +if (LIBXS_FOUND AND NOT TARGET DBCSR::LIBXS) + add_library(DBCSR::LIBXS INTERFACE IMPORTED GLOBAL) + target_include_directories(DBCSR::LIBXS INTERFACE "${LIBXS_INCLUDE_DIRS}") + target_link_libraries(DBCSR::LIBXS INTERFACE ${LIBXS_LINK_LIBRARIES}) +endif () + +unset(_dbcsr_libxs_pkg) +unset(_dbcsr_libxs_pkg_names) +unset(_dbcsr_libxs_prefix_hints) diff --git a/cmake/FindLIBXSMM.cmake b/cmake/FindLIBXSMM.cmake new file mode 100644 index 00000000000..64037226813 --- /dev/null +++ b/cmake/FindLIBXSMM.cmake @@ -0,0 +1,136 @@ +# Locate LIBXSMM for DBCSR. +# +# This module first searches already installed packages through pkg-config and +# standard CMake search paths. When it is used from the DBCSR build tree and no +# local installation is found, it falls back to FetchContent. +# +# Result variables: +# LIBXSMM_FOUND +# LIBXSMM_INCLUDE_DIRS +# LIBXSMM_LINK_LIBRARIES +# LIBXSMM_COMPILE_DEFINITIONS +# LIBXSMM_FETCHED +# DBCSR_USE_LIBXSMM +# +# Imported targets: +# DBCSR::LIBXSMM +# xsmm + +include(FindPackageHandleStandardArgs) +include("${CMAKE_CURRENT_LIST_DIR}/dependencies.cmake" OPTIONAL) + +if (NOT DEFINED DBCSR_FETCH_MISSING_DEPS) + if (PROJECT_NAME STREQUAL "dbcsr") + set(DBCSR_FETCH_MISSING_DEPS ON) + else () + set(DBCSR_FETCH_MISSING_DEPS OFF) + endif () +endif () + +set(LIBXSMM_FETCHED FALSE) +set(LIBXSMM_COMPILE_DEFINITIONS "") +set(DBCSR_USE_LIBXSMM FALSE) + +set(_dbcsr_libxsmm_prefix_hints) +if (DEFINED PACKAGE_PREFIX_DIR) + list(APPEND _dbcsr_libxsmm_prefix_hints "${PACKAGE_PREFIX_DIR}") +endif () +find_package(PkgConfig QUIET) + +set(_dbcsr_libxsmm_pkg_names libxsmm) +if (DEFINED BUILD_SHARED_LIBS) + if (BUILD_SHARED_LIBS) + list(PREPEND _dbcsr_libxsmm_pkg_names libxsmm-shared) + else () + list(PREPEND _dbcsr_libxsmm_pkg_names libxsmm-static) + endif () +else () + list(PREPEND _dbcsr_libxsmm_pkg_names libxsmm-static libxsmm-shared) +endif () + +if (PkgConfig_FOUND) + foreach (_dbcsr_libxsmm_pkg IN LISTS _dbcsr_libxsmm_pkg_names) + pkg_check_modules(DBCSR_LIBXSMM QUIET IMPORTED_TARGET GLOBAL + ${_dbcsr_libxsmm_pkg}) + if (DBCSR_LIBXSMM_FOUND) + break() + endif () + endforeach () +endif () + +if (DBCSR_LIBXSMM_FOUND) + set(LIBXSMM_INCLUDE_DIRS ${DBCSR_LIBXSMM_INCLUDE_DIRS}) + set(LIBXSMM_LINK_LIBRARIES PkgConfig::DBCSR_LIBXSMM) + message(STATUS "Using prebuilt LIBXSMM from pkg-config") +else () + find_path( + LIBXSMM_INCLUDE_DIRS + NAMES libxsmm.h + HINTS ${_dbcsr_libxsmm_prefix_hints} + PATH_SUFFIXES include) + find_library( + LIBXSMM_LIBRARY + NAMES xsmm + HINTS ${_dbcsr_libxsmm_prefix_hints}) + if (LIBXSMM_INCLUDE_DIRS AND LIBXSMM_LIBRARY) + set(LIBXSMM_LINK_LIBRARIES ${LIBXSMM_LIBRARY}) + message(STATUS "Using prebuilt LIBXSMM") + endif () +endif () + +if ((NOT LIBXSMM_INCLUDE_DIRS OR NOT LIBXSMM_LINK_LIBRARIES) + AND DBCSR_FETCH_MISSING_DEPS) + include(FetchContent) + message(STATUS "LIBXSMM not found locally -- downloading via FetchContent") + FetchContent_Declare( + libxsmm + GIT_REPOSITORY "https://github.com/libxsmm/libxsmm.git" + GIT_TAG ${LIBXSMM_GIT_TAG}) + set(XSMM_STATIC + ON + CACHE BOOL "" FORCE) + FetchContent_MakeAvailable(libxsmm) + set(LIBXSMM_FETCHED TRUE) + set(LIBXSMM_INCLUDE_DIRS "${libxsmm_SOURCE_DIR}/include") + set(LIBXSMM_LINK_LIBRARIES xsmm) + set(LIBXSMM_COMPILE_DEFINITIONS LIBXSMM_DEFAULT_CONFIG) + get_target_property(_xsmm_srcs xsmm SOURCES) + list(FILTER _xsmm_srcs EXCLUDE REGEX "(binaryexport_generator|gemm_driver)") + set_target_properties(xsmm PROPERTIES SOURCES "${_xsmm_srcs}") +endif () + +find_package_handle_standard_args(LIBXSMM DEFAULT_MSG LIBXSMM_INCLUDE_DIRS + LIBXSMM_LINK_LIBRARIES) + +if (LIBXSMM_FOUND) + set(DBCSR_USE_LIBXSMM TRUE) + + if (NOT TARGET DBCSR::LIBXSMM) + add_library(DBCSR::LIBXSMM INTERFACE IMPORTED GLOBAL) + target_include_directories(DBCSR::LIBXSMM + INTERFACE "${LIBXSMM_INCLUDE_DIRS}") + target_link_libraries(DBCSR::LIBXSMM INTERFACE ${LIBXSMM_LINK_LIBRARIES}) + if (LIBXSMM_COMPILE_DEFINITIONS) + target_compile_definitions(DBCSR::LIBXSMM + INTERFACE ${LIBXSMM_COMPILE_DEFINITIONS}) + endif () + endif () + + if (NOT TARGET xsmm) + if (DBCSR_LIBXSMM_FOUND) + add_library(xsmm INTERFACE IMPORTED GLOBAL) + target_link_libraries(xsmm INTERFACE PkgConfig::DBCSR_LIBXSMM) + else () + add_library(xsmm UNKNOWN IMPORTED GLOBAL) + set_target_properties( + xsmm PROPERTIES IMPORTED_LOCATION "${LIBXSMM_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES + "${LIBXSMM_INCLUDE_DIRS}") + endif () + endif () +endif () + +unset(_dbcsr_libxsmm_pkg) +unset(_dbcsr_libxsmm_pkg_names) +unset(_dbcsr_libxsmm_prefix_hints) +unset(_xsmm_srcs) diff --git a/cmake/FindLIBXSTREAM.cmake b/cmake/FindLIBXSTREAM.cmake new file mode 100644 index 00000000000..534e75e230a --- /dev/null +++ b/cmake/FindLIBXSTREAM.cmake @@ -0,0 +1,146 @@ +# Locate LIBXSTREAM for DBCSR's OpenCL backend. +# +# A usable LIBXSTREAM dependency must provide the library/header as well as the +# OpenCL helper script and the SMM sample sources used by DBCSR. This module +# first searches already installed packages through pkg-config and standard CMake +# search paths. When it is used from the DBCSR build tree and no complete local +# installation is found, it falls back to FetchContent. +# +# Result variables: +# LIBXSTREAM_FOUND +# LIBXSTREAM_INCLUDE_DIRS +# LIBXSTREAM_LINK_LIBRARIES +# LIBXSTREAM_OPENCL_SCRIPT +# LIBXSTREAM_SMM_DIR +# LIBXSTREAM_FETCHED +# +# Imported target: +# DBCSR::LIBXSTREAM + +include(FindPackageHandleStandardArgs) +include("${CMAKE_CURRENT_LIST_DIR}/dependencies.cmake" OPTIONAL) + +if (NOT DEFINED DBCSR_FETCH_MISSING_DEPS) + if (PROJECT_NAME STREQUAL "dbcsr") + set(DBCSR_FETCH_MISSING_DEPS ON) + else () + set(DBCSR_FETCH_MISSING_DEPS OFF) + endif () +endif () + +set(LIBXSTREAM_FETCHED FALSE) + +set(_dbcsr_libxstream_prefix_hints) +if (DEFINED PACKAGE_PREFIX_DIR) + list(APPEND _dbcsr_libxstream_prefix_hints "${PACKAGE_PREFIX_DIR}") +endif () +find_package(PkgConfig QUIET) + +set(_dbcsr_libxstream_pkg_names libxstream) +if (DEFINED BUILD_SHARED_LIBS) + if (BUILD_SHARED_LIBS) + list(PREPEND _dbcsr_libxstream_pkg_names libxstream-shared) + else () + list(PREPEND _dbcsr_libxstream_pkg_names libxstream-static) + endif () +else () + list(PREPEND _dbcsr_libxstream_pkg_names libxstream-static libxstream-shared) +endif () + +if (PkgConfig_FOUND) + foreach (_dbcsr_libxstream_pkg IN LISTS _dbcsr_libxstream_pkg_names) + pkg_check_modules(DBCSR_LIBXSTREAM QUIET IMPORTED_TARGET GLOBAL + ${_dbcsr_libxstream_pkg}) + if (DBCSR_LIBXSTREAM_FOUND) + break() + endif () + endforeach () +endif () + +if (DBCSR_LIBXSTREAM_FOUND) + set(LIBXSTREAM_INCLUDE_DIRS ${DBCSR_LIBXSTREAM_INCLUDE_DIRS}) + set(LIBXSTREAM_LINK_LIBRARIES PkgConfig::DBCSR_LIBXSTREAM) + if (DBCSR_LIBXSTREAM_PREFIX) + list(APPEND _dbcsr_libxstream_prefix_hints "${DBCSR_LIBXSTREAM_PREFIX}") + endif () + message(STATUS "Using prebuilt LIBXSTREAM from pkg-config") +else () + find_path( + LIBXSTREAM_INCLUDE_DIRS + NAMES libxstream.h + HINTS ${_dbcsr_libxstream_prefix_hints} + PATH_SUFFIXES include) + find_library( + LIBXSTREAM_LIBRARY + NAMES xstream + HINTS ${_dbcsr_libxstream_prefix_hints}) + if (LIBXSTREAM_INCLUDE_DIRS AND LIBXSTREAM_LIBRARY) + set(LIBXSTREAM_LINK_LIBRARIES ${LIBXSTREAM_LIBRARY}) + message(STATUS "Using prebuilt LIBXSTREAM") + endif () +endif () + +foreach (_dbcsr_libxstream_include_dir IN LISTS LIBXSTREAM_INCLUDE_DIRS) + get_filename_component(_dbcsr_libxstream_prefix + "${_dbcsr_libxstream_include_dir}/.." ABSOLUTE) + list(APPEND _dbcsr_libxstream_prefix_hints "${_dbcsr_libxstream_prefix}") +endforeach () + +if (LIBXSTREAM_INCLUDE_DIRS AND LIBXSTREAM_LINK_LIBRARIES) + find_program( + LIBXSTREAM_OPENCL_SCRIPT + NAMES tool_opencl.sh + HINTS ${_dbcsr_libxstream_prefix_hints} + PATH_SUFFIXES scripts bin) + find_path( + LIBXSTREAM_SMM_DIR + NAMES smm_acc.c + HINTS ${_dbcsr_libxstream_prefix_hints} + PATH_SUFFIXES samples/smm share/libxstream/samples/smm) +endif () + +if ((NOT LIBXSTREAM_INCLUDE_DIRS OR NOT LIBXSTREAM_LINK_LIBRARIES + OR NOT LIBXSTREAM_OPENCL_SCRIPT OR NOT LIBXSTREAM_SMM_DIR) + AND DBCSR_FETCH_MISSING_DEPS) + include(FetchContent) + if (LIBXSTREAM_INCLUDE_DIRS AND LIBXSTREAM_LINK_LIBRARIES) + message( + STATUS + "Prebuilt LIBXSTREAM was found, but its OpenCL helper script or SMM samples were not found -- downloading via FetchContent" + ) + else () + message(STATUS "LIBXSTREAM not found locally -- downloading via FetchContent") + endif () + FetchContent_Declare( + libxstream + GIT_REPOSITORY ${LIBXSTREAM_GIT_REPOSITORY} + GIT_TAG ${LIBXSTREAM_GIT_TAG}) + set(LIBXSTREAM_SHARED + ${BUILD_SHARED_LIBS} + CACHE BOOL "" FORCE) + FetchContent_MakeAvailable(libxstream) + set(LIBXSTREAM_FETCHED TRUE) + set(LIBXSTREAM_INCLUDE_DIRS "${libxstream_SOURCE_DIR}/include") + set(LIBXSTREAM_LINK_LIBRARIES libxstream::libxstream) + set(LIBXSTREAM_OPENCL_SCRIPT + "${libxstream_SOURCE_DIR}/scripts/tool_opencl.sh") + set(LIBXSTREAM_SMM_DIR "${libxstream_SOURCE_DIR}/samples/smm") +endif () + +find_package_handle_standard_args( + LIBXSTREAM DEFAULT_MSG LIBXSTREAM_INCLUDE_DIRS LIBXSTREAM_LINK_LIBRARIES + LIBXSTREAM_OPENCL_SCRIPT LIBXSTREAM_SMM_DIR) + +if (LIBXSTREAM_FOUND AND NOT TARGET DBCSR::LIBXSTREAM) + add_library(DBCSR::LIBXSTREAM INTERFACE IMPORTED GLOBAL) + target_include_directories(DBCSR::LIBXSTREAM + INTERFACE "${LIBXSTREAM_INCLUDE_DIRS}") + target_link_libraries(DBCSR::LIBXSTREAM + INTERFACE ${LIBXSTREAM_LINK_LIBRARIES}) +endif () + +unset(_dbcsr_libxstream_pkg) +unset(_dbcsr_libxstream_pkg_names) +unset(_dbcsr_libxstream_prefix_hints) +unset(_dbcsr_libxstream_prefix) +unset(_dbcsr_libxstream_include_dir) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3a77a9bd567..fa125714e09 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -411,4 +411,8 @@ install( DESTINATION "${config_install_dir}") install(FILES ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfigVersion.cmake + ${PROJECT_SOURCE_DIR}/cmake/FindLIBXS.cmake + ${PROJECT_SOURCE_DIR}/cmake/FindLIBXSMM.cmake + ${PROJECT_SOURCE_DIR}/cmake/FindLIBXSTREAM.cmake + ${PROJECT_SOURCE_DIR}/cmake/dependencies.cmake DESTINATION ${config_install_dir}) diff --git a/src/cmake/DBCSRConfig.cmake.in b/src/cmake/DBCSRConfig.cmake.in index 42bc689853d..1236379c0f6 100644 --- a/src/cmake/DBCSRConfig.cmake.in +++ b/src/cmake/DBCSRConfig.cmake.in @@ -2,6 +2,8 @@ include(CMakeFindDependencyMacro) +list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}") + # the following should only be needed when building statically if (@USE_MPI@) @@ -16,40 +18,7 @@ endif () if (@USE_LIBXS@) set(DBCSR_USE_LIBXS @USE_LIBXS@) - find_package(PkgConfig QUIET) - set(_dbcsr_libxs_pkg_names libxs) - if (@BUILD_SHARED_LIBS@) - list(PREPEND _dbcsr_libxs_pkg_names libxs-shared) - else () - list(PREPEND _dbcsr_libxs_pkg_names libxs-static) - endif () - foreach (_dbcsr_libxs_pkg IN LISTS _dbcsr_libxs_pkg_names) - pkg_check_modules(DBCSR_LIBXS QUIET IMPORTED_TARGET GLOBAL - ${_dbcsr_libxs_pkg}) - if (DBCSR_LIBXS_FOUND) - break() - endif () - endforeach () - if (DBCSR_LIBXS_FOUND) - if (NOT TARGET DBCSR::LIBXS) - add_library(DBCSR::LIBXS INTERFACE IMPORTED) - target_link_libraries(DBCSR::LIBXS INTERFACE PkgConfig::DBCSR_LIBXS) - endif () - else () - find_path(DBCSR_LIBXS_INCLUDE_DIRS NAMES libxs.h PATH_SUFFIXES include) - find_library(DBCSR_LIBXS_LIBRARY NAMES xs) - if (DBCSR_LIBXS_INCLUDE_DIRS AND DBCSR_LIBXS_LIBRARY AND NOT TARGET DBCSR::LIBXS) - add_library(DBCSR::LIBXS INTERFACE IMPORTED) - set_target_properties( - DBCSR::LIBXS PROPERTIES INTERFACE_INCLUDE_DIRECTORIES - "${DBCSR_LIBXS_INCLUDE_DIRS}" - INTERFACE_LINK_LIBRARIES - "${DBCSR_LIBXS_LIBRARY}") - endif () - endif () - if (NOT TARGET DBCSR::LIBXS) - message(FATAL_ERROR "LIBXS is required by this DBCSR installation.") - endif () + find_dependency(LIBXS) endif () if ("@USE_ACCEL@" MATCHES "cuda") @@ -69,57 +38,12 @@ endif () if ("@USE_ACCEL@" MATCHES "opencl") set(DBCSR_USE_ACCEL @USE_ACCEL@) find_dependency(OpenCL) - find_package(PkgConfig QUIET) - set(_dbcsr_libxstream_pkg_names libxstream) - if (@BUILD_SHARED_LIBS@) - list(PREPEND _dbcsr_libxstream_pkg_names libxstream-shared) - else () - list(PREPEND _dbcsr_libxstream_pkg_names libxstream-static) - endif () - foreach (_dbcsr_libxstream_pkg IN LISTS _dbcsr_libxstream_pkg_names) - pkg_check_modules(DBCSR_LIBXSTREAM QUIET IMPORTED_TARGET GLOBAL - ${_dbcsr_libxstream_pkg}) - if (DBCSR_LIBXSTREAM_FOUND) - break() - endif () - endforeach () - if (DBCSR_LIBXSTREAM_FOUND) - if (NOT TARGET DBCSR::LIBXSTREAM) - add_library(DBCSR::LIBXSTREAM INTERFACE IMPORTED) - target_link_libraries(DBCSR::LIBXSTREAM - INTERFACE PkgConfig::DBCSR_LIBXSTREAM) - endif () - else () - find_path(DBCSR_LIBXSTREAM_INCLUDE_DIRS NAMES libxstream.h - PATH_SUFFIXES include) - find_library(DBCSR_LIBXSTREAM_LIBRARY NAMES xstream) - if (DBCSR_LIBXSTREAM_INCLUDE_DIRS AND DBCSR_LIBXSTREAM_LIBRARY AND NOT TARGET DBCSR::LIBXSTREAM) - add_library(DBCSR::LIBXSTREAM INTERFACE IMPORTED) - set_target_properties( - DBCSR::LIBXSTREAM - PROPERTIES INTERFACE_INCLUDE_DIRECTORIES - "${DBCSR_LIBXSTREAM_INCLUDE_DIRS}" - INTERFACE_LINK_LIBRARIES "${DBCSR_LIBXSTREAM_LIBRARY}") - endif () - endif () - if (NOT TARGET DBCSR::LIBXSTREAM) - message(FATAL_ERROR "LIBXSTREAM is required by this DBCSR installation.") - endif () + find_dependency(LIBXSTREAM) endif () if (@DBCSR_USE_LIBXSMM@) set(DBCSR_USE_LIBXSMM @DBCSR_USE_LIBXSMM@) - if (NOT TARGET xsmm) - find_library(DBCSR_LIBXSMM_LIBRARY xsmm - PATHS "@LIBXSMMROOT@/lib" NO_DEFAULT_PATH) - if (NOT DBCSR_LIBXSMM_LIBRARY) - find_library(DBCSR_LIBXSMM_LIBRARY xsmm) - endif () - if (DBCSR_LIBXSMM_LIBRARY) - add_library(xsmm UNKNOWN IMPORTED) - set_target_properties(xsmm PROPERTIES IMPORTED_LOCATION "${DBCSR_LIBXSMM_LIBRARY}") - endif () - endif () + find_dependency(LIBXSMM) endif () include("${CMAKE_CURRENT_LIST_DIR}/DBCSRTargets.cmake") From 4b4a45c0cf85edffe60f068b4c83b30001eaaa3c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 7 Jun 2026 12:53:54 +0000 Subject: [PATCH 13/46] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- cmake/FindLIBXS.cmake | 10 +++------- cmake/FindLIBXSMM.cmake | 16 ++++------------ cmake/FindLIBXSTREAM.cmake | 29 ++++++++++++++--------------- src/CMakeLists.txt | 15 ++++++++------- 4 files changed, 29 insertions(+), 41 deletions(-) diff --git a/cmake/FindLIBXS.cmake b/cmake/FindLIBXS.cmake index 27bdf640e12..01ca28ec113 100644 --- a/cmake/FindLIBXS.cmake +++ b/cmake/FindLIBXS.cmake @@ -4,14 +4,10 @@ # standard CMake search paths. When it is used from the DBCSR build tree and no # local installation is found, it falls back to FetchContent. # -# Result variables: -# LIBXS_FOUND -# LIBXS_INCLUDE_DIRS -# LIBXS_LINK_LIBRARIES -# LIBXS_FETCHED +# Result variables: LIBXS_FOUND LIBXS_INCLUDE_DIRS LIBXS_LINK_LIBRARIES +# LIBXS_FETCHED # -# Imported target: -# DBCSR::LIBXS +# Imported target: DBCSR::LIBXS include(FindPackageHandleStandardArgs) include("${CMAKE_CURRENT_LIST_DIR}/dependencies.cmake" OPTIONAL) diff --git a/cmake/FindLIBXSMM.cmake b/cmake/FindLIBXSMM.cmake index 64037226813..075c3308634 100644 --- a/cmake/FindLIBXSMM.cmake +++ b/cmake/FindLIBXSMM.cmake @@ -4,17 +4,10 @@ # standard CMake search paths. When it is used from the DBCSR build tree and no # local installation is found, it falls back to FetchContent. # -# Result variables: -# LIBXSMM_FOUND -# LIBXSMM_INCLUDE_DIRS -# LIBXSMM_LINK_LIBRARIES -# LIBXSMM_COMPILE_DEFINITIONS -# LIBXSMM_FETCHED -# DBCSR_USE_LIBXSMM +# Result variables: LIBXSMM_FOUND LIBXSMM_INCLUDE_DIRS LIBXSMM_LINK_LIBRARIES +# LIBXSMM_COMPILE_DEFINITIONS LIBXSMM_FETCHED DBCSR_USE_LIBXSMM # -# Imported targets: -# DBCSR::LIBXSMM -# xsmm +# Imported targets: DBCSR::LIBXSMM xsmm include(FindPackageHandleStandardArgs) include("${CMAKE_CURRENT_LIST_DIR}/dependencies.cmake" OPTIONAL) @@ -124,8 +117,7 @@ if (LIBXSMM_FOUND) add_library(xsmm UNKNOWN IMPORTED GLOBAL) set_target_properties( xsmm PROPERTIES IMPORTED_LOCATION "${LIBXSMM_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES - "${LIBXSMM_INCLUDE_DIRS}") + INTERFACE_INCLUDE_DIRECTORIES "${LIBXSMM_INCLUDE_DIRS}") endif () endif () endif () diff --git a/cmake/FindLIBXSTREAM.cmake b/cmake/FindLIBXSTREAM.cmake index 534e75e230a..7a25de600d9 100644 --- a/cmake/FindLIBXSTREAM.cmake +++ b/cmake/FindLIBXSTREAM.cmake @@ -2,20 +2,15 @@ # # A usable LIBXSTREAM dependency must provide the library/header as well as the # OpenCL helper script and the SMM sample sources used by DBCSR. This module -# first searches already installed packages through pkg-config and standard CMake -# search paths. When it is used from the DBCSR build tree and no complete local -# installation is found, it falls back to FetchContent. +# first searches already installed packages through pkg-config and standard +# CMake search paths. When it is used from the DBCSR build tree and no complete +# local installation is found, it falls back to FetchContent. # -# Result variables: -# LIBXSTREAM_FOUND -# LIBXSTREAM_INCLUDE_DIRS -# LIBXSTREAM_LINK_LIBRARIES -# LIBXSTREAM_OPENCL_SCRIPT -# LIBXSTREAM_SMM_DIR -# LIBXSTREAM_FETCHED +# Result variables: LIBXSTREAM_FOUND LIBXSTREAM_INCLUDE_DIRS +# LIBXSTREAM_LINK_LIBRARIES LIBXSTREAM_OPENCL_SCRIPT LIBXSTREAM_SMM_DIR +# LIBXSTREAM_FETCHED # -# Imported target: -# DBCSR::LIBXSTREAM +# Imported target: DBCSR::LIBXSTREAM include(FindPackageHandleStandardArgs) include("${CMAKE_CURRENT_LIST_DIR}/dependencies.cmake" OPTIONAL) @@ -99,8 +94,11 @@ if (LIBXSTREAM_INCLUDE_DIRS AND LIBXSTREAM_LINK_LIBRARIES) PATH_SUFFIXES samples/smm share/libxstream/samples/smm) endif () -if ((NOT LIBXSTREAM_INCLUDE_DIRS OR NOT LIBXSTREAM_LINK_LIBRARIES - OR NOT LIBXSTREAM_OPENCL_SCRIPT OR NOT LIBXSTREAM_SMM_DIR) +if ((NOT LIBXSTREAM_INCLUDE_DIRS + OR NOT LIBXSTREAM_LINK_LIBRARIES + OR NOT LIBXSTREAM_OPENCL_SCRIPT + OR NOT LIBXSTREAM_SMM_DIR + ) AND DBCSR_FETCH_MISSING_DEPS) include(FetchContent) if (LIBXSTREAM_INCLUDE_DIRS AND LIBXSTREAM_LINK_LIBRARIES) @@ -109,7 +107,8 @@ if ((NOT LIBXSTREAM_INCLUDE_DIRS OR NOT LIBXSTREAM_LINK_LIBRARIES "Prebuilt LIBXSTREAM was found, but its OpenCL helper script or SMM samples were not found -- downloading via FetchContent" ) else () - message(STATUS "LIBXSTREAM not found locally -- downloading via FetchContent") + message( + STATUS "LIBXSTREAM not found locally -- downloading via FetchContent") endif () FetchContent_Declare( libxstream diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fa125714e09..c155066c018 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -409,10 +409,11 @@ install( EXPORT DBCSRTargets NAMESPACE "${config_namespace}" DESTINATION "${config_install_dir}") -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfig.cmake - ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfigVersion.cmake - ${PROJECT_SOURCE_DIR}/cmake/FindLIBXS.cmake - ${PROJECT_SOURCE_DIR}/cmake/FindLIBXSMM.cmake - ${PROJECT_SOURCE_DIR}/cmake/FindLIBXSTREAM.cmake - ${PROJECT_SOURCE_DIR}/cmake/dependencies.cmake - DESTINATION ${config_install_dir}) +install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfigVersion.cmake + ${PROJECT_SOURCE_DIR}/cmake/FindLIBXS.cmake + ${PROJECT_SOURCE_DIR}/cmake/FindLIBXSMM.cmake + ${PROJECT_SOURCE_DIR}/cmake/FindLIBXSTREAM.cmake + ${PROJECT_SOURCE_DIR}/cmake/dependencies.cmake + DESTINATION ${config_install_dir}) From 31a7feb928fbb8b33be1b6d1d63f1c861c4228b5 Mon Sep 17 00:00:00 2001 From: Growl Date: Mon, 8 Jun 2026 17:09:02 +0800 Subject: [PATCH 14/46] Test CMake-built libxs* library --- cmake/FindLIBXS.cmake | 81 +++++++--------------- cmake/FindLIBXSMM.cmake | 110 ++++++++---------------------- cmake/FindLIBXSTREAM.cmake | 133 ++++++++++++++++--------------------- cmake/dependencies.cmake | 19 ++++-- 4 files changed, 123 insertions(+), 220 deletions(-) diff --git a/cmake/FindLIBXS.cmake b/cmake/FindLIBXS.cmake index 01ca28ec113..258ef444680 100644 --- a/cmake/FindLIBXS.cmake +++ b/cmake/FindLIBXS.cmake @@ -1,8 +1,8 @@ # Locate LIBXS for DBCSR. # -# This module first searches already installed packages through pkg-config and -# standard CMake search paths. When it is used from the DBCSR build tree and no -# local installation is found, it falls back to FetchContent. +# This module first searches a standard CMake package. When it is used from +# the DBCSR build tree and no local installation is found, it falls back to +# FetchContent. # # Result variables: LIBXS_FOUND LIBXS_INCLUDE_DIRS LIBXS_LINK_LIBRARIES # LIBXS_FETCHED @@ -21,55 +21,20 @@ if (NOT DEFINED DBCSR_FETCH_MISSING_DEPS) endif () set(LIBXS_FETCHED FALSE) -set(_dbcsr_libxs_prefix_hints) -if (DEFINED PACKAGE_PREFIX_DIR) - list(APPEND _dbcsr_libxs_prefix_hints "${PACKAGE_PREFIX_DIR}") -endif () -find_package(PkgConfig QUIET) -set(_dbcsr_libxs_pkg_names libxs) -if (DEFINED BUILD_SHARED_LIBS) - if (BUILD_SHARED_LIBS) - list(PREPEND _dbcsr_libxs_pkg_names libxs-shared) - else () - list(PREPEND _dbcsr_libxs_pkg_names libxs-static) - endif () -else () - list(PREPEND _dbcsr_libxs_pkg_names libxs-static libxs-shared) -endif () - -if (PkgConfig_FOUND) - foreach (_dbcsr_libxs_pkg IN LISTS _dbcsr_libxs_pkg_names) - pkg_check_modules(DBCSR_LIBXS QUIET IMPORTED_TARGET GLOBAL - ${_dbcsr_libxs_pkg}) - if (DBCSR_LIBXS_FOUND) - break() - endif () - endforeach () -endif () +find_package(libxs CONFIG QUIET) -if (DBCSR_LIBXS_FOUND) - set(LIBXS_INCLUDE_DIRS ${DBCSR_LIBXS_INCLUDE_DIRS}) - set(LIBXS_LINK_LIBRARIES PkgConfig::DBCSR_LIBXS) - message(STATUS "Using prebuilt LIBXS from pkg-config") -else () - find_path( - LIBXS_INCLUDE_DIRS - NAMES libxs.h - HINTS ${_dbcsr_libxs_prefix_hints} - PATH_SUFFIXES include) - find_library( - LIBXS_LIBRARY - NAMES xs - HINTS ${_dbcsr_libxs_prefix_hints}) - if (LIBXS_INCLUDE_DIRS AND LIBXS_LIBRARY) - set(LIBXS_LINK_LIBRARIES ${LIBXS_LIBRARY}) - message(STATUS "Using prebuilt LIBXS") +if (TARGET libxs::libxs) + set(LIBXS_LINK_LIBRARIES libxs::libxs) + get_target_property(LIBXS_INCLUDE_DIRS libxs::libxs + INTERFACE_INCLUDE_DIRECTORIES) + if (NOT LIBXS_INCLUDE_DIRS OR LIBXS_INCLUDE_DIRS MATCHES "-NOTFOUND") + set(LIBXS_INCLUDE_DIRS "") endif () + message(STATUS "Using LIBXS from CMake package") endif () -if ((NOT LIBXS_INCLUDE_DIRS OR NOT LIBXS_LINK_LIBRARIES) - AND DBCSR_FETCH_MISSING_DEPS) +if (NOT LIBXS_LINK_LIBRARIES AND DBCSR_FETCH_MISSING_DEPS) include(FetchContent) message(STATUS "LIBXS not found locally -- downloading via FetchContent") FetchContent_Declare( @@ -84,19 +49,23 @@ if ((NOT LIBXS_INCLUDE_DIRS OR NOT LIBXS_LINK_LIBRARIES) CACHE BOOL "" FORCE) FetchContent_MakeAvailable(libxs) set(LIBXS_FETCHED TRUE) - set(LIBXS_INCLUDE_DIRS "${libxs_SOURCE_DIR}/include") - set(LIBXS_LINK_LIBRARIES libxs::libxs) + + if (TARGET libxs::libxs) + set(LIBXS_LINK_LIBRARIES libxs::libxs) + get_target_property(LIBXS_INCLUDE_DIRS libxs::libxs + INTERFACE_INCLUDE_DIRECTORIES) + if (NOT LIBXS_INCLUDE_DIRS OR LIBXS_INCLUDE_DIRS MATCHES "-NOTFOUND") + set(LIBXS_INCLUDE_DIRS "${libxs_SOURCE_DIR}/include") + endif () + endif () endif () -find_package_handle_standard_args(LIBXS DEFAULT_MSG LIBXS_INCLUDE_DIRS - LIBXS_LINK_LIBRARIES) +find_package_handle_standard_args(LIBXS DEFAULT_MSG LIBXS_LINK_LIBRARIES) if (LIBXS_FOUND AND NOT TARGET DBCSR::LIBXS) add_library(DBCSR::LIBXS INTERFACE IMPORTED GLOBAL) - target_include_directories(DBCSR::LIBXS INTERFACE "${LIBXS_INCLUDE_DIRS}") + if (LIBXS_INCLUDE_DIRS) + target_include_directories(DBCSR::LIBXS INTERFACE ${LIBXS_INCLUDE_DIRS}) + endif () target_link_libraries(DBCSR::LIBXS INTERFACE ${LIBXS_LINK_LIBRARIES}) endif () - -unset(_dbcsr_libxs_pkg) -unset(_dbcsr_libxs_pkg_names) -unset(_dbcsr_libxs_prefix_hints) diff --git a/cmake/FindLIBXSMM.cmake b/cmake/FindLIBXSMM.cmake index 075c3308634..63fe3bad4da 100644 --- a/cmake/FindLIBXSMM.cmake +++ b/cmake/FindLIBXSMM.cmake @@ -1,13 +1,13 @@ # Locate LIBXSMM for DBCSR. # -# This module first searches already installed packages through pkg-config and -# standard CMake search paths. When it is used from the DBCSR build tree and no -# local installation is found, it falls back to FetchContent. +# This module first searches a standard CMake package. When it is used from +# the DBCSR build tree and no local installation is found, it falls back to +# FetchContent. # # Result variables: LIBXSMM_FOUND LIBXSMM_INCLUDE_DIRS LIBXSMM_LINK_LIBRARIES -# LIBXSMM_COMPILE_DEFINITIONS LIBXSMM_FETCHED DBCSR_USE_LIBXSMM +# LIBXSMM_FETCHED DBCSR_USE_LIBXSMM # -# Imported targets: DBCSR::LIBXSMM xsmm +# Imported target: DBCSR::LIBXSMM include(FindPackageHandleStandardArgs) include("${CMAKE_CURRENT_LIST_DIR}/dependencies.cmake" OPTIONAL) @@ -21,58 +21,21 @@ if (NOT DEFINED DBCSR_FETCH_MISSING_DEPS) endif () set(LIBXSMM_FETCHED FALSE) -set(LIBXSMM_COMPILE_DEFINITIONS "") set(DBCSR_USE_LIBXSMM FALSE) -set(_dbcsr_libxsmm_prefix_hints) -if (DEFINED PACKAGE_PREFIX_DIR) - list(APPEND _dbcsr_libxsmm_prefix_hints "${PACKAGE_PREFIX_DIR}") -endif () -find_package(PkgConfig QUIET) +find_package(libxsmm CONFIG QUIET) -set(_dbcsr_libxsmm_pkg_names libxsmm) -if (DEFINED BUILD_SHARED_LIBS) - if (BUILD_SHARED_LIBS) - list(PREPEND _dbcsr_libxsmm_pkg_names libxsmm-shared) - else () - list(PREPEND _dbcsr_libxsmm_pkg_names libxsmm-static) +if (TARGET libxsmm::libxsmm) + set(LIBXSMM_LINK_LIBRARIES libxsmm::libxsmm) + get_target_property(LIBXSMM_INCLUDE_DIRS libxsmm::libxsmm + INTERFACE_INCLUDE_DIRECTORIES) + if (NOT LIBXSMM_INCLUDE_DIRS OR LIBXSMM_INCLUDE_DIRS MATCHES "-NOTFOUND") + set(LIBXSMM_INCLUDE_DIRS "") endif () -else () - list(PREPEND _dbcsr_libxsmm_pkg_names libxsmm-static libxsmm-shared) -endif () - -if (PkgConfig_FOUND) - foreach (_dbcsr_libxsmm_pkg IN LISTS _dbcsr_libxsmm_pkg_names) - pkg_check_modules(DBCSR_LIBXSMM QUIET IMPORTED_TARGET GLOBAL - ${_dbcsr_libxsmm_pkg}) - if (DBCSR_LIBXSMM_FOUND) - break() - endif () - endforeach () + message(STATUS "Using LIBXSMM from CMake package") endif () -if (DBCSR_LIBXSMM_FOUND) - set(LIBXSMM_INCLUDE_DIRS ${DBCSR_LIBXSMM_INCLUDE_DIRS}) - set(LIBXSMM_LINK_LIBRARIES PkgConfig::DBCSR_LIBXSMM) - message(STATUS "Using prebuilt LIBXSMM from pkg-config") -else () - find_path( - LIBXSMM_INCLUDE_DIRS - NAMES libxsmm.h - HINTS ${_dbcsr_libxsmm_prefix_hints} - PATH_SUFFIXES include) - find_library( - LIBXSMM_LIBRARY - NAMES xsmm - HINTS ${_dbcsr_libxsmm_prefix_hints}) - if (LIBXSMM_INCLUDE_DIRS AND LIBXSMM_LIBRARY) - set(LIBXSMM_LINK_LIBRARIES ${LIBXSMM_LIBRARY}) - message(STATUS "Using prebuilt LIBXSMM") - endif () -endif () - -if ((NOT LIBXSMM_INCLUDE_DIRS OR NOT LIBXSMM_LINK_LIBRARIES) - AND DBCSR_FETCH_MISSING_DEPS) +if (NOT LIBXSMM_LINK_LIBRARIES AND DBCSR_FETCH_MISSING_DEPS) include(FetchContent) message(STATUS "LIBXSMM not found locally -- downloading via FetchContent") FetchContent_Declare( @@ -84,45 +47,28 @@ if ((NOT LIBXSMM_INCLUDE_DIRS OR NOT LIBXSMM_LINK_LIBRARIES) CACHE BOOL "" FORCE) FetchContent_MakeAvailable(libxsmm) set(LIBXSMM_FETCHED TRUE) - set(LIBXSMM_INCLUDE_DIRS "${libxsmm_SOURCE_DIR}/include") - set(LIBXSMM_LINK_LIBRARIES xsmm) - set(LIBXSMM_COMPILE_DEFINITIONS LIBXSMM_DEFAULT_CONFIG) - get_target_property(_xsmm_srcs xsmm SOURCES) - list(FILTER _xsmm_srcs EXCLUDE REGEX "(binaryexport_generator|gemm_driver)") - set_target_properties(xsmm PROPERTIES SOURCES "${_xsmm_srcs}") + + if (TARGET libxsmm::libxsmm) + set(LIBXSMM_LINK_LIBRARIES libxsmm::libxsmm) + get_target_property(LIBXSMM_INCLUDE_DIRS libxsmm::libxsmm + INTERFACE_INCLUDE_DIRECTORIES) + if (NOT LIBXSMM_INCLUDE_DIRS OR LIBXSMM_INCLUDE_DIRS MATCHES "-NOTFOUND") + set(LIBXSMM_INCLUDE_DIRS "${libxsmm_SOURCE_DIR}/include") + endif () + endif () endif () -find_package_handle_standard_args(LIBXSMM DEFAULT_MSG LIBXSMM_INCLUDE_DIRS - LIBXSMM_LINK_LIBRARIES) +find_package_handle_standard_args(LIBXSMM DEFAULT_MSG LIBXSMM_LINK_LIBRARIES) if (LIBXSMM_FOUND) set(DBCSR_USE_LIBXSMM TRUE) if (NOT TARGET DBCSR::LIBXSMM) add_library(DBCSR::LIBXSMM INTERFACE IMPORTED GLOBAL) - target_include_directories(DBCSR::LIBXSMM - INTERFACE "${LIBXSMM_INCLUDE_DIRS}") - target_link_libraries(DBCSR::LIBXSMM INTERFACE ${LIBXSMM_LINK_LIBRARIES}) - if (LIBXSMM_COMPILE_DEFINITIONS) - target_compile_definitions(DBCSR::LIBXSMM - INTERFACE ${LIBXSMM_COMPILE_DEFINITIONS}) - endif () - endif () - - if (NOT TARGET xsmm) - if (DBCSR_LIBXSMM_FOUND) - add_library(xsmm INTERFACE IMPORTED GLOBAL) - target_link_libraries(xsmm INTERFACE PkgConfig::DBCSR_LIBXSMM) - else () - add_library(xsmm UNKNOWN IMPORTED GLOBAL) - set_target_properties( - xsmm PROPERTIES IMPORTED_LOCATION "${LIBXSMM_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${LIBXSMM_INCLUDE_DIRS}") + if (LIBXSMM_INCLUDE_DIRS) + target_include_directories(DBCSR::LIBXSMM + INTERFACE ${LIBXSMM_INCLUDE_DIRS}) endif () + target_link_libraries(DBCSR::LIBXSMM INTERFACE ${LIBXSMM_LINK_LIBRARIES}) endif () endif () - -unset(_dbcsr_libxsmm_pkg) -unset(_dbcsr_libxsmm_pkg_names) -unset(_dbcsr_libxsmm_prefix_hints) -unset(_xsmm_srcs) diff --git a/cmake/FindLIBXSTREAM.cmake b/cmake/FindLIBXSTREAM.cmake index 7a25de600d9..6b6917e5b53 100644 --- a/cmake/FindLIBXSTREAM.cmake +++ b/cmake/FindLIBXSTREAM.cmake @@ -1,10 +1,10 @@ # Locate LIBXSTREAM for DBCSR's OpenCL backend. # -# A usable LIBXSTREAM dependency must provide the library/header as well as the -# OpenCL helper script and the SMM sample sources used by DBCSR. This module -# first searches already installed packages through pkg-config and standard -# CMake search paths. When it is used from the DBCSR build tree and no complete -# local installation is found, it falls back to FetchContent. +# A usable LIBXSTREAM dependency must provide the CMake package target as well +# as the OpenCL helper script and the SMM sample sources used by DBCSR. This +# module first searches a standard CMake package. When it is used from the +# DBCSR build tree and no local installation is found, it falls back to +# FetchContent. # # Result variables: LIBXSTREAM_FOUND LIBXSTREAM_INCLUDE_DIRS # LIBXSTREAM_LINK_LIBRARIES LIBXSTREAM_OPENCL_SCRIPT LIBXSTREAM_SMM_DIR @@ -24,64 +24,40 @@ if (NOT DEFINED DBCSR_FETCH_MISSING_DEPS) endif () set(LIBXSTREAM_FETCHED FALSE) - set(_dbcsr_libxstream_prefix_hints) if (DEFINED PACKAGE_PREFIX_DIR) list(APPEND _dbcsr_libxstream_prefix_hints "${PACKAGE_PREFIX_DIR}") endif () -find_package(PkgConfig QUIET) - -set(_dbcsr_libxstream_pkg_names libxstream) -if (DEFINED BUILD_SHARED_LIBS) - if (BUILD_SHARED_LIBS) - list(PREPEND _dbcsr_libxstream_pkg_names libxstream-shared) - else () - list(PREPEND _dbcsr_libxstream_pkg_names libxstream-static) - endif () -else () - list(PREPEND _dbcsr_libxstream_pkg_names libxstream-static libxstream-shared) -endif () -if (PkgConfig_FOUND) - foreach (_dbcsr_libxstream_pkg IN LISTS _dbcsr_libxstream_pkg_names) - pkg_check_modules(DBCSR_LIBXSTREAM QUIET IMPORTED_TARGET GLOBAL - ${_dbcsr_libxstream_pkg}) - if (DBCSR_LIBXSTREAM_FOUND) - break() - endif () - endforeach () -endif () +find_package(libxstream CONFIG QUIET) -if (DBCSR_LIBXSTREAM_FOUND) - set(LIBXSTREAM_INCLUDE_DIRS ${DBCSR_LIBXSTREAM_INCLUDE_DIRS}) - set(LIBXSTREAM_LINK_LIBRARIES PkgConfig::DBCSR_LIBXSTREAM) - if (DBCSR_LIBXSTREAM_PREFIX) - list(APPEND _dbcsr_libxstream_prefix_hints "${DBCSR_LIBXSTREAM_PREFIX}") - endif () - message(STATUS "Using prebuilt LIBXSTREAM from pkg-config") -else () - find_path( - LIBXSTREAM_INCLUDE_DIRS - NAMES libxstream.h - HINTS ${_dbcsr_libxstream_prefix_hints} - PATH_SUFFIXES include) - find_library( - LIBXSTREAM_LIBRARY - NAMES xstream - HINTS ${_dbcsr_libxstream_prefix_hints}) - if (LIBXSTREAM_INCLUDE_DIRS AND LIBXSTREAM_LIBRARY) - set(LIBXSTREAM_LINK_LIBRARIES ${LIBXSTREAM_LIBRARY}) - message(STATUS "Using prebuilt LIBXSTREAM") +if (TARGET libxstream::libxstream) + set(LIBXSTREAM_LINK_LIBRARIES libxstream::libxstream) + get_target_property(LIBXSTREAM_INCLUDE_DIRS libxstream::libxstream + INTERFACE_INCLUDE_DIRECTORIES) + if (NOT LIBXSTREAM_INCLUDE_DIRS OR LIBXSTREAM_INCLUDE_DIRS MATCHES "-NOTFOUND") + set(LIBXSTREAM_INCLUDE_DIRS "") endif () + message(STATUS "Using LIBXSTREAM from CMake package") endif () foreach (_dbcsr_libxstream_include_dir IN LISTS LIBXSTREAM_INCLUDE_DIRS) - get_filename_component(_dbcsr_libxstream_prefix - "${_dbcsr_libxstream_include_dir}/.." ABSOLUTE) - list(APPEND _dbcsr_libxstream_prefix_hints "${_dbcsr_libxstream_prefix}") + if (IS_ABSOLUTE "${_dbcsr_libxstream_include_dir}") + get_filename_component(_dbcsr_libxstream_prefix + "${_dbcsr_libxstream_include_dir}/.." ABSOLUTE) + list(APPEND _dbcsr_libxstream_prefix_hints + "${_dbcsr_libxstream_prefix}") + + if (_dbcsr_libxstream_prefix MATCHES "/include$") + get_filename_component(_dbcsr_libxstream_prefix + "${_dbcsr_libxstream_prefix}/.." ABSOLUTE) + list(APPEND _dbcsr_libxstream_prefix_hints + "${_dbcsr_libxstream_prefix}") + endif () + endif () endforeach () -if (LIBXSTREAM_INCLUDE_DIRS AND LIBXSTREAM_LINK_LIBRARIES) +if (LIBXSTREAM_LINK_LIBRARIES) find_program( LIBXSTREAM_OPENCL_SCRIPT NAMES tool_opencl.sh @@ -94,22 +70,17 @@ if (LIBXSTREAM_INCLUDE_DIRS AND LIBXSTREAM_LINK_LIBRARIES) PATH_SUFFIXES samples/smm share/libxstream/samples/smm) endif () -if ((NOT LIBXSTREAM_INCLUDE_DIRS - OR NOT LIBXSTREAM_LINK_LIBRARIES - OR NOT LIBXSTREAM_OPENCL_SCRIPT - OR NOT LIBXSTREAM_SMM_DIR - ) - AND DBCSR_FETCH_MISSING_DEPS) +if (LIBXSTREAM_LINK_LIBRARIES + AND (NOT LIBXSTREAM_OPENCL_SCRIPT OR NOT LIBXSTREAM_SMM_DIR)) + message( + FATAL_ERROR + "LIBXSTREAM CMake package was found, but its OpenCL helper script or SMM samples were not found" + ) +endif () + +if (NOT LIBXSTREAM_LINK_LIBRARIES AND DBCSR_FETCH_MISSING_DEPS) include(FetchContent) - if (LIBXSTREAM_INCLUDE_DIRS AND LIBXSTREAM_LINK_LIBRARIES) - message( - STATUS - "Prebuilt LIBXSTREAM was found, but its OpenCL helper script or SMM samples were not found -- downloading via FetchContent" - ) - else () - message( - STATUS "LIBXSTREAM not found locally -- downloading via FetchContent") - endif () + message(STATUS "LIBXSTREAM not found locally -- downloading via FetchContent") FetchContent_Declare( libxstream GIT_REPOSITORY ${LIBXSTREAM_GIT_REPOSITORY} @@ -119,27 +90,35 @@ if ((NOT LIBXSTREAM_INCLUDE_DIRS CACHE BOOL "" FORCE) FetchContent_MakeAvailable(libxstream) set(LIBXSTREAM_FETCHED TRUE) - set(LIBXSTREAM_INCLUDE_DIRS "${libxstream_SOURCE_DIR}/include") - set(LIBXSTREAM_LINK_LIBRARIES libxstream::libxstream) - set(LIBXSTREAM_OPENCL_SCRIPT - "${libxstream_SOURCE_DIR}/scripts/tool_opencl.sh") - set(LIBXSTREAM_SMM_DIR "${libxstream_SOURCE_DIR}/samples/smm") + + if (TARGET libxstream::libxstream) + set(LIBXSTREAM_LINK_LIBRARIES libxstream::libxstream) + get_target_property(LIBXSTREAM_INCLUDE_DIRS libxstream::libxstream + INTERFACE_INCLUDE_DIRECTORIES) + if (NOT LIBXSTREAM_INCLUDE_DIRS + OR LIBXSTREAM_INCLUDE_DIRS MATCHES "-NOTFOUND") + set(LIBXSTREAM_INCLUDE_DIRS "${libxstream_SOURCE_DIR}/include") + endif () + set(LIBXSTREAM_OPENCL_SCRIPT + "${libxstream_SOURCE_DIR}/scripts/tool_opencl.sh") + set(LIBXSTREAM_SMM_DIR "${libxstream_SOURCE_DIR}/samples/smm") + endif () endif () find_package_handle_standard_args( - LIBXSTREAM DEFAULT_MSG LIBXSTREAM_INCLUDE_DIRS LIBXSTREAM_LINK_LIBRARIES - LIBXSTREAM_OPENCL_SCRIPT LIBXSTREAM_SMM_DIR) + LIBXSTREAM DEFAULT_MSG LIBXSTREAM_LINK_LIBRARIES LIBXSTREAM_OPENCL_SCRIPT + LIBXSTREAM_SMM_DIR) if (LIBXSTREAM_FOUND AND NOT TARGET DBCSR::LIBXSTREAM) add_library(DBCSR::LIBXSTREAM INTERFACE IMPORTED GLOBAL) - target_include_directories(DBCSR::LIBXSTREAM - INTERFACE "${LIBXSTREAM_INCLUDE_DIRS}") + if (LIBXSTREAM_INCLUDE_DIRS) + target_include_directories(DBCSR::LIBXSTREAM + INTERFACE ${LIBXSTREAM_INCLUDE_DIRS}) + endif () target_link_libraries(DBCSR::LIBXSTREAM INTERFACE ${LIBXSTREAM_LINK_LIBRARIES}) endif () -unset(_dbcsr_libxstream_pkg) -unset(_dbcsr_libxstream_pkg_names) unset(_dbcsr_libxstream_prefix_hints) unset(_dbcsr_libxstream_prefix) unset(_dbcsr_libxstream_include_dir) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 3d492153084..fbb0d2ed4c5 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -1,7 +1,16 @@ -set(LIBXS_GIT_REPOSITORY "https://github.com/hfp/libxs.git") -set(LIBXS_GIT_TAG "ab416130f8c9f7edb8c1bf3d3abaf402f61d0fe0") +# set(LIBXS_GIT_REPOSITORY "https://github.com/hfp/libxs.git") +# set(LIBXS_GIT_TAG "ab416130f8c9f7edb8c1bf3d3abaf402f61d0fe0") -set(LIBXSTREAM_GIT_REPOSITORY "https://github.com/hfp/libxstream.git") -set(LIBXSTREAM_GIT_TAG "8015f5461e5d1fee08024ddf20b38ea4400fbc24") +# set(LIBXSTREAM_GIT_REPOSITORY "https://github.com/hfp/libxstream.git") +# set(LIBXSTREAM_GIT_TAG "8015f5461e5d1fee08024ddf20b38ea4400fbc24") -set(LIBXSMM_GIT_TAG "0cea22fdc34ec54bc59ffb47a43cb3e28b26d3e0") +# set(LIBXSMM_GIT_TAG "0cea22fdc34ec54bc59ffb47a43cb3e28b26d3e0") + +set(LIBXS_GIT_REPOSITORY "https://github.com/Growl1234/libxs.git") +set(LIBXS_GIT_TAG "f54b9cf0261b9c63be56e452526b64b861533d41") + +set(LIBXSTREAM_GIT_REPOSITORY "https://github.com/Growl1234/libxstream.git") +set(LIBXSTREAM_GIT_TAG "761001e70698870cb9b0e380283d1945bb11301d") + +set(LIBXSMM_GIT_REPOSITORY "https://github.com/Growl1234/libxsmm.git") +set(LIBXSMM_GIT_TAG "4c2afa3c7745d15caa792334a3ed5a1995f249e6") From a63941763a6651fcefd6b854b19a699d4872f303 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 09:10:27 +0000 Subject: [PATCH 15/46] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- cmake/FindLIBXS.cmake | 4 ++-- cmake/FindLIBXSMM.cmake | 6 +++--- cmake/FindLIBXSTREAM.cmake | 17 ++++++++--------- cmake/dependencies.cmake | 4 ++-- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/cmake/FindLIBXS.cmake b/cmake/FindLIBXS.cmake index 258ef444680..cddeb3f148d 100644 --- a/cmake/FindLIBXS.cmake +++ b/cmake/FindLIBXS.cmake @@ -1,7 +1,7 @@ # Locate LIBXS for DBCSR. # -# This module first searches a standard CMake package. When it is used from -# the DBCSR build tree and no local installation is found, it falls back to +# This module first searches a standard CMake package. When it is used from the +# DBCSR build tree and no local installation is found, it falls back to # FetchContent. # # Result variables: LIBXS_FOUND LIBXS_INCLUDE_DIRS LIBXS_LINK_LIBRARIES diff --git a/cmake/FindLIBXSMM.cmake b/cmake/FindLIBXSMM.cmake index 63fe3bad4da..6b39db53b62 100644 --- a/cmake/FindLIBXSMM.cmake +++ b/cmake/FindLIBXSMM.cmake @@ -1,7 +1,7 @@ # Locate LIBXSMM for DBCSR. # -# This module first searches a standard CMake package. When it is used from -# the DBCSR build tree and no local installation is found, it falls back to +# This module first searches a standard CMake package. When it is used from the +# DBCSR build tree and no local installation is found, it falls back to # FetchContent. # # Result variables: LIBXSMM_FOUND LIBXSMM_INCLUDE_DIRS LIBXSMM_LINK_LIBRARIES @@ -40,7 +40,7 @@ if (NOT LIBXSMM_LINK_LIBRARIES AND DBCSR_FETCH_MISSING_DEPS) message(STATUS "LIBXSMM not found locally -- downloading via FetchContent") FetchContent_Declare( libxsmm - GIT_REPOSITORY "https://github.com/libxsmm/libxsmm.git" + GIT_REPOSITORY ${LIBXSMM_GIT_REPOSITORY} GIT_TAG ${LIBXSMM_GIT_TAG}) set(XSMM_STATIC ON diff --git a/cmake/FindLIBXSTREAM.cmake b/cmake/FindLIBXSTREAM.cmake index 6b6917e5b53..c7bdc869afa 100644 --- a/cmake/FindLIBXSTREAM.cmake +++ b/cmake/FindLIBXSTREAM.cmake @@ -35,7 +35,8 @@ if (TARGET libxstream::libxstream) set(LIBXSTREAM_LINK_LIBRARIES libxstream::libxstream) get_target_property(LIBXSTREAM_INCLUDE_DIRS libxstream::libxstream INTERFACE_INCLUDE_DIRECTORIES) - if (NOT LIBXSTREAM_INCLUDE_DIRS OR LIBXSTREAM_INCLUDE_DIRS MATCHES "-NOTFOUND") + if (NOT LIBXSTREAM_INCLUDE_DIRS OR LIBXSTREAM_INCLUDE_DIRS MATCHES + "-NOTFOUND") set(LIBXSTREAM_INCLUDE_DIRS "") endif () message(STATUS "Using LIBXSTREAM from CMake package") @@ -45,14 +46,12 @@ foreach (_dbcsr_libxstream_include_dir IN LISTS LIBXSTREAM_INCLUDE_DIRS) if (IS_ABSOLUTE "${_dbcsr_libxstream_include_dir}") get_filename_component(_dbcsr_libxstream_prefix "${_dbcsr_libxstream_include_dir}/.." ABSOLUTE) - list(APPEND _dbcsr_libxstream_prefix_hints - "${_dbcsr_libxstream_prefix}") + list(APPEND _dbcsr_libxstream_prefix_hints "${_dbcsr_libxstream_prefix}") if (_dbcsr_libxstream_prefix MATCHES "/include$") get_filename_component(_dbcsr_libxstream_prefix "${_dbcsr_libxstream_prefix}/.." ABSOLUTE) - list(APPEND _dbcsr_libxstream_prefix_hints - "${_dbcsr_libxstream_prefix}") + list(APPEND _dbcsr_libxstream_prefix_hints "${_dbcsr_libxstream_prefix}") endif () endif () endforeach () @@ -70,8 +69,8 @@ if (LIBXSTREAM_LINK_LIBRARIES) PATH_SUFFIXES samples/smm share/libxstream/samples/smm) endif () -if (LIBXSTREAM_LINK_LIBRARIES - AND (NOT LIBXSTREAM_OPENCL_SCRIPT OR NOT LIBXSTREAM_SMM_DIR)) +if (LIBXSTREAM_LINK_LIBRARIES AND (NOT LIBXSTREAM_OPENCL_SCRIPT + OR NOT LIBXSTREAM_SMM_DIR)) message( FATAL_ERROR "LIBXSTREAM CMake package was found, but its OpenCL helper script or SMM samples were not found" @@ -95,8 +94,8 @@ if (NOT LIBXSTREAM_LINK_LIBRARIES AND DBCSR_FETCH_MISSING_DEPS) set(LIBXSTREAM_LINK_LIBRARIES libxstream::libxstream) get_target_property(LIBXSTREAM_INCLUDE_DIRS libxstream::libxstream INTERFACE_INCLUDE_DIRECTORIES) - if (NOT LIBXSTREAM_INCLUDE_DIRS - OR LIBXSTREAM_INCLUDE_DIRS MATCHES "-NOTFOUND") + if (NOT LIBXSTREAM_INCLUDE_DIRS OR LIBXSTREAM_INCLUDE_DIRS MATCHES + "-NOTFOUND") set(LIBXSTREAM_INCLUDE_DIRS "${libxstream_SOURCE_DIR}/include") endif () set(LIBXSTREAM_OPENCL_SCRIPT diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index fbb0d2ed4c5..0eae92aae58 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -1,5 +1,5 @@ -# set(LIBXS_GIT_REPOSITORY "https://github.com/hfp/libxs.git") -# set(LIBXS_GIT_TAG "ab416130f8c9f7edb8c1bf3d3abaf402f61d0fe0") +# set(LIBXS_GIT_REPOSITORY "https://github.com/hfp/libxs.git") set(LIBXS_GIT_TAG +# "ab416130f8c9f7edb8c1bf3d3abaf402f61d0fe0") # set(LIBXSTREAM_GIT_REPOSITORY "https://github.com/hfp/libxstream.git") # set(LIBXSTREAM_GIT_TAG "8015f5461e5d1fee08024ddf20b38ea4400fbc24") From bdc7c25b5cef73c714d794ad482114dd9f852dc5 Mon Sep 17 00:00:00 2001 From: Growl Date: Mon, 8 Jun 2026 18:16:17 +0800 Subject: [PATCH 16/46] Update dependency --- cmake/dependencies.cmake | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake index 0eae92aae58..fdff8287616 100644 --- a/cmake/dependencies.cmake +++ b/cmake/dependencies.cmake @@ -6,11 +6,11 @@ # set(LIBXSMM_GIT_TAG "0cea22fdc34ec54bc59ffb47a43cb3e28b26d3e0") -set(LIBXS_GIT_REPOSITORY "https://github.com/Growl1234/libxs.git") -set(LIBXS_GIT_TAG "f54b9cf0261b9c63be56e452526b64b861533d41") +set(LIBXS_GIT_REPOSITORY "https://github.com/hfp/libxs.git") +set(LIBXS_GIT_TAG "11348a69c6b8622f9192ec725b291f42384a5ce7") -set(LIBXSTREAM_GIT_REPOSITORY "https://github.com/Growl1234/libxstream.git") -set(LIBXSTREAM_GIT_TAG "761001e70698870cb9b0e380283d1945bb11301d") +set(LIBXSTREAM_GIT_REPOSITORY "https://github.com/hfp/libxstream.git") +set(LIBXSTREAM_GIT_TAG "8375c018d0619bfd9261f67b9ed8b609d8e4ff66") set(LIBXSMM_GIT_REPOSITORY "https://github.com/Growl1234/libxsmm.git") -set(LIBXSMM_GIT_TAG "4c2afa3c7745d15caa792334a3ed5a1995f249e6") +set(LIBXSMM_GIT_TAG "47548ddea6e5b63c3602b51100660c14c8b2d54c") From 7f4d1ff6fa184bf799acec00d1a53c3046ce1d84 Mon Sep 17 00:00:00 2001 From: Growl Date: Mon, 8 Jun 2026 20:50:32 +0800 Subject: [PATCH 17/46] Remove FindLIBXS*.cmake and adjust workflow --- .github/workflows/testing-linux.yml | 86 +++++++++++++++++++ CMakeLists.txt | 12 ++- cmake/FindLIBXS.cmake | 71 ---------------- cmake/FindLIBXSMM.cmake | 74 ----------------- cmake/FindLIBXSTREAM.cmake | 123 ---------------------------- cmake/dependencies.cmake | 16 ---- 6 files changed, 95 insertions(+), 287 deletions(-) delete mode 100644 cmake/FindLIBXS.cmake delete mode 100644 cmake/FindLIBXSMM.cmake delete mode 100644 cmake/FindLIBXSTREAM.cmake delete mode 100644 cmake/dependencies.cmake diff --git a/.github/workflows/testing-linux.yml b/.github/workflows/testing-linux.yml index 77046390cf3..c2a48d21f06 100644 --- a/.github/workflows/testing-linux.yml +++ b/.github/workflows/testing-linux.yml @@ -6,6 +6,14 @@ on: - 'develop' pull_request: +env: + LIBXS_GIT_REPOSITORY: https://github.com/hfp/libxs.git + LIBXS_GIT_TAG: 11348a69c6b8622f9192ec725b291f42384a5ce7 + LIBXSTREAM_GIT_REPOSITORY: https://github.com/hfp/libxstream.git + LIBXSTREAM_GIT_TAG: 8375c018d0619bfd9261f67b9ed8b609d8e4ff66 + LIBXSMM_GIT_REPOSITORY: https://github.com/Growl1234/libxsmm.git + LIBXSMM_GIT_TAG: 47548ddea6e5b63c3602b51100660c14c8b2d54c + jobs: ################################################################################## # Run pre-commit @@ -45,6 +53,45 @@ jobs: fetch-depth: 0 submodules: true + - name: Install libxs packages + if: matrix.smm_backend != 'BLAS' + run: | + set -eu + prefix="${GITHUB_WORKSPACE}/deps/install" + mkdir -p "${prefix}" deps + + fetch_and_install() { + name="$1" + repo="$2" + tag="$3" + shift 3 + git clone "${repo}" "deps/${name}-src" + git -C "deps/${name}-src" checkout "${tag}" + cmake -G Ninja \ + -S "deps/${name}-src" \ + -B "deps/${name}-build" \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX="${prefix}" \ + -DCMAKE_PREFIX_PATH="${prefix}" \ + "$@" + cmake --build "deps/${name}-build" --target install + } + + fetch_and_install libxs \ + "${LIBXS_GIT_REPOSITORY}" \ + "${LIBXS_GIT_TAG}" \ + -DLIBXS_FORTRAN=ON + + if [ "${{ matrix.smm_backend }}" = "LIBXSMM" ]; then + fetch_and_install libxsmm \ + "${LIBXSMM_GIT_REPOSITORY}" \ + "${LIBXSMM_GIT_TAG}" \ + -DXSMM_STATIC=ON + fi + + echo "CMAKE_PREFIX_PATH=${prefix}${CMAKE_PREFIX_PATH:+:${CMAKE_PREFIX_PATH}}" >> "${GITHUB_ENV}" + echo "PKG_CONFIG_PATH=${prefix}/lib/pkgconfig${PKG_CONFIG_PATH:+:${PKG_CONFIG_PATH}}" >> "${GITHUB_ENV}" + - name: Configure run: | mkdir -p build @@ -156,6 +203,45 @@ jobs: fetch-depth: 0 submodules: true + - name: Install libxs packages + run: | + set -eu + prefix="${GITHUB_WORKSPACE}/deps/install" + mkdir -p "${prefix}" deps + + fetch_and_install() { + name="$1" + repo="$2" + tag="$3" + shift 3 + git clone "${repo}" "deps/${name}-src" + git -C "deps/${name}-src" checkout "${tag}" + cmake -G Ninja \ + -S "deps/${name}-src" \ + -B "deps/${name}-build" \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX="${prefix}" \ + -DCMAKE_PREFIX_PATH="${prefix}" \ + "$@" + cmake --build "deps/${name}-build" --target install + } + + fetch_and_install libxs \ + "${LIBXS_GIT_REPOSITORY}" \ + "${LIBXS_GIT_TAG}" \ + -DLIBXS_FORTRAN=ON + fetch_and_install libxsmm \ + "${LIBXSMM_GIT_REPOSITORY}" \ + "${LIBXSMM_GIT_TAG}" \ + -DXSMM_STATIC=ON + fetch_and_install libxstream \ + "${LIBXSTREAM_GIT_REPOSITORY}" \ + "${LIBXSTREAM_GIT_TAG}" \ + -DLIBXSTREAM_SHARED=OFF + + echo "CMAKE_PREFIX_PATH=${prefix}${CMAKE_PREFIX_PATH:+:${CMAKE_PREFIX_PATH}}" >> "${GITHUB_ENV}" + echo "PKG_CONFIG_PATH=${prefix}/lib/pkgconfig${PKG_CONFIG_PATH:+:${PKG_CONFIG_PATH}}" >> "${GITHUB_ENV}" + - name: Configure run: | mkdir -p build diff --git a/CMakeLists.txt b/CMakeLists.txt index 612b8d9556f..853cd69da0e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -157,9 +157,13 @@ set(LIBXSMM_COMPILE_DEFINITIONS "") set(LIBXSMM_FETCHED FALSE) if (USE_LIBXS) - find_package(LIBXS REQUIRED) + find_package(libxs REQUIRED) + add_library(DBCSR::LIBXS INTERFACE IMPORTED) + target_link_libraries(DBCSR::LIBXS INTERFACE libxs::libxs) if (USE_LIBXSMM) - find_package(LIBXSMM REQUIRED) + find_package(libxsmm REQUIRED) + add_library(DBCSR::LIBXSMM INTERFACE IMPORTED) + target_link_libraries(DBCSR::LIBXSMM INTERFACE libxsmm::libxsmm) endif () elseif (USE_LIBXSMM) message(WARNING "USE_LIBXSMM=ON requires USE_LIBXS=ON; ignoring USE_LIBXSMM.") @@ -242,7 +246,9 @@ if (USE_ACCEL MATCHES "opencl") endif () find_package(OpenCL REQUIRED) - find_package(LIBXSTREAM REQUIRED) + find_package(libxstream REQUIRED) + add_library(DBCSR::LIBXSTREAM INTERFACE IMPORTED) + target_link_libraries(DBCSR::LIBXSTREAM INTERFACE libxstream::libxstream) message(STATUS "Using LIBXSTREAM") set(DBCSR_OPENCL_SCRIPT "${LIBXSTREAM_OPENCL_SCRIPT}") diff --git a/cmake/FindLIBXS.cmake b/cmake/FindLIBXS.cmake deleted file mode 100644 index cddeb3f148d..00000000000 --- a/cmake/FindLIBXS.cmake +++ /dev/null @@ -1,71 +0,0 @@ -# Locate LIBXS for DBCSR. -# -# This module first searches a standard CMake package. When it is used from the -# DBCSR build tree and no local installation is found, it falls back to -# FetchContent. -# -# Result variables: LIBXS_FOUND LIBXS_INCLUDE_DIRS LIBXS_LINK_LIBRARIES -# LIBXS_FETCHED -# -# Imported target: DBCSR::LIBXS - -include(FindPackageHandleStandardArgs) -include("${CMAKE_CURRENT_LIST_DIR}/dependencies.cmake" OPTIONAL) - -if (NOT DEFINED DBCSR_FETCH_MISSING_DEPS) - if (PROJECT_NAME STREQUAL "dbcsr") - set(DBCSR_FETCH_MISSING_DEPS ON) - else () - set(DBCSR_FETCH_MISSING_DEPS OFF) - endif () -endif () - -set(LIBXS_FETCHED FALSE) - -find_package(libxs CONFIG QUIET) - -if (TARGET libxs::libxs) - set(LIBXS_LINK_LIBRARIES libxs::libxs) - get_target_property(LIBXS_INCLUDE_DIRS libxs::libxs - INTERFACE_INCLUDE_DIRECTORIES) - if (NOT LIBXS_INCLUDE_DIRS OR LIBXS_INCLUDE_DIRS MATCHES "-NOTFOUND") - set(LIBXS_INCLUDE_DIRS "") - endif () - message(STATUS "Using LIBXS from CMake package") -endif () - -if (NOT LIBXS_LINK_LIBRARIES AND DBCSR_FETCH_MISSING_DEPS) - include(FetchContent) - message(STATUS "LIBXS not found locally -- downloading via FetchContent") - FetchContent_Declare( - libxs - GIT_REPOSITORY ${LIBXS_GIT_REPOSITORY} - GIT_TAG ${LIBXS_GIT_TAG}) - set(LIBXS_FORTRAN - ON - CACHE BOOL "" FORCE) - set(LIBXS_SHARED - ${BUILD_SHARED_LIBS} - CACHE BOOL "" FORCE) - FetchContent_MakeAvailable(libxs) - set(LIBXS_FETCHED TRUE) - - if (TARGET libxs::libxs) - set(LIBXS_LINK_LIBRARIES libxs::libxs) - get_target_property(LIBXS_INCLUDE_DIRS libxs::libxs - INTERFACE_INCLUDE_DIRECTORIES) - if (NOT LIBXS_INCLUDE_DIRS OR LIBXS_INCLUDE_DIRS MATCHES "-NOTFOUND") - set(LIBXS_INCLUDE_DIRS "${libxs_SOURCE_DIR}/include") - endif () - endif () -endif () - -find_package_handle_standard_args(LIBXS DEFAULT_MSG LIBXS_LINK_LIBRARIES) - -if (LIBXS_FOUND AND NOT TARGET DBCSR::LIBXS) - add_library(DBCSR::LIBXS INTERFACE IMPORTED GLOBAL) - if (LIBXS_INCLUDE_DIRS) - target_include_directories(DBCSR::LIBXS INTERFACE ${LIBXS_INCLUDE_DIRS}) - endif () - target_link_libraries(DBCSR::LIBXS INTERFACE ${LIBXS_LINK_LIBRARIES}) -endif () diff --git a/cmake/FindLIBXSMM.cmake b/cmake/FindLIBXSMM.cmake deleted file mode 100644 index 6b39db53b62..00000000000 --- a/cmake/FindLIBXSMM.cmake +++ /dev/null @@ -1,74 +0,0 @@ -# Locate LIBXSMM for DBCSR. -# -# This module first searches a standard CMake package. When it is used from the -# DBCSR build tree and no local installation is found, it falls back to -# FetchContent. -# -# Result variables: LIBXSMM_FOUND LIBXSMM_INCLUDE_DIRS LIBXSMM_LINK_LIBRARIES -# LIBXSMM_FETCHED DBCSR_USE_LIBXSMM -# -# Imported target: DBCSR::LIBXSMM - -include(FindPackageHandleStandardArgs) -include("${CMAKE_CURRENT_LIST_DIR}/dependencies.cmake" OPTIONAL) - -if (NOT DEFINED DBCSR_FETCH_MISSING_DEPS) - if (PROJECT_NAME STREQUAL "dbcsr") - set(DBCSR_FETCH_MISSING_DEPS ON) - else () - set(DBCSR_FETCH_MISSING_DEPS OFF) - endif () -endif () - -set(LIBXSMM_FETCHED FALSE) -set(DBCSR_USE_LIBXSMM FALSE) - -find_package(libxsmm CONFIG QUIET) - -if (TARGET libxsmm::libxsmm) - set(LIBXSMM_LINK_LIBRARIES libxsmm::libxsmm) - get_target_property(LIBXSMM_INCLUDE_DIRS libxsmm::libxsmm - INTERFACE_INCLUDE_DIRECTORIES) - if (NOT LIBXSMM_INCLUDE_DIRS OR LIBXSMM_INCLUDE_DIRS MATCHES "-NOTFOUND") - set(LIBXSMM_INCLUDE_DIRS "") - endif () - message(STATUS "Using LIBXSMM from CMake package") -endif () - -if (NOT LIBXSMM_LINK_LIBRARIES AND DBCSR_FETCH_MISSING_DEPS) - include(FetchContent) - message(STATUS "LIBXSMM not found locally -- downloading via FetchContent") - FetchContent_Declare( - libxsmm - GIT_REPOSITORY ${LIBXSMM_GIT_REPOSITORY} - GIT_TAG ${LIBXSMM_GIT_TAG}) - set(XSMM_STATIC - ON - CACHE BOOL "" FORCE) - FetchContent_MakeAvailable(libxsmm) - set(LIBXSMM_FETCHED TRUE) - - if (TARGET libxsmm::libxsmm) - set(LIBXSMM_LINK_LIBRARIES libxsmm::libxsmm) - get_target_property(LIBXSMM_INCLUDE_DIRS libxsmm::libxsmm - INTERFACE_INCLUDE_DIRECTORIES) - if (NOT LIBXSMM_INCLUDE_DIRS OR LIBXSMM_INCLUDE_DIRS MATCHES "-NOTFOUND") - set(LIBXSMM_INCLUDE_DIRS "${libxsmm_SOURCE_DIR}/include") - endif () - endif () -endif () - -find_package_handle_standard_args(LIBXSMM DEFAULT_MSG LIBXSMM_LINK_LIBRARIES) - -if (LIBXSMM_FOUND) - set(DBCSR_USE_LIBXSMM TRUE) - - if (NOT TARGET DBCSR::LIBXSMM) - add_library(DBCSR::LIBXSMM INTERFACE IMPORTED GLOBAL) - if (LIBXSMM_INCLUDE_DIRS) - target_include_directories(DBCSR::LIBXSMM - INTERFACE ${LIBXSMM_INCLUDE_DIRS}) - endif () - target_link_libraries(DBCSR::LIBXSMM INTERFACE ${LIBXSMM_LINK_LIBRARIES}) - endif () -endif () diff --git a/cmake/FindLIBXSTREAM.cmake b/cmake/FindLIBXSTREAM.cmake deleted file mode 100644 index c7bdc869afa..00000000000 --- a/cmake/FindLIBXSTREAM.cmake +++ /dev/null @@ -1,123 +0,0 @@ -# Locate LIBXSTREAM for DBCSR's OpenCL backend. -# -# A usable LIBXSTREAM dependency must provide the CMake package target as well -# as the OpenCL helper script and the SMM sample sources used by DBCSR. This -# module first searches a standard CMake package. When it is used from the -# DBCSR build tree and no local installation is found, it falls back to -# FetchContent. -# -# Result variables: LIBXSTREAM_FOUND LIBXSTREAM_INCLUDE_DIRS -# LIBXSTREAM_LINK_LIBRARIES LIBXSTREAM_OPENCL_SCRIPT LIBXSTREAM_SMM_DIR -# LIBXSTREAM_FETCHED -# -# Imported target: DBCSR::LIBXSTREAM - -include(FindPackageHandleStandardArgs) -include("${CMAKE_CURRENT_LIST_DIR}/dependencies.cmake" OPTIONAL) - -if (NOT DEFINED DBCSR_FETCH_MISSING_DEPS) - if (PROJECT_NAME STREQUAL "dbcsr") - set(DBCSR_FETCH_MISSING_DEPS ON) - else () - set(DBCSR_FETCH_MISSING_DEPS OFF) - endif () -endif () - -set(LIBXSTREAM_FETCHED FALSE) -set(_dbcsr_libxstream_prefix_hints) -if (DEFINED PACKAGE_PREFIX_DIR) - list(APPEND _dbcsr_libxstream_prefix_hints "${PACKAGE_PREFIX_DIR}") -endif () - -find_package(libxstream CONFIG QUIET) - -if (TARGET libxstream::libxstream) - set(LIBXSTREAM_LINK_LIBRARIES libxstream::libxstream) - get_target_property(LIBXSTREAM_INCLUDE_DIRS libxstream::libxstream - INTERFACE_INCLUDE_DIRECTORIES) - if (NOT LIBXSTREAM_INCLUDE_DIRS OR LIBXSTREAM_INCLUDE_DIRS MATCHES - "-NOTFOUND") - set(LIBXSTREAM_INCLUDE_DIRS "") - endif () - message(STATUS "Using LIBXSTREAM from CMake package") -endif () - -foreach (_dbcsr_libxstream_include_dir IN LISTS LIBXSTREAM_INCLUDE_DIRS) - if (IS_ABSOLUTE "${_dbcsr_libxstream_include_dir}") - get_filename_component(_dbcsr_libxstream_prefix - "${_dbcsr_libxstream_include_dir}/.." ABSOLUTE) - list(APPEND _dbcsr_libxstream_prefix_hints "${_dbcsr_libxstream_prefix}") - - if (_dbcsr_libxstream_prefix MATCHES "/include$") - get_filename_component(_dbcsr_libxstream_prefix - "${_dbcsr_libxstream_prefix}/.." ABSOLUTE) - list(APPEND _dbcsr_libxstream_prefix_hints "${_dbcsr_libxstream_prefix}") - endif () - endif () -endforeach () - -if (LIBXSTREAM_LINK_LIBRARIES) - find_program( - LIBXSTREAM_OPENCL_SCRIPT - NAMES tool_opencl.sh - HINTS ${_dbcsr_libxstream_prefix_hints} - PATH_SUFFIXES scripts bin) - find_path( - LIBXSTREAM_SMM_DIR - NAMES smm_acc.c - HINTS ${_dbcsr_libxstream_prefix_hints} - PATH_SUFFIXES samples/smm share/libxstream/samples/smm) -endif () - -if (LIBXSTREAM_LINK_LIBRARIES AND (NOT LIBXSTREAM_OPENCL_SCRIPT - OR NOT LIBXSTREAM_SMM_DIR)) - message( - FATAL_ERROR - "LIBXSTREAM CMake package was found, but its OpenCL helper script or SMM samples were not found" - ) -endif () - -if (NOT LIBXSTREAM_LINK_LIBRARIES AND DBCSR_FETCH_MISSING_DEPS) - include(FetchContent) - message(STATUS "LIBXSTREAM not found locally -- downloading via FetchContent") - FetchContent_Declare( - libxstream - GIT_REPOSITORY ${LIBXSTREAM_GIT_REPOSITORY} - GIT_TAG ${LIBXSTREAM_GIT_TAG}) - set(LIBXSTREAM_SHARED - ${BUILD_SHARED_LIBS} - CACHE BOOL "" FORCE) - FetchContent_MakeAvailable(libxstream) - set(LIBXSTREAM_FETCHED TRUE) - - if (TARGET libxstream::libxstream) - set(LIBXSTREAM_LINK_LIBRARIES libxstream::libxstream) - get_target_property(LIBXSTREAM_INCLUDE_DIRS libxstream::libxstream - INTERFACE_INCLUDE_DIRECTORIES) - if (NOT LIBXSTREAM_INCLUDE_DIRS OR LIBXSTREAM_INCLUDE_DIRS MATCHES - "-NOTFOUND") - set(LIBXSTREAM_INCLUDE_DIRS "${libxstream_SOURCE_DIR}/include") - endif () - set(LIBXSTREAM_OPENCL_SCRIPT - "${libxstream_SOURCE_DIR}/scripts/tool_opencl.sh") - set(LIBXSTREAM_SMM_DIR "${libxstream_SOURCE_DIR}/samples/smm") - endif () -endif () - -find_package_handle_standard_args( - LIBXSTREAM DEFAULT_MSG LIBXSTREAM_LINK_LIBRARIES LIBXSTREAM_OPENCL_SCRIPT - LIBXSTREAM_SMM_DIR) - -if (LIBXSTREAM_FOUND AND NOT TARGET DBCSR::LIBXSTREAM) - add_library(DBCSR::LIBXSTREAM INTERFACE IMPORTED GLOBAL) - if (LIBXSTREAM_INCLUDE_DIRS) - target_include_directories(DBCSR::LIBXSTREAM - INTERFACE ${LIBXSTREAM_INCLUDE_DIRS}) - endif () - target_link_libraries(DBCSR::LIBXSTREAM - INTERFACE ${LIBXSTREAM_LINK_LIBRARIES}) -endif () - -unset(_dbcsr_libxstream_prefix_hints) -unset(_dbcsr_libxstream_prefix) -unset(_dbcsr_libxstream_include_dir) diff --git a/cmake/dependencies.cmake b/cmake/dependencies.cmake deleted file mode 100644 index fdff8287616..00000000000 --- a/cmake/dependencies.cmake +++ /dev/null @@ -1,16 +0,0 @@ -# set(LIBXS_GIT_REPOSITORY "https://github.com/hfp/libxs.git") set(LIBXS_GIT_TAG -# "ab416130f8c9f7edb8c1bf3d3abaf402f61d0fe0") - -# set(LIBXSTREAM_GIT_REPOSITORY "https://github.com/hfp/libxstream.git") -# set(LIBXSTREAM_GIT_TAG "8015f5461e5d1fee08024ddf20b38ea4400fbc24") - -# set(LIBXSMM_GIT_TAG "0cea22fdc34ec54bc59ffb47a43cb3e28b26d3e0") - -set(LIBXS_GIT_REPOSITORY "https://github.com/hfp/libxs.git") -set(LIBXS_GIT_TAG "11348a69c6b8622f9192ec725b291f42384a5ce7") - -set(LIBXSTREAM_GIT_REPOSITORY "https://github.com/hfp/libxstream.git") -set(LIBXSTREAM_GIT_TAG "8375c018d0619bfd9261f67b9ed8b609d8e4ff66") - -set(LIBXSMM_GIT_REPOSITORY "https://github.com/Growl1234/libxsmm.git") -set(LIBXSMM_GIT_TAG "47548ddea6e5b63c3602b51100660c14c8b2d54c") From 7482c0657017636511f6c19a95757ee4d5d73245 Mon Sep 17 00:00:00 2001 From: Growl Date: Mon, 8 Jun 2026 21:53:44 +0800 Subject: [PATCH 18/46] Update dependency in CI --- .github/workflows/testing-linux.yml | 4 ++-- src/CMakeLists.txt | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/testing-linux.yml b/.github/workflows/testing-linux.yml index c2a48d21f06..bda60e4031e 100644 --- a/.github/workflows/testing-linux.yml +++ b/.github/workflows/testing-linux.yml @@ -8,9 +8,9 @@ on: env: LIBXS_GIT_REPOSITORY: https://github.com/hfp/libxs.git - LIBXS_GIT_TAG: 11348a69c6b8622f9192ec725b291f42384a5ce7 + LIBXS_GIT_TAG: eccf0e623af8b4c394cb2e60e602d52cb5b65be9 LIBXSTREAM_GIT_REPOSITORY: https://github.com/hfp/libxstream.git - LIBXSTREAM_GIT_TAG: 8375c018d0619bfd9261f67b9ed8b609d8e4ff66 + LIBXSTREAM_GIT_TAG: 1d6ca9732db6d435af858ccd09997b44fbe3bffb LIBXSMM_GIT_REPOSITORY: https://github.com/Growl1234/libxsmm.git LIBXSMM_GIT_TAG: 47548ddea6e5b63c3602b51100660c14c8b2d54c diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c155066c018..6ba56f6fc46 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -412,8 +412,4 @@ install( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfigVersion.cmake - ${PROJECT_SOURCE_DIR}/cmake/FindLIBXS.cmake - ${PROJECT_SOURCE_DIR}/cmake/FindLIBXSMM.cmake - ${PROJECT_SOURCE_DIR}/cmake/FindLIBXSTREAM.cmake - ${PROJECT_SOURCE_DIR}/cmake/dependencies.cmake DESTINATION ${config_install_dir}) From 644d0088d9fb80ce175c2759d646e2c10463c98a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 13:54:43 +0000 Subject: [PATCH 19/46] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/CMakeLists.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6ba56f6fc46..3a77a9bd567 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -409,7 +409,6 @@ install( EXPORT DBCSRTargets NAMESPACE "${config_namespace}" DESTINATION "${config_install_dir}") -install( - FILES ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfig.cmake - ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfigVersion.cmake - DESTINATION ${config_install_dir}) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfigVersion.cmake + DESTINATION ${config_install_dir}) From ccaf1b13247660ae80f84e59cc708bbadd8d583c Mon Sep 17 00:00:00 2001 From: Hans Pabst Date: Mon, 8 Jun 2026 17:20:22 +0200 Subject: [PATCH 20/46] Incorporated hfp's changes --- CMakeLists.txt | 104 +++++++++++++----- cmake/CompilerConfiguration.cmake | 2 +- src/CMakeLists.txt | 37 +++---- src/acc/acc_bench.c | 10 +- src/cmake/DBCSRConfig.cmake.in | 28 +++-- src/mm/dbcsr_mm_hostdrv.F | 72 +----------- tools/docker/Dockerfile.build-env-ubuntu | 6 +- tools/docker/Dockerfile.build-env-ubuntu-cuda | 4 +- 8 files changed, 127 insertions(+), 136 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 853cd69da0e..45311dbb090 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -152,21 +152,59 @@ endif () # they can be linked into shared libraries. set(CMAKE_POSITION_INDEPENDENT_CODE ON) -set(DBCSR_USE_LIBXSMM FALSE) -set(LIBXSMM_COMPILE_DEFINITIONS "") -set(LIBXSMM_FETCHED FALSE) - if (USE_LIBXS) - find_package(libxs REQUIRED) - add_library(DBCSR::LIBXS INTERFACE IMPORTED) - target_link_libraries(DBCSR::LIBXS INTERFACE libxs::libxs) + find_package(libxs CONFIG QUIET) + if (NOT TARGET libxs::libxs) + set(LIBXSROOT + "${CMAKE_SOURCE_DIR}/../libxs" + CACHE PATH "Root of a Makefile-built LIBXS tree") + find_library( + LIBXS_LIBRARY + NAMES xs + HINTS "${LIBXSROOT}/lib") + if (LIBXS_LIBRARY AND EXISTS "${LIBXSROOT}/libxs/libxs.h") + add_library(libxs::libxs STATIC IMPORTED) + set_target_properties( + libxs::libxs PROPERTIES IMPORTED_LOCATION "${LIBXS_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${LIBXSROOT}") + else () + message( + FATAL_ERROR "LIBXS not found. Set CMAKE_PREFIX_PATH or LIBXSROOT.") + endif () + endif () + get_target_property(_libxs_incdirs libxs::libxs INTERFACE_INCLUDE_DIRECTORIES) + list(GET _libxs_incdirs 0 _libxs_root) + find_file( + LIBXS_JIT_SOURCE + NAMES libxs/libxs_jit.F libxs_jit.F + HINTS "${_libxs_root}" "${_libxs_root}/libxs" + "${_libxs_root}/include/libxs") + if (NOT LIBXS_JIT_SOURCE) + message(FATAL_ERROR "libxs_jit.F not found in LIBXS include tree") + endif () if (USE_LIBXSMM) - find_package(libxsmm REQUIRED) - add_library(DBCSR::LIBXSMM INTERFACE IMPORTED) - target_link_libraries(DBCSR::LIBXSMM INTERFACE libxsmm::libxsmm) + find_package(LIBXSMM QUIET) + if (NOT LIBXSMM_FOUND) + set(LIBXSMMROOT + "${CMAKE_SOURCE_DIR}/../libxsmm" + CACHE PATH "Root of a Makefile-built LIBXSMM tree") + find_library( + LIBXSMM_LIBRARY + NAMES xsmm + HINTS "${LIBXSMMROOT}/lib") + if (LIBXSMM_LIBRARY AND EXISTS "${LIBXSMMROOT}/include/libxsmm.h") + set(LIBXSMM_FOUND TRUE) + set(LIBXSMM_LINK_LIBRARIES "${LIBXSMM_LIBRARY}") + set(LIBXSMM_INCLUDE_DIRS "${LIBXSMMROOT}/include") + else () + message(WARNING "LIBXSMM not found; disabling USE_LIBXSMM.") + set(USE_LIBXSMM OFF) + endif () + endif () endif () elseif (USE_LIBXSMM) - message(WARNING "USE_LIBXSMM=ON requires USE_LIBXS=ON; ignoring USE_LIBXSMM.") + message(WARNING "USE_LIBXSMM=ON requires USE_LIBXS=ON; ignoring.") + set(USE_LIBXSMM OFF) endif () # =================================== BLAS & LAPACK, PkgConfig @@ -231,29 +269,41 @@ if (NOT USE_ACCEL MATCHES "none") endif () if (USE_ACCEL MATCHES "opencl") - # Hint additional OpenCL locations (Intel oneAPI, CUDA toolkit) if (DEFINED ENV{CMPLR_ROOT}) list(APPEND CMAKE_PREFIX_PATH "$ENV{CMPLR_ROOT}") endif () if (DEFINED ENV{CUDA_PATH}) list(APPEND CMAKE_PREFIX_PATH "$ENV{CUDA_PATH}") endif () - - if (NOT USE_LIBXS OR NOT TARGET DBCSR::LIBXS) - message( - FATAL_ERROR - "LIBXS not found. OpenCL backend requires LIBXS (USE_LIBXS=ON).") - endif () - find_package(OpenCL REQUIRED) - find_package(libxstream REQUIRED) - add_library(DBCSR::LIBXSTREAM INTERFACE IMPORTED) - target_link_libraries(DBCSR::LIBXSTREAM INTERFACE libxstream::libxstream) - - message(STATUS "Using LIBXSTREAM") - set(DBCSR_OPENCL_SCRIPT "${LIBXSTREAM_OPENCL_SCRIPT}") - set(DBCSR_LIBXSTREAM_SMM_DIR "${LIBXSTREAM_SMM_DIR}") - list(GET LIBXSTREAM_INCLUDE_DIRS 0 DBCSR_LIBXSTREAM_INCLUDE_DIR) + if (NOT USE_LIBXS OR NOT TARGET libxs::libxs) + message(FATAL_ERROR "OpenCL backend requires LIBXS (USE_LIBXS=ON).") + endif () + find_package(libxstream CONFIG QUIET) + if (NOT TARGET libxstream::libxstream) + set(LIBXSTREAMROOT + "${CMAKE_SOURCE_DIR}/../libxstream" + CACHE PATH "Root of a Makefile-built LIBXSTREAM tree") + find_library( + LIBXSTREAM_LIBRARY + NAMES xstream + HINTS "${LIBXSTREAMROOT}/lib") + if (LIBXSTREAM_LIBRARY AND EXISTS + "${LIBXSTREAMROOT}/libxstream/libxstream.h") + add_library(libxstream::libxstream STATIC IMPORTED) + set_target_properties( + libxstream::libxstream + PROPERTIES IMPORTED_LOCATION "${LIBXSTREAM_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${LIBXSTREAMROOT}") + else () + message( + FATAL_ERROR + "LIBXSTREAM not found. Set CMAKE_PREFIX_PATH or LIBXSTREAMROOT.") + endif () + endif () + set(DBCSR_LIBXSTREAM_SMM_DIR "${LIBXSTREAMROOT}/samples/smm") + set(DBCSR_LIBXSTREAM_INCLUDE_DIR "${LIBXSTREAMROOT}/libxstream") + set(DBCSR_OPENCL_SCRIPT "${LIBXSTREAMROOT}/scripts/tool_opencl.sh") endif () if (USE_ACCEL MATCHES "cuda|hip") diff --git a/cmake/CompilerConfiguration.cmake b/cmake/CompilerConfiguration.cmake index 2e3719bfb84..a7696c48b7a 100644 --- a/cmake/CompilerConfiguration.cmake +++ b/cmake/CompilerConfiguration.cmake @@ -168,6 +168,6 @@ set(CMAKE_C_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG}) # Suppress GFortran runtime warnings when LIBXS provides the wrapper if (CMAKE_Fortran_COMPILER_ID STREQUAL "GNU" - AND NOT USE_ASAN AND USE_LIBXS AND TARGET DBCSR::LIBXS) + AND NOT USE_ASAN AND USE_LIBXS AND TARGET libxs::libxs) add_link_options("-Wl,--wrap=_gfortran_runtime_warning_at") endif () diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3a77a9bd567..0728b4c86f5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -186,30 +186,18 @@ elseif (USE_ACCEL MATCHES "cuda") "${ACC_ARCH_NUMBER}") endif () -if (USE_LIBXS AND TARGET DBCSR::LIBXS) - target_compile_definitions(dbcsr PRIVATE __LIBXS __BLAS) - target_link_libraries(dbcsr PRIVATE DBCSR::LIBXS ${BLAS_LIBRARIES}) +if (USE_LIBXS AND TARGET libxs::libxs) + target_compile_definitions(dbcsr PRIVATE __LIBXS) + target_sources(dbcsr PRIVATE "${LIBXS_JIT_SOURCE}") + target_link_libraries(dbcsr PRIVATE libxs::libxs ${BLAS_LIBRARIES}) endif () if (BLAS_LIBRARIES MATCHES "mkl_") target_compile_definitions(dbcsr PRIVATE __MKL) endif () -if (LIBXSMM_FETCHED) - target_compile_definitions(dbcsr PRIVATE __LIBXSMM - ${LIBXSMM_COMPILE_DEFINITIONS}) - target_include_directories(dbcsr PRIVATE "${LIBXSMM_INCLUDE_DIRS}") - set_target_properties( - xsmm PROPERTIES INTERFACE_INCLUDE_DIRECTORIES - "$") - install( - TARGETS xsmm - EXPORT DBCSRTargets - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}") - target_link_libraries(dbcsr PRIVATE xsmm) -elseif (LIBXSMM_FOUND) - target_compile_definitions(dbcsr PRIVATE __LIBXSMM - ${LIBXSMM_COMPILE_DEFINITIONS}) +if (USE_LIBXSMM AND LIBXSMM_FOUND) + target_compile_definitions(dbcsr PRIVATE __LIBXSMM) target_include_directories(dbcsr PRIVATE "${LIBXSMM_INCLUDE_DIRS}") target_link_libraries(dbcsr PRIVATE ${LIBXSMM_LINK_LIBRARIES}) endif () @@ -296,7 +284,6 @@ if (USE_ACCEL) if (USE_ACCEL MATCHES "opencl") target_compile_definitions(dbcsr PRIVATE __LIBXSTREAM) target_include_directories(dbcsr PRIVATE "${DBCSR_SMM_DIR}") - # Generate smm_kernels.h from .cl kernel sources set(DBCSR_SMM_KERNELS "${DBCSR_SMM_DIR}/kernels/multiply.cl" "${DBCSR_SMM_DIR}/kernels/transpose.cl") file(GLOB DBCSR_SMM_PARAMS "${DBCSR_SMM_DIR}/params/tune_multiply_*.csv") @@ -324,7 +311,7 @@ if (USE_ACCEL) $<$:roctx64> $<$:roctracer64> $<$:OpenCL::OpenCL> - $<$:DBCSR::LIBXSTREAM>) + $<$:libxstream::libxstream>) endif () # ================================================================================================= @@ -398,6 +385,16 @@ if (USE_ACCEL MATCHES "opencl") endforeach () endif () +# Point consumers at the installed prefix (not the build/source tree) +if (LIBXS_FETCHED) + set(LIBXSROOT "${CMAKE_INSTALL_PREFIX}") +endif () +if (LIBXSTREAM_FETCHED) + set(LIBXSTREAMROOT "${CMAKE_INSTALL_PREFIX}") +endif () +if (LIBXSMM_FETCHED) + set(LIBXSMMROOT "${CMAKE_INSTALL_PREFIX}") +endif () configure_package_config_file( cmake/DBCSRConfig.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfig.cmake" INSTALL_DESTINATION "${config_install_dir}") diff --git a/src/acc/acc_bench.c b/src/acc/acc_bench.c index 2822ef70f21..7fc54c431cc 100644 --- a/src/acc/acc_bench.c +++ b/src/acc/acc_bench.c @@ -10,12 +10,12 @@ #include "acc_bench.h" #if defined(__LIBXS) -# include -# include -# include -# include +# include +# include +# include +# include #else /* code depends on LIBXS */ -# include +# include # define __LIBXS #endif diff --git a/src/cmake/DBCSRConfig.cmake.in b/src/cmake/DBCSRConfig.cmake.in index 1236379c0f6..30a48084a56 100644 --- a/src/cmake/DBCSRConfig.cmake.in +++ b/src/cmake/DBCSRConfig.cmake.in @@ -2,7 +2,10 @@ include(CMakeFindDependencyMacro) -list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}") +# Hints for locating DBCSR's dependencies (override with your own -D flags) +set(DBCSR_LIBXSROOT "@LIBXSROOT@") +set(DBCSR_LIBXSTREAMROOT "@LIBXSTREAMROOT@") +set(DBCSR_LIBXSMMROOT "@LIBXSMMROOT@") # the following should only be needed when building statically @@ -16,11 +19,6 @@ if (@USE_OPENMP@) find_dependency(OpenMP) endif () -if (@USE_LIBXS@) - set(DBCSR_USE_LIBXS @USE_LIBXS@) - find_dependency(LIBXS) -endif () - if ("@USE_ACCEL@" MATCHES "cuda") set(DBCSR_USE_ACCEL @USE_ACCEL@) enable_language(CUDA) @@ -36,14 +34,22 @@ if ("@USE_ACCEL@" MATCHES "hip") endif () if ("@USE_ACCEL@" MATCHES "opencl") - set(DBCSR_USE_ACCEL @USE_ACCEL@) find_dependency(OpenCL) - find_dependency(LIBXSTREAM) endif () -if (@DBCSR_USE_LIBXSMM@) - set(DBCSR_USE_LIBXSMM @DBCSR_USE_LIBXSMM@) - find_dependency(LIBXSMM) +if (@USE_LIBXSMM@) + set(DBCSR_USE_LIBXSMM @USE_LIBXSMM@) + if (NOT TARGET xsmm) + find_library(DBCSR_LIBXSMM_LIBRARY xsmm + PATHS "@LIBXSMMROOT@/lib" NO_DEFAULT_PATH) + if (NOT DBCSR_LIBXSMM_LIBRARY) + find_library(DBCSR_LIBXSMM_LIBRARY xsmm) + endif () + if (DBCSR_LIBXSMM_LIBRARY) + add_library(xsmm UNKNOWN IMPORTED) + set_target_properties(xsmm PROPERTIES IMPORTED_LOCATION "${DBCSR_LIBXSMM_LIBRARY}") + endif () + endif () endif () include("${CMAKE_CURRENT_LIST_DIR}/DBCSRTargets.cmake") diff --git a/src/mm/dbcsr_mm_hostdrv.F b/src/mm/dbcsr_mm_hostdrv.F index 2f3bd200c79..e8f65c03ef6 100644 --- a/src/mm/dbcsr_mm_hostdrv.F +++ b/src/mm/dbcsr_mm_hostdrv.F @@ -373,57 +373,10 @@ SUBROUTINE libxs_process_mm_stack_${nametype1}$ (stack_descr, params, & !! Processes MM stack using LIBXS indexed GEMM batch. !! Real types use LIBXS dispatch; complex types fall through to BLAS. #:if base1 == 'r' - USE LIBXS, ONLY: libxs_gemm_config_t, & - libxs_gemm_dispatch, libxs_gemm_index, & - C_LOC, C_SIZEOF, & - LIBXS_DATATYPE_F${bits1[n]}$ - USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_FUNLOC - #:set ckind1 = 'C_DOUBLE' if nametype1 == 'd' else 'C_FLOAT' -#if defined(__MKL) - INTERFACE - FUNCTION mkl_cblas_jit_create_${nametype1}$gemm(jitter, & - layout, transa, transb, m, n, k, & - alpha, lda, ldb, beta, ldc) & - RESULT(status) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_PTR, C_INT, ${ckind1}$ - INTEGER(C_INT) :: status - TYPE(C_PTR) :: jitter - INTEGER(C_INT), VALUE :: layout, transa, transb - INTEGER(C_INT), VALUE :: m, n, k, lda, ldb, ldc - REAL(${ckind1}$), VALUE :: alpha, beta - END FUNCTION - FUNCTION mkl_jit_get_${nametype1}$gemm_ptr(jitter) & - RESULT(ptr) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_FUNPTR, C_PTR - TYPE(C_FUNPTR) :: ptr - TYPE(C_PTR), INTENT(IN), VALUE :: jitter - END FUNCTION - END INTERFACE -#endif -#if defined(__LIBXSMM) - INTERFACE - FUNCTION libxsmm_dispatch_gemm(shape, flags, prefetch) & - RESULT(fn) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_FUNPTR, C_INT - INTEGER(C_INT), INTENT(IN) :: shape(10) - INTEGER(C_INT), INTENT(IN), VALUE :: flags, prefetch - TYPE(C_FUNPTR) :: fn - END FUNCTION - END INTERFACE -#endif -#if defined(__BLAS) || defined(__MKL) - INTERFACE - SUBROUTINE ${nametype1}$gemm_blas(transa, transb, & - m, n, k, alpha, a, lda, b, ldb, beta, c, ldc) & - BIND(C, NAME="${nametype1}$gemm_") - USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT, C_CHAR, ${ckind1}$ - CHARACTER(1, C_CHAR), INTENT(IN) :: transa, transb - INTEGER(C_INT), INTENT(IN) :: m, n, k, lda, ldb, ldc - REAL(${ckind1}$), INTENT(IN) :: alpha, beta, a(*), b(*) - REAL(${ckind1}$), INTENT(INOUT) :: c(*) - END SUBROUTINE - END INTERFACE -#endif + USE LIBXS_JIT, ONLY: libxs_gemm_config_t, & + libxs_gemm_dispatch, libxs_gemm_index, & + C_LOC, C_SIZEOF, & + LIBXS_DATATYPE_F${bits1[n]}$ #:endif INTEGER, INTENT(IN) :: stack_size TYPE(stack_descriptor_type), INTENT(IN) :: stack_descr @@ -450,22 +403,7 @@ FUNCTION libxsmm_dispatch_gemm(shape, flags, prefetch) & datatype=LIBXS_DATATYPE_F${bits1[n]}$, & transa='N', transb='N', & m=m, n=n, k=k, lda=m, ldb=k, ldc=m, & - alpha=1D0, beta=1D0 & -#if defined(__MKL) - , jit_create_${nametype1}$gemm= & - C_FUNLOC(mkl_cblas_jit_create_${nametype1}$gemm) & - , jit_get_${nametype1}$gemm= & - C_FUNLOC(mkl_jit_get_${nametype1}$gemm_ptr) & -#endif -#if defined(__LIBXSMM) - , xgemm_dispatch= & - C_FUNLOC(libxsmm_dispatch_gemm) & -#endif -#if defined(__BLAS) || defined(__MKL) - , ${nametype1}$gemm_blas= & - C_FUNLOC(${nametype1}$gemm_blas) & -#endif - ) + alpha=1D0, beta=1D0) IF (0 /= rc) THEN CALL libxs_gemm_index( & C_LOC(a_data), C_LOC(params(p_a_first, 1)), & diff --git a/tools/docker/Dockerfile.build-env-ubuntu b/tools/docker/Dockerfile.build-env-ubuntu index 3ffe0e6760a..0fb3ef191d2 100644 --- a/tools/docker/Dockerfile.build-env-ubuntu +++ b/tools/docker/Dockerfile.build-env-ubuntu @@ -60,8 +60,8 @@ RUN set -ex ; \ apt-get install -y --no-install-recommends opencl-c-headers ocl-icd-libopencl1 ; \ rm -rf /var/lib/apt/lists/* -ARG libxs_version=1a9fad72958a07f28e7514c19328162485c3c358 -ARG libxstream_version=eb9acbb55f83e65572add7569c2aa0a6f38a5a41 +ARG libxs_version=11348a69c6b8622f9192ec725b291f42384a5ce7 +ARG libxstream_version=8375c018d0619bfd9261f67b9ed8b609d8e4ff66 RUN set -ex ; \ curl -LsS https://github.com/hfp/libxs/archive/${libxs_version}.tar.gz | tar -xz -C /opt ; \ @@ -75,7 +75,7 @@ RUN set -ex ; \ ENV PKG_CONFIG_PATH="/opt/libxstream/lib/pkgconfig:/opt/libxs/lib/pkgconfig:${PKG_CONFIG_PATH}" -ARG libxs_version=1a9fad72958a07f28e7514c19328162485c3c358 +ARG libxs_version=11348a69c6b8622f9192ec725b291f42384a5ce7 RUN set -ex ; \ curl -LsS https://github.com/hfp/libxs/archive/${libxs_version}.tar.gz | tar -xz -C /opt ; \ diff --git a/tools/docker/Dockerfile.build-env-ubuntu-cuda b/tools/docker/Dockerfile.build-env-ubuntu-cuda index 056d6e79c3b..778965f68ba 100644 --- a/tools/docker/Dockerfile.build-env-ubuntu-cuda +++ b/tools/docker/Dockerfile.build-env-ubuntu-cuda @@ -51,8 +51,8 @@ RUN set -ex ; \ apt-get install -y --no-install-recommends opencl-c-headers ocl-icd-libopencl1 ; \ rm -rf /var/lib/apt/lists/* -ARG libxs_version=1a9fad72958a07f28e7514c19328162485c3c358 -ARG libxstream_version=eb9acbb55f83e65572add7569c2aa0a6f38a5a41 +ARG libxs_version=11348a69c6b8622f9192ec725b291f42384a5ce7 +ARG libxstream_version=8375c018d0619bfd9261f67b9ed8b609d8e4ff66 RUN set -ex ; \ curl -LsS https://github.com/hfp/libxs/archive/${libxs_version}.tar.gz | tar -xz -C /opt ; \ From 54312eb240441155ef5b01c9f098f99979bd6faa Mon Sep 17 00:00:00 2001 From: Mathieu Taillefumier Date: Mon, 8 Jun 2026 19:42:27 +0200 Subject: [PATCH 21/46] CMake build system cleanup --- CMakeLists.txt | 152 +++++++------------- src/CMakeLists.txt | 256 +++++++++++++++++---------------- src/cmake/DBCSRConfig.cmake.in | 31 ++-- src/cmake/FindLIBXSMM.cmake | 63 ++++++++ 4 files changed, 267 insertions(+), 235 deletions(-) create mode 100644 src/cmake/FindLIBXSMM.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 45311dbb090..641e0ad09b8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.22) set(CMAKE_INTERPROCEDURAL_OPTIMIZATION FALSE FORCE) # include our cmake snippets -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_CURRENT_SOURCE_DIR}/src/cmake) # DBCSR's source directory set(DBCSR_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src) @@ -20,6 +20,7 @@ endif () # ================================================================================================= # PROJECT AND VERSION include(GetGitRevisionDescription) +include(FetchContent) git_describe(GIT_DESC) @@ -60,15 +61,17 @@ else () endforeach () endif () + project( dbcsr DESCRIPTION "DBCSR: Distributed Block Compressed Sparse Row matrix library (https://dbcsr.cp2k.org)" + LANGUAGES Fortran C CXX ) -set(dbcsr_VERSION - ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_GIT}) +set(dbcsr_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_GIT}) set(dbcsr_APIVERSION ${VERSION_MAJOR}.${VERSION_MINOR}) + # ================================================================================================= # OPTIONS include(CMakeDependentOption) @@ -78,7 +81,9 @@ option(USE_OPENMP "Build with OpenMP support" ON) option(USE_MPI "Build with MPI support" OFF) option(BUILD_TESTING "Build dbcsr unit tests" OFF) option(USE_LIBXS "Use LIBXS for host-side Small Matrix Multiplication" OFF) -option(USE_LIBXSMM "Use LIBXSMM for JIT-compiled GEMM kernels" OFF) + +cmake_dependent_option(USE_LIBXSMM "Use LIBXSMM for JIT-compiled GEMM kernels" OFF "USE_LIBXS" OFF) + option(WITH_CUDA_PROFILING "Enable profiling within CUDA" OFF) option(WITH_HIP_PROFILING "Enable profiling within HIP" OFF) @@ -98,9 +103,9 @@ set(TEST_OMP_THREADS CACHE STRING "Number of OpenMP threads for testing") set(USE_ACCEL - "" - CACHE STRING "Build with acceleration support (default: none)") -set_property(CACHE USE_ACCEL PROPERTY STRINGS "" opencl cuda hip) + "none" + CACHE STRING "BBuild with acceleration support (none (default value), opencl, cuda, hip)") +set_property(CACHE USE_ACCEL PROPERTY STRINGS none opencl cuda hip) string(TOLOWER "${USE_ACCEL}" USE_ACCEL) set(SUPPORTED_CUDA_ARCHITECTURES @@ -112,19 +117,25 @@ set(SUPPORTED_CUDA_ARCHITECTURES A100 H100) set(SUPPORTED_HIP_ARCHITECTURES Mi50 Mi100 Mi250 Mi300 Mi350) -set(WITH_GPU - $,"","P100"> - CACHE - STRING - "Select GPU arch. and embed parameters (default: CUDA/HIP=P100, OPENCL=all)" -) + +set(WITH_GPU "P100" CACHE STRING + "Select GPU arch. and embed parameters (default: CUDA/HIP=P100, OPENCL=all)") +set_property(CACHE WITH_GPU PROPERTY STRINGS + ${SUPPORTED_CUDA_ARCHITECTURES} ${SUPPORTED_HIP_ARCHITECTURES}) + +# Override default for OpenCL: empty string means "all" +if (NOT DEFINED WITH_GPU AND USE_ACCEL STREQUAL "opencl") +set(WITH_GPU "" CACHE STRING + "Select GPU arch. and embed parameters (default: CUDA/HIP=P100, OPENCL=all)" + FORCE) +endif () + set(WITH_GPU_PARAMS "${WITH_GPU}") set_property(CACHE WITH_GPU PROPERTY STRINGS ${SUPPORTED_CUDA_ARCHITECTURES} ${SUPPORTED_HIP_ARCHITECTURES}) # ================================================================================================= # LANGUAGES AND TESTING -enable_language(Fortran) if ((WITH_C_API AND WITH_EXAMPLES) OR (NOT USE_ACCEL MATCHES "none")) enable_language(CXX) @@ -139,7 +150,6 @@ if ((WITH_C_API AND WITH_EXAMPLES) OR (NOT USE_ACCEL MATCHES "none")) set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON) endif () - endif () # =================================== OpenMP @@ -153,59 +163,15 @@ endif () set(CMAKE_POSITION_INDEPENDENT_CODE ON) if (USE_LIBXS) - find_package(libxs CONFIG QUIET) - if (NOT TARGET libxs::libxs) - set(LIBXSROOT - "${CMAKE_SOURCE_DIR}/../libxs" - CACHE PATH "Root of a Makefile-built LIBXS tree") - find_library( - LIBXS_LIBRARY - NAMES xs - HINTS "${LIBXSROOT}/lib") - if (LIBXS_LIBRARY AND EXISTS "${LIBXSROOT}/libxs/libxs.h") - add_library(libxs::libxs STATIC IMPORTED) - set_target_properties( - libxs::libxs PROPERTIES IMPORTED_LOCATION "${LIBXS_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${LIBXSROOT}") - else () - message( - FATAL_ERROR "LIBXS not found. Set CMAKE_PREFIX_PATH or LIBXSROOT.") - endif () - endif () - get_target_property(_libxs_incdirs libxs::libxs INTERFACE_INCLUDE_DIRECTORIES) - list(GET _libxs_incdirs 0 _libxs_root) - find_file( - LIBXS_JIT_SOURCE - NAMES libxs/libxs_jit.F libxs_jit.F - HINTS "${_libxs_root}" "${_libxs_root}/libxs" - "${_libxs_root}/include/libxs") - if (NOT LIBXS_JIT_SOURCE) - message(FATAL_ERROR "libxs_jit.F not found in LIBXS include tree") - endif () - if (USE_LIBXSMM) - find_package(LIBXSMM QUIET) - if (NOT LIBXSMM_FOUND) - set(LIBXSMMROOT - "${CMAKE_SOURCE_DIR}/../libxsmm" - CACHE PATH "Root of a Makefile-built LIBXSMM tree") - find_library( - LIBXSMM_LIBRARY - NAMES xsmm - HINTS "${LIBXSMMROOT}/lib") - if (LIBXSMM_LIBRARY AND EXISTS "${LIBXSMMROOT}/include/libxsmm.h") - set(LIBXSMM_FOUND TRUE) - set(LIBXSMM_LINK_LIBRARIES "${LIBXSMM_LIBRARY}") - set(LIBXSMM_INCLUDE_DIRS "${LIBXSMMROOT}/include") - else () - message(WARNING "LIBXSMM not found; disabling USE_LIBXSMM.") - set(USE_LIBXSMM OFF) - endif () - endif () - endif () -elseif (USE_LIBXSMM) - message(WARNING "USE_LIBXSMM=ON requires USE_LIBXS=ON; ignoring.") - set(USE_LIBXSMM OFF) -endif () + find_package(libxs REQUIRED) + # not needed at all + add_library(DBCSR::LIBXS ALIAS libxs::libxs) +endif() + +# libxsmm can only be activated when libxs is on. +if (USE_LIBXSMM) + find_package(LIBXSMM REQUIRED) +endif() # =================================== BLAS & LAPACK, PkgConfig find_package(LAPACK REQUIRED) # needed for some of the integrated test routines, @@ -226,14 +192,15 @@ endif () # =================================== MPI if (USE_MPI) - get_property(REQUIRED_MPI_COMPONENTS GLOBAL PROPERTY ENABLED_LANGUAGES) + get_property(DBCSR_REQUIRED_MPI_COMPONENTS GLOBAL PROPERTY ENABLED_LANGUAGES) if (NOT CMAKE_CROSSCOMPILING) # when cross compiling, assume the users know # what they are doing set(MPI_DETERMINE_LIBRARY_VERSION TRUE) endif () + find_package( MPI - COMPONENTS ${REQUIRED_MPI_COMPONENTS} + COMPONENTS ${DBCSR_REQUIRED_MPI_COMPONENTS} REQUIRED) if (NOT MPI_Fortran_HAVE_F90_MODULE) @@ -268,6 +235,8 @@ if (NOT USE_ACCEL MATCHES "none") set(DBCSR_ACC_HEADER acc/acc.h acc/acc_bench.h acc/acc_libsmm.h) endif () + + if (USE_ACCEL MATCHES "opencl") if (DEFINED ENV{CMPLR_ROOT}) list(APPEND CMAKE_PREFIX_PATH "$ENV{CMPLR_ROOT}") @@ -275,35 +244,22 @@ if (USE_ACCEL MATCHES "opencl") if (DEFINED ENV{CUDA_PATH}) list(APPEND CMAKE_PREFIX_PATH "$ENV{CUDA_PATH}") endif () - find_package(OpenCL REQUIRED) - if (NOT USE_LIBXS OR NOT TARGET libxs::libxs) - message(FATAL_ERROR "OpenCL backend requires LIBXS (USE_LIBXS=ON).") - endif () - find_package(libxstream CONFIG QUIET) - if (NOT TARGET libxstream::libxstream) - set(LIBXSTREAMROOT - "${CMAKE_SOURCE_DIR}/../libxstream" - CACHE PATH "Root of a Makefile-built LIBXSTREAM tree") - find_library( - LIBXSTREAM_LIBRARY - NAMES xstream - HINTS "${LIBXSTREAMROOT}/lib") - if (LIBXSTREAM_LIBRARY AND EXISTS - "${LIBXSTREAMROOT}/libxstream/libxstream.h") - add_library(libxstream::libxstream STATIC IMPORTED) - set_target_properties( - libxstream::libxstream - PROPERTIES IMPORTED_LOCATION "${LIBXSTREAM_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${LIBXSTREAMROOT}") - else () - message( - FATAL_ERROR - "LIBXSTREAM not found. Set CMAKE_PREFIX_PATH or LIBXSTREAMROOT.") - endif () + + # libxs is a hard dependency when libxs is on amd opencl on as well. + if (NOT USE_LIBXS) + message( + FATAL_ERROR + "LIBXS not found. OpenCL backend requires LIBXS (USE_LIBXS=ON).") endif () - set(DBCSR_LIBXSTREAM_SMM_DIR "${LIBXSTREAMROOT}/samples/smm") - set(DBCSR_LIBXSTREAM_INCLUDE_DIR "${LIBXSTREAMROOT}/libxstream") - set(DBCSR_OPENCL_SCRIPT "${LIBXSTREAMROOT}/scripts/tool_opencl.sh") + + find_package(OpenCL REQUIRED) + find_package(libxstream REQUIRED) + add_library(DBCSR::LIBXSTREAM ALIAS libxstream::libxstream) + + message(STATUS "Using LIBXSTREAM") + set(DBCSR_OPENCL_SCRIPT "${LIBXSTREAM_OPENCL_SCRIPT}") + set(DBCSR_LIBXSTREAM_SMM_DIR "${LIBXSTREAM_SMM_DIR}") + list(GET LIBXSTREAM_INCLUDE_DIRS 0 DBCSR_LIBXSTREAM_INCLUDE_DIR) endif () if (USE_ACCEL MATCHES "cuda|hip") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0728b4c86f5..bca51a6284c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -106,41 +106,41 @@ add_fypp_sources( work/dbcsr_work_operations.F) set(DBCSR_HIP_AND_CUDA_SRCS - acc/libsmm_acc/libsmm_acc_benchmark.cpp - acc/libsmm_acc/libsmm_acc_init.cpp - acc/libsmm_acc/libsmm_acc.cpp - acc/cuda_hip/calculate_norms.cpp - acc/cuda_hip/acc_blas.cpp - acc/cuda_hip/acc_dev.cpp - acc/cuda_hip/acc_error.cpp - acc/cuda_hip/acc_event.cpp - acc/cuda_hip/acc_utils.cpp - acc/cuda_hip/acc_init.cpp - acc/cuda_hip/acc_mem.cpp - acc/cuda_hip/acc_stream.cpp) + acc/libsmm_acc/libsmm_acc_benchmark.cpp + acc/libsmm_acc/libsmm_acc_init.cpp + acc/libsmm_acc/libsmm_acc.cpp + acc/cuda_hip/calculate_norms.cpp + acc/cuda_hip/acc_blas.cpp + acc/cuda_hip/acc_dev.cpp + acc/cuda_hip/acc_error.cpp + acc/cuda_hip/acc_event.cpp + acc/cuda_hip/acc_utils.cpp + acc/cuda_hip/acc_init.cpp + acc/cuda_hip/acc_mem.cpp + acc/cuda_hip/acc_stream.cpp) set(DBCSR_CUDA_SRCS ${DBCSR_HIP_AND_CUDA_SRCS} acc/cuda/acc_cuda.cpp - acc/cuda/dbcsr_cuda_nvtx_cu.cpp) + acc/cuda/dbcsr_cuda_nvtx_cu.cpp) set(DBCSR_HIP_SRCS ${DBCSR_HIP_AND_CUDA_SRCS} acc/hip/acc_hip.cpp) if (USE_ACCEL MATCHES "hip") set_source_files_properties(acc/cuda_hip/calculate_norms.cpp - PROPERTIES LANGUAGE HIP) + PROPERTIES LANGUAGE HIP) set_source_files_properties(acc/cuda_hip/calculate_norms.cpp - PROPERTIES COMPILE_FLAGS "-fPIE") + PROPERTIES COMPILE_FLAGS "-fPIE") elseif (USE_ACCEL MATCHES "cuda") set_source_files_properties(acc/cuda_hip/calculate_norms.cpp - PROPERTIES LANGUAGE CUDA) + PROPERTIES LANGUAGE CUDA) set_source_files_properties(acc/cuda_hip/calculate_norms.cpp - PROPERTIES COMPILE_FLAGS "--x cu") + PROPERTIES COMPILE_FLAGS "--x cu") endif () # OpenCL backend: SMM from LIBXSTREAM samples, ACC from LIBXSTREAM library set(DBCSR_SMM_DIR "${DBCSR_LIBXSTREAM_SMM_DIR}") set(DBCSR_OPENCL_SRCS - "${DBCSR_SMM_DIR}/smm_acc.c" "${DBCSR_SMM_DIR}/smm_trans.c" - "${DBCSR_SMM_DIR}/smm_params.c" "${DBCSR_SMM_DIR}/smm_kernel.c") + "${DBCSR_SMM_DIR}/smm_acc.c" "${DBCSR_SMM_DIR}/smm_trans.c" + "${DBCSR_SMM_DIR}/smm_params.c" "${DBCSR_SMM_DIR}/smm_kernel.c") # set the __SHORT_FILE__ per file for dbcsr sources foreach (dbcsr_src ${DBCSR_FORTRAN_SRCS}) @@ -154,7 +154,7 @@ endforeach () if ((CMAKE_Fortran_COMPILER_ID STREQUAL "GNU") AND (CMAKE_Fortran_COMPILER_VERSION VERSION_GREATER_EQUAL 10)) set_source_files_properties(mpi/dbcsr_mpiwrap.F PROPERTIES COMPILE_FLAGS - -Wno-error) + -Wno-error) endif () set(DBCSR_SRCS ${DBCSR_FORTRAN_SRCS}) @@ -176,68 +176,92 @@ add_library(dbcsr ${DBCSR_SRCS}) set_target_properties( dbcsr PROPERTIES VERSION ${dbcsr_VERSION} - SOVERSION ${dbcsr_APIVERSION} - POSITION_INDEPENDENT_CODE ON) + SOVERSION ${dbcsr_APIVERSION} + POSITION_INDEPENDENT_CODE ON) if (USE_ACCEL MATCHES "hip") set_target_properties(dbcsr PROPERTIES HIP_ARCHITECTURES "${ACC_ARCH_NUMBER}") elseif (USE_ACCEL MATCHES "cuda") set_target_properties(dbcsr PROPERTIES CUDA_ARCHITECTURES - "${ACC_ARCH_NUMBER}") + "${ACC_ARCH_NUMBER}") endif () -if (USE_LIBXS AND TARGET libxs::libxs) - target_compile_definitions(dbcsr PRIVATE __LIBXS) - target_sources(dbcsr PRIVATE "${LIBXS_JIT_SOURCE}") - target_link_libraries(dbcsr PRIVATE libxs::libxs ${BLAS_LIBRARIES}) -endif () +# What follows is an example of what should not be done. Compiling the libxs +# Fortran module here is a workaround; this is the responsibility of the libxs +# build system, not DBCSR. + +# As a workaround, we retrieve the include directory of libxs and scan for +# libxs_jit.F. If found we had the file to the list of files to be compiled. +# + +if (USE_LIBXS) +message(WARNING + "Compiling libxs_jit.F here is a workaround: this should be handled " + "by the libxs build system, not by DBCSR. It may also produce linking " + "warnings (e.g. DT_TEXTREL) when DBCSR is built as a shared library." + ) + get_target_property(DBCSR_LIBXS_INCLUDE_DIRS libxs::libxs INTERFACE_INCLUDE_DIRECTORIES) + find_path(DBCSR_LIBXS_FORTRAN_MODULE "libxs_jit.F" + HINTS ${DBCSR_LIBXS_INCLUDE_DIRS}) + set_source_files_properties("${DBCSR_LIBXS_FORTRAN_MODULE}/libxs_jit.F" + POSITION_INDEPENDENT_CODE ON) + if (DBCSR_LIBXS_FORTRAN_MODULE) + target_sources(dbcsr PRIVATE "${DBCSR_LIBXS_FORTRAN_MODULE}/libxs_jit.F") + endif () +endif() + +target_compile_definitions(dbcsr PRIVATE __STATM_TOTAL + $<$:__LIBXS> + $<$:__BLAS> + $<$:__parallel> + $<$:__USE_MPI_F08> + $<$:__NO_STATM_ACCESS> + $<$:NDEBUG> + $<$:__LIBXSMM> + $<$:${LIBXSMM_COMPILE_DEFINITIONS}> +) + +# Instead of resetting the compiler for MPI, we are adding the compiler flags +# otherwise added by the mpifort-wrapper directly; based on hints from: +# https://cmake.org/pipermail/cmake/2012-June/050991.html Here we assume that +# the MPI implementation found uses the same compiler as the Fortran compiler +# we found prior. Otherwise we might be adding incompatible compiler flags at +# this point. when built against MPI, a dbcsr consumer has to specify the MPI +# flags as well, therefore: PUBLIC +target_link_libraries(dbcsr PUBLIC + $<$:MPI::MPI_Fortran> + ${LAPACK_LIBRARIES} + $<$:libxs::libxs> + # replace by libxsmm::libxsmm if libxsmm uses cmake + ${BLAS_LIBRARIES} + $<$:dbcsr::libxsmm> + $<$:OpenMP::OpenMP_C> + $<$:OpenMP::OpenMP_CXX> + $<$:OpenMP::OpenMP_Fortran>) if (BLAS_LIBRARIES MATCHES "mkl_") target_compile_definitions(dbcsr PRIVATE __MKL) endif () -if (USE_LIBXSMM AND LIBXSMM_FOUND) - target_compile_definitions(dbcsr PRIVATE __LIBXSMM) - target_include_directories(dbcsr PRIVATE "${LIBXSMM_INCLUDE_DIRS}") - target_link_libraries(dbcsr PRIVATE ${LIBXSMM_LINK_LIBRARIES}) -endif () - if (APPLE) - # fix /proc/self/statm can not be opened on macOS - target_compile_definitions(dbcsr PRIVATE __NO_STATM_ACCESS) - if (BLAS_LIBRARIES MATCHES "Accelerate") target_compile_definitions(dbcsr PRIVATE __ACCELERATE) endif () endif () -# set -DNDEBUG for Release builds -target_compile_definitions(dbcsr PRIVATE $<$:NDEBUG>) - -target_link_libraries(dbcsr PRIVATE ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES}) -target_include_directories( - dbcsr PRIVATE base) # do not export those includes, but some srcs do an - # unprefixed include -# make sure dependencies of dbcsr find the dbcsr_api.mod file plus some files -# they usually include: target_include_directories( - dbcsr + dbcsr PRIVATE base PUBLIC $ - $ - $) -target_compile_definitions(dbcsr PRIVATE __STATM_TOTAL) -set_target_properties(dbcsr PROPERTIES LINKER_LANGUAGE Fortran) - -if (MPI_FOUND) - # once built, a user of the dbcsr library can not influence anything anymore - # by setting those flags: - target_compile_definitions(dbcsr PRIVATE __parallel) + $ + # make sure dependencies of dbcsr find the dbcsr_api.mod file plus some files + # they usually include: + $) +# do not export those includes, but some srcs do an +# unprefixed include - # If requested, use the MPI_F08 module - if (USE_MPI_F08) - target_compile_definitions(dbcsr PRIVATE __USE_MPI_F08) - endif () +set_target_properties(dbcsr PROPERTIES LINKER_LANGUAGE Fortran) +if (USE_MPI) # Instead of resetting the compiler for MPI, we are adding the compiler flags # otherwise added by the mpifort-wrapper directly; based on hints from: # https://cmake.org/pipermail/cmake/2012-June/050991.html Here we assume that @@ -245,22 +269,17 @@ if (MPI_FOUND) # we found prior. Otherwise we might be adding incompatible compiler flags at # this point. when built against MPI, a dbcsr consumer has to specify the MPI # flags as well, therefore: PUBLIC - target_link_libraries(dbcsr PUBLIC MPI::MPI_Fortran) - # Workaround https://gitlab.kitware.com/cmake/cmake/-/issues/27231 - get_target_property(opts MPI::MPI_Fortran INTERFACE_COMPILE_OPTIONS) - set_target_properties( - MPI::MPI_Fortran PROPERTIES INTERFACE_COMPILE_OPTIONS - "$<$:${opts}>") - unset(opts) - -endif () + get_target_property(dbcsr_mpi_fortran_opts MPI::MPI_Fortran INTERFACE_COMPILE_OPTIONS) + # very brittle + if (dbcsr_mpi_fortran_opts) + set_target_properties( + MPI::MPI_Fortran PROPERTIES INTERFACE_COMPILE_OPTIONS + "$<$:${dbcsr_mpi_fortran_opts}>") + unset(dbcsr_mpi_fortran_opts) + endif () +endif() -target_link_libraries( - dbcsr - PRIVATE $<$:OpenMP::OpenMP_C> - $<$:OpenMP::OpenMP_CXX> - $<$:OpenMP::OpenMP_Fortran>) # todo, make this a bit better with opencl. if (USE_ACCEL MATCHES "cuda|hip") @@ -269,29 +288,29 @@ endif () # OpenCL SMM is provided by LIBXSTREAM (no local subdirectory) -if (USE_ACCEL) +if (USE_ACCEL MATCHES "opencl|cuda|hip") target_compile_definitions( dbcsr PRIVATE __DBCSR_ACC - $<$:__CUDA> - $<$:__OPENCL> - $<$:ARCH_NUMBER=${ACC_ARCH_NUMBER}> - $<$:__HIP> - $<$:ARCH_NUMBER=${ACC_ARCH_NUMBER}> - $<$:__CUDA_PROFILING> - $<$:__HIP_PROFILING>) + $<$:__CUDA> + $<$:__OPENCL> + $<$:ARCH_NUMBER=${ACC_ARCH_NUMBER}> + $<$:__HIP> + $<$:ARCH_NUMBER=${ACC_ARCH_NUMBER}> + $<$:__CUDA_PROFILING> + $<$:__HIP_PROFILING>) if (USE_ACCEL MATCHES "opencl") target_compile_definitions(dbcsr PRIVATE __LIBXSTREAM) target_include_directories(dbcsr PRIVATE "${DBCSR_SMM_DIR}") set(DBCSR_SMM_KERNELS "${DBCSR_SMM_DIR}/kernels/multiply.cl" - "${DBCSR_SMM_DIR}/kernels/transpose.cl") + "${DBCSR_SMM_DIR}/kernels/transpose.cl") file(GLOB DBCSR_SMM_PARAMS "${DBCSR_SMM_DIR}/params/tune_multiply_*.csv") set(DBCSR_SMM_GENHDR "${DBCSR_SMM_DIR}/smm_kernels.h") add_custom_command( OUTPUT "${DBCSR_SMM_GENHDR}" COMMAND "${DBCSR_OPENCL_SCRIPT}" -I "${DBCSR_LIBXSTREAM_INCLUDE_DIR}" - ${DBCSR_SMM_KERNELS} ${DBCSR_SMM_PARAMS} "${DBCSR_SMM_GENHDR}" + ${DBCSR_SMM_KERNELS} ${DBCSR_SMM_PARAMS} "${DBCSR_SMM_GENHDR}" DEPENDS "${DBCSR_OPENCL_SCRIPT}" ${DBCSR_SMM_KERNELS} ${DBCSR_SMM_PARAMS} COMMENT "Generating OpenCL SMM kernel header") add_custom_target(dbcsr_smm_kernels DEPENDS "${DBCSR_SMM_GENHDR}") @@ -301,17 +320,17 @@ if (USE_ACCEL) target_link_libraries( dbcsr PRIVATE $<$:CUDA::cudart> - $<$:CUDA::cuda_driver> - $<$:CUDA::cublas> - $<$:CUDA::nvrtc> - $<$:CUDA::nvToolsExt> - $<$:roc::hipblas> - $<$:hiprtc::hiprtc> - $<$:hip::host> - $<$:roctx64> - $<$:roctracer64> - $<$:OpenCL::OpenCL> - $<$:libxstream::libxstream>) + $<$:CUDA::cuda_driver> + $<$:CUDA::cublas> + $<$:CUDA::nvrtc> + $<$:CUDA::nvToolsExt> + $<$:roc::hipblas> + $<$:hiprtc::hiprtc> + $<$:hip::host> + $<$:roctx64> + $<$:roctracer64> + $<$:OpenCL::OpenCL> + $<$:libxstream::libxstream>) endif () # ================================================================================================= @@ -319,7 +338,7 @@ endif () if (WITH_C_API) # Build the C API as a separate library add_fypp_sources(DBCSR_C_SRCS dbcsr.h dbcsr_api_c.F - tensors/dbcsr_tensor_api_c.F tensors/dbcsr_tensor.h) + tensors/dbcsr_tensor_api_c.F tensors/dbcsr_tensor.h) add_library(dbcsr_c ${DBCSR_C_SRCS}) set_target_properties(dbcsr_c PROPERTIES LINKER_LANGUAGE Fortran) @@ -327,19 +346,19 @@ if (WITH_C_API) set_target_properties( dbcsr_c PROPERTIES VERSION ${dbcsr_VERSION} - SOVERSION ${dbcsr_APIVERSION} - POSITION_INDEPENDENT_CODE ON) + SOVERSION ${dbcsr_APIVERSION} + POSITION_INDEPENDENT_CODE ON) - target_link_libraries(dbcsr_c PRIVATE dbcsr) - target_link_libraries(dbcsr_c PUBLIC MPI::MPI_C) # the C API always needs MPI + target_link_libraries(dbcsr_c + PUBLIC dbcsr MPI::MPI_C) # the C API always needs MPI target_include_directories( dbcsr_c PUBLIC - $ # change order so compiler - # first checks binary - # directory - $ - $) + $ # change order so compiler + # first checks binary + # directory + $ + $) endif () # ================================================================================================= @@ -360,9 +379,9 @@ if (NOT CMAKE_INSTALL_Fortran_MODULES) set(CMAKE_INSTALL_Fortran_MODULES "${CMAKE_INSTALL_INCLUDEDIR}") endif () install(FILES "${CMAKE_CURRENT_BINARY_DIR}/dbcsr_api.mod" - DESTINATION "${CMAKE_INSTALL_Fortran_MODULES}") + DESTINATION "${CMAKE_INSTALL_Fortran_MODULES}") install(FILES "${CMAKE_CURRENT_BINARY_DIR}/dbcsr_tensor_api.mod" - DESTINATION "${CMAKE_INSTALL_Fortran_MODULES}") + DESTINATION "${CMAKE_INSTALL_Fortran_MODULES}") if (WITH_C_API) install( @@ -373,7 +392,7 @@ if (WITH_C_API) ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}") install( FILES "${CMAKE_CURRENT_BINARY_DIR}/dbcsr.h" - "${CMAKE_CURRENT_BINARY_DIR}/tensors/dbcsr_tensor.h" + "${CMAKE_CURRENT_BINARY_DIR}/tensors/dbcsr_tensor.h" COMPONENT C DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") endif () @@ -385,27 +404,22 @@ if (USE_ACCEL MATCHES "opencl") endforeach () endif () -# Point consumers at the installed prefix (not the build/source tree) -if (LIBXS_FETCHED) - set(LIBXSROOT "${CMAKE_INSTALL_PREFIX}") -endif () -if (LIBXSTREAM_FETCHED) - set(LIBXSTREAMROOT "${CMAKE_INSTALL_PREFIX}") -endif () -if (LIBXSMM_FETCHED) - set(LIBXSMMROOT "${CMAKE_INSTALL_PREFIX}") -endif () configure_package_config_file( cmake/DBCSRConfig.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfig.cmake" INSTALL_DESTINATION "${config_install_dir}") + write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfigVersion.cmake" VERSION "${dbcsr_VERSION}" COMPATIBILITY SameMajorVersion) + install( EXPORT DBCSRTargets NAMESPACE "${config_namespace}" DESTINATION "${config_install_dir}") -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfig.cmake - ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfigVersion.cmake - DESTINATION ${config_install_dir}) + +install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfigVersion.cmake + ${PROJECT_SOURCE_DIR}/src/cmake/FindLIBXMM.cmake + DESTINATION ${config_install_dir}) diff --git a/src/cmake/DBCSRConfig.cmake.in b/src/cmake/DBCSRConfig.cmake.in index 30a48084a56..13ad24996e8 100644 --- a/src/cmake/DBCSRConfig.cmake.in +++ b/src/cmake/DBCSRConfig.cmake.in @@ -9,24 +9,28 @@ set(DBCSR_LIBXSMMROOT "@LIBXSMMROOT@") # the following should only be needed when building statically +set(DBCSR_USE_MPI @USE_MPI@) if (@USE_MPI@) - set(DBCSR_USE_MPI @USE_MPI@) find_dependency(MPI) endif () +set(DBCSR_USE_OPENMP @USE_OPENMP@) if (@USE_OPENMP@) - set(DBCSR_USE_OPENMP @USE_OPENMP@) find_dependency(OpenMP) endif () +set(DBCSR_USE_LIBXS @USE_LIBXS@) +if (@USE_LIBXS@) + find_dependency(libxs) +endif () + +set(DBCSR_USE_ACCEL @USE_ACCEL@) if ("@USE_ACCEL@" MATCHES "cuda") - set(DBCSR_USE_ACCEL @USE_ACCEL@) enable_language(CUDA) find_dependency(CUDAToolkit) endif () if ("@USE_ACCEL@" MATCHES "hip") - set(DBCSR_USE_ACCEL @USE_ACCEL@) enable_language(HIP) find_dependency(hip) find_dependency(hipblas) @@ -37,19 +41,14 @@ if ("@USE_ACCEL@" MATCHES "opencl") find_dependency(OpenCL) endif () +set(DBCSR_USE_LIBXSMM @USE_LIBXSMM@) if (@USE_LIBXSMM@) - set(DBCSR_USE_LIBXSMM @USE_LIBXSMM@) - if (NOT TARGET xsmm) - find_library(DBCSR_LIBXSMM_LIBRARY xsmm - PATHS "@LIBXSMMROOT@/lib" NO_DEFAULT_PATH) - if (NOT DBCSR_LIBXSMM_LIBRARY) - find_library(DBCSR_LIBXSMM_LIBRARY xsmm) - endif () - if (DBCSR_LIBXSMM_LIBRARY) - add_library(xsmm UNKNOWN IMPORTED) - set_target_properties(xsmm PROPERTIES IMPORTED_LOCATION "${DBCSR_LIBXSMM_LIBRARY}") - endif () - endif () + find_dependency(libxsmm) +endif() + + set(@DBCSR_USE_LIBXSTREAM@ @@USE_LIBXSTREAM@) +if (@USE_LIBXSTREAM@) + find_dependency(libxstream) endif () include("${CMAKE_CURRENT_LIST_DIR}/DBCSRTargets.cmake") diff --git a/src/cmake/FindLIBXSMM.cmake b/src/cmake/FindLIBXSMM.cmake new file mode 100644 index 00000000000..41e48b10178 --- /dev/null +++ b/src/cmake/FindLIBXSMM.cmake @@ -0,0 +1,63 @@ +#!-------------------------------------------------------------------------------------------------! +#! DBCSR: A general program to perform molecular dynamics simulations ! +#! Copyright 2000-2026 DBCSR developers group ! +#! ! +#! SPDX-License-Identifier: GPL-2.0-or-later ! +#!-------------------------------------------------------------------------------------------------! + +include(FindPackageHandleStandardArgs) +find_package(PkgConfig QUIET) + +# Prefer pkg-config when available. +if(PKG_CONFIG_FOUND) + pkg_check_modules(DBCSR_LIBXSMM QUIET IMPORTED_TARGET GLOBAL libxsmm) +endif() + +# Optional explicit prefix hint. +set(_dbcsr_libxsmm_hints) +if(DBCSR_LIBXSMM_ROOT) + list(APPEND _dbcsr_libxsmm_hints "${DBCSR_LIBXSMM_ROOT}") +endif() + +# Fallback discovery when pkg-config did not populate usable values. +if(NOT DBCSR_LIBXSMM_INCLUDE_DIR) + find_path( + DBCSR_LIBXSMM_INCLUDE_DIR + NAMES libxsmm.h + HINTS ${_dbcsr_libxsmm_hints} + PATH_SUFFIXES include) +endif() + +if(NOT DBCSR_LIBXSMM_LIBRARY) + find_library( + DBCSR_LIBXSMM_LIBRARY + NAMES xsmm + HINTS ${_dbcsr_libxsmm_hints} + PATH_SUFFIXES lib lib64) +endif() + +# Reconcile pkg-config variables with the fallback naming used below. +if(NOT DBCSR_LIBXSMM_INCLUDE_DIR AND DBCSR_LIBXSMM_INCLUDE_DIRS) + list(GET DBCSR_LIBXSMM_INCLUDE_DIRS 0 DBCSR_LIBXSMM_INCLUDE_DIR) +endif() + +if(NOT DBCSR_LIBXSMM_LIBRARY AND DBCSR_LIBXSMM_LINK_LIBRARIES) + list(GET DBCSR_LIBXSMM_LINK_LIBRARIES 0 DBCSR_LIBXSMM_LIBRARY) +endif() + +find_package_handle_standard_args(LIBXSMM REQUIRED_VARS DBCSR_LIBXSMM_INCLUDE_DIR + DBCSR_LIBXSMM_LIBRARY) + +if(NOT TARGET dbcsr::libxsmm) + if(TARGET PkgConfig::DBCSR_LIBXSMM) + add_library(dbcsr::libxsmm ALIAS PkgConfig::DBCSR_LIBXSMM) + else() + add_library(dbcsr::libxsmm INTERFACE IMPORTED) + set_target_properties( + dbcsr::libxsmm + PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${DBCSR_LIBXSMM_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES "${DBCSR_LIBXSMM_LIBRARY}") + endif() +endif() + +mark_as_advanced(DBCSR_LIBXSMM_INCLUDE_DIR DBCSR_LIBXSMM_LIBRARY) From 3c51eb19e04e46bde900dc47adbfa5ad847a07f4 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 19:22:34 +0000 Subject: [PATCH 22/46] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- CMakeLists.txt | 43 ++++--- src/CMakeLists.txt | 217 ++++++++++++++++++------------------ src/cmake/FindLIBXSMM.cmake | 38 +++---- 3 files changed, 154 insertions(+), 144 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 641e0ad09b8..bff1e7ed677 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,8 @@ cmake_minimum_required(VERSION 3.22) set(CMAKE_INTERPROCEDURAL_OPTIMIZATION FALSE FORCE) # include our cmake snippets -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_CURRENT_SOURCE_DIR}/src/cmake) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake + ${CMAKE_CURRENT_SOURCE_DIR}/src/cmake) # DBCSR's source directory set(DBCSR_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src) @@ -61,17 +62,15 @@ else () endforeach () endif () - project( dbcsr DESCRIPTION "DBCSR: Distributed Block Compressed Sparse Row matrix library (https://dbcsr.cp2k.org)" - LANGUAGES Fortran C CXX -) -set(dbcsr_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_GIT}) + LANGUAGES Fortran C CXX) +set(dbcsr_VERSION + ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_GIT}) set(dbcsr_APIVERSION ${VERSION_MAJOR}.${VERSION_MINOR}) - # ================================================================================================= # OPTIONS include(CMakeDependentOption) @@ -104,7 +103,10 @@ set(TEST_OMP_THREADS set(USE_ACCEL "none" - CACHE STRING "BBuild with acceleration support (none (default value), opencl, cuda, hip)") + CACHE + STRING + "BBuild with acceleration support (none (default value), opencl, cuda, hip)" +) set_property(CACHE USE_ACCEL PROPERTY STRINGS none opencl cuda hip) string(TOLOWER "${USE_ACCEL}" USE_ACCEL) @@ -118,16 +120,23 @@ set(SUPPORTED_CUDA_ARCHITECTURES H100) set(SUPPORTED_HIP_ARCHITECTURES Mi50 Mi100 Mi250 Mi300 Mi350) -set(WITH_GPU "P100" CACHE STRING - "Select GPU arch. and embed parameters (default: CUDA/HIP=P100, OPENCL=all)") -set_property(CACHE WITH_GPU PROPERTY STRINGS - ${SUPPORTED_CUDA_ARCHITECTURES} ${SUPPORTED_HIP_ARCHITECTURES}) +set(WITH_GPU + "P100" + CACHE + STRING + "Select GPU arch. and embed parameters (default: CUDA/HIP=P100, OPENCL=all)" +) +set_property(CACHE WITH_GPU PROPERTY STRINGS ${SUPPORTED_CUDA_ARCHITECTURES} + ${SUPPORTED_HIP_ARCHITECTURES}) # Override default for OpenCL: empty string means "all" if (NOT DEFINED WITH_GPU AND USE_ACCEL STREQUAL "opencl") -set(WITH_GPU "" CACHE STRING - "Select GPU arch. and embed parameters (default: CUDA/HIP=P100, OPENCL=all)" - FORCE) + set(WITH_GPU + "" + CACHE + STRING + "Select GPU arch. and embed parameters (default: CUDA/HIP=P100, OPENCL=all)" + FORCE) endif () set(WITH_GPU_PARAMS "${WITH_GPU}") @@ -166,12 +175,12 @@ if (USE_LIBXS) find_package(libxs REQUIRED) # not needed at all add_library(DBCSR::LIBXS ALIAS libxs::libxs) -endif() +endif () # libxsmm can only be activated when libxs is on. if (USE_LIBXSMM) find_package(LIBXSMM REQUIRED) -endif() +endif () # =================================== BLAS & LAPACK, PkgConfig find_package(LAPACK REQUIRED) # needed for some of the integrated test routines, @@ -235,8 +244,6 @@ if (NOT USE_ACCEL MATCHES "none") set(DBCSR_ACC_HEADER acc/acc.h acc/acc_bench.h acc/acc_libsmm.h) endif () - - if (USE_ACCEL MATCHES "opencl") if (DEFINED ENV{CMPLR_ROOT}) list(APPEND CMAKE_PREFIX_PATH "$ENV{CMPLR_ROOT}") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bca51a6284c..2cbb35925fa 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -106,41 +106,41 @@ add_fypp_sources( work/dbcsr_work_operations.F) set(DBCSR_HIP_AND_CUDA_SRCS - acc/libsmm_acc/libsmm_acc_benchmark.cpp - acc/libsmm_acc/libsmm_acc_init.cpp - acc/libsmm_acc/libsmm_acc.cpp - acc/cuda_hip/calculate_norms.cpp - acc/cuda_hip/acc_blas.cpp - acc/cuda_hip/acc_dev.cpp - acc/cuda_hip/acc_error.cpp - acc/cuda_hip/acc_event.cpp - acc/cuda_hip/acc_utils.cpp - acc/cuda_hip/acc_init.cpp - acc/cuda_hip/acc_mem.cpp - acc/cuda_hip/acc_stream.cpp) + acc/libsmm_acc/libsmm_acc_benchmark.cpp + acc/libsmm_acc/libsmm_acc_init.cpp + acc/libsmm_acc/libsmm_acc.cpp + acc/cuda_hip/calculate_norms.cpp + acc/cuda_hip/acc_blas.cpp + acc/cuda_hip/acc_dev.cpp + acc/cuda_hip/acc_error.cpp + acc/cuda_hip/acc_event.cpp + acc/cuda_hip/acc_utils.cpp + acc/cuda_hip/acc_init.cpp + acc/cuda_hip/acc_mem.cpp + acc/cuda_hip/acc_stream.cpp) set(DBCSR_CUDA_SRCS ${DBCSR_HIP_AND_CUDA_SRCS} acc/cuda/acc_cuda.cpp - acc/cuda/dbcsr_cuda_nvtx_cu.cpp) + acc/cuda/dbcsr_cuda_nvtx_cu.cpp) set(DBCSR_HIP_SRCS ${DBCSR_HIP_AND_CUDA_SRCS} acc/hip/acc_hip.cpp) if (USE_ACCEL MATCHES "hip") set_source_files_properties(acc/cuda_hip/calculate_norms.cpp - PROPERTIES LANGUAGE HIP) + PROPERTIES LANGUAGE HIP) set_source_files_properties(acc/cuda_hip/calculate_norms.cpp - PROPERTIES COMPILE_FLAGS "-fPIE") + PROPERTIES COMPILE_FLAGS "-fPIE") elseif (USE_ACCEL MATCHES "cuda") set_source_files_properties(acc/cuda_hip/calculate_norms.cpp - PROPERTIES LANGUAGE CUDA) + PROPERTIES LANGUAGE CUDA) set_source_files_properties(acc/cuda_hip/calculate_norms.cpp - PROPERTIES COMPILE_FLAGS "--x cu") + PROPERTIES COMPILE_FLAGS "--x cu") endif () # OpenCL backend: SMM from LIBXSTREAM samples, ACC from LIBXSTREAM library set(DBCSR_SMM_DIR "${DBCSR_LIBXSTREAM_SMM_DIR}") set(DBCSR_OPENCL_SRCS - "${DBCSR_SMM_DIR}/smm_acc.c" "${DBCSR_SMM_DIR}/smm_trans.c" - "${DBCSR_SMM_DIR}/smm_params.c" "${DBCSR_SMM_DIR}/smm_kernel.c") + "${DBCSR_SMM_DIR}/smm_acc.c" "${DBCSR_SMM_DIR}/smm_trans.c" + "${DBCSR_SMM_DIR}/smm_params.c" "${DBCSR_SMM_DIR}/smm_kernel.c") # set the __SHORT_FILE__ per file for dbcsr sources foreach (dbcsr_src ${DBCSR_FORTRAN_SRCS}) @@ -154,7 +154,7 @@ endforeach () if ((CMAKE_Fortran_COMPILER_ID STREQUAL "GNU") AND (CMAKE_Fortran_COMPILER_VERSION VERSION_GREATER_EQUAL 10)) set_source_files_properties(mpi/dbcsr_mpiwrap.F PROPERTIES COMPILE_FLAGS - -Wno-error) + -Wno-error) endif () set(DBCSR_SRCS ${DBCSR_FORTRAN_SRCS}) @@ -176,14 +176,14 @@ add_library(dbcsr ${DBCSR_SRCS}) set_target_properties( dbcsr PROPERTIES VERSION ${dbcsr_VERSION} - SOVERSION ${dbcsr_APIVERSION} - POSITION_INDEPENDENT_CODE ON) + SOVERSION ${dbcsr_APIVERSION} + POSITION_INDEPENDENT_CODE ON) if (USE_ACCEL MATCHES "hip") set_target_properties(dbcsr PROPERTIES HIP_ARCHITECTURES "${ACC_ARCH_NUMBER}") elseif (USE_ACCEL MATCHES "cuda") set_target_properties(dbcsr PROPERTIES CUDA_ARCHITECTURES - "${ACC_ARCH_NUMBER}") + "${ACC_ARCH_NUMBER}") endif () # What follows is an example of what should not be done. Compiling the libxs @@ -195,49 +195,52 @@ endif () # if (USE_LIBXS) -message(WARNING - "Compiling libxs_jit.F here is a workaround: this should be handled " - "by the libxs build system, not by DBCSR. It may also produce linking " - "warnings (e.g. DT_TEXTREL) when DBCSR is built as a shared library." - ) - get_target_property(DBCSR_LIBXS_INCLUDE_DIRS libxs::libxs INTERFACE_INCLUDE_DIRECTORIES) + message( + WARNING + "Compiling libxs_jit.F here is a workaround: this should be handled " + "by the libxs build system, not by DBCSR. It may also produce linking " + "warnings (e.g. DT_TEXTREL) when DBCSR is built as a shared library.") + get_target_property(DBCSR_LIBXS_INCLUDE_DIRS libxs::libxs + INTERFACE_INCLUDE_DIRECTORIES) find_path(DBCSR_LIBXS_FORTRAN_MODULE "libxs_jit.F" - HINTS ${DBCSR_LIBXS_INCLUDE_DIRS}) + HINTS ${DBCSR_LIBXS_INCLUDE_DIRS}) set_source_files_properties("${DBCSR_LIBXS_FORTRAN_MODULE}/libxs_jit.F" - POSITION_INDEPENDENT_CODE ON) + POSITION_INDEPENDENT_CODE ON) if (DBCSR_LIBXS_FORTRAN_MODULE) target_sources(dbcsr PRIVATE "${DBCSR_LIBXS_FORTRAN_MODULE}/libxs_jit.F") endif () -endif() - -target_compile_definitions(dbcsr PRIVATE __STATM_TOTAL - $<$:__LIBXS> - $<$:__BLAS> - $<$:__parallel> - $<$:__USE_MPI_F08> - $<$:__NO_STATM_ACCESS> - $<$:NDEBUG> - $<$:__LIBXSMM> - $<$:${LIBXSMM_COMPILE_DEFINITIONS}> -) +endif () + +target_compile_definitions( + dbcsr + PRIVATE __STATM_TOTAL + $<$:__LIBXS> + $<$:__BLAS> + $<$:__parallel> + $<$:__USE_MPI_F08> + $<$:__NO_STATM_ACCESS> + $<$:NDEBUG> + $<$:__LIBXSMM> + $<$:${LIBXSMM_COMPILE_DEFINITIONS}>) # Instead of resetting the compiler for MPI, we are adding the compiler flags # otherwise added by the mpifort-wrapper directly; based on hints from: # https://cmake.org/pipermail/cmake/2012-June/050991.html Here we assume that -# the MPI implementation found uses the same compiler as the Fortran compiler -# we found prior. Otherwise we might be adding incompatible compiler flags at -# this point. when built against MPI, a dbcsr consumer has to specify the MPI -# flags as well, therefore: PUBLIC -target_link_libraries(dbcsr PUBLIC - $<$:MPI::MPI_Fortran> - ${LAPACK_LIBRARIES} - $<$:libxs::libxs> - # replace by libxsmm::libxsmm if libxsmm uses cmake - ${BLAS_LIBRARIES} - $<$:dbcsr::libxsmm> - $<$:OpenMP::OpenMP_C> - $<$:OpenMP::OpenMP_CXX> - $<$:OpenMP::OpenMP_Fortran>) +# the MPI implementation found uses the same compiler as the Fortran compiler we +# found prior. Otherwise we might be adding incompatible compiler flags at this +# point. when built against MPI, a dbcsr consumer has to specify the MPI flags +# as well, therefore: PUBLIC +target_link_libraries( + dbcsr + PUBLIC $<$:MPI::MPI_Fortran> + ${LAPACK_LIBRARIES} + $<$:libxs::libxs> + # replace by libxsmm::libxsmm if libxsmm uses cmake + ${BLAS_LIBRARIES} + $<$:dbcsr::libxsmm> + $<$:OpenMP::OpenMP_C> + $<$:OpenMP::OpenMP_CXX> + $<$:OpenMP::OpenMP_Fortran>) if (BLAS_LIBRARIES MATCHES "mkl_") target_compile_definitions(dbcsr PRIVATE __MKL) @@ -250,14 +253,14 @@ if (APPLE) endif () target_include_directories( - dbcsr PRIVATE base + dbcsr + PRIVATE base PUBLIC $ - $ - # make sure dependencies of dbcsr find the dbcsr_api.mod file plus some files - # they usually include: - $) -# do not export those includes, but some srcs do an -# unprefixed include + $ + # make sure dependencies of dbcsr find the dbcsr_api.mod file plus some + # files they usually include: + $) +# do not export those includes, but some srcs do an unprefixed include set_target_properties(dbcsr PROPERTIES LINKER_LANGUAGE Fortran) @@ -268,18 +271,19 @@ if (USE_MPI) # the MPI implementation found uses the same compiler as the Fortran compiler # we found prior. Otherwise we might be adding incompatible compiler flags at # this point. when built against MPI, a dbcsr consumer has to specify the MPI - # flags as well, therefore: PUBLIC - # Workaround https://gitlab.kitware.com/cmake/cmake/-/issues/27231 - get_target_property(dbcsr_mpi_fortran_opts MPI::MPI_Fortran INTERFACE_COMPILE_OPTIONS) + # flags as well, therefore: PUBLIC Workaround + # https://gitlab.kitware.com/cmake/cmake/-/issues/27231 + get_target_property(dbcsr_mpi_fortran_opts MPI::MPI_Fortran + INTERFACE_COMPILE_OPTIONS) # very brittle if (dbcsr_mpi_fortran_opts) set_target_properties( - MPI::MPI_Fortran PROPERTIES INTERFACE_COMPILE_OPTIONS - "$<$:${dbcsr_mpi_fortran_opts}>") + MPI::MPI_Fortran + PROPERTIES INTERFACE_COMPILE_OPTIONS + "$<$:${dbcsr_mpi_fortran_opts}>") unset(dbcsr_mpi_fortran_opts) endif () -endif() - +endif () # todo, make this a bit better with opencl. if (USE_ACCEL MATCHES "cuda|hip") @@ -292,25 +296,25 @@ if (USE_ACCEL MATCHES "opencl|cuda|hip") target_compile_definitions( dbcsr PRIVATE __DBCSR_ACC - $<$:__CUDA> - $<$:__OPENCL> - $<$:ARCH_NUMBER=${ACC_ARCH_NUMBER}> - $<$:__HIP> - $<$:ARCH_NUMBER=${ACC_ARCH_NUMBER}> - $<$:__CUDA_PROFILING> - $<$:__HIP_PROFILING>) + $<$:__CUDA> + $<$:__OPENCL> + $<$:ARCH_NUMBER=${ACC_ARCH_NUMBER}> + $<$:__HIP> + $<$:ARCH_NUMBER=${ACC_ARCH_NUMBER}> + $<$:__CUDA_PROFILING> + $<$:__HIP_PROFILING>) if (USE_ACCEL MATCHES "opencl") target_compile_definitions(dbcsr PRIVATE __LIBXSTREAM) target_include_directories(dbcsr PRIVATE "${DBCSR_SMM_DIR}") set(DBCSR_SMM_KERNELS "${DBCSR_SMM_DIR}/kernels/multiply.cl" - "${DBCSR_SMM_DIR}/kernels/transpose.cl") + "${DBCSR_SMM_DIR}/kernels/transpose.cl") file(GLOB DBCSR_SMM_PARAMS "${DBCSR_SMM_DIR}/params/tune_multiply_*.csv") set(DBCSR_SMM_GENHDR "${DBCSR_SMM_DIR}/smm_kernels.h") add_custom_command( OUTPUT "${DBCSR_SMM_GENHDR}" COMMAND "${DBCSR_OPENCL_SCRIPT}" -I "${DBCSR_LIBXSTREAM_INCLUDE_DIR}" - ${DBCSR_SMM_KERNELS} ${DBCSR_SMM_PARAMS} "${DBCSR_SMM_GENHDR}" + ${DBCSR_SMM_KERNELS} ${DBCSR_SMM_PARAMS} "${DBCSR_SMM_GENHDR}" DEPENDS "${DBCSR_OPENCL_SCRIPT}" ${DBCSR_SMM_KERNELS} ${DBCSR_SMM_PARAMS} COMMENT "Generating OpenCL SMM kernel header") add_custom_target(dbcsr_smm_kernels DEPENDS "${DBCSR_SMM_GENHDR}") @@ -320,17 +324,17 @@ if (USE_ACCEL MATCHES "opencl|cuda|hip") target_link_libraries( dbcsr PRIVATE $<$:CUDA::cudart> - $<$:CUDA::cuda_driver> - $<$:CUDA::cublas> - $<$:CUDA::nvrtc> - $<$:CUDA::nvToolsExt> - $<$:roc::hipblas> - $<$:hiprtc::hiprtc> - $<$:hip::host> - $<$:roctx64> - $<$:roctracer64> - $<$:OpenCL::OpenCL> - $<$:libxstream::libxstream>) + $<$:CUDA::cuda_driver> + $<$:CUDA::cublas> + $<$:CUDA::nvrtc> + $<$:CUDA::nvToolsExt> + $<$:roc::hipblas> + $<$:hiprtc::hiprtc> + $<$:hip::host> + $<$:roctx64> + $<$:roctracer64> + $<$:OpenCL::OpenCL> + $<$:libxstream::libxstream>) endif () # ================================================================================================= @@ -338,7 +342,7 @@ endif () if (WITH_C_API) # Build the C API as a separate library add_fypp_sources(DBCSR_C_SRCS dbcsr.h dbcsr_api_c.F - tensors/dbcsr_tensor_api_c.F tensors/dbcsr_tensor.h) + tensors/dbcsr_tensor_api_c.F tensors/dbcsr_tensor.h) add_library(dbcsr_c ${DBCSR_C_SRCS}) set_target_properties(dbcsr_c PROPERTIES LINKER_LANGUAGE Fortran) @@ -346,19 +350,18 @@ if (WITH_C_API) set_target_properties( dbcsr_c PROPERTIES VERSION ${dbcsr_VERSION} - SOVERSION ${dbcsr_APIVERSION} - POSITION_INDEPENDENT_CODE ON) + SOVERSION ${dbcsr_APIVERSION} + POSITION_INDEPENDENT_CODE ON) - target_link_libraries(dbcsr_c - PUBLIC dbcsr MPI::MPI_C) # the C API always needs MPI + target_link_libraries(dbcsr_c PUBLIC dbcsr MPI::MPI_C) # the C API always + # needs MPI target_include_directories( dbcsr_c - PUBLIC - $ # change order so compiler - # first checks binary - # directory - $ - $) + PUBLIC $ # change order so + # compiler + # first checks binary directory + $ + $) endif () # ================================================================================================= @@ -379,9 +382,9 @@ if (NOT CMAKE_INSTALL_Fortran_MODULES) set(CMAKE_INSTALL_Fortran_MODULES "${CMAKE_INSTALL_INCLUDEDIR}") endif () install(FILES "${CMAKE_CURRENT_BINARY_DIR}/dbcsr_api.mod" - DESTINATION "${CMAKE_INSTALL_Fortran_MODULES}") + DESTINATION "${CMAKE_INSTALL_Fortran_MODULES}") install(FILES "${CMAKE_CURRENT_BINARY_DIR}/dbcsr_tensor_api.mod" - DESTINATION "${CMAKE_INSTALL_Fortran_MODULES}") + DESTINATION "${CMAKE_INSTALL_Fortran_MODULES}") if (WITH_C_API) install( @@ -392,7 +395,7 @@ if (WITH_C_API) ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}") install( FILES "${CMAKE_CURRENT_BINARY_DIR}/dbcsr.h" - "${CMAKE_CURRENT_BINARY_DIR}/tensors/dbcsr_tensor.h" + "${CMAKE_CURRENT_BINARY_DIR}/tensors/dbcsr_tensor.h" COMPONENT C DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") endif () @@ -420,6 +423,6 @@ install( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfig.cmake - ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfigVersion.cmake - ${PROJECT_SOURCE_DIR}/src/cmake/FindLIBXMM.cmake + ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfigVersion.cmake + ${PROJECT_SOURCE_DIR}/src/cmake/FindLIBXMM.cmake DESTINATION ${config_install_dir}) diff --git a/src/cmake/FindLIBXSMM.cmake b/src/cmake/FindLIBXSMM.cmake index 41e48b10178..9917df68a63 100644 --- a/src/cmake/FindLIBXSMM.cmake +++ b/src/cmake/FindLIBXSMM.cmake @@ -9,55 +9,55 @@ include(FindPackageHandleStandardArgs) find_package(PkgConfig QUIET) # Prefer pkg-config when available. -if(PKG_CONFIG_FOUND) +if (PKG_CONFIG_FOUND) pkg_check_modules(DBCSR_LIBXSMM QUIET IMPORTED_TARGET GLOBAL libxsmm) -endif() +endif () # Optional explicit prefix hint. set(_dbcsr_libxsmm_hints) -if(DBCSR_LIBXSMM_ROOT) +if (DBCSR_LIBXSMM_ROOT) list(APPEND _dbcsr_libxsmm_hints "${DBCSR_LIBXSMM_ROOT}") -endif() +endif () # Fallback discovery when pkg-config did not populate usable values. -if(NOT DBCSR_LIBXSMM_INCLUDE_DIR) +if (NOT DBCSR_LIBXSMM_INCLUDE_DIR) find_path( DBCSR_LIBXSMM_INCLUDE_DIR NAMES libxsmm.h HINTS ${_dbcsr_libxsmm_hints} PATH_SUFFIXES include) -endif() +endif () -if(NOT DBCSR_LIBXSMM_LIBRARY) +if (NOT DBCSR_LIBXSMM_LIBRARY) find_library( DBCSR_LIBXSMM_LIBRARY NAMES xsmm HINTS ${_dbcsr_libxsmm_hints} PATH_SUFFIXES lib lib64) -endif() +endif () # Reconcile pkg-config variables with the fallback naming used below. -if(NOT DBCSR_LIBXSMM_INCLUDE_DIR AND DBCSR_LIBXSMM_INCLUDE_DIRS) +if (NOT DBCSR_LIBXSMM_INCLUDE_DIR AND DBCSR_LIBXSMM_INCLUDE_DIRS) list(GET DBCSR_LIBXSMM_INCLUDE_DIRS 0 DBCSR_LIBXSMM_INCLUDE_DIR) -endif() +endif () -if(NOT DBCSR_LIBXSMM_LIBRARY AND DBCSR_LIBXSMM_LINK_LIBRARIES) +if (NOT DBCSR_LIBXSMM_LIBRARY AND DBCSR_LIBXSMM_LINK_LIBRARIES) list(GET DBCSR_LIBXSMM_LINK_LIBRARIES 0 DBCSR_LIBXSMM_LIBRARY) -endif() +endif () -find_package_handle_standard_args(LIBXSMM REQUIRED_VARS DBCSR_LIBXSMM_INCLUDE_DIR - DBCSR_LIBXSMM_LIBRARY) +find_package_handle_standard_args( + LIBXSMM REQUIRED_VARS DBCSR_LIBXSMM_INCLUDE_DIR DBCSR_LIBXSMM_LIBRARY) -if(NOT TARGET dbcsr::libxsmm) - if(TARGET PkgConfig::DBCSR_LIBXSMM) +if (NOT TARGET dbcsr::libxsmm) + if (TARGET PkgConfig::DBCSR_LIBXSMM) add_library(dbcsr::libxsmm ALIAS PkgConfig::DBCSR_LIBXSMM) - else() + else () add_library(dbcsr::libxsmm INTERFACE IMPORTED) set_target_properties( dbcsr::libxsmm PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${DBCSR_LIBXSMM_INCLUDE_DIR}" INTERFACE_LINK_LIBRARIES "${DBCSR_LIBXSMM_LIBRARY}") - endif() -endif() + endif () +endif () mark_as_advanced(DBCSR_LIBXSMM_INCLUDE_DIR DBCSR_LIBXSMM_LIBRARY) From e2597282a1a017af9d81c366990180122a0e6b51 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 19:28:11 +0000 Subject: [PATCH 23/46] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bff1e7ed677..5ab09315bdf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,7 +81,8 @@ option(USE_MPI "Build with MPI support" OFF) option(BUILD_TESTING "Build dbcsr unit tests" OFF) option(USE_LIBXS "Use LIBXS for host-side Small Matrix Multiplication" OFF) -cmake_dependent_option(USE_LIBXSMM "Use LIBXSMM for JIT-compiled GEMM kernels" OFF "USE_LIBXS" OFF) +cmake_dependent_option(USE_LIBXSMM "Use LIBXSMM for JIT-compiled GEMM kernels" + OFF "USE_LIBXS" OFF) option(WITH_CUDA_PROFILING "Enable profiling within CUDA" OFF) option(WITH_HIP_PROFILING "Enable profiling within HIP" OFF) From c42aeabf68f2cc2c9787e22c585cbc4989e22a97 Mon Sep 17 00:00:00 2001 From: Growl Date: Tue, 9 Jun 2026 14:24:14 +0800 Subject: [PATCH 24/46] Update dependencies in CI --- .github/workflows/testing-linux.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/testing-linux.yml b/.github/workflows/testing-linux.yml index bda60e4031e..a8bac892c53 100644 --- a/.github/workflows/testing-linux.yml +++ b/.github/workflows/testing-linux.yml @@ -8,11 +8,11 @@ on: env: LIBXS_GIT_REPOSITORY: https://github.com/hfp/libxs.git - LIBXS_GIT_TAG: eccf0e623af8b4c394cb2e60e602d52cb5b65be9 + LIBXS_GIT_TAG: f0bb0f61ea200c9b7af012c699eb5122e891be6f LIBXSTREAM_GIT_REPOSITORY: https://github.com/hfp/libxstream.git - LIBXSTREAM_GIT_TAG: 1d6ca9732db6d435af858ccd09997b44fbe3bffb + LIBXSTREAM_GIT_TAG: 9cb9b895bb7200f2109bcc7ecdace6b4edad242d LIBXSMM_GIT_REPOSITORY: https://github.com/Growl1234/libxsmm.git - LIBXSMM_GIT_TAG: 47548ddea6e5b63c3602b51100660c14c8b2d54c + LIBXSMM_GIT_TAG: b35d767abffc7bca845a81f7e408fec68300821c jobs: ################################################################################## From f09962d7bd1809f7e9536462ee7e8b74b28fd5b1 Mon Sep 17 00:00:00 2001 From: Growl Date: Tue, 9 Jun 2026 14:52:05 +0800 Subject: [PATCH 25/46] Avoid sending empty states to acc --- CMakeLists.txt | 31 +++++++++++++++++++++---------- src/CMakeLists.txt | 22 +++++++++++----------- tests/CMakeLists.txt | 4 ++-- 3 files changed, 34 insertions(+), 23 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5ab09315bdf..c6597ee693c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,12 +81,11 @@ option(USE_MPI "Build with MPI support" OFF) option(BUILD_TESTING "Build dbcsr unit tests" OFF) option(USE_LIBXS "Use LIBXS for host-side Small Matrix Multiplication" OFF) -cmake_dependent_option(USE_LIBXSMM "Use LIBXSMM for JIT-compiled GEMM kernels" - OFF "USE_LIBXS" OFF) - option(WITH_CUDA_PROFILING "Enable profiling within CUDA" OFF) option(WITH_HIP_PROFILING "Enable profiling within HIP" OFF) +cmake_dependent_option(USE_LIBXSMM "Use LIBXSMM for JIT-compiled GEMM kernels" + OFF "USE_LIBXS" OFF) cmake_dependent_option(USE_MPI_F08 "Build with the mpi_f08 module support" OFF "USE_MPI" OFF) # MPI_F08 is a module included in MPI cmake_dependent_option( @@ -108,9 +107,21 @@ set(USE_ACCEL STRING "BBuild with acceleration support (none (default value), opencl, cuda, hip)" ) -set_property(CACHE USE_ACCEL PROPERTY STRINGS none opencl cuda hip) +set(_DBCSR_SUPPORTED_ACCEL_VALUES none opencl cuda hip) +set_property(CACHE USE_ACCEL PROPERTY STRINGS ${_DBCSR_SUPPORTED_ACCEL_VALUES}) string(TOLOWER "${USE_ACCEL}" USE_ACCEL) +if (NOT USE_ACCEL IN_LIST _DBCSR_SUPPORTED_ACCEL_VALUES) + message( + FATAL_ERROR + "Unsupported USE_ACCEL='${USE_ACCEL}'. Supported values are: ${_DBCSR_SUPPORTED_ACCEL_VALUES}") +endif () + +set(DBCSR_WITH_ACCEL OFF) +if (NOT USE_ACCEL STREQUAL "none") + set(DBCSR_WITH_ACCEL ON) +endif () + set(SUPPORTED_CUDA_ARCHITECTURES K20X K40 @@ -147,7 +158,7 @@ set_property(CACHE WITH_GPU PROPERTY STRINGS ${SUPPORTED_CUDA_ARCHITECTURES} # ================================================================================================= # LANGUAGES AND TESTING -if ((WITH_C_API AND WITH_EXAMPLES) OR (NOT USE_ACCEL MATCHES "none")) +if ((WITH_C_API AND WITH_EXAMPLES) OR DBCSR_WITH_ACCEL) enable_language(CXX) enable_language(C) @@ -241,11 +252,11 @@ endif () # =================================== GPU backends -if (NOT USE_ACCEL MATCHES "none") +if (DBCSR_WITH_ACCEL) set(DBCSR_ACC_HEADER acc/acc.h acc/acc_bench.h acc/acc_libsmm.h) endif () -if (USE_ACCEL MATCHES "opencl") +if (USE_ACCEL STREQUAL "opencl") if (DEFINED ENV{CMPLR_ROOT}) list(APPEND CMAKE_PREFIX_PATH "$ENV{CMPLR_ROOT}") endif () @@ -270,7 +281,7 @@ if (USE_ACCEL MATCHES "opencl") list(GET LIBXSTREAM_INCLUDE_DIRS 0 DBCSR_LIBXSTREAM_INCLUDE_DIR) endif () -if (USE_ACCEL MATCHES "cuda|hip") +if (USE_ACCEL STREQUAL "cuda" OR USE_ACCEL STREQUAL "hip") set(GPU_ARCH_NUMBER_K20X 35) set(GPU_ARCH_NUMBER_K40 35) set(GPU_ARCH_NUMBER_K80 37) @@ -285,7 +296,7 @@ if (USE_ACCEL MATCHES "cuda|hip") set(GPU_ARCH_NUMBER_Mi350 gfx950) endif () -if (USE_ACCEL MATCHES "cuda") +if (USE_ACCEL STREQUAL "cuda") enable_language(CUDA) find_package(CUDAToolkit REQUIRED) @@ -315,7 +326,7 @@ if (USE_ACCEL MATCHES "cuda") message(STATUS "GPU profiling enabled: " ${WITH_CUDA_PROFILING}) endif () -if (USE_ACCEL MATCHES "hip") +if (USE_ACCEL STREQUAL "hip") if (NOT CMAKE_HIP_ARCHITECTURES) set(CMAKE_HIP_ARCHITECTURES OFF) endif () diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2cbb35925fa..221cd082d4a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -124,12 +124,12 @@ set(DBCSR_CUDA_SRCS ${DBCSR_HIP_AND_CUDA_SRCS} acc/cuda/acc_cuda.cpp set(DBCSR_HIP_SRCS ${DBCSR_HIP_AND_CUDA_SRCS} acc/hip/acc_hip.cpp) -if (USE_ACCEL MATCHES "hip") +if (USE_ACCEL STREQUAL "hip") set_source_files_properties(acc/cuda_hip/calculate_norms.cpp PROPERTIES LANGUAGE HIP) set_source_files_properties(acc/cuda_hip/calculate_norms.cpp PROPERTIES COMPILE_FLAGS "-fPIE") -elseif (USE_ACCEL MATCHES "cuda") +elseif (USE_ACCEL STREQUAL "cuda") set_source_files_properties(acc/cuda_hip/calculate_norms.cpp PROPERTIES LANGUAGE CUDA) set_source_files_properties(acc/cuda_hip/calculate_norms.cpp @@ -159,11 +159,11 @@ endif () set(DBCSR_SRCS ${DBCSR_FORTRAN_SRCS}) -if (USE_ACCEL MATCHES "cuda") +if (USE_ACCEL STREQUAL "cuda") set(DBCSR_SRCS ${DBCSR_SRCS} ${DBCSR_CUDA_SRCS}) -elseif (USE_ACCEL MATCHES "hip") +elseif (USE_ACCEL STREQUAL "hip") set(DBCSR_SRCS ${DBCSR_SRCS} ${DBCSR_HIP_SRCS}) -elseif (USE_ACCEL MATCHES "opencl") +elseif (USE_ACCEL STREQUAL "opencl") set(DBCSR_SRCS ${DBCSR_SRCS} ${DBCSR_OPENCL_SRCS}) endif () @@ -179,9 +179,9 @@ set_target_properties( SOVERSION ${dbcsr_APIVERSION} POSITION_INDEPENDENT_CODE ON) -if (USE_ACCEL MATCHES "hip") +if (USE_ACCEL STREQUAL "hip") set_target_properties(dbcsr PROPERTIES HIP_ARCHITECTURES "${ACC_ARCH_NUMBER}") -elseif (USE_ACCEL MATCHES "cuda") +elseif (USE_ACCEL STREQUAL "cuda") set_target_properties(dbcsr PROPERTIES CUDA_ARCHITECTURES "${ACC_ARCH_NUMBER}") endif () @@ -286,13 +286,13 @@ if (USE_MPI) endif () # todo, make this a bit better with opencl. -if (USE_ACCEL MATCHES "cuda|hip") +if (USE_ACCEL STREQUAL "cuda" OR USE_ACCEL STREQUAL "hip") add_subdirectory(acc/libsmm_acc) endif () # OpenCL SMM is provided by LIBXSTREAM (no local subdirectory) -if (USE_ACCEL MATCHES "opencl|cuda|hip") +if (DBCSR_WITH_ACCEL) target_compile_definitions( dbcsr PRIVATE __DBCSR_ACC @@ -304,7 +304,7 @@ if (USE_ACCEL MATCHES "opencl|cuda|hip") $<$:__CUDA_PROFILING> $<$:__HIP_PROFILING>) - if (USE_ACCEL MATCHES "opencl") + if (USE_ACCEL STREQUAL "opencl") target_compile_definitions(dbcsr PRIVATE __LIBXSTREAM) target_include_directories(dbcsr PRIVATE "${DBCSR_SMM_DIR}") set(DBCSR_SMM_KERNELS "${DBCSR_SMM_DIR}/kernels/multiply.cl" @@ -400,7 +400,7 @@ if (WITH_C_API) DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") endif () -if (USE_ACCEL MATCHES "opencl") +if (USE_ACCEL STREQUAL "opencl") foreach (FILE ${DBCSR_ACC_HEADER}) cmake_path(GET FILE PARENT_PATH SUBDIR) install(FILES "${FILE}" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${SUBDIR}") diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 50cb549c41a..564df07b074 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -73,7 +73,7 @@ set(DBCSR_TESTS_FTN dbcsr_tas_unittest dbcsr_test_csr_conversions) -if (USE_ACCEL) +if (DBCSR_WITH_ACCEL) set(DBCSR_TESTS_BACKEND dbcsr_acc_test) if (TARGET DBCSR::LIBXS) list(APPEND DBCSR_TESTS_BACKEND acc_bench) @@ -242,7 +242,7 @@ add_custom_target( BYPRODUCTS libsmm_acc_timer_multiply.cpp COMMENT "Generate tests/generate_libsmm_acc_timer_multiply.cpp") -if (USE_ACCEL MATCHES "cuda|hip") +if (USE_ACCEL STREQUAL "cuda" OR USE_ACCEL STREQUAL "hip") # All libsmm_acc tests set(LIBSMM_ACC_TESTS_SRCS From c0d8959894398d940e2628516cbc3f8af4b40adf Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 06:53:15 +0000 Subject: [PATCH 26/46] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c6597ee693c..6166159befb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -114,7 +114,8 @@ string(TOLOWER "${USE_ACCEL}" USE_ACCEL) if (NOT USE_ACCEL IN_LIST _DBCSR_SUPPORTED_ACCEL_VALUES) message( FATAL_ERROR - "Unsupported USE_ACCEL='${USE_ACCEL}'. Supported values are: ${_DBCSR_SUPPORTED_ACCEL_VALUES}") + "Unsupported USE_ACCEL='${USE_ACCEL}'. Supported values are: ${_DBCSR_SUPPORTED_ACCEL_VALUES}" + ) endif () set(DBCSR_WITH_ACCEL OFF) From 1b1770e683f10f0e929990c6d38f9daebd86af16 Mon Sep 17 00:00:00 2001 From: Growl Date: Tue, 9 Jun 2026 15:11:34 +0800 Subject: [PATCH 27/46] Fix typo --- src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 221cd082d4a..bd3b6a15737 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -424,5 +424,5 @@ install( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfigVersion.cmake - ${PROJECT_SOURCE_DIR}/src/cmake/FindLIBXMM.cmake + ${PROJECT_SOURCE_DIR}/src/cmake/FindLIBXSMM.cmake DESTINATION ${config_install_dir}) From 129b27c00c8efc093c5d37b6de7c08200f0a6012 Mon Sep 17 00:00:00 2001 From: Growl Date: Tue, 9 Jun 2026 15:15:04 +0800 Subject: [PATCH 28/46] Update libxstream (executable tool_opencl.sh) --- .github/workflows/testing-linux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testing-linux.yml b/.github/workflows/testing-linux.yml index a8bac892c53..b924399e58a 100644 --- a/.github/workflows/testing-linux.yml +++ b/.github/workflows/testing-linux.yml @@ -10,7 +10,7 @@ env: LIBXS_GIT_REPOSITORY: https://github.com/hfp/libxs.git LIBXS_GIT_TAG: f0bb0f61ea200c9b7af012c699eb5122e891be6f LIBXSTREAM_GIT_REPOSITORY: https://github.com/hfp/libxstream.git - LIBXSTREAM_GIT_TAG: 9cb9b895bb7200f2109bcc7ecdace6b4edad242d + LIBXSTREAM_GIT_TAG: 34f349ecc4ba762a9f651b9e79891b7f34ed2b71 LIBXSMM_GIT_REPOSITORY: https://github.com/Growl1234/libxsmm.git LIBXSMM_GIT_TAG: b35d767abffc7bca845a81f7e408fec68300821c From bb6b7d9e42b6539bc0b5a990ec4f13f30955f638 Mon Sep 17 00:00:00 2001 From: Growl Date: Tue, 9 Jun 2026 15:25:44 +0800 Subject: [PATCH 29/46] Define __LIBXS for accelerator tests --- tests/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 564df07b074..11650d5b5ac 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -193,6 +193,7 @@ if (NOT USE_MPI) endif () if (TARGET DBCSR::LIBXS) target_link_libraries(${dbcsr_test_backend} PRIVATE DBCSR::LIBXS) + target_compile_definitions(${dbcsr_test_backend} PRIVATE __LIBXS) endif () if (LIBXSMM_FOUND OR LIBXSMM_FETCHED) target_compile_definitions( From 47d1488bb8da5b1108034813365397fc6fccadc7 Mon Sep 17 00:00:00 2001 From: Growl Date: Tue, 9 Jun 2026 15:59:17 +0800 Subject: [PATCH 30/46] Coverage: Skip libxs* files combined into DBCSR build --- .github/workflows/testing-linux.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/testing-linux.yml b/.github/workflows/testing-linux.yml index b924399e58a..e6612dc6d92 100644 --- a/.github/workflows/testing-linux.yml +++ b/.github/workflows/testing-linux.yml @@ -315,7 +315,15 @@ jobs: run: | mkdir -p build/src mv dbcsr.h tensors build/src/ - echo *.info | xargs printf -- '-a %s\n' | xargs lcov -o merged.info + echo *.info | xargs printf -- '-a %s\n' | xargs lcov -o merged.raw.info + + lcov --remove merged.raw.info \ + '*/libxs_procs.fi' \ + '*/libxs_jit.F' \ + '*/deps/install/*' \ + '*/_deps/*' \ + -o merged.info + genhtml merged.info -o htmlcov lcov --summary merged.info From 98792fa02b29247b37221a8ab1a213021358579f Mon Sep 17 00:00:00 2001 From: Growl Date: Tue, 9 Jun 2026 17:01:52 +0800 Subject: [PATCH 31/46] Update dependencies --- .github/workflows/testing-linux.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/testing-linux.yml b/.github/workflows/testing-linux.yml index e6612dc6d92..e56fbcf4e2c 100644 --- a/.github/workflows/testing-linux.yml +++ b/.github/workflows/testing-linux.yml @@ -8,9 +8,9 @@ on: env: LIBXS_GIT_REPOSITORY: https://github.com/hfp/libxs.git - LIBXS_GIT_TAG: f0bb0f61ea200c9b7af012c699eb5122e891be6f + LIBXS_GIT_TAG: 0a157189979edfd94057c59724ae6eb69862996b LIBXSTREAM_GIT_REPOSITORY: https://github.com/hfp/libxstream.git - LIBXSTREAM_GIT_TAG: 34f349ecc4ba762a9f651b9e79891b7f34ed2b71 + LIBXSTREAM_GIT_TAG: 16bb6799310d78da4b6698d2227b52270310ba56 LIBXSMM_GIT_REPOSITORY: https://github.com/Growl1234/libxsmm.git LIBXSMM_GIT_TAG: b35d767abffc7bca845a81f7e408fec68300821c From 8e02f0ee3d0dbf0a5ff2befd372f20802ad4b2ab Mon Sep 17 00:00:00 2001 From: Growl Date: Tue, 9 Jun 2026 17:36:06 +0800 Subject: [PATCH 32/46] Decide which target for libxsmm to use after find_package --- CMakeLists.txt | 8 ++++++++ src/CMakeLists.txt | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6166159befb..2b3367903d7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -193,6 +193,14 @@ endif () # libxsmm can only be activated when libxs is on. if (USE_LIBXSMM) find_package(LIBXSMM REQUIRED) + if (TARGET libxsmm::libxsmm) + set(DBCSR_LIBXSMM_TARGET libxsmm::libxsmm) + elseif (TARGET dbcsr::libxsmm) + set(DBCSR_LIBXSMM_TARGET dbcsr::libxsmm) + else () + message(FATAL_ERROR + "USE_LIBXSMM=ON, but neither libxsmm::libxsmm nor dbcsr::libxsmm exists") + endif () endif () # =================================== BLAS & LAPACK, PkgConfig diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bd3b6a15737..0f205342982 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -237,7 +237,7 @@ target_link_libraries( $<$:libxs::libxs> # replace by libxsmm::libxsmm if libxsmm uses cmake ${BLAS_LIBRARIES} - $<$:dbcsr::libxsmm> + $<$:${DBCSR_LIBXSMM_TARGET}> $<$:OpenMP::OpenMP_C> $<$:OpenMP::OpenMP_CXX> $<$:OpenMP::OpenMP_Fortran>) From bd13625a410c8feb3463b0e684f0fec67c7d0821 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 09:37:42 +0000 Subject: [PATCH 33/46] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- CMakeLists.txt | 6 ++++-- src/CMakeLists.txt | 2 +- src/cmake/DBCSRConfig.cmake.in | 5 +++++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2b3367903d7..a8411fb2158 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -198,8 +198,10 @@ if (USE_LIBXSMM) elseif (TARGET dbcsr::libxsmm) set(DBCSR_LIBXSMM_TARGET dbcsr::libxsmm) else () - message(FATAL_ERROR - "USE_LIBXSMM=ON, but neither libxsmm::libxsmm nor dbcsr::libxsmm exists") + message( + FATAL_ERROR + "USE_LIBXSMM=ON, but neither libxsmm::libxsmm nor dbcsr::libxsmm exists" + ) endif () endif () diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0f205342982..37fe099cd27 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -221,7 +221,7 @@ target_compile_definitions( $<$:__NO_STATM_ACCESS> $<$:NDEBUG> $<$:__LIBXSMM> - $<$:${LIBXSMM_COMPILE_DEFINITIONS}>) + $<$:${DBCSR_LIBXSMM_TARGET}>) # Instead of resetting the compiler for MPI, we are adding the compiler flags # otherwise added by the mpifort-wrapper directly; based on hints from: diff --git a/src/cmake/DBCSRConfig.cmake.in b/src/cmake/DBCSRConfig.cmake.in index 13ad24996e8..c6172c009a3 100644 --- a/src/cmake/DBCSRConfig.cmake.in +++ b/src/cmake/DBCSRConfig.cmake.in @@ -44,6 +44,11 @@ endif () set(DBCSR_USE_LIBXSMM @USE_LIBXSMM@) if (@USE_LIBXSMM@) find_dependency(libxsmm) + if(NOT TARGET dbcsr::libxsmm) + add_library(dbcsr::libxsmm INTERFACE IMPORTED) + set_target_properties(dbcsr::libxsmm PROPERTIES + INTERFACE_LINK_LIBRARIES libxsmm::libxsmm) + endif() endif() set(@DBCSR_USE_LIBXSTREAM@ @@USE_LIBXSTREAM@) From e8afae74f5385c2f3b49c488f20b5c1bc68af081 Mon Sep 17 00:00:00 2001 From: Growl Date: Tue, 9 Jun 2026 20:12:27 +0800 Subject: [PATCH 34/46] Deal with libxsmm config package target --- CMakeLists.txt | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a8411fb2158..911232a4d53 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -192,16 +192,12 @@ endif () # libxsmm can only be activated when libxs is on. if (USE_LIBXSMM) - find_package(LIBXSMM REQUIRED) + find_package(libxsmm CONFIG QUIET) if (TARGET libxsmm::libxsmm) set(DBCSR_LIBXSMM_TARGET libxsmm::libxsmm) - elseif (TARGET dbcsr::libxsmm) + else() + find_package(LIBXSMM REQUIRED) set(DBCSR_LIBXSMM_TARGET dbcsr::libxsmm) - else () - message( - FATAL_ERROR - "USE_LIBXSMM=ON, but neither libxsmm::libxsmm nor dbcsr::libxsmm exists" - ) endif () endif () From 9843487b65d11f6eaeb311eb4c1fe2a7dda393e9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 12:15:25 +0000 Subject: [PATCH 35/46] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 911232a4d53..e40078e6e30 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -195,7 +195,7 @@ if (USE_LIBXSMM) find_package(libxsmm CONFIG QUIET) if (TARGET libxsmm::libxsmm) set(DBCSR_LIBXSMM_TARGET libxsmm::libxsmm) - else() + else () find_package(LIBXSMM REQUIRED) set(DBCSR_LIBXSMM_TARGET dbcsr::libxsmm) endif () From a82e0322503f59a73b36f76dfc09fb63ade5893e Mon Sep 17 00:00:00 2001 From: Growl Date: Tue, 9 Jun 2026 20:41:05 +0800 Subject: [PATCH 36/46] Fix libxsmm taget --- src/CMakeLists.txt | 3 +-- tests/CMakeLists.txt | 9 ++++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 37fe099cd27..460e32edd0b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -220,8 +220,7 @@ target_compile_definitions( $<$:__USE_MPI_F08> $<$:__NO_STATM_ACCESS> $<$:NDEBUG> - $<$:__LIBXSMM> - $<$:${DBCSR_LIBXSMM_TARGET}>) + $<$:__LIBXSMM>) # Instead of resetting the compiler for MPI, we are adding the compiler flags # otherwise added by the mpifort-wrapper directly; based on hints from: diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 11650d5b5ac..43967870680 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -195,11 +195,10 @@ if (NOT USE_MPI) target_link_libraries(${dbcsr_test_backend} PRIVATE DBCSR::LIBXS) target_compile_definitions(${dbcsr_test_backend} PRIVATE __LIBXS) endif () - if (LIBXSMM_FOUND OR LIBXSMM_FETCHED) - target_compile_definitions( - ${dbcsr_test_backend} PRIVATE __LIBXSMM ${LIBXSMM_COMPILE_DEFINITIONS}) - target_include_directories(${dbcsr_test_backend} - PRIVATE "${LIBXSMM_INCLUDE_DIRS}") + if (USE_LIBXSMM) + target_compile_definitions(${dbcsr_test_backend} PRIVATE __LIBXSMM) + target_link_libraries(${dbcsr_test_backend} + PRIVATE ${DBCSR_LIBXSMM_TARGET}) endif () # register unittest executable with CMake add_test(NAME ${dbcsr_test_backend} COMMAND ./${dbcsr_test_backend}) From d2e69e6ce2ea3956906d00520562eec80aada6d2 Mon Sep 17 00:00:00 2001 From: Growl Date: Tue, 9 Jun 2026 21:58:30 +0800 Subject: [PATCH 37/46] Follow-up clean-ups --- CMakeLists.txt | 10 ++++------ src/CMakeLists.txt | 7 ++++--- src/cmake/DBCSRConfig.cmake.in | 23 ++++++++++------------- tests/CMakeLists.txt | 6 +++--- 4 files changed, 21 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e40078e6e30..e8fd05e736f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -105,7 +105,7 @@ set(USE_ACCEL "none" CACHE STRING - "BBuild with acceleration support (none (default value), opencl, cuda, hip)" + "Build with acceleration support (none (default value), opencl, cuda, hip)" ) set(_DBCSR_SUPPORTED_ACCEL_VALUES none opencl cuda hip) set_property(CACHE USE_ACCEL PROPERTY STRINGS ${_DBCSR_SUPPORTED_ACCEL_VALUES}) @@ -185,9 +185,7 @@ endif () set(CMAKE_POSITION_INDEPENDENT_CODE ON) if (USE_LIBXS) - find_package(libxs REQUIRED) - # not needed at all - add_library(DBCSR::LIBXS ALIAS libxs::libxs) + find_package(libxs CONFIG REQUIRED) endif () # libxsmm can only be activated when libxs is on. @@ -279,8 +277,8 @@ if (USE_ACCEL STREQUAL "opencl") endif () find_package(OpenCL REQUIRED) - find_package(libxstream REQUIRED) - add_library(DBCSR::LIBXSTREAM ALIAS libxstream::libxstream) + find_package(libxs CONFIG REQUIRED) + find_package(libxstream CONFIG REQUIRED) message(STATUS "Using LIBXSTREAM") set(DBCSR_OPENCL_SCRIPT "${LIBXSTREAM_OPENCL_SCRIPT}") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 460e32edd0b..d603cae80a4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -204,10 +204,12 @@ if (USE_LIBXS) INTERFACE_INCLUDE_DIRECTORIES) find_path(DBCSR_LIBXS_FORTRAN_MODULE "libxs_jit.F" HINTS ${DBCSR_LIBXS_INCLUDE_DIRS}) - set_source_files_properties("${DBCSR_LIBXS_FORTRAN_MODULE}/libxs_jit.F" - POSITION_INDEPENDENT_CODE ON) if (DBCSR_LIBXS_FORTRAN_MODULE) + set_source_files_properties("${DBCSR_LIBXS_FORTRAN_MODULE}/libxs_jit.F" + POSITION_INDEPENDENT_CODE ON) target_sources(dbcsr PRIVATE "${DBCSR_LIBXS_FORTRAN_MODULE}/libxs_jit.F") + else () + message(WARNING "Could not find libxs_jit.F in libxs include directories") endif () endif () @@ -234,7 +236,6 @@ target_link_libraries( PUBLIC $<$:MPI::MPI_Fortran> ${LAPACK_LIBRARIES} $<$:libxs::libxs> - # replace by libxsmm::libxsmm if libxsmm uses cmake ${BLAS_LIBRARIES} $<$:${DBCSR_LIBXSMM_TARGET}> $<$:OpenMP::OpenMP_C> diff --git a/src/cmake/DBCSRConfig.cmake.in b/src/cmake/DBCSRConfig.cmake.in index c6172c009a3..d15e05402d9 100644 --- a/src/cmake/DBCSRConfig.cmake.in +++ b/src/cmake/DBCSRConfig.cmake.in @@ -21,7 +21,14 @@ endif () set(DBCSR_USE_LIBXS @USE_LIBXS@) if (@USE_LIBXS@) - find_dependency(libxs) + find_dependency(libxs CONFIG REQUIRED) + set(DBCSR_USE_LIBXSMM @USE_LIBXSMM@) + if (@USE_LIBXSMM@) + find_dependency(libxsmm CONFIG QUIET) + if (NOT TARGET libxsmm::libxsmm) + find_package(LIBXSMM REQUIRED) + endif () + endif() endif () set(DBCSR_USE_ACCEL @USE_ACCEL@) @@ -41,19 +48,9 @@ if ("@USE_ACCEL@" MATCHES "opencl") find_dependency(OpenCL) endif () -set(DBCSR_USE_LIBXSMM @USE_LIBXSMM@) -if (@USE_LIBXSMM@) - find_dependency(libxsmm) - if(NOT TARGET dbcsr::libxsmm) - add_library(dbcsr::libxsmm INTERFACE IMPORTED) - set_target_properties(dbcsr::libxsmm PROPERTIES - INTERFACE_LINK_LIBRARIES libxsmm::libxsmm) - endif() -endif() - - set(@DBCSR_USE_LIBXSTREAM@ @@USE_LIBXSTREAM@) +set(DBCSR_USE_LIBXSTREAM @USE_LIBXSTREAM@) if (@USE_LIBXSTREAM@) - find_dependency(libxstream) + find_dependency(libxstream CONFIG REQUIRED) endif () include("${CMAKE_CURRENT_LIST_DIR}/DBCSRTargets.cmake") diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 43967870680..172dcd7146a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -75,7 +75,7 @@ set(DBCSR_TESTS_FTN if (DBCSR_WITH_ACCEL) set(DBCSR_TESTS_BACKEND dbcsr_acc_test) - if (TARGET DBCSR::LIBXS) + if (USE_LIBXS) list(APPEND DBCSR_TESTS_BACKEND acc_bench) endif () endif () @@ -191,8 +191,8 @@ if (NOT USE_MPI) if (BLAS_LIBRARIES MATCHES "mkl_") target_compile_definitions(${dbcsr_test_backend} PRIVATE __MKL) endif () - if (TARGET DBCSR::LIBXS) - target_link_libraries(${dbcsr_test_backend} PRIVATE DBCSR::LIBXS) + if (USE_LIBXS) + target_link_libraries(${dbcsr_test_backend} PRIVATE libxs::libxs) target_compile_definitions(${dbcsr_test_backend} PRIVATE __LIBXS) endif () if (USE_LIBXSMM) From eaff2e1a51b760dcf7359252c8d27a99104b3d6b Mon Sep 17 00:00:00 2001 From: Growl Date: Tue, 9 Jun 2026 22:51:58 +0800 Subject: [PATCH 38/46] Update dependencies --- .github/workflows/testing-linux.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/testing-linux.yml b/.github/workflows/testing-linux.yml index e56fbcf4e2c..8d85e22449d 100644 --- a/.github/workflows/testing-linux.yml +++ b/.github/workflows/testing-linux.yml @@ -8,11 +8,11 @@ on: env: LIBXS_GIT_REPOSITORY: https://github.com/hfp/libxs.git - LIBXS_GIT_TAG: 0a157189979edfd94057c59724ae6eb69862996b + LIBXS_GIT_TAG: 166f48e0172475f4db59950d1447525994bbf293 LIBXSTREAM_GIT_REPOSITORY: https://github.com/hfp/libxstream.git - LIBXSTREAM_GIT_TAG: 16bb6799310d78da4b6698d2227b52270310ba56 - LIBXSMM_GIT_REPOSITORY: https://github.com/Growl1234/libxsmm.git - LIBXSMM_GIT_TAG: b35d767abffc7bca845a81f7e408fec68300821c + LIBXSTREAM_GIT_TAG: f307d372dfe1eaba672dab5b0d9692d8a0f5c57f + LIBXSMM_GIT_REPOSITORY: https://github.com/libxsmm/libxsmm.git + LIBXSMM_GIT_TAG: cdeedf76ddd30e0dfb2527f6e1537d2c35a07596 jobs: ################################################################################## From 0ffb4f51e499b512c641b51b03b15ab10484f604 Mon Sep 17 00:00:00 2001 From: Hans Pabst Date: Wed, 10 Jun 2026 15:32:46 +0200 Subject: [PATCH 39/46] Accommodate LIBXSMM's improved CMake --- CMakeLists.txt | 9 +-------- src/CMakeLists.txt | 2 +- src/cmake/DBCSRConfig.cmake.in | 12 +++++------- 3 files changed, 7 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e8fd05e736f..4457050398d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -188,15 +188,8 @@ if (USE_LIBXS) find_package(libxs CONFIG REQUIRED) endif () -# libxsmm can only be activated when libxs is on. if (USE_LIBXSMM) - find_package(libxsmm CONFIG QUIET) - if (TARGET libxsmm::libxsmm) - set(DBCSR_LIBXSMM_TARGET libxsmm::libxsmm) - else () - find_package(LIBXSMM REQUIRED) - set(DBCSR_LIBXSMM_TARGET dbcsr::libxsmm) - endif () + find_package(libxsmm CONFIG REQUIRED) endif () # =================================== BLAS & LAPACK, PkgConfig diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d603cae80a4..aa7dcce39a0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -237,7 +237,7 @@ target_link_libraries( ${LAPACK_LIBRARIES} $<$:libxs::libxs> ${BLAS_LIBRARIES} - $<$:${DBCSR_LIBXSMM_TARGET}> + $<$:libxsmm::libxsmm> $<$:OpenMP::OpenMP_C> $<$:OpenMP::OpenMP_CXX> $<$:OpenMP::OpenMP_Fortran>) diff --git a/src/cmake/DBCSRConfig.cmake.in b/src/cmake/DBCSRConfig.cmake.in index d15e05402d9..fe6ebd2199d 100644 --- a/src/cmake/DBCSRConfig.cmake.in +++ b/src/cmake/DBCSRConfig.cmake.in @@ -22,13 +22,11 @@ endif () set(DBCSR_USE_LIBXS @USE_LIBXS@) if (@USE_LIBXS@) find_dependency(libxs CONFIG REQUIRED) - set(DBCSR_USE_LIBXSMM @USE_LIBXSMM@) - if (@USE_LIBXSMM@) - find_dependency(libxsmm CONFIG QUIET) - if (NOT TARGET libxsmm::libxsmm) - find_package(LIBXSMM REQUIRED) - endif () - endif() +endif () + +set(DBCSR_USE_LIBXSMM @USE_LIBXSMM@) +if (@USE_LIBXSMM@) + find_dependency(libxsmm CONFIG REQUIRED) endif () set(DBCSR_USE_ACCEL @USE_ACCEL@) From 41fb72e8b5258256f9b9a05960f9a736af3672af Mon Sep 17 00:00:00 2001 From: Growl Date: Wed, 10 Jun 2026 21:28:19 +0800 Subject: [PATCH 40/46] Remove FindLIBXSMM.cmake --- src/CMakeLists.txt | 1 - src/cmake/FindLIBXSMM.cmake | 63 ------------------------------------- 2 files changed, 64 deletions(-) delete mode 100644 src/cmake/FindLIBXSMM.cmake diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index aa7dcce39a0..1e34301d39a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -424,5 +424,4 @@ install( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfigVersion.cmake - ${PROJECT_SOURCE_DIR}/src/cmake/FindLIBXSMM.cmake DESTINATION ${config_install_dir}) diff --git a/src/cmake/FindLIBXSMM.cmake b/src/cmake/FindLIBXSMM.cmake deleted file mode 100644 index 9917df68a63..00000000000 --- a/src/cmake/FindLIBXSMM.cmake +++ /dev/null @@ -1,63 +0,0 @@ -#!-------------------------------------------------------------------------------------------------! -#! DBCSR: A general program to perform molecular dynamics simulations ! -#! Copyright 2000-2026 DBCSR developers group ! -#! ! -#! SPDX-License-Identifier: GPL-2.0-or-later ! -#!-------------------------------------------------------------------------------------------------! - -include(FindPackageHandleStandardArgs) -find_package(PkgConfig QUIET) - -# Prefer pkg-config when available. -if (PKG_CONFIG_FOUND) - pkg_check_modules(DBCSR_LIBXSMM QUIET IMPORTED_TARGET GLOBAL libxsmm) -endif () - -# Optional explicit prefix hint. -set(_dbcsr_libxsmm_hints) -if (DBCSR_LIBXSMM_ROOT) - list(APPEND _dbcsr_libxsmm_hints "${DBCSR_LIBXSMM_ROOT}") -endif () - -# Fallback discovery when pkg-config did not populate usable values. -if (NOT DBCSR_LIBXSMM_INCLUDE_DIR) - find_path( - DBCSR_LIBXSMM_INCLUDE_DIR - NAMES libxsmm.h - HINTS ${_dbcsr_libxsmm_hints} - PATH_SUFFIXES include) -endif () - -if (NOT DBCSR_LIBXSMM_LIBRARY) - find_library( - DBCSR_LIBXSMM_LIBRARY - NAMES xsmm - HINTS ${_dbcsr_libxsmm_hints} - PATH_SUFFIXES lib lib64) -endif () - -# Reconcile pkg-config variables with the fallback naming used below. -if (NOT DBCSR_LIBXSMM_INCLUDE_DIR AND DBCSR_LIBXSMM_INCLUDE_DIRS) - list(GET DBCSR_LIBXSMM_INCLUDE_DIRS 0 DBCSR_LIBXSMM_INCLUDE_DIR) -endif () - -if (NOT DBCSR_LIBXSMM_LIBRARY AND DBCSR_LIBXSMM_LINK_LIBRARIES) - list(GET DBCSR_LIBXSMM_LINK_LIBRARIES 0 DBCSR_LIBXSMM_LIBRARY) -endif () - -find_package_handle_standard_args( - LIBXSMM REQUIRED_VARS DBCSR_LIBXSMM_INCLUDE_DIR DBCSR_LIBXSMM_LIBRARY) - -if (NOT TARGET dbcsr::libxsmm) - if (TARGET PkgConfig::DBCSR_LIBXSMM) - add_library(dbcsr::libxsmm ALIAS PkgConfig::DBCSR_LIBXSMM) - else () - add_library(dbcsr::libxsmm INTERFACE IMPORTED) - set_target_properties( - dbcsr::libxsmm - PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${DBCSR_LIBXSMM_INCLUDE_DIR}" - INTERFACE_LINK_LIBRARIES "${DBCSR_LIBXSMM_LIBRARY}") - endif () -endif () - -mark_as_advanced(DBCSR_LIBXSMM_INCLUDE_DIR DBCSR_LIBXSMM_LIBRARY) From fc22bbc3be75cc9d867dd4b08abede29c402cdbd Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 13:34:11 +0000 Subject: [PATCH 41/46] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/CMakeLists.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1e34301d39a..712b6e8eabf 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -421,7 +421,6 @@ install( NAMESPACE "${config_namespace}" DESTINATION "${config_install_dir}") -install( - FILES ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfig.cmake - ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfigVersion.cmake - DESTINATION ${config_install_dir}) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfigVersion.cmake + DESTINATION ${config_install_dir}) From 6cf08a88717a5ea29fe20b343c619544141a262f Mon Sep 17 00:00:00 2001 From: Hans Pabst Date: Wed, 10 Jun 2026 15:48:57 +0200 Subject: [PATCH 42/46] Let LIBXSMM fallback to PkgConfig --- CMakeLists.txt | 15 ++++++++++++++- src/CMakeLists.txt | 19 ++++++++++++++++++ src/cmake/DBCSRConfig.cmake.in | 35 ++++++++++++++++++++++++++++------ 3 files changed, 62 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4457050398d..bfa5cf482db 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -189,7 +189,20 @@ if (USE_LIBXS) endif () if (USE_LIBXSMM) - find_package(libxsmm CONFIG REQUIRED) + find_package(libxsmm CONFIG QUIET) + if (NOT libxsmm_FOUND) + find_package(PkgConfig QUIET) + if (PkgConfig_FOUND) + pkg_check_modules(DBCSR_LIBXSMM_PC QUIET IMPORTED_TARGET GLOBAL libxsmm) + if (DBCSR_LIBXSMM_PC_FOUND AND NOT TARGET libxsmm::libxsmm) + add_library(libxsmm::libxsmm ALIAS PkgConfig::DBCSR_LIBXSMM_PC) + set(libxsmm_FOUND TRUE) + endif () + endif () + endif () + if (NOT libxsmm_FOUND) + message(FATAL_ERROR "LIBXSMM not found (tried CMake config and pkg-config)") + endif () endif () # =================================== BLAS & LAPACK, PkgConfig diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 712b6e8eabf..3060fdcdbf3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -407,6 +407,25 @@ if (USE_ACCEL STREQUAL "opencl") endforeach () endif () +# Record dependency prefixes for the installed config. Derive from _DIR +# (points to lib/cmake//) -> three levels up. +if (libxs_DIR) + cmake_path(GET libxs_DIR PARENT_PATH _tmp) + cmake_path(GET _tmp PARENT_PATH _tmp) + cmake_path(GET _tmp PARENT_PATH LIBXSROOT) +endif () +if (libxstream_DIR) + cmake_path(GET libxstream_DIR PARENT_PATH _tmp) + cmake_path(GET _tmp PARENT_PATH _tmp) + cmake_path(GET _tmp PARENT_PATH LIBXSTREAMROOT) +endif () +if (libxsmm_DIR) + cmake_path(GET libxsmm_DIR PARENT_PATH _tmp) + cmake_path(GET _tmp PARENT_PATH _tmp) + cmake_path(GET _tmp PARENT_PATH LIBXSMMROOT) +endif () +unset(_tmp) + configure_package_config_file( cmake/DBCSRConfig.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/DBCSRConfig.cmake" INSTALL_DESTINATION "${config_install_dir}") diff --git a/src/cmake/DBCSRConfig.cmake.in b/src/cmake/DBCSRConfig.cmake.in index fe6ebd2199d..2b4bf802d8d 100644 --- a/src/cmake/DBCSRConfig.cmake.in +++ b/src/cmake/DBCSRConfig.cmake.in @@ -7,7 +7,17 @@ set(DBCSR_LIBXSROOT "@LIBXSROOT@") set(DBCSR_LIBXSTREAMROOT "@LIBXSTREAMROOT@") set(DBCSR_LIBXSMMROOT "@LIBXSMMROOT@") -# the following should only be needed when building statically +# Make DBCSR's dependency locations discoverable +set(_dbcsr_prefix_path_save "${CMAKE_PREFIX_PATH}") +if (DBCSR_LIBXSROOT) + list(PREPEND CMAKE_PREFIX_PATH "${DBCSR_LIBXSROOT}") +endif () +if (DBCSR_LIBXSTREAMROOT) + list(PREPEND CMAKE_PREFIX_PATH "${DBCSR_LIBXSTREAMROOT}") +endif () +if (DBCSR_LIBXSMMROOT) + list(PREPEND CMAKE_PREFIX_PATH "${DBCSR_LIBXSMMROOT}") +endif () set(DBCSR_USE_MPI @USE_MPI@) if (@USE_MPI@) @@ -26,7 +36,14 @@ endif () set(DBCSR_USE_LIBXSMM @USE_LIBXSMM@) if (@USE_LIBXSMM@) - find_dependency(libxsmm CONFIG REQUIRED) + find_dependency(libxsmm CONFIG QUIET) + if (NOT libxsmm_FOUND) + find_dependency(PkgConfig) + pkg_check_modules(DBCSR_LIBXSMM_PC QUIET IMPORTED_TARGET GLOBAL libxsmm) + if (DBCSR_LIBXSMM_PC_FOUND AND NOT TARGET libxsmm::libxsmm) + add_library(libxsmm::libxsmm ALIAS PkgConfig::DBCSR_LIBXSMM_PC) + endif () + endif () endif () set(DBCSR_USE_ACCEL @USE_ACCEL@) @@ -44,11 +61,17 @@ endif () if ("@USE_ACCEL@" MATCHES "opencl") find_dependency(OpenCL) + find_dependency(libxstream CONFIG QUIET) + if (NOT libxstream_FOUND) + find_dependency(PkgConfig) + pkg_check_modules(DBCSR_LIBXSTREAM_PC QUIET IMPORTED_TARGET GLOBAL libxstream) + if (DBCSR_LIBXSTREAM_PC_FOUND AND NOT TARGET libxstream::libxstream) + add_library(libxstream::libxstream ALIAS PkgConfig::DBCSR_LIBXSTREAM_PC) + endif () + endif () endif () -set(DBCSR_USE_LIBXSTREAM @USE_LIBXSTREAM@) -if (@USE_LIBXSTREAM@) - find_dependency(libxstream CONFIG REQUIRED) -endif () +set(CMAKE_PREFIX_PATH "${_dbcsr_prefix_path_save}") +unset(_dbcsr_prefix_path_save) include("${CMAKE_CURRENT_LIST_DIR}/DBCSRTargets.cmake") From c1cb7e604a05f17047e084b9e80a3ab47a6908ea Mon Sep 17 00:00:00 2001 From: Hans Pabst Date: Wed, 10 Jun 2026 16:43:01 +0200 Subject: [PATCH 43/46] Revise LIBXS-JIT and warning message --- src/CMakeLists.txt | 31 +++++++++---------------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3060fdcdbf3..d665ac929ce 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -186,31 +186,18 @@ elseif (USE_ACCEL STREQUAL "cuda") "${ACC_ARCH_NUMBER}") endif () -# What follows is an example of what should not be done. Compiling the libxs -# Fortran module here is a workaround; this is the responsibility of the libxs -# build system, not DBCSR. - -# As a workaround, we retrieve the include directory of libxs and scan for -# libxs_jit.F. If found we had the file to the list of files to be compiled. -# - +# Compile libxs_jit.F: provides LIBXS_JIT module with backend-aware dispatch. +# Must be compiled by the consumer so preprocessor defines (__MKL, __LIBXSMM) +# match the consumer's configuration. if (USE_LIBXS) - message( - WARNING - "Compiling libxs_jit.F here is a workaround: this should be handled " - "by the libxs build system, not by DBCSR. It may also produce linking " - "warnings (e.g. DT_TEXTREL) when DBCSR is built as a shared library.") - get_target_property(DBCSR_LIBXS_INCLUDE_DIRS libxs::libxs + messane(STATUS "Adding libxs_jit.F from dependency libxs for compilation") + get_target_property(_libxs_incdirs libxs::libxs INTERFACE_INCLUDE_DIRECTORIES) - find_path(DBCSR_LIBXS_FORTRAN_MODULE "libxs_jit.F" - HINTS ${DBCSR_LIBXS_INCLUDE_DIRS}) - if (DBCSR_LIBXS_FORTRAN_MODULE) - set_source_files_properties("${DBCSR_LIBXS_FORTRAN_MODULE}/libxs_jit.F" - POSITION_INDEPENDENT_CODE ON) - target_sources(dbcsr PRIVATE "${DBCSR_LIBXS_FORTRAN_MODULE}/libxs_jit.F") - else () - message(WARNING "Could not find libxs_jit.F in libxs include directories") + find_path(DBCSR_LIBXS_JIT_DIR "libxs_jit.F" HINTS ${_libxs_incdirs}) + if (DBCSR_LIBXS_JIT_DIR) + target_sources(dbcsr PRIVATE "${DBCSR_LIBXS_JIT_DIR}/libxs_jit.F") endif () + unset(_libxs_incdirs) endif () target_compile_definitions( From f3e65a31115eb89a55152470bf5131da821bdbf5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 14:43:47 +0000 Subject: [PATCH 44/46] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/CMakeLists.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d665ac929ce..06319cbe7c6 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -190,9 +190,8 @@ endif () # Must be compiled by the consumer so preprocessor defines (__MKL, __LIBXSMM) # match the consumer's configuration. if (USE_LIBXS) - messane(STATUS "Adding libxs_jit.F from dependency libxs for compilation") - get_target_property(_libxs_incdirs libxs::libxs - INTERFACE_INCLUDE_DIRECTORIES) + message(STATUS "Adding libxs_jit.F from dependency libxs for compilation") + get_target_property(_libxs_incdirs libxs::libxs INTERFACE_INCLUDE_DIRECTORIES) find_path(DBCSR_LIBXS_JIT_DIR "libxs_jit.F" HINTS ${_libxs_incdirs}) if (DBCSR_LIBXS_JIT_DIR) target_sources(dbcsr PRIVATE "${DBCSR_LIBXS_JIT_DIR}/libxs_jit.F") From 3ae3cfbe04a10c82162cc277ee5868f766809924 Mon Sep 17 00:00:00 2001 From: Hans Pabst Date: Thu, 11 Jun 2026 10:05:11 +0200 Subject: [PATCH 45/46] Update LIBXS option handling for OpenCL support --- CMakeLists.txt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bfa5cf482db..9db29d953c4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,7 +79,7 @@ option(BUILD_SHARED_LIBS "Build shared libraries" OFF) option(USE_OPENMP "Build with OpenMP support" ON) option(USE_MPI "Build with MPI support" OFF) option(BUILD_TESTING "Build dbcsr unit tests" OFF) -option(USE_LIBXS "Use LIBXS for host-side Small Matrix Multiplication" OFF) +option(USE_LIBXS "Use LIBXS for host-side Small Matrix Multiplication; required for OpenCL backend" OFF) option(WITH_CUDA_PROFILING "Enable profiling within CUDA" OFF) option(WITH_HIP_PROFILING "Enable profiling within HIP" OFF) @@ -275,11 +275,13 @@ if (USE_ACCEL STREQUAL "opencl") list(APPEND CMAKE_PREFIX_PATH "$ENV{CUDA_PATH}") endif () - # libxs is a hard dependency when libxs is on amd opencl on as well. + # libxs is a hard dependency when opencl is on. if (NOT USE_LIBXS) message( - FATAL_ERROR - "LIBXS not found. OpenCL backend requires LIBXS (USE_LIBXS=ON).") + WARNING + "USE_LIBXS is not set but LIBXS is required for OpenCL backend; " + "overriding USE_LIBXS=OFF and enabling LIBXS") + find_package(libxs REQUIRED) endif () find_package(OpenCL REQUIRED) From 8849763c1ee113f8b33ad272ee0bf15b819b447d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 08:05:54 +0000 Subject: [PATCH 46/46] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- CMakeLists.txt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9db29d953c4..ecef513a581 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,7 +79,10 @@ option(BUILD_SHARED_LIBS "Build shared libraries" OFF) option(USE_OPENMP "Build with OpenMP support" ON) option(USE_MPI "Build with MPI support" OFF) option(BUILD_TESTING "Build dbcsr unit tests" OFF) -option(USE_LIBXS "Use LIBXS for host-side Small Matrix Multiplication; required for OpenCL backend" OFF) +option( + USE_LIBXS + "Use LIBXS for host-side Small Matrix Multiplication; required for OpenCL backend" + OFF) option(WITH_CUDA_PROFILING "Enable profiling within CUDA" OFF) option(WITH_HIP_PROFILING "Enable profiling within HIP" OFF) @@ -278,9 +281,8 @@ if (USE_ACCEL STREQUAL "opencl") # libxs is a hard dependency when opencl is on. if (NOT USE_LIBXS) message( - WARNING - "USE_LIBXS is not set but LIBXS is required for OpenCL backend; " - "overriding USE_LIBXS=OFF and enabling LIBXS") + WARNING "USE_LIBXS is not set but LIBXS is required for OpenCL backend; " + "overriding USE_LIBXS=OFF and enabling LIBXS") find_package(libxs REQUIRED) endif ()