Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/cuda.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ jobs:
nvidia-smi
source toolchain/install/setup
rm -rf build
cmake -B build -G Ninja -DUSE_CUDA=ON -DBUILD_TESTING=ON
cmake -B build -G Ninja -DUSE_CUDA=ON -DBUILD_TESTING=ON -DENABLE_FLOAT_FFTW=ON
cmake --build build -j4
cmake --install build
Expand Down
95 changes: 38 additions & 57 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -420,10 +420,8 @@ endif()

if(ENABLE_MPI)
find_package(MPI COMPONENTS CXX REQUIRED)
target_include_directories(abacus_external_deps INTERFACE ${MPI_CXX_INCLUDE_PATH})
target_link_libraries(${ABACUS_BIN_NAME} PRIVATE MPI::MPI_CXX)
target_link_libraries(abacus_external_deps INTERFACE MPI::MPI_CXX)
abacus_add_feature_definitions(__MPI)
list(APPEND math_libs MPI::MPI_CXX)
endif()


Expand All @@ -438,47 +436,6 @@ if (USE_DSP)
endif()


if(USE_KML)
abacus_add_feature_definitions(__KML)
message(STATUS "Huawei KML support enabled. Defining __KML.")
# TODO: Create FindKML.cmake
# if(NOT DEFINED KML_ROOT)
# if(DEFINED ENV{KML_ROOT})
# set(KML_ROOT $ENV{KML_ROOT})
# else()
# message(WARNING "KML_ROOT is not set. Trying default system paths for KML.")
# endif()
# endif()
#
# find_library(KML_BLAS_LIB NAMES kblas PATHS ${KML_ROOT}/lib ${KML_ROOT}/lib64 NO_DEFAULT_PATH)
# find_library(KML_LAPACK_LIB NAMES klapack_full PATHS ${KML_ROOT}/lib ${KML_ROOT}/lib64 NO_DEFAULT_PATH)
# find_library(KML_SCALAPACK_LIB NAMES kscalapack_full PATHS ${KML_ROOT}/lib ${KML_ROOT}/lib64 NO_DEFAULT_PATH)
# find_library(KML_FFTW_LIB NAMES fftw3 PATHS ${KML_ROOT}/lib ${KML_ROOT}/lib64 NO_DEFAULT_PATH)
#
# set(KML_LIBS_FOUND TRUE)
# foreach(LIB_VAR KML_BLAS_LIB KML_LAPACK_LIB KML_SCALAPACK_LIB KML_FFTW_LIB)
# if(NOT ${LIB_VAR})
# message(WARNING "${LIB_VAR} not found in KML_ROOT! Please check your KML installation.")
# set(KML_LIBS_FOUND FALSE)
# endif()
# endforeach()
#
# if(KML_LIBS_FOUND)
# target_link_libraries(abacus PUBLIC
# ${KML_BLAS_LIB}
# ${KML_LAPACK_LIB}
# ${KML_SCALAPACK_LIB}
# ${KML_FFTW_LIB}
# )
# message(STATUS "Huawei KML libraries found and linked successfully.")
# else()
# message(FATAL_ERROR "Failed to find all required KML libraries. Aborting.")
# endif()
#
# set(BLAS_libraries ${KML_BLAS_LIB})
# set(LAPACK_libraries ${KML_LAPACK_LIB})
endif(USE_KML)


if (USE_SW)
abacus_add_feature_definitions(__SW)
Expand Down Expand Up @@ -694,32 +651,45 @@ endif()
if(DEFINED ENV{MKLROOT} AND NOT DEFINED MKLROOT)
set(MKLROOT "$ENV{MKLROOT}")
endif()
if(MKLROOT)
if(USE_KML)
set(_kml_components BLAS LAPACK FFTW3)
if(ENABLE_MPI)
list(APPEND _kml_components ScaLAPACK)
endif()
if(ENABLE_FLOAT_FFTW)
list(APPEND _kml_components FFTW3_FLOAT)
endif()

find_package(KML REQUIRED COMPONENTS ${_kml_components})
if(ENABLE_MPI)
target_link_libraries(abacus_external_deps INTERFACE KML::ScaLAPACK)
else()
target_link_libraries(abacus_external_deps INTERFACE KML::LAPACK)
endif()
target_link_libraries(abacus_external_deps INTERFACE KML::FFTW3)
if(ENABLE_FLOAT_FFTW)
target_link_libraries(abacus_external_deps INTERFACE KML::FFTW3_FLOAT)
endif()
abacus_add_feature_definitions(__KML)
elseif(MKLROOT)
set(MKL_INTERFACE lp64)
set(ENABLE_SCALAPACK ON)
find_package(MKL REQUIRED)
abacus_add_feature_definitions(__MKL)
target_include_directories(abacus_external_deps INTERFACE ${MKL_INCLUDE} ${MKL_INCLUDE}/fftw)
list(APPEND math_libs MKL::MKL)
target_include_directories(abacus_external_deps INTERFACE ${MKL_INCLUDE}/fftw)
target_link_libraries(abacus_external_deps INTERFACE MKL::MKL)
if(CMAKE_CXX_COMPILER_ID MATCHES Intel)
list(APPEND math_libs ifcore)
endif()
elseif(NOT USE_SW)
find_package(FFTW3 REQUIRED)
find_package(Lapack REQUIRED)
list(APPEND math_libs FFTW3::FFTW3 LAPACK::LAPACK BLAS::BLAS)
target_link_libraries(abacus_external_deps INTERFACE LAPACK::LAPACK BLAS::BLAS)
# ScaLAPACK is a distributed-memory library and is only needed for the
# MPI build. A serial build (e.g. the native Windows serial version)
# must not require it.
if(ENABLE_MPI)
find_package(ScaLAPACK REQUIRED)
list(APPEND math_libs ScaLAPACK::ScaLAPACK)
endif()
if(USE_OPENMP)
list(APPEND math_libs FFTW3::FFTW3_OMP)
endif()
if(ENABLE_FLOAT_FFTW)
list(APPEND math_libs FFTW3::FFTW3_FLOAT)
target_link_libraries(abacus_external_deps INTERFACE ScaLAPACK::ScaLAPACK)
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES GNU)
list(APPEND math_libs gfortran)
Expand All @@ -732,6 +702,17 @@ elseif(NOT USE_SW)
endif()
endif()

if(NOT USE_KML AND NOT MKLROOT AND NOT USE_SW)
find_package(FFTW3 REQUIRED)
target_link_libraries(abacus_external_deps INTERFACE FFTW3::FFTW3)
if(USE_OPENMP)
target_link_libraries(abacus_external_deps INTERFACE FFTW3::FFTW3_OMP)
endif()
if(ENABLE_FLOAT_FFTW)
target_link_libraries(abacus_external_deps INTERFACE FFTW3::FFTW3_FLOAT)
endif()
endif()

if(ENABLE_FLOAT_FFTW)
abacus_add_feature_definitions(__ENABLE_FLOAT_FFTW)
endif()
Expand Down Expand Up @@ -768,7 +749,7 @@ if(ENABLE_MLALGO OR DEFINED Torch_DIR)
set_if_higher(CMAKE_CXX_STANDARD 14)
endif()
target_include_directories(abacus_external_deps INTERFACE ${TORCH_INCLUDE_DIRS})
list(APPEND math_libs ${TORCH_LIBRARIES})
target_link_libraries(abacus_external_deps INTERFACE ${TORCH_LIBRARIES})
add_compile_options(${TORCH_CXX_FLAGS})
endif()

Expand Down
38 changes: 22 additions & 16 deletions cmake/FindFFTW3.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -16,29 +16,35 @@ find_library(FFTW3_LIBRARY
HINTS ${FFTW3_DIR}
PATH_SUFFIXES "lib"
)
find_library(FFTW3_FLOAT_LIBRARY
NAMES fftw3f
HINTS ${FFTW3_DIR}
PATH_SUFFIXES "lib"
)

# both libfftw3.so and libfftw3_omp.so should be link in multi-thread term
if(ENABLE_FLOAT_FFTW)
find_library(FFTW3_FLOAT_LIBRARY
NAMES fftw3f
HINTS ${FFTW3_DIR}
PATH_SUFFIXES "lib"
)
endif()

# Both libfftw3.so and libfftw3_omp.so are required for OpenMP builds.
if (USE_OPENMP)
find_library(FFTW3_OMP_LIBRARY
NAMES fftw3_omp
HINTS ${FFTW3_DIR}
PATH_SUFFIXES "lib"
)
find_library(FFTW3_OMP_LIBRARY
NAMES fftw3_omp
HINTS ${FFTW3_DIR}
PATH_SUFFIXES "lib"
)
endif()

# Handle the QUIET and REQUIRED arguments and
# set FFTW3_FOUND to TRUE if all variables are non-zero.
include(FindPackageHandleStandardArgs)
if (USE_OPENMP)
find_package_handle_standard_args(FFTW3 DEFAULT_MSG FFTW3_OMP_LIBRARY FFTW3_LIBRARY FFTW3_FLOAT_LIBRARY FFTW3_INCLUDE_DIR)
else()
find_package_handle_standard_args(FFTW3 DEFAULT_MSG FFTW3_LIBRARY FFTW3_FLOAT_LIBRARY FFTW3_INCLUDE_DIR)
set(_fftw3_required_vars FFTW3_LIBRARY FFTW3_INCLUDE_DIR)
if(USE_OPENMP)
list(APPEND _fftw3_required_vars FFTW3_OMP_LIBRARY)
endif()
if(ENABLE_FLOAT_FFTW)
list(APPEND _fftw3_required_vars FFTW3_FLOAT_LIBRARY)
endif()
find_package_handle_standard_args(FFTW3 DEFAULT_MSG ${_fftw3_required_vars})

# Copy the results to the output variables and target.
if(FFTW3_FOUND)
Expand All @@ -64,7 +70,7 @@ if(FFTW3_FOUND)
IMPORTED_LOCATION "${FFTW3_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${FFTW3_INCLUDE_DIRS}")
endif()
if(NOT TARGET FFTW3::FFTW3_FLOAT)
if(ENABLE_FLOAT_FFTW AND NOT TARGET FFTW3::FFTW3_FLOAT)
add_library(FFTW3::FFTW3_FLOAT UNKNOWN IMPORTED)
set_target_properties(FFTW3::FFTW3_FLOAT PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
Expand Down
Loading
Loading