Home | History | Annotate | Download | only in cmake
      1 ###
      2 #
      3 # @copyright (c) 2009-2014 The University of Tennessee and The University
      4 #                          of Tennessee Research Foundation.
      5 #                          All rights reserved.
      6 # @copyright (c) 2012-2016 Inria. All rights reserved.
      7 # @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved.
      8 #
      9 ###
     10 #
     11 # - Find BLAS EXTENDED for MORSE projects: find include dirs and libraries
     12 #
     13 # This module allows to find BLAS libraries by calling the official FindBLAS module
     14 # and handles the creation of different library lists whether the user wishes to link
     15 # with a sequential BLAS or a multihreaded (BLAS_SEQ_LIBRARIES and BLAS_PAR_LIBRARIES).
     16 # BLAS is detected with a FindBLAS call then if the BLAS vendor is Intel10_64lp, ACML
     17 # or IBMESSLMT then the module attempts to find the corresponding multithreaded libraries.
     18 #
     19 # The following variables have been added to manage links with sequential or multithreaded
     20 # versions:
     21 #  BLAS_INCLUDE_DIRS  - BLAS include directories
     22 #  BLAS_LIBRARY_DIRS  - Link directories for BLAS libraries
     23 #  BLAS_SEQ_LIBRARIES - BLAS component libraries to be linked (sequential)
     24 #  BLAS_PAR_LIBRARIES - BLAS component libraries to be linked (multithreaded)
     25 
     26 #=============================================================================
     27 # Copyright 2012-2013 Inria
     28 # Copyright 2012-2013 Emmanuel Agullo
     29 # Copyright 2012-2013 Mathieu Faverge
     30 # Copyright 2012      Cedric Castagnede
     31 # Copyright 2013-2016 Florent Pruvost
     32 #
     33 # Distributed under the OSI-approved BSD License (the "License");
     34 # see accompanying file MORSE-Copyright.txt for details.
     35 #
     36 # This software is distributed WITHOUT ANY WARRANTY; without even the
     37 # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     38 # See the License for more information.
     39 #=============================================================================
     40 # (To distribute this file outside of Morse, substitute the full
     41 #  License text for the above reference.)
     42 
     43 # macro to factorize this call
     44 macro(find_package_blas)
     45   if(BLASEXT_FIND_REQUIRED)
     46     if(BLASEXT_FIND_QUIETLY)
     47       find_package(BLAS REQUIRED QUIET)
     48     else()
     49       find_package(BLAS REQUIRED)
     50     endif()
     51   else()
     52     if(BLASEXT_FIND_QUIETLY)
     53       find_package(BLAS QUIET)
     54     else()
     55       find_package(BLAS)
     56     endif()
     57   endif()
     58 endmacro()
     59 
     60 # add a cache variable to let the user specify the BLAS vendor
     61 set(BLA_VENDOR "" CACHE STRING "list of possible BLAS vendor:
     62     Open, Eigen, Goto, ATLAS PhiPACK, CXML, DXML, SunPerf, SCSL, SGIMATH, IBMESSL, IBMESSLMT,
     63     Intel10_32 (intel mkl v10 32 bit),
     64     Intel10_64lp (intel mkl v10 64 bit, lp thread model, lp64 model),
     65     Intel10_64lp_seq (intel mkl v10 64 bit, sequential code, lp64 model),
     66     Intel( older versions of mkl 32 and 64 bit),
     67     ACML, ACML_MP, ACML_GPU, Apple, NAS, Generic")
     68 
     69 if(NOT BLASEXT_FIND_QUIETLY)
     70   message(STATUS "In FindBLASEXT")
     71   message(STATUS "If you want to force the use of one specific library, "
     72     "\n   please specify the BLAS vendor by setting -DBLA_VENDOR=blas_vendor_name"
     73     "\n   at cmake configure.")
     74   message(STATUS "List of possible BLAS vendor: Goto, ATLAS PhiPACK, CXML, "
     75     "\n   DXML, SunPerf, SCSL, SGIMATH, IBMESSL, IBMESSLMT, Intel10_32 (intel mkl v10 32 bit),"
     76     "\n   Intel10_64lp (intel mkl v10 64 bit, lp thread model, lp64 model),"
     77     "\n   Intel10_64lp_seq (intel mkl v10 64 bit, sequential code, lp64 model),"
     78     "\n   Intel( older versions of mkl 32 and 64 bit),"
     79     "\n   ACML, ACML_MP, ACML_GPU, Apple, NAS, Generic")
     80 endif()
     81 
     82 if (NOT BLAS_FOUND)
     83   # First try to detect two cases:
     84   # 1: only SEQ libs are handled
     85   # 2: both SEQ and PAR libs are handled
     86   find_package_blas()
     87 endif ()
     88 
     89 # detect the cases where SEQ and PAR libs are handled
     90 if(BLA_VENDOR STREQUAL "All" AND
     91     (BLAS_mkl_core_LIBRARY OR BLAS_mkl_core_dll_LIBRARY)
     92     )
     93   set(BLA_VENDOR "Intel")
     94   if(BLAS_mkl_intel_LIBRARY)
     95     set(BLA_VENDOR "Intel10_32")
     96   endif()
     97   if(BLAS_mkl_intel_lp64_LIBRARY)
     98     set(BLA_VENDOR "Intel10_64lp")
     99   endif()
    100   if(NOT BLASEXT_FIND_QUIETLY)
    101     message(STATUS "A BLAS library has been found (${BLAS_LIBRARIES}) but we"
    102       "\n   have also potentially detected some multithreaded BLAS libraries from the MKL."
    103       "\n   We try to find both libraries lists (Sequential/Multithreaded).")
    104   endif()
    105   set(BLAS_FOUND "")
    106 elseif(BLA_VENDOR STREQUAL "All" AND BLAS_acml_LIBRARY)
    107   set(BLA_VENDOR "ACML")
    108   if(NOT BLASEXT_FIND_QUIETLY)
    109     message(STATUS "A BLAS library has been found (${BLAS_LIBRARIES}) but we"
    110       "\n   have also potentially detected some multithreaded BLAS libraries from the ACML."
    111       "\n   We try to find both libraries lists (Sequential/Multithreaded).")
    112   endif()
    113   set(BLAS_FOUND "")
    114 elseif(BLA_VENDOR STREQUAL "All" AND BLAS_essl_LIBRARY)
    115   set(BLA_VENDOR "IBMESSL")
    116   if(NOT BLASEXT_FIND_QUIETLY)
    117     message(STATUS "A BLAS library has been found (${BLAS_LIBRARIES}) but we"
    118       "\n   have also potentially detected some multithreaded BLAS libraries from the ESSL."
    119       "\n   We try to find both libraries lists (Sequential/Multithreaded).")
    120   endif()
    121   set(BLAS_FOUND "")
    122 endif()
    123 
    124 # Intel case
    125 if(BLA_VENDOR MATCHES "Intel*")
    126 
    127   ###
    128   # look for include path if the BLAS vendor is Intel
    129   ###
    130 
    131   # gather system include paths
    132   unset(_inc_env)
    133   if(WIN32)
    134     string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}")
    135   else()
    136     string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}")
    137     list(APPEND _inc_env "${_path_env}")
    138     string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}")
    139     list(APPEND _inc_env "${_path_env}")
    140     string(REPLACE ":" ";" _path_env "$ENV{CPATH}")
    141     list(APPEND _inc_env "${_path_env}")
    142     string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}")
    143     list(APPEND _inc_env "${_path_env}")
    144   endif()
    145   list(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}")
    146   list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}")
    147   set(ENV_MKLROOT "$ENV{MKLROOT}")
    148   if (ENV_MKLROOT)
    149     list(APPEND _inc_env "${ENV_MKLROOT}/include")
    150   endif()
    151   list(REMOVE_DUPLICATES _inc_env)
    152 
    153   # find mkl.h inside known include paths
    154   set(BLAS_mkl.h_INCLUDE_DIRS "BLAS_mkl.h_INCLUDE_DIRS-NOTFOUND")
    155   if(BLAS_INCDIR)
    156     set(BLAS_mkl.h_INCLUDE_DIRS "BLAS_mkl.h_INCLUDE_DIRS-NOTFOUND")
    157     find_path(BLAS_mkl.h_INCLUDE_DIRS
    158       NAMES mkl.h
    159       HINTS ${BLAS_INCDIR})
    160   else()
    161     if(BLAS_DIR)
    162       set(BLAS_mkl.h_INCLUDE_DIRS "BLAS_mkl.h_INCLUDE_DIRS-NOTFOUND")
    163       find_path(BLAS_mkl.h_INCLUDE_DIRS
    164 	NAMES mkl.h
    165 	HINTS ${BLAS_DIR}
    166 	PATH_SUFFIXES include)
    167     else()
    168       set(BLAS_mkl.h_INCLUDE_DIRS "BLAS_mkl.h_INCLUDE_DIRS-NOTFOUND")
    169       find_path(BLAS_mkl.h_INCLUDE_DIRS
    170 	NAMES mkl.h
    171 	HINTS ${_inc_env})
    172     endif()
    173   endif()
    174   mark_as_advanced(BLAS_mkl.h_INCLUDE_DIRS)
    175   ## Print status if not found
    176   ## -------------------------
    177   #if (NOT BLAS_mkl.h_INCLUDE_DIRS AND MORSE_VERBOSE)
    178   #    Print_Find_Header_Status(blas mkl.h)
    179   #endif ()
    180   set(BLAS_INCLUDE_DIRS "")
    181   if(BLAS_mkl.h_INCLUDE_DIRS)
    182     list(APPEND BLAS_INCLUDE_DIRS "${BLAS_mkl.h_INCLUDE_DIRS}" )
    183   endif()
    184 
    185   ###
    186   # look for libs
    187   ###
    188   # if Intel 10 64 bit -> look for sequential and multithreaded versions
    189   if(BLA_VENDOR MATCHES "Intel10_64lp*")
    190 
    191     ## look for the sequential version
    192     set(BLA_VENDOR "Intel10_64lp_seq")
    193     if(NOT BLASEXT_FIND_QUIETLY)
    194       message(STATUS "Look for the sequential version Intel10_64lp_seq")
    195     endif()
    196     find_package_blas()
    197     if(BLAS_FOUND)
    198       set(BLAS_SEQ_LIBRARIES "${BLAS_LIBRARIES}")
    199     else()
    200       set(BLAS_SEQ_LIBRARIES "${BLAS_SEQ_LIBRARIES-NOTFOUND}")
    201     endif()
    202 
    203     ## look for the multithreaded version
    204     set(BLA_VENDOR "Intel10_64lp")
    205     if(NOT BLASEXT_FIND_QUIETLY)
    206       message(STATUS "Look for the multithreaded version Intel10_64lp")
    207     endif()
    208     find_package_blas()
    209     if(BLAS_FOUND)
    210       set(BLAS_PAR_LIBRARIES "${BLAS_LIBRARIES}")
    211     else()
    212       set(BLAS_PAR_LIBRARIES "${BLAS_PAR_LIBRARIES-NOTFOUND}")
    213     endif()
    214 
    215   else()
    216 
    217     if(BLAS_FOUND)
    218       set(BLAS_SEQ_LIBRARIES "${BLAS_LIBRARIES}")
    219     else()
    220       set(BLAS_SEQ_LIBRARIES "${BLAS_SEQ_LIBRARIES-NOTFOUND}")
    221     endif()
    222 
    223   endif()
    224 
    225   # ACML case
    226 elseif(BLA_VENDOR MATCHES "ACML*")
    227 
    228   ## look for the sequential version
    229   set(BLA_VENDOR "ACML")
    230   find_package_blas()
    231   if(BLAS_FOUND)
    232     set(BLAS_SEQ_LIBRARIES "${BLAS_LIBRARIES}")
    233   else()
    234     set(BLAS_SEQ_LIBRARIES "${BLAS_SEQ_LIBRARIES-NOTFOUND}")
    235   endif()
    236 
    237   ## look for the multithreaded version
    238   set(BLA_VENDOR "ACML_MP")
    239   find_package_blas()
    240   if(BLAS_FOUND)
    241     set(BLAS_PAR_LIBRARIES "${BLAS_LIBRARIES}")
    242   else()
    243     set(BLAS_PAR_LIBRARIES "${BLAS_PAR_LIBRARIES-NOTFOUND}")
    244   endif()
    245 
    246   # IBMESSL case
    247 elseif(BLA_VENDOR MATCHES "IBMESSL*")
    248 
    249   ## look for the sequential version
    250   set(BLA_VENDOR "IBMESSL")
    251   find_package_blas()
    252   if(BLAS_FOUND)
    253     set(BLAS_SEQ_LIBRARIES "${BLAS_LIBRARIES}")
    254   else()
    255     set(BLAS_SEQ_LIBRARIES "${BLAS_SEQ_LIBRARIES-NOTFOUND}")
    256   endif()
    257 
    258   ## look for the multithreaded version
    259   set(BLA_VENDOR "IBMESSLMT")
    260   find_package_blas()
    261   if(BLAS_FOUND)
    262     set(BLAS_PAR_LIBRARIES "${BLAS_LIBRARIES}")
    263   else()
    264     set(BLAS_PAR_LIBRARIES "${BLAS_PAR_LIBRARIES-NOTFOUND}")
    265   endif()
    266 
    267 else()
    268 
    269   if(BLAS_FOUND)
    270     # define the SEQ libs as the BLAS_LIBRARIES
    271     set(BLAS_SEQ_LIBRARIES "${BLAS_LIBRARIES}")
    272   else()
    273     set(BLAS_SEQ_LIBRARIES "${BLAS_SEQ_LIBRARIES-NOTFOUND}")
    274   endif()
    275   set(BLAS_PAR_LIBRARIES "${BLAS_PAR_LIBRARIES-NOTFOUND}")
    276 
    277 endif()
    278 
    279 
    280 if(BLAS_SEQ_LIBRARIES)
    281   set(BLAS_LIBRARIES "${BLAS_SEQ_LIBRARIES}")
    282 endif()
    283 
    284 # extract libs paths
    285 # remark: because it is not given by find_package(BLAS)
    286 set(BLAS_LIBRARY_DIRS "")
    287 string(REPLACE " " ";" BLAS_LIBRARIES "${BLAS_LIBRARIES}")
    288 foreach(blas_lib ${BLAS_LIBRARIES})
    289   if (EXISTS "${blas_lib}")
    290     get_filename_component(a_blas_lib_dir "${blas_lib}" PATH)
    291     list(APPEND BLAS_LIBRARY_DIRS "${a_blas_lib_dir}" )
    292   else()
    293     string(REPLACE "-L" "" blas_lib "${blas_lib}")
    294     if (EXISTS "${blas_lib}")
    295       list(APPEND BLAS_LIBRARY_DIRS "${blas_lib}" )
    296     else()
    297       get_filename_component(a_blas_lib_dir "${blas_lib}" PATH)
    298       if (EXISTS "${a_blas_lib_dir}")
    299 	list(APPEND BLAS_LIBRARY_DIRS "${a_blas_lib_dir}" )
    300       endif()
    301     endif()
    302   endif()
    303 endforeach()
    304 if (BLAS_LIBRARY_DIRS)
    305   list(REMOVE_DUPLICATES BLAS_LIBRARY_DIRS)
    306 endif ()
    307 
    308 # check that BLAS has been found
    309 # ---------------------------------
    310 include(FindPackageHandleStandardArgs)
    311 if(BLA_VENDOR MATCHES "Intel*")
    312   if(BLA_VENDOR MATCHES "Intel10_64lp*")
    313     if(NOT BLASEXT_FIND_QUIETLY)
    314       message(STATUS "BLAS found is Intel MKL:"
    315 	"\n   we manage two lists of libs, one sequential and one parallel if found"
    316 	"\n   (see BLAS_SEQ_LIBRARIES and BLAS_PAR_LIBRARIES)")
    317       message(STATUS "BLAS sequential libraries stored in BLAS_SEQ_LIBRARIES")
    318     endif()
    319     find_package_handle_standard_args(BLAS DEFAULT_MSG
    320       BLAS_SEQ_LIBRARIES
    321       BLAS_LIBRARY_DIRS
    322       BLAS_INCLUDE_DIRS)
    323     if(BLAS_PAR_LIBRARIES)
    324       if(NOT BLASEXT_FIND_QUIETLY)
    325 	message(STATUS "BLAS parallel libraries stored in BLAS_PAR_LIBRARIES")
    326       endif()
    327       find_package_handle_standard_args(BLAS DEFAULT_MSG
    328 	BLAS_PAR_LIBRARIES)
    329     endif()
    330   else()
    331     if(NOT BLASEXT_FIND_QUIETLY)
    332       message(STATUS "BLAS sequential libraries stored in BLAS_SEQ_LIBRARIES")
    333     endif()
    334     find_package_handle_standard_args(BLAS DEFAULT_MSG
    335       BLAS_SEQ_LIBRARIES
    336       BLAS_LIBRARY_DIRS
    337       BLAS_INCLUDE_DIRS)
    338   endif()
    339 elseif(BLA_VENDOR MATCHES "ACML*")
    340   if(NOT BLASEXT_FIND_QUIETLY)
    341     message(STATUS "BLAS found is ACML:"
    342       "\n   we manage two lists of libs, one sequential and one parallel if found"
    343       "\n   (see BLAS_SEQ_LIBRARIES and BLAS_PAR_LIBRARIES)")
    344     message(STATUS "BLAS sequential libraries stored in BLAS_SEQ_LIBRARIES")
    345   endif()
    346   find_package_handle_standard_args(BLAS DEFAULT_MSG
    347     BLAS_SEQ_LIBRARIES
    348     BLAS_LIBRARY_DIRS)
    349   if(BLAS_PAR_LIBRARIES)
    350     if(NOT BLASEXT_FIND_QUIETLY)
    351       message(STATUS "BLAS parallel libraries stored in BLAS_PAR_LIBRARIES")
    352     endif()
    353     find_package_handle_standard_args(BLAS DEFAULT_MSG
    354       BLAS_PAR_LIBRARIES)
    355   endif()
    356 elseif(BLA_VENDOR MATCHES "IBMESSL*")
    357   if(NOT BLASEXT_FIND_QUIETLY)
    358     message(STATUS "BLAS found is ESSL:"
    359       "\n   we manage two lists of libs, one sequential and one parallel if found"
    360       "\n   (see BLAS_SEQ_LIBRARIES and BLAS_PAR_LIBRARIES)")
    361     message(STATUS "BLAS sequential libraries stored in BLAS_SEQ_LIBRARIES")
    362   endif()
    363   find_package_handle_standard_args(BLAS DEFAULT_MSG
    364     BLAS_SEQ_LIBRARIES
    365     BLAS_LIBRARY_DIRS)
    366   if(BLAS_PAR_LIBRARIES)
    367     if(NOT BLASEXT_FIND_QUIETLY)
    368       message(STATUS "BLAS parallel libraries stored in BLAS_PAR_LIBRARIES")
    369     endif()
    370     find_package_handle_standard_args(BLAS DEFAULT_MSG
    371       BLAS_PAR_LIBRARIES)
    372   endif()
    373 else()
    374   if(NOT BLASEXT_FIND_QUIETLY)
    375     message(STATUS "BLAS sequential libraries stored in BLAS_SEQ_LIBRARIES")
    376   endif()
    377   find_package_handle_standard_args(BLAS DEFAULT_MSG
    378     BLAS_SEQ_LIBRARIES
    379     BLAS_LIBRARY_DIRS)
    380 endif()
    381