|
| 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