123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384 |
- ###
- #
- # @copyright (c) 2009-2014 The University of Tennessee and The University
- # of Tennessee Research Foundation.
- # All rights reserved.
- # @copyright (c) 2012-2016 Inria. All rights reserved.
- # @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved.
- #
- ###
- #
- # - Find BLAS EXTENDED for MORSE projects: find include dirs and libraries
- #
- # This module allows to find BLAS libraries by calling the official FindBLAS module
- # and handles the creation of different library lists whether the user wishes to link
- # with a sequential BLAS or a multihreaded (BLAS_SEQ_LIBRARIES and BLAS_PAR_LIBRARIES).
- # BLAS is detected with a FindBLAS call then if the BLAS vendor is Intel10_64lp, ACML
- # or IBMESSLMT then the module attempts to find the corresponding multithreaded libraries.
- #
- # The following variables have been added to manage links with sequential or multithreaded
- # versions:
- # BLAS_INCLUDE_DIRS - BLAS include directories
- # BLAS_LIBRARY_DIRS - Link directories for BLAS libraries
- # BLAS_SEQ_LIBRARIES - BLAS component libraries to be linked (sequential)
- # BLAS_PAR_LIBRARIES - BLAS component libraries to be linked (multithreaded)
- #=============================================================================
- # Copyright 2012-2013 Inria
- # Copyright 2012-2013 Emmanuel Agullo
- # Copyright 2012-2013 Mathieu Faverge
- # Copyright 2012 Cedric Castagnede
- # Copyright 2013-2016 Florent Pruvost
- #
- # Distributed under the OSI-approved BSD License (the "License");
- # see accompanying file MORSE-Copyright.txt for details.
- #
- # This software is distributed WITHOUT ANY WARRANTY; without even the
- # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- # See the License for more information.
- #=============================================================================
- # (To distribute this file outside of Morse, substitute the full
- # License text for the above reference.)
- # macro to factorize this call
- include(CMakeFindDependencyMacro)
- macro(find_package_blas)
- if(BLASEXT_FIND_REQUIRED)
- if(BLASEXT_FIND_QUIETLY)
- find_dependency(BLAS REQUIRED QUIET)
- else()
- find_dependency(BLAS REQUIRED)
- endif()
- else()
- if(BLASEXT_FIND_QUIETLY)
- find_dependency(BLAS QUIET)
- else()
- find_dependency(BLAS)
- endif()
- endif()
- endmacro()
- # add a cache variable to let the user specify the BLAS vendor
- set(BLA_VENDOR "" CACHE STRING "list of possible BLAS vendor:
- Open, Eigen, Goto, ATLAS PhiPACK, CXML, DXML, SunPerf, SCSL, SGIMATH, IBMESSL, IBMESSLMT,
- Intel10_32 (intel mkl v10 32 bit),
- Intel10_64lp (intel mkl v10 64 bit, lp thread model, lp64 model),
- Intel10_64lp_seq (intel mkl v10 64 bit, sequential code, lp64 model),
- Intel( older versions of mkl 32 and 64 bit),
- ACML, ACML_MP, ACML_GPU, Apple, NAS, Generic")
- if(NOT BLASEXT_FIND_QUIETLY)
- message(STATUS "In FindBLASEXT")
- message(STATUS "If you want to force the use of one specific library, "
- "\n please specify the BLAS vendor by setting -DBLA_VENDOR=blas_vendor_name"
- "\n at cmake configure.")
- message(STATUS "List of possible BLAS vendor: Goto, ATLAS PhiPACK, CXML, "
- "\n DXML, SunPerf, SCSL, SGIMATH, IBMESSL, IBMESSLMT, Intel10_32 (intel mkl v10 32 bit),"
- "\n Intel10_64lp (intel mkl v10 64 bit, lp thread model, lp64 model),"
- "\n Intel10_64lp_seq (intel mkl v10 64 bit, sequential code, lp64 model),"
- "\n Intel( older versions of mkl 32 and 64 bit),"
- "\n ACML, ACML_MP, ACML_GPU, Apple, NAS, Generic")
- endif()
- if (NOT BLAS_FOUND)
- # First try to detect two cases:
- # 1: only SEQ libs are handled
- # 2: both SEQ and PAR libs are handled
- find_package_blas()
- endif ()
- # detect the cases where SEQ and PAR libs are handled
- if(BLA_VENDOR STREQUAL "All" AND
- (BLAS_mkl_core_LIBRARY OR BLAS_mkl_core_dll_LIBRARY)
- )
- set(BLA_VENDOR "Intel")
- if(BLAS_mkl_intel_LIBRARY)
- set(BLA_VENDOR "Intel10_32")
- endif()
- if(BLAS_mkl_intel_lp64_LIBRARY)
- set(BLA_VENDOR "Intel10_64lp")
- endif()
- if(NOT BLASEXT_FIND_QUIETLY)
- message(STATUS "A BLAS library has been found (${BLAS_LIBRARIES}) but we"
- "\n have also potentially detected some multithreaded BLAS libraries from the MKL."
- "\n We try to find both libraries lists (Sequential/Multithreaded).")
- endif()
- set(BLAS_FOUND "")
- elseif(BLA_VENDOR STREQUAL "All" AND BLAS_acml_LIBRARY)
- set(BLA_VENDOR "ACML")
- if(NOT BLASEXT_FIND_QUIETLY)
- message(STATUS "A BLAS library has been found (${BLAS_LIBRARIES}) but we"
- "\n have also potentially detected some multithreaded BLAS libraries from the ACML."
- "\n We try to find both libraries lists (Sequential/Multithreaded).")
- endif()
- set(BLAS_FOUND "")
- elseif(BLA_VENDOR STREQUAL "All" AND BLAS_essl_LIBRARY)
- set(BLA_VENDOR "IBMESSL")
- if(NOT BLASEXT_FIND_QUIETLY)
- message(STATUS "A BLAS library has been found (${BLAS_LIBRARIES}) but we"
- "\n have also potentially detected some multithreaded BLAS libraries from the ESSL."
- "\n We try to find both libraries lists (Sequential/Multithreaded).")
- endif()
- set(BLAS_FOUND "")
- endif()
- # Intel case
- if(BLA_VENDOR MATCHES "Intel*")
- ###
- # look for include path if the BLAS vendor is Intel
- ###
- # gather system include paths
- unset(_inc_env)
- if(WIN32)
- string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}")
- else()
- string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}")
- list(APPEND _inc_env "${_path_env}")
- string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}")
- list(APPEND _inc_env "${_path_env}")
- string(REPLACE ":" ";" _path_env "$ENV{CPATH}")
- list(APPEND _inc_env "${_path_env}")
- string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}")
- list(APPEND _inc_env "${_path_env}")
- endif()
- list(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}")
- list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}")
- set(ENV_MKLROOT "$ENV{MKLROOT}")
- if (ENV_MKLROOT)
- list(APPEND _inc_env "${ENV_MKLROOT}/include")
- endif()
- list(REMOVE_DUPLICATES _inc_env)
- # find mkl.h inside known include paths
- set(BLAS_mkl.h_INCLUDE_DIRS "BLAS_mkl.h_INCLUDE_DIRS-NOTFOUND")
- if(BLAS_INCDIR)
- set(BLAS_mkl.h_INCLUDE_DIRS "BLAS_mkl.h_INCLUDE_DIRS-NOTFOUND")
- find_path(BLAS_mkl.h_INCLUDE_DIRS
- NAMES mkl.h
- HINTS ${BLAS_INCDIR})
- else()
- if(BLAS_DIR)
- set(BLAS_mkl.h_INCLUDE_DIRS "BLAS_mkl.h_INCLUDE_DIRS-NOTFOUND")
- find_path(BLAS_mkl.h_INCLUDE_DIRS
- NAMES mkl.h
- HINTS ${BLAS_DIR}
- PATH_SUFFIXES include)
- else()
- set(BLAS_mkl.h_INCLUDE_DIRS "BLAS_mkl.h_INCLUDE_DIRS-NOTFOUND")
- find_path(BLAS_mkl.h_INCLUDE_DIRS
- NAMES mkl.h
- HINTS ${_inc_env})
- endif()
- endif()
- mark_as_advanced(BLAS_mkl.h_INCLUDE_DIRS)
- ## Print status if not found
- ## -------------------------
- #if (NOT BLAS_mkl.h_INCLUDE_DIRS AND MORSE_VERBOSE)
- # Print_Find_Header_Status(blas mkl.h)
- #endif ()
- set(BLAS_INCLUDE_DIRS "")
- if(BLAS_mkl.h_INCLUDE_DIRS)
- list(APPEND BLAS_INCLUDE_DIRS "${BLAS_mkl.h_INCLUDE_DIRS}" )
- endif()
- ###
- # look for libs
- ###
- # if Intel 10 64 bit -> look for sequential and multithreaded versions
- if(BLA_VENDOR MATCHES "Intel10_64lp*")
- ## look for the sequential version
- set(BLA_VENDOR "Intel10_64lp_seq")
- if(NOT BLASEXT_FIND_QUIETLY)
- message(STATUS "Look for the sequential version Intel10_64lp_seq")
- endif()
- find_package_blas()
- if(BLAS_FOUND)
- set(BLAS_SEQ_LIBRARIES "${BLAS_LIBRARIES}")
- else()
- set(BLAS_SEQ_LIBRARIES "${BLAS_SEQ_LIBRARIES-NOTFOUND}")
- endif()
- ## look for the multithreaded version
- set(BLA_VENDOR "Intel10_64lp")
- if(NOT BLASEXT_FIND_QUIETLY)
- message(STATUS "Look for the multithreaded version Intel10_64lp")
- endif()
- find_package_blas()
- if(BLAS_FOUND)
- set(BLAS_PAR_LIBRARIES "${BLAS_LIBRARIES}")
- else()
- set(BLAS_PAR_LIBRARIES "${BLAS_PAR_LIBRARIES-NOTFOUND}")
- endif()
- else()
- if(BLAS_FOUND)
- set(BLAS_SEQ_LIBRARIES "${BLAS_LIBRARIES}")
- else()
- set(BLAS_SEQ_LIBRARIES "${BLAS_SEQ_LIBRARIES-NOTFOUND}")
- endif()
- endif()
- # ACML case
- elseif(BLA_VENDOR MATCHES "ACML*")
- ## look for the sequential version
- set(BLA_VENDOR "ACML")
- find_package_blas()
- if(BLAS_FOUND)
- set(BLAS_SEQ_LIBRARIES "${BLAS_LIBRARIES}")
- else()
- set(BLAS_SEQ_LIBRARIES "${BLAS_SEQ_LIBRARIES-NOTFOUND}")
- endif()
- ## look for the multithreaded version
- set(BLA_VENDOR "ACML_MP")
- find_package_blas()
- if(BLAS_FOUND)
- set(BLAS_PAR_LIBRARIES "${BLAS_LIBRARIES}")
- else()
- set(BLAS_PAR_LIBRARIES "${BLAS_PAR_LIBRARIES-NOTFOUND}")
- endif()
- # IBMESSL case
- elseif(BLA_VENDOR MATCHES "IBMESSL*")
- ## look for the sequential version
- set(BLA_VENDOR "IBMESSL")
- find_package_blas()
- if(BLAS_FOUND)
- set(BLAS_SEQ_LIBRARIES "${BLAS_LIBRARIES}")
- else()
- set(BLAS_SEQ_LIBRARIES "${BLAS_SEQ_LIBRARIES-NOTFOUND}")
- endif()
- ## look for the multithreaded version
- set(BLA_VENDOR "IBMESSLMT")
- find_package_blas()
- if(BLAS_FOUND)
- set(BLAS_PAR_LIBRARIES "${BLAS_LIBRARIES}")
- else()
- set(BLAS_PAR_LIBRARIES "${BLAS_PAR_LIBRARIES-NOTFOUND}")
- endif()
- else()
- if(BLAS_FOUND)
- # define the SEQ libs as the BLAS_LIBRARIES
- set(BLAS_SEQ_LIBRARIES "${BLAS_LIBRARIES}")
- else()
- set(BLAS_SEQ_LIBRARIES "${BLAS_SEQ_LIBRARIES-NOTFOUND}")
- endif()
- set(BLAS_PAR_LIBRARIES "${BLAS_PAR_LIBRARIES-NOTFOUND}")
- endif()
- if(BLAS_SEQ_LIBRARIES)
- set(BLAS_LIBRARIES "${BLAS_SEQ_LIBRARIES}")
- endif()
- # extract libs paths
- # remark: because it is not given by find_package(BLAS)
- set(BLAS_LIBRARY_DIRS "")
- string(REPLACE " " ";" BLAS_LIBRARIES "${BLAS_LIBRARIES}")
- foreach(blas_lib ${BLAS_LIBRARIES})
- if (EXISTS "${blas_lib}")
- get_filename_component(a_blas_lib_dir "${blas_lib}" PATH)
- list(APPEND BLAS_LIBRARY_DIRS "${a_blas_lib_dir}" )
- else()
- string(REPLACE "-L" "" blas_lib "${blas_lib}")
- if (EXISTS "${blas_lib}")
- list(APPEND BLAS_LIBRARY_DIRS "${blas_lib}" )
- else()
- get_filename_component(a_blas_lib_dir "${blas_lib}" PATH)
- if (EXISTS "${a_blas_lib_dir}")
- list(APPEND BLAS_LIBRARY_DIRS "${a_blas_lib_dir}" )
- endif()
- endif()
- endif()
- endforeach()
- if (BLAS_LIBRARY_DIRS)
- list(REMOVE_DUPLICATES BLAS_LIBRARY_DIRS)
- endif ()
- # check that BLAS has been found
- # ---------------------------------
- include(FindPackageHandleStandardArgs)
- if(BLA_VENDOR MATCHES "Intel*")
- if(BLA_VENDOR MATCHES "Intel10_64lp*")
- if(NOT BLASEXT_FIND_QUIETLY)
- message(STATUS "BLAS found is Intel MKL:"
- "\n we manage two lists of libs, one sequential and one parallel if found"
- "\n (see BLAS_SEQ_LIBRARIES and BLAS_PAR_LIBRARIES)")
- message(STATUS "BLAS sequential libraries stored in BLAS_SEQ_LIBRARIES")
- endif()
- find_package_handle_standard_args(BLASEXT DEFAULT_MSG
- BLAS_SEQ_LIBRARIES
- BLAS_LIBRARY_DIRS
- BLAS_INCLUDE_DIRS)
- if(BLAS_PAR_LIBRARIES)
- if(NOT BLASEXT_FIND_QUIETLY)
- message(STATUS "BLAS parallel libraries stored in BLAS_PAR_LIBRARIES")
- endif()
- find_package_handle_standard_args(BLASEXT DEFAULT_MSG
- BLAS_PAR_LIBRARIES)
- endif()
- else()
- if(NOT BLASEXT_FIND_QUIETLY)
- message(STATUS "BLAS sequential libraries stored in BLAS_SEQ_LIBRARIES")
- endif()
- find_package_handle_standard_args(BLASEXT DEFAULT_MSG
- BLAS_SEQ_LIBRARIES
- BLAS_LIBRARY_DIRS
- BLAS_INCLUDE_DIRS)
- endif()
- elseif(BLA_VENDOR MATCHES "ACML*")
- if(NOT BLASEXT_FIND_QUIETLY)
- message(STATUS "BLAS found is ACML:"
- "\n we manage two lists of libs, one sequential and one parallel if found"
- "\n (see BLAS_SEQ_LIBRARIES and BLAS_PAR_LIBRARIES)")
- message(STATUS "BLAS sequential libraries stored in BLAS_SEQ_LIBRARIES")
- endif()
- find_package_handle_standard_args(BLASEXT DEFAULT_MSG
- BLAS_SEQ_LIBRARIES
- BLAS_LIBRARY_DIRS)
- if(BLAS_PAR_LIBRARIES)
- if(NOT BLASEXT_FIND_QUIETLY)
- message(STATUS "BLAS parallel libraries stored in BLAS_PAR_LIBRARIES")
- endif()
- find_package_handle_standard_args(BLASEXT DEFAULT_MSG
- BLAS_PAR_LIBRARIES)
- endif()
- elseif(BLA_VENDOR MATCHES "IBMESSL*")
- if(NOT BLASEXT_FIND_QUIETLY)
- message(STATUS "BLAS found is ESSL:"
- "\n we manage two lists of libs, one sequential and one parallel if found"
- "\n (see BLAS_SEQ_LIBRARIES and BLAS_PAR_LIBRARIES)")
- message(STATUS "BLAS sequential libraries stored in BLAS_SEQ_LIBRARIES")
- endif()
- find_package_handle_standard_args(BLASEXT DEFAULT_MSG
- BLAS_SEQ_LIBRARIES
- BLAS_LIBRARY_DIRS)
- if(BLAS_PAR_LIBRARIES)
- if(NOT BLASEXT_FIND_QUIETLY)
- message(STATUS "BLAS parallel libraries stored in BLAS_PAR_LIBRARIES")
- endif()
- find_package_handle_standard_args(BLASEXT DEFAULT_MSG
- BLAS_PAR_LIBRARIES)
- endif()
- else()
- if(NOT BLASEXT_FIND_QUIETLY)
- message(STATUS "BLAS sequential libraries stored in BLAS_SEQ_LIBRARIES")
- endif()
- find_package_handle_standard_args(BLASEXT DEFAULT_MSG
- BLAS_SEQ_LIBRARIES
- BLAS_LIBRARY_DIRS)
- endif()
- # Callers expect BLAS_FOUND to be set as well.
- set(BLAS_FOUND BLASEXT_FOUND)
|