FindBLAS.cmake 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170
  1. # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. # file Copyright.txt or https://cmake.org/licensing for details.
  3. #[=======================================================================[.rst:
  4. FindBLAS
  5. --------
  6. Find Basic Linear Algebra Subprograms (BLAS) library
  7. This module finds an installed Fortran library that implements the
  8. `BLAS linear-algebra interface`_.
  9. At least one of the ``C``, ``CXX``, or ``Fortran`` languages must be enabled.
  10. .. _`BLAS linear-algebra interface`: http://www.netlib.org/blas/
  11. Input Variables
  12. ^^^^^^^^^^^^^^^
  13. The following variables may be set to influence this module's behavior:
  14. ``BLA_STATIC``
  15. if ``ON`` use static linkage
  16. ``BLA_VENDOR``
  17. Set to one of the :ref:`BLAS/LAPACK Vendors` to search for BLAS only
  18. from the specified vendor. If not set, all vendors are considered.
  19. ``BLA_F95``
  20. if ``ON`` tries to find the BLAS95 interfaces
  21. ``BLA_PREFER_PKGCONFIG``
  22. .. versionadded:: 3.11
  23. if set ``pkg-config`` will be used to search for a BLAS library first
  24. and if one is found that is preferred
  25. Imported targets
  26. ^^^^^^^^^^^^^^^^
  27. This module defines the following :prop_tgt:`IMPORTED` targets:
  28. ``BLAS::BLAS``
  29. .. versionadded:: 3.18
  30. The libraries to use for BLAS, if found.
  31. Result Variables
  32. ^^^^^^^^^^^^^^^^
  33. This module defines the following variables:
  34. ``BLAS_FOUND``
  35. library implementing the BLAS interface is found
  36. ``BLAS_LINKER_FLAGS``
  37. uncached list of required linker flags (excluding ``-l`` and ``-L``).
  38. ``BLAS_LIBRARIES``
  39. uncached list of libraries (using full path name) to link against
  40. to use BLAS (may be empty if compiler implicitly links BLAS)
  41. ``BLAS95_LIBRARIES``
  42. uncached list of libraries (using full path name) to link against
  43. to use BLAS95 interface
  44. ``BLAS95_FOUND``
  45. library implementing the BLAS95 interface is found
  46. .. _`BLAS/LAPACK Vendors`:
  47. BLAS/LAPACK Vendors
  48. ^^^^^^^^^^^^^^^^^^^
  49. ``Generic``
  50. Generic reference implementation
  51. ``ACML``, ``ACML_MP``, ``ACML_GPU``
  52. AMD Core Math Library
  53. ``Apple``, ``NAS``
  54. Apple BLAS (Accelerate), and Apple NAS (vecLib)
  55. ``Arm``, ``Arm_mp``, ``Arm_ilp64``, ``Arm_ilp64_mp``
  56. .. versionadded:: 3.18
  57. Arm Performance Libraries
  58. ``ATLAS``
  59. Automatically Tuned Linear Algebra Software
  60. ``CXML``, ``DXML``
  61. Compaq/Digital Extended Math Library
  62. ``EML``, ``EML_mt``
  63. .. versionadded:: 3.20
  64. Elbrus Math Library
  65. ``FLAME``
  66. .. versionadded:: 3.11
  67. BLIS Framework
  68. ``FlexiBLAS``
  69. .. versionadded:: 3.19
  70. ``Fujitsu_SSL2``, ``Fujitsu_SSL2BLAMP``
  71. .. versionadded:: 3.20
  72. Fujitsu SSL2 serial and parallel blas/lapack
  73. ``Goto``
  74. GotoBLAS
  75. ``IBMESSL``
  76. IBM Engineering and Scientific Subroutine Library
  77. ``Intel``
  78. Intel MKL 32 bit and 64 bit obsolete versions
  79. ``Intel10_32``
  80. Intel MKL v10 32 bit, threaded code
  81. ``Intel10_64lp``
  82. Intel MKL v10+ 64 bit, threaded code, lp64 model
  83. ``Intel10_64lp_seq``
  84. Intel MKL v10+ 64 bit, sequential code, lp64 model
  85. ``Intel10_64ilp``
  86. .. versionadded:: 3.13
  87. Intel MKL v10+ 64 bit, threaded code, ilp64 model
  88. ``Intel10_64ilp_seq``
  89. .. versionadded:: 3.13
  90. Intel MKL v10+ 64 bit, sequential code, ilp64 model
  91. ``Intel10_64_dyn``
  92. .. versionadded:: 3.17
  93. Intel MKL v10+ 64 bit, single dynamic library
  94. ``NVHPC``
  95. .. versionadded:: 3.21
  96. NVIDIA HPC SDK
  97. ``OpenBLAS``
  98. .. versionadded:: 3.6
  99. ``PhiPACK``
  100. Portable High Performance ANSI C (PHiPAC)
  101. ``SCSL``
  102. Scientific Computing Software Library
  103. ``SGIMATH``
  104. SGI Scientific Mathematical Library
  105. ``SunPerf``
  106. Sun Performance Library
  107. .. _`Intel MKL`:
  108. Intel MKL
  109. ^^^^^^^^^
  110. To use the Intel MKL implementation of BLAS, a project must enable at least
  111. one of the ``C`` or ``CXX`` languages. Set ``BLA_VENDOR`` to an Intel MKL
  112. variant either on the command-line as ``-DBLA_VENDOR=Intel10_64lp`` or in
  113. project code:
  114. .. code-block:: cmake
  115. set(BLA_VENDOR Intel10_64lp)
  116. find_package(BLAS)
  117. In order to build a project using Intel MKL, and end user must first
  118. establish an Intel MKL environment:
  119. Intel oneAPI
  120. Source the full Intel environment script:
  121. .. code-block:: shell
  122. . /opt/intel/oneapi/setvars.sh
  123. Or, source the MKL component environment script:
  124. .. code-block:: shell
  125. . /opt/intel/oneapi/mkl/latest/env/vars.sh
  126. Intel Classic
  127. Source the full Intel environment script:
  128. .. code-block:: shell
  129. . /opt/intel/bin/compilervars.sh intel64
  130. Or, source the MKL component environment script:
  131. .. code-block:: shell
  132. . /opt/intel/mkl/bin/mklvars.sh intel64
  133. The above environment scripts set the ``MKLROOT`` environment variable
  134. to the top of the MKL installation. They also add the location of the
  135. runtime libraries to the dynamic library loader environment variable for
  136. your platform (e.g. ``LD_LIBRARY_PATH``). This is necessary for programs
  137. linked against MKL to run.
  138. .. note::
  139. As of Intel oneAPI 2021.2, loading only the MKL component does not
  140. make all of its dependencies available. In particular, the ``iomp5``
  141. library must be available separately, or provided by also loading
  142. the compiler component environment:
  143. .. code-block:: shell
  144. . /opt/intel/oneapi/compiler/latest/env/vars.sh
  145. #]=======================================================================]
  146. # The approach follows that of the ``autoconf`` macro file, ``acx_blas.m4``
  147. # (distributed at http://ac-archive.sourceforge.net/ac-archive/acx_blas.html).
  148. # Check the language being used
  149. if(NOT (CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED OR CMAKE_Fortran_COMPILER_LOADED))
  150. if(BLAS_FIND_REQUIRED)
  151. message(FATAL_ERROR "FindBLAS requires Fortran, C, or C++ to be enabled.")
  152. else()
  153. message(STATUS "Looking for BLAS... - NOT found (Unsupported languages)")
  154. return()
  155. endif()
  156. endif()
  157. function(_add_blas_target)
  158. if(BLAS_FOUND AND NOT TARGET BLAS::BLAS)
  159. add_library(BLAS::BLAS INTERFACE IMPORTED)
  160. if(BLAS_LIBRARIES)
  161. set_target_properties(BLAS::BLAS PROPERTIES
  162. INTERFACE_LINK_LIBRARIES "${BLAS_LIBRARIES}"
  163. )
  164. endif()
  165. if(BLAS_LINKER_FLAGS)
  166. set_target_properties(BLAS::BLAS PROPERTIES
  167. INTERFACE_LINK_OPTIONS "${BLAS_LINKER_FLAGS}"
  168. )
  169. endif()
  170. endif()
  171. endfunction()
  172. if(CMAKE_Fortran_COMPILER_LOADED)
  173. include(${CMAKE_CURRENT_LIST_DIR}/CheckFortranFunctionExists.cmake)
  174. else()
  175. include(${CMAKE_CURRENT_LIST_DIR}/CheckFunctionExists.cmake)
  176. endif()
  177. include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
  178. if(BLA_PREFER_PKGCONFIG)
  179. find_package(PkgConfig)
  180. pkg_check_modules(PKGC_BLAS blas)
  181. if(PKGC_BLAS_FOUND)
  182. set(BLAS_FOUND ${PKGC_BLAS_FOUND})
  183. set(BLAS_LIBRARIES "${PKGC_BLAS_LINK_LIBRARIES}")
  184. _add_blas_target()
  185. return()
  186. endif()
  187. endif()
  188. # TODO: move this stuff to a separate module
  189. function(CHECK_BLAS_LIBRARIES LIBRARIES _prefix _name _flags _list _deps _addlibdir _subdirs)
  190. # This function checks for the existence of the combination of libraries
  191. # given by _list. If the combination is found, this checks whether can link
  192. # against that library combination using the name of a routine given by _name
  193. # using the linker flags given by _flags. If the combination of libraries is
  194. # found and passes the link test, ${LIBRARIES} is set to the list of complete
  195. # library paths that have been found. Otherwise, ${LIBRARIES} is set to FALSE.
  196. set(_libraries_work TRUE)
  197. set(_libraries)
  198. set(_combined_name)
  199. if(BLA_STATIC)
  200. if(WIN32)
  201. set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES})
  202. else()
  203. set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
  204. endif()
  205. else()
  206. if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
  207. # for ubuntu's libblas3gf and liblapack3gf packages
  208. set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES} .so.3gf)
  209. endif()
  210. endif()
  211. set(_extaddlibdir "${_addlibdir}")
  212. if(WIN32)
  213. list(APPEND _extaddlibdir ENV LIB)
  214. elseif(APPLE)
  215. list(APPEND _extaddlibdir ENV DYLD_LIBRARY_PATH)
  216. else()
  217. list(APPEND _extaddlibdir ENV LD_LIBRARY_PATH)
  218. endif()
  219. list(APPEND _extaddlibdir "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}")
  220. foreach(_library ${_list})
  221. if(_library MATCHES "^-")
  222. # Respect linker flags as-is (required by MKL)
  223. list(APPEND _libraries "${_library}")
  224. else()
  225. string(REGEX REPLACE "[^A-Za-z0-9]" "_" _lib_var "${_library}")
  226. set(_combined_name ${_combined_name}_${_lib_var})
  227. if(NOT "${_deps}" STREQUAL "")
  228. set(_combined_name ${_combined_name}_deps)
  229. endif()
  230. if(_libraries_work)
  231. find_library(${_prefix}_${_lib_var}_LIBRARY
  232. NAMES ${_library}
  233. NAMES_PER_DIR
  234. PATHS ${_extaddlibdir}
  235. PATH_SUFFIXES ${_subdirs}
  236. )
  237. mark_as_advanced(${_prefix}_${_lib_var}_LIBRARY)
  238. list(APPEND _libraries ${${_prefix}_${_lib_var}_LIBRARY})
  239. set(_libraries_work ${${_prefix}_${_lib_var}_LIBRARY})
  240. endif()
  241. endif()
  242. endforeach()
  243. foreach(_flag ${_flags})
  244. string(REGEX REPLACE "[^A-Za-z0-9]" "_" _flag_var "${_flag}")
  245. set(_combined_name ${_combined_name}_${_flag_var})
  246. endforeach()
  247. if(_libraries_work)
  248. # Test this combination of libraries.
  249. set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${_libraries} ${_deps})
  250. set(CMAKE_REQUIRED_QUIET ${BLAS_FIND_QUIETLY})
  251. if(CMAKE_Fortran_COMPILER_LOADED)
  252. check_fortran_function_exists("${_name}" ${_prefix}${_combined_name}_WORKS)
  253. else()
  254. check_function_exists("${_name}_" ${_prefix}${_combined_name}_WORKS)
  255. endif()
  256. set(CMAKE_REQUIRED_LIBRARIES)
  257. set(_libraries_work ${${_prefix}${_combined_name}_WORKS})
  258. endif()
  259. if(_libraries_work)
  260. if("${_list}" STREQUAL "")
  261. set(_libraries "${LIBRARIES}-PLACEHOLDER-FOR-EMPTY-LIBRARIES")
  262. else()
  263. list(APPEND _libraries ${_deps})
  264. endif()
  265. else()
  266. set(_libraries FALSE)
  267. endif()
  268. set(${LIBRARIES} "${_libraries}" PARENT_SCOPE)
  269. endfunction()
  270. set(BLAS_LINKER_FLAGS)
  271. set(BLAS_LIBRARIES)
  272. set(BLAS95_LIBRARIES)
  273. set(_blas_fphsa_req_var BLAS_LIBRARIES)
  274. if(NOT $ENV{BLA_VENDOR} STREQUAL "")
  275. set(BLA_VENDOR $ENV{BLA_VENDOR})
  276. else()
  277. if(NOT BLA_VENDOR)
  278. set(BLA_VENDOR "All")
  279. endif()
  280. endif()
  281. # Implicitly linked BLAS libraries?
  282. if(BLA_VENDOR STREQUAL "All")
  283. if(NOT BLAS_LIBRARIES)
  284. check_blas_libraries(
  285. BLAS_LIBRARIES
  286. BLAS
  287. sgemm
  288. ""
  289. ""
  290. ""
  291. ""
  292. ""
  293. )
  294. endif()
  295. if(BLAS_WORKS)
  296. # Give a more helpful "found" message
  297. set(BLAS_WORKS "implicitly linked")
  298. set(_blas_fphsa_req_var BLAS_WORKS)
  299. endif()
  300. endif()
  301. # BLAS in the Intel MKL 10+ library?
  302. if(BLA_VENDOR MATCHES "Intel" OR BLA_VENDOR STREQUAL "All")
  303. if(NOT BLAS_LIBRARIES)
  304. if(CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED)
  305. # System-specific settings
  306. if(WIN32)
  307. if(BLA_STATIC)
  308. set(BLAS_mkl_DLL_SUFFIX "")
  309. else()
  310. set(BLAS_mkl_DLL_SUFFIX "_dll")
  311. endif()
  312. else()
  313. if(BLA_STATIC)
  314. set(BLAS_mkl_START_GROUP "-Wl,--start-group")
  315. set(BLAS_mkl_END_GROUP "-Wl,--end-group")
  316. else()
  317. set(BLAS_mkl_START_GROUP "")
  318. set(BLAS_mkl_END_GROUP "")
  319. endif()
  320. # Switch to GNU Fortran support layer if needed (but not on Apple, where MKL does not provide it)
  321. if(CMAKE_Fortran_COMPILER_LOADED AND CMAKE_Fortran_COMPILER_ID STREQUAL "GNU" AND NOT APPLE)
  322. set(BLAS_mkl_INTFACE "gf")
  323. set(BLAS_mkl_THREADING "gnu")
  324. set(BLAS_mkl_OMP "gomp")
  325. else()
  326. set(BLAS_mkl_INTFACE "intel")
  327. set(BLAS_mkl_THREADING "intel")
  328. set(BLAS_mkl_OMP "iomp5")
  329. endif()
  330. set(BLAS_mkl_LM "-lm")
  331. set(BLAS_mkl_LDL "-ldl")
  332. endif()
  333. if(BLAS_FIND_QUIETLY OR NOT BLAS_FIND_REQUIRED)
  334. find_package(Threads)
  335. else()
  336. find_package(Threads REQUIRED)
  337. endif()
  338. if(BLA_VENDOR MATCHES "_64ilp")
  339. set(BLAS_mkl_ILP_MODE "ilp64")
  340. else()
  341. set(BLAS_mkl_ILP_MODE "lp64")
  342. endif()
  343. set(BLAS_SEARCH_LIBS "")
  344. if(BLA_F95)
  345. set(BLAS_mkl_SEARCH_SYMBOL "sgemm_f95")
  346. set(_BLAS_LIBRARIES BLAS95_LIBRARIES)
  347. if(WIN32)
  348. # Find the main file (32-bit or 64-bit)
  349. set(BLAS_SEARCH_LIBS_WIN_MAIN "")
  350. if(BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
  351. list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
  352. "mkl_blas95${BLAS_mkl_DLL_SUFFIX} mkl_intel_c${BLAS_mkl_DLL_SUFFIX}")
  353. endif()
  354. if(BLA_VENDOR MATCHES "^Intel10_64i?lp" OR BLA_VENDOR STREQUAL "All")
  355. list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
  356. "mkl_blas95_${BLAS_mkl_ILP_MODE}${BLAS_mkl_DLL_SUFFIX} mkl_intel_${BLAS_mkl_ILP_MODE}${BLAS_mkl_DLL_SUFFIX}")
  357. endif()
  358. # Add threading/sequential libs
  359. set(BLAS_SEARCH_LIBS_WIN_THREAD "")
  360. if(BLA_VENDOR MATCHES "^Intel10_64i?lp$" OR BLA_VENDOR STREQUAL "All")
  361. # old version
  362. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  363. "libguide40 mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
  364. # mkl >= 10.3
  365. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  366. "libiomp5md mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
  367. endif()
  368. if(BLA_VENDOR MATCHES "^Intel10_64i?lp_seq$" OR BLA_VENDOR STREQUAL "All")
  369. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  370. "mkl_sequential${BLAS_mkl_DLL_SUFFIX}")
  371. endif()
  372. # Cartesian product of the above
  373. foreach(MAIN ${BLAS_SEARCH_LIBS_WIN_MAIN})
  374. foreach(THREAD ${BLAS_SEARCH_LIBS_WIN_THREAD})
  375. list(APPEND BLAS_SEARCH_LIBS
  376. "${MAIN} ${THREAD} mkl_core${BLAS_mkl_DLL_SUFFIX}")
  377. endforeach()
  378. endforeach()
  379. else()
  380. if(BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
  381. # old version
  382. list(APPEND BLAS_SEARCH_LIBS
  383. "mkl_blas95 mkl_${BLAS_mkl_INTFACE} mkl_${BLAS_mkl_THREADING}_thread mkl_core guide")
  384. # mkl >= 10.3
  385. list(APPEND BLAS_SEARCH_LIBS
  386. "${BLAS_mkl_START_GROUP} mkl_blas95 mkl_${BLAS_mkl_INTFACE} mkl_${BLAS_mkl_THREADING}_thread mkl_core ${BLAS_mkl_END_GROUP} ${BLAS_mkl_OMP}")
  387. endif()
  388. if(BLA_VENDOR MATCHES "^Intel10_64i?lp$" OR BLA_VENDOR STREQUAL "All")
  389. # old version
  390. list(APPEND BLAS_SEARCH_LIBS
  391. "mkl_blas95 mkl_${BLAS_mkl_INTFACE}_${BLAS_mkl_ILP_MODE} mkl_${BLAS_mkl_THREADING}_thread mkl_core guide")
  392. # mkl >= 10.3
  393. list(APPEND BLAS_SEARCH_LIBS
  394. "${BLAS_mkl_START_GROUP} mkl_blas95_${BLAS_mkl_ILP_MODE} mkl_${BLAS_mkl_INTFACE}_${BLAS_mkl_ILP_MODE} mkl_${BLAS_mkl_THREADING}_thread mkl_core ${BLAS_mkl_END_GROUP} ${BLAS_mkl_OMP}")
  395. endif()
  396. if(BLA_VENDOR MATCHES "^Intel10_64i?lp_seq$" OR BLA_VENDOR STREQUAL "All")
  397. list(APPEND BLAS_SEARCH_LIBS
  398. "${BLAS_mkl_START_GROUP} mkl_blas95_${BLAS_mkl_ILP_MODE} mkl_${BLAS_mkl_INTFACE}_${BLAS_mkl_ILP_MODE} mkl_sequential mkl_core ${BLAS_mkl_END_GROUP}")
  399. endif()
  400. endif()
  401. else()
  402. set(BLAS_mkl_SEARCH_SYMBOL sgemm)
  403. set(_BLAS_LIBRARIES BLAS_LIBRARIES)
  404. if(WIN32)
  405. # Find the main file (32-bit or 64-bit)
  406. set(BLAS_SEARCH_LIBS_WIN_MAIN "")
  407. if(BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
  408. list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
  409. "mkl_intel_c${BLAS_mkl_DLL_SUFFIX}")
  410. endif()
  411. if(BLA_VENDOR MATCHES "^Intel10_64i?lp" OR BLA_VENDOR STREQUAL "All")
  412. list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
  413. "mkl_intel_${BLAS_mkl_ILP_MODE}${BLAS_mkl_DLL_SUFFIX}")
  414. endif()
  415. # Add threading/sequential libs
  416. set(BLAS_SEARCH_LIBS_WIN_THREAD "")
  417. if(BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
  418. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  419. "libiomp5md mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
  420. endif()
  421. if(BLA_VENDOR MATCHES "^Intel10_64i?lp$" OR BLA_VENDOR STREQUAL "All")
  422. # old version
  423. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  424. "libguide40 mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
  425. # mkl >= 10.3
  426. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  427. "libiomp5md mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
  428. endif()
  429. if(BLA_VENDOR MATCHES "^Intel10_64i?lp_seq$" OR BLA_VENDOR STREQUAL "All")
  430. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  431. "mkl_sequential${BLAS_mkl_DLL_SUFFIX}")
  432. endif()
  433. # Cartesian product of the above
  434. foreach(MAIN ${BLAS_SEARCH_LIBS_WIN_MAIN})
  435. foreach(THREAD ${BLAS_SEARCH_LIBS_WIN_THREAD})
  436. list(APPEND BLAS_SEARCH_LIBS
  437. "${MAIN} ${THREAD} mkl_core${BLAS_mkl_DLL_SUFFIX}")
  438. endforeach()
  439. endforeach()
  440. else()
  441. if(BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
  442. # old version
  443. list(APPEND BLAS_SEARCH_LIBS
  444. "mkl_${BLAS_mkl_INTFACE} mkl_${BLAS_mkl_THREADING}_thread mkl_core guide")
  445. # mkl >= 10.3
  446. list(APPEND BLAS_SEARCH_LIBS
  447. "${BLAS_mkl_START_GROUP} mkl_${BLAS_mkl_INTFACE} mkl_${BLAS_mkl_THREADING}_thread mkl_core ${BLAS_mkl_END_GROUP} ${BLAS_mkl_OMP}")
  448. endif()
  449. if(BLA_VENDOR MATCHES "^Intel10_64i?lp$" OR BLA_VENDOR STREQUAL "All")
  450. # old version
  451. list(APPEND BLAS_SEARCH_LIBS
  452. "mkl_${BLAS_mkl_INTFACE}_${BLAS_mkl_ILP_MODE} mkl_${BLAS_mkl_THREADING}_thread mkl_core guide")
  453. # mkl >= 10.3
  454. list(APPEND BLAS_SEARCH_LIBS
  455. "${BLAS_mkl_START_GROUP} mkl_${BLAS_mkl_INTFACE}_${BLAS_mkl_ILP_MODE} mkl_${BLAS_mkl_THREADING}_thread mkl_core ${BLAS_mkl_END_GROUP} ${BLAS_mkl_OMP}")
  456. endif()
  457. if(BLA_VENDOR MATCHES "^Intel10_64i?lp_seq$" OR BLA_VENDOR STREQUAL "All")
  458. list(APPEND BLAS_SEARCH_LIBS
  459. "${BLAS_mkl_START_GROUP} mkl_${BLAS_mkl_INTFACE}_${BLAS_mkl_ILP_MODE} mkl_sequential mkl_core ${BLAS_mkl_END_GROUP}")
  460. endif()
  461. #older versions of intel mkl libs
  462. if(BLA_VENDOR STREQUAL "Intel" OR BLA_VENDOR STREQUAL "All")
  463. list(APPEND BLAS_SEARCH_LIBS
  464. "mkl")
  465. list(APPEND BLAS_SEARCH_LIBS
  466. "mkl_ia32")
  467. list(APPEND BLAS_SEARCH_LIBS
  468. "mkl_em64t")
  469. endif()
  470. endif()
  471. endif()
  472. if(BLA_VENDOR MATCHES "^Intel10_64_dyn$" OR BLA_VENDOR STREQUAL "All")
  473. # mkl >= 10.3 with single dynamic library
  474. list(APPEND BLAS_SEARCH_LIBS
  475. "mkl_rt")
  476. endif()
  477. # MKL uses a multitude of partially platform-specific subdirectories:
  478. if(BLA_VENDOR STREQUAL "Intel10_32")
  479. set(BLAS_mkl_ARCH_NAME "ia32")
  480. else()
  481. set(BLAS_mkl_ARCH_NAME "intel64")
  482. endif()
  483. if(WIN32)
  484. set(BLAS_mkl_OS_NAME "win")
  485. elseif(APPLE)
  486. set(BLAS_mkl_OS_NAME "mac")
  487. else()
  488. set(BLAS_mkl_OS_NAME "lin")
  489. endif()
  490. if(DEFINED ENV{MKLROOT})
  491. file(TO_CMAKE_PATH "$ENV{MKLROOT}" BLAS_mkl_MKLROOT)
  492. # If MKLROOT points to the subdirectory 'mkl', use the parent directory instead
  493. # so we can better detect other relevant libraries in 'compiler' or 'tbb':
  494. get_filename_component(BLAS_mkl_MKLROOT_LAST_DIR "${BLAS_mkl_MKLROOT}" NAME)
  495. if(BLAS_mkl_MKLROOT_LAST_DIR STREQUAL "mkl")
  496. get_filename_component(BLAS_mkl_MKLROOT "${BLAS_mkl_MKLROOT}" DIRECTORY)
  497. endif()
  498. endif()
  499. set(BLAS_mkl_LIB_PATH_SUFFIXES
  500. "compiler/lib" "compiler/lib/${BLAS_mkl_ARCH_NAME}_${BLAS_mkl_OS_NAME}"
  501. "compiler/lib/${BLAS_mkl_ARCH_NAME}"
  502. "mkl/lib" "mkl/lib/${BLAS_mkl_ARCH_NAME}_${BLAS_mkl_OS_NAME}"
  503. "mkl/lib/${BLAS_mkl_ARCH_NAME}"
  504. "lib" "lib/${BLAS_mkl_ARCH_NAME}_${BLAS_mkl_OS_NAME}"
  505. "lib/${BLAS_mkl_ARCH_NAME}"
  506. )
  507. foreach(_search ${BLAS_SEARCH_LIBS})
  508. string(REPLACE " " ";" _search ${_search})
  509. if(NOT ${_BLAS_LIBRARIES})
  510. check_blas_libraries(
  511. ${_BLAS_LIBRARIES}
  512. BLAS
  513. ${BLAS_mkl_SEARCH_SYMBOL}
  514. ""
  515. "${_search}"
  516. "${CMAKE_THREAD_LIBS_INIT};${BLAS_mkl_LM};${BLAS_mkl_LDL}"
  517. "${BLAS_mkl_MKLROOT}"
  518. "${BLAS_mkl_LIB_PATH_SUFFIXES}"
  519. )
  520. endif()
  521. endforeach()
  522. unset(_search)
  523. unset(BLAS_mkl_ILP_MODE)
  524. unset(BLAS_mkl_INTFACE)
  525. unset(BLAS_mkl_THREADING)
  526. unset(BLAS_mkl_OMP)
  527. unset(BLAS_mkl_DLL_SUFFIX)
  528. unset(BLAS_mkl_LM)
  529. unset(BLAS_mkl_LDL)
  530. unset(BLAS_mkl_MKLROOT)
  531. unset(BLAS_mkl_MKLROOT_LAST_DIR)
  532. unset(BLAS_mkl_ARCH_NAME)
  533. unset(BLAS_mkl_OS_NAME)
  534. unset(BLAS_mkl_LIB_PATH_SUFFIXES)
  535. endif()
  536. endif()
  537. endif()
  538. if(BLA_F95)
  539. find_package_handle_standard_args(BLAS REQUIRED_VARS BLAS95_LIBRARIES)
  540. set(BLAS95_FOUND ${BLAS_FOUND})
  541. if(BLAS_FOUND)
  542. set(BLAS_LIBRARIES "${BLAS95_LIBRARIES}")
  543. endif()
  544. endif()
  545. # gotoblas? (http://www.tacc.utexas.edu/tacc-projects/gotoblas2)
  546. if(BLA_VENDOR STREQUAL "Goto" OR BLA_VENDOR STREQUAL "All")
  547. if(NOT BLAS_LIBRARIES)
  548. check_blas_libraries(
  549. BLAS_LIBRARIES
  550. BLAS
  551. sgemm
  552. ""
  553. "goto2"
  554. ""
  555. ""
  556. ""
  557. )
  558. endif()
  559. endif()
  560. # FlexiBLAS? (http://www.mpi-magdeburg.mpg.de/mpcsc/software/FlexiBLAS/)
  561. if(BLA_VENDOR STREQUAL "FlexiBLAS" OR BLA_VENDOR STREQUAL "All")
  562. if(NOT BLAS_LIBRARIES)
  563. check_blas_libraries(
  564. BLAS_LIBRARIES
  565. BLAS
  566. sgemm
  567. ""
  568. "flexiblas"
  569. ""
  570. ""
  571. ""
  572. )
  573. endif()
  574. endif()
  575. # OpenBLAS? (http://www.openblas.net)
  576. if(BLA_VENDOR STREQUAL "OpenBLAS" OR BLA_VENDOR STREQUAL "All")
  577. if(NOT BLAS_LIBRARIES)
  578. check_blas_libraries(
  579. BLAS_LIBRARIES
  580. BLAS
  581. sgemm
  582. ""
  583. "openblas"
  584. ""
  585. ""
  586. ""
  587. )
  588. endif()
  589. if(NOT BLAS_LIBRARIES AND (CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED))
  590. if(BLAS_FIND_QUIETLY OR NOT BLAS_FIND_REQUIRED)
  591. find_package(Threads)
  592. else()
  593. find_package(Threads REQUIRED)
  594. endif()
  595. set(_threadlibs "${CMAKE_THREAD_LIBS_INIT}")
  596. if(BLA_STATIC)
  597. if (CMAKE_C_COMPILER_LOADED)
  598. find_package(OpenMP COMPONENTS C)
  599. list(PREPEND _threadlibs "${OpenMP_C_LIBRARIES}")
  600. elseif(CMAKE_CXX_COMPILER_LOADED)
  601. find_package(OpenMP COMPONENTS CXX)
  602. list(PREPEND _threadlibs "${OpenMP_CXX_LIBRARIES}")
  603. endif()
  604. endif()
  605. check_blas_libraries(
  606. BLAS_LIBRARIES
  607. BLAS
  608. sgemm
  609. ""
  610. "openblas"
  611. "${_threadlibs}"
  612. ""
  613. ""
  614. )
  615. unset(_threadlibs)
  616. endif()
  617. endif()
  618. # ArmPL blas library? (https://developer.arm.com/tools-and-software/server-and-hpc/compile/arm-compiler-for-linux/arm-performance-libraries)
  619. if(BLA_VENDOR MATCHES "Arm" OR BLA_VENDOR STREQUAL "All")
  620. # Check for 64bit Integer support
  621. if(BLA_VENDOR MATCHES "_ilp64")
  622. set(_blas_armpl_lib "armpl_ilp64")
  623. else()
  624. set(_blas_armpl_lib "armpl_lp64")
  625. endif()
  626. # Check for OpenMP support, VIA BLA_VENDOR of Arm_mp or Arm_ipl64_mp
  627. if(BLA_VENDOR MATCHES "_mp")
  628. set(_blas_armpl_lib "${_blas_armpl_lib}_mp")
  629. endif()
  630. if(NOT BLAS_LIBRARIES)
  631. check_blas_libraries(
  632. BLAS_LIBRARIES
  633. BLAS
  634. sgemm
  635. ""
  636. "${_blas_armpl_lib}"
  637. ""
  638. ""
  639. ""
  640. )
  641. endif()
  642. set(_blas_armpl_lib)
  643. endif()
  644. # FLAME's blis library? (https://github.com/flame/blis)
  645. if(BLA_VENDOR STREQUAL "FLAME" OR BLA_VENDOR STREQUAL "All")
  646. if(NOT BLAS_LIBRARIES)
  647. check_blas_libraries(
  648. BLAS_LIBRARIES
  649. BLAS
  650. sgemm
  651. ""
  652. "blis"
  653. ""
  654. ""
  655. ""
  656. )
  657. endif()
  658. endif()
  659. # BLAS in the ATLAS library? (http://math-atlas.sourceforge.net/)
  660. if(BLA_VENDOR STREQUAL "ATLAS" OR BLA_VENDOR STREQUAL "All")
  661. if(NOT BLAS_LIBRARIES)
  662. check_blas_libraries(
  663. BLAS_LIBRARIES
  664. BLAS
  665. dgemm
  666. ""
  667. "blas;f77blas;atlas"
  668. ""
  669. ""
  670. ""
  671. )
  672. endif()
  673. endif()
  674. # BLAS in PhiPACK libraries? (requires generic BLAS lib, too)
  675. if(BLA_VENDOR STREQUAL "PhiPACK" OR BLA_VENDOR STREQUAL "All")
  676. if(NOT BLAS_LIBRARIES)
  677. check_blas_libraries(
  678. BLAS_LIBRARIES
  679. BLAS
  680. sgemm
  681. ""
  682. "sgemm;dgemm;blas"
  683. ""
  684. ""
  685. ""
  686. )
  687. endif()
  688. endif()
  689. # BLAS in Alpha CXML library?
  690. if(BLA_VENDOR STREQUAL "CXML" OR BLA_VENDOR STREQUAL "All")
  691. if(NOT BLAS_LIBRARIES)
  692. check_blas_libraries(
  693. BLAS_LIBRARIES
  694. BLAS
  695. sgemm
  696. ""
  697. "cxml"
  698. ""
  699. ""
  700. ""
  701. )
  702. endif()
  703. endif()
  704. # BLAS in Alpha DXML library? (now called CXML, see above)
  705. if(BLA_VENDOR STREQUAL "DXML" OR BLA_VENDOR STREQUAL "All")
  706. if(NOT BLAS_LIBRARIES)
  707. check_blas_libraries(
  708. BLAS_LIBRARIES
  709. BLAS
  710. sgemm
  711. ""
  712. "dxml"
  713. ""
  714. ""
  715. ""
  716. )
  717. endif()
  718. endif()
  719. # BLAS in Sun Performance library?
  720. if(BLA_VENDOR STREQUAL "SunPerf" OR BLA_VENDOR STREQUAL "All")
  721. if(NOT BLAS_LIBRARIES)
  722. check_blas_libraries(
  723. BLAS_LIBRARIES
  724. BLAS
  725. sgemm
  726. "-xlic_lib=sunperf"
  727. "sunperf;sunmath"
  728. ""
  729. ""
  730. ""
  731. )
  732. if(BLAS_LIBRARIES)
  733. set(BLAS_LINKER_FLAGS "-xlic_lib=sunperf")
  734. endif()
  735. endif()
  736. endif()
  737. # BLAS in SCSL library? (SGI/Cray Scientific Library)
  738. if(BLA_VENDOR STREQUAL "SCSL" OR BLA_VENDOR STREQUAL "All")
  739. if(NOT BLAS_LIBRARIES)
  740. check_blas_libraries(
  741. BLAS_LIBRARIES
  742. BLAS
  743. sgemm
  744. ""
  745. "scsl"
  746. ""
  747. ""
  748. ""
  749. )
  750. endif()
  751. endif()
  752. # BLAS in SGIMATH library?
  753. if(BLA_VENDOR STREQUAL "SGIMATH" OR BLA_VENDOR STREQUAL "All")
  754. if(NOT BLAS_LIBRARIES)
  755. check_blas_libraries(
  756. BLAS_LIBRARIES
  757. BLAS
  758. sgemm
  759. ""
  760. "complib.sgimath"
  761. ""
  762. ""
  763. ""
  764. )
  765. endif()
  766. endif()
  767. # BLAS in IBM ESSL library? (requires generic BLAS lib, too)
  768. if(BLA_VENDOR STREQUAL "IBMESSL" OR BLA_VENDOR STREQUAL "All")
  769. if(NOT BLAS_LIBRARIES)
  770. check_blas_libraries(
  771. BLAS_LIBRARIES
  772. BLAS
  773. sgemm
  774. ""
  775. "essl;blas"
  776. ""
  777. ""
  778. ""
  779. )
  780. endif()
  781. endif()
  782. # BLAS in acml library?
  783. if(BLA_VENDOR MATCHES "ACML" OR BLA_VENDOR STREQUAL "All")
  784. if(((BLA_VENDOR STREQUAL "ACML") AND (NOT BLAS_ACML_LIB_DIRS)) OR
  785. ((BLA_VENDOR STREQUAL "ACML_MP") AND (NOT BLAS_ACML_MP_LIB_DIRS)) OR
  786. ((BLA_VENDOR STREQUAL "ACML_GPU") AND (NOT BLAS_ACML_GPU_LIB_DIRS))
  787. )
  788. # try to find acml in "standard" paths
  789. if(WIN32)
  790. file(GLOB _ACML_ROOT "C:/AMD/acml*/ACML-EULA.txt")
  791. else()
  792. file(GLOB _ACML_ROOT "/opt/acml*/ACML-EULA.txt")
  793. endif()
  794. if(WIN32)
  795. file(GLOB _ACML_GPU_ROOT "C:/AMD/acml*/GPGPUexamples")
  796. else()
  797. file(GLOB _ACML_GPU_ROOT "/opt/acml*/GPGPUexamples")
  798. endif()
  799. list(GET _ACML_ROOT 0 _ACML_ROOT)
  800. list(GET _ACML_GPU_ROOT 0 _ACML_GPU_ROOT)
  801. if(_ACML_ROOT)
  802. get_filename_component(_ACML_ROOT ${_ACML_ROOT} PATH)
  803. if(SIZEOF_INTEGER EQUAL 8)
  804. set(_ACML_PATH_SUFFIX "_int64")
  805. else()
  806. set(_ACML_PATH_SUFFIX "")
  807. endif()
  808. if(CMAKE_Fortran_COMPILER_ID STREQUAL "Intel")
  809. set(_ACML_COMPILER32 "ifort32")
  810. set(_ACML_COMPILER64 "ifort64")
  811. elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "IntelLLVM")
  812. # 32-bit not supported
  813. set(_ACML_COMPILER64 "ifx")
  814. elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "SunPro")
  815. set(_ACML_COMPILER32 "sun32")
  816. set(_ACML_COMPILER64 "sun64")
  817. elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "PGI")
  818. set(_ACML_COMPILER32 "pgi32")
  819. if(WIN32)
  820. set(_ACML_COMPILER64 "win64")
  821. else()
  822. set(_ACML_COMPILER64 "pgi64")
  823. endif()
  824. elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "Open64")
  825. # 32 bit builds not supported on Open64 but for code simplicity
  826. # We'll just use the same directory twice
  827. set(_ACML_COMPILER32 "open64_64")
  828. set(_ACML_COMPILER64 "open64_64")
  829. elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "NAG")
  830. set(_ACML_COMPILER32 "nag32")
  831. set(_ACML_COMPILER64 "nag64")
  832. else()
  833. set(_ACML_COMPILER32 "gfortran32")
  834. set(_ACML_COMPILER64 "gfortran64")
  835. endif()
  836. if(BLA_VENDOR STREQUAL "ACML_MP")
  837. set(_ACML_MP_LIB_DIRS
  838. "${_ACML_ROOT}/${_ACML_COMPILER32}_mp${_ACML_PATH_SUFFIX}/lib"
  839. "${_ACML_ROOT}/${_ACML_COMPILER64}_mp${_ACML_PATH_SUFFIX}/lib")
  840. else()
  841. set(_ACML_LIB_DIRS
  842. "${_ACML_ROOT}/${_ACML_COMPILER32}${_ACML_PATH_SUFFIX}/lib"
  843. "${_ACML_ROOT}/${_ACML_COMPILER64}${_ACML_PATH_SUFFIX}/lib")
  844. endif()
  845. endif()
  846. elseif(BLAS_${BLA_VENDOR}_LIB_DIRS)
  847. set(_${BLA_VENDOR}_LIB_DIRS ${BLAS_${BLA_VENDOR}_LIB_DIRS})
  848. endif()
  849. if(BLA_VENDOR STREQUAL "ACML_MP")
  850. foreach(BLAS_ACML_MP_LIB_DIRS ${_ACML_MP_LIB_DIRS})
  851. check_blas_libraries(
  852. BLAS_LIBRARIES
  853. BLAS
  854. sgemm
  855. "" "acml_mp;acml_mv" "" ${BLAS_ACML_MP_LIB_DIRS} ""
  856. )
  857. if(BLAS_LIBRARIES)
  858. break()
  859. endif()
  860. endforeach()
  861. elseif(BLA_VENDOR STREQUAL "ACML_GPU")
  862. foreach(BLAS_ACML_GPU_LIB_DIRS ${_ACML_GPU_LIB_DIRS})
  863. check_blas_libraries(
  864. BLAS_LIBRARIES
  865. BLAS
  866. sgemm
  867. "" "acml;acml_mv;CALBLAS" "" ${BLAS_ACML_GPU_LIB_DIRS} ""
  868. )
  869. if(BLAS_LIBRARIES)
  870. break()
  871. endif()
  872. endforeach()
  873. else()
  874. foreach(BLAS_ACML_LIB_DIRS ${_ACML_LIB_DIRS})
  875. check_blas_libraries(
  876. BLAS_LIBRARIES
  877. BLAS
  878. sgemm
  879. "" "acml;acml_mv" "" ${BLAS_ACML_LIB_DIRS} ""
  880. )
  881. if(BLAS_LIBRARIES)
  882. break()
  883. endif()
  884. endforeach()
  885. endif()
  886. # Either acml or acml_mp should be in LD_LIBRARY_PATH but not both
  887. if(NOT BLAS_LIBRARIES)
  888. check_blas_libraries(
  889. BLAS_LIBRARIES
  890. BLAS
  891. sgemm
  892. ""
  893. "acml;acml_mv"
  894. ""
  895. ""
  896. ""
  897. )
  898. endif()
  899. if(NOT BLAS_LIBRARIES)
  900. check_blas_libraries(
  901. BLAS_LIBRARIES
  902. BLAS
  903. sgemm
  904. ""
  905. "acml_mp;acml_mv"
  906. ""
  907. ""
  908. ""
  909. )
  910. endif()
  911. if(NOT BLAS_LIBRARIES)
  912. check_blas_libraries(
  913. BLAS_LIBRARIES
  914. BLAS
  915. sgemm
  916. ""
  917. "acml;acml_mv;CALBLAS"
  918. ""
  919. ""
  920. ""
  921. )
  922. endif()
  923. endif() # ACML
  924. # Apple BLAS library?
  925. if(BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All")
  926. if(NOT BLAS_LIBRARIES)
  927. check_blas_libraries(
  928. BLAS_LIBRARIES
  929. BLAS
  930. dgemm
  931. ""
  932. "Accelerate"
  933. ""
  934. ""
  935. ""
  936. )
  937. endif()
  938. endif()
  939. # Apple NAS (vecLib) library?
  940. if(BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All")
  941. if(NOT BLAS_LIBRARIES)
  942. check_blas_libraries(
  943. BLAS_LIBRARIES
  944. BLAS
  945. dgemm
  946. ""
  947. "vecLib"
  948. ""
  949. ""
  950. ""
  951. )
  952. endif()
  953. endif()
  954. # Elbrus Math Library?
  955. if(BLA_VENDOR MATCHES "EML" OR BLA_VENDOR STREQUAL "All")
  956. set(_blas_eml_lib "eml")
  957. # Check for OpenMP support, VIA BLA_VENDOR of eml_mt
  958. if(BLA_VENDOR MATCHES "_mt")
  959. set(_blas_eml_lib "${BLAS_EML_LIB}_mt")
  960. endif()
  961. if(NOT BLAS_LIBRARIES)
  962. check_blas_libraries(
  963. BLAS_LIBRARIES
  964. BLAS
  965. sgemm
  966. ""
  967. "${_blas_eml_lib}"
  968. ""
  969. ""
  970. ""
  971. )
  972. endif()
  973. set(_blas_eml_lib)
  974. endif()
  975. # Fujitsu SSL2 Library?
  976. if(NOT BLAS_LIBRARIES
  977. AND (BLA_VENDOR MATCHES "Fujitsu_SSL2" OR BLA_VENDOR STREQUAL "All"))
  978. if(BLA_VENDOR STREQUAL "Fujitsu_SSL2BLAMP")
  979. set(_ssl2_suffix BLAMP)
  980. else()
  981. set(_ssl2_suffix)
  982. endif()
  983. check_blas_libraries(
  984. BLAS_LIBRARIES
  985. BLAS
  986. sgemm
  987. "-SSL2${_ssl2_suffix}"
  988. ""
  989. ""
  990. ""
  991. ""
  992. )
  993. if(BLAS_LIBRARIES)
  994. set(BLAS_LINKER_FLAGS "-SSL2${_ssl2_suffix}")
  995. set(_blas_fphsa_req_var BLAS_LINKER_FLAGS)
  996. endif()
  997. unset(_ssl2_suffix)
  998. endif()
  999. # Generic BLAS library?
  1000. if(BLA_VENDOR STREQUAL "Generic" OR
  1001. BLA_VENDOR STREQUAL "NVHPC" OR
  1002. BLA_VENDOR STREQUAL "All")
  1003. if(NOT BLAS_LIBRARIES)
  1004. check_blas_libraries(
  1005. BLAS_LIBRARIES
  1006. BLAS
  1007. sgemm
  1008. ""
  1009. "blas"
  1010. ""
  1011. ""
  1012. ""
  1013. )
  1014. endif()
  1015. endif()
  1016. # On compilers that implicitly link BLAS (i.e. CrayPrgEnv) we used a
  1017. # placeholder for empty BLAS_LIBRARIES to get through our logic above.
  1018. if(BLAS_LIBRARIES STREQUAL "BLAS_LIBRARIES-PLACEHOLDER-FOR-EMPTY-LIBRARIES")
  1019. set(BLAS_LIBRARIES "")
  1020. endif()
  1021. if(NOT BLA_F95)
  1022. find_package_handle_standard_args(BLAS REQUIRED_VARS ${_blas_fphsa_req_var})
  1023. endif()
  1024. _add_blas_target()
  1025. unset(_blas_fphsa_req_var)
  1026. unset(_BLAS_LIBRARIES)