From 75d26239f5fbd3d12527bb0e50564bf4867ef29b Mon Sep 17 00:00:00 2001 From: Growl Date: Mon, 13 Jul 2026 13:03:37 +0800 Subject: [PATCH 1/5] CMake: Introduce CMake dependent options --- CMakeLists.txt | 41 ++++++++++++++++------------------------- 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4315912e5e..315e703357 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,5 @@ cmake_minimum_required(VERSION 3.16) +include(CMakeDependentOption) if(POLICY CMP0135) # https://cmake.org/cmake/help/git-stage/policy/CMP0135.html cmake_policy(SET CMP0135 NEW) # Otherwise this policy generates a warning on CMake 3.24 @@ -16,8 +17,6 @@ project( option(ENABLE_MPI "Enable MPI" ON) option(ENABLE_OPENMP "Enable OpenMP" ON) option(USE_CUDA "Enable CUDA" OFF) -option(USE_CUDA_MPI "Enable CUDA-aware MPI" OFF) -option(USE_CUDA_ON_DCU "Enable CUDA on DCU" OFF) option(USE_ROCM "Enable ROCm" OFF) option(USE_DSP "Enable DSP" OFF) option(USE_KML "Enable Kunpeng Math Library" OFF) @@ -27,13 +26,7 @@ option(ENABLE_ABACUS_LIBM "Build libmath from source to speed up" OFF) option(ENABLE_LIBXC "Enable using the LibXC package" OFF) option(ENABLE_FLOAT_FFTW "Enable using single-precision FFTW library." OFF) -option(ENABLE_MLALGO "Enable the machine learning algorithms" OFF) - option(ENABLE_LCAO "Enable LCAO algorithm" ON) -option(ENABLE_ELPA "Enable ELPA for LCAO" ON) -option(ENABLE_LIBRI "Enable LibRI for hybrid functional" OFF) -option(EXX_DEV "Enable LibRI developing features" OFF) -option(ENABLE_PEXSI "Enable PEXSI for LCAO" OFF) option(ENABLE_DFTD4 "Enable DFT-D4 dispersion correction" OFF) option(BUILD_TESTING "Build unittests" OFF) @@ -52,8 +45,21 @@ option(ENABLE_FFT_TWO_CENTER "Enable FFT-based two-center integral method" ON) option(ENABLE_GOOGLEBENCH "Enable GOOGLE-benchmark usage" OFF) option(ENABLE_RAPIDJSON "Enable rapid-json usage" OFF) option(ENABLE_CNPY "Enable cnpy usage" OFF) -option(ENABLE_CUSOLVERMP "Enable cusolvermp" OFF) -option(ENABLE_NCCL_PARALLEL_DEVICE "Enable NCCL-backed collectives in parallel_device" OFF) + +cmake_dependent_option(ENABLE_ELPA "Enable ELPA for LCAO" ON "ENABLE_LCAO;ENABLE_MPI" OFF) +cmake_dependent_option(ENABLE_LIBRI "Enable LibRI for hybrid functional" OFF "ENABLE_LCAO;ENABLE_MPI" OFF) +cmake_dependent_option(EXX_DEV "Enable LibRI developing features" OFF "ENABLE_LIBRI" OFF) +cmake_dependent_option(ENABLE_PEXSI "Enable PEXSI for LCAO" OFF "ENABLE_LCAO;ENABLE_MPI" OFF) +cmake_dependent_option(ENABLE_MLALGO "Enable the machine learning algorithms" + OFF "ENABLE_LCAO;ENABLE_MPI" OFF) + +cmake_dependent_option(USE_CUDA_MPI "Enable CUDA-aware MPI" OFF "USE_CUDA" OFF) +cmake_dependent_option(USE_CUDA_ON_DCU "Enable CUDA on DCU" OFF "USE_CUDA" OFF) +cmake_dependent_option(ENABLE_CUBLASMP "Enable cublasmp" OFF "USE_CUDA" OFF) +cmake_dependent_option(ENABLE_CUSOLVERMP "Enable cusolvermp" OFF "USE_CUDA" OFF) +cmake_dependent_option(ENABLE_NCCL_PARALLEL_DEVICE + "Enable NCCL-backed collectives in parallel_device" + OFF "USE_CUDA;ENABLE_MPI" OFF) # ============================================================================== # Deprecated options (TODO: Remove this section in the future release) @@ -170,12 +176,6 @@ You can install Git first and reinstall abacus.") endif() endif() -# Serial version of ABACUS will not use ELPA -if(NOT ENABLE_MPI) - set(ENABLE_ELPA OFF) - set(ENABLE_MLALGO OFF) -endif() - # Different exe files of ABACUS unset(ABACUS_BIN_NAME CACHE) @@ -349,11 +349,9 @@ if(ENABLE_LCAO) find_package(ELPA REQUIRED) abacus_add_feature_definitions(__ELPA) endif() - if(ENABLE_FFT_TWO_CENTER) abacus_add_feature_definitions(USE_NEW_TWO_CENTER) endif() - if(ENABLE_PEXSI) find_package(PEXSI REQUIRED CONFIG) if(PEXSI_VERSION VERSION_LESS "2.0.0") @@ -362,9 +360,6 @@ if(ENABLE_LCAO) abacus_add_feature_definitions(__PEXSI) set(CMAKE_CXX_STANDARD 14) endif() -else() - set(ENABLE_MLALGO OFF) - set(ENABLE_LIBRI OFF) endif() if(DEBUG_INFO) @@ -520,10 +515,6 @@ if(USE_CUDA) set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcompiler=${OpenMP_CXX_FLAGS}" CACHE STRING "CUDA flags" FORCE) endif() if (ENABLE_NCCL_PARALLEL_DEVICE) - if (NOT ENABLE_MPI) - message(FATAL_ERROR - "ENABLE_NCCL_PARALLEL_DEVICE requires ENABLE_MPI=ON.") - endif() abacus_add_feature_definitions(__NCCL_PARALLEL_DEVICE) include(cmake/modules/SetupNccl.cmake) abacus_setup_nccl() From 3475102d6c900841560c2001ec1088719441e10a Mon Sep 17 00:00:00 2001 From: Growl Date: Mon, 13 Jul 2026 15:06:14 +0800 Subject: [PATCH 2/5] Revise cmake/CollectBuildInfoVars.cmake - Output crucial information as a build summary - Make MPI implementation detection valid (at least for non-cross build) - Use version of MPI standard one MPI implementation follows [RFC] --- cmake/CollectBuildInfoVars.cmake | 78 ++++++++++++++++---------------- 1 file changed, 38 insertions(+), 40 deletions(-) diff --git a/cmake/CollectBuildInfoVars.cmake b/cmake/CollectBuildInfoVars.cmake index 61246e3a61..27c710b2e2 100644 --- a/cmake/CollectBuildInfoVars.cmake +++ b/cmake/CollectBuildInfoVars.cmake @@ -66,52 +66,16 @@ set(ABACUS_MPI_IMPLEMENTATION "no") set(ABACUS_MPI_VERSION "no") set(ABACUS_CUDA_AWARE_MPI "no") if(ENABLE_MPI) - execute_process(COMMAND ${MPI_CXX_COMPILER} --version OUTPUT_VARIABLE MPI_VERSION_OUTPUT OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) - if(MPI_VERSION_OUTPUT MATCHES "Intel") + if("${MPI_CXX_LIBRARY_VERSION_STRING}" MATCHES "Intel") set(ABACUS_MPI_IMPLEMENTATION "Intel MPI") - string(REGEX MATCH "Intel\\(R\\) oneAPI DPC\\+\\+/C\\+\\+ Compiler ([0-9]+\\.[0-9]+\\.[0-9]+)" _ "${MPI_VERSION_OUTPUT}") - if(CMAKE_MATCH_1) - set(MPI_DETECTED_VERSION "${CMAKE_MATCH_1}") - else() - string(REGEX MATCH "icpc \\(ICC\\) ([0-9]+\\.[0-9]+\\.[0-9]+)" _ "${MPI_VERSION_OUTPUT}") - if(CMAKE_MATCH_1) - set(MPI_DETECTED_VERSION "${CMAKE_MATCH_1}") - endif() - endif() - elseif(MPI_VERSION_OUTPUT MATCHES "Open MPI") + elseif("${MPI_CXX_LIBRARY_VERSION_STRING}" MATCHES "Open MPI") set(ABACUS_MPI_IMPLEMENTATION "OpenMPI") - elseif(MPI_VERSION_OUTPUT MATCHES "MPICH") + elseif("${MPI_CXX_LIBRARY_VERSION_STRING}" MATCHES "MPICH") set(ABACUS_MPI_IMPLEMENTATION "MPICH") else() set(ABACUS_MPI_IMPLEMENTATION "Unknown") endif() - # Fallback: try mpirun/mpiexec - if(NOT MPI_DETECTED_VERSION) - find_program(MPIRUN_EXECUTABLE mpirun) - if(MPIRUN_EXECUTABLE) - execute_process(COMMAND ${MPIRUN_EXECUTABLE} --version OUTPUT_VARIABLE MPIRUN_VERSION_OUTPUT OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) - if(MPIRUN_VERSION_OUTPUT MATCHES "Open MPI") - set(ABACUS_MPI_IMPLEMENTATION "OpenMPI") - string(REGEX MATCH "Open MPI ([0-9]+\\.[0-9]+\\.[0-9]+)" _ "${MPIRUN_VERSION_OUTPUT}") - if(CMAKE_MATCH_1) - set(MPI_DETECTED_VERSION "${CMAKE_MATCH_1}") - endif() - elseif(MPIRUN_VERSION_OUTPUT MATCHES "MPICH") - set(ABACUS_MPI_IMPLEMENTATION "MPICH") - string(REGEX MATCH "MPICH Version: ([0-9]+\\.[0-9]+\\.[0-9]+)" _ "${MPIRUN_VERSION_OUTPUT}") - if(CMAKE_MATCH_1) - set(MPI_DETECTED_VERSION "${CMAKE_MATCH_1}") - endif() - endif() - endif() - endif() - if(MPI_DETECTED_VERSION) - set(ABACUS_MPI_VERSION "yes (v${MPI_DETECTED_VERSION})") - elseif(MPI_VERSION) - set(ABACUS_MPI_VERSION "yes (v${MPI_VERSION})") - else() - set(ABACUS_MPI_VERSION "yes (version unknown)") - endif() + set(ABACUS_MPI_VERSION "(MPI standard: ${MPI_CXX_VERSION})") if(USE_CUDA) # OpenMPI hint find_program(OMPI_INFO_EXECUTABLE ompi_info) @@ -144,6 +108,12 @@ else() set(ABACUS_OPENMP_VERSION "no") endif() +if(ENABLE_LCAO) + set(ABACUS_LCAO_ENABLED "True") +else() + set(ABACUS_LCAO_ENABLED "False") +endif() + # Core Math Libraries if(ENABLE_LCAO AND ENABLE_ELPA) set(ABACUS_ELPA_VERSION "yes (version unknown)") @@ -410,3 +380,31 @@ list(APPEND CMAKE_FIND_PACKAGES_LIST " LibRI Found=${LIBRI_FOUND}") foreach(package_line ${CMAKE_FIND_PACKAGES_LIST}) set(ABACUS_CMAKE_FIND_PACKAGES "${ABACUS_CMAKE_FIND_PACKAGES}${package_line}") endforeach() + +# ============================================================================== +# Print Build Summary +# ============================================================================== +message(STATUS "===================================================================") +message(STATUS " ABACUS Build Summary ") +message(STATUS "===================================================================") +message(STATUS "Build Type : ${ABACUS_BUILD_TYPE}") +message(STATUS "Platform : ${ABACUS_PLATFORM_NAME}") +message(STATUS "Compiler : ${ABACUS_CXX_COMPILER_ID} ${ABACUS_CXX_COMPILER_VERSION}") +message(STATUS "-------------------------------------------------------------------") +message(STATUS "MPI Support : ${ABACUS_MPI_IMPLEMENTATION} ${ABACUS_MPI_VERSION}") +message(STATUS "CUDA-Aware MPI : ${ABACUS_CUDA_AWARE_MPI}") +message(STATUS "OpenMP Support : ${ABACUS_OPENMP_VERSION}") +message(STATUS "-------------------------------------------------------------------") +message(STATUS "LCAO Enabled : ${ABACUS_LCAO_ENABLED}") +message(STATUS "-------------------------------------------------------------------") +message(STATUS "Math Libraries : MKL = ${ABACUS_MKL_SUPPORT}") +message(STATUS " FFTW = ${ABACUS_FFTW_VERSION}") +message(STATUS " ELPA = ${ABACUS_ELPA_VERSION}") +message(STATUS "Accelerators : CUDA = ${ABACUS_CUDA_VERSION}") +message(STATUS " ROCm = ${ABACUS_ROCM_VERSION}") +message(STATUS "Machine Learning : Torch = ${ABACUS_LIBTORCH_VERSION}") +message(STATUS " DeePMD = ${ABACUS_DEEPMD_VERSION}") +message(STATUS " NEP = ${ABACUS_NEP_VERSION}") +message(STATUS "Features : Libxc = ${ABACUS_LIBXC_VERSION}") +message(STATUS " LibRI = ${ABACUS_LIBRI_VERSION}") +message(STATUS "===================================================================") From 84dfef7be6368dadf8eadad48a379666c11cfb19 Mon Sep 17 00:00:00 2001 From: Growl Date: Mon, 13 Jul 2026 17:38:18 +0800 Subject: [PATCH 3/5] Disallow in-source build (build-root is directory with top-level CMakeLists.txt) --- CMakeLists.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 315e703357..910de52e4a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,14 @@ cmake_minimum_required(VERSION 3.16) + +# Require out-of-source builds +file(TO_CMAKE_PATH "${CMAKE_BINARY_DIR}/CMakeLists.txt" LOC_PATH) +if(EXISTS "${LOC_PATH}") + message( + FATAL_ERROR + "You cannot build in a source directory (or any directory with a CMakeLists.txt file). " + "Please make a build subdirectory.") +endif() + include(CMakeDependentOption) if(POLICY CMP0135) # https://cmake.org/cmake/help/git-stage/policy/CMP0135.html cmake_policy(SET CMP0135 NEW) From a1fe4620e7417d52f679a6a6ba9da0c89fd2e40b Mon Sep 17 00:00:00 2001 From: Growl Date: Mon, 13 Jul 2026 20:39:55 +0800 Subject: [PATCH 4/5] Output build summary with pure message (without STATUS) --- cmake/CollectBuildInfoVars.cmake | 48 ++++++++++++++++---------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/cmake/CollectBuildInfoVars.cmake b/cmake/CollectBuildInfoVars.cmake index 27c710b2e2..9e13390a18 100644 --- a/cmake/CollectBuildInfoVars.cmake +++ b/cmake/CollectBuildInfoVars.cmake @@ -384,27 +384,27 @@ endforeach() # ============================================================================== # Print Build Summary # ============================================================================== -message(STATUS "===================================================================") -message(STATUS " ABACUS Build Summary ") -message(STATUS "===================================================================") -message(STATUS "Build Type : ${ABACUS_BUILD_TYPE}") -message(STATUS "Platform : ${ABACUS_PLATFORM_NAME}") -message(STATUS "Compiler : ${ABACUS_CXX_COMPILER_ID} ${ABACUS_CXX_COMPILER_VERSION}") -message(STATUS "-------------------------------------------------------------------") -message(STATUS "MPI Support : ${ABACUS_MPI_IMPLEMENTATION} ${ABACUS_MPI_VERSION}") -message(STATUS "CUDA-Aware MPI : ${ABACUS_CUDA_AWARE_MPI}") -message(STATUS "OpenMP Support : ${ABACUS_OPENMP_VERSION}") -message(STATUS "-------------------------------------------------------------------") -message(STATUS "LCAO Enabled : ${ABACUS_LCAO_ENABLED}") -message(STATUS "-------------------------------------------------------------------") -message(STATUS "Math Libraries : MKL = ${ABACUS_MKL_SUPPORT}") -message(STATUS " FFTW = ${ABACUS_FFTW_VERSION}") -message(STATUS " ELPA = ${ABACUS_ELPA_VERSION}") -message(STATUS "Accelerators : CUDA = ${ABACUS_CUDA_VERSION}") -message(STATUS " ROCm = ${ABACUS_ROCM_VERSION}") -message(STATUS "Machine Learning : Torch = ${ABACUS_LIBTORCH_VERSION}") -message(STATUS " DeePMD = ${ABACUS_DEEPMD_VERSION}") -message(STATUS " NEP = ${ABACUS_NEP_VERSION}") -message(STATUS "Features : Libxc = ${ABACUS_LIBXC_VERSION}") -message(STATUS " LibRI = ${ABACUS_LIBRI_VERSION}") -message(STATUS "===================================================================") +message(" ===================================================================") +message(" ABACUS Build Summary ") +message(" ===================================================================") +message(" Build Type : ${ABACUS_BUILD_TYPE}") +message(" Platform : ${ABACUS_PLATFORM_NAME}") +message(" Compiler : ${ABACUS_CXX_COMPILER_ID} ${ABACUS_CXX_COMPILER_VERSION}") +message(" -------------------------------------------------------------------") +message(" MPI Support : ${ABACUS_MPI_IMPLEMENTATION} ${ABACUS_MPI_VERSION}") +message(" CUDA-Aware MPI : ${ABACUS_CUDA_AWARE_MPI}") +message(" OpenMP Support : ${ABACUS_OPENMP_VERSION}") +message(" -------------------------------------------------------------------") +message(" LCAO Enabled : ${ABACUS_LCAO_ENABLED}") +message(" -------------------------------------------------------------------") +message(" Math Libraries : MKL = ${ABACUS_MKL_SUPPORT}") +message(" FFTW = ${ABACUS_FFTW_VERSION}") +message(" ELPA = ${ABACUS_ELPA_VERSION}") +message(" Accelerators : CUDA = ${ABACUS_CUDA_VERSION}") +message(" ROCm = ${ABACUS_ROCM_VERSION}") +message(" Machine Learning : Torch = ${ABACUS_LIBTORCH_VERSION}") +message(" DeePMD = ${ABACUS_DEEPMD_VERSION}") +message(" NEP = ${ABACUS_NEP_VERSION}") +message(" Features : Libxc = ${ABACUS_LIBXC_VERSION}") +message(" LibRI = ${ABACUS_LIBRI_VERSION}") +message(" ===================================================================") From b2be2ef52d243b824e19c37e5792e780b5bca6ce Mon Sep 17 00:00:00 2001 From: Growl Date: Tue, 14 Jul 2026 12:19:08 +0800 Subject: [PATCH 5/5] CuBLASMp requires cuSolverMp --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 910de52e4a..2a53055dfc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,8 +65,8 @@ cmake_dependent_option(ENABLE_MLALGO "Enable the machine learning algorithms" cmake_dependent_option(USE_CUDA_MPI "Enable CUDA-aware MPI" OFF "USE_CUDA" OFF) cmake_dependent_option(USE_CUDA_ON_DCU "Enable CUDA on DCU" OFF "USE_CUDA" OFF) -cmake_dependent_option(ENABLE_CUBLASMP "Enable cublasmp" OFF "USE_CUDA" OFF) cmake_dependent_option(ENABLE_CUSOLVERMP "Enable cusolvermp" OFF "USE_CUDA" OFF) +cmake_dependent_option(ENABLE_CUBLASMP "Enable cublasmp" OFF "ENABLE_CUSOLVERMP" OFF) cmake_dependent_option(ENABLE_NCCL_PARALLEL_DEVICE "Enable NCCL-backed collectives in parallel_device" OFF "USE_CUDA;ENABLE_MPI" OFF)