Skip to content

Commit 59dc884

Browse files
authored
Add FindKML.cmake and resolve FFTW3 issue (#7576)
* Add FindKML.cmake and resolve FFTW3 issue * FindKML: Add compiler check * Detect fftwf only if ENABLE_FLOAT_FFTW
1 parent 2d21aec commit 59dc884

5 files changed

Lines changed: 340 additions & 78 deletions

File tree

.github/workflows/cuda.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ jobs:
4646
nvidia-smi
4747
source toolchain/install/setup
4848
rm -rf build
49-
cmake -B build -G Ninja -DUSE_CUDA=ON -DBUILD_TESTING=ON
49+
cmake -B build -G Ninja -DUSE_CUDA=ON -DBUILD_TESTING=ON -DENABLE_FLOAT_FFTW=ON
5050
cmake --build build -j4
5151
cmake --install build
5252

CMakeLists.txt

Lines changed: 38 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -420,10 +420,8 @@ endif()
420420

421421
if(ENABLE_MPI)
422422
find_package(MPI COMPONENTS CXX REQUIRED)
423-
target_include_directories(abacus_external_deps INTERFACE ${MPI_CXX_INCLUDE_PATH})
424-
target_link_libraries(${ABACUS_BIN_NAME} PRIVATE MPI::MPI_CXX)
423+
target_link_libraries(abacus_external_deps INTERFACE MPI::MPI_CXX)
425424
abacus_add_feature_definitions(__MPI)
426-
list(APPEND math_libs MPI::MPI_CXX)
427425
endif()
428426

429427

@@ -438,47 +436,6 @@ if (USE_DSP)
438436
endif()
439437

440438

441-
if(USE_KML)
442-
abacus_add_feature_definitions(__KML)
443-
message(STATUS "Huawei KML support enabled. Defining __KML.")
444-
# TODO: Create FindKML.cmake
445-
# if(NOT DEFINED KML_ROOT)
446-
# if(DEFINED ENV{KML_ROOT})
447-
# set(KML_ROOT $ENV{KML_ROOT})
448-
# else()
449-
# message(WARNING "KML_ROOT is not set. Trying default system paths for KML.")
450-
# endif()
451-
# endif()
452-
#
453-
# find_library(KML_BLAS_LIB NAMES kblas PATHS ${KML_ROOT}/lib ${KML_ROOT}/lib64 NO_DEFAULT_PATH)
454-
# find_library(KML_LAPACK_LIB NAMES klapack_full PATHS ${KML_ROOT}/lib ${KML_ROOT}/lib64 NO_DEFAULT_PATH)
455-
# find_library(KML_SCALAPACK_LIB NAMES kscalapack_full PATHS ${KML_ROOT}/lib ${KML_ROOT}/lib64 NO_DEFAULT_PATH)
456-
# find_library(KML_FFTW_LIB NAMES fftw3 PATHS ${KML_ROOT}/lib ${KML_ROOT}/lib64 NO_DEFAULT_PATH)
457-
#
458-
# set(KML_LIBS_FOUND TRUE)
459-
# foreach(LIB_VAR KML_BLAS_LIB KML_LAPACK_LIB KML_SCALAPACK_LIB KML_FFTW_LIB)
460-
# if(NOT ${LIB_VAR})
461-
# message(WARNING "${LIB_VAR} not found in KML_ROOT! Please check your KML installation.")
462-
# set(KML_LIBS_FOUND FALSE)
463-
# endif()
464-
# endforeach()
465-
#
466-
# if(KML_LIBS_FOUND)
467-
# target_link_libraries(abacus PUBLIC
468-
# ${KML_BLAS_LIB}
469-
# ${KML_LAPACK_LIB}
470-
# ${KML_SCALAPACK_LIB}
471-
# ${KML_FFTW_LIB}
472-
# )
473-
# message(STATUS "Huawei KML libraries found and linked successfully.")
474-
# else()
475-
# message(FATAL_ERROR "Failed to find all required KML libraries. Aborting.")
476-
# endif()
477-
#
478-
# set(BLAS_libraries ${KML_BLAS_LIB})
479-
# set(LAPACK_libraries ${KML_LAPACK_LIB})
480-
endif(USE_KML)
481-
482439

483440
if (USE_SW)
484441
abacus_add_feature_definitions(__SW)
@@ -694,32 +651,45 @@ endif()
694651
if(DEFINED ENV{MKLROOT} AND NOT DEFINED MKLROOT)
695652
set(MKLROOT "$ENV{MKLROOT}")
696653
endif()
697-
if(MKLROOT)
654+
if(USE_KML)
655+
set(_kml_components BLAS LAPACK FFTW3)
656+
if(ENABLE_MPI)
657+
list(APPEND _kml_components ScaLAPACK)
658+
endif()
659+
if(ENABLE_FLOAT_FFTW)
660+
list(APPEND _kml_components FFTW3_FLOAT)
661+
endif()
662+
663+
find_package(KML REQUIRED COMPONENTS ${_kml_components})
664+
if(ENABLE_MPI)
665+
target_link_libraries(abacus_external_deps INTERFACE KML::ScaLAPACK)
666+
else()
667+
target_link_libraries(abacus_external_deps INTERFACE KML::LAPACK)
668+
endif()
669+
target_link_libraries(abacus_external_deps INTERFACE KML::FFTW3)
670+
if(ENABLE_FLOAT_FFTW)
671+
target_link_libraries(abacus_external_deps INTERFACE KML::FFTW3_FLOAT)
672+
endif()
673+
abacus_add_feature_definitions(__KML)
674+
elseif(MKLROOT)
698675
set(MKL_INTERFACE lp64)
699676
set(ENABLE_SCALAPACK ON)
700677
find_package(MKL REQUIRED)
701678
abacus_add_feature_definitions(__MKL)
702-
target_include_directories(abacus_external_deps INTERFACE ${MKL_INCLUDE} ${MKL_INCLUDE}/fftw)
703-
list(APPEND math_libs MKL::MKL)
679+
target_include_directories(abacus_external_deps INTERFACE ${MKL_INCLUDE}/fftw)
680+
target_link_libraries(abacus_external_deps INTERFACE MKL::MKL)
704681
if(CMAKE_CXX_COMPILER_ID MATCHES Intel)
705682
list(APPEND math_libs ifcore)
706683
endif()
707684
elseif(NOT USE_SW)
708-
find_package(FFTW3 REQUIRED)
709685
find_package(Lapack REQUIRED)
710-
list(APPEND math_libs FFTW3::FFTW3 LAPACK::LAPACK BLAS::BLAS)
686+
target_link_libraries(abacus_external_deps INTERFACE LAPACK::LAPACK BLAS::BLAS)
711687
# ScaLAPACK is a distributed-memory library and is only needed for the
712688
# MPI build. A serial build (e.g. the native Windows serial version)
713689
# must not require it.
714690
if(ENABLE_MPI)
715691
find_package(ScaLAPACK REQUIRED)
716-
list(APPEND math_libs ScaLAPACK::ScaLAPACK)
717-
endif()
718-
if(USE_OPENMP)
719-
list(APPEND math_libs FFTW3::FFTW3_OMP)
720-
endif()
721-
if(ENABLE_FLOAT_FFTW)
722-
list(APPEND math_libs FFTW3::FFTW3_FLOAT)
692+
target_link_libraries(abacus_external_deps INTERFACE ScaLAPACK::ScaLAPACK)
723693
endif()
724694
if(CMAKE_CXX_COMPILER_ID MATCHES GNU)
725695
list(APPEND math_libs gfortran)
@@ -732,6 +702,17 @@ elseif(NOT USE_SW)
732702
endif()
733703
endif()
734704

705+
if(NOT USE_KML AND NOT MKLROOT AND NOT USE_SW)
706+
find_package(FFTW3 REQUIRED)
707+
target_link_libraries(abacus_external_deps INTERFACE FFTW3::FFTW3)
708+
if(USE_OPENMP)
709+
target_link_libraries(abacus_external_deps INTERFACE FFTW3::FFTW3_OMP)
710+
endif()
711+
if(ENABLE_FLOAT_FFTW)
712+
target_link_libraries(abacus_external_deps INTERFACE FFTW3::FFTW3_FLOAT)
713+
endif()
714+
endif()
715+
735716
if(ENABLE_FLOAT_FFTW)
736717
abacus_add_feature_definitions(__ENABLE_FLOAT_FFTW)
737718
endif()
@@ -768,7 +749,7 @@ if(ENABLE_MLALGO OR DEFINED Torch_DIR)
768749
set_if_higher(CMAKE_CXX_STANDARD 14)
769750
endif()
770751
target_include_directories(abacus_external_deps INTERFACE ${TORCH_INCLUDE_DIRS})
771-
list(APPEND math_libs ${TORCH_LIBRARIES})
752+
target_link_libraries(abacus_external_deps INTERFACE ${TORCH_LIBRARIES})
772753
add_compile_options(${TORCH_CXX_FLAGS})
773754
endif()
774755

cmake/FindFFTW3.cmake

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,29 +16,35 @@ find_library(FFTW3_LIBRARY
1616
HINTS ${FFTW3_DIR}
1717
PATH_SUFFIXES "lib"
1818
)
19-
find_library(FFTW3_FLOAT_LIBRARY
20-
NAMES fftw3f
21-
HINTS ${FFTW3_DIR}
22-
PATH_SUFFIXES "lib"
23-
)
2419

25-
# both libfftw3.so and libfftw3_omp.so should be link in multi-thread term
20+
if(ENABLE_FLOAT_FFTW)
21+
find_library(FFTW3_FLOAT_LIBRARY
22+
NAMES fftw3f
23+
HINTS ${FFTW3_DIR}
24+
PATH_SUFFIXES "lib"
25+
)
26+
endif()
27+
28+
# Both libfftw3.so and libfftw3_omp.so are required for OpenMP builds.
2629
if (USE_OPENMP)
27-
find_library(FFTW3_OMP_LIBRARY
28-
NAMES fftw3_omp
29-
HINTS ${FFTW3_DIR}
30-
PATH_SUFFIXES "lib"
31-
)
30+
find_library(FFTW3_OMP_LIBRARY
31+
NAMES fftw3_omp
32+
HINTS ${FFTW3_DIR}
33+
PATH_SUFFIXES "lib"
34+
)
3235
endif()
3336

3437
# Handle the QUIET and REQUIRED arguments and
3538
# set FFTW3_FOUND to TRUE if all variables are non-zero.
3639
include(FindPackageHandleStandardArgs)
37-
if (USE_OPENMP)
38-
find_package_handle_standard_args(FFTW3 DEFAULT_MSG FFTW3_OMP_LIBRARY FFTW3_LIBRARY FFTW3_FLOAT_LIBRARY FFTW3_INCLUDE_DIR)
39-
else()
40-
find_package_handle_standard_args(FFTW3 DEFAULT_MSG FFTW3_LIBRARY FFTW3_FLOAT_LIBRARY FFTW3_INCLUDE_DIR)
40+
set(_fftw3_required_vars FFTW3_LIBRARY FFTW3_INCLUDE_DIR)
41+
if(USE_OPENMP)
42+
list(APPEND _fftw3_required_vars FFTW3_OMP_LIBRARY)
43+
endif()
44+
if(ENABLE_FLOAT_FFTW)
45+
list(APPEND _fftw3_required_vars FFTW3_FLOAT_LIBRARY)
4146
endif()
47+
find_package_handle_standard_args(FFTW3 DEFAULT_MSG ${_fftw3_required_vars})
4248

4349
# Copy the results to the output variables and target.
4450
if(FFTW3_FOUND)
@@ -64,7 +70,7 @@ if(FFTW3_FOUND)
6470
IMPORTED_LOCATION "${FFTW3_LIBRARY}"
6571
INTERFACE_INCLUDE_DIRECTORIES "${FFTW3_INCLUDE_DIRS}")
6672
endif()
67-
if(NOT TARGET FFTW3::FFTW3_FLOAT)
73+
if(ENABLE_FLOAT_FFTW AND NOT TARGET FFTW3::FFTW3_FLOAT)
6874
add_library(FFTW3::FFTW3_FLOAT UNKNOWN IMPORTED)
6975
set_target_properties(FFTW3::FFTW3_FLOAT PROPERTIES
7076
IMPORTED_LINK_INTERFACE_LANGUAGES "C"

0 commit comments

Comments
 (0)