Skip to content

Commit fc04c5e

Browse files
committed
Add FindKML.cmake and resolve FFTW3 issue
1 parent 33a7acd commit fc04c5e

3 files changed

Lines changed: 287 additions & 60 deletions

File tree

CMakeLists.txt

Lines changed: 37 additions & 56 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()

cmake/FindKML.cmake

Lines changed: 250 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,250 @@
1+
# - Find Huawei Kunpeng Math Library (KML)
2+
#
3+
# This module finds the KML linear-algebra libraries. KML installs optimized
4+
# variants below architecture- and threading-specific directories, so those
5+
# choices are made here rather than at each consumer.
6+
#
7+
# Imported targets:
8+
# KML::BLAS KML BLAS
9+
# KML::LAPACK KML LAPACK, with KML::BLAS transitively linked
10+
# KML::ScaLAPACK KML ScaLAPACK, with KML::LAPACK transitively linked
11+
# KML::FFTW3 KML FFTW-compatible double-precision FFT interface
12+
# KML::FFTW3_FLOAT KML FFTW-compatible single-precision FFT interface
13+
#
14+
# If libkml_rt is present, KML::BLAS also propagates it as a runtime
15+
# dependency.
16+
#
17+
# Cache variables:
18+
# KML_ROOT KML installation prefix
19+
# KML_ARCH KML library variant: neon, sve, or sve512
20+
# KML_BLAS_THREADING kblas variant: auto, omp, pthread, locking, or
21+
# nolocking (default: auto)
22+
#
23+
# The default threading selection uses the caller's USE_OPENMP option when it
24+
# is available: omp for OpenMP builds and nolocking otherwise. Projects that
25+
# use a different threading model can select a KML_BLAS_THREADING variant
26+
# explicitly.
27+
28+
include(FindPackageHandleStandardArgs)
29+
30+
set(KML_ARCH "neon" CACHE STRING "KML library variant (neon, sve, or sve512)")
31+
set_property(CACHE KML_ARCH PROPERTY STRINGS neon sve sve512)
32+
33+
set(KML_BLAS_THREADING "auto" CACHE STRING
34+
"KML kblas threading variant (auto, omp, pthread, locking, or nolocking)")
35+
set_property(CACHE KML_BLAS_THREADING PROPERTY STRINGS
36+
auto omp pthread locking nolocking)
37+
38+
set(_kml_arch_variants neon sve sve512)
39+
if(NOT KML_ARCH IN_LIST _kml_arch_variants)
40+
message(FATAL_ERROR "KML_ARCH must be one of: ${_kml_arch_variants}")
41+
endif()
42+
43+
set(_kml_thread_variants omp pthread locking nolocking)
44+
if(KML_BLAS_THREADING STREQUAL "auto")
45+
if(DEFINED USE_OPENMP AND USE_OPENMP)
46+
set(_kml_blas_threading omp)
47+
else()
48+
set(_kml_blas_threading nolocking)
49+
endif()
50+
else()
51+
set(_kml_blas_threading "${KML_BLAS_THREADING}")
52+
endif()
53+
54+
if(NOT _kml_blas_threading IN_LIST _kml_thread_variants)
55+
message(FATAL_ERROR
56+
"KML_BLAS_THREADING must be auto or one of: ${_kml_thread_variants}")
57+
endif()
58+
59+
set(_kml_prefix_hints)
60+
if(KML_ROOT)
61+
list(APPEND _kml_prefix_hints "${KML_ROOT}")
62+
endif()
63+
if(DEFINED ENV{KML_ROOT})
64+
list(APPEND _kml_prefix_hints "$ENV{KML_ROOT}")
65+
endif()
66+
list(APPEND _kml_prefix_hints /usr/local/kml)
67+
68+
find_path(KML_INCLUDE_DIR
69+
NAMES kblas.h klapack.h kscalapack.h
70+
HINTS ${_kml_prefix_hints}
71+
PATH_SUFFIXES include)
72+
73+
if(KML_INCLUDE_DIR)
74+
get_filename_component(_kml_prefix "${KML_INCLUDE_DIR}" DIRECTORY)
75+
76+
find_library(KML_RUNTIME_LIBRARY
77+
NAMES kml_rt
78+
HINTS "${_kml_prefix}"
79+
PATH_SUFFIXES lib
80+
NO_DEFAULT_PATH)
81+
82+
find_library(KML_BLAS_LIBRARY
83+
NAMES kblas
84+
HINTS "${_kml_prefix}"
85+
PATH_SUFFIXES "lib/${KML_ARCH}/kblas/${_kml_blas_threading}"
86+
NO_DEFAULT_PATH)
87+
88+
find_library(KML_LAPACK_LIBRARY
89+
NAMES klapack_full
90+
HINTS "${_kml_prefix}"
91+
PATH_SUFFIXES "lib/${KML_ARCH}"
92+
NO_DEFAULT_PATH)
93+
94+
find_library(KML_SCALAPACK_LIBRARY
95+
NAMES kscalapack_full
96+
HINTS "${_kml_prefix}"
97+
PATH_SUFFIXES "lib/${KML_ARCH}"
98+
NO_DEFAULT_PATH)
99+
100+
find_library(KML_FFTW3_LIBRARY
101+
NAMES fftw3
102+
HINTS "${_kml_prefix}"
103+
PATH_SUFFIXES lib/noarch
104+
NO_DEFAULT_PATH)
105+
106+
find_library(KML_KFFT_LIBRARY
107+
NAMES kfft
108+
HINTS "${_kml_prefix}"
109+
PATH_SUFFIXES "lib/${KML_ARCH}"
110+
NO_DEFAULT_PATH)
111+
112+
find_library(KML_FFTW3_FLOAT_LIBRARY
113+
NAMES fftw3f
114+
HINTS "${_kml_prefix}"
115+
PATH_SUFFIXES lib/noarch
116+
NO_DEFAULT_PATH)
117+
118+
find_library(KML_KFFTF_LIBRARY
119+
NAMES kfftf
120+
HINTS "${_kml_prefix}"
121+
PATH_SUFFIXES "lib/${KML_ARCH}"
122+
NO_DEFAULT_PATH)
123+
endif()
124+
125+
set(KML_BLAS_FOUND FALSE)
126+
if(KML_INCLUDE_DIR AND KML_BLAS_LIBRARY)
127+
set(KML_BLAS_FOUND TRUE)
128+
endif()
129+
130+
set(KML_LAPACK_FOUND FALSE)
131+
if(KML_BLAS_FOUND AND KML_LAPACK_LIBRARY)
132+
set(KML_LAPACK_FOUND TRUE)
133+
endif()
134+
135+
set(KML_ScaLAPACK_FOUND FALSE)
136+
if(KML_LAPACK_FOUND AND KML_SCALAPACK_LIBRARY)
137+
set(KML_ScaLAPACK_FOUND TRUE)
138+
endif()
139+
set(KML_SCALAPACK_FOUND "${KML_ScaLAPACK_FOUND}")
140+
141+
set(KML_FFTW3_FOUND FALSE)
142+
if(KML_INCLUDE_DIR AND EXISTS "${KML_INCLUDE_DIR}/fftw3.h" AND
143+
KML_FFTW3_LIBRARY AND KML_KFFT_LIBRARY)
144+
set(KML_FFTW3_FOUND TRUE)
145+
endif()
146+
147+
set(KML_FFTW3_FLOAT_FOUND FALSE)
148+
if(KML_INCLUDE_DIR AND EXISTS "${KML_INCLUDE_DIR}/fftw3.h" AND
149+
KML_FFTW3_FLOAT_LIBRARY AND KML_KFFTF_LIBRARY)
150+
set(KML_FFTW3_FLOAT_FOUND TRUE)
151+
endif()
152+
153+
set(_kml_required_vars KML_INCLUDE_DIR)
154+
if(KML_FIND_COMPONENTS)
155+
foreach(_kml_component IN LISTS KML_FIND_COMPONENTS)
156+
if(_kml_component STREQUAL "BLAS")
157+
list(APPEND _kml_required_vars KML_BLAS_LIBRARY)
158+
elseif(_kml_component STREQUAL "LAPACK")
159+
list(APPEND _kml_required_vars KML_LAPACK_LIBRARY KML_BLAS_LIBRARY)
160+
elseif(_kml_component STREQUAL "ScaLAPACK" OR _kml_component STREQUAL "SCALAPACK")
161+
set(KML_${_kml_component}_FOUND "${KML_ScaLAPACK_FOUND}")
162+
list(APPEND _kml_required_vars
163+
KML_SCALAPACK_LIBRARY KML_LAPACK_LIBRARY KML_BLAS_LIBRARY)
164+
elseif(_kml_component STREQUAL "FFTW3")
165+
list(APPEND _kml_required_vars KML_FFTW3_LIBRARY KML_KFFT_LIBRARY)
166+
elseif(_kml_component STREQUAL "FFTW3_FLOAT")
167+
list(APPEND _kml_required_vars
168+
KML_FFTW3_FLOAT_LIBRARY KML_KFFTF_LIBRARY)
169+
else()
170+
set(KML_${_kml_component}_FOUND FALSE)
171+
endif()
172+
endforeach()
173+
else()
174+
list(APPEND _kml_required_vars KML_BLAS_LIBRARY KML_LAPACK_LIBRARY)
175+
endif()
176+
list(REMOVE_DUPLICATES _kml_required_vars)
177+
178+
find_package_handle_standard_args(KML
179+
REQUIRED_VARS ${_kml_required_vars}
180+
HANDLE_COMPONENTS)
181+
182+
if(KML_FOUND)
183+
set(KML_INCLUDE_DIRS "${KML_INCLUDE_DIR}")
184+
185+
if(KML_RUNTIME_LIBRARY AND NOT TARGET KML::Runtime)
186+
add_library(KML::Runtime UNKNOWN IMPORTED)
187+
set_target_properties(KML::Runtime PROPERTIES
188+
IMPORTED_LOCATION "${KML_RUNTIME_LIBRARY}")
189+
endif()
190+
191+
if(KML_BLAS_FOUND AND NOT TARGET KML::BLAS)
192+
add_library(KML::BLAS UNKNOWN IMPORTED)
193+
set_target_properties(KML::BLAS PROPERTIES
194+
IMPORTED_LOCATION "${KML_BLAS_LIBRARY}"
195+
INTERFACE_INCLUDE_DIRECTORIES "${KML_INCLUDE_DIR}")
196+
if(TARGET KML::Runtime)
197+
set_property(TARGET KML::BLAS PROPERTY
198+
INTERFACE_LINK_LIBRARIES KML::Runtime)
199+
endif()
200+
endif()
201+
202+
if(KML_LAPACK_FOUND AND NOT TARGET KML::LAPACK)
203+
add_library(KML::LAPACK UNKNOWN IMPORTED)
204+
set_target_properties(KML::LAPACK PROPERTIES
205+
IMPORTED_LOCATION "${KML_LAPACK_LIBRARY}"
206+
INTERFACE_INCLUDE_DIRECTORIES "${KML_INCLUDE_DIR}"
207+
INTERFACE_LINK_LIBRARIES KML::BLAS)
208+
endif()
209+
210+
if(KML_ScaLAPACK_FOUND AND NOT TARGET KML::ScaLAPACK)
211+
add_library(KML::ScaLAPACK UNKNOWN IMPORTED)
212+
set_target_properties(KML::ScaLAPACK PROPERTIES
213+
IMPORTED_LOCATION "${KML_SCALAPACK_LIBRARY}"
214+
INTERFACE_INCLUDE_DIRECTORIES "${KML_INCLUDE_DIR}"
215+
INTERFACE_LINK_LIBRARIES KML::LAPACK)
216+
endif()
217+
218+
if(KML_FFTW3_FOUND AND NOT TARGET KML::FFTW3)
219+
add_library(KML::FFTW3 UNKNOWN IMPORTED)
220+
set_target_properties(KML::FFTW3 PROPERTIES
221+
IMPORTED_LOCATION "${KML_FFTW3_LIBRARY}"
222+
INTERFACE_INCLUDE_DIRECTORIES "${KML_INCLUDE_DIR}"
223+
INTERFACE_LINK_LIBRARIES "${KML_KFFT_LIBRARY}")
224+
endif()
225+
226+
if(KML_FFTW3_FLOAT_FOUND AND NOT TARGET KML::FFTW3_FLOAT)
227+
add_library(KML::FFTW3_FLOAT UNKNOWN IMPORTED)
228+
set_target_properties(KML::FFTW3_FLOAT PROPERTIES
229+
IMPORTED_LOCATION "${KML_FFTW3_FLOAT_LIBRARY}"
230+
INTERFACE_INCLUDE_DIRECTORIES "${KML_INCLUDE_DIR}"
231+
INTERFACE_LINK_LIBRARIES "${KML_KFFTF_LIBRARY}")
232+
endif()
233+
234+
if(TARGET KML::LAPACK)
235+
set(KML_LIBRARIES KML::LAPACK)
236+
elseif(TARGET KML::BLAS)
237+
set(KML_LIBRARIES KML::BLAS)
238+
endif()
239+
endif()
240+
241+
mark_as_advanced(
242+
KML_INCLUDE_DIR
243+
KML_RUNTIME_LIBRARY
244+
KML_BLAS_LIBRARY
245+
KML_LAPACK_LIBRARY
246+
KML_SCALAPACK_LIBRARY
247+
KML_FFTW3_LIBRARY
248+
KML_KFFT_LIBRARY
249+
KML_FFTW3_FLOAT_LIBRARY
250+
KML_KFFTF_LIBRARY)

0 commit comments

Comments
 (0)