FindBLAS.cmake 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762
  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 BLAS library
  7. This module finds an installed fortran library that implements the
  8. BLAS linear-algebra interface (see http://www.netlib.org/blas/). The
  9. list of libraries searched for is taken from the autoconf macro file,
  10. acx_blas.m4 (distributed at
  11. http://ac-archive.sourceforge.net/ac-archive/acx_blas.html).
  12. This module sets the following variables:
  13. ::
  14. BLAS_FOUND - set to true if a library implementing the BLAS interface
  15. is found
  16. BLAS_LINKER_FLAGS - uncached list of required linker flags (excluding -l
  17. and -L).
  18. BLAS_LIBRARIES - uncached list of libraries (using full path name) to
  19. link against to use BLAS (may be empty if compiler implicitly links
  20. BLAS)
  21. BLAS95_LIBRARIES - uncached list of libraries (using full path name)
  22. to link against to use BLAS95 interface
  23. BLAS95_FOUND - set to true if a library implementing the BLAS f95 interface
  24. is found
  25. The following variables can be used to control this module:
  26. ::
  27. BLA_STATIC if set on this determines what kind of linkage we do (static)
  28. BLA_VENDOR if set checks only the specified vendor, if not set checks
  29. all the possibilities
  30. BLA_F95 if set on tries to find the f95 interfaces for BLAS/LAPACK
  31. BLA_PREFER_PKGCONFIG if set pkg-config will be used to search for a BLAS
  32. library first and if one is found that is preferred
  33. List of vendors (BLA_VENDOR) valid in this module:
  34. * Goto
  35. * OpenBLAS
  36. * FLAME
  37. * ATLAS PhiPACK
  38. * CXML
  39. * DXML
  40. * SunPerf
  41. * SCSL
  42. * SGIMATH
  43. * IBMESSL
  44. * Intel10_32 (intel mkl v10 32 bit)
  45. * Intel10_64lp (intel mkl v10+ 64 bit, threaded code, lp64 model)
  46. * Intel10_64lp_seq (intel mkl v10+ 64 bit, sequential code, lp64 model)
  47. * Intel10_64ilp (intel mkl v10+ 64 bit, threaded code, ilp64 model)
  48. * Intel10_64ilp_seq (intel mkl v10+ 64 bit, sequential code, ilp64 model)
  49. * Intel (older versions of mkl 32 and 64 bit)
  50. * ACML
  51. * ACML_MP
  52. * ACML_GPU
  53. * Apple
  54. * NAS
  55. * Generic
  56. .. note::
  57. C/CXX should be enabled to use Intel mkl
  58. #]=======================================================================]
  59. include(${CMAKE_CURRENT_LIST_DIR}/CheckFunctionExists.cmake)
  60. include(${CMAKE_CURRENT_LIST_DIR}/CheckFortranFunctionExists.cmake)
  61. include(${CMAKE_CURRENT_LIST_DIR}/CMakePushCheckState.cmake)
  62. include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
  63. cmake_push_check_state()
  64. set(CMAKE_REQUIRED_QUIET ${BLAS_FIND_QUIETLY})
  65. set(_blas_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
  66. # Check the language being used
  67. if( NOT (CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED OR CMAKE_Fortran_COMPILER_LOADED) )
  68. if(BLAS_FIND_REQUIRED)
  69. message(FATAL_ERROR "FindBLAS requires Fortran, C, or C++ to be enabled.")
  70. else()
  71. message(STATUS "Looking for BLAS... - NOT found (Unsupported languages)")
  72. return()
  73. endif()
  74. endif()
  75. if(BLA_PREFER_PKGCONFIG)
  76. find_package(PkgConfig)
  77. pkg_check_modules(PKGC_BLAS blas)
  78. if(PKGC_BLAS_FOUND)
  79. set(BLAS_FOUND ${PKGC_BLAS_FOUND})
  80. set(BLAS_LIBRARIES "${PKGC_BLAS_LINK_LIBRARIES}")
  81. return()
  82. endif()
  83. endif()
  84. macro(Check_Fortran_Libraries LIBRARIES _prefix _name _flags _list _thread)
  85. # This macro checks for the existence of the combination of fortran libraries
  86. # given by _list. If the combination is found, this macro checks (using the
  87. # Check_Fortran_Function_Exists macro) whether can link against that library
  88. # combination using the name of a routine given by _name using the linker
  89. # flags given by _flags. If the combination of libraries is found and passes
  90. # the link test, LIBRARIES is set to the list of complete library paths that
  91. # have been found. Otherwise, LIBRARIES is set to FALSE.
  92. # N.B. _prefix is the prefix applied to the names of all cached variables that
  93. # are generated internally and marked advanced by this macro.
  94. set(_libdir ${ARGN})
  95. set(_libraries_work TRUE)
  96. set(${LIBRARIES})
  97. set(_combined_name)
  98. if (NOT _libdir)
  99. if (WIN32)
  100. set(_libdir ENV LIB)
  101. elseif (APPLE)
  102. set(_libdir ENV DYLD_LIBRARY_PATH)
  103. else ()
  104. set(_libdir ENV LD_LIBRARY_PATH)
  105. endif ()
  106. endif ()
  107. list(APPEND _libdir "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}")
  108. foreach(_library ${_list})
  109. set(_combined_name ${_combined_name}_${_library})
  110. if(_libraries_work)
  111. if (BLA_STATIC)
  112. if (WIN32)
  113. set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES})
  114. endif ()
  115. if (APPLE)
  116. set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES})
  117. else ()
  118. set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
  119. endif ()
  120. else ()
  121. if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
  122. # for ubuntu's libblas3gf and liblapack3gf packages
  123. set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES} .so.3gf)
  124. endif ()
  125. endif ()
  126. find_library(${_prefix}_${_library}_LIBRARY
  127. NAMES ${_library}
  128. PATHS ${_libdir}
  129. )
  130. mark_as_advanced(${_prefix}_${_library}_LIBRARY)
  131. set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY})
  132. set(_libraries_work ${${_prefix}_${_library}_LIBRARY})
  133. endif()
  134. endforeach()
  135. if(_libraries_work)
  136. # Test this combination of libraries.
  137. set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}} ${_thread})
  138. # message("DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}")
  139. if (CMAKE_Fortran_COMPILER_LOADED)
  140. check_fortran_function_exists("${_name}" ${_prefix}${_combined_name}_WORKS)
  141. else()
  142. check_function_exists("${_name}_" ${_prefix}${_combined_name}_WORKS)
  143. endif()
  144. set(CMAKE_REQUIRED_LIBRARIES)
  145. set(_libraries_work ${${_prefix}${_combined_name}_WORKS})
  146. endif()
  147. if(_libraries_work)
  148. if("${_list}" STREQUAL "")
  149. set(${LIBRARIES} "${LIBRARIES}-PLACEHOLDER-FOR-EMPTY-LIBRARIES")
  150. else()
  151. set(${LIBRARIES} ${${LIBRARIES}} ${_thread}) # for static link
  152. endif()
  153. else()
  154. set(${LIBRARIES} FALSE)
  155. endif()
  156. #message("DEBUG: ${LIBRARIES} = ${${LIBRARIES}}")
  157. endmacro()
  158. set(BLAS_LINKER_FLAGS)
  159. set(BLAS_LIBRARIES)
  160. set(BLAS95_LIBRARIES)
  161. if (NOT $ENV{BLA_VENDOR} STREQUAL "")
  162. set(BLA_VENDOR $ENV{BLA_VENDOR})
  163. else ()
  164. if(NOT BLA_VENDOR)
  165. set(BLA_VENDOR "All")
  166. endif()
  167. endif ()
  168. if (BLA_VENDOR STREQUAL "All")
  169. if(NOT BLAS_LIBRARIES)
  170. # Implicitly linked BLAS libraries
  171. check_fortran_libraries(
  172. BLAS_LIBRARIES
  173. BLAS
  174. sgemm
  175. ""
  176. ""
  177. ""
  178. )
  179. endif()
  180. endif ()
  181. #BLAS in intel mkl 10+ library? (em64t 64bit)
  182. if (BLA_VENDOR MATCHES "Intel" OR BLA_VENDOR STREQUAL "All")
  183. if (NOT BLAS_LIBRARIES)
  184. # System-specific settings
  185. if (WIN32)
  186. if (BLA_STATIC)
  187. set(BLAS_mkl_DLL_SUFFIX "")
  188. else()
  189. set(BLAS_mkl_DLL_SUFFIX "_dll")
  190. endif()
  191. else()
  192. if(CMAKE_Fortran_COMPILER_LOADED AND CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
  193. set(BLAS_mkl_INTFACE "gf")
  194. set(BLAS_mkl_THREADING "gnu")
  195. set(BLAS_mkl_OMP "gomp")
  196. else()
  197. set(BLAS_mkl_INTFACE "intel")
  198. set(BLAS_mkl_THREADING "intel")
  199. set(BLAS_mkl_OMP "iomp5")
  200. endif()
  201. set(BLAS_mkl_LM "-lm")
  202. set(BLAS_mkl_LDL "-ldl")
  203. endif()
  204. if (BLA_VENDOR MATCHES "_64ilp")
  205. set(BLAS_mkl_ILP_MODE "ilp64")
  206. else ()
  207. set(BLAS_mkl_ILP_MODE "lp64")
  208. endif ()
  209. if (CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED)
  210. if(BLAS_FIND_QUIETLY OR NOT BLAS_FIND_REQUIRED)
  211. find_package(Threads)
  212. else()
  213. find_package(Threads REQUIRED)
  214. endif()
  215. set(BLAS_SEARCH_LIBS "")
  216. if(BLA_F95)
  217. set(BLAS_mkl_SEARCH_SYMBOL sgemm_f95)
  218. set(_LIBRARIES BLAS95_LIBRARIES)
  219. if (WIN32)
  220. # Find the main file (32-bit or 64-bit)
  221. set(BLAS_SEARCH_LIBS_WIN_MAIN "")
  222. if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
  223. list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
  224. "mkl_blas95${BLAS_mkl_DLL_SUFFIX} mkl_intel_c${BLAS_mkl_DLL_SUFFIX}")
  225. endif()
  226. if (BLA_VENDOR MATCHES "^Intel10_64i?lp" OR BLA_VENDOR STREQUAL "All")
  227. list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
  228. "mkl_blas95_${BLAS_mkl_ILP_MODE}${BLAS_mkl_DLL_SUFFIX} mkl_intel_${BLAS_mkl_ILP_MODE}${BLAS_mkl_DLL_SUFFIX}")
  229. endif ()
  230. # Add threading/sequential libs
  231. set(BLAS_SEARCH_LIBS_WIN_THREAD "")
  232. if (BLA_VENDOR MATCHES "_seq$" OR BLA_VENDOR STREQUAL "All")
  233. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  234. "mkl_sequential${BLAS_mkl_DLL_SUFFIX}")
  235. endif()
  236. if (NOT BLA_VENDOR MATCHES "_seq$" OR BLA_VENDOR STREQUAL "All")
  237. # old version
  238. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  239. "libguide40 mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
  240. # mkl >= 10.3
  241. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  242. "libiomp5md mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
  243. endif()
  244. # Cartesian product of the above
  245. foreach (MAIN ${BLAS_SEARCH_LIBS_WIN_MAIN})
  246. foreach (THREAD ${BLAS_SEARCH_LIBS_WIN_THREAD})
  247. list(APPEND BLAS_SEARCH_LIBS
  248. "${MAIN} ${THREAD} mkl_core${BLAS_mkl_DLL_SUFFIX}")
  249. endforeach()
  250. endforeach()
  251. else ()
  252. if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
  253. # old version
  254. list(APPEND BLAS_SEARCH_LIBS
  255. "mkl_blas95 mkl_${BLAS_mkl_INTFACE} mkl_${BLAS_mkl_THREADING}_thread mkl_core guide")
  256. # mkl >= 10.3
  257. list(APPEND BLAS_SEARCH_LIBS
  258. "mkl_blas95 mkl_${BLAS_mkl_INTFACE} mkl_${BLAS_mkl_THREADING}_thread mkl_core ${BLAS_mkl_OMP}")
  259. endif ()
  260. if (BLA_VENDOR MATCHES "^Intel10_64i?lp$" OR BLA_VENDOR STREQUAL "All")
  261. # old version
  262. list(APPEND BLAS_SEARCH_LIBS
  263. "mkl_blas95 mkl_${BLAS_mkl_INTFACE}_${BLAS_mkl_ILP_MODE} mkl_${BLAS_mkl_THREADING}_thread mkl_core guide")
  264. # mkl >= 10.3
  265. list(APPEND BLAS_SEARCH_LIBS
  266. "mkl_blas95_${BLAS_mkl_ILP_MODE} mkl_${BLAS_mkl_INTFACE}_${BLAS_mkl_ILP_MODE} mkl_${BLAS_mkl_THREADING}_thread mkl_core ${BLAS_mkl_OMP}")
  267. endif ()
  268. if (BLA_VENDOR MATCHES "^Intel10_64i?lp_seq$" OR BLA_VENDOR STREQUAL "All")
  269. list(APPEND BLAS_SEARCH_LIBS
  270. "mkl_blas95_${BLAS_mkl_ILP_MODE} mkl_${BLAS_mkl_INTFACE}_${BLAS_mkl_ILP_MODE} mkl_sequential mkl_core")
  271. endif ()
  272. endif ()
  273. else ()
  274. set(BLAS_mkl_SEARCH_SYMBOL sgemm)
  275. set(_LIBRARIES BLAS_LIBRARIES)
  276. if (WIN32)
  277. # Find the main file (32-bit or 64-bit)
  278. set(BLAS_SEARCH_LIBS_WIN_MAIN "")
  279. if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
  280. list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
  281. "mkl_intel_c${BLAS_mkl_DLL_SUFFIX}")
  282. endif()
  283. if (BLA_VENDOR MATCHES "^Intel10_64i?lp" OR BLA_VENDOR STREQUAL "All")
  284. list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN
  285. "mkl_intel_${BLAS_mkl_ILP_MODE}${BLAS_mkl_DLL_SUFFIX}")
  286. endif ()
  287. # Add threading/sequential libs
  288. set(BLAS_SEARCH_LIBS_WIN_THREAD "")
  289. if (NOT BLA_VENDOR MATCHES "_seq$" OR BLA_VENDOR STREQUAL "All")
  290. # old version
  291. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  292. "libguide40 mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
  293. # mkl >= 10.3
  294. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  295. "libiomp5md mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}")
  296. endif()
  297. if (BLA_VENDOR MATCHES "_seq$" OR BLA_VENDOR STREQUAL "All")
  298. list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD
  299. "mkl_sequential${BLAS_mkl_DLL_SUFFIX}")
  300. endif()
  301. # Cartesian product of the above
  302. foreach (MAIN ${BLAS_SEARCH_LIBS_WIN_MAIN})
  303. foreach (THREAD ${BLAS_SEARCH_LIBS_WIN_THREAD})
  304. list(APPEND BLAS_SEARCH_LIBS
  305. "${MAIN} ${THREAD} mkl_core${BLAS_mkl_DLL_SUFFIX}")
  306. endforeach()
  307. endforeach()
  308. else ()
  309. if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
  310. # old version
  311. list(APPEND BLAS_SEARCH_LIBS
  312. "mkl_${BLAS_mkl_INTFACE} mkl_${BLAS_mkl_THREADING}_thread mkl_core guide")
  313. # mkl >= 10.3
  314. list(APPEND BLAS_SEARCH_LIBS
  315. "mkl_${BLAS_mkl_INTFACE} mkl_${BLAS_mkl_THREADING}_thread mkl_core ${BLAS_mkl_OMP}")
  316. endif ()
  317. if (BLA_VENDOR MATCHES "^Intel10_64i?lp$" OR BLA_VENDOR STREQUAL "All")
  318. # old version
  319. list(APPEND BLAS_SEARCH_LIBS
  320. "mkl_${BLAS_mkl_INTFACE}_${BLAS_mkl_ILP_MODE} mkl_${BLAS_mkl_THREADING}_thread mkl_core guide")
  321. # mkl >= 10.3
  322. list(APPEND BLAS_SEARCH_LIBS
  323. "mkl_${BLAS_mkl_INTFACE}_${BLAS_mkl_ILP_MODE} mkl_${BLAS_mkl_THREADING}_thread mkl_core ${BLAS_mkl_OMP}")
  324. endif ()
  325. if (BLA_VENDOR MATCHES "^Intel10_64i?lp_seq$" OR BLA_VENDOR STREQUAL "All")
  326. list(APPEND BLAS_SEARCH_LIBS
  327. "mkl_${BLAS_mkl_INTFACE}_${BLAS_mkl_ILP_MODE} mkl_sequential mkl_core")
  328. endif ()
  329. #older vesions of intel mkl libs
  330. if (BLA_VENDOR STREQUAL "Intel" OR BLA_VENDOR STREQUAL "All")
  331. list(APPEND BLAS_SEARCH_LIBS
  332. "mkl")
  333. list(APPEND BLAS_SEARCH_LIBS
  334. "mkl_ia32")
  335. list(APPEND BLAS_SEARCH_LIBS
  336. "mkl_em64t")
  337. endif ()
  338. endif ()
  339. endif ()
  340. foreach (IT ${BLAS_SEARCH_LIBS})
  341. string(REPLACE " " ";" SEARCH_LIBS ${IT})
  342. if (NOT ${_LIBRARIES})
  343. check_fortran_libraries(
  344. ${_LIBRARIES}
  345. BLAS
  346. ${BLAS_mkl_SEARCH_SYMBOL}
  347. ""
  348. "${SEARCH_LIBS}"
  349. "${CMAKE_THREAD_LIBS_INIT};${BLAS_mkl_LM};${BLAS_mkl_LDL}"
  350. )
  351. endif ()
  352. endforeach ()
  353. endif ()
  354. unset(BLAS_mkl_ILP_MODE)
  355. unset(BLAS_mkl_INTFACE)
  356. unset(BLAS_mkl_THREADING)
  357. unset(BLAS_mkl_OMP)
  358. unset(BLAS_mkl_DLL_SUFFIX)
  359. unset(BLAS_mkl_LM)
  360. unset(BLAS_mkl_LDL)
  361. endif ()
  362. endif ()
  363. if(BLA_F95)
  364. find_package_handle_standard_args(BLAS REQUIRED_VARS BLAS95_LIBRARIES)
  365. set(BLAS95_FOUND ${BLAS_FOUND})
  366. if(BLAS_FOUND)
  367. set(BLAS_LIBRARIES "${BLAS95_LIBRARIES}")
  368. endif()
  369. endif()
  370. if (BLA_VENDOR STREQUAL "Goto" OR BLA_VENDOR STREQUAL "All")
  371. if(NOT BLAS_LIBRARIES)
  372. # gotoblas (http://www.tacc.utexas.edu/tacc-projects/gotoblas2)
  373. check_fortran_libraries(
  374. BLAS_LIBRARIES
  375. BLAS
  376. sgemm
  377. ""
  378. "goto2"
  379. ""
  380. )
  381. endif()
  382. endif ()
  383. if (BLA_VENDOR STREQUAL "OpenBLAS" OR BLA_VENDOR STREQUAL "All")
  384. if(NOT BLAS_LIBRARIES)
  385. # OpenBLAS (http://www.openblas.net)
  386. check_fortran_libraries(
  387. BLAS_LIBRARIES
  388. BLAS
  389. sgemm
  390. ""
  391. "openblas"
  392. ""
  393. )
  394. endif()
  395. endif ()
  396. if (BLA_VENDOR STREQUAL "FLAME" OR BLA_VENDOR STREQUAL "All")
  397. if(NOT BLAS_LIBRARIES)
  398. # FLAME's blis library (https://github.com/flame/blis)
  399. check_fortran_libraries(
  400. BLAS_LIBRARIES
  401. BLAS
  402. sgemm
  403. ""
  404. "blis"
  405. ""
  406. )
  407. endif()
  408. endif ()
  409. if (BLA_VENDOR STREQUAL "ATLAS" OR BLA_VENDOR STREQUAL "All")
  410. if(NOT BLAS_LIBRARIES)
  411. # BLAS in ATLAS library? (http://math-atlas.sourceforge.net/)
  412. check_fortran_libraries(
  413. BLAS_LIBRARIES
  414. BLAS
  415. dgemm
  416. ""
  417. "f77blas;atlas"
  418. ""
  419. )
  420. endif()
  421. endif ()
  422. # BLAS in PhiPACK libraries? (requires generic BLAS lib, too)
  423. if (BLA_VENDOR STREQUAL "PhiPACK" OR BLA_VENDOR STREQUAL "All")
  424. if(NOT BLAS_LIBRARIES)
  425. check_fortran_libraries(
  426. BLAS_LIBRARIES
  427. BLAS
  428. sgemm
  429. ""
  430. "sgemm;dgemm;blas"
  431. ""
  432. )
  433. endif()
  434. endif ()
  435. # BLAS in Alpha CXML library?
  436. if (BLA_VENDOR STREQUAL "CXML" OR BLA_VENDOR STREQUAL "All")
  437. if(NOT BLAS_LIBRARIES)
  438. check_fortran_libraries(
  439. BLAS_LIBRARIES
  440. BLAS
  441. sgemm
  442. ""
  443. "cxml"
  444. ""
  445. )
  446. endif()
  447. endif ()
  448. # BLAS in Alpha DXML library? (now called CXML, see above)
  449. if (BLA_VENDOR STREQUAL "DXML" OR BLA_VENDOR STREQUAL "All")
  450. if(NOT BLAS_LIBRARIES)
  451. check_fortran_libraries(
  452. BLAS_LIBRARIES
  453. BLAS
  454. sgemm
  455. ""
  456. "dxml"
  457. ""
  458. )
  459. endif()
  460. endif ()
  461. # BLAS in Sun Performance library?
  462. if (BLA_VENDOR STREQUAL "SunPerf" OR BLA_VENDOR STREQUAL "All")
  463. if(NOT BLAS_LIBRARIES)
  464. check_fortran_libraries(
  465. BLAS_LIBRARIES
  466. BLAS
  467. sgemm
  468. "-xlic_lib=sunperf"
  469. "sunperf;sunmath"
  470. ""
  471. )
  472. if(BLAS_LIBRARIES)
  473. set(BLAS_LINKER_FLAGS "-xlic_lib=sunperf")
  474. endif()
  475. endif()
  476. endif ()
  477. # BLAS in SCSL library? (SGI/Cray Scientific Library)
  478. if (BLA_VENDOR STREQUAL "SCSL" OR BLA_VENDOR STREQUAL "All")
  479. if(NOT BLAS_LIBRARIES)
  480. check_fortran_libraries(
  481. BLAS_LIBRARIES
  482. BLAS
  483. sgemm
  484. ""
  485. "scsl"
  486. ""
  487. )
  488. endif()
  489. endif ()
  490. # BLAS in SGIMATH library?
  491. if (BLA_VENDOR STREQUAL "SGIMATH" OR BLA_VENDOR STREQUAL "All")
  492. if(NOT BLAS_LIBRARIES)
  493. check_fortran_libraries(
  494. BLAS_LIBRARIES
  495. BLAS
  496. sgemm
  497. ""
  498. "complib.sgimath"
  499. ""
  500. )
  501. endif()
  502. endif ()
  503. # BLAS in IBM ESSL library? (requires generic BLAS lib, too)
  504. if (BLA_VENDOR STREQUAL "IBMESSL" OR BLA_VENDOR STREQUAL "All")
  505. if(NOT BLAS_LIBRARIES)
  506. check_fortran_libraries(
  507. BLAS_LIBRARIES
  508. BLAS
  509. sgemm
  510. ""
  511. "essl;blas"
  512. ""
  513. )
  514. endif()
  515. endif ()
  516. #BLAS in acml library?
  517. if (BLA_VENDOR MATCHES "ACML" OR BLA_VENDOR STREQUAL "All")
  518. if( ((BLA_VENDOR STREQUAL "ACML") AND (NOT BLAS_ACML_LIB_DIRS)) OR
  519. ((BLA_VENDOR STREQUAL "ACML_MP") AND (NOT BLAS_ACML_MP_LIB_DIRS)) OR
  520. ((BLA_VENDOR STREQUAL "ACML_GPU") AND (NOT BLAS_ACML_GPU_LIB_DIRS))
  521. )
  522. # try to find acml in "standard" paths
  523. if( WIN32 )
  524. file( GLOB _ACML_ROOT "C:/AMD/acml*/ACML-EULA.txt" )
  525. else()
  526. file( GLOB _ACML_ROOT "/opt/acml*/ACML-EULA.txt" )
  527. endif()
  528. if( WIN32 )
  529. file( GLOB _ACML_GPU_ROOT "C:/AMD/acml*/GPGPUexamples" )
  530. else()
  531. file( GLOB _ACML_GPU_ROOT "/opt/acml*/GPGPUexamples" )
  532. endif()
  533. list(GET _ACML_ROOT 0 _ACML_ROOT)
  534. list(GET _ACML_GPU_ROOT 0 _ACML_GPU_ROOT)
  535. if( _ACML_ROOT )
  536. get_filename_component( _ACML_ROOT ${_ACML_ROOT} PATH )
  537. if( SIZEOF_INTEGER EQUAL 8 )
  538. set( _ACML_PATH_SUFFIX "_int64" )
  539. else()
  540. set( _ACML_PATH_SUFFIX "" )
  541. endif()
  542. if( CMAKE_Fortran_COMPILER_ID STREQUAL "Intel" )
  543. set( _ACML_COMPILER32 "ifort32" )
  544. set( _ACML_COMPILER64 "ifort64" )
  545. elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "SunPro" )
  546. set( _ACML_COMPILER32 "sun32" )
  547. set( _ACML_COMPILER64 "sun64" )
  548. elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "PGI" )
  549. set( _ACML_COMPILER32 "pgi32" )
  550. if( WIN32 )
  551. set( _ACML_COMPILER64 "win64" )
  552. else()
  553. set( _ACML_COMPILER64 "pgi64" )
  554. endif()
  555. elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "Open64" )
  556. # 32 bit builds not supported on Open64 but for code simplicity
  557. # We'll just use the same directory twice
  558. set( _ACML_COMPILER32 "open64_64" )
  559. set( _ACML_COMPILER64 "open64_64" )
  560. elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "NAG" )
  561. set( _ACML_COMPILER32 "nag32" )
  562. set( _ACML_COMPILER64 "nag64" )
  563. else()
  564. set( _ACML_COMPILER32 "gfortran32" )
  565. set( _ACML_COMPILER64 "gfortran64" )
  566. endif()
  567. if( BLA_VENDOR STREQUAL "ACML_MP" )
  568. set(_ACML_MP_LIB_DIRS
  569. "${_ACML_ROOT}/${_ACML_COMPILER32}_mp${_ACML_PATH_SUFFIX}/lib"
  570. "${_ACML_ROOT}/${_ACML_COMPILER64}_mp${_ACML_PATH_SUFFIX}/lib" )
  571. else()
  572. set(_ACML_LIB_DIRS
  573. "${_ACML_ROOT}/${_ACML_COMPILER32}${_ACML_PATH_SUFFIX}/lib"
  574. "${_ACML_ROOT}/${_ACML_COMPILER64}${_ACML_PATH_SUFFIX}/lib" )
  575. endif()
  576. endif()
  577. elseif(BLAS_${BLA_VENDOR}_LIB_DIRS)
  578. set(_${BLA_VENDOR}_LIB_DIRS ${BLAS_${BLA_VENDOR}_LIB_DIRS})
  579. endif()
  580. if( BLA_VENDOR STREQUAL "ACML_MP" )
  581. foreach( BLAS_ACML_MP_LIB_DIRS ${_ACML_MP_LIB_DIRS})
  582. check_fortran_libraries (
  583. BLAS_LIBRARIES
  584. BLAS
  585. sgemm
  586. "" "acml_mp;acml_mv" "" ${BLAS_ACML_MP_LIB_DIRS}
  587. )
  588. if( BLAS_LIBRARIES )
  589. break()
  590. endif()
  591. endforeach()
  592. elseif( BLA_VENDOR STREQUAL "ACML_GPU" )
  593. foreach( BLAS_ACML_GPU_LIB_DIRS ${_ACML_GPU_LIB_DIRS})
  594. check_fortran_libraries (
  595. BLAS_LIBRARIES
  596. BLAS
  597. sgemm
  598. "" "acml;acml_mv;CALBLAS" "" ${BLAS_ACML_GPU_LIB_DIRS}
  599. )
  600. if( BLAS_LIBRARIES )
  601. break()
  602. endif()
  603. endforeach()
  604. else()
  605. foreach( BLAS_ACML_LIB_DIRS ${_ACML_LIB_DIRS} )
  606. check_fortran_libraries (
  607. BLAS_LIBRARIES
  608. BLAS
  609. sgemm
  610. "" "acml;acml_mv" "" ${BLAS_ACML_LIB_DIRS}
  611. )
  612. if( BLAS_LIBRARIES )
  613. break()
  614. endif()
  615. endforeach()
  616. endif()
  617. # Either acml or acml_mp should be in LD_LIBRARY_PATH but not both
  618. if(NOT BLAS_LIBRARIES)
  619. check_fortran_libraries(
  620. BLAS_LIBRARIES
  621. BLAS
  622. sgemm
  623. ""
  624. "acml;acml_mv"
  625. ""
  626. )
  627. endif()
  628. if(NOT BLAS_LIBRARIES)
  629. check_fortran_libraries(
  630. BLAS_LIBRARIES
  631. BLAS
  632. sgemm
  633. ""
  634. "acml_mp;acml_mv"
  635. ""
  636. )
  637. endif()
  638. if(NOT BLAS_LIBRARIES)
  639. check_fortran_libraries(
  640. BLAS_LIBRARIES
  641. BLAS
  642. sgemm
  643. ""
  644. "acml;acml_mv;CALBLAS"
  645. ""
  646. )
  647. endif()
  648. endif () # ACML
  649. # Apple BLAS library?
  650. if (BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All")
  651. if(NOT BLAS_LIBRARIES)
  652. check_fortran_libraries(
  653. BLAS_LIBRARIES
  654. BLAS
  655. dgemm
  656. ""
  657. "Accelerate"
  658. ""
  659. )
  660. endif()
  661. endif ()
  662. if (BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All")
  663. if ( NOT BLAS_LIBRARIES )
  664. check_fortran_libraries(
  665. BLAS_LIBRARIES
  666. BLAS
  667. dgemm
  668. ""
  669. "vecLib"
  670. ""
  671. )
  672. endif ()
  673. endif ()
  674. # Generic BLAS library?
  675. if (BLA_VENDOR STREQUAL "Generic" OR BLA_VENDOR STREQUAL "All")
  676. if(NOT BLAS_LIBRARIES)
  677. check_fortran_libraries(
  678. BLAS_LIBRARIES
  679. BLAS
  680. sgemm
  681. ""
  682. "blas"
  683. ""
  684. )
  685. endif()
  686. endif ()
  687. if(NOT BLA_F95)
  688. find_package_handle_standard_args(BLAS REQUIRED_VARS BLAS_LIBRARIES)
  689. endif()
  690. # On compilers that implicitly link BLAS (such as ftn, cc, and CC on Cray HPC machines)
  691. # we used a placeholder for empty BLAS_LIBRARIES to get through our logic above.
  692. if (BLAS_LIBRARIES STREQUAL "BLAS_LIBRARIES-PLACEHOLDER-FOR-EMPTY-LIBRARIES")
  693. set(BLAS_LIBRARIES "")
  694. endif()
  695. cmake_pop_check_state()
  696. set(CMAKE_FIND_LIBRARY_SUFFIXES ${_blas_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})