diff --git a/cmake/Dependencies.cmake b/cmake/Dependencies.cmake index cab3642d9aaf..0b0514a0bfea 100644 --- a/cmake/Dependencies.cmake +++ b/cmake/Dependencies.cmake @@ -107,6 +107,8 @@ if(CAFFE2_CMAKE_BUILDING_WITH_MAIN_REPO) endif() # ---[ BLAS + +# setting default preferred BLAS options if not already present. if(NOT INTERN_BUILD_MOBILE) set(BLAS "MKL" CACHE STRING "Selected BLAS library") else() @@ -146,7 +148,6 @@ elseif(BLAS STREQUAL "MKL") set(CAFFE2_USE_MKL ON) else() message(WARNING "MKL could not be found. Defaulting to Eigen") - set(BLAS "Eigen" CACHE STRING "Selected BLAS library") set(CAFFE2_USE_EIGEN_FOR_BLAS ON) set(CAFFE2_USE_MKL OFF) endif() @@ -173,9 +174,6 @@ if(NOT INTERN_BUILD_MOBILE) find_package(BLAS) if(NOT BLAS_FOUND) set(USE_BLAS 0) - set(BLAS "" CACHE STRING "Selected BLAS library") - else() - set(BLAS BLAS_INFO CACHE STRING "Selected BLAS library") endif() endif() @@ -190,6 +188,11 @@ if(NOT INTERN_BUILD_MOBILE) endif() set(AT_MKL_ENABLED 1) endif() +elseif(INTERN_USE_EIGEN_BLAS) + # Eigen BLAS for Mobile + set(USE_BLAS 1) + include(${CMAKE_CURRENT_LIST_DIR}/External/EigenBLAS.cmake) + list(APPEND Caffe2_DEPENDENCY_LIBS eigen_blas) endif() # ---[ Dependencies @@ -285,13 +288,6 @@ set(CONFU_DEPENDENCIES_SOURCE_DIR ${PROJECT_BINARY_DIR}/confu-srcs set(CONFU_DEPENDENCIES_BINARY_DIR ${PROJECT_BINARY_DIR}/confu-deps CACHE PATH "Confu-style dependencies binary directory") -# ---[ Eigen BLAS for Mobile -if(INTERN_BUILD_MOBILE AND INTERN_USE_EIGEN_BLAS) - set(USE_BLAS 1) - include(${CMAKE_CURRENT_LIST_DIR}/External/EigenBLAS.cmake) - list(APPEND Caffe2_DEPENDENCY_LIBS eigen_blas) -endif() - # ---[ pthreadpool # Only add a dependency on pthreadpool if we are on a mobile build # or are building any of the libraries in the {Q/X}NNPACK family. diff --git a/cmake/Modules/FindBLAS.cmake b/cmake/Modules/FindBLAS.cmake index 38e826d1f5f4..e8f5d7c95092 100644 --- a/cmake/Modules/FindBLAS.cmake +++ b/cmake/Modules/FindBLAS.cmake @@ -83,7 +83,7 @@ MACRO(Check_Fortran_Libraries LIBRARIES _prefix _name _flags _list) check_fortran_function_exists(${_name} ${_prefix}${_combined_name}_WORKS) else (CMAKE_Fortran_COMPILER_WORKS) check_function_exists("${_name}_" ${_prefix}${_combined_name}_WORKS) - endif (CMAKE_Fortran_COMPILER_WORKS) + endif(CMAKE_Fortran_COMPILER_WORKS) set(CMAKE_REQUIRED_LIBRARIES) mark_as_advanced(${_prefix}${_combined_name}_WORKS) set(_libraries_work ${${_prefix}${_combined_name}_WORKS}) @@ -117,33 +117,46 @@ if((NOT BLAS_LIBRARIES) if (BLAS_LIBRARIES) set(BLAS_INFO "accelerate") set(BLAS_IS_ACCELERATE 1) - endif (BLAS_LIBRARIES) + endif(BLAS_LIBRARIES) endif() if((NOT BLAS_LIBRARIES) AND ((NOT WITH_BLAS) OR (WITH_BLAS STREQUAL "veclib"))) - check_fortran_libraries( - BLAS_LIBRARIES - BLAS - sgemm - "" - "vecLib") - if (BLAS_LIBRARIES) - set(BLAS_INFO "veclib") - endif (BLAS_LIBRARIES) + FIND_PACKAGE(vecLib) + if(vecLib_FOUND) + SET(BLAS_INFO "veclib") + else() + check_fortran_libraries( + BLAS_LIBRARIES + BLAS + sgemm + "" + "vecLib") + if (BLAS_LIBRARIES) + set(BLAS_INFO "veclib") + endif(BLAS_LIBRARIES) + endif() endif() if((NOT BLAS_LIBRARIES) AND ((NOT WITH_BLAS) OR (WITH_BLAS STREQUAL "open"))) - check_fortran_libraries( - BLAS_LIBRARIES - BLAS - sgemm - "" - "openblas") - if(BLAS_LIBRARIES) - set(BLAS_INFO "open") - endif(BLAS_LIBRARIES) + FIND_PACKAGE(OpenBLAS) + if(OpenBLAS_FOUND) + SET(BLAS_INFO "open") + SET(BLAS_LIBRARIES ${OpenBLAS_LIB}) + SET(BLAS_INCLUDE_DIR ${OpenBLAS_INCLUDE_DIR}) + SET(BLAS_VERSION ${OpenBLAS_VERSION}) + else() + check_fortran_libraries( + BLAS_LIBRARIES + BLAS + sgemm + "" + "openblas") + if(BLAS_LIBRARIES) + set(BLAS_INFO "open") + endif(BLAS_LIBRARIES) + endif() endif() if((NOT BLAS_LIBRARIES) @@ -182,7 +195,7 @@ if((NOT BLAS_LIBRARIES) "goto2;gfortran") if (BLAS_LIBRARIES) set(BLAS_INFO "goto") - endif (BLAS_LIBRARIES) + endif(BLAS_LIBRARIES) endif() if((NOT BLAS_LIBRARIES) @@ -195,7 +208,7 @@ if((NOT BLAS_LIBRARIES) "goto2;gfortran;pthread") if (BLAS_LIBRARIES) set(BLAS_INFO "goto") - endif (BLAS_LIBRARIES) + endif(BLAS_LIBRARIES) endif() if((NOT BLAS_LIBRARIES) @@ -208,7 +221,7 @@ if((NOT BLAS_LIBRARIES) "acml;gfortran") if (BLAS_LIBRARIES) set(BLAS_INFO "acml") - endif (BLAS_LIBRARIES) + endif(BLAS_LIBRARIES) endif() if((NOT BLAS_LIBRARIES) @@ -222,21 +235,26 @@ if((NOT BLAS_LIBRARIES) "blis") if (BLAS_LIBRARIES) set(BLAS_INFO "FLAME") - endif (BLAS_LIBRARIES) + endif(BLAS_LIBRARIES) endif() # BLAS in ATLAS library? (http://math-atlas.sourceforge.net/) if((NOT BLAS_LIBRARIES) AND ((NOT WITH_BLAS) OR (WITH_BLAS STREQUAL "atlas"))) - check_fortran_libraries( - BLAS_LIBRARIES - BLAS - sgemm - "" - "ptf77blas;atlas;gfortran") - if (BLAS_LIBRARIES) - set(BLAS_INFO "atlas") - endif (BLAS_LIBRARIES) + FIND_PACKAGE(Atlas) + if(Atlas_FOUND) + SET(BLAS_INFO "atlas") + else() + check_fortran_libraries( + BLAS_LIBRARIES + BLAS + sgemm + "" + "ptf77blas;atlas;gfortran") + if (BLAS_LIBRARIES) + set(BLAS_INFO "atlas") + endif(BLAS_LIBRARIES) + endif() endif() # Generic BLAS library? @@ -250,7 +268,7 @@ if((NOT BLAS_LIBRARIES) "blas") if (BLAS_LIBRARIES) set(BLAS_INFO "generic") - endif (BLAS_LIBRARIES) + endif(BLAS_LIBRARIES) endif() # Determine if blas was compiled with the f2c conventions @@ -287,7 +305,7 @@ int main() { SET(BLAS_F2C TRUE) ELSE (BLAS_F2C_DOUBLE_WORKS AND NOT BLAS_F2C_FLOAT_WORKS) SET(BLAS_F2C FALSE) - ENDIF (BLAS_F2C_DOUBLE_WORKS AND NOT BLAS_F2C_FLOAT_WORKS) + ENDIF(BLAS_F2C_DOUBLE_WORKS AND NOT BLAS_F2C_FLOAT_WORKS) CHECK_C_SOURCE_RUNS(" #include #include @@ -303,7 +321,7 @@ int main() { SET(BLAS_USE_CBLAS_DOT TRUE) ELSE (BLAS_USE_CBLAS_DOT) SET(BLAS_USE_CBLAS_DOT FALSE) - ENDIF (BLAS_USE_CBLAS_DOT) + ENDIF(BLAS_USE_CBLAS_DOT) SET(CMAKE_REQUIRED_LIBRARIES) ENDIF(BLAS_LIBRARIES) @@ -317,10 +335,10 @@ endif(BLAS_LIBRARIES) IF (NOT BLAS_FOUND AND BLAS_FIND_REQUIRED) message(FATAL_ERROR "Cannot find a library with BLAS API. Please specify library location.") -ENDIF (NOT BLAS_FOUND AND BLAS_FIND_REQUIRED) +ENDIF(NOT BLAS_FOUND AND BLAS_FIND_REQUIRED) IF(NOT BLAS_FIND_QUIETLY) IF(BLAS_FOUND) - MESSAGE(STATUS "Found a library with BLAS API (${BLAS_INFO}).") + MESSAGE(STATUS "Found a library with BLAS API (${BLAS_INFO}). Full path: (${BLAS_LIBRARIES})") ELSE(BLAS_FOUND) MESSAGE(STATUS "Cannot find a library with BLAS API. Not using BLAS.") ENDIF(BLAS_FOUND)