From edb794fc759e31bf34c6a3d422d619815c39c136 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 7 Nov 2018 14:58:19 +0100 Subject: [PATCH 01/78] Updated ps-lite --- 3rdparty/ps-lite | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/ps-lite b/3rdparty/ps-lite index 8a763892a973..226e82c53095 160000 --- a/3rdparty/ps-lite +++ b/3rdparty/ps-lite @@ -1 +1 @@ -Subproject commit 8a763892a973afc1acd3d4b469d05bb338a83a6e +Subproject commit 226e82c53095d64866821245024d5342996787f4 From 1e0ce9d85a4d0dc9b57fe13ba5bf17be1bfe6f70 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Fri, 1 Jun 2018 10:53:50 +0000 Subject: [PATCH 02/78] [MXNET-115] Fixed USE_LAPACK forced on all platforms --- CMakeLists.txt | 13 +- cmake/ChooseBlas.cmake | 102 ++++++++++++++-- cmake/Modules/FindAtlas.cmake | 123 ++++++++++++++----- cmake/Modules/FindOpenBLAS.cmake | 198 ++++++++++++++++++++----------- 4 files changed, 313 insertions(+), 123 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 42f6bffb9207..b1ec8d80e191 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -277,7 +277,6 @@ else() endif() if(USE_CUDA AND FIRST_CUDA) - include(cmake/ChooseBlas.cmake) include(3rdparty/mshadow/cmake/Utils.cmake) include(cmake/FirstClassLangCuda.cmake) include_directories(${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}) @@ -417,16 +416,8 @@ elseif(UNIX AND NOT ANDROID) list(APPEND mxnet_LINKER_LIBS pthread) endif() - -# ---[ LAPack -if(USE_LAPACK) - message("USE_LAPACK is ON") - add_definitions(-DMXNET_USE_LAPACK=1) - if (NOT MSVC) - list(APPEND mxnet_LINKER_LIBS lapack) - endif() -endif() - +# ---[ BLAS +include(cmake/ChooseBlas.cmake) # ---[ jemalloc if(USE_JEMALLOC) diff --git a/cmake/ChooseBlas.cmake b/cmake/ChooseBlas.cmake index 13d7083f3d12..a37bd0da0339 100644 --- a/cmake/ChooseBlas.cmake +++ b/cmake/ChooseBlas.cmake @@ -19,40 +19,120 @@ set(BLAS "Open" CACHE STRING "Selected BLAS library") set_property(CACHE BLAS PROPERTY STRINGS "Atlas;Open;MKL") if(USE_MKL_IF_AVAILABLE) + message(STATUS "Trying to find MKL library due to USE_MKL_IF_AVAILABLE=True...") + if(NOT MKL_FOUND) find_package(MKL) endif() + if(MKL_FOUND) - if(USE_MKLDNN) + message(STATUS "MKL library found, checking if USE_MKLDNN...") + + if(USE_MKLDNN) + message(STATUS "USE_MKLDNN=True, setting to use OpenBLAS") set(BLAS "open") else() + message(STATUS "USE_MKLDNN=False, setting to use MKL") set(BLAS "MKL") endif() + else() + message(STATUS "MKL library not found, BLAS=${BLAS}") endif() endif() -if(BLAS STREQUAL "Atlas" OR BLAS STREQUAL "atlas") - find_package(Atlas REQUIRED) - include_directories(SYSTEM ${Atlas_INCLUDE_DIR}) +# cmake regexp does not support case insensitive match (?i) or //i +if(BLAS MATCHES "[Aa][Tt][Ll][Aa][Ss]") + message(STATUS "Using Atlas for BLAS") + + set(Atlas_NEED_LAPACK ${USE_LAPACK}) + + include(${CMAKE_CURRENT_LIST_DIR}/Modules/FindAtlas.cmake) + + include_directories(SYSTEM ${Atlas_INCLUDE_DIRS}) list(APPEND mshadow_LINKER_LIBS ${Atlas_LIBRARIES}) + add_definitions(-DMSHADOW_USE_CBLAS=1) add_definitions(-DMSHADOW_USE_MKL=0) -elseif(BLAS STREQUAL "Open" OR BLAS STREQUAL "open") - find_package(OpenBLAS REQUIRED) - include_directories(SYSTEM ${OpenBLAS_INCLUDE_DIR}) - list(APPEND mshadow_LINKER_LIBS ${OpenBLAS_LIB}) + + if(USE_LAPACK AND Atlas_LAPACK_FOUND) + add_definitions(-DMXNET_USE_LAPACK=1) + endif() + + return() +endif() + +if(BLAS MATCHES "[Oo][Pp][Ee][Nn]") + message(STATUS "Using OpenBLAS for BLAS") + + set(OpenBLAS_NEED_LAPACK ${USE_LAPACK}) + + include(${CMAKE_CURRENT_LIST_DIR}/Modules/FindOpenBLAS.cmake) + + include_directories(SYSTEM ${OpenBLAS_INCLUDE_DIRS}) + list(APPEND mshadow_LINKER_LIBS ${OpenBLAS_LIBRARIES}) + add_definitions(-DMSHADOW_USE_CBLAS=1) add_definitions(-DMSHADOW_USE_MKL=0) -elseif(BLAS STREQUAL "MKL" OR BLAS STREQUAL "mkl") + + if(USE_LAPACK AND OpenBLAS_LAPACK_FOUND) + add_definitions(-DMXNET_USE_LAPACK=1) + endif() + + return() +endif() + +if(BLAS MATCHES "[Mm][Kk][Ll]") + message(STATUS "Using MKL for BLAS") + + # todo(lebeg): include(${CMAKE_CURRENT_LIST_DIR}/Modules/FindMKL.cmake) + find_package(MKL REQUIRED) + include_directories(SYSTEM ${MKL_INCLUDE_DIR}) list(APPEND mshadow_LINKER_LIBS ${MKL_LIBRARIES}) + add_definitions(-DMSHADOW_USE_CBLAS=0) add_definitions(-DMSHADOW_USE_MKL=1) -elseif(BLAS STREQUAL "apple") + + if(USE_LAPACK) + include(CheckFunctionExists) + check_function_exists("cheev_" LAPACK_FOUND) + + if(LAPACK_FOUND) + add_definitions(-DMXNET_USE_LAPACK=1) + endif() + endif() + + return() +endif() + +if(BLAS MATCHES "[Aa][Pp][Pp][Ll][Ee]") + if(NOT APPLE) + message(FATAL_ERROR "Apple BLAS framework is available only on MAC") + return() + endif() + + message(STATUS "Using Apple Accelerate for BLAS") + + # Accelerate framework documentation + # https://developer.apple.com/documentation/accelerate?changes=_2 find_package(Accelerate REQUIRED) include_directories(SYSTEM ${Accelerate_INCLUDE_DIR}) list(APPEND mshadow_LINKER_LIBS ${Accelerate_LIBRARIES}) - add_definitions(-DMSHADOW_USE_MKL=0) + add_definitions(-DMSHADOW_USE_CBLAS=1) + add_definitions(-DMSHADOW_USE_MKL=0) + + if(USE_LAPACK) + # Apples vecLib should contain lapack functionalities included in the Accelerate framework, but we will double check + # https://developer.apple.com/documentation/accelerate/veclib?changes=_2 + include(CheckFunctionExists) + check_function_exists("cheev_" LAPACK_FOUND) + + if(LAPACK_FOUND) + add_definitions(-DMXNET_USE_LAPACK=1) + endif() + endif() + + return() endif() diff --git a/cmake/Modules/FindAtlas.cmake b/cmake/Modules/FindAtlas.cmake index 27aaa0e856ab..b2e4ad71b02a 100644 --- a/cmake/Modules/FindAtlas.cmake +++ b/cmake/Modules/FindAtlas.cmake @@ -18,54 +18,113 @@ # Find the Atlas (and Lapack) libraries # # The following variables are optionally searched for defaults -# Atlas_ROOT_DIR: Base directory where all Atlas components are found -# Atlas_NEED_LAPACK: Whether need lapack libraries +# +# Atlas_ROOT_DIR: Base directory where all Atlas components are found +# Atlas_NEED_LAPACK: Whether need lapack libraries # # The following are set after configuration is done: -# Atlas_FOUND -# Atlas_INCLUDE_DIRS -# Atlas_LIBRARIES -# Atlas_LIBRARYRARY_DIRS +# +# Atlas_FOUND +# Atlas_LAPACK_FOUND +# Atlas_INCLUDE_DIRS +# Atlas_LIBRARIES + +file(TO_CMAKE_PATH "$ENV{CROSS_ROOT}" CROSS_ROOT) + +if(CMAKE_CROSSCOMPILING) + set(Atlas_INCLUDE_SEARCH_PATHS + ${CROSS_ROOT} + ${CROSS_ROOT}/include + ) +endif() set(Atlas_INCLUDE_SEARCH_PATHS - /usr/include/atlas - /usr/include/atlas-base - $ENV{Atlas_ROOT_DIR} - $ENV{Atlas_ROOT_DIR}/include - $ENV{Atlas_ROOT_DIR}/include/atlas -) + $ENV{Atlas_INCLUDE_SEARCH_PATHS} + + $ENV{Atlas_ROOT_DIR} + $ENV{Atlas_ROOT_DIR}/include + $ENV{Atlas_ROOT_DIR}/include/atlas + + /usr/include/atlas + /usr/include/atlas-base + ) + +if(CMAKE_CROSSCOMPILING) + set(Atlas_LIB_SEARCH_PATHS + ${CROSS_ROOT} + ${CROSS_ROOT}/lib + ${CROSS_ROOT}/lib64 + ) +endif() set(Atlas_LIB_SEARCH_PATHS - /usr/lib/atlas - /usr/lib/atlas-base - $ENV{Atlas_ROOT_DIR} - $ENV{Atlas_ROOT_DIR}/lib -) + $ENV{Atlas_LIB_SEARCH_PATHS} + + $ENV{Atlas_ROOT_DIR} + $ENV{Atlas_ROOT_DIR}/lib + + /usr/lib/atlas + /usr/lib/atlas-base + ) -find_path(Atlas_CBLAS_INCLUDE_DIR NAMES cblas.h PATHS ${Atlas_INCLUDE_SEARCH_PATHS}) -find_library(Atlas_CBLAS_LIBRARY NAMES ptcblas_r ptcblas cblas_r cblas PATHS ${Atlas_LIB_SEARCH_PATHS}) -find_library(Atlas_BLAS_LIBRARY NAMES atlas_r atlas PATHS ${Atlas_LIB_SEARCH_PATHS}) +find_path(Atlas_CBLAS_INCLUDE_DIR + NAMES cblas.h + PATHS ${Atlas_INCLUDE_SEARCH_PATHS}) + +find_library(Atlas_CBLAS_LIBRARY + NAMES ptcblas_r ptcblas cblas_r cblas + PATHS ${Atlas_LIB_SEARCH_PATHS}) +find_library(Atlas_BLAS_LIBRARY + NAMES atlas_r atlas + PATHS ${Atlas_LIB_SEARCH_PATHS}) set(LOOKED_FOR - Atlas_CBLAS_INCLUDE_DIR + Atlas_CBLAS_INCLUDE_DIR - Atlas_CBLAS_LIBRARY - Atlas_BLAS_LIBRARY -) + Atlas_CBLAS_LIBRARY + Atlas_BLAS_LIBRARY + ) if(Atlas_NEED_LAPACK) - find_path(Atlas_CLAPACK_INCLUDE_DIR NAMES clapack.h PATHS ${Atlas_INCLUDE_SEARCH_PATHS}) - find_library(Atlas_LAPACK_LIBRARY NAMES alapack_r alapack lapack_atlas PATHS ${Atlas_LIB_SEARCH_PATHS}) - set(LOOKED_FOR ${LOOKED_FOR} Atlas_CLAPACK_INCLUDE_DIR Atlas_LAPACK_LIBRARY) -endif(Atlas_NEED_LAPACK) + message(STATUS "Looking for lapack support...") + + find_path(Atlas_CLAPACK_INCLUDE_DIR + NAMES clapack.h + PATHS ${Atlas_INCLUDE_SEARCH_PATHS}) + find_library(Atlas_LAPACK_LIBRARY + NAMES lapack_r lapack lapack_atlas + PATHS ${Atlas_LIB_SEARCH_PATHS}) + + set(CMAKE_REQUIRED_LIBRARIES ${Atlas_LAPACK_LIBRARY}) + include(CheckFunctionExists) + check_function_exists("cheev_" LAPACK_FOUND) + + if(LAPACK_FOUND) + set(Atlas_LAPACK_FOUND True) + + set(LOOKED_FOR + ${LOOKED_FOR} + Atlas_CLAPACK_INCLUDE_DIR + Atlas_LAPACK_LIBRARY) + + message(STATUS "Lapack found") + else() + set(Atlas_LAPACK_FOUND False) + message(WARNING "Lapack with Atlas could not be found, lapack functionality will not be available") + endif() + +endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Atlas DEFAULT_MSG ${LOOKED_FOR}) -if(ATLAS_FOUND) - set(Atlas_INCLUDE_DIR ${Atlas_CBLAS_INCLUDE_DIR} ${Atlas_CLAPACK_INCLUDE_DIR}) +if(Atlas_FOUND) + set(Atlas_INCLUDE_DIRS ${Atlas_CBLAS_INCLUDE_DIR} ${Atlas_CLAPACK_INCLUDE_DIR}) set(Atlas_LIBRARIES ${Atlas_LAPACK_LIBRARY} ${Atlas_CBLAS_LIBRARY} ${Atlas_BLAS_LIBRARY}) + mark_as_advanced(${LOOKED_FOR}) - message(STATUS "Found Atlas (include: ${Atlas_CBLAS_INCLUDE_DIR}, library: ${Atlas_BLAS_LIBRARY})") -endif(ATLAS_FOUND) + message(STATUS "Found Atlas (include: ${Atlas_INCLUDE_DIRS}, libraries: ${Atlas_LIBRARIES})") +else() + message(FATAL "Atlas not found, looked for ${LOOKED_FOR}") +endif() diff --git a/cmake/Modules/FindOpenBLAS.cmake b/cmake/Modules/FindOpenBLAS.cmake index a3a79caae461..9705fbece117 100644 --- a/cmake/Modules/FindOpenBLAS.cmake +++ b/cmake/Modules/FindOpenBLAS.cmake @@ -15,77 +15,137 @@ # specific language governing permissions and limitations # under the License. +# Find the OpenBLAS libraries +# +# The following variables are optionally searched for defaults +# +# OpenBLAS_HOME: Base directory where all OpenBLAS components are found +# OpenBLAS_NEED_LAPACK: Whether need lapack libraries +# +# The following are set after configuration is done: +# +# OpenBLAS_FOUND +# OpenBLAS_LAPACK_FOUND +# OpenBLAS_INCLUDE_DIRS +# OpenBLAS_LIBRARIES + file(TO_CMAKE_PATH "$ENV{OpenBLAS_HOME}" OpenBLAS_HOME) file(TO_CMAKE_PATH "$ENV{OpenBLAS}" OpenBLAS_DIR) +file(TO_CMAKE_PATH "$ENV{CROSS_ROOT}" CROSS_ROOT) + +if(CMAKE_CROSSCOMPILING) + set(OpenBLAS_INCLUDE_SEARCH_PATHS + ${CROSS_ROOT} + ${CROSS_ROOT}/include + ) +endif() + +set(OpenBLAS_INCLUDE_SEARCH_PATHS + ${OpenBLAS_INCLUDE_SEARCH_PATHS} + + ${OpenBLAS_HOME} + ${OpenBLAS_HOME}/include + + /usr/include + /usr/include/openblas + /usr/include/openblas-base + /usr/local/include + /usr/local/include/openblas + /usr/local/include/openblas-base + /opt/OpenBLAS/include + /usr/local/opt/openblas/include + + ${PROJECT_SOURCE_DIR}/3rdparty/OpenBLAS/include + ${PROJECT_SOURCE_DIR}/thirdparty/OpenBLAS/include + ) + +if(CMAKE_CROSSCOMPILING) + set(Open_BLAS_LIB_SEARCH_PATHS + ${CROSS_ROOT} + ${CROSS_ROOT}/include + ) +endif() + +set(OpenBLAS_LIB_SEARCH_PATHS + ${OpenBLAS_LIB_SEARCH_PATHS} + + ${OpenBLAS_DIR} + ${OpenBLAS_DIR}/lib + ${OpenBLAS_DIR}/lib64 + ${OpenBLAS_HOME} + ${OpenBLAS_HOME}/lib + ${OpenBLAS_HOME}/lib64 -SET(Open_BLAS_INCLUDE_SEARCH_PATHS - /usr/include - /usr/include/openblas - /usr/include/openblas-base - /usr/local/include - /usr/local/include/openblas - /usr/local/include/openblas-base - /opt/OpenBLAS/include - /usr/local/opt/openblas/include - ${PROJECT_SOURCE_DIR}/3rdparty/OpenBLAS/include - ${PROJECT_SOURCE_DIR}/thirdparty/OpenBLAS/include - ${OpenBLAS_HOME} - ${OpenBLAS_HOME}/include -) - -SET(Open_BLAS_LIB_SEARCH_PATHS - /lib/ - /lib/openblas-base - /lib64/ - /usr/lib - /usr/lib/openblas-base - /usr/lib64 - /usr/local/lib - /usr/local/lib64 - /opt/OpenBLAS/lib - /usr/local/opt/openblas/lib - ${PROJECT_SOURCE_DIR}/3rdparty/OpenBLAS/lib - ${PROJECT_SOURCE_DIR}/thirdparty/OpenBLAS/lib - ${OpenBLAS_DIR} - ${OpenBLAS_DIR}/lib - ${OpenBLAS_HOME} - ${OpenBLAS_HOME}/lib - ) - -FIND_PATH(OpenBLAS_INCLUDE_DIR NAMES cblas.h PATHS ${Open_BLAS_INCLUDE_SEARCH_PATHS}) -FIND_LIBRARY(OpenBLAS_LIB NAMES openblas PATHS ${Open_BLAS_LIB_SEARCH_PATHS}) -IF(NOT OpenBLAS_LIB) - FIND_FILE(OpenBLAS_LIB NAMES libopenblas.dll.a PATHS ${Open_BLAS_LIB_SEARCH_PATHS}) -ENDIF() - -SET(OpenBLAS_FOUND ON) - -# Check include files -IF(NOT OpenBLAS_INCLUDE_DIR) - SET(OpenBLAS_FOUND OFF) - MESSAGE(STATUS "Could not find OpenBLAS include. Turning OpenBLAS_FOUND off") -ENDIF() - -# Check libraries -IF(NOT OpenBLAS_LIB) - SET(OpenBLAS_FOUND OFF) - MESSAGE(STATUS "Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off") -ENDIF() - -IF (OpenBLAS_FOUND) - IF (NOT OpenBLAS_FIND_QUIETLY) - MESSAGE(STATUS "Found OpenBLAS libraries: ${OpenBLAS_LIB}") - MESSAGE(STATUS "Found OpenBLAS include: ${OpenBLAS_INCLUDE_DIR}") - ENDIF (NOT OpenBLAS_FIND_QUIETLY) -ELSE (OpenBLAS_FOUND) - IF (OpenBLAS_FIND_REQUIRED) - MESSAGE(FATAL_ERROR "Could not find OpenBLAS") - ENDIF (OpenBLAS_FIND_REQUIRED) -ENDIF (OpenBLAS_FOUND) - -MARK_AS_ADVANCED( + /lib/ + /lib/openblas-base + /lib64/ + /usr/lib + /usr/lib/openblas-base + /usr/lib64 + /usr/local/lib + /usr/local/lib64 + /opt/OpenBLAS/lib + /usr/local/opt/openblas/lib + + ${PROJECT_SOURCE_DIR}/3rdparty/OpenBLAS/lib + ${PROJECT_SOURCE_DIR}/thirdparty/OpenBLAS/lib + ) + +find_path(OpenBLAS_INCLUDE_DIR + NAMES cblas.h + PATHS ${OpenBLAS_INCLUDE_SEARCH_PATHS}) +find_library(OpenBLAS_LIBRARY + NAMES openblas libopenblas.dll.a libopenblas.dll + PATHS ${OpenBLAS_LIB_SEARCH_PATHS}) + +set(LOOKED_FOR OpenBLAS_INCLUDE_DIR - OpenBLAS_LIB - OpenBLAS -) + OpenBLAS_LIBRARY + ) + +if(OpenBLAS_NEED_LAPACK) + message(STATUS "Looking for lapack support...") + + find_path(OpenBLAS_LAPACK_INCLUDE_DIR + NAMES clapack.h + PATHS ${OpenBLAS_INCLUDE_SEARCH_PATHS}) + # lapack if present in OpenBLAS build is included into the libopenblas. But it requires gfortran to be linked + # dynamically. + # OpenBLAS does not have a separate lapack library: https://github.com/xianyi/OpenBLAS/issues/296 + # Static linking goes with openblas, but fortran needs to be linked dynamically: + # https://github.com/xianyi/OpenBLAS/issues/460#issuecomment-61293128 + find_library(OpenBLAS_LAPACK_LIBRARY + NAMES gfortran + PATHS ${OpenBLAS_LIB_SEARCH_PATHS}) + + set(CMAKE_REQUIRED_LIBRARIES ${OpenBLAS_LIBRARY}) + include(CheckFunctionExists) + check_function_exists("cheev_" LAPACK_FOUND) + + if(LAPACK_FOUND) + set(OpenBLAS_LAPACK_FOUND True) + + set(LOOKED_FOR + ${LOOKED_FOR} + OpenBLAS_LAPACK_INCLUDE_DIR + OpenBLAS_LAPACK_LIBRARY + ) + message(STATUS "Lapack found") + else() + set(OpenBLAS_LAPACK_FOUND False) + message(WARNING "OpenBlas has not been compiled with Lapack support, lapack functionality will not be available") + endif() + +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(OpenBLAS DEFAULT_MSG ${LOOKED_FOR}) + +if(OpenBLAS_FOUND) + set(OpenBLAS_INCLUDE_DIRS ${OpenBLAS_INCLUDE_DIR} ${OpenBLAS_LAPACK_INCLUDE_DIR}) + set(OpenBLAS_LIBRARIES ${OpenBLAS_LIBRARY} ${OpenBLAS_LAPACK_LIBRARY}) + + mark_as_advanced(${LOOKED_FOR}) + message(STATUS "Found OpenBLAS (include: ${OpenBLAS_INCLUDE_DIRS}, libraries: ${OpenBLAS_LIBRARIES})") +endif() From 7de9c179fc165c6fb9dff5e8223d4954f81e46b9 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Mon, 9 Jul 2018 21:00:21 +0200 Subject: [PATCH 03/78] Improved lapack symbol detection --- ci/docker/Dockerfile.build.ubuntu_mkl | 0 cmake/ChooseBlas.cmake | 54 +++++++++++++-------------- cmake/Modules/FindAccelerate.cmake | 38 +++++++++++++++---- cmake/Modules/FindAtlas.cmake | 2 +- cmake/Modules/FindOpenBLAS.cmake | 23 +++++++----- 5 files changed, 71 insertions(+), 46 deletions(-) create mode 100644 ci/docker/Dockerfile.build.ubuntu_mkl diff --git a/ci/docker/Dockerfile.build.ubuntu_mkl b/ci/docker/Dockerfile.build.ubuntu_mkl new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/cmake/ChooseBlas.cmake b/cmake/ChooseBlas.cmake index a37bd0da0339..733252ac941e 100644 --- a/cmake/ChooseBlas.cmake +++ b/cmake/ChooseBlas.cmake @@ -18,6 +18,15 @@ set(BLAS "Open" CACHE STRING "Selected BLAS library") set_property(CACHE BLAS PROPERTY STRINGS "Atlas;Open;MKL") +function(switch_lapack enable) + if(${enable}) + message(STATUS "Enabling lapack functionality") + add_definitions(-DMXNET_USE_LAPACK=1) + else() + message(WARNING "Lapack functionality not available") + endif() +endfunction() + if(USE_MKL_IF_AVAILABLE) message(STATUS "Trying to find MKL library due to USE_MKL_IF_AVAILABLE=True...") @@ -28,7 +37,7 @@ if(USE_MKL_IF_AVAILABLE) if(MKL_FOUND) message(STATUS "MKL library found, checking if USE_MKLDNN...") - if(USE_MKLDNN) + if(USE_MKLDNN) message(STATUS "USE_MKLDNN=True, setting to use OpenBLAS") set(BLAS "open") else() @@ -45,8 +54,7 @@ if(BLAS MATCHES "[Aa][Tt][Ll][Aa][Ss]") message(STATUS "Using Atlas for BLAS") set(Atlas_NEED_LAPACK ${USE_LAPACK}) - - include(${CMAKE_CURRENT_LIST_DIR}/Modules/FindAtlas.cmake) + find_package(Atlas REQUIRED) include_directories(SYSTEM ${Atlas_INCLUDE_DIRS}) list(APPEND mshadow_LINKER_LIBS ${Atlas_LIBRARIES}) @@ -54,9 +62,7 @@ if(BLAS MATCHES "[Aa][Tt][Ll][Aa][Ss]") add_definitions(-DMSHADOW_USE_CBLAS=1) add_definitions(-DMSHADOW_USE_MKL=0) - if(USE_LAPACK AND Atlas_LAPACK_FOUND) - add_definitions(-DMXNET_USE_LAPACK=1) - endif() + switch_lapack(${USE_LAPACK} AND ${Atlas_LAPACK_FOUND}) return() endif() @@ -66,7 +72,7 @@ if(BLAS MATCHES "[Oo][Pp][Ee][Nn]") set(OpenBLAS_NEED_LAPACK ${USE_LAPACK}) - include(${CMAKE_CURRENT_LIST_DIR}/Modules/FindOpenBLAS.cmake) + find_package(OpenBLAS REQUIRED) include_directories(SYSTEM ${OpenBLAS_INCLUDE_DIRS}) list(APPEND mshadow_LINKER_LIBS ${OpenBLAS_LIBRARIES}) @@ -74,9 +80,7 @@ if(BLAS MATCHES "[Oo][Pp][Ee][Nn]") add_definitions(-DMSHADOW_USE_CBLAS=1) add_definitions(-DMSHADOW_USE_MKL=0) - if(USE_LAPACK AND OpenBLAS_LAPACK_FOUND) - add_definitions(-DMXNET_USE_LAPACK=1) - endif() + switch_lapack(${USE_LAPACK} AND ${OpenBLAS_LAPACK_FOUND}) return() endif() @@ -84,8 +88,6 @@ endif() if(BLAS MATCHES "[Mm][Kk][Ll]") message(STATUS "Using MKL for BLAS") - # todo(lebeg): include(${CMAKE_CURRENT_LIST_DIR}/Modules/FindMKL.cmake) - find_package(MKL REQUIRED) include_directories(SYSTEM ${MKL_INCLUDE_DIR}) @@ -96,14 +98,13 @@ if(BLAS MATCHES "[Mm][Kk][Ll]") if(USE_LAPACK) include(CheckFunctionExists) - check_function_exists("cheev_" LAPACK_FOUND) + set(CMAKE_REQUIRED_LIBRARIES ${MKL_LIBRARIES}) + check_function_exists("cgees_" LAPACK_FOUND) - if(LAPACK_FOUND) - add_definitions(-DMXNET_USE_LAPACK=1) - endif() - endif() + switch_lapack(${LAPACK_FOUND} OR False) - return() + return() + endif() endif() if(BLAS MATCHES "[Aa][Pp][Pp][Ll][Ee]") @@ -116,23 +117,18 @@ if(BLAS MATCHES "[Aa][Pp][Pp][Ll][Ee]") # Accelerate framework documentation # https://developer.apple.com/documentation/accelerate?changes=_2 + set(Accelerate_NEED_LAPACK ${USE_LAPACK}) find_package(Accelerate REQUIRED) + include_directories(SYSTEM ${Accelerate_INCLUDE_DIR}) list(APPEND mshadow_LINKER_LIBS ${Accelerate_LIBRARIES}) add_definitions(-DMSHADOW_USE_CBLAS=1) add_definitions(-DMSHADOW_USE_MKL=0) - if(USE_LAPACK) - # Apples vecLib should contain lapack functionalities included in the Accelerate framework, but we will double check - # https://developer.apple.com/documentation/accelerate/veclib?changes=_2 - include(CheckFunctionExists) - check_function_exists("cheev_" LAPACK_FOUND) - - if(LAPACK_FOUND) - add_definitions(-DMXNET_USE_LAPACK=1) - endif() - endif() - + switch_lapack(${USE_LAPACK} AND ${Accelerate_LAPACK_FOUND}) return() + endif() + +message(FATAL_ERROR "BLAS ${BLAS} not recognized") diff --git a/cmake/Modules/FindAccelerate.cmake b/cmake/Modules/FindAccelerate.cmake index 8bdc665a3aaf..1cec4d82cbf7 100644 --- a/cmake/Modules/FindAccelerate.cmake +++ b/cmake/Modules/FindAccelerate.cmake @@ -19,20 +19,44 @@ # # The following are set after configuration is done: # Accelerate_FOUND -# Accelerate_INCLUDE_DIRS +# Accelerate_LAPACK_FOUND +# Accelerate_INCLUDE_DIR # Accelerate_LIBRARIES file(TO_CMAKE_PATH "$ENV{Accelerate_HOME}" Accelerate_HOME) + set(Accelerate_INCLUDE_SEARCH_PATHS - /System/Library/Frameworks/Accelerate.framework/Versions/Current/Frameworks/vecLib.framework/Versions/Current - ${Accelerate_HOME} -) + /System/Library/Frameworks/Accelerate.framework/Versions/Current/Frameworks/vecLib.framework/Versions/Current + ${Accelerate_HOME} + ) -find_path(Accelerate_CBLAS_INCLUDE_DIR NAMES cblas.h PATHS ${Accelerate_INCLUDE_SEARCH_PATHS} PATH_SUFFIXES Headers) +find_path(Accelerate_CBLAS_INCLUDE_DIR + NAMES cblas.h + PATHS ${Accelerate_INCLUDE_SEARCH_PATHS} + PATH_SUFFIXES Headers) set(LOOKED_FOR Accelerate_CBLAS_INCLUDE_DIR -) + ) + +if(Accelerate_NEED_LAPACK) + message(STATUS "Looking for lapack support...") + + # Apples vecLib should contain lapack functionalities included in the Accelerate framework, but we will double check + # https://developer.apple.com/documentation/accelerate/veclib?changes=_2 + include(CheckFunctionExists) + set(CMAKE_REQUIRED_LIBRARIES "-framework Accelerate") + check_function_exists("cgees_" LAPACK_FOUND) + + if(LAPACK_FOUND) + set(Accelerate_LAPACK_FOUND True) + message(STATUS "Lapack found") + else() + set(Accelerate_LAPACK_FOUND False) + message(WARNING "Accelerate lapack support could not be identified, lapack functionality will not be available") + endif() + +endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Accelerate DEFAULT_MSG ${LOOKED_FOR}) @@ -42,6 +66,6 @@ if(Accelerate_FOUND) set(Accelerate_LIBRARIES "-framework Accelerate") mark_as_advanced(${LOOKED_FOR}) - message(STATUS "Found Accelerate (include: ${Accelerate_CBLAS_INCLUDE_DIR}, library: ${Accelerate_BLAS_LIBRARY})") + message(STATUS "Found Accelerate (include: ${Accelerate_CBLAS_INCLUDE_DIR}, library: ${Accelerate_LIBRARIES})") endif(Accelerate_FOUND) diff --git a/cmake/Modules/FindAtlas.cmake b/cmake/Modules/FindAtlas.cmake index b2e4ad71b02a..32c77ad49b5c 100644 --- a/cmake/Modules/FindAtlas.cmake +++ b/cmake/Modules/FindAtlas.cmake @@ -97,7 +97,7 @@ if(Atlas_NEED_LAPACK) set(CMAKE_REQUIRED_LIBRARIES ${Atlas_LAPACK_LIBRARY}) include(CheckFunctionExists) - check_function_exists("cheev_" LAPACK_FOUND) + check_function_exists("cgees_" LAPACK_FOUND) if(LAPACK_FOUND) set(Atlas_LAPACK_FOUND True) diff --git a/cmake/Modules/FindOpenBLAS.cmake b/cmake/Modules/FindOpenBLAS.cmake index 9705fbece117..5a496d3ac6a8 100644 --- a/cmake/Modules/FindOpenBLAS.cmake +++ b/cmake/Modules/FindOpenBLAS.cmake @@ -107,16 +107,21 @@ if(OpenBLAS_NEED_LAPACK) message(STATUS "Looking for lapack support...") find_path(OpenBLAS_LAPACK_INCLUDE_DIR - NAMES clapack.h + NAMES lapacke.h PATHS ${OpenBLAS_INCLUDE_SEARCH_PATHS}) - # lapack if present in OpenBLAS build is included into the libopenblas. But it requires gfortran to be linked - # dynamically. - # OpenBLAS does not have a separate lapack library: https://github.com/xianyi/OpenBLAS/issues/296 - # Static linking goes with openblas, but fortran needs to be linked dynamically: - # https://github.com/xianyi/OpenBLAS/issues/460#issuecomment-61293128 - find_library(OpenBLAS_LAPACK_LIBRARY - NAMES gfortran - PATHS ${OpenBLAS_LIB_SEARCH_PATHS}) + + if(UNIX AND NOT APPLE) + # lapack if present in OpenBLAS build is included into the libopenblas. But it requires gfortran to be linked + # dynamically. + # OpenBLAS does not have a separate lapack library: https://github.com/xianyi/OpenBLAS/issues/296 + # Static linking goes with openblas, but fortran needs to be linked dynamically: + # https://github.com/xianyi/OpenBLAS/issues/460#issuecomment-61293128 + find_library(OpenBLAS_LAPACK_LIBRARY + NAMES gfortran + PATHS ${OpenBLAS_LIB_SEARCH_PATHS}) + else() + set(OpenBLAS_LAPACK_LIBRARY OpenBLAS_LIBRARY) + endif() set(CMAKE_REQUIRED_LIBRARIES ${OpenBLAS_LIBRARY}) include(CheckFunctionExists) From 32e89c8bc7da95d8875eb5606fa9c3d7618cd1a6 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Tue, 10 Jul 2018 14:52:40 +0200 Subject: [PATCH 04/78] Enable Accelerate by default on mac --- CMakeLists.txt | 1 + cmake/ChooseBlas.cmake | 35 +++++++++++++++++++++++++++++------ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b1ec8d80e191..59625e99d12b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,6 +19,7 @@ mxnet_option(USE_SSE "Build with x86 SSE instruction support" ON IF mxnet_option(USE_F16C "Build with x86 F16C instruction support" ON) # autodetects support if ON mxnet_option(USE_LAPACK "Build with lapack support" ON) mxnet_option(USE_MKL_IF_AVAILABLE "Use MKL if found" ON) +mxnet_option(USE_ACCELERATE_IF_AVAILABLE "Use Apple Accelerate framework if found, works if USE_MKL_IF_AVAILABLE is OFF" ON IF APPLE) mxnet_option(USE_MKLML_MKL "Use MKLDNN variant of MKL (if MKL found)" ON IF USE_MKL_IF_AVAILABLE AND (NOT APPLE)) mxnet_option(USE_MKLDNN "Use MKLDNN variant of MKL (if MKL found)" ON IF USE_MKL_IF_AVAILABLE AND (NOT APPLE)) mxnet_option(USE_OPERATOR_TUNING "Enable auto-tuning of operators" ON IF NOT MSVC) diff --git a/cmake/ChooseBlas.cmake b/cmake/ChooseBlas.cmake index 733252ac941e..ee8548332a7c 100644 --- a/cmake/ChooseBlas.cmake +++ b/cmake/ChooseBlas.cmake @@ -16,7 +16,7 @@ # under the License. set(BLAS "Open" CACHE STRING "Selected BLAS library") -set_property(CACHE BLAS PROPERTY STRINGS "Atlas;Open;MKL") +set_property(CACHE BLAS PROPERTY STRINGS "Atlas;Open;MKL;Apple") function(switch_lapack enable) if(${enable}) @@ -27,6 +27,27 @@ function(switch_lapack enable) endif() endfunction() +function(try_accelerate) + if(NOT APPLE) + return() + endif() + + if(BLAS MATCHES "[Mm][Kk][Ll]") + return() + endif() + + if(${USE_ACCELERATE_IF_AVAILABLE}) + message(STATUS "Trying to enable accelerate framework due to USE_ACCELERATE_IF_AVAILABLE") + find_package(Accelerate) + if(${Accelerate_FOUND}) + message(STATUS "Accelerate framework found") + set(BLAS Accelerate PARENT_SCOPE) + else() + message(STATUS "Accelerate framework not found") + endif() + endif() +endfunction() + if(USE_MKL_IF_AVAILABLE) message(STATUS "Trying to find MKL library due to USE_MKL_IF_AVAILABLE=True...") @@ -49,6 +70,8 @@ if(USE_MKL_IF_AVAILABLE) endif() endif() +try_accelerate() + # cmake regexp does not support case insensitive match (?i) or //i if(BLAS MATCHES "[Aa][Tt][Ll][Aa][Ss]") message(STATUS "Using Atlas for BLAS") @@ -57,7 +80,7 @@ if(BLAS MATCHES "[Aa][Tt][Ll][Aa][Ss]") find_package(Atlas REQUIRED) include_directories(SYSTEM ${Atlas_INCLUDE_DIRS}) - list(APPEND mshadow_LINKER_LIBS ${Atlas_LIBRARIES}) + list(APPEND mxnet_LINKER_LIBS ${Atlas_LIBRARIES}) add_definitions(-DMSHADOW_USE_CBLAS=1) add_definitions(-DMSHADOW_USE_MKL=0) @@ -75,7 +98,7 @@ if(BLAS MATCHES "[Oo][Pp][Ee][Nn]") find_package(OpenBLAS REQUIRED) include_directories(SYSTEM ${OpenBLAS_INCLUDE_DIRS}) - list(APPEND mshadow_LINKER_LIBS ${OpenBLAS_LIBRARIES}) + list(APPEND mxnet_LINKER_LIBS ${OpenBLAS_LIBRARIES}) add_definitions(-DMSHADOW_USE_CBLAS=1) add_definitions(-DMSHADOW_USE_MKL=0) @@ -91,7 +114,7 @@ if(BLAS MATCHES "[Mm][Kk][Ll]") find_package(MKL REQUIRED) include_directories(SYSTEM ${MKL_INCLUDE_DIR}) - list(APPEND mshadow_LINKER_LIBS ${MKL_LIBRARIES}) + list(APPEND mxnet_LINKER_LIBS ${MKL_LIBRARIES}) add_definitions(-DMSHADOW_USE_CBLAS=0) add_definitions(-DMSHADOW_USE_MKL=1) @@ -107,7 +130,7 @@ if(BLAS MATCHES "[Mm][Kk][Ll]") endif() endif() -if(BLAS MATCHES "[Aa][Pp][Pp][Ll][Ee]") +if(BLAS MATCHES "([Aa][Pp][Pp][Ll][Ee]|[Aa][Cc][Cc][Ee][Ll][Ee][Rr][Aa][Tt][Ee])") if(NOT APPLE) message(FATAL_ERROR "Apple BLAS framework is available only on MAC") return() @@ -121,7 +144,7 @@ if(BLAS MATCHES "[Aa][Pp][Pp][Ll][Ee]") find_package(Accelerate REQUIRED) include_directories(SYSTEM ${Accelerate_INCLUDE_DIR}) - list(APPEND mshadow_LINKER_LIBS ${Accelerate_LIBRARIES}) + list(APPEND mxnet_LINKER_LIBS ${Accelerate_LIBRARIES}) add_definitions(-DMSHADOW_USE_CBLAS=1) add_definitions(-DMSHADOW_USE_MKL=0) From 99adb679af76ad02a3bf5b895d8e19735741b4b9 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Tue, 10 Jul 2018 17:30:40 +0200 Subject: [PATCH 05/78] Fixed variable scope for mxnet libraries in blas cmake --- cmake/ChooseBlas.cmake | 8 ++++---- cmake/Modules/FindOpenBLAS.cmake | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cmake/ChooseBlas.cmake b/cmake/ChooseBlas.cmake index ee8548332a7c..8a55f5b5bf18 100644 --- a/cmake/ChooseBlas.cmake +++ b/cmake/ChooseBlas.cmake @@ -80,7 +80,7 @@ if(BLAS MATCHES "[Aa][Tt][Ll][Aa][Ss]") find_package(Atlas REQUIRED) include_directories(SYSTEM ${Atlas_INCLUDE_DIRS}) - list(APPEND mxnet_LINKER_LIBS ${Atlas_LIBRARIES}) + list(APPEND mxnet_LINKER_LIBS ${Atlas_LIBRARIES} PARENT_SCOPE) add_definitions(-DMSHADOW_USE_CBLAS=1) add_definitions(-DMSHADOW_USE_MKL=0) @@ -98,7 +98,7 @@ if(BLAS MATCHES "[Oo][Pp][Ee][Nn]") find_package(OpenBLAS REQUIRED) include_directories(SYSTEM ${OpenBLAS_INCLUDE_DIRS}) - list(APPEND mxnet_LINKER_LIBS ${OpenBLAS_LIBRARIES}) + list(APPEND mxnet_LINKER_LIBS ${OpenBLAS_LIBRARIES} PARENT_SCOPE) add_definitions(-DMSHADOW_USE_CBLAS=1) add_definitions(-DMSHADOW_USE_MKL=0) @@ -114,7 +114,7 @@ if(BLAS MATCHES "[Mm][Kk][Ll]") find_package(MKL REQUIRED) include_directories(SYSTEM ${MKL_INCLUDE_DIR}) - list(APPEND mxnet_LINKER_LIBS ${MKL_LIBRARIES}) + list(APPEND mxnet_LINKER_LIBS ${MKL_LIBRARIES} PARENT_SCOPE) add_definitions(-DMSHADOW_USE_CBLAS=0) add_definitions(-DMSHADOW_USE_MKL=1) @@ -144,7 +144,7 @@ if(BLAS MATCHES "([Aa][Pp][Pp][Ll][Ee]|[Aa][Cc][Cc][Ee][Ll][Ee][Rr][Aa][Tt][Ee]) find_package(Accelerate REQUIRED) include_directories(SYSTEM ${Accelerate_INCLUDE_DIR}) - list(APPEND mxnet_LINKER_LIBS ${Accelerate_LIBRARIES}) + list(APPEND mxnet_LINKER_LIBS ${Accelerate_LIBRARIES} PARENT_SCOPE) add_definitions(-DMSHADOW_USE_CBLAS=1) add_definitions(-DMSHADOW_USE_MKL=0) diff --git a/cmake/Modules/FindOpenBLAS.cmake b/cmake/Modules/FindOpenBLAS.cmake index 5a496d3ac6a8..79400eb0b094 100644 --- a/cmake/Modules/FindOpenBLAS.cmake +++ b/cmake/Modules/FindOpenBLAS.cmake @@ -120,7 +120,7 @@ if(OpenBLAS_NEED_LAPACK) NAMES gfortran PATHS ${OpenBLAS_LIB_SEARCH_PATHS}) else() - set(OpenBLAS_LAPACK_LIBRARY OpenBLAS_LIBRARY) + set(OpenBLAS_LAPACK_LIBRARY ${OpenBLAS_LIBRARY}) endif() set(CMAKE_REQUIRED_LIBRARIES ${OpenBLAS_LIBRARY}) From b5cd2e48b54e5703ae3078a4ee35ebdee68d9330 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Tue, 10 Jul 2018 17:53:00 +0200 Subject: [PATCH 06/78] Small linker libs improvement in cmake --- CMakeLists.txt | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 59625e99d12b..6ad41ac59314 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,6 +43,11 @@ mxnet_option(USE_ASAN "Enable Clang/GCC ASAN sanitizers." OFF) mxnet_option(ENABLE_TESTCOVERAGE "Enable compilation with test coverage metric output" OFF) message(STATUS "CMAKE_SYSTEM_NAME ${CMAKE_SYSTEM_NAME}") + +if(NOT mxnet_LINKER_LIBS) + set(mxnet_LINKER_LIBS "") +endif(NOT mxnet_LINKER_LIBS) + if(USE_CUDA AND NOT USE_OLDCMAKECUDA) message(STATUS "CMake version '${CMAKE_VERSION}' using generator '${CMAKE_GENERATOR}'") if( @@ -155,10 +160,6 @@ else(MSVC) endif() endif(MSVC) -if(NOT mxnet_LINKER_LIBS) - set(mxnet_LINKER_LIBS "") -endif(NOT mxnet_LINKER_LIBS) - if(USE_GPROF) message(STATUS "Using GPROF") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer -g -pg") @@ -346,7 +347,7 @@ if(USE_GPERFTOOLS) include_directories(${GPERFTOOLS_INCLUDE_DIR}) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${ALT_MALLOC_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ALT_MALLOC_FLAGS}") - set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${GPERFTOOLS_LIBRARIES}) + list(APPEND mxnet_LINKER_LIBS ${GPERFTOOLS_LIBRARIES}) set(USE_JEMALLOC 0) endif() endif() @@ -363,7 +364,7 @@ if(USE_JEMALLOC) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${ALT_MALLOC_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ALT_MALLOC_FLAGS}") include_directories(${JEMALLOC_INCLUDE_DIRS}) - set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${JEMALLOC_LIBRARIES}) + list(APPEND mxnet_LINKER_LIBS ${JEMALLOC_LIBRARIES}) endif() endif() @@ -426,7 +427,7 @@ if(USE_JEMALLOC) if(JEMALLOC_FOUND) add_definitions(-DUSE_JEMALLOC) include_directories(${JEMALLOC_INCLUDE_DIRS}) - set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${JEMALLOC_LIBRARIES}) + list(APPEND mxnet_LINKER_LIBS ${JEMALLOC_LIBRARIES}) endif() endif() From 84b0dd65db9b3392a625632b1a02eff5b4b689b7 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Tue, 10 Jul 2018 18:23:50 +0200 Subject: [PATCH 07/78] Fixed parent scope for mxnet linker libs --- cmake/ChooseBlas.cmake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmake/ChooseBlas.cmake b/cmake/ChooseBlas.cmake index 8a55f5b5bf18..7ec9f2083252 100644 --- a/cmake/ChooseBlas.cmake +++ b/cmake/ChooseBlas.cmake @@ -80,7 +80,7 @@ if(BLAS MATCHES "[Aa][Tt][Ll][Aa][Ss]") find_package(Atlas REQUIRED) include_directories(SYSTEM ${Atlas_INCLUDE_DIRS}) - list(APPEND mxnet_LINKER_LIBS ${Atlas_LIBRARIES} PARENT_SCOPE) + set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${Atlas_LIBRARIES} PARENT_SCOPE) add_definitions(-DMSHADOW_USE_CBLAS=1) add_definitions(-DMSHADOW_USE_MKL=0) @@ -98,7 +98,7 @@ if(BLAS MATCHES "[Oo][Pp][Ee][Nn]") find_package(OpenBLAS REQUIRED) include_directories(SYSTEM ${OpenBLAS_INCLUDE_DIRS}) - list(APPEND mxnet_LINKER_LIBS ${OpenBLAS_LIBRARIES} PARENT_SCOPE) + set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${OpenBLAS_LIBRARIES} PARENT_SCOPE) add_definitions(-DMSHADOW_USE_CBLAS=1) add_definitions(-DMSHADOW_USE_MKL=0) @@ -114,7 +114,7 @@ if(BLAS MATCHES "[Mm][Kk][Ll]") find_package(MKL REQUIRED) include_directories(SYSTEM ${MKL_INCLUDE_DIR}) - list(APPEND mxnet_LINKER_LIBS ${MKL_LIBRARIES} PARENT_SCOPE) + set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${MKL_LIBRARIES} PARENT_SCOPE) add_definitions(-DMSHADOW_USE_CBLAS=0) add_definitions(-DMSHADOW_USE_MKL=1) @@ -144,7 +144,7 @@ if(BLAS MATCHES "([Aa][Pp][Pp][Ll][Ee]|[Aa][Cc][Cc][Ee][Ll][Ee][Rr][Aa][Tt][Ee]) find_package(Accelerate REQUIRED) include_directories(SYSTEM ${Accelerate_INCLUDE_DIR}) - list(APPEND mxnet_LINKER_LIBS ${Accelerate_LIBRARIES} PARENT_SCOPE) + set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${Accelerate_LIBRARIES} PARENT_SCOPE) add_definitions(-DMSHADOW_USE_CBLAS=1) add_definitions(-DMSHADOW_USE_MKL=0) From 6e5096ae3b432eb80e77755e4bc8f6974a419c43 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Tue, 10 Jul 2018 18:41:19 +0200 Subject: [PATCH 08/78] Fixed parent scope which is not there --- cmake/ChooseBlas.cmake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmake/ChooseBlas.cmake b/cmake/ChooseBlas.cmake index 7ec9f2083252..b27d6b08044c 100644 --- a/cmake/ChooseBlas.cmake +++ b/cmake/ChooseBlas.cmake @@ -80,7 +80,7 @@ if(BLAS MATCHES "[Aa][Tt][Ll][Aa][Ss]") find_package(Atlas REQUIRED) include_directories(SYSTEM ${Atlas_INCLUDE_DIRS}) - set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${Atlas_LIBRARIES} PARENT_SCOPE) + set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${Atlas_LIBRARIES}) add_definitions(-DMSHADOW_USE_CBLAS=1) add_definitions(-DMSHADOW_USE_MKL=0) @@ -98,7 +98,7 @@ if(BLAS MATCHES "[Oo][Pp][Ee][Nn]") find_package(OpenBLAS REQUIRED) include_directories(SYSTEM ${OpenBLAS_INCLUDE_DIRS}) - set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${OpenBLAS_LIBRARIES} PARENT_SCOPE) + set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${OpenBLAS_LIBRARIES}) add_definitions(-DMSHADOW_USE_CBLAS=1) add_definitions(-DMSHADOW_USE_MKL=0) @@ -114,7 +114,7 @@ if(BLAS MATCHES "[Mm][Kk][Ll]") find_package(MKL REQUIRED) include_directories(SYSTEM ${MKL_INCLUDE_DIR}) - set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${MKL_LIBRARIES} PARENT_SCOPE) + set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${MKL_LIBRARIES}) add_definitions(-DMSHADOW_USE_CBLAS=0) add_definitions(-DMSHADOW_USE_MKL=1) @@ -144,7 +144,7 @@ if(BLAS MATCHES "([Aa][Pp][Pp][Ll][Ee]|[Aa][Cc][Cc][Ee][Ll][Ee][Rr][Aa][Tt][Ee]) find_package(Accelerate REQUIRED) include_directories(SYSTEM ${Accelerate_INCLUDE_DIR}) - set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${Accelerate_LIBRARIES} PARENT_SCOPE) + set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${Accelerate_LIBRARIES}) add_definitions(-DMSHADOW_USE_CBLAS=1) add_definitions(-DMSHADOW_USE_MKL=0) From 2167257206fd609ecf6dc98142026f66d7f9505c Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Mon, 16 Jul 2018 19:55:34 +0200 Subject: [PATCH 09/78] Refactored MKL / MKLML / MKLDNN cmake --- CMakeLists.txt | 27 +---- cmake/ChooseBlas.cmake | 78 ++++++++---- cmake/DownloadMKLML.cmake | 70 ++++------- cmake/Modules/FindMKL.cmake | 215 ++++++++++++++-------------------- cmake/Modules/FindMKLML.cmake | 100 ++++++++++++++++ 5 files changed, 270 insertions(+), 220 deletions(-) create mode 100644 cmake/Modules/FindMKLML.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 6ad41ac59314..c15ecfc2eafc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,10 +18,10 @@ mxnet_option(USE_CUDNN "Build with cudnn support" ON) # one could se mxnet_option(USE_SSE "Build with x86 SSE instruction support" ON IF NOT ARM) mxnet_option(USE_F16C "Build with x86 F16C instruction support" ON) # autodetects support if ON mxnet_option(USE_LAPACK "Build with lapack support" ON) +mxnet_option(USE_ACCELERATE_IF_AVAILABLE "Use Apple Accelerate framework if found, works if MKL not found or disabled" ON IF APPLE) mxnet_option(USE_MKL_IF_AVAILABLE "Use MKL if found" ON) -mxnet_option(USE_ACCELERATE_IF_AVAILABLE "Use Apple Accelerate framework if found, works if USE_MKL_IF_AVAILABLE is OFF" ON IF APPLE) -mxnet_option(USE_MKLML_MKL "Use MKLDNN variant of MKL (if MKL found)" ON IF USE_MKL_IF_AVAILABLE AND (NOT APPLE)) -mxnet_option(USE_MKLDNN "Use MKLDNN variant of MKL (if MKL found)" ON IF USE_MKL_IF_AVAILABLE AND (NOT APPLE)) +mxnet_option(USE_MKLML "Use MKLML subset of MKL instead of mkl, will be downloaded" ON) +mxnet_option(USE_MKLDNN "Use MKLDNN (requires MKLML or MKL)" ON) mxnet_option(USE_OPERATOR_TUNING "Enable auto-tuning of operators" ON IF NOT MSVC) mxnet_option(USE_GPERFTOOLS "Build with GPerfTools support (if found)" ON) mxnet_option(USE_JEMALLOC "Build with Jemalloc support" ON) @@ -217,7 +217,7 @@ if(ENABLE_TESTCOVERAGE) if(NOT GCOV_PATH) message(FATAL_ERROR "gcov not found! Aborting...") endif() # NOT GCOV_PATH - + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage") set(CMAKE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} --coverage") @@ -225,25 +225,6 @@ if(ENABLE_TESTCOVERAGE) link_libraries(gcov) endif() -if(USE_MKLDNN) - include(cmake/DownloadMKLML.cmake) - # CPU architecture (e.g., C5) can't run on another architecture (e.g., g3). - if(NOT MSVC) - set(ARCH_OPT_FLAGS "-mtune=generic") - endif() - set(WITH_TEST OFF CACHE INTERNAL "" FORCE) - set(WITH_EXAMPLE OFF CACHE INTERNAL "" FORCE) - set(ARCH_OPT_FLAGS "" CACHE INTERNAL "" FORCE) - - add_subdirectory(3rdparty/mkldnn) - - include_directories(3rdparty/mkldnn/include) - add_definitions(-DUSE_MKL=1) - add_definitions(-DCUB_MKL=1) - add_definitions(-DMXNET_USE_MKLDNN=1) - list(APPEND mxnet_LINKER_LIBS mkldnn) -endif() - # Allow Cuda compiles outside of src tree to find things in 'src' and 'include' include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src) diff --git a/cmake/ChooseBlas.cmake b/cmake/ChooseBlas.cmake index b27d6b08044c..afe9be2ecb05 100644 --- a/cmake/ChooseBlas.cmake +++ b/cmake/ChooseBlas.cmake @@ -27,6 +27,60 @@ function(switch_lapack enable) endif() endfunction() +function(try_mkldnn) + + if(NOT ${USE_MKLDNN}) + return() + endif() + + if(${CMAKE_CROSSCOMPILING}) + message(WARNING "MKLDNN with cross compilation is not supported, MKLDNN will not be available") + return() + endif() + + message(STATUS "Adding MKLDNN to the build") + + if(NOT MKL_FOUND AND ${USE_MKLML}) + include(${CMAKE_CURRENT_LIST_DIR}/DownloadMKLML.cmake) + find_package(MKLML REQUIRED) + include_directories(SYSTEM ${MKLML_INCLUDE_DIRS}) + set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${MKLML_LIBRARIES} PARENT_SCOPE) + endif() + + # CPU architecture (e.g., C5) can't run on another architecture (e.g., g3). + if(NOT MSVC) + set(ARCH_OPT_FLAGS ${ARCH_OPT_FLAGS} "-mtune=generic" PARENT_SCOPE) + endif() + + set(WITH_TEST OFF) + set(WITH_EXAMPLE OFF) + add_subdirectory(3rdparty/mkldnn) + + include_directories(3rdparty/mkldnn/include) + set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} mkldnn PARENT_SCOPE) + + add_definitions(-DUSE_MKL=1) + add_definitions(-DCUB_MKL=1) + add_definitions(-DMXNET_USE_MKLDNN=1) + +endfunction() + +function(try_mkl) + if(${USE_MKL_IF_AVAILABLE} AND NOT ${USE_MKLML}) + message(STATUS "Trying to enable mkl framework due to USE_MKL_IF_AVAILABLE") + find_package(MKL) + if(${MKL_FOUND}) + message(STATUS "MKL framework found") + set(BLAS MKL PARENT_SCOPE) + else() + message(STATUS "MKL framework not found") + endif() + + set(MKL_FOUND ${MKL_FOUND} PARENT_SCOPE) + set(MKLROOT ${MKLROOT} PARENT_SCOPE) + endif() +endfunction() + function(try_accelerate) if(NOT APPLE) return() @@ -48,28 +102,8 @@ function(try_accelerate) endif() endfunction() -if(USE_MKL_IF_AVAILABLE) - message(STATUS "Trying to find MKL library due to USE_MKL_IF_AVAILABLE=True...") - - if(NOT MKL_FOUND) - find_package(MKL) - endif() - - if(MKL_FOUND) - message(STATUS "MKL library found, checking if USE_MKLDNN...") - - if(USE_MKLDNN) - message(STATUS "USE_MKLDNN=True, setting to use OpenBLAS") - set(BLAS "open") - else() - message(STATUS "USE_MKLDNN=False, setting to use MKL") - set(BLAS "MKL") - endif() - else() - message(STATUS "MKL library not found, BLAS=${BLAS}") - endif() -endif() - +try_mkl() +try_mkldnn() try_accelerate() # cmake regexp does not support case insensitive match (?i) or //i diff --git a/cmake/DownloadMKLML.cmake b/cmake/DownloadMKLML.cmake index c2c1cd6916f6..269b27bacc4c 100644 --- a/cmake/DownloadMKLML.cmake +++ b/cmake/DownloadMKLML.cmake @@ -15,59 +15,39 @@ # specific language governing permissions and limitations # under the License. -# This script will download MKLML +# This script will download mkldnn with dependencies such as intel omp and mklml -message(STATUS "Downloading MKLML...") - -set(MKLDNN_RELEASE v0.17-rc) -set(MKLML_RELEASE_FILE_SUFFIX 2019.0.1.20180928) +message(STATUS "downloading mkldnn...") if(MSVC) - set(MKL_NAME "mklml_win_${MKLML_RELEASE_FILE_SUFFIX}") - - file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/${MKLDNN_RELEASE}/${MKL_NAME}.zip" - "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.zip" - EXPECTED_MD5 "443e661bdfd32dbbc99b460b43afceee" SHOW_PROGRESS) - file(DOWNLOAD "https://github.com/apache/incubator-mxnet/releases/download/utils/7z.exe" - "${CMAKE_CURRENT_BINARY_DIR}/mklml/7z2.exe" - EXPECTED_MD5 "E1CF766CF358F368EC97662D06EA5A4C" SHOW_PROGRESS) + set(MKL_NAME "mklml_win_2018.0.3.20180406") + file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.zip" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.zip" EXPECTED_MD5 "8DD73E7D3F19F004551809824C4E8970" SHOW_PROGRESS) + file(DOWNLOAD "https://github.com/apache/incubator-mxnet/releases/download/utils/7z.exe" "${CMAKE_CURRENT_BINARY_DIR}/mklml/7z2.exe" EXPECTED_MD5 "E1CF766CF358F368EC97662D06EA5A4C" SHOW_PROGRESS) execute_process(COMMAND "${CMAKE_CURRENT_BINARY_DIR}/mklml/7z2.exe" "-o${CMAKE_CURRENT_BINARY_DIR}/mklml/" "-y") - execute_process(COMMAND "${CMAKE_CURRENT_BINARY_DIR}/mklml/7z.exe" - "x" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.zip" "-o${CMAKE_CURRENT_BINARY_DIR}/mklml/" "-y") - - set(MKLROOT "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}") - - message(STATUS "Setting MKLROOT path to ${MKLROOT}") - - include_directories(${MKLROOT}/include) - -elseif(APPLE) - set(MKL_NAME "mklml_mac_${MKLML_RELEASE_FILE_SUFFIX}") - - file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/${MKLDNN_RELEASE}/${MKL_NAME}.tgz" - "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" - EXPECTED_MD5 "95f887af332205b1d15b392260003952" SHOW_PROGRESS) - execute_process(COMMAND "tar" "-xzf" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" - "-C" "${CMAKE_CURRENT_BINARY_DIR}/mklml/") - - set(MKLROOT "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}") - - message(STATUS "Setting MKLROOT path to ${MKLROOT}") + execute_process(COMMAND "${CMAKE_CURRENT_BINARY_DIR}/mklml/7z.exe" "x" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.zip" "-o${CMAKE_CURRENT_BINARY_DIR}/mklml/" "-y") + set(MKLDNN_ROOT "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}") + file(COPY ${MKLDNN_ROOT}/lib/libiomp5md.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + file(COPY ${MKLDNN_ROOT}/lib/mklml.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + file(COPY ${CMAKE_SOURCE_DIR}/3rdparty/mkldnn/config_template.vcxproj.user DESTINATION ${CMAKE_SOURCE_DIR}) elseif(UNIX) - set(MKL_NAME "mklml_lnx_${MKLML_RELEASE_FILE_SUFFIX}") - - file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/${MKLDNN_RELEASE}/${MKL_NAME}.tgz" - "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" - EXPECTED_MD5 "a63abf155361322b9c03f8fc50f4f317" SHOW_PROGRESS) - execute_process(COMMAND "tar" "-xzf" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" - "-C" "${CMAKE_CURRENT_BINARY_DIR}/mklml/") - - set(MKLROOT "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}") - - message(STATUS "Setting MKLROOT path to ${MKLROOT}") + set(MKL_NAME "mklml_lnx_2018.0.3.20180406") + file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.tgz" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" EXPECTED_MD5 "DAF7EFC3C1C0036B447213004467A8AE" SHOW_PROGRESS) + execute_process(COMMAND "tar" "-xzf" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" "-C" "${CMAKE_CURRENT_BINARY_DIR}/mklml/") + set(MKLDNN_ROOT "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}") + + file(COPY ${MKLDNN_ROOT}/lib/libiomp5.so DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + file(COPY ${MKLDNN_ROOT}/lib/libmklml_gnu.so DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + file(COPY ${MKLDNN_ROOT}/lib/libmklml_intel.so DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +elseif(APPLE) + set(MKL_NAME "mklml_mac_2018.0.3.20180406.tgz") + file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.tgz" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" EXPECTED_MD5 "23a6f7fd04fb1fa6de0d52a2ec5a2a14" SHOW_PROGRESS) + execute_process(COMMAND "tar" "-xzf" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" "-C" "${CMAKE_CURRENT_BINARY_DIR}/mklml/") + set(MKLDNN_ROOT "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}") + file(COPY ${MKLDNN_ROOT}/lib/libiomp5.dylib DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + file(COPY ${MKLDNN_ROOT}/lib/libmklml.dylib DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) else() message(FATAL_ERROR "Wrong platform") endif() diff --git a/cmake/Modules/FindMKL.cmake b/cmake/Modules/FindMKL.cmake index 70405566d8ae..de76052c506e 100644 --- a/cmake/Modules/FindMKL.cmake +++ b/cmake/Modules/FindMKL.cmake @@ -19,8 +19,6 @@ # # Options: # -# USE_MKLDNN : Search for MKL:ML library variant -# # MKL_USE_SINGLE_DYNAMIC_LIBRARY : use single dynamic library interface # MKL_USE_STATIC_LIBS : use static libraries # MKL_MULTI_THREADED : use multi-threading @@ -33,167 +31,124 @@ # MKL_INCLUDE_DIR : unclude directory # MKL_LIBRARIES : the libraries to link against. # -# cjolivier01: Changed to also look for MKLDNN library (subset of mkl) instead of standard MKL package -# -if(MKL_FOUND) - return() -endif() +file(TO_CMAKE_PATH "$ENV{MKLROOT}" MKLROOT) # ---[ Root folders set(INTEL_ROOT "/opt/intel" CACHE PATH "Folder contains intel libs") -if(USE_MKLDNN) - - find_path(MKL_ROOT include/mkl_blas.h - PATHS $ENV{MKL_ROOT} - ${INTEL_ROOT}/mklml - ${DIRECT_DEPENDENCY_ROOTS} - DOC "Folder contains MKL" - ) - - # ---[ Find include dir - find_path(MKL_INCLUDE_DIR mkl_blas.h PATHS ${MKL_ROOT} PATH_SUFFIXES include) - set(__looked_for MKL_INCLUDE_DIR) - - # ---[ Find libraries - if(CMAKE_SIZEOF_VOID_P EQUAL 4) - set(__path_suffixes lib lib/ia32) - else() - set(__path_suffixes lib lib/intel64) - endif() - - set(__mkl_libs "") +# ---[ Options +mxnet_option(MKL_USE_SINGLE_DYNAMIC_LIBRARY "Use single dynamic library interface" ON) +mxnet_option(MKL_USE_STATIC_LIBS "Use static libraries" OFF IF NOT MKL_USE_SINGLE_DYNAMIC_LIBRARY) +mxnet_option(MKL_MULTI_THREADED "Use multi-threading" ON IF NOT MKL_USE_SINGLE_DYNAMIC_LIBRARY) +mxnet_option(MKL_USE_ILP64 "Use ilp64 data model" OFF) +mxnet_option(MKL_USE_CLUSTER "Use cluster functions" OFF IF CMAKE_SIZEOF_VOID_P EQUAL 4) - if(WIN32) - list(APPEND __mkl_libs mklml_intel) - else() - list(APPEND __mkl_libs mklml_gnu) - endif() - list(APPEND __mkl_libs mkldnn) - - foreach (__lib ${__mkl_libs}) - set(__mkl_lib "${__lib}") - string(TOUPPER ${__mkl_lib} __mkl_lib_upper) - - if(MKL_USE_STATIC_LIBS) - set(__mkl_lib "lib${__mkl_lib}.a") - endif() +set(MKL_INCLUDE_SEARCH_PATHS + ${MKL_INCLUDE_SEARCH_PATHS} - find_library(${__mkl_lib_upper}_LIBRARY - NAMES ${__mkl_lib} - PATHS ${MKL_ROOT} "${MKL_INCLUDE_DIR}/.." - PATH_SUFFIXES ${__path_suffixes} - DOC "The path to Intel(R) MKL ${__mkl_lib} library") - mark_as_advanced(${__mkl_lib_upper}_LIBRARY) + ${MKLROOT} + ${MKLROOT}/include - list(APPEND __looked_for ${__mkl_lib_upper}_LIBRARY) - list(APPEND MKL_LIBRARIES ${${__mkl_lib_upper}_LIBRARY}) - endforeach() + ${INTEL_ROOT}/mkl + ) -else(USE_MKLDNN) +# ---[ Find include dir +find_path(MKL_INCLUDE_DIR mkl.h + PATHS ${MKL_INCLUDE_SEARCH_PATHS} + PATH_SUFFIXES include) - # ---[ Options - mxnet_option(MKL_USE_SINGLE_DYNAMIC_LIBRARY "Use single dynamic library interface" ON) - mxnet_option(MKL_USE_STATIC_LIBS "Use static libraries" OFF IF NOT MKL_USE_SINGLE_DYNAMIC_LIBRARY) - mxnet_option(MKL_MULTI_THREADED "Use multi-threading" ON IF NOT MKL_USE_SINGLE_DYNAMIC_LIBRARY) - mxnet_option(MKL_USE_ILP64 "Use ilp64 data model" OFF) - mxnet_option(MKL_USE_CLUSTER "Use cluster functions" OFF IF CMAKE_SIZEOF_VOID_P EQUAL 4) +if(NOT MKLROOT) + get_filename_component(MKLROOT ${MKL_INCLUDE_DIR} DIRECTORY) +endif() - find_path(MKL_ROOT include/mkl.h PATHS $ENV{MKL_ROOT} ${INTEL_ROOT}/mkl - DOC "Folder contains MKL") +set(__looked_for MKL_INCLUDE_DIR) - # ---[ Find include dir - find_path(MKL_INCLUDE_DIR mkl.h PATHS ${MKL_ROOT} PATH_SUFFIXES include) - set(__looked_for MKL_INCLUDE_DIR) +# ---[ Find libraries +if(CMAKE_SIZEOF_VOID_P EQUAL 4) + set(__path_suffixes lib lib/ia32) +else() + set(__path_suffixes lib lib/intel64) +endif() - # ---[ Find libraries +set(__mkl_libs "") +if(MKL_USE_SINGLE_DYNAMIC_LIBRARY) + list(APPEND __mkl_libs rt) +else() if(CMAKE_SIZEOF_VOID_P EQUAL 4) - set(__path_suffixes lib lib/ia32) - else() - set(__path_suffixes lib lib/intel64) - endif() - - set(__mkl_libs "") - if(MKL_USE_SINGLE_DYNAMIC_LIBRARY) - list(APPEND __mkl_libs rt) - else() - if(CMAKE_SIZEOF_VOID_P EQUAL 4) - if(WIN32) - list(APPEND __mkl_libs intel_c) - else() - list(APPEND __mkl_libs intel) - if(CMAKE_COMPILER_IS_GNUFORTRAN) - list(APPEND __mkl_libs gf) - endif() - endif() + if(WIN32) + list(APPEND __mkl_libs intel_c) else() - set(__mkl_lib64_suffix "lp64") - if(MKL_USE_ILP64) - set(__mkl_lib64_suffix "ilp64") - add_definitions(-DMKL_ILP64) - endif() - list(APPEND __mkl_libs "intel_${__mkl_lib64_suffix}") + list(APPEND __mkl_libs intel) if(CMAKE_COMPILER_IS_GNUFORTRAN) - list(APPEND __mkl_libs "gf_${__mkl_lib64_suffix}") + list(APPEND __mkl_libs gf) endif() endif() - - if(MKL_MULTI_THREADED) - list(APPEND __mkl_libs intel_thread) - else() - list(APPEND __mkl_libs sequential) + else() + set(__mkl_lib64_suffix "lp64") + if(MKL_USE_ILP64) + set(__mkl_lib64_suffix "ilp64") + add_definitions(-DMKL_ILP64) endif() - - list(APPEND __mkl_libs core) - if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND MKL_USE_CLUSTER) - list(APPEND __mkl_libs cdft_core) + list(APPEND __mkl_libs "intel_${__mkl_lib64_suffix}") + if(CMAKE_COMPILER_IS_GNUFORTRAN) + list(APPEND __mkl_libs "gf_${__mkl_lib64_suffix}") endif() endif() + if(MKL_MULTI_THREADED) + list(APPEND __mkl_libs intel_thread) + else() + list(APPEND __mkl_libs sequential) + endif() - foreach (__lib ${__mkl_libs}) - set(__mkl_lib "mkl_${__lib}") - string(TOUPPER ${__mkl_lib} __mkl_lib_upper) + list(APPEND __mkl_libs core) + if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND MKL_USE_CLUSTER) + list(APPEND __mkl_libs cdft_core) + endif() +endif() - if(MKL_USE_STATIC_LIBS) - set(__mkl_lib "lib${__mkl_lib}.a") - endif() - find_library(${__mkl_lib_upper}_LIBRARY - NAMES ${__mkl_lib} - PATHS ${MKL_ROOT} "${MKL_INCLUDE_DIR}/.." - PATH_SUFFIXES ${__path_suffixes} - DOC "The path to Intel(R) MKL ${__mkl_lib} library") - mark_as_advanced(${__mkl_lib_upper}_LIBRARY) +foreach(__lib ${__mkl_libs}) + set(__mkl_lib "mkl_${__lib}") + string(TOUPPER ${__mkl_lib} __mkl_lib_upper) - list(APPEND __looked_for ${__mkl_lib_upper}_LIBRARY) - list(APPEND MKL_LIBRARIES ${${__mkl_lib_upper}_LIBRARY}) - endforeach() + if(MKL_USE_STATIC_LIBS) + set(__mkl_lib "lib${__mkl_lib}.a") + endif() + find_library(${__mkl_lib_upper}_LIBRARY + NAMES ${__mkl_lib} + PATHS ${MKLROOT} + PATH_SUFFIXES ${__path_suffixes} + DOC "The path to Intel(R) MKL ${__mkl_lib} library") + mark_as_advanced(${__mkl_lib_upper}_LIBRARY) - if(NOT MKL_USE_SINGLE_DYNAMIC_LIBRARY) - if (MKL_USE_STATIC_LIBS) - set(__iomp5_libs iomp5 libiomp5mt.lib) - else() - set(__iomp5_libs iomp5 libiomp5md.lib) - endif() + list(APPEND __looked_for ${__mkl_lib_upper}_LIBRARY) + list(APPEND MKL_LIBRARIES ${${__mkl_lib_upper}_LIBRARY}) +endforeach() - if(WIN32) - find_path(INTEL_INCLUDE_DIR omp.h PATHS ${INTEL_ROOT} PATH_SUFFIXES include) - list(APPEND __looked_for INTEL_INCLUDE_DIR) - endif() - find_library(MKL_RTL_LIBRARY ${__iomp5_libs} - PATHS ${INTEL_RTL_ROOT} ${INTEL_ROOT}/compiler ${MKL_ROOT}/.. ${MKL_ROOT}/../compiler - PATH_SUFFIXES ${__path_suffixes} - DOC "Path to Path to OpenMP runtime library") +if(NOT MKL_USE_SINGLE_DYNAMIC_LIBRARY) + if(MKL_USE_STATIC_LIBS) + set(__iomp5_libs iomp5 libiomp5mt.lib) + else() + set(__iomp5_libs iomp5 libiomp5md.lib) + endif() - list(APPEND __looked_for MKL_RTL_LIBRARY) - list(APPEND MKL_LIBRARIES ${MKL_RTL_LIBRARY}) + if(WIN32) + find_path(INTEL_INCLUDE_DIR omp.h PATHS ${INTEL_ROOT} PATH_SUFFIXES include) + list(APPEND __looked_for INTEL_INCLUDE_DIR) endif() -endif(USE_MKLDNN) + find_library(MKL_RTL_LIBRARY ${__iomp5_libs} + PATHS ${INTEL_RTL_ROOT} ${INTEL_ROOT}/compiler ${MKLROOT} ${MKLROOT}/.. ${MKLROOT}/../compiler + PATH_SUFFIXES ${__path_suffixes} + DOC "Path to Path to OpenMP runtime library") + + list(APPEND __looked_for MKL_RTL_LIBRARY) + list(APPEND MKL_LIBRARIES ${MKL_RTL_LIBRARY}) +endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(MKL DEFAULT_MSG ${__looked_for}) diff --git a/cmake/Modules/FindMKLML.cmake b/cmake/Modules/FindMKLML.cmake new file mode 100644 index 000000000000..41413fbfe347 --- /dev/null +++ b/cmake/Modules/FindMKLML.cmake @@ -0,0 +1,100 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# Find the MKLML libraries +# +# The following variables are optionally searched for defaults +# +# MKLML_ROOT: Base directory where all MKLML components are found +# +# The following are set after configuration is done: +# +# MKLML_FOUND +# MKLML_INCLUDE_DIRS +# MKLML_LIBRARIES + +if($ENV{MKLML_ROOT}) + file(TO_CMAKE_PATH "$ENV{MKLML_ROOT}" MKLML_ROOT) +endif() + +set(MKLML_INCLUDE_SEARCH_PATHS + ${MKLML_INCLUDE_SEARCH_PATHS} + + ${MKLML_ROOT} + ${MKLML_ROOT}/include + + ${PROJECT_SOURCE_DIR}/3rdparty/MKLML/include + ) + +# ---[ Find libraries +if(CMAKE_SIZEOF_VOID_P EQUAL 4) + set(PATH_SUFFIXES lib lib/ia32) +else() + set(PATH_SUFFIXES lib lib/intel64) +endif() + +set(MKLML_LIB_SEARCH_PATHS + ${MKLML_LIB_SEARCH_PATHS} + + ${MKLML_ROOT} + + ${PROJECT_SOURCE_DIR}/3rdparty/MKLML/lib + ) + +message("MKLML_INCLUDE_SEARCH_PATHS=${MKLML_INCLUDE_SEARCH_PATHS}") + +find_path(MKLML_INCLUDE_DIR + NAMES mkl_blas.h + PATHS ${MKLML_INCLUDE_SEARCH_PATHS}) + +set(LOOKED_FOR + MKLML_INCLUDE_DIR + ) + +set(MKLML_LIBS "") + +if(WIN32) + list(APPEND MKLML_LIBS mklml_intel) +else() + list(APPEND MKLML_LIBS mklml_gnu) +endif() + +foreach(__lib ${MKLML_LIBS}) + set(__mkl_lib "${__lib}") + string(TOUPPER ${__mkl_lib} __mkl_lib_upper) + + find_library(${__mkl_lib_upper}_LIBRARY + NAMES ${__mkl_lib} + PATHS ${MKLML_LIB_SEARCH_PATHS} + PATH_SUFFIXES ${PATH_SUFFIXES} + ) + mark_as_advanced(${__mkl_lib_upper}_LIBRARY) + + list(APPEND LOOKED_FOR ${__mkl_lib_upper}_LIBRARY) + list(APPEND MKLML_LIBRARIES ${${__mkl_lib_upper}_LIBRARY}) +endforeach() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(MKLML DEFAULT_MSG ${LOOKED_FOR}) + +if(MKLML_FOUND) + set(MKLML_INCLUDE_DIRS ${MKLML_INCLUDE_DIR}) + + mark_as_advanced(${LOOKED_FOR}) + + message(STATUS "Found MKLML (include: ${MKLML_INCLUDE_DIRS}, libraries: ${MKLML_LIBRARIES})") +endif() From 40f148c647d12ccc56278a5a0b87b16418f51626 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Mon, 16 Jul 2018 20:49:43 +0200 Subject: [PATCH 10/78] Fixed MKL root path --- cmake/DownloadMKLML.cmake | 20 ++++++++++---------- cmake/Modules/FindMKLML.cmake | 18 ++++++++---------- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/cmake/DownloadMKLML.cmake b/cmake/DownloadMKLML.cmake index 269b27bacc4c..b633cd2387cc 100644 --- a/cmake/DownloadMKLML.cmake +++ b/cmake/DownloadMKLML.cmake @@ -26,28 +26,28 @@ if(MSVC) execute_process(COMMAND "${CMAKE_CURRENT_BINARY_DIR}/mklml/7z2.exe" "-o${CMAKE_CURRENT_BINARY_DIR}/mklml/" "-y") execute_process(COMMAND "${CMAKE_CURRENT_BINARY_DIR}/mklml/7z.exe" "x" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.zip" "-o${CMAKE_CURRENT_BINARY_DIR}/mklml/" "-y") - set(MKLDNN_ROOT "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}") + set(MKLROOT "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}") - file(COPY ${MKLDNN_ROOT}/lib/libiomp5md.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - file(COPY ${MKLDNN_ROOT}/lib/mklml.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + file(COPY ${MKLROOT}/lib/libiomp5md.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + file(COPY ${MKLROOT}/lib/mklml.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY ${CMAKE_SOURCE_DIR}/3rdparty/mkldnn/config_template.vcxproj.user DESTINATION ${CMAKE_SOURCE_DIR}) elseif(UNIX) set(MKL_NAME "mklml_lnx_2018.0.3.20180406") file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.tgz" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" EXPECTED_MD5 "DAF7EFC3C1C0036B447213004467A8AE" SHOW_PROGRESS) execute_process(COMMAND "tar" "-xzf" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" "-C" "${CMAKE_CURRENT_BINARY_DIR}/mklml/") - set(MKLDNN_ROOT "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}") + set(MKLROOT "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}") - file(COPY ${MKLDNN_ROOT}/lib/libiomp5.so DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - file(COPY ${MKLDNN_ROOT}/lib/libmklml_gnu.so DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - file(COPY ${MKLDNN_ROOT}/lib/libmklml_intel.so DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + file(COPY ${MKLROOT}/lib/libiomp5.so DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + file(COPY ${MKLROOT}/lib/libmklml_gnu.so DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + file(COPY ${MKLROOT}/lib/libmklml_intel.so DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) elseif(APPLE) set(MKL_NAME "mklml_mac_2018.0.3.20180406.tgz") file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.tgz" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" EXPECTED_MD5 "23a6f7fd04fb1fa6de0d52a2ec5a2a14" SHOW_PROGRESS) execute_process(COMMAND "tar" "-xzf" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" "-C" "${CMAKE_CURRENT_BINARY_DIR}/mklml/") - set(MKLDNN_ROOT "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}") + set(MKLROOT "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}") - file(COPY ${MKLDNN_ROOT}/lib/libiomp5.dylib DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - file(COPY ${MKLDNN_ROOT}/lib/libmklml.dylib DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + file(COPY ${MKLROOT}/lib/libiomp5.dylib DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + file(COPY ${MKLROOT}/lib/libmklml.dylib DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) else() message(FATAL_ERROR "Wrong platform") endif() diff --git a/cmake/Modules/FindMKLML.cmake b/cmake/Modules/FindMKLML.cmake index 41413fbfe347..2da1f86bd1ed 100644 --- a/cmake/Modules/FindMKLML.cmake +++ b/cmake/Modules/FindMKLML.cmake @@ -15,11 +15,11 @@ # specific language governing permissions and limitations # under the License. -# Find the MKLML libraries +# Find the MKLML (subset of MKL) libraries # # The following variables are optionally searched for defaults # -# MKLML_ROOT: Base directory where all MKLML components are found +# MKLROOT: Base directory where all MKL/MKLML components are found # # The following are set after configuration is done: # @@ -27,15 +27,15 @@ # MKLML_INCLUDE_DIRS # MKLML_LIBRARIES -if($ENV{MKLML_ROOT}) - file(TO_CMAKE_PATH "$ENV{MKLML_ROOT}" MKLML_ROOT) +if($ENV{MKLROOT}) + file(TO_CMAKE_PATH "$ENV{MKLROOT}" MKLROOT) endif() set(MKLML_INCLUDE_SEARCH_PATHS ${MKLML_INCLUDE_SEARCH_PATHS} - ${MKLML_ROOT} - ${MKLML_ROOT}/include + ${MKLROOT} + ${MKLROOT}/include ${PROJECT_SOURCE_DIR}/3rdparty/MKLML/include ) @@ -50,13 +50,11 @@ endif() set(MKLML_LIB_SEARCH_PATHS ${MKLML_LIB_SEARCH_PATHS} - ${MKLML_ROOT} + ${MKLROOT} ${PROJECT_SOURCE_DIR}/3rdparty/MKLML/lib ) -message("MKLML_INCLUDE_SEARCH_PATHS=${MKLML_INCLUDE_SEARCH_PATHS}") - find_path(MKLML_INCLUDE_DIR NAMES mkl_blas.h PATHS ${MKLML_INCLUDE_SEARCH_PATHS}) @@ -65,7 +63,7 @@ set(LOOKED_FOR MKLML_INCLUDE_DIR ) -set(MKLML_LIBS "") +set(MKLML_LIBS iomp5) if(WIN32) list(APPEND MKLML_LIBS mklml_intel) From 359f0cfc1bd6801087816906fc300262a0f49dc5 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Mon, 16 Jul 2018 21:06:29 +0200 Subject: [PATCH 11/78] Fixed MKLML for mac --- cmake/DownloadMKLML.cmake | 16 ++++++++-------- cmake/Modules/FindMKLML.cmake | 2 ++ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/cmake/DownloadMKLML.cmake b/cmake/DownloadMKLML.cmake index b633cd2387cc..36c35bc7d77a 100644 --- a/cmake/DownloadMKLML.cmake +++ b/cmake/DownloadMKLML.cmake @@ -31,6 +31,14 @@ if(MSVC) file(COPY ${MKLROOT}/lib/libiomp5md.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY ${MKLROOT}/lib/mklml.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY ${CMAKE_SOURCE_DIR}/3rdparty/mkldnn/config_template.vcxproj.user DESTINATION ${CMAKE_SOURCE_DIR}) +elseif(APPLE) + set(MKL_NAME "mklml_mac_2018.0.3.20180406") + file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.tgz" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" EXPECTED_MD5 "23a6f7fd04fb1fa6de0d52a2ec5a2a14" SHOW_PROGRESS) + execute_process(COMMAND "tar" "-xzf" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" "-C" "${CMAKE_CURRENT_BINARY_DIR}/mklml/") + set(MKLROOT "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}") + + file(COPY ${MKLROOT}/lib/libiomp5.dylib DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + file(COPY ${MKLROOT}/lib/libmklml.dylib DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) elseif(UNIX) set(MKL_NAME "mklml_lnx_2018.0.3.20180406") file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.tgz" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" EXPECTED_MD5 "DAF7EFC3C1C0036B447213004467A8AE" SHOW_PROGRESS) @@ -40,14 +48,6 @@ elseif(UNIX) file(COPY ${MKLROOT}/lib/libiomp5.so DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY ${MKLROOT}/lib/libmklml_gnu.so DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY ${MKLROOT}/lib/libmklml_intel.so DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) -elseif(APPLE) - set(MKL_NAME "mklml_mac_2018.0.3.20180406.tgz") - file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.tgz" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" EXPECTED_MD5 "23a6f7fd04fb1fa6de0d52a2ec5a2a14" SHOW_PROGRESS) - execute_process(COMMAND "tar" "-xzf" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" "-C" "${CMAKE_CURRENT_BINARY_DIR}/mklml/") - set(MKLROOT "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}") - - file(COPY ${MKLROOT}/lib/libiomp5.dylib DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - file(COPY ${MKLROOT}/lib/libmklml.dylib DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) else() message(FATAL_ERROR "Wrong platform") endif() diff --git a/cmake/Modules/FindMKLML.cmake b/cmake/Modules/FindMKLML.cmake index 2da1f86bd1ed..e3f809dc1330 100644 --- a/cmake/Modules/FindMKLML.cmake +++ b/cmake/Modules/FindMKLML.cmake @@ -67,6 +67,8 @@ set(MKLML_LIBS iomp5) if(WIN32) list(APPEND MKLML_LIBS mklml_intel) +elseif(APPLE) + list(APPEND MKLML_LIBS mklml) else() list(APPEND MKLML_LIBS mklml_gnu) endif() From e2e7e4941c12cd0fa349272c5687316be864be2b Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Mon, 16 Jul 2018 21:58:31 +0200 Subject: [PATCH 12/78] Removed faulty fortran linking --- ci/docker/runtime_functions.sh | 39 +++++++++++++------------------- cmake/Modules/FindOpenBLAS.cmake | 19 ++++------------ 2 files changed, 21 insertions(+), 37 deletions(-) diff --git a/ci/docker/runtime_functions.sh b/ci/docker/runtime_functions.sh index 39631f9dc7e6..d6e10dd142f7 100755 --- a/ci/docker/runtime_functions.sh +++ b/ci/docker/runtime_functions.sh @@ -121,10 +121,7 @@ build_armv6() { pushd . cd /work/build - # Lapack functionality will be included and statically linked to openblas. - # But USE_LAPACK needs to be set to OFF, otherwise the main CMakeLists.txt - # file tries to add -llapack. Lapack functionality though, requires -lgfortran - # to be linked additionally. + # Lapack functionality requires -lgfortran to be linked additionally. # We do not need OpenMP, since most armv6 systems have only 1 core @@ -138,7 +135,7 @@ build_armv6() { -DUSE_SIGNAL_HANDLER=ON \ -DCMAKE_BUILD_TYPE=Release \ -DUSE_MKL_IF_AVAILABLE=OFF \ - -DUSE_LAPACK=OFF \ + -DUSE_LAPACK=ON \ -DBUILD_CPP_EXAMPLES=OFF \ -Dmxnet_LINKER_LIBS=-lgfortran \ -G Ninja /work/mxnet @@ -153,10 +150,7 @@ build_armv7() { pushd . cd /work/build - # Lapack functionality will be included and statically linked to openblas. - # But USE_LAPACK needs to be set to OFF, otherwise the main CMakeLists.txt - # file tries to add -llapack. Lapack functionality though, requires -lgfortran - # to be linked additionally. + # Lapack functionality requires -lgfortran to be linked additionally. cmake \ -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} \ @@ -169,7 +163,7 @@ build_armv7() { -DUSE_SIGNAL_HANDLER=ON \ -DCMAKE_BUILD_TYPE=Release \ -DUSE_MKL_IF_AVAILABLE=OFF \ - -DUSE_LAPACK=OFF \ + -DUSE_LAPACK=ON \ -DBUILD_CPP_EXAMPLES=OFF \ -Dmxnet_LINKER_LIBS=-lgfortran \ -G Ninja /work/mxnet @@ -266,7 +260,7 @@ build_amzn_linux_cpu() { -DUSE_SIGNAL_HANDLER=ON\ -DCMAKE_BUILD_TYPE=RelWithDebInfo\ -DUSE_MKL_IF_AVAILABLE=OFF\ - -DUSE_LAPACK=OFF\ + -DUSE_LAPACK=ON\ -DUSE_DIST_KVSTORE=ON\ -G Ninja /work/mxnet ninja -v @@ -614,18 +608,17 @@ build_ubuntu_gpu_cmake_mkldnn() { set -ex cd /work/build cmake \ - -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ - -DCMAKE_C_COMPILER_LAUNCHER=ccache \ - -DENABLE_TESTCOVERAGE=ON \ - -DUSE_CUDA=1 \ - -DUSE_CUDNN=1 \ - -DUSE_MKLML_MKL=1 \ - -DUSE_MKLDNN=1 \ - -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ + -DCMAKE_C_COMPILER_LAUNCHER=ccache \ + -DENABLE_TESTCOVERAGE=ON \ + -DUSE_CUDA=1 \ + -DUSE_CUDNN=1 \ + -DUSE_MKL_IF_AVAILABLE=ON \ + -DUSE_MKLDNN=ON \ + -DCMAKE_BUILD_TYPE=Release \ -DCUDA_ARCH_NAME=Manual \ -DCUDA_ARCH_BIN=$CI_CMAKE_CUDA_ARCH_BIN \ - -G Ninja \ - /work/mxnet + -G Ninja /work/mxnet ninja -v # libmkldnn.so.0 is a link file. We need an actual binary file named libmkldnn.so.0. @@ -642,8 +635,8 @@ build_ubuntu_gpu_cmake() { -DENABLE_TESTCOVERAGE=ON \ -DUSE_CUDA=1 \ -DUSE_CUDNN=1 \ - -DUSE_MKLML_MKL=0 \ - -DUSE_MKLDNN=0 \ + -DUSE_MKL_IF_AVAILABLE=OFF \ + -DUSE_MKLDNN=OFF \ -DUSE_DIST_KVSTORE=1 \ -DCMAKE_BUILD_TYPE=Release \ -DCUDA_ARCH_NAME=Manual \ diff --git a/cmake/Modules/FindOpenBLAS.cmake b/cmake/Modules/FindOpenBLAS.cmake index 79400eb0b094..03a7edb6304d 100644 --- a/cmake/Modules/FindOpenBLAS.cmake +++ b/cmake/Modules/FindOpenBLAS.cmake @@ -95,7 +95,7 @@ find_path(OpenBLAS_INCLUDE_DIR NAMES cblas.h PATHS ${OpenBLAS_INCLUDE_SEARCH_PATHS}) find_library(OpenBLAS_LIBRARY - NAMES openblas libopenblas.dll.a libopenblas.dll + NAMES libopenblas.a openblas libopenblas.dll.a libopenblas.dll PATHS ${OpenBLAS_LIB_SEARCH_PATHS}) set(LOOKED_FOR @@ -110,20 +110,11 @@ if(OpenBLAS_NEED_LAPACK) NAMES lapacke.h PATHS ${OpenBLAS_INCLUDE_SEARCH_PATHS}) - if(UNIX AND NOT APPLE) - # lapack if present in OpenBLAS build is included into the libopenblas. But it requires gfortran to be linked - # dynamically. - # OpenBLAS does not have a separate lapack library: https://github.com/xianyi/OpenBLAS/issues/296 - # Static linking goes with openblas, but fortran needs to be linked dynamically: - # https://github.com/xianyi/OpenBLAS/issues/460#issuecomment-61293128 - find_library(OpenBLAS_LAPACK_LIBRARY - NAMES gfortran - PATHS ${OpenBLAS_LIB_SEARCH_PATHS}) - else() - set(OpenBLAS_LAPACK_LIBRARY ${OpenBLAS_LIBRARY}) - endif() + # OpenBLAS does not have a separate lapack library: https://github.com/xianyi/OpenBLAS/issues/296 + # lapack if present in OpenBLAS build is included into libopenblas + set(OpenBLAS_LAPACK_LIBRARY ${OpenBLAS_LIBRARY}) - set(CMAKE_REQUIRED_LIBRARIES ${OpenBLAS_LIBRARY}) + set(CMAKE_REQUIRED_LIBRARIES ${OpenBLAS_LAPACK_LIBRARY}) include(CheckFunctionExists) check_function_exists("cheev_" LAPACK_FOUND) From d50495a9e58766c9660c7fe5aef459102038e2be Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Mon, 16 Jul 2018 23:00:18 +0200 Subject: [PATCH 13/78] Added documentation for BLAS libraries --- CMakeLists.txt | 66 ++++++++++++++++++++++++++++++++++++++---- cmake/ChooseBlas.cmake | 41 ++++++++++++++++++++------ 2 files changed, 93 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c15ecfc2eafc..1f0fc55e851c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,11 +17,6 @@ mxnet_option(USE_OPENMP "Build with Openmp support" ON) mxnet_option(USE_CUDNN "Build with cudnn support" ON) # one could set CUDNN_ROOT for search path mxnet_option(USE_SSE "Build with x86 SSE instruction support" ON IF NOT ARM) mxnet_option(USE_F16C "Build with x86 F16C instruction support" ON) # autodetects support if ON -mxnet_option(USE_LAPACK "Build with lapack support" ON) -mxnet_option(USE_ACCELERATE_IF_AVAILABLE "Use Apple Accelerate framework if found, works if MKL not found or disabled" ON IF APPLE) -mxnet_option(USE_MKL_IF_AVAILABLE "Use MKL if found" ON) -mxnet_option(USE_MKLML "Use MKLML subset of MKL instead of mkl, will be downloaded" ON) -mxnet_option(USE_MKLDNN "Use MKLDNN (requires MKLML or MKL)" ON) mxnet_option(USE_OPERATOR_TUNING "Enable auto-tuning of operators" ON IF NOT MSVC) mxnet_option(USE_GPERFTOOLS "Build with GPerfTools support (if found)" ON) mxnet_option(USE_JEMALLOC "Build with Jemalloc support" ON) @@ -42,6 +37,67 @@ mxnet_option(USE_TENSORRT "Enable infeference optimization with TensorRT mxnet_option(USE_ASAN "Enable Clang/GCC ASAN sanitizers." OFF) mxnet_option(ENABLE_TESTCOVERAGE "Enable compilation with test coverage metric output" OFF) +# Choose BLAS (Basic Linear Algebra Subprograms) computation libraries + +# MXNet supports multiple mathematical backends for computations on the CPU: +# +# * Atlas +# * OpenBLAS +# * MKL (MKL, MKLML, MKLDNN) +# * Apple Accelerate +# +# The default order of choice for the libraries if found follows the path from probably the most +# (recommended) to less performant backends. The order is as follows: +# +# 1. MKLDNN (requires and checks for MKL or MKLML) +# 2. MKL +# 3. MKLML (downloaded) +# 4. Accelerate (on mac) +# 5. OpenBLAS +# +# Intel's MKL (Math Kernel Library) is one of the most powerful math libraries +# https://software.intel.com/en-us/mkl +# +# It has following flavours: + +# * MKL is a full library, containing all the functionality. It is free under +# community support licensing (https://software.intel.com/en-us/articles/free-mkl), +# but needs to be downloaded and installed manually. +# +# * MKLML is a subset of MKL. It contains smaller number of functions to reduce the +# size of the download and reduce the number of dynamic libraries user needs. This +# is the most effective option since it can be downloaded and installed automatically +# by the cmake script (see cmake/DownloadMKLML.cmake). +# +# * MKLDNN is a separate open-source library, but it requires MKL or MKLML. It is +# shipped as a subrepo with MXNet source code (see 3rdparty/mkldnn). +# +# Since the full MKL library is almost always faster than any other it's turned on by default, +# however it needs to be downloaded and installed manually before doing cmake configuration. +mxnet_option(USE_MKL_IF_AVAILABLE "Use MKL if found" ON) + +# If the full MKL library could not be found the thinner subset MKLML will be downloaded +# unless switched off explicitly. +mxnet_option(USE_MKLML "Use MKLML subset of MKL instead of mkl, will be downloaded" ON) + +# If either MKL of MKLML is present MKLDNN can be utilised from the 3rdparty/mkldnn subrepo. +# See more information here: https://github.com/intel/mkl-dnn +mxnet_option(USE_MKLDNN "Use MKLDNN (requires MKLML or MKL)" ON) + +# Apple's mathematical framework, probably the best choice on a Mac if MKL/MKLML/MKLDNN +# are not available. +# https://developer.apple.com/documentation/accelerate +mxnet_option(USE_ACCELERATE_IF_AVAILABLE "Use Apple Accelerate framework if found, \ + works if MKL not found or disabled" ON IF ${APPLE}) + +# Another important option of the math libraries is presence of additional set of +# mathematical functions gathered and named as the LAPACK (Linear Algebra Package). Some +# libraries don't include it, thus the cmake script will check the presence of an +# indicating function "cheev_" within the available choosen libraries and switch the +# functionality off if not found. +mxnet_option(USE_LAPACK "Build with lapack support" ON) + + message(STATUS "CMAKE_SYSTEM_NAME ${CMAKE_SYSTEM_NAME}") if(NOT mxnet_LINKER_LIBS) diff --git a/cmake/ChooseBlas.cmake b/cmake/ChooseBlas.cmake index afe9be2ecb05..afd09c5977e2 100644 --- a/cmake/ChooseBlas.cmake +++ b/cmake/ChooseBlas.cmake @@ -38,15 +38,13 @@ function(try_mkldnn) return() endif() - message(STATUS "Adding MKLDNN to the build") - - if(NOT MKL_FOUND AND ${USE_MKLML}) - include(${CMAKE_CURRENT_LIST_DIR}/DownloadMKLML.cmake) - find_package(MKLML REQUIRED) - include_directories(SYSTEM ${MKLML_INCLUDE_DIRS}) - set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${MKLML_LIBRARIES} PARENT_SCOPE) + if(NOT ${MKL_FOUND}) + message(WARNING "MKLDNN requires either MKL or MKLML, MKLDNN will not be available") + return() endif() + message(STATUS "Adding MKLDNN to the build") + # CPU architecture (e.g., C5) can't run on another architecture (e.g., g3). if(NOT MSVC) set(ARCH_OPT_FLAGS ${ARCH_OPT_FLAGS} "-mtune=generic" PARENT_SCOPE) @@ -71,14 +69,38 @@ function(try_mkl) find_package(MKL) if(${MKL_FOUND}) message(STATUS "MKL framework found") + + set(MKL_FOUND ${MKL_FOUND} PARENT_SCOPE) + set(MKLROOT ${MKLROOT} PARENT_SCOPE) + set(BLAS MKL PARENT_SCOPE) else() message(STATUS "MKL framework not found") endif() + endif() +endfunction() - set(MKL_FOUND ${MKL_FOUND} PARENT_SCOPE) - set(MKLROOT ${MKLROOT} PARENT_SCOPE) +function(try_mklml) + if(NOT ${USE_MKLML}) + return() endif() + + if(${MKL_FOUND}) + return() + endif() + + message(STATUS "Trying to enable mklml framework due to USE_MKLML") + + include(${CMAKE_CURRENT_LIST_DIR}/DownloadMKLML.cmake) + find_package(MKLML REQUIRED) + include_directories(SYSTEM ${MKLML_INCLUDE_DIRS}) + set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${MKLML_LIBRARIES} PARENT_SCOPE) + + set(MKL_FOUND ${MKL_FOUND} PARENT_SCOPE) + set(MKLROOT ${MKLROOT} PARENT_SCOPE) + + set(BLAS MKL PARENT_SCOPE) + endfunction() function(try_accelerate) @@ -103,6 +125,7 @@ function(try_accelerate) endfunction() try_mkl() +try_mklml() try_mkldnn() try_accelerate() From aa6a87e9310eca878a669f04ae9af4ce0d6bf82f Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Tue, 17 Jul 2018 00:36:20 +0200 Subject: [PATCH 14/78] Adressed review comments --- CMakeLists.txt | 17 +++++++++-------- cmake/ChooseBlas.cmake | 18 +++++++++--------- cmake/DownloadMKLML.cmake | 4 ++-- cmake/Modules/FindAccelerate.cmake | 12 +++++++----- cmake/Modules/FindAtlas.cmake | 8 ++++---- cmake/Modules/FindOpenBLAS.cmake | 10 +++++----- 6 files changed, 36 insertions(+), 33 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1f0fc55e851c..38e6ec0286fd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,14 +46,14 @@ mxnet_option(ENABLE_TESTCOVERAGE "Enable compilation with test coverage metric # * MKL (MKL, MKLML, MKLDNN) # * Apple Accelerate # -# The default order of choice for the libraries if found follows the path from probably the most +# The default order of choice for the libraries if found follows the path from the most # (recommended) to less performant backends. The order is as follows: # -# 1. MKLDNN (requires and checks for MKL or MKLML) -# 2. MKL -# 3. MKLML (downloaded) -# 4. Accelerate (on mac) -# 5. OpenBLAS +# 1. MKLDNN (requires and checks for MKL or MKLML) | USE_MKLDNN +# 2. MKL | USE_MKL_IF_AVAILABLE +# 3. MKLML (downloaded) | USE_MKLML +# 4. Apple Accelerate (on mac) | USE_APPLE_ACCELERATE_IF_AVAILABLE +# 5. OpenBLAS | BLAS (Atlas;Open;MKL;Apple) # # Intel's MKL (Math Kernel Library) is one of the most powerful math libraries # https://software.intel.com/en-us/mkl @@ -74,6 +74,7 @@ mxnet_option(ENABLE_TESTCOVERAGE "Enable compilation with test coverage metric # # Since the full MKL library is almost always faster than any other it's turned on by default, # however it needs to be downloaded and installed manually before doing cmake configuration. +# Register and download here https://software.seek.intel.com/performance-libraries mxnet_option(USE_MKL_IF_AVAILABLE "Use MKL if found" ON) # If the full MKL library could not be found the thinner subset MKLML will be downloaded @@ -87,8 +88,8 @@ mxnet_option(USE_MKLDNN "Use MKLDNN (requires MKLML or MKL)" ON) # Apple's mathematical framework, probably the best choice on a Mac if MKL/MKLML/MKLDNN # are not available. # https://developer.apple.com/documentation/accelerate -mxnet_option(USE_ACCELERATE_IF_AVAILABLE "Use Apple Accelerate framework if found, \ - works if MKL not found or disabled" ON IF ${APPLE}) +mxnet_option(USE_APPLE_ACCELERATE_IF_AVAILABLE "Use Apple Accelerate framework if found, \ + works if MKL not found or disabled" ON IF ${APPLE}) # Another important option of the math libraries is presence of additional set of # mathematical functions gathered and named as the LAPACK (Linear Algebra Package). Some diff --git a/cmake/ChooseBlas.cmake b/cmake/ChooseBlas.cmake index afd09c5977e2..bed1b19edc41 100644 --- a/cmake/ChooseBlas.cmake +++ b/cmake/ChooseBlas.cmake @@ -20,10 +20,10 @@ set_property(CACHE BLAS PROPERTY STRINGS "Atlas;Open;MKL;Apple") function(switch_lapack enable) if(${enable}) - message(STATUS "Enabling lapack functionality") + message(STATUS "Enabling LAPACK functionality") add_definitions(-DMXNET_USE_LAPACK=1) else() - message(WARNING "Lapack functionality not available") + message(WARNING "LAPACK functionality not available") endif() endfunction() @@ -65,7 +65,7 @@ endfunction() function(try_mkl) if(${USE_MKL_IF_AVAILABLE} AND NOT ${USE_MKLML}) - message(STATUS "Trying to enable mkl framework due to USE_MKL_IF_AVAILABLE") + message(STATUS "Trying to enable MKL framework due to USE_MKL_IF_AVAILABLE") find_package(MKL) if(${MKL_FOUND}) message(STATUS "MKL framework found") @@ -89,7 +89,7 @@ function(try_mklml) return() endif() - message(STATUS "Trying to enable mklml framework due to USE_MKLML") + message(STATUS "Trying to enable MKLML framework due to USE_MKLML") include(${CMAKE_CURRENT_LIST_DIR}/DownloadMKLML.cmake) find_package(MKLML REQUIRED) @@ -112,14 +112,14 @@ function(try_accelerate) return() endif() - if(${USE_ACCELERATE_IF_AVAILABLE}) - message(STATUS "Trying to enable accelerate framework due to USE_ACCELERATE_IF_AVAILABLE") + if(${USE_APPLE_ACCELERATE_IF_AVAILABLE}) + message(STATUS "Trying to enable Apple Accelerate framework due to USE_ACCELERATE_IF_AVAILABLE") find_package(Accelerate) if(${Accelerate_FOUND}) - message(STATUS "Accelerate framework found") + message(STATUS "Apple Accelerate framework found") set(BLAS Accelerate PARENT_SCOPE) else() - message(STATUS "Accelerate framework not found") + message(STATUS "Apple Accelerate framework not found") endif() endif() endfunction() @@ -189,7 +189,7 @@ endif() if(BLAS MATCHES "([Aa][Pp][Pp][Ll][Ee]|[Aa][Cc][Cc][Ee][Ll][Ee][Rr][Aa][Tt][Ee])") if(NOT APPLE) - message(FATAL_ERROR "Apple BLAS framework is available only on MAC") + message(FATAL_ERROR "Apple Accelerate framework's BLAS feature is available only on macOS") return() endif() diff --git a/cmake/DownloadMKLML.cmake b/cmake/DownloadMKLML.cmake index 36c35bc7d77a..cc1c5f58d5a4 100644 --- a/cmake/DownloadMKLML.cmake +++ b/cmake/DownloadMKLML.cmake @@ -15,9 +15,9 @@ # specific language governing permissions and limitations # under the License. -# This script will download mkldnn with dependencies such as intel omp and mklml +# This script will download MKLML -message(STATUS "downloading mkldnn...") +message(STATUS "Downloading MKLML...") if(MSVC) set(MKL_NAME "mklml_win_2018.0.3.20180406") diff --git a/cmake/Modules/FindAccelerate.cmake b/cmake/Modules/FindAccelerate.cmake index 1cec4d82cbf7..b5b8a72af20d 100644 --- a/cmake/Modules/FindAccelerate.cmake +++ b/cmake/Modules/FindAccelerate.cmake @@ -40,9 +40,10 @@ set(LOOKED_FOR ) if(Accelerate_NEED_LAPACK) - message(STATUS "Looking for lapack support...") + message(STATUS "Looking for LAPACK support...") - # Apples vecLib should contain lapack functionalities included in the Accelerate framework, but we will double check + # Apple's vecLib should contain LAPACK functionalities included in the Accelerate + # framework, but we will double check # https://developer.apple.com/documentation/accelerate/veclib?changes=_2 include(CheckFunctionExists) set(CMAKE_REQUIRED_LIBRARIES "-framework Accelerate") @@ -50,10 +51,11 @@ if(Accelerate_NEED_LAPACK) if(LAPACK_FOUND) set(Accelerate_LAPACK_FOUND True) - message(STATUS "Lapack found") + message(STATUS "LAPACK found") else() set(Accelerate_LAPACK_FOUND False) - message(WARNING "Accelerate lapack support could not be identified, lapack functionality will not be available") + message(WARNING "Apple's Accelerate LAPACK support could not be identified, \ + LAPACK functionality will not be available") endif() endif() @@ -66,6 +68,6 @@ if(Accelerate_FOUND) set(Accelerate_LIBRARIES "-framework Accelerate") mark_as_advanced(${LOOKED_FOR}) - message(STATUS "Found Accelerate (include: ${Accelerate_CBLAS_INCLUDE_DIR}, library: ${Accelerate_LIBRARIES})") + message(STATUS "Found Apple Accelerate (include: ${Accelerate_CBLAS_INCLUDE_DIR}, library: ${Accelerate_LIBRARIES})") endif(Accelerate_FOUND) diff --git a/cmake/Modules/FindAtlas.cmake b/cmake/Modules/FindAtlas.cmake index 32c77ad49b5c..beb9ca7c0273 100644 --- a/cmake/Modules/FindAtlas.cmake +++ b/cmake/Modules/FindAtlas.cmake @@ -20,7 +20,7 @@ # The following variables are optionally searched for defaults # # Atlas_ROOT_DIR: Base directory where all Atlas components are found -# Atlas_NEED_LAPACK: Whether need lapack libraries +# Atlas_NEED_LAPACK: Whether need LAPACK libraries # # The following are set after configuration is done: # @@ -86,7 +86,7 @@ set(LOOKED_FOR ) if(Atlas_NEED_LAPACK) - message(STATUS "Looking for lapack support...") + message(STATUS "Looking for LAPACK support...") find_path(Atlas_CLAPACK_INCLUDE_DIR NAMES clapack.h @@ -107,10 +107,10 @@ if(Atlas_NEED_LAPACK) Atlas_CLAPACK_INCLUDE_DIR Atlas_LAPACK_LIBRARY) - message(STATUS "Lapack found") + message(STATUS "LAPACK found") else() set(Atlas_LAPACK_FOUND False) - message(WARNING "Lapack with Atlas could not be found, lapack functionality will not be available") + message(WARNING "LAPACK with Atlas could not be found, LAPACK functionality will not be available") endif() endif() diff --git a/cmake/Modules/FindOpenBLAS.cmake b/cmake/Modules/FindOpenBLAS.cmake index 03a7edb6304d..c5e96accf4ca 100644 --- a/cmake/Modules/FindOpenBLAS.cmake +++ b/cmake/Modules/FindOpenBLAS.cmake @@ -104,14 +104,14 @@ set(LOOKED_FOR ) if(OpenBLAS_NEED_LAPACK) - message(STATUS "Looking for lapack support...") + message(STATUS "Looking for LAPACK support...") find_path(OpenBLAS_LAPACK_INCLUDE_DIR NAMES lapacke.h PATHS ${OpenBLAS_INCLUDE_SEARCH_PATHS}) - # OpenBLAS does not have a separate lapack library: https://github.com/xianyi/OpenBLAS/issues/296 - # lapack if present in OpenBLAS build is included into libopenblas + # OpenBLAS does not have a separate LAPACK library: https://github.com/xianyi/OpenBLAS/issues/296 + # LAPACK if present in OpenBLAS build is included into libopenblas set(OpenBLAS_LAPACK_LIBRARY ${OpenBLAS_LIBRARY}) set(CMAKE_REQUIRED_LIBRARIES ${OpenBLAS_LAPACK_LIBRARY}) @@ -126,10 +126,10 @@ if(OpenBLAS_NEED_LAPACK) OpenBLAS_LAPACK_INCLUDE_DIR OpenBLAS_LAPACK_LIBRARY ) - message(STATUS "Lapack found") + message(STATUS "LAPACK found") else() set(OpenBLAS_LAPACK_FOUND False) - message(WARNING "OpenBlas has not been compiled with Lapack support, lapack functionality will not be available") + message(WARNING "OpenBlas has not been compiled with LAPACK support, LAPACK functionality will not be available") endif() endif() From 17c26307168d9046dbb3aa34f112e09e3a913fd8 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 18 Jul 2018 10:56:48 +0200 Subject: [PATCH 15/78] Fixed and added notes on cross compilation --- CMakeLists.txt | 71 ++++++++++++++++++++++++++++-------------- cmake/ChooseBlas.cmake | 63 +++++++++++++++++++++++++++---------- 2 files changed, 95 insertions(+), 39 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 38e6ec0286fd..87911effb446 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,17 +49,32 @@ mxnet_option(ENABLE_TESTCOVERAGE "Enable compilation with test coverage metric # The default order of choice for the libraries if found follows the path from the most # (recommended) to less performant backends. The order is as follows: # +# For desktop platforms (x86_64): +# # 1. MKLDNN (requires and checks for MKL or MKLML) | USE_MKLDNN # 2. MKL | USE_MKL_IF_AVAILABLE # 3. MKLML (downloaded) | USE_MKLML -# 4. Apple Accelerate (on mac) | USE_APPLE_ACCELERATE_IF_AVAILABLE +# 4. Apple Accelerate | USE_APPLE_ACCELERATE_IF_AVAILABLE | Mac only # 5. OpenBLAS | BLAS (Atlas;Open;MKL;Apple) # +# For embedded platforms (all other and if cross compiled): +# +# 1. OpenBLAS | BLAS (Atlas;Open) +# +# You can set the BLAS library explicitly by setting the BLAS variable to: +# +# * Atlas +# * Open +# * MKL +# * Apple +# +# See cmake/ChooseBlas.cmake file for the options. +# # Intel's MKL (Math Kernel Library) is one of the most powerful math libraries # https://software.intel.com/en-us/mkl # # It has following flavours: - +# # * MKL is a full library, containing all the functionality. It is free under # community support licensing (https://software.intel.com/en-us/articles/free-mkl), # but needs to be downloaded and installed manually. @@ -75,14 +90,27 @@ mxnet_option(ENABLE_TESTCOVERAGE "Enable compilation with test coverage metric # Since the full MKL library is almost always faster than any other it's turned on by default, # however it needs to be downloaded and installed manually before doing cmake configuration. # Register and download here https://software.seek.intel.com/performance-libraries +# +# Note: MKL is supported only for desktop builds and the framework itself supports the following +# hardware: +# +# * Intel® Xeon Phi™ processor +# * Intel® Xeon® processor +# * Intel® Core™ processor family +# * Intel Atom® processor +# +# If you have a different processor you can still try to use MKL, but performance results are +# unpredictable. mxnet_option(USE_MKL_IF_AVAILABLE "Use MKL if found" ON) # If the full MKL library could not be found the thinner subset MKLML will be downloaded # unless switched off explicitly. +# Note: The same limitation on hardware as for MKL applies for MKLML as well. mxnet_option(USE_MKLML "Use MKLML subset of MKL instead of mkl, will be downloaded" ON) # If either MKL of MKLML is present MKLDNN can be utilised from the 3rdparty/mkldnn subrepo. # See more information here: https://github.com/intel/mkl-dnn +# Note: The same limitation on hardware as for MKL and MKLDNN applies for MKLDNN as well. mxnet_option(USE_MKLDNN "Use MKLDNN (requires MKLML or MKL)" ON) # Apple's mathematical framework, probably the best choice on a Mac if MKL/MKLML/MKLDNN @@ -98,13 +126,30 @@ mxnet_option(USE_APPLE_ACCELERATE_IF_AVAILABLE "Use Apple Accelerate framework i # functionality off if not found. mxnet_option(USE_LAPACK "Build with lapack support" ON) - message(STATUS "CMAKE_SYSTEM_NAME ${CMAKE_SYSTEM_NAME}") if(NOT mxnet_LINKER_LIBS) set(mxnet_LINKER_LIBS "") endif(NOT mxnet_LINKER_LIBS) +if(MSVC) + set(SYSTEM_ARCHITECTURE x86_64) +else() + execute_process(COMMAND uname -m COMMAND tr -d '\n' OUTPUT_VARIABLE SYSTEM_ARCHITECTURE) +endif() + +set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules;${CMAKE_MODULE_PATH}") + +SET(EXTRA_OPERATORS "" CACHE PATH "EXTRA OPERATORS PATH") + +if("$ENV{VERBOSE}" STREQUAL "1") + message(STATUS " Verbose Makefile ACTIVATED") + set(CMAKE_VERBOSE_MAKEFILE ON) +endif() + +# ---[ BLAS +include(cmake/ChooseBlas.cmake) + if(USE_CUDA AND NOT USE_OLDCMAKECUDA) message(STATUS "CMake version '${CMAKE_VERSION}' using generator '${CMAKE_GENERATOR}'") if( @@ -127,23 +172,6 @@ else() project(mxnet C CXX) endif() - -if(MSVC) - set(SYSTEM_ARCHITECTURE x86_64) -else() - execute_process(COMMAND uname -m COMMAND tr -d '\n' OUTPUT_VARIABLE SYSTEM_ARCHITECTURE) -endif() - -set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules;${CMAKE_MODULE_PATH}") - -SET(EXTRA_OPERATORS "" CACHE PATH "EXTRA OPERATORS PATH") - -if("$ENV{VERBOSE}" STREQUAL "1") - message(STATUS " Verbose Makefile ACTIVATED") - set(CMAKE_VERBOSE_MAKEFILE ON) -endif() - - if(MSVC) add_definitions(-DWIN32_LEAN_AND_MEAN) add_definitions(-DDMLC_USE_CXX11) @@ -456,9 +484,6 @@ elseif(UNIX AND NOT ANDROID) list(APPEND mxnet_LINKER_LIBS pthread) endif() -# ---[ BLAS -include(cmake/ChooseBlas.cmake) - # ---[ jemalloc if(USE_JEMALLOC) find_package(JeMalloc) diff --git a/cmake/ChooseBlas.cmake b/cmake/ChooseBlas.cmake index bed1b19edc41..7b6820a0d156 100644 --- a/cmake/ChooseBlas.cmake +++ b/cmake/ChooseBlas.cmake @@ -33,11 +33,6 @@ function(try_mkldnn) return() endif() - if(${CMAKE_CROSSCOMPILING}) - message(WARNING "MKLDNN with cross compilation is not supported, MKLDNN will not be available") - return() - endif() - if(NOT ${MKL_FOUND}) message(WARNING "MKLDNN requires either MKL or MKLML, MKLDNN will not be available") return() @@ -64,20 +59,39 @@ function(try_mkldnn) endfunction() function(try_mkl) - if(${USE_MKL_IF_AVAILABLE} AND NOT ${USE_MKLML}) - message(STATUS "Trying to enable MKL framework due to USE_MKL_IF_AVAILABLE") - find_package(MKL) - if(${MKL_FOUND}) - message(STATUS "MKL framework found") + if(${USE_MKLML}) + return() + endif() - set(MKL_FOUND ${MKL_FOUND} PARENT_SCOPE) - set(MKLROOT ${MKLROOT} PARENT_SCOPE) + if(NOT ${USE_MKL_IF_AVAILABLE}) + return() + endif() - set(BLAS MKL PARENT_SCOPE) - else() - message(STATUS "MKL framework not found") - endif() + if(${CMAKE_CROSSCOMPILING}) + message(WARNING "MKL with cross compilation is not supported, MKL will not be available") + return() + endif() + + if(${SYSTEM_ARCHITECTURE} NOT STREQUAL "x86_64") + message(WARNING "MKL is supported only for desktop platforms, MKL will not be available") + return() + endif() + + message(STATUS "Trying to enable MKL framework due to USE_MKL_IF_AVAILABLE") + + find_package(MKL) + + if(${MKL_FOUND}) + message(STATUS "MKL framework found") + + set(MKL_FOUND ${MKL_FOUND} PARENT_SCOPE) + set(MKLROOT ${MKLROOT} PARENT_SCOPE) + + set(BLAS MKL PARENT_SCOPE) + else() + message(STATUS "MKL framework not found") endif() + endfunction() function(try_mklml) @@ -85,10 +99,25 @@ function(try_mklml) return() endif() + if(${CMAKE_CROSSCOMPILING}) + message(STATUS "MKLML is supported only for desktop platforms, skipping...") + return() + endif() + if(${MKL_FOUND}) return() endif() + if(${CMAKE_CROSSCOMPILING}) + message(WARNING "MKLML with cross compilation is not supported, MKLML will not be available") + return() + endif() + + if(${SYSTEM_ARCHITECTURE} NOT STREQUAL "x86_64") + message(WARNING "MKLML is supported only for desktop platforms, MKLML will not be available") + return() + endif() + message(STATUS "Trying to enable MKLML framework due to USE_MKLML") include(${CMAKE_CURRENT_LIST_DIR}/DownloadMKLML.cmake) @@ -101,6 +130,8 @@ function(try_mklml) set(BLAS MKL PARENT_SCOPE) + message(STATUS "MKLML framework found") + endfunction() function(try_accelerate) From 03f3b737318ebda2c3a6366525ac14881d08943f Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 18 Jul 2018 13:40:09 +0200 Subject: [PATCH 16/78] Fixed cmake if statement --- ci/docker/runtime_functions.sh | 3 +++ cmake/ChooseBlas.cmake | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/ci/docker/runtime_functions.sh b/ci/docker/runtime_functions.sh index d6e10dd142f7..7f594ba63ac7 100755 --- a/ci/docker/runtime_functions.sh +++ b/ci/docker/runtime_functions.sh @@ -127,6 +127,7 @@ build_armv6() { cmake \ -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} \ + -DCMAKE_CROSSCOMPILING=ON \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DUSE_CUDA=OFF \ @@ -202,6 +203,7 @@ build_android_armv7() { -DANDROID=ON\ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -DCMAKE_C_COMPILER_LAUNCHER=ccache \ + -DCMAKE_CROSSCOMPILING=ON \ -DUSE_CUDA=OFF\ -DUSE_SSE=OFF\ -DSUPPORT_F16C=OFF\ @@ -220,6 +222,7 @@ build_android_armv8() { cd /work/build cmake\ -DANDROID=ON \ + -DCMAKE_CROSSCOMPILING=ON \ -DUSE_CUDA=OFF\ -DUSE_SSE=OFF\ -DUSE_LAPACK=OFF\ diff --git a/cmake/ChooseBlas.cmake b/cmake/ChooseBlas.cmake index 7b6820a0d156..bf544ed1fafe 100644 --- a/cmake/ChooseBlas.cmake +++ b/cmake/ChooseBlas.cmake @@ -72,7 +72,7 @@ function(try_mkl) return() endif() - if(${SYSTEM_ARCHITECTURE} NOT STREQUAL "x86_64") + if(NOT ${SYSTEM_ARCHITECTURE} STREQUAL "x86_64") message(WARNING "MKL is supported only for desktop platforms, MKL will not be available") return() endif() @@ -113,7 +113,7 @@ function(try_mklml) return() endif() - if(${SYSTEM_ARCHITECTURE} NOT STREQUAL "x86_64") + if(NOT ${SYSTEM_ARCHITECTURE} STREQUAL "x86_64") message(WARNING "MKLML is supported only for desktop platforms, MKLML will not be available") return() endif() From 559c0472e1a86467c9962a828210fb0241b17de3 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 18 Jul 2018 14:03:11 +0000 Subject: [PATCH 17/78] Added -DCMAKE_CROSSCOMPILING=ON for cross compiling builds --- CMakeLists.txt | 4 ++-- ci/docker/runtime_functions.sh | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 87911effb446..b584152228ff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -106,12 +106,12 @@ mxnet_option(USE_MKL_IF_AVAILABLE "Use MKL if found" ON) # If the full MKL library could not be found the thinner subset MKLML will be downloaded # unless switched off explicitly. # Note: The same limitation on hardware as for MKL applies for MKLML as well. -mxnet_option(USE_MKLML "Use MKLML subset of MKL instead of mkl, will be downloaded" ON) +mxnet_option(USE_MKLML "Use MKLML subset of MKL instead of mkl, will be downloaded" ON IF ${USE_MKL_IF_AVAILABLE}) # If either MKL of MKLML is present MKLDNN can be utilised from the 3rdparty/mkldnn subrepo. # See more information here: https://github.com/intel/mkl-dnn # Note: The same limitation on hardware as for MKL and MKLDNN applies for MKLDNN as well. -mxnet_option(USE_MKLDNN "Use MKLDNN (requires MKLML or MKL)" ON) +mxnet_option(USE_MKLDNN "Use MKLDNN (requires MKLML or MKL)" ON IF ${USE_MKL_IF_AVAILABLE}) # Apple's mathematical framework, probably the best choice on a Mac if MKL/MKLML/MKLDNN # are not available. diff --git a/ci/docker/runtime_functions.sh b/ci/docker/runtime_functions.sh index 7f594ba63ac7..097d62cd56c0 100755 --- a/ci/docker/runtime_functions.sh +++ b/ci/docker/runtime_functions.sh @@ -178,6 +178,7 @@ build_armv8() { cmake \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -DCMAKE_C_COMPILER_LAUNCHER=ccache \ + -DCMAKE_CROSSCOMPILING=ON \ -DUSE_CUDA=OFF\ -DSUPPORT_F16C=OFF\ -DUSE_OPENCV=OFF\ From f69fc8a7bd4c67091fb4fae48191b1a8908c4360 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 18 Jul 2018 16:04:28 +0200 Subject: [PATCH 18/78] Fixed abscent lapack for OpenBLAS and Atlas --- CMakeLists.txt | 5 +++++ cmake/ChooseBlas.cmake | 6 ++++-- cmake/Modules/FindAtlas.cmake | 2 ++ cmake/Modules/FindOpenBLAS.cmake | 12 +++++++++++- 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b584152228ff..d5afe1afd0a3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,12 @@ cmake_minimum_required(VERSION 3.0.2) +# workaround to store CMAKE_CROSSCOMPILING because is getting reset by the project command +set(__CMAKE_CROSSCOMPILING ${CMAKE_CROSSCOMPILING}) + project(mxnet C CXX) +set(CMAKE_CROSSCOMPILING ${__CMAKE_CROSSCOMPILING}) + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/build/private/local_config.cmake) include(${CMAKE_CURRENT_SOURCE_DIR}/build/private/local_config.cmake) endif() diff --git a/cmake/ChooseBlas.cmake b/cmake/ChooseBlas.cmake index bf544ed1fafe..abc8b32d4f19 100644 --- a/cmake/ChooseBlas.cmake +++ b/cmake/ChooseBlas.cmake @@ -73,7 +73,8 @@ function(try_mkl) endif() if(NOT ${SYSTEM_ARCHITECTURE} STREQUAL "x86_64") - message(WARNING "MKL is supported only for desktop platforms, MKL will not be available") + message(WARNING "MKL is supported only for desktop platforms (SYSTEM_ARCHITECTURE=${SYSTEM_ARCHITECTURE}), \ + MKL will not be available") return() endif() @@ -114,7 +115,8 @@ function(try_mklml) endif() if(NOT ${SYSTEM_ARCHITECTURE} STREQUAL "x86_64") - message(WARNING "MKLML is supported only for desktop platforms, MKLML will not be available") + message(WARNING "MKLML is supported only for desktop platforms (SYSTEM_ARCHITECTURE=${SYSTEM_ARCHITECTURE}), \ + MKLML will not be available") return() endif() diff --git a/cmake/Modules/FindAtlas.cmake b/cmake/Modules/FindAtlas.cmake index beb9ca7c0273..bbb27db29d96 100644 --- a/cmake/Modules/FindAtlas.cmake +++ b/cmake/Modules/FindAtlas.cmake @@ -110,6 +110,8 @@ if(Atlas_NEED_LAPACK) message(STATUS "LAPACK found") else() set(Atlas_LAPACK_FOUND False) + set(Atlas_CLAPACK_INCLUDE_DIR "") + set(Atlas_LAPACK_LIBRARY "") message(WARNING "LAPACK with Atlas could not be found, LAPACK functionality will not be available") endif() diff --git a/cmake/Modules/FindOpenBLAS.cmake b/cmake/Modules/FindOpenBLAS.cmake index c5e96accf4ca..ceb76c04cea7 100644 --- a/cmake/Modules/FindOpenBLAS.cmake +++ b/cmake/Modules/FindOpenBLAS.cmake @@ -94,8 +94,16 @@ set(OpenBLAS_LIB_SEARCH_PATHS find_path(OpenBLAS_INCLUDE_DIR NAMES cblas.h PATHS ${OpenBLAS_INCLUDE_SEARCH_PATHS}) + +set(OpenBLAS_LIB_NAMES openblas libopenblas.dll.a libopenblas.dll) + +if(CMAKE_CROSSCOMPILING) + message(STATUS "Will try link to OpenBLAS statically for cross compilation") + set(OpenBLAS_LIB_NAMES libopenblas.a ${OpenBLAS_LIB_NAMES}) +endif() + find_library(OpenBLAS_LIBRARY - NAMES libopenblas.a openblas libopenblas.dll.a libopenblas.dll + NAMES ${OpenBLAS_LIB_NAMES} PATHS ${OpenBLAS_LIB_SEARCH_PATHS}) set(LOOKED_FOR @@ -129,6 +137,8 @@ if(OpenBLAS_NEED_LAPACK) message(STATUS "LAPACK found") else() set(OpenBLAS_LAPACK_FOUND False) + set(OpenBLAS_LAPACK_LIBRARY "") + set(OpenBLAS_LAPACK_INCLUDE_DIR "") message(WARNING "OpenBlas has not been compiled with LAPACK support, LAPACK functionality will not be available") endif() From fcd6f1b11a705869aee74d60c8362b58faca0a65 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 18 Jul 2018 16:21:35 +0200 Subject: [PATCH 19/78] Fixed MKLML on windows --- cmake/DownloadMKLML.cmake | 2 ++ cmake/Modules/FindMKLML.cmake | 7 +++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/cmake/DownloadMKLML.cmake b/cmake/DownloadMKLML.cmake index cc1c5f58d5a4..0c6eba723a57 100644 --- a/cmake/DownloadMKLML.cmake +++ b/cmake/DownloadMKLML.cmake @@ -29,7 +29,9 @@ if(MSVC) set(MKLROOT "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}") file(COPY ${MKLROOT}/lib/libiomp5md.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + file(COPY ${MKLROOT}/lib/libiomp5md.lib DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY ${MKLROOT}/lib/mklml.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + file(COPY ${MKLROOT}/lib/mklml.lib DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY ${CMAKE_SOURCE_DIR}/3rdparty/mkldnn/config_template.vcxproj.user DESTINATION ${CMAKE_SOURCE_DIR}) elseif(APPLE) set(MKL_NAME "mklml_mac_2018.0.3.20180406") diff --git a/cmake/Modules/FindMKLML.cmake b/cmake/Modules/FindMKLML.cmake index e3f809dc1330..0e3f220fba37 100644 --- a/cmake/Modules/FindMKLML.cmake +++ b/cmake/Modules/FindMKLML.cmake @@ -66,7 +66,7 @@ set(LOOKED_FOR set(MKLML_LIBS iomp5) if(WIN32) - list(APPEND MKLML_LIBS mklml_intel) + list(APPEND MKLML_LIBS mklml) elseif(APPLE) list(APPEND MKLML_LIBS mklml) else() @@ -77,8 +77,11 @@ foreach(__lib ${MKLML_LIBS}) set(__mkl_lib "${__lib}") string(TOUPPER ${__mkl_lib} __mkl_lib_upper) + # add static windows libs first + set(__mkl_lib_names lib${__mkl_lib}.lib lib${__mkl_lib}md.lib) + find_library(${__mkl_lib_upper}_LIBRARY - NAMES ${__mkl_lib} + NAMES ${__mkl_lib_names} ${__mkl_lib} PATHS ${MKLML_LIB_SEARCH_PATHS} PATH_SUFFIXES ${PATH_SUFFIXES} ) From 8b91eb73058f39463b19ea66f534b96a6edc3ff5 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 18 Jul 2018 16:30:05 +0200 Subject: [PATCH 20/78] Fixed android cross compile override --- CMakeLists.txt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d5afe1afd0a3..36e0163ec90c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,11 +1,16 @@ cmake_minimum_required(VERSION 3.0.2) # workaround to store CMAKE_CROSSCOMPILING because is getting reset by the project command -set(__CMAKE_CROSSCOMPILING ${CMAKE_CROSSCOMPILING}) +if(${CMAKE_CROSSCOMPILING}) + set(__CMAKE_CROSSCOMPILING ${CMAKE_CROSSCOMPILING}) + set(__CMAKE_CROSSCOMPILING_OVERRIDE ON) +endif() project(mxnet C CXX) -set(CMAKE_CROSSCOMPILING ${__CMAKE_CROSSCOMPILING}) +if(${__CMAKE_CROSSCOMPILING_OVERRIDE}) + set(CMAKE_CROSSCOMPILING ${__CMAKE_CROSSCOMPILING}) +endif() if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/build/private/local_config.cmake) include(${CMAKE_CURRENT_SOURCE_DIR}/build/private/local_config.cmake) From f6ca5ec206a21a8945fd110c20f901fbc6016698 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 18 Jul 2018 16:44:33 +0200 Subject: [PATCH 21/78] Added status output of MKLROOT path --- cmake/DownloadMKLML.cmake | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cmake/DownloadMKLML.cmake b/cmake/DownloadMKLML.cmake index 0c6eba723a57..129c50851b94 100644 --- a/cmake/DownloadMKLML.cmake +++ b/cmake/DownloadMKLML.cmake @@ -21,12 +21,15 @@ message(STATUS "Downloading MKLML...") if(MSVC) set(MKL_NAME "mklml_win_2018.0.3.20180406") + file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.zip" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.zip" EXPECTED_MD5 "8DD73E7D3F19F004551809824C4E8970" SHOW_PROGRESS) file(DOWNLOAD "https://github.com/apache/incubator-mxnet/releases/download/utils/7z.exe" "${CMAKE_CURRENT_BINARY_DIR}/mklml/7z2.exe" EXPECTED_MD5 "E1CF766CF358F368EC97662D06EA5A4C" SHOW_PROGRESS) execute_process(COMMAND "${CMAKE_CURRENT_BINARY_DIR}/mklml/7z2.exe" "-o${CMAKE_CURRENT_BINARY_DIR}/mklml/" "-y") execute_process(COMMAND "${CMAKE_CURRENT_BINARY_DIR}/mklml/7z.exe" "x" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.zip" "-o${CMAKE_CURRENT_BINARY_DIR}/mklml/" "-y") + set(MKLROOT "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}") + message(STATUS "Setting MKLROOT path to ${MKLROOT}") file(COPY ${MKLROOT}/lib/libiomp5md.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY ${MKLROOT}/lib/libiomp5md.lib DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) @@ -35,17 +38,23 @@ if(MSVC) file(COPY ${CMAKE_SOURCE_DIR}/3rdparty/mkldnn/config_template.vcxproj.user DESTINATION ${CMAKE_SOURCE_DIR}) elseif(APPLE) set(MKL_NAME "mklml_mac_2018.0.3.20180406") + file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.tgz" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" EXPECTED_MD5 "23a6f7fd04fb1fa6de0d52a2ec5a2a14" SHOW_PROGRESS) execute_process(COMMAND "tar" "-xzf" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" "-C" "${CMAKE_CURRENT_BINARY_DIR}/mklml/") + set(MKLROOT "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}") + message(STATUS "Setting MKLROOT path to ${MKLROOT}") file(COPY ${MKLROOT}/lib/libiomp5.dylib DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY ${MKLROOT}/lib/libmklml.dylib DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) elseif(UNIX) set(MKL_NAME "mklml_lnx_2018.0.3.20180406") + file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.tgz" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" EXPECTED_MD5 "DAF7EFC3C1C0036B447213004467A8AE" SHOW_PROGRESS) execute_process(COMMAND "tar" "-xzf" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" "-C" "${CMAKE_CURRENT_BINARY_DIR}/mklml/") + set(MKLROOT "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}") + message(STATUS "Setting MKLROOT path to ${MKLROOT}") file(COPY ${MKLROOT}/lib/libiomp5.so DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY ${MKLROOT}/lib/libmklml_gnu.so DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) From 7f5305859f01f524f88ea2d395b77dd8f0b2fa39 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 18 Jul 2018 16:53:13 +0200 Subject: [PATCH 22/78] Added more verbose info to BLAS choices --- cmake/ChooseBlas.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/ChooseBlas.cmake b/cmake/ChooseBlas.cmake index abc8b32d4f19..c71d88f9ac47 100644 --- a/cmake/ChooseBlas.cmake +++ b/cmake/ChooseBlas.cmake @@ -38,7 +38,7 @@ function(try_mkldnn) return() endif() - message(STATUS "Adding MKLDNN to the build") + message(STATUS "Adding MKLDNN to the build due to USE_MKLDNN=${USE_MKLDNN} and MKL_FOUND=${MKL_FOUND}") # CPU architecture (e.g., C5) can't run on another architecture (e.g., g3). if(NOT MSVC) @@ -78,7 +78,7 @@ function(try_mkl) return() endif() - message(STATUS "Trying to enable MKL framework due to USE_MKL_IF_AVAILABLE") + message(STATUS "Trying to enable MKL framework due to USE_MKL_IF_AVAILABLE=${USE_MKL_IF_AVAILABLE}") find_package(MKL) @@ -120,7 +120,7 @@ function(try_mklml) return() endif() - message(STATUS "Trying to enable MKLML framework due to USE_MKLML") + message(STATUS "Trying to enable MKLML framework due to USE_MKLML=${USE_MKLML}") include(${CMAKE_CURRENT_LIST_DIR}/DownloadMKLML.cmake) find_package(MKLML REQUIRED) From cfd1a81a5d9ac2d2a3740aa33281fc72585d07e0 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 18 Jul 2018 17:05:50 +0200 Subject: [PATCH 23/78] Improved MKL switch --- CMakeLists.txt | 4 ++-- cmake/ChooseBlas.cmake | 13 ++++++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 36e0163ec90c..0e80ef0e1f0b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -116,12 +116,12 @@ mxnet_option(USE_MKL_IF_AVAILABLE "Use MKL if found" ON) # If the full MKL library could not be found the thinner subset MKLML will be downloaded # unless switched off explicitly. # Note: The same limitation on hardware as for MKL applies for MKLML as well. -mxnet_option(USE_MKLML "Use MKLML subset of MKL instead of mkl, will be downloaded" ON IF ${USE_MKL_IF_AVAILABLE}) +mxnet_option(USE_MKLML "Use MKLML subset of MKL instead of mkl, will be downloaded" ON) # If either MKL of MKLML is present MKLDNN can be utilised from the 3rdparty/mkldnn subrepo. # See more information here: https://github.com/intel/mkl-dnn # Note: The same limitation on hardware as for MKL and MKLDNN applies for MKLDNN as well. -mxnet_option(USE_MKLDNN "Use MKLDNN (requires MKLML or MKL)" ON IF ${USE_MKL_IF_AVAILABLE}) +mxnet_option(USE_MKLDNN "Use MKLDNN (requires MKLML or MKL)" ON) # Apple's mathematical framework, probably the best choice on a Mac if MKL/MKLML/MKLDNN # are not available. diff --git a/cmake/ChooseBlas.cmake b/cmake/ChooseBlas.cmake index c71d88f9ac47..06c33707311e 100644 --- a/cmake/ChooseBlas.cmake +++ b/cmake/ChooseBlas.cmake @@ -63,10 +63,6 @@ function(try_mkl) return() endif() - if(NOT ${USE_MKL_IF_AVAILABLE}) - return() - endif() - if(${CMAKE_CROSSCOMPILING}) message(WARNING "MKL with cross compilation is not supported, MKL will not be available") return() @@ -157,9 +153,12 @@ function(try_accelerate) endif() endfunction() -try_mkl() -try_mklml() -try_mkldnn() +if(${USE_MKL_IF_AVAILABLE}) + try_mkl() + try_mklml() + try_mkldnn() +endif() + try_accelerate() # cmake regexp does not support case insensitive match (?i) or //i From bd058a6f885e5f01ef3b93c003ac044c4a9cd16c Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 18 Jul 2018 17:41:27 +0200 Subject: [PATCH 24/78] Fixed docker build cmake MKL options and fixed LAPACK switch --- cmake/ChooseBlas.cmake | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/cmake/ChooseBlas.cmake b/cmake/ChooseBlas.cmake index 06c33707311e..e7658772cb35 100644 --- a/cmake/ChooseBlas.cmake +++ b/cmake/ChooseBlas.cmake @@ -174,7 +174,11 @@ if(BLAS MATCHES "[Aa][Tt][Ll][Aa][Ss]") add_definitions(-DMSHADOW_USE_CBLAS=1) add_definitions(-DMSHADOW_USE_MKL=0) - switch_lapack(${USE_LAPACK} AND ${Atlas_LAPACK_FOUND}) + if(${USE_LAPACK} AND ${Atlas_LAPACK_FOUND}) + switch_lapack(True) + else() + switch_lapack(False) + endif() return() endif() @@ -192,7 +196,11 @@ if(BLAS MATCHES "[Oo][Pp][Ee][Nn]") add_definitions(-DMSHADOW_USE_CBLAS=1) add_definitions(-DMSHADOW_USE_MKL=0) - switch_lapack(${USE_LAPACK} AND ${OpenBLAS_LAPACK_FOUND}) + if(${USE_LAPACK} AND ${OpenBLAS_LAPACK_FOUND}) + switch_lapack(True) + else() + switch_lapack(False) + endif() return() endif() @@ -213,7 +221,11 @@ if(BLAS MATCHES "[Mm][Kk][Ll]") set(CMAKE_REQUIRED_LIBRARIES ${MKL_LIBRARIES}) check_function_exists("cgees_" LAPACK_FOUND) - switch_lapack(${LAPACK_FOUND} OR False) + if(${LAPACK_FOUND}) + switch_lapack(True) + else() + switch_lapack(False) + endif() return() endif() @@ -238,9 +250,13 @@ if(BLAS MATCHES "([Aa][Pp][Pp][Ll][Ee]|[Aa][Cc][Cc][Ee][Ll][Ee][Rr][Aa][Tt][Ee]) add_definitions(-DMSHADOW_USE_CBLAS=1) add_definitions(-DMSHADOW_USE_MKL=0) - switch_lapack(${USE_LAPACK} AND ${Accelerate_LAPACK_FOUND}) - return() + if(${USE_LAPACK} AND ${Accelerate_LAPACK_FOUND}) + switch_lapack(True) + else() + switch_lapack(False) + endif() + return() endif() message(FATAL_ERROR "BLAS ${BLAS} not recognized") From 64c28dfec515c594e9a056bf93dfcf9d42ec3bec Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 18 Jul 2018 17:54:50 +0200 Subject: [PATCH 25/78] Added default value for LAPACK --- cmake/Modules/FindAccelerate.cmake | 3 ++- cmake/Modules/FindAtlas.cmake | 7 ++++--- cmake/Modules/FindOpenBLAS.cmake | 7 ++++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/cmake/Modules/FindAccelerate.cmake b/cmake/Modules/FindAccelerate.cmake index b5b8a72af20d..3bb6e69cc9a4 100644 --- a/cmake/Modules/FindAccelerate.cmake +++ b/cmake/Modules/FindAccelerate.cmake @@ -39,6 +39,8 @@ set(LOOKED_FOR Accelerate_CBLAS_INCLUDE_DIR ) +set(Accelerate_LAPACK_FOUND False) + if(Accelerate_NEED_LAPACK) message(STATUS "Looking for LAPACK support...") @@ -53,7 +55,6 @@ if(Accelerate_NEED_LAPACK) set(Accelerate_LAPACK_FOUND True) message(STATUS "LAPACK found") else() - set(Accelerate_LAPACK_FOUND False) message(WARNING "Apple's Accelerate LAPACK support could not be identified, \ LAPACK functionality will not be available") endif() diff --git a/cmake/Modules/FindAtlas.cmake b/cmake/Modules/FindAtlas.cmake index bbb27db29d96..f69e32d22acf 100644 --- a/cmake/Modules/FindAtlas.cmake +++ b/cmake/Modules/FindAtlas.cmake @@ -85,6 +85,10 @@ set(LOOKED_FOR Atlas_BLAS_LIBRARY ) +set(Atlas_LAPACK_FOUND False) +set(Atlas_CLAPACK_INCLUDE_DIR "") +set(Atlas_LAPACK_LIBRARY "") + if(Atlas_NEED_LAPACK) message(STATUS "Looking for LAPACK support...") @@ -109,9 +113,6 @@ if(Atlas_NEED_LAPACK) message(STATUS "LAPACK found") else() - set(Atlas_LAPACK_FOUND False) - set(Atlas_CLAPACK_INCLUDE_DIR "") - set(Atlas_LAPACK_LIBRARY "") message(WARNING "LAPACK with Atlas could not be found, LAPACK functionality will not be available") endif() diff --git a/cmake/Modules/FindOpenBLAS.cmake b/cmake/Modules/FindOpenBLAS.cmake index ceb76c04cea7..784bd1e678ea 100644 --- a/cmake/Modules/FindOpenBLAS.cmake +++ b/cmake/Modules/FindOpenBLAS.cmake @@ -111,6 +111,10 @@ set(LOOKED_FOR OpenBLAS_LIBRARY ) +set(OpenBLAS_LAPACK_FOUND False) +set(OpenBLAS_LAPACK_LIBRARY "") +set(OpenBLAS_LAPACK_INCLUDE_DIR "") + if(OpenBLAS_NEED_LAPACK) message(STATUS "Looking for LAPACK support...") @@ -136,9 +140,6 @@ if(OpenBLAS_NEED_LAPACK) ) message(STATUS "LAPACK found") else() - set(OpenBLAS_LAPACK_FOUND False) - set(OpenBLAS_LAPACK_LIBRARY "") - set(OpenBLAS_LAPACK_INCLUDE_DIR "") message(WARNING "OpenBlas has not been compiled with LAPACK support, LAPACK functionality will not be available") endif() From 605c640983aa4762ea6d17c063e1fb7a7ca6a457 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 18 Jul 2018 18:07:47 +0200 Subject: [PATCH 26/78] Added a workaround for cmake variables bug --- cmake/Modules/FindAtlas.cmake | 7 +++++-- cmake/Modules/FindOpenBLAS.cmake | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/cmake/Modules/FindAtlas.cmake b/cmake/Modules/FindAtlas.cmake index f69e32d22acf..ba284e4343f7 100644 --- a/cmake/Modules/FindAtlas.cmake +++ b/cmake/Modules/FindAtlas.cmake @@ -92,10 +92,11 @@ set(Atlas_LAPACK_LIBRARY "") if(Atlas_NEED_LAPACK) message(STATUS "Looking for LAPACK support...") - find_path(Atlas_CLAPACK_INCLUDE_DIR + # we need another variables (starting with __) because cmake will not overwrite it if already set + find_path(__Atlas_CLAPACK_INCLUDE_DIR NAMES clapack.h PATHS ${Atlas_INCLUDE_SEARCH_PATHS}) - find_library(Atlas_LAPACK_LIBRARY + find_library(__Atlas_LAPACK_LIBRARY NAMES lapack_r lapack lapack_atlas PATHS ${Atlas_LIB_SEARCH_PATHS}) @@ -105,6 +106,8 @@ if(Atlas_NEED_LAPACK) if(LAPACK_FOUND) set(Atlas_LAPACK_FOUND True) + set(Atlas_CLAPACK_INCLUDE_DIR ${__Atlas_CLAPACK_INCLUDE_DIR}) + set(Atlas_LAPACK_LIBRARY ${__Atlas_LAPACK_LIBRARY}) set(LOOKED_FOR ${LOOKED_FOR} diff --git a/cmake/Modules/FindOpenBLAS.cmake b/cmake/Modules/FindOpenBLAS.cmake index 784bd1e678ea..ef11346d6591 100644 --- a/cmake/Modules/FindOpenBLAS.cmake +++ b/cmake/Modules/FindOpenBLAS.cmake @@ -118,13 +118,14 @@ set(OpenBLAS_LAPACK_INCLUDE_DIR "") if(OpenBLAS_NEED_LAPACK) message(STATUS "Looking for LAPACK support...") - find_path(OpenBLAS_LAPACK_INCLUDE_DIR + # we need another variable (starting with __) because cmake will not overwrite it if already set + find_path(__OpenBLAS_LAPACK_INCLUDE_DIR NAMES lapacke.h PATHS ${OpenBLAS_INCLUDE_SEARCH_PATHS}) # OpenBLAS does not have a separate LAPACK library: https://github.com/xianyi/OpenBLAS/issues/296 # LAPACK if present in OpenBLAS build is included into libopenblas - set(OpenBLAS_LAPACK_LIBRARY ${OpenBLAS_LIBRARY}) + set(__OpenBLAS_LAPACK_LIBRARY ${OpenBLAS_LIBRARY}) set(CMAKE_REQUIRED_LIBRARIES ${OpenBLAS_LAPACK_LIBRARY}) include(CheckFunctionExists) @@ -132,6 +133,8 @@ if(OpenBLAS_NEED_LAPACK) if(LAPACK_FOUND) set(OpenBLAS_LAPACK_FOUND True) + set(OpenBLAS_LAPACK_INCLUDE_DIR ${__OpenBLAS_LAPACK_INCLUDE_DIR}) + set(OpenBLAS_LAPACK_LIBRARY ${__OpenBLAS_LAPACK_LIBRARY}) set(LOOKED_FOR ${LOOKED_FOR} From 99392da862c08952fe7fae53a6f506d407998b19 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 18 Jul 2018 18:22:25 +0200 Subject: [PATCH 27/78] Add deafult variable for MKL_FOUND --- cmake/ChooseBlas.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmake/ChooseBlas.cmake b/cmake/ChooseBlas.cmake index e7658772cb35..bd2be353152c 100644 --- a/cmake/ChooseBlas.cmake +++ b/cmake/ChooseBlas.cmake @@ -154,6 +154,8 @@ function(try_accelerate) endfunction() if(${USE_MKL_IF_AVAILABLE}) + set(MKL_FOUND False) + try_mkl() try_mklml() try_mkldnn() From c0fe60fa711bea854bf71d36131bae024c700277 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 18 Jul 2018 18:36:18 +0200 Subject: [PATCH 28/78] Fixed a bug with MKLML --- cmake/ChooseBlas.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/ChooseBlas.cmake b/cmake/ChooseBlas.cmake index bd2be353152c..8ef36f1d1bbe 100644 --- a/cmake/ChooseBlas.cmake +++ b/cmake/ChooseBlas.cmake @@ -123,7 +123,7 @@ function(try_mklml) include_directories(SYSTEM ${MKLML_INCLUDE_DIRS}) set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${MKLML_LIBRARIES} PARENT_SCOPE) - set(MKL_FOUND ${MKL_FOUND} PARENT_SCOPE) + set(MKL_FOUND ${MKLML_FOUND} PARENT_SCOPE) set(MKLROOT ${MKLROOT} PARENT_SCOPE) set(BLAS MKL PARENT_SCOPE) From e443d3002e4010fbdec0e125475cbb18b9fbbdba Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 18 Jul 2018 19:21:54 +0200 Subject: [PATCH 29/78] Fixed main MKL includes and linking --- CMakeLists.txt | 5 +++-- cmake/ChooseBlas.cmake | 10 ++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0e80ef0e1f0b..9de0fc24a819 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,8 @@ cmake_minimum_required(VERSION 3.0.2) +message(STATUS "CMAKE_VERSION=${CMAKE_VERSION}") +message(STATUS "CMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}") + # workaround to store CMAKE_CROSSCOMPILING because is getting reset by the project command if(${CMAKE_CROSSCOMPILING}) set(__CMAKE_CROSSCOMPILING ${CMAKE_CROSSCOMPILING}) @@ -136,8 +139,6 @@ mxnet_option(USE_APPLE_ACCELERATE_IF_AVAILABLE "Use Apple Accelerate framework i # functionality off if not found. mxnet_option(USE_LAPACK "Build with lapack support" ON) -message(STATUS "CMAKE_SYSTEM_NAME ${CMAKE_SYSTEM_NAME}") - if(NOT mxnet_LINKER_LIBS) set(mxnet_LINKER_LIBS "") endif(NOT mxnet_LINKER_LIBS) diff --git a/cmake/ChooseBlas.cmake b/cmake/ChooseBlas.cmake index 8ef36f1d1bbe..deac20349f8e 100644 --- a/cmake/ChooseBlas.cmake +++ b/cmake/ChooseBlas.cmake @@ -81,6 +81,9 @@ function(try_mkl) if(${MKL_FOUND}) message(STATUS "MKL framework found") + include_directories(SYSTEM ${MKL_INCLUDE_DIR}) + set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${MKL_LIBRARIES} PARENT_SCOPE) + set(MKL_FOUND ${MKL_FOUND} PARENT_SCOPE) set(MKLROOT ${MKLROOT} PARENT_SCOPE) @@ -210,10 +213,9 @@ endif() if(BLAS MATCHES "[Mm][Kk][Ll]") message(STATUS "Using MKL for BLAS") - find_package(MKL REQUIRED) - - include_directories(SYSTEM ${MKL_INCLUDE_DIR}) - set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${MKL_LIBRARIES}) + if(NOT ${MKL_FOUND}) + message(FATAL_ERROR "Blas set to MKL but it could not be found") + endif() add_definitions(-DMSHADOW_USE_CBLAS=0) add_definitions(-DMSHADOW_USE_MKL=1) From 5f67a8d8750a6c9766ed195da32b729c53610cbb Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Thu, 19 Jul 2018 20:25:27 +0200 Subject: [PATCH 30/78] Fixed cmake system name only available after project --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9de0fc24a819..cdd639c99b8c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,6 @@ cmake_minimum_required(VERSION 3.0.2) message(STATUS "CMAKE_VERSION=${CMAKE_VERSION}") -message(STATUS "CMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}") # workaround to store CMAKE_CROSSCOMPILING because is getting reset by the project command if(${CMAKE_CROSSCOMPILING}) @@ -19,6 +18,8 @@ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/build/private/local_config.cmake) include(${CMAKE_CURRENT_SOURCE_DIR}/build/private/local_config.cmake) endif() +message(STATUS "CMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}") + include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Utils.cmake) #Some things have order. This must be put in front alone From 34e448bc58df99f774da79f7e1ffc1a9cbbd522c Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Fri, 20 Jul 2018 13:40:27 +0200 Subject: [PATCH 31/78] Cleanup and fix path environment variables --- cmake/ChooseBlas.cmake | 18 +++++++------- cmake/DownloadMKLML.cmake | 4 +-- cmake/Modules/FindAccelerate.cmake | 13 ++++++---- cmake/Modules/FindAtlas.cmake | 40 ++++++++++++++++-------------- cmake/Modules/FindMKL.cmake | 38 ++++++++++++++-------------- cmake/Modules/FindMKLML.cmake | 6 ++--- cmake/Modules/FindOpenBLAS.cmake | 35 +++++++++++++++----------- 7 files changed, 84 insertions(+), 70 deletions(-) diff --git a/cmake/ChooseBlas.cmake b/cmake/ChooseBlas.cmake index deac20349f8e..bf15a50e2356 100644 --- a/cmake/ChooseBlas.cmake +++ b/cmake/ChooseBlas.cmake @@ -41,7 +41,7 @@ function(try_mkldnn) message(STATUS "Adding MKLDNN to the build due to USE_MKLDNN=${USE_MKLDNN} and MKL_FOUND=${MKL_FOUND}") # CPU architecture (e.g., C5) can't run on another architecture (e.g., g3). - if(NOT MSVC) + if(NOT ${MSVC}) set(ARCH_OPT_FLAGS ${ARCH_OPT_FLAGS} "-mtune=generic" PARENT_SCOPE) endif() @@ -136,11 +136,11 @@ function(try_mklml) endfunction() function(try_accelerate) - if(NOT APPLE) + if(NOT ${APPLE}) return() endif() - if(BLAS MATCHES "[Mm][Kk][Ll]") + if(${BLAS} MATCHES "[Mm][Kk][Ll]") return() endif() @@ -167,7 +167,7 @@ endif() try_accelerate() # cmake regexp does not support case insensitive match (?i) or //i -if(BLAS MATCHES "[Aa][Tt][Ll][Aa][Ss]") +if(${BLAS} MATCHES "[Aa][Tt][Ll][Aa][Ss]") message(STATUS "Using Atlas for BLAS") set(Atlas_NEED_LAPACK ${USE_LAPACK}) @@ -188,7 +188,7 @@ if(BLAS MATCHES "[Aa][Tt][Ll][Aa][Ss]") return() endif() -if(BLAS MATCHES "[Oo][Pp][Ee][Nn]") +if(${BLAS} MATCHES "[Oo][Pp][Ee][Nn]") message(STATUS "Using OpenBLAS for BLAS") set(OpenBLAS_NEED_LAPACK ${USE_LAPACK}) @@ -210,7 +210,7 @@ if(BLAS MATCHES "[Oo][Pp][Ee][Nn]") return() endif() -if(BLAS MATCHES "[Mm][Kk][Ll]") +if(${BLAS} MATCHES "[Mm][Kk][Ll]") message(STATUS "Using MKL for BLAS") if(NOT ${MKL_FOUND}) @@ -220,7 +220,7 @@ if(BLAS MATCHES "[Mm][Kk][Ll]") add_definitions(-DMSHADOW_USE_CBLAS=0) add_definitions(-DMSHADOW_USE_MKL=1) - if(USE_LAPACK) + if(${USE_LAPACK}) include(CheckFunctionExists) set(CMAKE_REQUIRED_LIBRARIES ${MKL_LIBRARIES}) check_function_exists("cgees_" LAPACK_FOUND) @@ -235,8 +235,8 @@ if(BLAS MATCHES "[Mm][Kk][Ll]") endif() endif() -if(BLAS MATCHES "([Aa][Pp][Pp][Ll][Ee]|[Aa][Cc][Cc][Ee][Ll][Ee][Rr][Aa][Tt][Ee])") - if(NOT APPLE) +if(${BLAS} MATCHES "([Aa][Pp][Pp][Ll][Ee]|[Aa][Cc][Cc][Ee][Ll][Ee][Rr][Aa][Tt][Ee])") + if(NOT ${APPLE}) message(FATAL_ERROR "Apple Accelerate framework's BLAS feature is available only on macOS") return() endif() diff --git a/cmake/DownloadMKLML.cmake b/cmake/DownloadMKLML.cmake index 129c50851b94..dd47a0791fb5 100644 --- a/cmake/DownloadMKLML.cmake +++ b/cmake/DownloadMKLML.cmake @@ -19,7 +19,7 @@ message(STATUS "Downloading MKLML...") -if(MSVC) +if(${MSVC}) set(MKL_NAME "mklml_win_2018.0.3.20180406") file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.zip" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.zip" EXPECTED_MD5 "8DD73E7D3F19F004551809824C4E8970" SHOW_PROGRESS) @@ -36,7 +36,7 @@ if(MSVC) file(COPY ${MKLROOT}/lib/mklml.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY ${MKLROOT}/lib/mklml.lib DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY ${CMAKE_SOURCE_DIR}/3rdparty/mkldnn/config_template.vcxproj.user DESTINATION ${CMAKE_SOURCE_DIR}) -elseif(APPLE) +elseif(${APPLE}) set(MKL_NAME "mklml_mac_2018.0.3.20180406") file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.tgz" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" EXPECTED_MD5 "23a6f7fd04fb1fa6de0d52a2ec5a2a14" SHOW_PROGRESS) diff --git a/cmake/Modules/FindAccelerate.cmake b/cmake/Modules/FindAccelerate.cmake index 3bb6e69cc9a4..d40f3952e60f 100644 --- a/cmake/Modules/FindAccelerate.cmake +++ b/cmake/Modules/FindAccelerate.cmake @@ -23,7 +23,9 @@ # Accelerate_INCLUDE_DIR # Accelerate_LIBRARIES -file(TO_CMAKE_PATH "$ENV{Accelerate_HOME}" Accelerate_HOME) +if($ENV{Accelerate_HOME}) + file(TO_CMAKE_PATH "$ENV{Accelerate_HOME}" Accelerate_HOME) +endif() set(Accelerate_INCLUDE_SEARCH_PATHS /System/Library/Frameworks/Accelerate.framework/Versions/Current/Frameworks/vecLib.framework/Versions/Current @@ -39,9 +41,9 @@ set(LOOKED_FOR Accelerate_CBLAS_INCLUDE_DIR ) -set(Accelerate_LAPACK_FOUND False) +set(Accelerate_LAPACK_FOUND) -if(Accelerate_NEED_LAPACK) +if(${Accelerate_NEED_LAPACK}) message(STATUS "Looking for LAPACK support...") # Apple's vecLib should contain LAPACK functionalities included in the Accelerate @@ -51,7 +53,7 @@ if(Accelerate_NEED_LAPACK) set(CMAKE_REQUIRED_LIBRARIES "-framework Accelerate") check_function_exists("cgees_" LAPACK_FOUND) - if(LAPACK_FOUND) + if(${LAPACK_FOUND}) set(Accelerate_LAPACK_FOUND True) message(STATUS "LAPACK found") else() @@ -64,9 +66,10 @@ endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Accelerate DEFAULT_MSG ${LOOKED_FOR}) -if(Accelerate_FOUND) +if(${Accelerate_FOUND}) set(Accelerate_INCLUDE_DIR ${Accelerate_CBLAS_INCLUDE_DIR}) set(Accelerate_LIBRARIES "-framework Accelerate") + mark_as_advanced(${LOOKED_FOR}) message(STATUS "Found Apple Accelerate (include: ${Accelerate_CBLAS_INCLUDE_DIR}, library: ${Accelerate_LIBRARIES})") diff --git a/cmake/Modules/FindAtlas.cmake b/cmake/Modules/FindAtlas.cmake index ba284e4343f7..23e12ff0cba5 100644 --- a/cmake/Modules/FindAtlas.cmake +++ b/cmake/Modules/FindAtlas.cmake @@ -29,9 +29,15 @@ # Atlas_INCLUDE_DIRS # Atlas_LIBRARIES -file(TO_CMAKE_PATH "$ENV{CROSS_ROOT}" CROSS_ROOT) +if($ENV{Atlas_ROOT_DIR}) + file(TO_CMAKE_PATH "$ENV{Atlas_ROOT_DIR}" CROSS_ROOT) +endif() + +if($ENV{CROSS_ROOT}) + file(TO_CMAKE_PATH "$ENV{CROSS_ROOT}" CROSS_ROOT) +endif() -if(CMAKE_CROSSCOMPILING) +if(${CMAKE_CROSSCOMPILING}) set(Atlas_INCLUDE_SEARCH_PATHS ${CROSS_ROOT} ${CROSS_ROOT}/include @@ -39,17 +45,17 @@ if(CMAKE_CROSSCOMPILING) endif() set(Atlas_INCLUDE_SEARCH_PATHS - $ENV{Atlas_INCLUDE_SEARCH_PATHS} + ${Atlas_INCLUDE_SEARCH_PATHS} - $ENV{Atlas_ROOT_DIR} - $ENV{Atlas_ROOT_DIR}/include - $ENV{Atlas_ROOT_DIR}/include/atlas + ${Atlas_ROOT_DIR} + ${Atlas_ROOT_DIR}/include + ${Atlas_ROOT_DIR}/include/atlas /usr/include/atlas /usr/include/atlas-base ) -if(CMAKE_CROSSCOMPILING) +if(${CMAKE_CROSSCOMPILING}) set(Atlas_LIB_SEARCH_PATHS ${CROSS_ROOT} ${CROSS_ROOT}/lib @@ -58,10 +64,10 @@ if(CMAKE_CROSSCOMPILING) endif() set(Atlas_LIB_SEARCH_PATHS - $ENV{Atlas_LIB_SEARCH_PATHS} + ${Atlas_LIB_SEARCH_PATHS} - $ENV{Atlas_ROOT_DIR} - $ENV{Atlas_ROOT_DIR}/lib + ${Atlas_ROOT_DIR} + ${Atlas_ROOT_DIR}/lib /usr/lib/atlas /usr/lib/atlas-base @@ -85,11 +91,11 @@ set(LOOKED_FOR Atlas_BLAS_LIBRARY ) -set(Atlas_LAPACK_FOUND False) -set(Atlas_CLAPACK_INCLUDE_DIR "") -set(Atlas_LAPACK_LIBRARY "") +set(Atlas_LAPACK_FOUND) +set(Atlas_CLAPACK_INCLUDE_DIR) +set(Atlas_LAPACK_LIBRARY) -if(Atlas_NEED_LAPACK) +if(${Atlas_NEED_LAPACK}) message(STATUS "Looking for LAPACK support...") # we need another variables (starting with __) because cmake will not overwrite it if already set @@ -104,7 +110,7 @@ if(Atlas_NEED_LAPACK) include(CheckFunctionExists) check_function_exists("cgees_" LAPACK_FOUND) - if(LAPACK_FOUND) + if(${LAPACK_FOUND}) set(Atlas_LAPACK_FOUND True) set(Atlas_CLAPACK_INCLUDE_DIR ${__Atlas_CLAPACK_INCLUDE_DIR}) set(Atlas_LAPACK_LIBRARY ${__Atlas_LAPACK_LIBRARY}) @@ -124,13 +130,11 @@ endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Atlas DEFAULT_MSG ${LOOKED_FOR}) -if(Atlas_FOUND) +if(${Atlas_FOUND}) set(Atlas_INCLUDE_DIRS ${Atlas_CBLAS_INCLUDE_DIR} ${Atlas_CLAPACK_INCLUDE_DIR}) set(Atlas_LIBRARIES ${Atlas_LAPACK_LIBRARY} ${Atlas_CBLAS_LIBRARY} ${Atlas_BLAS_LIBRARY}) mark_as_advanced(${LOOKED_FOR}) message(STATUS "Found Atlas (include: ${Atlas_INCLUDE_DIRS}, libraries: ${Atlas_LIBRARIES})") -else() - message(FATAL "Atlas not found, looked for ${LOOKED_FOR}") endif() diff --git a/cmake/Modules/FindMKL.cmake b/cmake/Modules/FindMKL.cmake index de76052c506e..1bd038db15e3 100644 --- a/cmake/Modules/FindMKL.cmake +++ b/cmake/Modules/FindMKL.cmake @@ -32,17 +32,19 @@ # MKL_LIBRARIES : the libraries to link against. # -file(TO_CMAKE_PATH "$ENV{MKLROOT}" MKLROOT) +if($ENV{MKLROOT}) + file(TO_CMAKE_PATH "$ENV{MKLROOT}" MKLROOT) +endif() # ---[ Root folders set(INTEL_ROOT "/opt/intel" CACHE PATH "Folder contains intel libs") # ---[ Options mxnet_option(MKL_USE_SINGLE_DYNAMIC_LIBRARY "Use single dynamic library interface" ON) -mxnet_option(MKL_USE_STATIC_LIBS "Use static libraries" OFF IF NOT MKL_USE_SINGLE_DYNAMIC_LIBRARY) -mxnet_option(MKL_MULTI_THREADED "Use multi-threading" ON IF NOT MKL_USE_SINGLE_DYNAMIC_LIBRARY) +mxnet_option(MKL_USE_STATIC_LIBS "Use static libraries" OFF IF NOT ${MKL_USE_SINGLE_DYNAMIC_LIBRARY}) +mxnet_option(MKL_MULTI_THREADED "Use multi-threading" ON IF NOT ${MKL_USE_SINGLE_DYNAMIC_LIBRARY}) mxnet_option(MKL_USE_ILP64 "Use ilp64 data model" OFF) -mxnet_option(MKL_USE_CLUSTER "Use cluster functions" OFF IF CMAKE_SIZEOF_VOID_P EQUAL 4) +mxnet_option(MKL_USE_CLUSTER "Use cluster functions" OFF IF ${CMAKE_SIZEOF_VOID_P} EQUAL 4) set(MKL_INCLUDE_SEARCH_PATHS ${MKL_INCLUDE_SEARCH_PATHS} @@ -58,52 +60,52 @@ find_path(MKL_INCLUDE_DIR mkl.h PATHS ${MKL_INCLUDE_SEARCH_PATHS} PATH_SUFFIXES include) -if(NOT MKLROOT) +if(NOT ${MKLROOT}) get_filename_component(MKLROOT ${MKL_INCLUDE_DIR} DIRECTORY) endif() set(__looked_for MKL_INCLUDE_DIR) # ---[ Find libraries -if(CMAKE_SIZEOF_VOID_P EQUAL 4) +if(${CMAKE_SIZEOF_VOID_P} EQUAL 4) set(__path_suffixes lib lib/ia32) else() set(__path_suffixes lib lib/intel64) endif() set(__mkl_libs "") -if(MKL_USE_SINGLE_DYNAMIC_LIBRARY) +if(${MKL_USE_SINGLE_DYNAMIC_LIBRARY}) list(APPEND __mkl_libs rt) else() - if(CMAKE_SIZEOF_VOID_P EQUAL 4) - if(WIN32) + if(${CMAKE_SIZEOF_VOID_P} EQUAL 4) + if(${WIN32}) list(APPEND __mkl_libs intel_c) else() list(APPEND __mkl_libs intel) - if(CMAKE_COMPILER_IS_GNUFORTRAN) + if(${CMAKE_COMPILER_IS_GNUFORTRAN}) list(APPEND __mkl_libs gf) endif() endif() else() set(__mkl_lib64_suffix "lp64") - if(MKL_USE_ILP64) + if(${MKL_USE_ILP64}) set(__mkl_lib64_suffix "ilp64") add_definitions(-DMKL_ILP64) endif() list(APPEND __mkl_libs "intel_${__mkl_lib64_suffix}") - if(CMAKE_COMPILER_IS_GNUFORTRAN) + if(${CMAKE_COMPILER_IS_GNUFORTRAN}) list(APPEND __mkl_libs "gf_${__mkl_lib64_suffix}") endif() endif() - if(MKL_MULTI_THREADED) + if(${MKL_MULTI_THREADED}) list(APPEND __mkl_libs intel_thread) else() list(APPEND __mkl_libs sequential) endif() list(APPEND __mkl_libs core) - if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND MKL_USE_CLUSTER) + if(${CMAKE_SIZEOF_VOID_P} EQUAL 8 AND ${MKL_USE_CLUSTER}) list(APPEND __mkl_libs cdft_core) endif() endif() @@ -113,7 +115,7 @@ foreach(__lib ${__mkl_libs}) set(__mkl_lib "mkl_${__lib}") string(TOUPPER ${__mkl_lib} __mkl_lib_upper) - if(MKL_USE_STATIC_LIBS) + if(${MKL_USE_STATIC_LIBS}) set(__mkl_lib "lib${__mkl_lib}.a") endif() @@ -129,14 +131,14 @@ foreach(__lib ${__mkl_libs}) endforeach() -if(NOT MKL_USE_SINGLE_DYNAMIC_LIBRARY) +if(NOT ${MKL_USE_SINGLE_DYNAMIC_LIBRARY}) if(MKL_USE_STATIC_LIBS) set(__iomp5_libs iomp5 libiomp5mt.lib) else() set(__iomp5_libs iomp5 libiomp5md.lib) endif() - if(WIN32) + if(${WIN32}) find_path(INTEL_INCLUDE_DIR omp.h PATHS ${INTEL_ROOT} PATH_SUFFIXES include) list(APPEND __looked_for INTEL_INCLUDE_DIR) endif() @@ -153,7 +155,7 @@ endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(MKL DEFAULT_MSG ${__looked_for}) -if(MKL_FOUND) +if(${MKL_FOUND}) message(STATUS "Found MKL (include: ${MKL_INCLUDE_DIR}, lib: ${MKL_LIBRARIES}") endif() diff --git a/cmake/Modules/FindMKLML.cmake b/cmake/Modules/FindMKLML.cmake index 0e3f220fba37..d63592a4651b 100644 --- a/cmake/Modules/FindMKLML.cmake +++ b/cmake/Modules/FindMKLML.cmake @@ -41,7 +41,7 @@ set(MKLML_INCLUDE_SEARCH_PATHS ) # ---[ Find libraries -if(CMAKE_SIZEOF_VOID_P EQUAL 4) +if(${CMAKE_SIZEOF_VOID_P} EQUAL 4) set(PATH_SUFFIXES lib lib/ia32) else() set(PATH_SUFFIXES lib lib/intel64) @@ -65,7 +65,7 @@ set(LOOKED_FOR set(MKLML_LIBS iomp5) -if(WIN32) +if(${WIN32}) list(APPEND MKLML_LIBS mklml) elseif(APPLE) list(APPEND MKLML_LIBS mklml) @@ -94,7 +94,7 @@ endforeach() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(MKLML DEFAULT_MSG ${LOOKED_FOR}) -if(MKLML_FOUND) +if(${MKLML_FOUND}) set(MKLML_INCLUDE_DIRS ${MKLML_INCLUDE_DIR}) mark_as_advanced(${LOOKED_FOR}) diff --git a/cmake/Modules/FindOpenBLAS.cmake b/cmake/Modules/FindOpenBLAS.cmake index ef11346d6591..71f8b6b7d50f 100644 --- a/cmake/Modules/FindOpenBLAS.cmake +++ b/cmake/Modules/FindOpenBLAS.cmake @@ -29,11 +29,19 @@ # OpenBLAS_INCLUDE_DIRS # OpenBLAS_LIBRARIES -file(TO_CMAKE_PATH "$ENV{OpenBLAS_HOME}" OpenBLAS_HOME) -file(TO_CMAKE_PATH "$ENV{OpenBLAS}" OpenBLAS_DIR) -file(TO_CMAKE_PATH "$ENV{CROSS_ROOT}" CROSS_ROOT) +if($ENV{OpenBLAS_HOME}) + file(TO_CMAKE_PATH "$ENV{OpenBLAS_HOME}" OpenBLAS_HOME) +endif() + +if($ENV{OpenBLAS}) + file(TO_CMAKE_PATH "$ENV{OpenBLAS}" OpenBLAS_DIR) +endif() + +if($ENV{CROSS_ROOT}) + file(TO_CMAKE_PATH "$ENV{CROSS_ROOT}" CROSS_ROOT) +endif() -if(CMAKE_CROSSCOMPILING) +if(${CMAKE_CROSSCOMPILING}) set(OpenBLAS_INCLUDE_SEARCH_PATHS ${CROSS_ROOT} ${CROSS_ROOT}/include @@ -59,7 +67,7 @@ set(OpenBLAS_INCLUDE_SEARCH_PATHS ${PROJECT_SOURCE_DIR}/thirdparty/OpenBLAS/include ) -if(CMAKE_CROSSCOMPILING) +if(${CMAKE_CROSSCOMPILING}) set(Open_BLAS_LIB_SEARCH_PATHS ${CROSS_ROOT} ${CROSS_ROOT}/include @@ -69,9 +77,6 @@ endif() set(OpenBLAS_LIB_SEARCH_PATHS ${OpenBLAS_LIB_SEARCH_PATHS} - ${OpenBLAS_DIR} - ${OpenBLAS_DIR}/lib - ${OpenBLAS_DIR}/lib64 ${OpenBLAS_HOME} ${OpenBLAS_HOME}/lib ${OpenBLAS_HOME}/lib64 @@ -97,7 +102,7 @@ find_path(OpenBLAS_INCLUDE_DIR set(OpenBLAS_LIB_NAMES openblas libopenblas.dll.a libopenblas.dll) -if(CMAKE_CROSSCOMPILING) +if(${CMAKE_CROSSCOMPILING}) message(STATUS "Will try link to OpenBLAS statically for cross compilation") set(OpenBLAS_LIB_NAMES libopenblas.a ${OpenBLAS_LIB_NAMES}) endif() @@ -111,11 +116,11 @@ set(LOOKED_FOR OpenBLAS_LIBRARY ) -set(OpenBLAS_LAPACK_FOUND False) -set(OpenBLAS_LAPACK_LIBRARY "") -set(OpenBLAS_LAPACK_INCLUDE_DIR "") +set(OpenBLAS_LAPACK_FOUND) +set(OpenBLAS_LAPACK_LIBRARY) +set(OpenBLAS_LAPACK_INCLUDE_DIR) -if(OpenBLAS_NEED_LAPACK) +if(${OpenBLAS_NEED_LAPACK}) message(STATUS "Looking for LAPACK support...") # we need another variable (starting with __) because cmake will not overwrite it if already set @@ -131,7 +136,7 @@ if(OpenBLAS_NEED_LAPACK) include(CheckFunctionExists) check_function_exists("cheev_" LAPACK_FOUND) - if(LAPACK_FOUND) + if(${LAPACK_FOUND}) set(OpenBLAS_LAPACK_FOUND True) set(OpenBLAS_LAPACK_INCLUDE_DIR ${__OpenBLAS_LAPACK_INCLUDE_DIR}) set(OpenBLAS_LAPACK_LIBRARY ${__OpenBLAS_LAPACK_LIBRARY}) @@ -151,7 +156,7 @@ endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(OpenBLAS DEFAULT_MSG ${LOOKED_FOR}) -if(OpenBLAS_FOUND) +if(${OpenBLAS_FOUND}) set(OpenBLAS_INCLUDE_DIRS ${OpenBLAS_INCLUDE_DIR} ${OpenBLAS_LAPACK_INCLUDE_DIR}) set(OpenBLAS_LIBRARIES ${OpenBLAS_LIBRARY} ${OpenBLAS_LAPACK_LIBRARY}) From 85194faeae859ff26363816e299bde5932f7322d Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Fri, 20 Jul 2018 13:44:24 +0200 Subject: [PATCH 32/78] Removed unnessesary copying of lib files --- cmake/DownloadMKLML.cmake | 2 -- 1 file changed, 2 deletions(-) diff --git a/cmake/DownloadMKLML.cmake b/cmake/DownloadMKLML.cmake index dd47a0791fb5..fb8a6494f285 100644 --- a/cmake/DownloadMKLML.cmake +++ b/cmake/DownloadMKLML.cmake @@ -32,9 +32,7 @@ if(${MSVC}) message(STATUS "Setting MKLROOT path to ${MKLROOT}") file(COPY ${MKLROOT}/lib/libiomp5md.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - file(COPY ${MKLROOT}/lib/libiomp5md.lib DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY ${MKLROOT}/lib/mklml.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - file(COPY ${MKLROOT}/lib/mklml.lib DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY ${CMAKE_SOURCE_DIR}/3rdparty/mkldnn/config_template.vcxproj.user DESTINATION ${CMAKE_SOURCE_DIR}) elseif(${APPLE}) set(MKL_NAME "mklml_mac_2018.0.3.20180406") From 892388cda85dd0c701b5622e08cf7e5133431b4b Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Fri, 20 Jul 2018 14:18:04 +0200 Subject: [PATCH 33/78] Cleaned up all if statements, added quotes to path variables --- CMakeLists.txt | 4 +- cmake/{ChooseBlas.cmake => ChooseBLAS.cmake} | 62 ++++++++++---------- cmake/DownloadMKLML.cmake | 4 +- cmake/Modules/FindAccelerate.cmake | 2 +- cmake/Modules/FindAtlas.cmake | 32 +++++----- cmake/Modules/FindMKL.cmake | 46 ++++++++------- cmake/Modules/FindMKLML.cmake | 18 +++--- cmake/Modules/FindOpenBLAS.cmake | 42 ++++++------- 8 files changed, 106 insertions(+), 104 deletions(-) rename cmake/{ChooseBlas.cmake => ChooseBLAS.cmake} (86%) diff --git a/CMakeLists.txt b/CMakeLists.txt index cdd639c99b8c..f63fd81afbf5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,7 +82,7 @@ mxnet_option(ENABLE_TESTCOVERAGE "Enable compilation with test coverage metric # * MKL # * Apple # -# See cmake/ChooseBlas.cmake file for the options. +# See cmake/ChooseBLAS.cmake file for the options. # # Intel's MKL (Math Kernel Library) is one of the most powerful math libraries # https://software.intel.com/en-us/mkl @@ -160,7 +160,7 @@ if("$ENV{VERBOSE}" STREQUAL "1") endif() # ---[ BLAS -include(cmake/ChooseBlas.cmake) +include(cmake/ChooseBLAS.cmake) if(USE_CUDA AND NOT USE_OLDCMAKECUDA) message(STATUS "CMake version '${CMAKE_VERSION}' using generator '${CMAKE_GENERATOR}'") diff --git a/cmake/ChooseBlas.cmake b/cmake/ChooseBLAS.cmake similarity index 86% rename from cmake/ChooseBlas.cmake rename to cmake/ChooseBLAS.cmake index bf15a50e2356..a6dd877b7e5d 100644 --- a/cmake/ChooseBlas.cmake +++ b/cmake/ChooseBLAS.cmake @@ -18,8 +18,8 @@ set(BLAS "Open" CACHE STRING "Selected BLAS library") set_property(CACHE BLAS PROPERTY STRINGS "Atlas;Open;MKL;Apple") -function(switch_lapack enable) - if(${enable}) +function(switch_lapack ENABLE) + if(ENABLE) message(STATUS "Enabling LAPACK functionality") add_definitions(-DMXNET_USE_LAPACK=1) else() @@ -29,11 +29,11 @@ endfunction() function(try_mkldnn) - if(NOT ${USE_MKLDNN}) + if(NOT USE_MKLDNN) return() endif() - if(NOT ${MKL_FOUND}) + if(NOT MKL_FOUND) message(WARNING "MKLDNN requires either MKL or MKLML, MKLDNN will not be available") return() endif() @@ -41,7 +41,7 @@ function(try_mkldnn) message(STATUS "Adding MKLDNN to the build due to USE_MKLDNN=${USE_MKLDNN} and MKL_FOUND=${MKL_FOUND}") # CPU architecture (e.g., C5) can't run on another architecture (e.g., g3). - if(NOT ${MSVC}) + if(NOT MSVC) set(ARCH_OPT_FLAGS ${ARCH_OPT_FLAGS} "-mtune=generic" PARENT_SCOPE) endif() @@ -59,16 +59,16 @@ function(try_mkldnn) endfunction() function(try_mkl) - if(${USE_MKLML}) + if(USE_MKLML) return() endif() - if(${CMAKE_CROSSCOMPILING}) + if(CMAKE_CROSSCOMPILING) message(WARNING "MKL with cross compilation is not supported, MKL will not be available") return() endif() - if(NOT ${SYSTEM_ARCHITECTURE} STREQUAL "x86_64") + if(NOT SYSTEM_ARCHITECTURE STREQUAL "x86_64") message(WARNING "MKL is supported only for desktop platforms (SYSTEM_ARCHITECTURE=${SYSTEM_ARCHITECTURE}), \ MKL will not be available") return() @@ -78,7 +78,7 @@ function(try_mkl) find_package(MKL) - if(${MKL_FOUND}) + if(MKL_FOUND) message(STATUS "MKL framework found") include_directories(SYSTEM ${MKL_INCLUDE_DIR}) @@ -95,25 +95,25 @@ function(try_mkl) endfunction() function(try_mklml) - if(NOT ${USE_MKLML}) + if(NOT USE_MKLML) return() endif() - if(${CMAKE_CROSSCOMPILING}) + if(CMAKE_CROSSCOMPILING) message(STATUS "MKLML is supported only for desktop platforms, skipping...") return() endif() - if(${MKL_FOUND}) + if(MKL_FOUND) return() endif() - if(${CMAKE_CROSSCOMPILING}) + if(CMAKE_CROSSCOMPILING) message(WARNING "MKLML with cross compilation is not supported, MKLML will not be available") return() endif() - if(NOT ${SYSTEM_ARCHITECTURE} STREQUAL "x86_64") + if(NOT SYSTEM_ARCHITECTURE STREQUAL "x86_64") message(WARNING "MKLML is supported only for desktop platforms (SYSTEM_ARCHITECTURE=${SYSTEM_ARCHITECTURE}), \ MKLML will not be available") return() @@ -136,18 +136,18 @@ function(try_mklml) endfunction() function(try_accelerate) - if(NOT ${APPLE}) + if(NOT APPLE) return() endif() - if(${BLAS} MATCHES "[Mm][Kk][Ll]") + if(BLAS MATCHES "[Mm][Kk][Ll]") return() endif() - if(${USE_APPLE_ACCELERATE_IF_AVAILABLE}) + if(USE_APPLE_ACCELERATE_IF_AVAILABLE) message(STATUS "Trying to enable Apple Accelerate framework due to USE_ACCELERATE_IF_AVAILABLE") find_package(Accelerate) - if(${Accelerate_FOUND}) + if(Accelerate_FOUND) message(STATUS "Apple Accelerate framework found") set(BLAS Accelerate PARENT_SCOPE) else() @@ -156,8 +156,8 @@ function(try_accelerate) endif() endfunction() -if(${USE_MKL_IF_AVAILABLE}) - set(MKL_FOUND False) +if(USE_MKL_IF_AVAILABLE) + set(MKL_FOUND) try_mkl() try_mklml() @@ -167,7 +167,7 @@ endif() try_accelerate() # cmake regexp does not support case insensitive match (?i) or //i -if(${BLAS} MATCHES "[Aa][Tt][Ll][Aa][Ss]") +if(BLAS MATCHES "[Aa][Tt][Ll][Aa][Ss]") message(STATUS "Using Atlas for BLAS") set(Atlas_NEED_LAPACK ${USE_LAPACK}) @@ -179,7 +179,7 @@ if(${BLAS} MATCHES "[Aa][Tt][Ll][Aa][Ss]") add_definitions(-DMSHADOW_USE_CBLAS=1) add_definitions(-DMSHADOW_USE_MKL=0) - if(${USE_LAPACK} AND ${Atlas_LAPACK_FOUND}) + if(USE_LAPACK AND Atlas_LAPACK_FOUND) switch_lapack(True) else() switch_lapack(False) @@ -188,7 +188,7 @@ if(${BLAS} MATCHES "[Aa][Tt][Ll][Aa][Ss]") return() endif() -if(${BLAS} MATCHES "[Oo][Pp][Ee][Nn]") +if(BLAS MATCHES "[Oo][Pp][Ee][Nn]") message(STATUS "Using OpenBLAS for BLAS") set(OpenBLAS_NEED_LAPACK ${USE_LAPACK}) @@ -201,7 +201,7 @@ if(${BLAS} MATCHES "[Oo][Pp][Ee][Nn]") add_definitions(-DMSHADOW_USE_CBLAS=1) add_definitions(-DMSHADOW_USE_MKL=0) - if(${USE_LAPACK} AND ${OpenBLAS_LAPACK_FOUND}) + if(USE_LAPACK AND OpenBLAS_LAPACK_FOUND) switch_lapack(True) else() switch_lapack(False) @@ -210,22 +210,22 @@ if(${BLAS} MATCHES "[Oo][Pp][Ee][Nn]") return() endif() -if(${BLAS} MATCHES "[Mm][Kk][Ll]") +if(BLAS MATCHES "[Mm][Kk][Ll]") message(STATUS "Using MKL for BLAS") - if(NOT ${MKL_FOUND}) + if(NOT MKL_FOUND) message(FATAL_ERROR "Blas set to MKL but it could not be found") endif() add_definitions(-DMSHADOW_USE_CBLAS=0) add_definitions(-DMSHADOW_USE_MKL=1) - if(${USE_LAPACK}) + if(USE_LAPACK) include(CheckFunctionExists) set(CMAKE_REQUIRED_LIBRARIES ${MKL_LIBRARIES}) check_function_exists("cgees_" LAPACK_FOUND) - if(${LAPACK_FOUND}) + if(LAPACK_FOUND) switch_lapack(True) else() switch_lapack(False) @@ -235,8 +235,8 @@ if(${BLAS} MATCHES "[Mm][Kk][Ll]") endif() endif() -if(${BLAS} MATCHES "([Aa][Pp][Pp][Ll][Ee]|[Aa][Cc][Cc][Ee][Ll][Ee][Rr][Aa][Tt][Ee])") - if(NOT ${APPLE}) +if(BLAS MATCHES "([Aa][Pp][Pp][Ll][Ee]|[Aa][Cc][Cc][Ee][Ll][Ee][Rr][Aa][Tt][Ee])") + if(NOT APPLE) message(FATAL_ERROR "Apple Accelerate framework's BLAS feature is available only on macOS") return() endif() @@ -254,7 +254,7 @@ if(${BLAS} MATCHES "([Aa][Pp][Pp][Ll][Ee]|[Aa][Cc][Cc][Ee][Ll][Ee][Rr][Aa][Tt][E add_definitions(-DMSHADOW_USE_CBLAS=1) add_definitions(-DMSHADOW_USE_MKL=0) - if(${USE_LAPACK} AND ${Accelerate_LAPACK_FOUND}) + if(USE_LAPACK AND Accelerate_LAPACK_FOUND) switch_lapack(True) else() switch_lapack(False) diff --git a/cmake/DownloadMKLML.cmake b/cmake/DownloadMKLML.cmake index fb8a6494f285..ae1b3ea214e1 100644 --- a/cmake/DownloadMKLML.cmake +++ b/cmake/DownloadMKLML.cmake @@ -19,7 +19,7 @@ message(STATUS "Downloading MKLML...") -if(${MSVC}) +if(MSVC) set(MKL_NAME "mklml_win_2018.0.3.20180406") file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.zip" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.zip" EXPECTED_MD5 "8DD73E7D3F19F004551809824C4E8970" SHOW_PROGRESS) @@ -34,7 +34,7 @@ if(${MSVC}) file(COPY ${MKLROOT}/lib/libiomp5md.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY ${MKLROOT}/lib/mklml.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY ${CMAKE_SOURCE_DIR}/3rdparty/mkldnn/config_template.vcxproj.user DESTINATION ${CMAKE_SOURCE_DIR}) -elseif(${APPLE}) +elseif(APPLE) set(MKL_NAME "mklml_mac_2018.0.3.20180406") file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.tgz" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" EXPECTED_MD5 "23a6f7fd04fb1fa6de0d52a2ec5a2a14" SHOW_PROGRESS) diff --git a/cmake/Modules/FindAccelerate.cmake b/cmake/Modules/FindAccelerate.cmake index d40f3952e60f..0a0b56b4aee0 100644 --- a/cmake/Modules/FindAccelerate.cmake +++ b/cmake/Modules/FindAccelerate.cmake @@ -73,5 +73,5 @@ if(${Accelerate_FOUND}) mark_as_advanced(${LOOKED_FOR}) message(STATUS "Found Apple Accelerate (include: ${Accelerate_CBLAS_INCLUDE_DIR}, library: ${Accelerate_LIBRARIES})") -endif(Accelerate_FOUND) +endif() diff --git a/cmake/Modules/FindAtlas.cmake b/cmake/Modules/FindAtlas.cmake index 23e12ff0cba5..46436302fb9c 100644 --- a/cmake/Modules/FindAtlas.cmake +++ b/cmake/Modules/FindAtlas.cmake @@ -37,19 +37,19 @@ if($ENV{CROSS_ROOT}) file(TO_CMAKE_PATH "$ENV{CROSS_ROOT}" CROSS_ROOT) endif() -if(${CMAKE_CROSSCOMPILING}) +if(CMAKE_CROSSCOMPILING) set(Atlas_INCLUDE_SEARCH_PATHS - ${CROSS_ROOT} - ${CROSS_ROOT}/include + "${CROSS_ROOT}" + "${CROSS_ROOT}/include" ) endif() set(Atlas_INCLUDE_SEARCH_PATHS ${Atlas_INCLUDE_SEARCH_PATHS} - ${Atlas_ROOT_DIR} - ${Atlas_ROOT_DIR}/include - ${Atlas_ROOT_DIR}/include/atlas + "${Atlas_ROOT_DIR}" + "${Atlas_ROOT_DIR}/include" + "${Atlas_ROOT_DIR}/include/atlas" /usr/include/atlas /usr/include/atlas-base @@ -57,17 +57,17 @@ set(Atlas_INCLUDE_SEARCH_PATHS if(${CMAKE_CROSSCOMPILING}) set(Atlas_LIB_SEARCH_PATHS - ${CROSS_ROOT} - ${CROSS_ROOT}/lib - ${CROSS_ROOT}/lib64 + "${CROSS_ROOT}" + "${CROSS_ROOT}/lib" + "${CROSS_ROOT}/lib64" ) endif() set(Atlas_LIB_SEARCH_PATHS ${Atlas_LIB_SEARCH_PATHS} - ${Atlas_ROOT_DIR} - ${Atlas_ROOT_DIR}/lib + "${Atlas_ROOT_DIR}" + "${Atlas_ROOT_DIR}/lib" /usr/lib/atlas /usr/lib/atlas-base @@ -95,7 +95,7 @@ set(Atlas_LAPACK_FOUND) set(Atlas_CLAPACK_INCLUDE_DIR) set(Atlas_LAPACK_LIBRARY) -if(${Atlas_NEED_LAPACK}) +if(Atlas_NEED_LAPACK) message(STATUS "Looking for LAPACK support...") # we need another variables (starting with __) because cmake will not overwrite it if already set @@ -110,7 +110,7 @@ if(${Atlas_NEED_LAPACK}) include(CheckFunctionExists) check_function_exists("cgees_" LAPACK_FOUND) - if(${LAPACK_FOUND}) + if(LAPACK_FOUND) set(Atlas_LAPACK_FOUND True) set(Atlas_CLAPACK_INCLUDE_DIR ${__Atlas_CLAPACK_INCLUDE_DIR}) set(Atlas_LAPACK_LIBRARY ${__Atlas_LAPACK_LIBRARY}) @@ -130,9 +130,9 @@ endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Atlas DEFAULT_MSG ${LOOKED_FOR}) -if(${Atlas_FOUND}) - set(Atlas_INCLUDE_DIRS ${Atlas_CBLAS_INCLUDE_DIR} ${Atlas_CLAPACK_INCLUDE_DIR}) - set(Atlas_LIBRARIES ${Atlas_LAPACK_LIBRARY} ${Atlas_CBLAS_LIBRARY} ${Atlas_BLAS_LIBRARY}) +if(Atlas_FOUND) + set(Atlas_INCLUDE_DIRS "${Atlas_CBLAS_INCLUDE_DIR}" "${Atlas_CLAPACK_INCLUDE_DIR}") + set(Atlas_LIBRARIES "${Atlas_LAPACK_LIBRARY}" "${Atlas_CBLAS_LIBRARY}" "${Atlas_BLAS_LIBRARY}") mark_as_advanced(${LOOKED_FOR}) diff --git a/cmake/Modules/FindMKL.cmake b/cmake/Modules/FindMKL.cmake index 1bd038db15e3..1a24f714b7b2 100644 --- a/cmake/Modules/FindMKL.cmake +++ b/cmake/Modules/FindMKL.cmake @@ -49,10 +49,10 @@ mxnet_option(MKL_USE_CLUSTER "Use cluster functions" OFF IF ${CMAKE_SIZEOF_VOID_ set(MKL_INCLUDE_SEARCH_PATHS ${MKL_INCLUDE_SEARCH_PATHS} - ${MKLROOT} - ${MKLROOT}/include + "${MKLROOT}" + "${MKLROOT}/include" - ${INTEL_ROOT}/mkl + "${INTEL_ROOT}/mkl" ) # ---[ Find include dir @@ -60,52 +60,52 @@ find_path(MKL_INCLUDE_DIR mkl.h PATHS ${MKL_INCLUDE_SEARCH_PATHS} PATH_SUFFIXES include) -if(NOT ${MKLROOT}) - get_filename_component(MKLROOT ${MKL_INCLUDE_DIR} DIRECTORY) +if(NOT MKLROOT) + get_filename_component(MKLROOT "${MKL_INCLUDE_DIR}" DIRECTORY) endif() set(__looked_for MKL_INCLUDE_DIR) # ---[ Find libraries -if(${CMAKE_SIZEOF_VOID_P} EQUAL 4) +if(CMAKE_SIZEOF_VOID_P EQUAL 4) set(__path_suffixes lib lib/ia32) else() set(__path_suffixes lib lib/intel64) endif() set(__mkl_libs "") -if(${MKL_USE_SINGLE_DYNAMIC_LIBRARY}) +if(MKL_USE_SINGLE_DYNAMIC_LIBRARY) list(APPEND __mkl_libs rt) else() - if(${CMAKE_SIZEOF_VOID_P} EQUAL 4) - if(${WIN32}) + if(CMAKE_SIZEOF_VOID_P EQUAL 4) + if(WIN32) list(APPEND __mkl_libs intel_c) else() list(APPEND __mkl_libs intel) - if(${CMAKE_COMPILER_IS_GNUFORTRAN}) + if(CMAKE_COMPILER_IS_GNUFORTRAN) list(APPEND __mkl_libs gf) endif() endif() else() set(__mkl_lib64_suffix "lp64") - if(${MKL_USE_ILP64}) + if(MKL_USE_ILP64) set(__mkl_lib64_suffix "ilp64") add_definitions(-DMKL_ILP64) endif() list(APPEND __mkl_libs "intel_${__mkl_lib64_suffix}") - if(${CMAKE_COMPILER_IS_GNUFORTRAN}) + if(CMAKE_COMPILER_IS_GNUFORTRAN) list(APPEND __mkl_libs "gf_${__mkl_lib64_suffix}") endif() endif() - if(${MKL_MULTI_THREADED}) + if(MKL_MULTI_THREADED) list(APPEND __mkl_libs intel_thread) else() list(APPEND __mkl_libs sequential) endif() list(APPEND __mkl_libs core) - if(${CMAKE_SIZEOF_VOID_P} EQUAL 8 AND ${MKL_USE_CLUSTER}) + if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND MKL_USE_CLUSTER) list(APPEND __mkl_libs cdft_core) endif() endif() @@ -115,13 +115,13 @@ foreach(__lib ${__mkl_libs}) set(__mkl_lib "mkl_${__lib}") string(TOUPPER ${__mkl_lib} __mkl_lib_upper) - if(${MKL_USE_STATIC_LIBS}) + if(MKL_USE_STATIC_LIBS) set(__mkl_lib "lib${__mkl_lib}.a") endif() find_library(${__mkl_lib_upper}_LIBRARY NAMES ${__mkl_lib} - PATHS ${MKLROOT} + PATHS "${MKLROOT}" PATH_SUFFIXES ${__path_suffixes} DOC "The path to Intel(R) MKL ${__mkl_lib} library") mark_as_advanced(${__mkl_lib_upper}_LIBRARY) @@ -131,22 +131,24 @@ foreach(__lib ${__mkl_libs}) endforeach() -if(NOT ${MKL_USE_SINGLE_DYNAMIC_LIBRARY}) +if(NOT MKL_USE_SINGLE_DYNAMIC_LIBRARY) if(MKL_USE_STATIC_LIBS) set(__iomp5_libs iomp5 libiomp5mt.lib) else() set(__iomp5_libs iomp5 libiomp5md.lib) endif() - if(${WIN32}) - find_path(INTEL_INCLUDE_DIR omp.h PATHS ${INTEL_ROOT} PATH_SUFFIXES include) + if(WIN32) + find_path(INTEL_INCLUDE_DIR omp.h + PATHS "${INTEL_ROOT}" + PATH_SUFFIXES include) list(APPEND __looked_for INTEL_INCLUDE_DIR) endif() find_library(MKL_RTL_LIBRARY ${__iomp5_libs} - PATHS ${INTEL_RTL_ROOT} ${INTEL_ROOT}/compiler ${MKLROOT} ${MKLROOT}/.. ${MKLROOT}/../compiler + PATHS "${INTEL_RTL_ROOT}" "${INTEL_ROOT}/compiler" "${MKLROOT}" "${MKLROOT}/.." "${MKLROOT}/../compiler" PATH_SUFFIXES ${__path_suffixes} - DOC "Path to Path to OpenMP runtime library") + DOC "Path to OpenMP runtime library") list(APPEND __looked_for MKL_RTL_LIBRARY) list(APPEND MKL_LIBRARIES ${MKL_RTL_LIBRARY}) @@ -155,7 +157,7 @@ endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(MKL DEFAULT_MSG ${__looked_for}) -if(${MKL_FOUND}) +if(MKL_FOUND) message(STATUS "Found MKL (include: ${MKL_INCLUDE_DIR}, lib: ${MKL_LIBRARIES}") endif() diff --git a/cmake/Modules/FindMKLML.cmake b/cmake/Modules/FindMKLML.cmake index d63592a4651b..98c36a96e6ba 100644 --- a/cmake/Modules/FindMKLML.cmake +++ b/cmake/Modules/FindMKLML.cmake @@ -34,14 +34,14 @@ endif() set(MKLML_INCLUDE_SEARCH_PATHS ${MKLML_INCLUDE_SEARCH_PATHS} - ${MKLROOT} - ${MKLROOT}/include + "${MKLROOT}" + "${MKLROOT}/include" - ${PROJECT_SOURCE_DIR}/3rdparty/MKLML/include + "${PROJECT_SOURCE_DIR}/3rdparty/MKLML/include" ) # ---[ Find libraries -if(${CMAKE_SIZEOF_VOID_P} EQUAL 4) +if(CMAKE_SIZEOF_VOID_P EQUAL 4) set(PATH_SUFFIXES lib lib/ia32) else() set(PATH_SUFFIXES lib lib/intel64) @@ -50,9 +50,9 @@ endif() set(MKLML_LIB_SEARCH_PATHS ${MKLML_LIB_SEARCH_PATHS} - ${MKLROOT} + "${MKLROOT}" - ${PROJECT_SOURCE_DIR}/3rdparty/MKLML/lib + "${PROJECT_SOURCE_DIR}/3rdparty/MKLML/lib" ) find_path(MKLML_INCLUDE_DIR @@ -65,7 +65,7 @@ set(LOOKED_FOR set(MKLML_LIBS iomp5) -if(${WIN32}) +if(WIN32) list(APPEND MKLML_LIBS mklml) elseif(APPLE) list(APPEND MKLML_LIBS mklml) @@ -94,8 +94,8 @@ endforeach() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(MKLML DEFAULT_MSG ${LOOKED_FOR}) -if(${MKLML_FOUND}) - set(MKLML_INCLUDE_DIRS ${MKLML_INCLUDE_DIR}) +if(MKLML_FOUND) + set(MKLML_INCLUDE_DIRS "${MKLML_INCLUDE_DIR}") mark_as_advanced(${LOOKED_FOR}) diff --git a/cmake/Modules/FindOpenBLAS.cmake b/cmake/Modules/FindOpenBLAS.cmake index 71f8b6b7d50f..ceed7738a46c 100644 --- a/cmake/Modules/FindOpenBLAS.cmake +++ b/cmake/Modules/FindOpenBLAS.cmake @@ -41,18 +41,18 @@ if($ENV{CROSS_ROOT}) file(TO_CMAKE_PATH "$ENV{CROSS_ROOT}" CROSS_ROOT) endif() -if(${CMAKE_CROSSCOMPILING}) +if(CMAKE_CROSSCOMPILING) set(OpenBLAS_INCLUDE_SEARCH_PATHS - ${CROSS_ROOT} - ${CROSS_ROOT}/include + "${CROSS_ROOT}" + "${CROSS_ROOT}/include" ) endif() set(OpenBLAS_INCLUDE_SEARCH_PATHS ${OpenBLAS_INCLUDE_SEARCH_PATHS} - ${OpenBLAS_HOME} - ${OpenBLAS_HOME}/include + "${OpenBLAS_HOME}" + "${OpenBLAS_HOME}/include" /usr/include /usr/include/openblas @@ -63,23 +63,23 @@ set(OpenBLAS_INCLUDE_SEARCH_PATHS /opt/OpenBLAS/include /usr/local/opt/openblas/include - ${PROJECT_SOURCE_DIR}/3rdparty/OpenBLAS/include - ${PROJECT_SOURCE_DIR}/thirdparty/OpenBLAS/include + "${PROJECT_SOURCE_DIR}/3rdparty/OpenBLAS/include" + "${PROJECT_SOURCE_DIR}/thirdparty/OpenBLAS/include" ) -if(${CMAKE_CROSSCOMPILING}) +if(CMAKE_CROSSCOMPILING) set(Open_BLAS_LIB_SEARCH_PATHS - ${CROSS_ROOT} - ${CROSS_ROOT}/include + "${CROSS_ROOT}" + "${CROSS_ROOT}/include" ) endif() set(OpenBLAS_LIB_SEARCH_PATHS ${OpenBLAS_LIB_SEARCH_PATHS} - ${OpenBLAS_HOME} - ${OpenBLAS_HOME}/lib - ${OpenBLAS_HOME}/lib64 + "${OpenBLAS_HOME}" + "${OpenBLAS_HOME}/lib" + "${OpenBLAS_HOME}/lib64" /lib/ /lib/openblas-base @@ -92,8 +92,8 @@ set(OpenBLAS_LIB_SEARCH_PATHS /opt/OpenBLAS/lib /usr/local/opt/openblas/lib - ${PROJECT_SOURCE_DIR}/3rdparty/OpenBLAS/lib - ${PROJECT_SOURCE_DIR}/thirdparty/OpenBLAS/lib + "${PROJECT_SOURCE_DIR}/3rdparty/OpenBLAS/lib" + "${PROJECT_SOURCE_DIR}/thirdparty/OpenBLAS/lib" ) find_path(OpenBLAS_INCLUDE_DIR @@ -102,7 +102,7 @@ find_path(OpenBLAS_INCLUDE_DIR set(OpenBLAS_LIB_NAMES openblas libopenblas.dll.a libopenblas.dll) -if(${CMAKE_CROSSCOMPILING}) +if(CMAKE_CROSSCOMPILING) message(STATUS "Will try link to OpenBLAS statically for cross compilation") set(OpenBLAS_LIB_NAMES libopenblas.a ${OpenBLAS_LIB_NAMES}) endif() @@ -120,7 +120,7 @@ set(OpenBLAS_LAPACK_FOUND) set(OpenBLAS_LAPACK_LIBRARY) set(OpenBLAS_LAPACK_INCLUDE_DIR) -if(${OpenBLAS_NEED_LAPACK}) +if(OpenBLAS_NEED_LAPACK) message(STATUS "Looking for LAPACK support...") # we need another variable (starting with __) because cmake will not overwrite it if already set @@ -136,7 +136,7 @@ if(${OpenBLAS_NEED_LAPACK}) include(CheckFunctionExists) check_function_exists("cheev_" LAPACK_FOUND) - if(${LAPACK_FOUND}) + if(LAPACK_FOUND) set(OpenBLAS_LAPACK_FOUND True) set(OpenBLAS_LAPACK_INCLUDE_DIR ${__OpenBLAS_LAPACK_INCLUDE_DIR}) set(OpenBLAS_LAPACK_LIBRARY ${__OpenBLAS_LAPACK_LIBRARY}) @@ -156,9 +156,9 @@ endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(OpenBLAS DEFAULT_MSG ${LOOKED_FOR}) -if(${OpenBLAS_FOUND}) - set(OpenBLAS_INCLUDE_DIRS ${OpenBLAS_INCLUDE_DIR} ${OpenBLAS_LAPACK_INCLUDE_DIR}) - set(OpenBLAS_LIBRARIES ${OpenBLAS_LIBRARY} ${OpenBLAS_LAPACK_LIBRARY}) +if(OpenBLAS_FOUND) + set(OpenBLAS_INCLUDE_DIRS "${OpenBLAS_INCLUDE_DIR}" "${OpenBLAS_LAPACK_INCLUDE_DIR}") + set(OpenBLAS_LIBRARIES "${OpenBLAS_LIBRARY}" "${OpenBLAS_LAPACK_LIBRARY}") mark_as_advanced(${LOOKED_FOR}) From 1e4addc3cb0cfdabbef6d529d9f17eaa99dc42b8 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Fri, 20 Jul 2018 15:41:03 +0200 Subject: [PATCH 34/78] Cleaned variables --- CMakeLists.txt | 4 ++-- cmake/Modules/FindAccelerate.cmake | 6 +++--- cmake/Modules/FindOpenBLAS.cmake | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f63fd81afbf5..7c452b008bbd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,14 +3,14 @@ cmake_minimum_required(VERSION 3.0.2) message(STATUS "CMAKE_VERSION=${CMAKE_VERSION}") # workaround to store CMAKE_CROSSCOMPILING because is getting reset by the project command -if(${CMAKE_CROSSCOMPILING}) +if(CMAKE_CROSSCOMPILING) set(__CMAKE_CROSSCOMPILING ${CMAKE_CROSSCOMPILING}) set(__CMAKE_CROSSCOMPILING_OVERRIDE ON) endif() project(mxnet C CXX) -if(${__CMAKE_CROSSCOMPILING_OVERRIDE}) +if(__CMAKE_CROSSCOMPILING_OVERRIDE) set(CMAKE_CROSSCOMPILING ${__CMAKE_CROSSCOMPILING}) endif() diff --git a/cmake/Modules/FindAccelerate.cmake b/cmake/Modules/FindAccelerate.cmake index 0a0b56b4aee0..89fcc18be1ae 100644 --- a/cmake/Modules/FindAccelerate.cmake +++ b/cmake/Modules/FindAccelerate.cmake @@ -43,7 +43,7 @@ set(LOOKED_FOR set(Accelerate_LAPACK_FOUND) -if(${Accelerate_NEED_LAPACK}) +if(Accelerate_NEED_LAPACK) message(STATUS "Looking for LAPACK support...") # Apple's vecLib should contain LAPACK functionalities included in the Accelerate @@ -53,7 +53,7 @@ if(${Accelerate_NEED_LAPACK}) set(CMAKE_REQUIRED_LIBRARIES "-framework Accelerate") check_function_exists("cgees_" LAPACK_FOUND) - if(${LAPACK_FOUND}) + if(LAPACK_FOUND) set(Accelerate_LAPACK_FOUND True) message(STATUS "LAPACK found") else() @@ -66,7 +66,7 @@ endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Accelerate DEFAULT_MSG ${LOOKED_FOR}) -if(${Accelerate_FOUND}) +if(Accelerate_FOUND) set(Accelerate_INCLUDE_DIR ${Accelerate_CBLAS_INCLUDE_DIR}) set(Accelerate_LIBRARIES "-framework Accelerate") diff --git a/cmake/Modules/FindOpenBLAS.cmake b/cmake/Modules/FindOpenBLAS.cmake index ceed7738a46c..68aeb49a5d05 100644 --- a/cmake/Modules/FindOpenBLAS.cmake +++ b/cmake/Modules/FindOpenBLAS.cmake @@ -132,7 +132,7 @@ if(OpenBLAS_NEED_LAPACK) # LAPACK if present in OpenBLAS build is included into libopenblas set(__OpenBLAS_LAPACK_LIBRARY ${OpenBLAS_LIBRARY}) - set(CMAKE_REQUIRED_LIBRARIES ${OpenBLAS_LAPACK_LIBRARY}) + set(CMAKE_REQUIRED_LIBRARIES ${__OpenBLAS_LAPACK_LIBRARY}) include(CheckFunctionExists) check_function_exists("cheev_" LAPACK_FOUND) From 629d9b35af6cccd4394e1c2dc9c79e3a0ba55079 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Fri, 20 Jul 2018 16:05:07 +0200 Subject: [PATCH 35/78] Added status output --- ci/docker/Dockerfile.build.android_armv7 | 1 - ci/docker/Dockerfile.build.android_armv8 | 4 +++- ci/docker/Dockerfile.build.armv6 | 1 - ci/docker/Dockerfile.build.armv7 | 1 - ci/docker/Dockerfile.build.armv8 | 1 - ci/docker/Dockerfile.build.jetson | 1 - cmake/Modules/FindAccelerate.cmake | 1 + cmake/Modules/FindAtlas.cmake | 4 +++- cmake/Modules/FindMKL.cmake | 1 + cmake/Modules/FindMKLML.cmake | 1 + cmake/Modules/FindOpenBLAS.cmake | 6 ++---- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/ci/docker/Dockerfile.build.android_armv7 b/ci/docker/Dockerfile.build.android_armv7 index 799e29c99127..ab4fce98936b 100644 --- a/ci/docker/Dockerfile.build.android_armv7 +++ b/ci/docker/Dockerfile.build.android_armv7 @@ -71,7 +71,6 @@ COPY install/android_armv7_openblas.sh /work/deps RUN /work/deps/android_armv7_openblas.sh ENV OpenBLAS_HOME=${CROSS_ROOT} -ENV OpenBLAS_DIR=${CROSS_ROOT} WORKDIR /work diff --git a/ci/docker/Dockerfile.build.android_armv8 b/ci/docker/Dockerfile.build.android_armv8 index 2c2c71c003f0..e6a93aa57636 100644 --- a/ci/docker/Dockerfile.build.android_armv8 +++ b/ci/docker/Dockerfile.build.android_armv8 @@ -73,7 +73,9 @@ ENV CXX=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-clang++ # Build ARM dependencies. COPY install/android_arm64_openblas.sh /work/ RUN /work/android_arm64_openblas.sh -ENV CPLUS_INCLUDE_PATH /work/deps/OpenBLAS + +ENV OpenBLAS_HOME=${CROSS_ROOT} + WORKDIR /work/build COPY runtime_functions.sh /work/ diff --git a/ci/docker/Dockerfile.build.armv6 b/ci/docker/Dockerfile.build.armv6 index 78071fa33992..d19bcc54e9e3 100644 --- a/ci/docker/Dockerfile.build.armv6 +++ b/ci/docker/Dockerfile.build.armv6 @@ -33,7 +33,6 @@ COPY install/arm_openblas.sh /work/ RUN /work/arm_openblas.sh ENV OpenBLAS_HOME=${CROSS_ROOT} -ENV OpenBLAS_DIR=${CROSS_ROOT} COPY install/deb_ubuntu_ccache.sh /work/ RUN /work/deb_ubuntu_ccache.sh diff --git a/ci/docker/Dockerfile.build.armv7 b/ci/docker/Dockerfile.build.armv7 index 9a23a5dbefee..3207ff4450e7 100644 --- a/ci/docker/Dockerfile.build.armv7 +++ b/ci/docker/Dockerfile.build.armv7 @@ -33,7 +33,6 @@ COPY install/arm_openblas.sh /work/ RUN /work/arm_openblas.sh ENV OpenBLAS_HOME=${CROSS_ROOT} -ENV OpenBLAS_DIR=${CROSS_ROOT} COPY install/deb_ubuntu_ccache.sh /work/ RUN /work/deb_ubuntu_ccache.sh diff --git a/ci/docker/Dockerfile.build.armv8 b/ci/docker/Dockerfile.build.armv8 index 46cc229d5904..b7c58575945a 100644 --- a/ci/docker/Dockerfile.build.armv8 +++ b/ci/docker/Dockerfile.build.armv8 @@ -37,7 +37,6 @@ COPY install/arm_openblas.sh /work/ RUN /work/arm_openblas.sh ENV OpenBLAS_HOME=${CROSS_ROOT} -ENV OpenBLAS_DIR=${CROSS_ROOT} COPY install/deb_ubuntu_ccache.sh /work/ RUN /work/deb_ubuntu_ccache.sh diff --git a/ci/docker/Dockerfile.build.jetson b/ci/docker/Dockerfile.build.jetson index 15518cd6f22e..2010ff6d94b6 100644 --- a/ci/docker/Dockerfile.build.jetson +++ b/ci/docker/Dockerfile.build.jetson @@ -42,7 +42,6 @@ COPY install/arm_openblas.sh /work/ RUN /work/arm_openblas.sh ENV OpenBLAS_HOME=${CROSS_ROOT} -ENV OpenBLAS_DIR=${CROSS_ROOT} COPY install/deb_ubuntu_ccache.sh /work/ RUN /work/deb_ubuntu_ccache.sh diff --git a/cmake/Modules/FindAccelerate.cmake b/cmake/Modules/FindAccelerate.cmake index 89fcc18be1ae..568b227cee67 100644 --- a/cmake/Modules/FindAccelerate.cmake +++ b/cmake/Modules/FindAccelerate.cmake @@ -25,6 +25,7 @@ if($ENV{Accelerate_HOME}) file(TO_CMAKE_PATH "$ENV{Accelerate_HOME}" Accelerate_HOME) + message(STATUS "Accelerate_HOME=${Accelerate_HOME}") endif() set(Accelerate_INCLUDE_SEARCH_PATHS diff --git a/cmake/Modules/FindAtlas.cmake b/cmake/Modules/FindAtlas.cmake index 46436302fb9c..bf8601c925da 100644 --- a/cmake/Modules/FindAtlas.cmake +++ b/cmake/Modules/FindAtlas.cmake @@ -30,11 +30,13 @@ # Atlas_LIBRARIES if($ENV{Atlas_ROOT_DIR}) - file(TO_CMAKE_PATH "$ENV{Atlas_ROOT_DIR}" CROSS_ROOT) + file(TO_CMAKE_PATH "$ENV{Atlas_ROOT_DIR}" Atlas_ROOT_DIR) + message(STATUS "Atlas_ROOT_DIR=${Atlas_ROOT_DIR}") endif() if($ENV{CROSS_ROOT}) file(TO_CMAKE_PATH "$ENV{CROSS_ROOT}" CROSS_ROOT) + message(STATUS "CROSS_ROOT=${CROSS_ROOT}") endif() if(CMAKE_CROSSCOMPILING) diff --git a/cmake/Modules/FindMKL.cmake b/cmake/Modules/FindMKL.cmake index 1a24f714b7b2..e52b7423b0e7 100644 --- a/cmake/Modules/FindMKL.cmake +++ b/cmake/Modules/FindMKL.cmake @@ -34,6 +34,7 @@ if($ENV{MKLROOT}) file(TO_CMAKE_PATH "$ENV{MKLROOT}" MKLROOT) + message(STATUS "MKLROOT=${MKLROOT}") endif() # ---[ Root folders diff --git a/cmake/Modules/FindMKLML.cmake b/cmake/Modules/FindMKLML.cmake index 98c36a96e6ba..27c340ee59f5 100644 --- a/cmake/Modules/FindMKLML.cmake +++ b/cmake/Modules/FindMKLML.cmake @@ -29,6 +29,7 @@ if($ENV{MKLROOT}) file(TO_CMAKE_PATH "$ENV{MKLROOT}" MKLROOT) + message(STATUS "MKLROOT=${MKLROOT}") endif() set(MKLML_INCLUDE_SEARCH_PATHS diff --git a/cmake/Modules/FindOpenBLAS.cmake b/cmake/Modules/FindOpenBLAS.cmake index 68aeb49a5d05..af64094853a8 100644 --- a/cmake/Modules/FindOpenBLAS.cmake +++ b/cmake/Modules/FindOpenBLAS.cmake @@ -31,14 +31,12 @@ if($ENV{OpenBLAS_HOME}) file(TO_CMAKE_PATH "$ENV{OpenBLAS_HOME}" OpenBLAS_HOME) -endif() - -if($ENV{OpenBLAS}) - file(TO_CMAKE_PATH "$ENV{OpenBLAS}" OpenBLAS_DIR) + message(STATUS "OpenBLAS_HOME=${OpenBLAS_HOME}") endif() if($ENV{CROSS_ROOT}) file(TO_CMAKE_PATH "$ENV{CROSS_ROOT}" CROSS_ROOT) + message(STATUS "CROSS_ROOT=${CROSS_ROOT}") endif() if(CMAKE_CROSSCOMPILING) From 2820e8321353db8ead1b2cd393eb84a15aa4aa04 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 8 Aug 2018 16:01:46 +0200 Subject: [PATCH 36/78] Fixed mshadow MKL/MKLML finding --- cmake/ChooseBLAS.cmake | 6 +++--- cmake/Modules/FindMKL.cmake | 4 ++++ cmake/Modules/FindMKLML.cmake | 13 +++++++++---- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/cmake/ChooseBLAS.cmake b/cmake/ChooseBLAS.cmake index a6dd877b7e5d..cdf8c847cdbd 100644 --- a/cmake/ChooseBLAS.cmake +++ b/cmake/ChooseBLAS.cmake @@ -123,10 +123,10 @@ function(try_mklml) include(${CMAKE_CURRENT_LIST_DIR}/DownloadMKLML.cmake) find_package(MKLML REQUIRED) - include_directories(SYSTEM ${MKLML_INCLUDE_DIRS}) - set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${MKLML_LIBRARIES} PARENT_SCOPE) + include_directories(SYSTEM ${MKL_INCLUDE_DIRS}) + set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${MKL_LIBRARIES} PARENT_SCOPE) - set(MKL_FOUND ${MKLML_FOUND} PARENT_SCOPE) + set(MKL_FOUND ${MKL_FOUND} PARENT_SCOPE) set(MKLROOT ${MKLROOT} PARENT_SCOPE) set(BLAS MKL PARENT_SCOPE) diff --git a/cmake/Modules/FindMKL.cmake b/cmake/Modules/FindMKL.cmake index e52b7423b0e7..e45eef92749f 100644 --- a/cmake/Modules/FindMKL.cmake +++ b/cmake/Modules/FindMKL.cmake @@ -32,6 +32,10 @@ # MKL_LIBRARIES : the libraries to link against. # +if(MKL_FOUND) + return() +endif() + if($ENV{MKLROOT}) file(TO_CMAKE_PATH "$ENV{MKLROOT}" MKLROOT) message(STATUS "MKLROOT=${MKLROOT}") diff --git a/cmake/Modules/FindMKLML.cmake b/cmake/Modules/FindMKLML.cmake index 27c340ee59f5..78a3f65b9c7f 100644 --- a/cmake/Modules/FindMKLML.cmake +++ b/cmake/Modules/FindMKLML.cmake @@ -23,9 +23,13 @@ # # The following are set after configuration is done: # -# MKLML_FOUND -# MKLML_INCLUDE_DIRS -# MKLML_LIBRARIES +# MKL_FOUND +# MKL_INCLUDE_DIRS +# MKL_LIBRARIES + +if(MKL_FOUND) + return() +endif() if($ENV{MKLROOT}) file(TO_CMAKE_PATH "$ENV{MKLROOT}" MKLROOT) @@ -96,7 +100,8 @@ include(FindPackageHandleStandardArgs) find_package_handle_standard_args(MKLML DEFAULT_MSG ${LOOKED_FOR}) if(MKLML_FOUND) - set(MKLML_INCLUDE_DIRS "${MKLML_INCLUDE_DIR}") + set(MKL_FOUND ${MKLML_FOUND}) + set(MKL_INCLUDE_DIRS "${MKLML_INCLUDE_DIR}") mark_as_advanced(${LOOKED_FOR}) From 04cc522a524594c870a39b8adeba3dc54b1a8334 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 8 Aug 2018 16:39:34 +0200 Subject: [PATCH 37/78] Simplified library and header finding for OpenBLAS, added cmake file guards --- cmake/Modules/FindAccelerate.cmake | 7 +++- cmake/Modules/FindAtlas.cmake | 7 +++- cmake/Modules/FindMKL.cmake | 3 +- cmake/Modules/FindMKLML.cmake | 3 +- cmake/Modules/FindOpenBLAS.cmake | 53 +++++++++++++++--------------- 5 files changed, 42 insertions(+), 31 deletions(-) diff --git a/cmake/Modules/FindAccelerate.cmake b/cmake/Modules/FindAccelerate.cmake index 568b227cee67..bf23645bf54f 100644 --- a/cmake/Modules/FindAccelerate.cmake +++ b/cmake/Modules/FindAccelerate.cmake @@ -23,11 +23,16 @@ # Accelerate_INCLUDE_DIR # Accelerate_LIBRARIES +if(Accelerate_FOUND) + return() +endif() + if($ENV{Accelerate_HOME}) file(TO_CMAKE_PATH "$ENV{Accelerate_HOME}" Accelerate_HOME) - message(STATUS "Accelerate_HOME=${Accelerate_HOME}") endif() +message(STATUS "Accelerate_HOME=${Accelerate_HOME}") + set(Accelerate_INCLUDE_SEARCH_PATHS /System/Library/Frameworks/Accelerate.framework/Versions/Current/Frameworks/vecLib.framework/Versions/Current ${Accelerate_HOME} diff --git a/cmake/Modules/FindAtlas.cmake b/cmake/Modules/FindAtlas.cmake index bf8601c925da..028434d4c26f 100644 --- a/cmake/Modules/FindAtlas.cmake +++ b/cmake/Modules/FindAtlas.cmake @@ -29,11 +29,16 @@ # Atlas_INCLUDE_DIRS # Atlas_LIBRARIES +if(Atlas_FOUND) + return() +endif() + if($ENV{Atlas_ROOT_DIR}) file(TO_CMAKE_PATH "$ENV{Atlas_ROOT_DIR}" Atlas_ROOT_DIR) - message(STATUS "Atlas_ROOT_DIR=${Atlas_ROOT_DIR}") endif() +message(STATUS "Atlas_ROOT_DIR=${Atlas_ROOT_DIR}") + if($ENV{CROSS_ROOT}) file(TO_CMAKE_PATH "$ENV{CROSS_ROOT}" CROSS_ROOT) message(STATUS "CROSS_ROOT=${CROSS_ROOT}") diff --git a/cmake/Modules/FindMKL.cmake b/cmake/Modules/FindMKL.cmake index e45eef92749f..22aae23734bd 100644 --- a/cmake/Modules/FindMKL.cmake +++ b/cmake/Modules/FindMKL.cmake @@ -38,9 +38,10 @@ endif() if($ENV{MKLROOT}) file(TO_CMAKE_PATH "$ENV{MKLROOT}" MKLROOT) - message(STATUS "MKLROOT=${MKLROOT}") endif() +message(STATUS "MKLROOT=${MKLROOT}") + # ---[ Root folders set(INTEL_ROOT "/opt/intel" CACHE PATH "Folder contains intel libs") diff --git a/cmake/Modules/FindMKLML.cmake b/cmake/Modules/FindMKLML.cmake index 78a3f65b9c7f..865eddd73f7e 100644 --- a/cmake/Modules/FindMKLML.cmake +++ b/cmake/Modules/FindMKLML.cmake @@ -33,9 +33,10 @@ endif() if($ENV{MKLROOT}) file(TO_CMAKE_PATH "$ENV{MKLROOT}" MKLROOT) - message(STATUS "MKLROOT=${MKLROOT}") endif() +message(STATUS "MKLROOT=${MKLROOT}") + set(MKLML_INCLUDE_SEARCH_PATHS ${MKLML_INCLUDE_SEARCH_PATHS} diff --git a/cmake/Modules/FindOpenBLAS.cmake b/cmake/Modules/FindOpenBLAS.cmake index af64094853a8..474cc4f4d709 100644 --- a/cmake/Modules/FindOpenBLAS.cmake +++ b/cmake/Modules/FindOpenBLAS.cmake @@ -29,11 +29,16 @@ # OpenBLAS_INCLUDE_DIRS # OpenBLAS_LIBRARIES +if(OpenBLAS_FOUND) + return() +endif() + if($ENV{OpenBLAS_HOME}) file(TO_CMAKE_PATH "$ENV{OpenBLAS_HOME}" OpenBLAS_HOME) - message(STATUS "OpenBLAS_HOME=${OpenBLAS_HOME}") endif() +message(STATUS "OpenBLAS_HOME=${OpenBLAS_HOME}") + if($ENV{CROSS_ROOT}) file(TO_CMAKE_PATH "$ENV{CROSS_ROOT}" CROSS_ROOT) message(STATUS "CROSS_ROOT=${CROSS_ROOT}") @@ -42,7 +47,6 @@ endif() if(CMAKE_CROSSCOMPILING) set(OpenBLAS_INCLUDE_SEARCH_PATHS "${CROSS_ROOT}" - "${CROSS_ROOT}/include" ) endif() @@ -50,25 +54,23 @@ set(OpenBLAS_INCLUDE_SEARCH_PATHS ${OpenBLAS_INCLUDE_SEARCH_PATHS} "${OpenBLAS_HOME}" - "${OpenBLAS_HOME}/include" - /usr/include + /usr /usr/include/openblas /usr/include/openblas-base - /usr/local/include + /usr/local /usr/local/include/openblas /usr/local/include/openblas-base - /opt/OpenBLAS/include - /usr/local/opt/openblas/include + /opt/OpenBLAS + /usr/local/opt/openblas - "${PROJECT_SOURCE_DIR}/3rdparty/OpenBLAS/include" - "${PROJECT_SOURCE_DIR}/thirdparty/OpenBLAS/include" + "${PROJECT_SOURCE_DIR}/3rdparty/OpenBLAS" + "${PROJECT_SOURCE_DIR}/thirdparty/OpenBLAS" ) if(CMAKE_CROSSCOMPILING) set(Open_BLAS_LIB_SEARCH_PATHS "${CROSS_ROOT}" - "${CROSS_ROOT}/include" ) endif() @@ -76,38 +78,35 @@ set(OpenBLAS_LIB_SEARCH_PATHS ${OpenBLAS_LIB_SEARCH_PATHS} "${OpenBLAS_HOME}" - "${OpenBLAS_HOME}/lib" - "${OpenBLAS_HOME}/lib64" - /lib/ + / /lib/openblas-base - /lib64/ - /usr/lib + /usr /usr/lib/openblas-base - /usr/lib64 - /usr/local/lib - /usr/local/lib64 - /opt/OpenBLAS/lib - /usr/local/opt/openblas/lib - - "${PROJECT_SOURCE_DIR}/3rdparty/OpenBLAS/lib" - "${PROJECT_SOURCE_DIR}/thirdparty/OpenBLAS/lib" + /usr/local/ + /opt/OpenBLAS + /usr/local/opt/openblas + + "${PROJECT_SOURCE_DIR}/3rdparty/OpenBLAS" + "${PROJECT_SOURCE_DIR}/thirdparty/OpenBLAS" ) find_path(OpenBLAS_INCLUDE_DIR NAMES cblas.h - PATHS ${OpenBLAS_INCLUDE_SEARCH_PATHS}) + PATHS ${OpenBLAS_INCLUDE_SEARCH_PATHS} + PATH_SUFFIXES include) set(OpenBLAS_LIB_NAMES openblas libopenblas.dll.a libopenblas.dll) -if(CMAKE_CROSSCOMPILING) - message(STATUS "Will try link to OpenBLAS statically for cross compilation") +if(CMAKE_CROSSCOMPILING OR MSVC) + message(STATUS "Will try to link to OpenBLAS statically") set(OpenBLAS_LIB_NAMES libopenblas.a ${OpenBLAS_LIB_NAMES}) endif() find_library(OpenBLAS_LIBRARY NAMES ${OpenBLAS_LIB_NAMES} - PATHS ${OpenBLAS_LIB_SEARCH_PATHS}) + PATHS ${OpenBLAS_LIB_SEARCH_PATHS} + PATH_SUFFIXES lib lib64) set(LOOKED_FOR OpenBLAS_INCLUDE_DIR From 19b222497c2864ec1f90477e454ec85c320d4918 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 8 Aug 2018 17:40:53 +0200 Subject: [PATCH 38/78] Fixed windows library suffix problem --- cmake/Modules/FindOpenBLAS.cmake | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmake/Modules/FindOpenBLAS.cmake b/cmake/Modules/FindOpenBLAS.cmake index 474cc4f4d709..5ea664249af8 100644 --- a/cmake/Modules/FindOpenBLAS.cmake +++ b/cmake/Modules/FindOpenBLAS.cmake @@ -103,6 +103,11 @@ if(CMAKE_CROSSCOMPILING OR MSVC) set(OpenBLAS_LIB_NAMES libopenblas.a ${OpenBLAS_LIB_NAMES}) endif() +# For some reason setting this is really important and nothing works without it on windows +if(MSVC) + set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) +endif() + find_library(OpenBLAS_LIBRARY NAMES ${OpenBLAS_LIB_NAMES} PATHS ${OpenBLAS_LIB_SEARCH_PATHS} From 901bee879cad8692c301da936712aad482dfcc73 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 8 Aug 2018 18:06:27 +0200 Subject: [PATCH 39/78] Fixed problem with path set by environment variables --- cmake/Modules/FindAccelerate.cmake | 10 ++++----- cmake/Modules/FindAtlas.cmake | 34 ++++++++++++---------------- cmake/Modules/FindMKL.cmake | 36 +++++++++++++++++------------- cmake/Modules/FindMKLML.cmake | 16 +++++-------- cmake/Modules/FindOpenBLAS.cmake | 21 ++++++++--------- 5 files changed, 54 insertions(+), 63 deletions(-) diff --git a/cmake/Modules/FindAccelerate.cmake b/cmake/Modules/FindAccelerate.cmake index bf23645bf54f..4dcb7e411c87 100644 --- a/cmake/Modules/FindAccelerate.cmake +++ b/cmake/Modules/FindAccelerate.cmake @@ -27,14 +27,12 @@ if(Accelerate_FOUND) return() endif() -if($ENV{Accelerate_HOME}) - file(TO_CMAKE_PATH "$ENV{Accelerate_HOME}" Accelerate_HOME) -endif() - -message(STATUS "Accelerate_HOME=${Accelerate_HOME}") - set(Accelerate_INCLUDE_SEARCH_PATHS + ${Accelerate_INCLUDE_SEARCH_PATHS} + /System/Library/Frameworks/Accelerate.framework/Versions/Current/Frameworks/vecLib.framework/Versions/Current + + $ENV{Accelerate_HOME} ${Accelerate_HOME} ) diff --git a/cmake/Modules/FindAtlas.cmake b/cmake/Modules/FindAtlas.cmake index 028434d4c26f..9f736bd444cb 100644 --- a/cmake/Modules/FindAtlas.cmake +++ b/cmake/Modules/FindAtlas.cmake @@ -33,30 +33,20 @@ if(Atlas_FOUND) return() endif() -if($ENV{Atlas_ROOT_DIR}) - file(TO_CMAKE_PATH "$ENV{Atlas_ROOT_DIR}" Atlas_ROOT_DIR) -endif() - -message(STATUS "Atlas_ROOT_DIR=${Atlas_ROOT_DIR}") - -if($ENV{CROSS_ROOT}) - file(TO_CMAKE_PATH "$ENV{CROSS_ROOT}" CROSS_ROOT) - message(STATUS "CROSS_ROOT=${CROSS_ROOT}") -endif() - if(CMAKE_CROSSCOMPILING) set(Atlas_INCLUDE_SEARCH_PATHS + ${Atlas_INCLUDE_SEARCH_PATHS} + + "$ENV{CROSS_ROOT}" "${CROSS_ROOT}" - "${CROSS_ROOT}/include" ) endif() set(Atlas_INCLUDE_SEARCH_PATHS ${Atlas_INCLUDE_SEARCH_PATHS} + "$ENV{Atlas_ROOT_DIR}" "${Atlas_ROOT_DIR}" - "${Atlas_ROOT_DIR}/include" - "${Atlas_ROOT_DIR}/include/atlas" /usr/include/atlas /usr/include/atlas-base @@ -64,17 +54,18 @@ set(Atlas_INCLUDE_SEARCH_PATHS if(${CMAKE_CROSSCOMPILING}) set(Atlas_LIB_SEARCH_PATHS + ${Atlas_LIB_SEARCH_PATHS} + + "$ENV{CROSS_ROOT}" "${CROSS_ROOT}" - "${CROSS_ROOT}/lib" - "${CROSS_ROOT}/lib64" ) endif() set(Atlas_LIB_SEARCH_PATHS ${Atlas_LIB_SEARCH_PATHS} + "$ENV{Atlas_ROOT_DIR}" "${Atlas_ROOT_DIR}" - "${Atlas_ROOT_DIR}/lib" /usr/lib/atlas /usr/lib/atlas-base @@ -82,14 +73,17 @@ set(Atlas_LIB_SEARCH_PATHS find_path(Atlas_CBLAS_INCLUDE_DIR NAMES cblas.h - PATHS ${Atlas_INCLUDE_SEARCH_PATHS}) + PATHS ${Atlas_INCLUDE_SEARCH_PATHS} + PATH_SUFFIXES include) find_library(Atlas_CBLAS_LIBRARY NAMES ptcblas_r ptcblas cblas_r cblas - PATHS ${Atlas_LIB_SEARCH_PATHS}) + PATHS ${Atlas_LIB_SEARCH_PATHS} + PATH_SUFFIXES lib) find_library(Atlas_BLAS_LIBRARY NAMES atlas_r atlas - PATHS ${Atlas_LIB_SEARCH_PATHS}) + PATHS ${Atlas_LIB_SEARCH_PATHS} + PATH_SUFFIXES lib) set(LOOKED_FOR Atlas_CBLAS_INCLUDE_DIR diff --git a/cmake/Modules/FindMKL.cmake b/cmake/Modules/FindMKL.cmake index 22aae23734bd..d8b533316511 100644 --- a/cmake/Modules/FindMKL.cmake +++ b/cmake/Modules/FindMKL.cmake @@ -36,15 +36,6 @@ if(MKL_FOUND) return() endif() -if($ENV{MKLROOT}) - file(TO_CMAKE_PATH "$ENV{MKLROOT}" MKLROOT) -endif() - -message(STATUS "MKLROOT=${MKLROOT}") - -# ---[ Root folders -set(INTEL_ROOT "/opt/intel" CACHE PATH "Folder contains intel libs") - # ---[ Options mxnet_option(MKL_USE_SINGLE_DYNAMIC_LIBRARY "Use single dynamic library interface" ON) mxnet_option(MKL_USE_STATIC_LIBS "Use static libraries" OFF IF NOT ${MKL_USE_SINGLE_DYNAMIC_LIBRARY}) @@ -52,11 +43,18 @@ mxnet_option(MKL_MULTI_THREADED "Use multi-threading" ON IF NOT ${MKL_USE_SINGLE mxnet_option(MKL_USE_ILP64 "Use ilp64 data model" OFF) mxnet_option(MKL_USE_CLUSTER "Use cluster functions" OFF IF ${CMAKE_SIZEOF_VOID_P} EQUAL 4) +# ---[ Root folders +set(INTEL_ROOT "/opt/intel" CACHE PATH "Folder contains intel libs") + +if(NOT MKLROOT) + get_filename_component(MKLROOT "${MKL_INCLUDE_DIR}" DIRECTORY) +endif() + set(MKL_INCLUDE_SEARCH_PATHS ${MKL_INCLUDE_SEARCH_PATHS} + "$ENV{MKLROOT}" "${MKLROOT}" - "${MKLROOT}/include" "${INTEL_ROOT}/mkl" ) @@ -66,9 +64,17 @@ find_path(MKL_INCLUDE_DIR mkl.h PATHS ${MKL_INCLUDE_SEARCH_PATHS} PATH_SUFFIXES include) -if(NOT MKLROOT) - get_filename_component(MKLROOT "${MKL_INCLUDE_DIR}" DIRECTORY) -endif() +set(MKL_LIB_SEARCH_PATHS + ${MKL_LIB_SEARCH_PATHS} + + "$ENV{MKLROOT}" + "${MKLROOT}" + + "${INTEL_RTL_ROOT}" + "${INTEL_ROOT}/compiler" + "${MKLROOT}/.." + "${MKLROOT}/../compiler" + ) set(__looked_for MKL_INCLUDE_DIR) @@ -127,7 +133,7 @@ foreach(__lib ${__mkl_libs}) find_library(${__mkl_lib_upper}_LIBRARY NAMES ${__mkl_lib} - PATHS "${MKLROOT}" + PATHS ${MKL_LIB_SEARCH_PATHS} PATH_SUFFIXES ${__path_suffixes} DOC "The path to Intel(R) MKL ${__mkl_lib} library") mark_as_advanced(${__mkl_lib_upper}_LIBRARY) @@ -152,7 +158,7 @@ if(NOT MKL_USE_SINGLE_DYNAMIC_LIBRARY) endif() find_library(MKL_RTL_LIBRARY ${__iomp5_libs} - PATHS "${INTEL_RTL_ROOT}" "${INTEL_ROOT}/compiler" "${MKLROOT}" "${MKLROOT}/.." "${MKLROOT}/../compiler" + PATHS ${MKL_LIB_SEARCH_PATHS} PATH_SUFFIXES ${__path_suffixes} DOC "Path to OpenMP runtime library") diff --git a/cmake/Modules/FindMKLML.cmake b/cmake/Modules/FindMKLML.cmake index 865eddd73f7e..b87bfc32f8a3 100644 --- a/cmake/Modules/FindMKLML.cmake +++ b/cmake/Modules/FindMKLML.cmake @@ -31,19 +31,13 @@ if(MKL_FOUND) return() endif() -if($ENV{MKLROOT}) - file(TO_CMAKE_PATH "$ENV{MKLROOT}" MKLROOT) -endif() - -message(STATUS "MKLROOT=${MKLROOT}") - set(MKLML_INCLUDE_SEARCH_PATHS ${MKLML_INCLUDE_SEARCH_PATHS} + "$ENV{MKLROOT}" "${MKLROOT}" - "${MKLROOT}/include" - "${PROJECT_SOURCE_DIR}/3rdparty/MKLML/include" + "${PROJECT_SOURCE_DIR}/3rdparty/MKLML" ) # ---[ Find libraries @@ -56,14 +50,16 @@ endif() set(MKLML_LIB_SEARCH_PATHS ${MKLML_LIB_SEARCH_PATHS} + "$ENV{MKLROOT}" "${MKLROOT}" - "${PROJECT_SOURCE_DIR}/3rdparty/MKLML/lib" + "${PROJECT_SOURCE_DIR}/3rdparty/MKLML" ) find_path(MKLML_INCLUDE_DIR NAMES mkl_blas.h - PATHS ${MKLML_INCLUDE_SEARCH_PATHS}) + PATHS ${MKLML_INCLUDE_SEARCH_PATHS} + PATH_SUFFIXES include) set(LOOKED_FOR MKLML_INCLUDE_DIR diff --git a/cmake/Modules/FindOpenBLAS.cmake b/cmake/Modules/FindOpenBLAS.cmake index 5ea664249af8..02caf3e3b7f6 100644 --- a/cmake/Modules/FindOpenBLAS.cmake +++ b/cmake/Modules/FindOpenBLAS.cmake @@ -33,19 +33,11 @@ if(OpenBLAS_FOUND) return() endif() -if($ENV{OpenBLAS_HOME}) - file(TO_CMAKE_PATH "$ENV{OpenBLAS_HOME}" OpenBLAS_HOME) -endif() - -message(STATUS "OpenBLAS_HOME=${OpenBLAS_HOME}") - -if($ENV{CROSS_ROOT}) - file(TO_CMAKE_PATH "$ENV{CROSS_ROOT}" CROSS_ROOT) - message(STATUS "CROSS_ROOT=${CROSS_ROOT}") -endif() - if(CMAKE_CROSSCOMPILING) set(OpenBLAS_INCLUDE_SEARCH_PATHS + ${OpenBLAS_INCLUDE_SEARCH_PATHS} + + "$ENV{CROSS_ROOT}" "${CROSS_ROOT}" ) endif() @@ -53,6 +45,7 @@ endif() set(OpenBLAS_INCLUDE_SEARCH_PATHS ${OpenBLAS_INCLUDE_SEARCH_PATHS} + "$ENV{OpenBLAS_HOME}" "${OpenBLAS_HOME}" /usr @@ -70,6 +63,9 @@ set(OpenBLAS_INCLUDE_SEARCH_PATHS if(CMAKE_CROSSCOMPILING) set(Open_BLAS_LIB_SEARCH_PATHS + ${Open_BLAS_LIB_SEARCH_PATHS} + + "$ENV{CROSS_ROOT}" "${CROSS_ROOT}" ) endif() @@ -77,6 +73,7 @@ endif() set(OpenBLAS_LIB_SEARCH_PATHS ${OpenBLAS_LIB_SEARCH_PATHS} + "$ENV{OpenBLAS_HOME}" "${OpenBLAS_HOME}" / @@ -103,7 +100,7 @@ if(CMAKE_CROSSCOMPILING OR MSVC) set(OpenBLAS_LIB_NAMES libopenblas.a ${OpenBLAS_LIB_NAMES}) endif() -# For some reason setting this is really important and nothing works without it on windows +# For some reason setting this is really important and on windows the library is not found even given exact file name if(MSVC) set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) endif() From 63018791a33b37c211e734c5f0917f0d93cb46b3 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 8 Aug 2018 19:31:10 +0200 Subject: [PATCH 40/78] Fixed lapack include path search --- cmake/Modules/FindAtlas.cmake | 7 +++++-- cmake/Modules/FindOpenBLAS.cmake | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cmake/Modules/FindAtlas.cmake b/cmake/Modules/FindAtlas.cmake index 9f736bd444cb..2cb48bbf7713 100644 --- a/cmake/Modules/FindAtlas.cmake +++ b/cmake/Modules/FindAtlas.cmake @@ -102,10 +102,13 @@ if(Atlas_NEED_LAPACK) # we need another variables (starting with __) because cmake will not overwrite it if already set find_path(__Atlas_CLAPACK_INCLUDE_DIR NAMES clapack.h - PATHS ${Atlas_INCLUDE_SEARCH_PATHS}) + PATHS ${Atlas_INCLUDE_SEARCH_PATHS} + PATH_SUFFIXES include) + find_library(__Atlas_LAPACK_LIBRARY NAMES lapack_r lapack lapack_atlas - PATHS ${Atlas_LIB_SEARCH_PATHS}) + PATHS ${Atlas_LIB_SEARCH_PATHS} + PATH_SUFFIXES lib) set(CMAKE_REQUIRED_LIBRARIES ${Atlas_LAPACK_LIBRARY}) include(CheckFunctionExists) diff --git a/cmake/Modules/FindOpenBLAS.cmake b/cmake/Modules/FindOpenBLAS.cmake index 02caf3e3b7f6..7d7ed7a54da4 100644 --- a/cmake/Modules/FindOpenBLAS.cmake +++ b/cmake/Modules/FindOpenBLAS.cmake @@ -125,7 +125,8 @@ if(OpenBLAS_NEED_LAPACK) # we need another variable (starting with __) because cmake will not overwrite it if already set find_path(__OpenBLAS_LAPACK_INCLUDE_DIR NAMES lapacke.h - PATHS ${OpenBLAS_INCLUDE_SEARCH_PATHS}) + PATHS ${OpenBLAS_INCLUDE_SEARCH_PATHS} + PATH_SUFFIXES include) # OpenBLAS does not have a separate LAPACK library: https://github.com/xianyi/OpenBLAS/issues/296 # LAPACK if present in OpenBLAS build is included into libopenblas From d61d1d5bc24aad402af97e9feb7cdaef83fab208 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 8 Aug 2018 19:44:03 +0200 Subject: [PATCH 41/78] Cleaned up LAPACK for OpenBLAS detection --- cmake/Modules/FindOpenBLAS.cmake | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/cmake/Modules/FindOpenBLAS.cmake b/cmake/Modules/FindOpenBLAS.cmake index 7d7ed7a54da4..43132f3c3a6c 100644 --- a/cmake/Modules/FindOpenBLAS.cmake +++ b/cmake/Modules/FindOpenBLAS.cmake @@ -122,30 +122,15 @@ set(OpenBLAS_LAPACK_INCLUDE_DIR) if(OpenBLAS_NEED_LAPACK) message(STATUS "Looking for LAPACK support...") - # we need another variable (starting with __) because cmake will not overwrite it if already set - find_path(__OpenBLAS_LAPACK_INCLUDE_DIR - NAMES lapacke.h - PATHS ${OpenBLAS_INCLUDE_SEARCH_PATHS} - PATH_SUFFIXES include) - # OpenBLAS does not have a separate LAPACK library: https://github.com/xianyi/OpenBLAS/issues/296 # LAPACK if present in OpenBLAS build is included into libopenblas - set(__OpenBLAS_LAPACK_LIBRARY ${OpenBLAS_LIBRARY}) - set(CMAKE_REQUIRED_LIBRARIES ${__OpenBLAS_LAPACK_LIBRARY}) + set(CMAKE_REQUIRED_LIBRARIES ${OpenBLAS_LIBRARY}) include(CheckFunctionExists) check_function_exists("cheev_" LAPACK_FOUND) if(LAPACK_FOUND) set(OpenBLAS_LAPACK_FOUND True) - set(OpenBLAS_LAPACK_INCLUDE_DIR ${__OpenBLAS_LAPACK_INCLUDE_DIR}) - set(OpenBLAS_LAPACK_LIBRARY ${__OpenBLAS_LAPACK_LIBRARY}) - - set(LOOKED_FOR - ${LOOKED_FOR} - OpenBLAS_LAPACK_INCLUDE_DIR - OpenBLAS_LAPACK_LIBRARY - ) message(STATUS "LAPACK found") else() message(WARNING "OpenBlas has not been compiled with LAPACK support, LAPACK functionality will not be available") @@ -157,8 +142,8 @@ include(FindPackageHandleStandardArgs) find_package_handle_standard_args(OpenBLAS DEFAULT_MSG ${LOOKED_FOR}) if(OpenBLAS_FOUND) - set(OpenBLAS_INCLUDE_DIRS "${OpenBLAS_INCLUDE_DIR}" "${OpenBLAS_LAPACK_INCLUDE_DIR}") - set(OpenBLAS_LIBRARIES "${OpenBLAS_LIBRARY}" "${OpenBLAS_LAPACK_LIBRARY}") + set(OpenBLAS_INCLUDE_DIRS "${OpenBLAS_INCLUDE_DIR}") + set(OpenBLAS_LIBRARIES "${OpenBLAS_LIBRARY}") mark_as_advanced(${LOOKED_FOR}) From 129c4c6473491742c9eb0a832563b2505b5e4701 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 8 Aug 2018 19:47:01 +0200 Subject: [PATCH 42/78] Reverted static linking of OpenBLAS on windows --- cmake/Modules/FindOpenBLAS.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/Modules/FindOpenBLAS.cmake b/cmake/Modules/FindOpenBLAS.cmake index 43132f3c3a6c..f2f2587e653b 100644 --- a/cmake/Modules/FindOpenBLAS.cmake +++ b/cmake/Modules/FindOpenBLAS.cmake @@ -95,7 +95,7 @@ find_path(OpenBLAS_INCLUDE_DIR set(OpenBLAS_LIB_NAMES openblas libopenblas.dll.a libopenblas.dll) -if(CMAKE_CROSSCOMPILING OR MSVC) +if(CMAKE_CROSSCOMPILING) message(STATUS "Will try to link to OpenBLAS statically") set(OpenBLAS_LIB_NAMES libopenblas.a ${OpenBLAS_LIB_NAMES}) endif() From bf856b64b6eea88a23e0c873cd6161824d036c4f Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Wed, 8 Aug 2018 20:24:22 +0200 Subject: [PATCH 43/78] Fixed android armv8 openblas build --- ci/docker/Dockerfile.build.android_armv8 | 8 ++++-- ci/docker/install/android_arm64_openblas.sh | 32 --------------------- 2 files changed, 6 insertions(+), 34 deletions(-) delete mode 100755 ci/docker/install/android_arm64_openblas.sh diff --git a/ci/docker/Dockerfile.build.android_armv8 b/ci/docker/Dockerfile.build.android_armv8 index e6a93aa57636..c8e6353ff066 100644 --- a/ci/docker/Dockerfile.build.android_armv8 +++ b/ci/docker/Dockerfile.build.android_armv8 @@ -70,9 +70,13 @@ RUN /work/android_ndk.sh ENV CC=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-clang ENV CXX=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-clang++ +ENV TARGET=ARMV8 +ENV ARM_SOFTFP_ABI=1 +ENV NOFORTRAN=1 + # Build ARM dependencies. -COPY install/android_arm64_openblas.sh /work/ -RUN /work/android_arm64_openblas.sh +COPY install/arm_openblas.sh /work/ +RUN /work/arm_openblas.sh ENV OpenBLAS_HOME=${CROSS_ROOT} diff --git a/ci/docker/install/android_arm64_openblas.sh b/ci/docker/install/android_arm64_openblas.sh deleted file mode 100755 index 1c3014f6cca9..000000000000 --- a/ci/docker/install/android_arm64_openblas.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env bash - -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# build and install are separated so changes to build don't invalidate -# the whole docker cache for the image - -set -ex -pushd . -git clone https://github.com/xianyi/OpenBLAS.git -cd OpenBLAS -make -j$(nproc) TARGET=ARMV8 ARM_SOFTFP_ABI=1 HOSTCC=gcc NOFORTRAN=1 libs -# Can't be run (utility not compiled for the target platform) -#make install -cp *.h /usr/include -cp libopenblas.a /usr/local/lib -popd From 87881b64516e68afbd1eb7806ce95c559d8bb0d5 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Thu, 9 Aug 2018 10:42:56 +0200 Subject: [PATCH 44/78] Standartized android armv7/armv8 builds --- ci/docker/Dockerfile.build.android_armv7 | 54 +++------------------ ci/docker/Dockerfile.build.android_armv8 | 52 ++------------------ ci/docker/install/android_armv7_openblas.sh | 31 ------------ 3 files changed, 10 insertions(+), 127 deletions(-) delete mode 100755 ci/docker/install/android_armv7_openblas.sh diff --git a/ci/docker/Dockerfile.build.android_armv7 b/ci/docker/Dockerfile.build.android_armv7 index ab4fce98936b..1ecc8db305e0 100644 --- a/ci/docker/Dockerfile.build.android_armv7 +++ b/ci/docker/Dockerfile.build.android_armv7 @@ -18,62 +18,22 @@ # # Dockerfile to build MXNet for Android ARMv7 -FROM mxnetci/dockcross-linux-base:08212018 -MAINTAINER Pedro Larroy "pllarroy@amazon.com" - -# The cross-compiling emulator -RUN apt-get update && apt-get install -y \ - unzip - -ENV CROSS_TRIPLE=arm-linux-androideabi -ENV CROSS_ROOT=/usr/${CROSS_TRIPLE} -ENV AS=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-as \ - AR=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-ar \ - CC=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-gcc \ - CPP=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-cpp \ - CXX=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-g++ \ - LD=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-ld - -ENV ANDROID_NDK_REVISION 17b -ENV ANDROID_NDK_API 27 -ENV ANDROID_NDK_ARCH arm -WORKDIR /work/deps -COPY install/android_ndk.sh /work/deps -RUN /work/deps/android_ndk.sh - -ENV DEFAULT_DOCKCROSS_IMAGE dockcross/android-arm - -# Build-time metadata as defined at http://label-schema.org -ARG BUILD_DATE -ARG IMAGE -ARG VCS_REF -ARG VCS_URL -LABEL org.label-schema.build-date=$BUILD_DATE \ - org.label-schema.name=$IMAGE \ - org.label-schema.vcs-ref=$VCS_REF \ - org.label-schema.vcs-url=$VCS_URL \ - org.label-schema.schema-version="1.0" - - -ENV CC=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-clang -ENV CXX=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-clang++ +FROM mxnetci/dockcross-android-arm:08212018 WORKDIR /work/deps COPY install/deb_ubuntu_ccache.sh /work/ RUN /work/deb_ubuntu_ccache.sh -WORKDIR /work -COPY install/ubuntu_arm.sh /work/ -RUN /work/ubuntu_arm.sh + +ENV ARCH armv7l +ENV TARGET ARMV7 +ENV ARM_SOFTFP_ABI 1 COPY install/arm_openblas.sh /work/ -COPY install/android_armv7_openblas.sh /work/deps -RUN /work/deps/android_armv7_openblas.sh +RUN /work/arm_openblas.sh ENV OpenBLAS_HOME=${CROSS_ROOT} -WORKDIR /work +WORKDIR /work/build COPY runtime_functions.sh /work/ -WORKDIR /work/mxnet - diff --git a/ci/docker/Dockerfile.build.android_armv8 b/ci/docker/Dockerfile.build.android_armv8 index c8e6353ff066..01bbb53e5404 100644 --- a/ci/docker/Dockerfile.build.android_armv8 +++ b/ci/docker/Dockerfile.build.android_armv8 @@ -18,63 +18,17 @@ # # Dockerfile to build MXNet for Android ARM64/ARMv8 -FROM mxnetci/dockcross-linux-base:08212018 -MAINTAINER Pedro Larroy "pllarroy@amazon.com" - -RUN apt-get update && apt-get install -y \ - unzip +FROM mxnetci/dockcross-android-arm64:08212018 WORKDIR /work/deps -# Build x86 dependencies. COPY install/deb_ubuntu_ccache.sh /work/ RUN /work/deb_ubuntu_ccache.sh -# Setup Android cross-compilation environment. -ENV CROSS_TRIPLE=aarch64-linux-android -ENV CROSS_ROOT=/usr/${CROSS_TRIPLE} -ENV AS=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-as \ - AR=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-ar \ - CC=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-gcc \ - CPP=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-cpp \ - CXX=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-g++ \ - LD=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-ld - - -ENV DEFAULT_DOCKCROSS_IMAGE dockcross/android-arm - -# Build-time metadata as defined at http://label-schema.org -ARG BUILD_DATE -ARG IMAGE -ARG VCS_REF -ARG VCS_URL -LABEL org.label-schema.build-date=$BUILD_DATE \ - org.label-schema.name=$IMAGE \ - org.label-schema.vcs-ref=$VCS_REF \ - org.label-schema.vcs-url=$VCS_URL \ - org.label-schema.schema-version="1.0" - ENV ARCH aarch64 -ENV ANDROID_NDK_REVISION 17b -ENV ANDROID_NDK_API 27 -ENV ANDROID_NDK_ARCH arm64 -WORKDIR /work/deps -COPY install/android_ndk.sh /work/deps -RUN /work/deps/android_ndk.sh - - -WORKDIR /work/deps -COPY install/android_ndk.sh /work/ -RUN /work/android_ndk.sh - -ENV CC=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-clang -ENV CXX=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-clang++ - -ENV TARGET=ARMV8 -ENV ARM_SOFTFP_ABI=1 -ENV NOFORTRAN=1 +ENV TARGET ARMV8 +ENV ARM_SOFTFP_ABI 1 -# Build ARM dependencies. COPY install/arm_openblas.sh /work/ RUN /work/arm_openblas.sh diff --git a/ci/docker/install/android_armv7_openblas.sh b/ci/docker/install/android_armv7_openblas.sh deleted file mode 100755 index 55c098909654..000000000000 --- a/ci/docker/install/android_armv7_openblas.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env bash - -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# build and install are separated so changes to build don't invalidate -# the whole docker cache for the image - -set -ex -pushd . -git clone https://github.com/xianyi/OpenBLAS.git -cd OpenBLAS -make TARGET=ARMV7 HOSTCC=gcc NOFORTRAN=1 ARM_SOFTFP_ABI=1 -j$(nproc) libs -#make PREFIX=${CROSS_ROOT} TARGET=ARMV7 HOSTCC=gcc NOFORTRAN=1 ARM_SOFTFP_ABI=1 install -cp *.h ${CROSS_ROOT}/include -cp libopenblas*.a ${CROSS_ROOT}/lib -popd From 5509c6c3aefdace7236e491becdfc20b6ebc8277 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Thu, 9 Aug 2018 12:18:03 +0200 Subject: [PATCH 45/78] Fixed OpenBLAS android build --- ci/docker/Dockerfile.build.android_armv7 | 10 +++--- ci/docker/Dockerfile.build.android_armv8 | 10 +++--- ci/docker/install/arm64_openblas.sh | 35 --------------------- ci/docker/runtime_functions.sh | 40 +++++++++++++----------- 4 files changed, 33 insertions(+), 62 deletions(-) delete mode 100755 ci/docker/install/arm64_openblas.sh diff --git a/ci/docker/Dockerfile.build.android_armv7 b/ci/docker/Dockerfile.build.android_armv7 index 1ecc8db305e0..8f1248894d76 100644 --- a/ci/docker/Dockerfile.build.android_armv7 +++ b/ci/docker/Dockerfile.build.android_armv7 @@ -22,18 +22,20 @@ FROM mxnetci/dockcross-android-arm:08212018 WORKDIR /work/deps -COPY install/deb_ubuntu_ccache.sh /work/ -RUN /work/deb_ubuntu_ccache.sh - ENV ARCH armv7l ENV TARGET ARMV7 ENV ARM_SOFTFP_ABI 1 +ENV OSNAME Android +ENV ONLY_CBLAS 1 +ENV HOSTCC gcc COPY install/arm_openblas.sh /work/ RUN /work/arm_openblas.sh ENV OpenBLAS_HOME=${CROSS_ROOT} -WORKDIR /work/build +COPY install/deb_ubuntu_ccache.sh /work/ +RUN /work/deb_ubuntu_ccache.sh COPY runtime_functions.sh /work/ +WORKDIR /work/mxnet diff --git a/ci/docker/Dockerfile.build.android_armv8 b/ci/docker/Dockerfile.build.android_armv8 index 01bbb53e5404..1f2db342f29e 100644 --- a/ci/docker/Dockerfile.build.android_armv8 +++ b/ci/docker/Dockerfile.build.android_armv8 @@ -22,18 +22,20 @@ FROM mxnetci/dockcross-android-arm64:08212018 WORKDIR /work/deps -COPY install/deb_ubuntu_ccache.sh /work/ -RUN /work/deb_ubuntu_ccache.sh - ENV ARCH aarch64 ENV TARGET ARMV8 ENV ARM_SOFTFP_ABI 1 +ENV OSNAME Android +ENV ONLY_CBLAS 1 +ENV HOSTCC gcc COPY install/arm_openblas.sh /work/ RUN /work/arm_openblas.sh ENV OpenBLAS_HOME=${CROSS_ROOT} -WORKDIR /work/build +COPY install/deb_ubuntu_ccache.sh /work/ +RUN /work/deb_ubuntu_ccache.sh COPY runtime_functions.sh /work/ +WORKDIR /work/mxnet diff --git a/ci/docker/install/arm64_openblas.sh b/ci/docker/install/arm64_openblas.sh deleted file mode 100755 index 88f2e98cd65b..000000000000 --- a/ci/docker/install/arm64_openblas.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env bash - -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# build and install are separated so changes to build don't invalidate -# the whole docker cache for the image - -set -ex -pushd . -wget -nv https://api.github.com/repos/xianyi/OpenBLAS/git/refs/heads/master -O openblas_version.json -echo "Using openblas:" -cat openblas_version.json -git clone https://github.com/xianyi/OpenBLAS.git -cd OpenBLAS -make -j$(nproc) TARGET=ARMV8 -make install -ln -s /opt/OpenBLAS/lib/libopenblas.so /usr/lib/libopenblas.so -ln -s /opt/OpenBLAS/lib/libopenblas.a /usr/lib/libopenblas.a -ln -s /opt/OpenBLAS/lib/libopenblas.a /usr/lib/liblapack.a -popd diff --git a/ci/docker/runtime_functions.sh b/ci/docker/runtime_functions.sh index 097d62cd56c0..c666433eaf39 100755 --- a/ci/docker/runtime_functions.sh +++ b/ci/docker/runtime_functions.sh @@ -201,19 +201,19 @@ build_android_armv7() { set -ex cd /work/build cmake \ - -DANDROID=ON\ + -DANDROID=ON \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DCMAKE_CROSSCOMPILING=ON \ - -DUSE_CUDA=OFF\ - -DUSE_SSE=OFF\ - -DSUPPORT_F16C=OFF\ - -DUSE_LAPACK=OFF\ - -DUSE_OPENCV=OFF\ - -DUSE_OPENMP=OFF\ - -DUSE_SIGNAL_HANDLER=ON\ - -DCMAKE_BUILD_TYPE=RelWithDebInfo\ - -DUSE_MKL_IF_AVAILABLE=OFF\ + -DUSE_CUDA=OFF \ + -DUSE_SSE=OFF \ + -DSUPPORT_F16C=OFF \ + -DUSE_LAPACK=OFF \ + -DUSE_OPENCV=OFF \ + -DUSE_OPENMP=OFF \ + -DUSE_SIGNAL_HANDLER=ON \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DUSE_MKL_IF_AVAILABLE=OFF \ -G Ninja /work/mxnet ninja -v } @@ -221,17 +221,19 @@ build_android_armv7() { build_android_armv8() { set -ex cd /work/build - cmake\ + cmake \ -DANDROID=ON \ + -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ + -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DCMAKE_CROSSCOMPILING=ON \ - -DUSE_CUDA=OFF\ - -DUSE_SSE=OFF\ - -DUSE_LAPACK=OFF\ - -DUSE_OPENCV=OFF\ - -DUSE_OPENMP=OFF\ - -DUSE_SIGNAL_HANDLER=ON\ - -DCMAKE_BUILD_TYPE=RelWithDebInfo\ - -DUSE_MKL_IF_AVAILABLE=OFF\ + -DUSE_CUDA=OFF \ + -DUSE_SSE=OFF \ + -DUSE_LAPACK=OFF \ + -DUSE_OPENCV=OFF \ + -DUSE_OPENMP=OFF \ + -DUSE_SIGNAL_HANDLER=ON \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DUSE_MKL_IF_AVAILABLE=OFF \ -G Ninja /work/mxnet ninja -v } From b025112d0b7f3149dab98244975c98b069a3e4d0 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Thu, 9 Aug 2018 12:18:50 +0200 Subject: [PATCH 46/78] Upgraded OpenBLAS for cross compilation version to v0.3.2 --- ci/docker/install/arm_openblas.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/docker/install/arm_openblas.sh b/ci/docker/install/arm_openblas.sh index fa2e5cae9cba..f3152ef1fb70 100755 --- a/ci/docker/install/arm_openblas.sh +++ b/ci/docker/install/arm_openblas.sh @@ -19,7 +19,7 @@ set -ex -git clone --recursive -b v0.2.20 https://github.com/xianyi/OpenBLAS.git +git clone --recursive -b v0.3.2 https://github.com/xianyi/OpenBLAS.git cd OpenBLAS make -j$(nproc) From b24f05b8e44538bfdb2afcc708c20ada5a937b09 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Thu, 9 Aug 2018 12:58:47 +0200 Subject: [PATCH 47/78] Used standard random generators instean of rand_r --- src/operator/rnn_impl.h | 40 +++++++++++++++--------- tests/cpp/engine/threaded_engine_test.cc | 13 +++++--- tests/cpp/include/test_ndarray_utils.h | 17 +++++----- 3 files changed, 42 insertions(+), 28 deletions(-) diff --git a/src/operator/rnn_impl.h b/src/operator/rnn_impl.h index e1b4a2b79c0a..9b2c000b3a27 100644 --- a/src/operator/rnn_impl.h +++ b/src/operator/rnn_impl.h @@ -34,6 +34,7 @@ #include #include #include +#include #include "./math.h" #include "./math_functions-inl.h" #include "./operator_common.h" @@ -149,7 +150,6 @@ void LstmForwardTraining(DType* ws, const int r_size = D * T * N * H * 6; const int y_offset = T * N * H * 5; const int cell_size = N * H; - unsigned int seed_ = 17 + rand() % 4096; // NOLINT(runtime/threadsafe_fn) int idx = 0; // state & cell state's idx; const int omp_threads = mxnet::engine::OpenMP::Get()->GetRecommendedOMPThreadCount(); for (int i = 0; i < L; ++i) { @@ -174,17 +174,21 @@ void LstmForwardTraining(DType* ws, w_ptr += w_size; b_ptr += b_size; if (dropout > 0.0f) { - #pragma omp parallel for num_threads(omp_threads) - for (int j = 0; j < T * N * H * D; j++) { - int rand_data = rand_r(&seed_); - if (static_cast(rand_data % 1000) < static_cast(1000 * dropout)) { - dropout_random[i * T * N * H * D + j] = 0; - y.dptr_[j] = 0; - } else { - dropout_random[i * T * N * H * D + j] = 1.0f - dropout; - y.dptr_[j] = y.dptr_[j] / (1.0f - dropout); + #pragma omp parallel for num_threads(omp_threads) + for (int j = 0; j < T * N * H * D; j++) { + static thread_local std::random_device device; + static thread_local std::default_random_engine generator(device()); + static thread_local std::uniform_int_distribution distribution; + static thread_local auto dice = std::bind(distribution, generator); + int rand_data = dice(); + if (static_cast(rand_data % 1000) < static_cast(1000 * dropout)) { + dropout_random[i * T * N * H * D + j] = 0; + y.dptr_[j] = 0; + } else { + dropout_random[i * T * N * H * D + j] = 1.0f - dropout; + y.dptr_[j] = y.dptr_[j] / (1.0f - dropout); + } } - } } x_ptr = y.dptr_; rs2 += r_size; @@ -994,7 +998,6 @@ void GruForwardTraining(DType* ws, DType* bx_l = bx; DType* bh_l = bh; DType* y_tmp = x_ptr; - unsigned int seed_ = 17 + rand() % 4096; // NOLINT(runtime/threadsafe_fn) for (int l = 0; l < L; l++) { if (l != 0) { y_tmp = y_l; @@ -1004,7 +1007,11 @@ void GruForwardTraining(DType* ws, const int omp_threads = mxnet::engine::OpenMP::Get()->GetRecommendedOMPThreadCount(); #pragma omp parallel for num_threads(omp_threads) for (int i = 0; i < T * N * I; i++) { - int rand_data = rand_r(&seed_); + static thread_local std::random_device device; + static thread_local std::default_random_engine generator(device()); + static thread_local std::uniform_int_distribution distribution; + static thread_local auto dice = std::bind(distribution, generator); + int rand_data = dice(); if (static_cast(rand_data % 1000) < static_cast(1000 * dropout)) { dropout_random[(l - 1) * T * N * I + i] = 0; y_tmp[i] = 0; @@ -1881,7 +1888,6 @@ void VanillaRNNForwardTraining(DType* ws, DType* bh_l = bh; DType* y_tmp = x_ptr; const int omp_threads = mxnet::engine::OpenMP::Get()->GetRecommendedOMPThreadCount(); - unsigned int seed_ = 17 + rand() % 4096; // NOLINT(runtime/threadsafe_fn) for (int l = 0; l < L; l++) { if (l != 0) { y_tmp = y_l; @@ -1890,7 +1896,11 @@ void VanillaRNNForwardTraining(DType* ws, if (dropout > 0.0f && l > 0) { #pragma omp parallel for num_threads(omp_threads) for (int i = 0; i < T * N * I; i++) { - int rand_data = rand_r(&seed_); + static thread_local std::random_device device; + static thread_local std::default_random_engine generator(device()); + static thread_local std::uniform_int_distribution distribution; + static thread_local auto dice = std::bind(distribution, generator); + int rand_data = dice(); if (static_cast(rand_data % 1000) < static_cast(1000 * dropout)) { dropout_random[(l - 1) * T * N * I + i] = 0; y_tmp[i] = 0; diff --git a/tests/cpp/engine/threaded_engine_test.cc b/tests/cpp/engine/threaded_engine_test.cc index 6d669c19bcaa..963fb5a865e2 100644 --- a/tests/cpp/engine/threaded_engine_test.cc +++ b/tests/cpp/engine/threaded_engine_test.cc @@ -33,6 +33,7 @@ #include #include #include +#include #include "../src/engine/engine_impl.h" #include "../include/test_util.h" @@ -58,17 +59,21 @@ void GenerateWorkload(int num_workloads, int num_var, int min_read, int max_read, int min_time, int max_time, std::vector* workloads) { + static thread_local std::default_random_engine generator(seed_); + static thread_local std::uniform_int_distribution distribution; + static thread_local auto dice = std::bind(distribution, generator); + workloads->clear(); workloads->resize(num_workloads); for (int i = 0; i < num_workloads; ++i) { auto& wl = workloads->at(i); - wl.write = rand_r(&seed_) % num_var; - int r = rand_r(&seed_); + wl.write = dice() % num_var; + int r = dice(); int num_read = min_read + (r % (max_read - min_read)); for (int j = 0; j < num_read; ++j) { - wl.reads.push_back(rand_r(&seed_) % num_var); + wl.reads.push_back(dice() % num_var); } - wl.time = min_time + rand_r(&seed_) % (max_time - min_time); + wl.time = min_time + dice() % (max_time - min_time); } } diff --git a/tests/cpp/include/test_ndarray_utils.h b/tests/cpp/include/test_ndarray_utils.h index f5ab96794ada..c0bcc61d2430 100644 --- a/tests/cpp/include/test_ndarray_utils.h +++ b/tests/cpp/include/test_ndarray_utils.h @@ -29,6 +29,8 @@ #include #include #include +#include + #include "test_util.h" #include "test_op.h" @@ -47,16 +49,13 @@ inline void CheckDataRegion(const TBlob &src, const TBlob &dst) { EXPECT_EQ(equals, 0); } -inline unsigned gen_rand_seed() { - time_t timer; - ::time(&timer); - return static_cast(timer); -} - inline float RandFloat() { - static unsigned seed = gen_rand_seed(); - double v = rand_r(&seed) * 1.0 / RAND_MAX; - return static_cast(v); + static thread_local std::random_device device; + static thread_local std::default_random_engine generator(device()); + static thread_local std::uniform_real_distribution distribution; + static thread_local auto dice = std::bind(distribution, generator); + + return dice(); } // Get an NDArray with provided indices, prepared for a RowSparse NDArray. From e5d8e6089f4c84b80866af702f9ec2cd5a001167 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Thu, 9 Aug 2018 16:38:44 +0200 Subject: [PATCH 48/78] Fixed lapack detection with mkl/mklml --- cmake/ChooseBLAS.cmake | 5 ++++- cmake/Modules/FindMKLML.cmake | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/cmake/ChooseBLAS.cmake b/cmake/ChooseBLAS.cmake index cdf8c847cdbd..374b0be32b35 100644 --- a/cmake/ChooseBLAS.cmake +++ b/cmake/ChooseBLAS.cmake @@ -85,6 +85,7 @@ function(try_mkl) set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${MKL_LIBRARIES} PARENT_SCOPE) set(MKL_FOUND ${MKL_FOUND} PARENT_SCOPE) + set(MKL_LIBRARIES ${MKL_LIBRARIES} PARENT_SCOPE) set(MKLROOT ${MKLROOT} PARENT_SCOPE) set(BLAS MKL PARENT_SCOPE) @@ -127,6 +128,7 @@ function(try_mklml) set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${MKL_LIBRARIES} PARENT_SCOPE) set(MKL_FOUND ${MKL_FOUND} PARENT_SCOPE) + set(MKL_LIBRARIES ${MKL_LIBRARIES} PARENT_SCOPE) set(MKLROOT ${MKLROOT} PARENT_SCOPE) set(BLAS MKL PARENT_SCOPE) @@ -221,9 +223,10 @@ if(BLAS MATCHES "[Mm][Kk][Ll]") add_definitions(-DMSHADOW_USE_MKL=1) if(USE_LAPACK) + include(CheckFunctionExists) set(CMAKE_REQUIRED_LIBRARIES ${MKL_LIBRARIES}) - check_function_exists("cgees_" LAPACK_FOUND) + check_function_exists("cheev_" LAPACK_FOUND) if(LAPACK_FOUND) switch_lapack(True) diff --git a/cmake/Modules/FindMKLML.cmake b/cmake/Modules/FindMKLML.cmake index b87bfc32f8a3..507d534cfb75 100644 --- a/cmake/Modules/FindMKLML.cmake +++ b/cmake/Modules/FindMKLML.cmake @@ -98,9 +98,10 @@ find_package_handle_standard_args(MKLML DEFAULT_MSG ${LOOKED_FOR}) if(MKLML_FOUND) set(MKL_FOUND ${MKLML_FOUND}) + set(MKL_LIBRARIES ${MKLML_LIBRARIES}) set(MKL_INCLUDE_DIRS "${MKLML_INCLUDE_DIR}") mark_as_advanced(${LOOKED_FOR}) - message(STATUS "Found MKLML (include: ${MKLML_INCLUDE_DIRS}, libraries: ${MKLML_LIBRARIES})") + message(STATUS "Found MKLML (include: ${MKL_INCLUDE_DIRS}, libraries: ${MKL_LIBRARIES})") endif() From a3dc8e74adeaf9a01188274c15765a5a79d14d19 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Fri, 10 Aug 2018 09:48:33 +0200 Subject: [PATCH 49/78] Warning about LAPACK only if switch was enabled, otherwise status message --- cmake/ChooseBLAS.cmake | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cmake/ChooseBLAS.cmake b/cmake/ChooseBLAS.cmake index 374b0be32b35..27b253118957 100644 --- a/cmake/ChooseBLAS.cmake +++ b/cmake/ChooseBLAS.cmake @@ -23,7 +23,11 @@ function(switch_lapack ENABLE) message(STATUS "Enabling LAPACK functionality") add_definitions(-DMXNET_USE_LAPACK=1) else() - message(WARNING "LAPACK functionality not available") + if(USE_LAPACK) + message(WARNING "LAPACK functionality not available") + else() + message(STATUS "LAPACK functionality not available") + endif() endif() endfunction() From 32bffde53df7d933afa2256d928e6c2a5a8b0a01 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Fri, 10 Aug 2018 12:10:42 +0200 Subject: [PATCH 50/78] Fixed typo --- cmake/Modules/FindMKL.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/Modules/FindMKL.cmake b/cmake/Modules/FindMKL.cmake index d8b533316511..c3554aba1b67 100644 --- a/cmake/Modules/FindMKL.cmake +++ b/cmake/Modules/FindMKL.cmake @@ -28,8 +28,8 @@ # This module defines the following variables: # # MKL_FOUND : True mkl is found -# MKL_INCLUDE_DIR : unclude directory -# MKL_LIBRARIES : the libraries to link against. +# MKL_INCLUDE_DIR : include directory +# MKL_LIBRARIES : the libraries to link against # if(MKL_FOUND) From 484f007c72558ee88fb2ab7711765167569aa03f Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Fri, 10 Aug 2018 12:20:22 +0200 Subject: [PATCH 51/78] Small improvement to mkl libraries linking --- cmake/ChooseBLAS.cmake | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cmake/ChooseBLAS.cmake b/cmake/ChooseBLAS.cmake index 27b253118957..0925ca8aa420 100644 --- a/cmake/ChooseBLAS.cmake +++ b/cmake/ChooseBLAS.cmake @@ -85,10 +85,8 @@ function(try_mkl) if(MKL_FOUND) message(STATUS "MKL framework found") - include_directories(SYSTEM ${MKL_INCLUDE_DIR}) - set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${MKL_LIBRARIES} PARENT_SCOPE) - set(MKL_FOUND ${MKL_FOUND} PARENT_SCOPE) + set(MKL_INCLUDE_DIR ${MKL_INCLUDE_DIR} PARENT_SCOPE) set(MKL_LIBRARIES ${MKL_LIBRARIES} PARENT_SCOPE) set(MKLROOT ${MKLROOT} PARENT_SCOPE) @@ -128,10 +126,9 @@ function(try_mklml) include(${CMAKE_CURRENT_LIST_DIR}/DownloadMKLML.cmake) find_package(MKLML REQUIRED) - include_directories(SYSTEM ${MKL_INCLUDE_DIRS}) - set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} ${MKL_LIBRARIES} PARENT_SCOPE) set(MKL_FOUND ${MKL_FOUND} PARENT_SCOPE) + set(MKL_INCLUDE_DIR ${MKL_INCLUDE_DIR} PARENT_SCOPE) set(MKL_LIBRARIES ${MKL_LIBRARIES} PARENT_SCOPE) set(MKLROOT ${MKLROOT} PARENT_SCOPE) @@ -223,6 +220,9 @@ if(BLAS MATCHES "[Mm][Kk][Ll]") message(FATAL_ERROR "Blas set to MKL but it could not be found") endif() + include_directories(SYSTEM ${MKL_INCLUDE_DIR}) + set(mxnet_LINKER_LIBS ${MKL_LIBRARIES} ${mxnet_LINKER_LIBS}) + add_definitions(-DMSHADOW_USE_CBLAS=0) add_definitions(-DMSHADOW_USE_MKL=1) From 3d8eb982ebb9088353b4ba7c0b8d477f2d972063 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Fri, 10 Aug 2018 12:37:09 +0200 Subject: [PATCH 52/78] Added workaround for mshadow.cmake --- CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7c452b008bbd..f1fe48ba8999 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -362,7 +362,13 @@ if(USE_CUDA AND FIRST_CUDA) include_directories(${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}) else() if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/mshadow/cmake) + # workaroud to refrain mshadow from processing BLAS libraries + # BLAS libraries for MXNet are setup in cmake/ChooseBLAS.cmake + set(__BLAS ${BLAS}) + set(BLAS "Override") include(3rdparty/mshadow/cmake/mshadow.cmake) + set(BLAS ${__BLAS}) + include(3rdparty/mshadow/cmake/Utils.cmake) include(3rdparty/mshadow/cmake/Cuda.cmake) else() From b24d25f4814e8bbaf6e32d4028efb4d332dbc49f Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Fri, 10 Aug 2018 15:13:27 +0200 Subject: [PATCH 53/78] Switched to intel openmp library, since mkldnn uses it --- cmake/Modules/FindMKLML.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/Modules/FindMKLML.cmake b/cmake/Modules/FindMKLML.cmake index 507d534cfb75..658e4d1a09bb 100644 --- a/cmake/Modules/FindMKLML.cmake +++ b/cmake/Modules/FindMKLML.cmake @@ -72,7 +72,7 @@ if(WIN32) elseif(APPLE) list(APPEND MKLML_LIBS mklml) else() - list(APPEND MKLML_LIBS mklml_gnu) + list(APPEND MKLML_LIBS mklml_intel) endif() foreach(__lib ${MKLML_LIBS}) From aac2e7ff2e3c75e0a67a10078d92a39cbe34bbe2 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Fri, 10 Aug 2018 15:14:14 +0200 Subject: [PATCH 54/78] Fixed workaround comment wording --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f1fe48ba8999..61906d42029f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -362,7 +362,7 @@ if(USE_CUDA AND FIRST_CUDA) include_directories(${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}) else() if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/mshadow/cmake) - # workaroud to refrain mshadow from processing BLAS libraries + # Workaroud to prevent mshadow from processing BLAS libraries # BLAS libraries for MXNet are setup in cmake/ChooseBLAS.cmake set(__BLAS ${BLAS}) set(BLAS "Override") From 6c35f67538754480ee57f6e18e6b0946f305ba57 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Fri, 10 Aug 2018 17:34:14 +0200 Subject: [PATCH 55/78] Removed Intel OpenMP library on linux if used with GNU OpenMP --- cmake/DownloadMKLML.cmake | 56 +++++++++++++++++++++++++---------- cmake/Modules/FindMKLML.cmake | 8 ++--- 2 files changed, 44 insertions(+), 20 deletions(-) diff --git a/cmake/DownloadMKLML.cmake b/cmake/DownloadMKLML.cmake index ae1b3ea214e1..47b07f3cc595 100644 --- a/cmake/DownloadMKLML.cmake +++ b/cmake/DownloadMKLML.cmake @@ -22,41 +22,67 @@ message(STATUS "Downloading MKLML...") if(MSVC) set(MKL_NAME "mklml_win_2018.0.3.20180406") - file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.zip" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.zip" EXPECTED_MD5 "8DD73E7D3F19F004551809824C4E8970" SHOW_PROGRESS) - file(DOWNLOAD "https://github.com/apache/incubator-mxnet/releases/download/utils/7z.exe" "${CMAKE_CURRENT_BINARY_DIR}/mklml/7z2.exe" EXPECTED_MD5 "E1CF766CF358F368EC97662D06EA5A4C" SHOW_PROGRESS) + file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.zip" + "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.zip" + EXPECTED_MD5 "8DD73E7D3F19F004551809824C4E8970" SHOW_PROGRESS) + file(DOWNLOAD "https://github.com/apache/incubator-mxnet/releases/download/utils/7z.exe" + "${CMAKE_CURRENT_BINARY_DIR}/mklml/7z2.exe" + EXPECTED_MD5 "E1CF766CF358F368EC97662D06EA5A4C" SHOW_PROGRESS) execute_process(COMMAND "${CMAKE_CURRENT_BINARY_DIR}/mklml/7z2.exe" "-o${CMAKE_CURRENT_BINARY_DIR}/mklml/" "-y") - execute_process(COMMAND "${CMAKE_CURRENT_BINARY_DIR}/mklml/7z.exe" "x" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.zip" "-o${CMAKE_CURRENT_BINARY_DIR}/mklml/" "-y") + execute_process(COMMAND "${CMAKE_CURRENT_BINARY_DIR}/mklml/7z.exe" + "x" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.zip" "-o${CMAKE_CURRENT_BINARY_DIR}/mklml/" "-y") set(MKLROOT "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}") + message(STATUS "Setting MKLROOT path to ${MKLROOT}") - file(COPY ${MKLROOT}/lib/libiomp5md.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - file(COPY ${MKLROOT}/lib/mklml.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - file(COPY ${CMAKE_SOURCE_DIR}/3rdparty/mkldnn/config_template.vcxproj.user DESTINATION ${CMAKE_SOURCE_DIR}) elseif(APPLE) set(MKL_NAME "mklml_mac_2018.0.3.20180406") - file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.tgz" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" EXPECTED_MD5 "23a6f7fd04fb1fa6de0d52a2ec5a2a14" SHOW_PROGRESS) - execute_process(COMMAND "tar" "-xzf" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" "-C" "${CMAKE_CURRENT_BINARY_DIR}/mklml/") + file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.tgz" + "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" + EXPECTED_MD5 "23a6f7fd04fb1fa6de0d52a2ec5a2a14" SHOW_PROGRESS) + execute_process(COMMAND "tar" "-xzf" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" + "-C" "${CMAKE_CURRENT_BINARY_DIR}/mklml/") set(MKLROOT "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}") + message(STATUS "Setting MKLROOT path to ${MKLROOT}") - file(COPY ${MKLROOT}/lib/libiomp5.dylib DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - file(COPY ${MKLROOT}/lib/libmklml.dylib DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) elseif(UNIX) set(MKL_NAME "mklml_lnx_2018.0.3.20180406") - file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.tgz" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" EXPECTED_MD5 "DAF7EFC3C1C0036B447213004467A8AE" SHOW_PROGRESS) - execute_process(COMMAND "tar" "-xzf" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" "-C" "${CMAKE_CURRENT_BINARY_DIR}/mklml/") + file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.tgz" + "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" + EXPECTED_MD5 "DAF7EFC3C1C0036B447213004467A8AE" SHOW_PROGRESS) + execute_process(COMMAND "tar" "-xzf" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" + "-C" "${CMAKE_CURRENT_BINARY_DIR}/mklml/") set(MKLROOT "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}") + + # The MXNet option USE_OPENMP is switching OpenMP for the MXNet project. MKLML will depend on it in any case. + # Using -fopenmp with -liomp5 (linking to Intel OpenMP) leads to undefined behavior. The not needed + # Intel OpenMP library needs to be removed that it couldn't be used accidentially. For example, + # MKLDNN 3rdparty/mkldnn/cmake/MKL.cmake will discover it and use if found. + # https://github.com/intel/mkl-dnn/blob/master/README.md + set(REMOVE_INTEL_OPENMP ${USE_OPENMP}) + + if(REMOVE_INTEL_OPENMP) + message(STATUS "Intel OpenMP library will be removed") + endif() + + if(REMOVE_INTEL_OPENMP) + file(REMOVE ${MKLROOT}/lib/libiomp5.so) + file(REMOVE ${MKLROOT}/lib/libmklml_intel.so) + file(RENAME ${MKLROOT}/lib/libmklml_gnu.so ${MKLROOT}/lib/libmklml.so) + else() + file(REMOVE ${MKLROOT}/lib/libmklml_gnu.so) + file(RENAME ${MKLROOT}/lib/libmklml_intel.so ${MKLROOT}/lib/libmklml.so) + endif() + message(STATUS "Setting MKLROOT path to ${MKLROOT}") - file(COPY ${MKLROOT}/lib/libiomp5.so DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - file(COPY ${MKLROOT}/lib/libmklml_gnu.so DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - file(COPY ${MKLROOT}/lib/libmklml_intel.so DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) else() message(FATAL_ERROR "Wrong platform") endif() diff --git a/cmake/Modules/FindMKLML.cmake b/cmake/Modules/FindMKLML.cmake index 658e4d1a09bb..2767a976147a 100644 --- a/cmake/Modules/FindMKLML.cmake +++ b/cmake/Modules/FindMKLML.cmake @@ -65,14 +65,12 @@ set(LOOKED_FOR MKLML_INCLUDE_DIR ) -set(MKLML_LIBS iomp5) +set(MKLML_LIBS) -if(WIN32) - list(APPEND MKLML_LIBS mklml) -elseif(APPLE) +if(REMOVE_INTEL_OPENMP) list(APPEND MKLML_LIBS mklml) else() - list(APPEND MKLML_LIBS mklml_intel) + list(APPEND MKLML_LIBS iomp5 mklml) endif() foreach(__lib ${MKLML_LIBS}) From be2faf5020a288bb14bdeee92b84fbf7516979bd Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Mon, 13 Aug 2018 11:53:28 +0200 Subject: [PATCH 56/78] Separated MKLDNN from MKL and MKLML --- CMakeLists.txt | 62 +++++++++++++++++++++++------------------- cmake/ChooseBLAS.cmake | 39 +++++++++++--------------- 2 files changed, 50 insertions(+), 51 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 61906d42029f..43d8485d5151 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,13 +51,35 @@ mxnet_option(USE_TENSORRT "Enable infeference optimization with TensorRT mxnet_option(USE_ASAN "Enable Clang/GCC ASAN sanitizers." OFF) mxnet_option(ENABLE_TESTCOVERAGE "Enable compilation with test coverage metric output" OFF) +if(NOT mxnet_LINKER_LIBS) + set(mxnet_LINKER_LIBS "") +endif(NOT mxnet_LINKER_LIBS) + +if(MSVC) + set(SYSTEM_ARCHITECTURE x86_64) +else() + execute_process(COMMAND uname -m COMMAND tr -d '\n' OUTPUT_VARIABLE SYSTEM_ARCHITECTURE) +endif() + +set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules;${CMAKE_MODULE_PATH}") + +SET(EXTRA_OPERATORS "" CACHE PATH "EXTRA OPERATORS PATH") + +if("$ENV{VERBOSE}" STREQUAL "1") + message(STATUS " Verbose Makefile ACTIVATED") + set(CMAKE_VERBOSE_MAKEFILE ON) +endif() + +# ---[ BLAS + # Choose BLAS (Basic Linear Algebra Subprograms) computation libraries # MXNet supports multiple mathematical backends for computations on the CPU: # # * Atlas # * OpenBLAS -# * MKL (MKL, MKLML, MKLDNN) +# * MKL (MKL, MKLML) +# * MKLDNN # * Apple Accelerate # # The default order of choice for the libraries if found follows the path from the most @@ -65,15 +87,18 @@ mxnet_option(ENABLE_TESTCOVERAGE "Enable compilation with test coverage metric # # For desktop platforms (x86_64): # -# 1. MKLDNN (requires and checks for MKL or MKLML) | USE_MKLDNN +# 1. MKLDNN (submodule) | USE_MKLDNN # 2. MKL | USE_MKL_IF_AVAILABLE # 3. MKLML (downloaded) | USE_MKLML # 4. Apple Accelerate | USE_APPLE_ACCELERATE_IF_AVAILABLE | Mac only -# 5. OpenBLAS | BLAS (Atlas;Open;MKL;Apple) +# 5. OpenBLAS | BLAS | Options: Atlas, Open, MKL, Apple +# +# Note: If USE_MKL_IF_AVAILABLE is set to False then MKLML and MKLDNN will be disabled as well for configuration +# backwards compatibility. # # For embedded platforms (all other and if cross compiled): # -# 1. OpenBLAS | BLAS (Atlas;Open) +# 1. OpenBLAS | BLAS | Options: Atlas, Open # # You can set the BLAS library explicitly by setting the BLAS variable to: # @@ -98,10 +123,11 @@ mxnet_option(ENABLE_TESTCOVERAGE "Enable compilation with test coverage metric # is the most effective option since it can be downloaded and installed automatically # by the cmake script (see cmake/DownloadMKLML.cmake). # -# * MKLDNN is a separate open-source library, but it requires MKL or MKLML. It is +# * MKLDNN is a separate open-source library, it can be used separately from MKL or MKLML. It is # shipped as a subrepo with MXNet source code (see 3rdparty/mkldnn). +# See: https://github.com/intel/mkl-dnn # -# Since the full MKL library is almost always faster than any other it's turned on by default, +# Since the full MKL library is almost always faster than any other BLAS library it's turned on by default, # however it needs to be downloaded and installed manually before doing cmake configuration. # Register and download here https://software.seek.intel.com/performance-libraries # @@ -120,12 +146,12 @@ mxnet_option(USE_MKL_IF_AVAILABLE "Use MKL if found" ON) # If the full MKL library could not be found the thinner subset MKLML will be downloaded # unless switched off explicitly. # Note: The same limitation on hardware as for MKL applies for MKLML as well. -mxnet_option(USE_MKLML "Use MKLML subset of MKL instead of mkl, will be downloaded" ON) +mxnet_option(USE_MKLML "Use MKLML subset of MKL instead of full MKL, will be downloaded" ON) # If either MKL of MKLML is present MKLDNN can be utilised from the 3rdparty/mkldnn subrepo. # See more information here: https://github.com/intel/mkl-dnn # Note: The same limitation on hardware as for MKL and MKLDNN applies for MKLDNN as well. -mxnet_option(USE_MKLDNN "Use MKLDNN (requires MKLML or MKL)" ON) +mxnet_option(USE_MKLDNN "Use MKLDNN (separate addition to MKL, MKL/MKLML not required)" ON) # Apple's mathematical framework, probably the best choice on a Mac if MKL/MKLML/MKLDNN # are not available. @@ -140,26 +166,6 @@ mxnet_option(USE_APPLE_ACCELERATE_IF_AVAILABLE "Use Apple Accelerate framework i # functionality off if not found. mxnet_option(USE_LAPACK "Build with lapack support" ON) -if(NOT mxnet_LINKER_LIBS) - set(mxnet_LINKER_LIBS "") -endif(NOT mxnet_LINKER_LIBS) - -if(MSVC) - set(SYSTEM_ARCHITECTURE x86_64) -else() - execute_process(COMMAND uname -m COMMAND tr -d '\n' OUTPUT_VARIABLE SYSTEM_ARCHITECTURE) -endif() - -set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules;${CMAKE_MODULE_PATH}") - -SET(EXTRA_OPERATORS "" CACHE PATH "EXTRA OPERATORS PATH") - -if("$ENV{VERBOSE}" STREQUAL "1") - message(STATUS " Verbose Makefile ACTIVATED") - set(CMAKE_VERBOSE_MAKEFILE ON) -endif() - -# ---[ BLAS include(cmake/ChooseBLAS.cmake) if(USE_CUDA AND NOT USE_OLDCMAKECUDA) diff --git a/cmake/ChooseBLAS.cmake b/cmake/ChooseBLAS.cmake index 0925ca8aa420..809a75305de7 100644 --- a/cmake/ChooseBLAS.cmake +++ b/cmake/ChooseBLAS.cmake @@ -37,18 +37,18 @@ function(try_mkldnn) return() endif() - if(NOT MKL_FOUND) - message(WARNING "MKLDNN requires either MKL or MKLML, MKLDNN will not be available") - return() - endif() - - message(STATUS "Adding MKLDNN to the build due to USE_MKLDNN=${USE_MKLDNN} and MKL_FOUND=${MKL_FOUND}") + message(STATUS "Adding MKLDNN to the build due to \ + USE_MKLDNN=${USE_MKLDNN} and USE_MKL_IF_AVAILABLE=${USE_MKL_IF_AVAILABLE}") # CPU architecture (e.g., C5) can't run on another architecture (e.g., g3). if(NOT MSVC) set(ARCH_OPT_FLAGS ${ARCH_OPT_FLAGS} "-mtune=generic" PARENT_SCOPE) endif() + if(MSVC) + file(COPY ${CMAKE_SOURCE_DIR}/3rdparty/mkldnn/config_template.vcxproj.user DESTINATION ${CMAKE_SOURCE_DIR}) + endif() + set(WITH_TEST OFF) set(WITH_EXAMPLE OFF) add_subdirectory(3rdparty/mkldnn) @@ -56,16 +56,13 @@ function(try_mkldnn) include_directories(3rdparty/mkldnn/include) set(mxnet_LINKER_LIBS ${mxnet_LINKER_LIBS} mkldnn PARENT_SCOPE) - add_definitions(-DUSE_MKL=1) - add_definitions(-DCUB_MKL=1) add_definitions(-DMXNET_USE_MKLDNN=1) endfunction() function(try_mkl) - if(USE_MKLML) - return() - endif() + + message(STATUS "Trying to enable MKL framework due to USE_MKL_IF_AVAILABLE=${USE_MKL_IF_AVAILABLE}") if(CMAKE_CROSSCOMPILING) message(WARNING "MKL with cross compilation is not supported, MKL will not be available") @@ -78,8 +75,6 @@ function(try_mkl) return() endif() - message(STATUS "Trying to enable MKL framework due to USE_MKL_IF_AVAILABLE=${USE_MKL_IF_AVAILABLE}") - find_package(MKL) if(MKL_FOUND) @@ -102,28 +97,24 @@ function(try_mklml) return() endif() - if(CMAKE_CROSSCOMPILING) - message(STATUS "MKLML is supported only for desktop platforms, skipping...") - return() - endif() - if(MKL_FOUND) return() endif() + message(STATUS "Trying to enable MKLML framework due to \ + USE_MKLML=${USE_MKLML} and USE_MKL_IF_AVAILABLE=${USE_MKL_IF_AVAILABLE}") + if(CMAKE_CROSSCOMPILING) - message(WARNING "MKLML with cross compilation is not supported, MKLML will not be available") + message(WARNING "MKLML with cross compilation is not supported, MKL will not be available") return() endif() if(NOT SYSTEM_ARCHITECTURE STREQUAL "x86_64") - message(WARNING "MKLML is supported only for desktop platforms (SYSTEM_ARCHITECTURE=${SYSTEM_ARCHITECTURE}), \ - MKLML will not be available") + message(WARNING "MKL is supported only for desktop platforms (SYSTEM_ARCHITECTURE=${SYSTEM_ARCHITECTURE}), \ + MKL will not be available") return() endif() - message(STATUS "Trying to enable MKLML framework due to USE_MKLML=${USE_MKLML}") - include(${CMAKE_CURRENT_LIST_DIR}/DownloadMKLML.cmake) find_package(MKLML REQUIRED) @@ -223,6 +214,8 @@ if(BLAS MATCHES "[Mm][Kk][Ll]") include_directories(SYSTEM ${MKL_INCLUDE_DIR}) set(mxnet_LINKER_LIBS ${MKL_LIBRARIES} ${mxnet_LINKER_LIBS}) + add_definitions(-DUSE_MKL=1) + add_definitions(-DCUB_MKL=1) add_definitions(-DMSHADOW_USE_CBLAS=0) add_definitions(-DMSHADOW_USE_MKL=1) From f97f37f5861ce74f149f46b06df34cbaeddb623a Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Mon, 13 Aug 2018 14:03:13 +0200 Subject: [PATCH 57/78] Fixed MKL_INCLUDE_DIR variable being named MKL_INCLUDE_DIRS --- cmake/Modules/FindMKLML.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/Modules/FindMKLML.cmake b/cmake/Modules/FindMKLML.cmake index 2767a976147a..3a6cba48f388 100644 --- a/cmake/Modules/FindMKLML.cmake +++ b/cmake/Modules/FindMKLML.cmake @@ -24,7 +24,7 @@ # The following are set after configuration is done: # # MKL_FOUND -# MKL_INCLUDE_DIRS +# MKL_INCLUDE_DIR # MKL_LIBRARIES if(MKL_FOUND) @@ -97,7 +97,7 @@ find_package_handle_standard_args(MKLML DEFAULT_MSG ${LOOKED_FOR}) if(MKLML_FOUND) set(MKL_FOUND ${MKLML_FOUND}) set(MKL_LIBRARIES ${MKLML_LIBRARIES}) - set(MKL_INCLUDE_DIRS "${MKLML_INCLUDE_DIR}") + set(MKL_INCLUDE_DIR "${MKLML_INCLUDE_DIR}") mark_as_advanced(${LOOKED_FOR}) From a32cd584b7d4eb145c6969c2266d4e6b86586f73 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Mon, 13 Aug 2018 16:40:19 +0200 Subject: [PATCH 58/78] Various MKL/MKLML improvements --- cmake/ChooseBLAS.cmake | 11 ++++--- cmake/Modules/FindMKLML.cmake | 57 +++++++++++++++++++++++------------ 2 files changed, 45 insertions(+), 23 deletions(-) diff --git a/cmake/ChooseBLAS.cmake b/cmake/ChooseBLAS.cmake index 809a75305de7..335eba71b9b8 100644 --- a/cmake/ChooseBLAS.cmake +++ b/cmake/ChooseBLAS.cmake @@ -115,12 +115,17 @@ function(try_mklml) return() endif() - include(${CMAKE_CURRENT_LIST_DIR}/DownloadMKLML.cmake) - find_package(MKLML REQUIRED) + find_package(MKLML) + + if(NOT MKL_FOUND) + include(${CMAKE_CURRENT_LIST_DIR}/DownloadMKLML.cmake) + find_package(MKLML REQUIRED) + endif() set(MKL_FOUND ${MKL_FOUND} PARENT_SCOPE) set(MKL_INCLUDE_DIR ${MKL_INCLUDE_DIR} PARENT_SCOPE) set(MKL_LIBRARIES ${MKL_LIBRARIES} PARENT_SCOPE) + set(MKL_USE_INTEL_OMP ${MKL_USE_INTEL_OMP} PARENT_SCOPE) set(MKLROOT ${MKLROOT} PARENT_SCOPE) set(BLAS MKL PARENT_SCOPE) @@ -214,8 +219,6 @@ if(BLAS MATCHES "[Mm][Kk][Ll]") include_directories(SYSTEM ${MKL_INCLUDE_DIR}) set(mxnet_LINKER_LIBS ${MKL_LIBRARIES} ${mxnet_LINKER_LIBS}) - add_definitions(-DUSE_MKL=1) - add_definitions(-DCUB_MKL=1) add_definitions(-DMSHADOW_USE_CBLAS=0) add_definitions(-DMSHADOW_USE_MKL=1) diff --git a/cmake/Modules/FindMKLML.cmake b/cmake/Modules/FindMKLML.cmake index 3a6cba48f388..2bab8bba05bc 100644 --- a/cmake/Modules/FindMKLML.cmake +++ b/cmake/Modules/FindMKLML.cmake @@ -26,6 +26,7 @@ # MKL_FOUND # MKL_INCLUDE_DIR # MKL_LIBRARIES +# MKL_USE_INTEL_OMP if(MKL_FOUND) return() @@ -38,6 +39,9 @@ set(MKLML_INCLUDE_SEARCH_PATHS "${MKLROOT}" "${PROJECT_SOURCE_DIR}/3rdparty/MKLML" + + /usr + /usr/local ) # ---[ Find libraries @@ -54,6 +58,9 @@ set(MKLML_LIB_SEARCH_PATHS "${MKLROOT}" "${PROJECT_SOURCE_DIR}/3rdparty/MKLML" + + /usr + /usr/local ) find_path(MKLML_INCLUDE_DIR @@ -65,31 +72,43 @@ set(LOOKED_FOR MKLML_INCLUDE_DIR ) -set(MKLML_LIBS) +# Find Intel OpenMP +set(MKL_USE_INTEL_OMP) -if(REMOVE_INTEL_OPENMP) - list(APPEND MKLML_LIBS mklml) -else() - list(APPEND MKLML_LIBS iomp5 mklml) +find_library(IOMP5_LIBRARY + NAMES iomp5 libiomp5.lib libiomp5md.lib + PATHS ${MKLML_LIB_SEARCH_PATHS} + PATH_SUFFIXES ${PATH_SUFFIXES} + ) +mark_as_advanced(IOMP5_LIBRARY) + +if(IOMP5_LIBRARY) + list(APPEND LOOKED_FOR IOMP5_LIBRARY) + list(APPEND MKLML_LIBRARIES ${IOMP5_LIBRARY}) + + set(MKL_USE_INTEL_OMP True) endif() -foreach(__lib ${MKLML_LIBS}) - set(__mkl_lib "${__lib}") - string(TOUPPER ${__mkl_lib} __mkl_lib_upper) +# add static windows libs first +set(__MKL_LIB_NAMES libmklml.lib libmklmlmd.lib) + +if(MKL_USE_INTEL_OMP) + list(APPEND __MKL_LIB_NAMES mklml_intel) +else() + list(APPEND __MKL_LIB_NAMES mklml_gnu) +endif() - # add static windows libs first - set(__mkl_lib_names lib${__mkl_lib}.lib lib${__mkl_lib}md.lib) +mark_as_advanced(__MKL_LIB_NAMES) - find_library(${__mkl_lib_upper}_LIBRARY - NAMES ${__mkl_lib_names} ${__mkl_lib} - PATHS ${MKLML_LIB_SEARCH_PATHS} - PATH_SUFFIXES ${PATH_SUFFIXES} - ) - mark_as_advanced(${__mkl_lib_upper}_LIBRARY) +find_library(MKLML_LIBRARY + NAMES ${__MKL_LIB_NAMES} mklml + PATHS ${MKLML_LIB_SEARCH_PATHS} + PATH_SUFFIXES ${PATH_SUFFIXES} + ) +mark_as_advanced(MKLML_LIBRARY) - list(APPEND LOOKED_FOR ${__mkl_lib_upper}_LIBRARY) - list(APPEND MKLML_LIBRARIES ${${__mkl_lib_upper}_LIBRARY}) -endforeach() +list(APPEND LOOKED_FOR MKLML_LIBRARY) +list(APPEND MKLML_LIBRARIES ${MKLML_LIBRARY}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(MKLML DEFAULT_MSG ${LOOKED_FOR}) From f1c5a05d64f1521dc90f6640897d2cdb1b0a20cb Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Mon, 13 Aug 2018 16:44:31 +0200 Subject: [PATCH 59/78] Fixed logging indentation --- cmake/ChooseBLAS.cmake | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/cmake/ChooseBLAS.cmake b/cmake/ChooseBLAS.cmake index 335eba71b9b8..62b9dfcc4f5a 100644 --- a/cmake/ChooseBLAS.cmake +++ b/cmake/ChooseBLAS.cmake @@ -37,8 +37,7 @@ function(try_mkldnn) return() endif() - message(STATUS "Adding MKLDNN to the build due to \ - USE_MKLDNN=${USE_MKLDNN} and USE_MKL_IF_AVAILABLE=${USE_MKL_IF_AVAILABLE}") + message(STATUS "Adding MKLDNN to the build due to USE_MKLDNN=${USE_MKLDNN} and USE_MKL_IF_AVAILABLE=${USE_MKL_IF_AVAILABLE}") # CPU architecture (e.g., C5) can't run on another architecture (e.g., g3). if(NOT MSVC) @@ -70,8 +69,7 @@ function(try_mkl) endif() if(NOT SYSTEM_ARCHITECTURE STREQUAL "x86_64") - message(WARNING "MKL is supported only for desktop platforms (SYSTEM_ARCHITECTURE=${SYSTEM_ARCHITECTURE}), \ - MKL will not be available") + message(WARNING "MKL is supported only for desktop platforms (SYSTEM_ARCHITECTURE=${SYSTEM_ARCHITECTURE}), MKL will not be available") return() endif() @@ -101,8 +99,7 @@ function(try_mklml) return() endif() - message(STATUS "Trying to enable MKLML framework due to \ - USE_MKLML=${USE_MKLML} and USE_MKL_IF_AVAILABLE=${USE_MKL_IF_AVAILABLE}") + message(STATUS "Trying to enable MKLML framework due to USE_MKLML=${USE_MKLML} and USE_MKL_IF_AVAILABLE=${USE_MKL_IF_AVAILABLE}") if(CMAKE_CROSSCOMPILING) message(WARNING "MKLML with cross compilation is not supported, MKL will not be available") @@ -110,8 +107,7 @@ function(try_mklml) endif() if(NOT SYSTEM_ARCHITECTURE STREQUAL "x86_64") - message(WARNING "MKL is supported only for desktop platforms (SYSTEM_ARCHITECTURE=${SYSTEM_ARCHITECTURE}), \ - MKL will not be available") + message(WARNING "MKL is supported only for desktop platforms (SYSTEM_ARCHITECTURE=${SYSTEM_ARCHITECTURE}), MKL will not be available") return() endif() From 217294b870de66f63927bb5cfca027d31a85496d Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Mon, 13 Aug 2018 17:47:49 +0200 Subject: [PATCH 60/78] Applied review comments fixes, disabled OpenMP for AppleClang --- CMakeLists.txt | 51 +++++++++++++++++++---------------- cmake/ChooseBLAS.cmake | 19 ++++++++----- cmake/Modules/FindMKLML.cmake | 4 ++- 3 files changed, 44 insertions(+), 30 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 43d8485d5151..776def25f4aa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -368,7 +368,8 @@ if(USE_CUDA AND FIRST_CUDA) include_directories(${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}) else() if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/mshadow/cmake) - # Workaroud to prevent mshadow from processing BLAS libraries + # Workaroud to prevent mshadow from processing BLAS libraries. The main problem is with MKL - if MKLML is used it + # would still try to find MKL instead and will fail. # BLAS libraries for MXNet are setup in cmake/ChooseBLAS.cmake set(__BLAS ${BLAS}) set(BLAS "Override") @@ -477,33 +478,37 @@ endif() # ---[ OpenMP if(USE_OPENMP) - find_package(OpenMP REQUIRED) - # This should build on Windows, but there's some problem and I don't have a Windows box, so - # could a Windows user please fix? - if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/openmp/CMakeLists.txt - AND SYSTEM_ARCHITECTURE STREQUAL "x86_64" - AND NOT MSVC - AND NOT CMAKE_CROSSCOMPILING) - - # Intel/llvm OpenMP: https://github.com/llvm-mirror/openmp - set(OPENMP_STANDALONE_BUILD TRUE) - set(LIBOMP_ENABLE_SHARED TRUE) - add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/openmp) - list(REMOVE_ITEM mxnet_LINKER_LIBS iomp5) - list(APPEND mxnet_LINKER_LIBS omp) - if(UNIX) - list(APPEND mxnet_LINKER_LIBS pthread) + # This should also identify whether compiler supports it (AppleClang for example doesn't) + find_package(OpenMP) + if(OpenMP_FOUND) + # This should build on Windows, but there's some problem and I don't have a Windows box, so + # could a Windows user please fix? + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/openmp/CMakeLists.txt + AND SYSTEM_ARCHITECTURE STREQUAL "x86_64" + AND NOT MSVC + AND NOT CMAKE_CROSSCOMPILING) + + # Intel/llvm OpenMP: https://github.com/llvm-mirror/openmp + set(OPENMP_STANDALONE_BUILD TRUE) + set(LIBOMP_ENABLE_SHARED TRUE) + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/openmp) + list(REMOVE_ITEM mxnet_LINKER_LIBS iomp5) + list(APPEND mxnet_LINKER_LIBS omp) + if(UNIX) + list(APPEND mxnet_LINKER_LIBS pthread) + endif() endif() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}") + else() - if(OPENMP_FOUND) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}") - endif() + message(WARNING "OpenMP support could not be found, OpenMP will be disabled") + set(USE_OPENMP False) endif() + elseif(UNIX AND NOT ANDROID) list(APPEND mxnet_LINKER_LIBS pthread) endif() diff --git a/cmake/ChooseBLAS.cmake b/cmake/ChooseBLAS.cmake index 62b9dfcc4f5a..42d72dd01c23 100644 --- a/cmake/ChooseBLAS.cmake +++ b/cmake/ChooseBLAS.cmake @@ -135,7 +135,11 @@ function(try_accelerate) return() endif() - if(BLAS MATCHES "[Mm][Kk][Ll]") + set(__BLAS) + string(TOLOWER "${BLAS}" __BLAS) + mark_as_advanced(__BLAS) + + if(__BLAS MATCHES "mkl") return() endif() @@ -151,6 +155,10 @@ function(try_accelerate) endif() endfunction() +set(__BLAS) +string(TOLOWER "${BLAS}" __BLAS) +mark_as_advanced(__BLAS) + if(USE_MKL_IF_AVAILABLE) set(MKL_FOUND) @@ -161,8 +169,7 @@ endif() try_accelerate() -# cmake regexp does not support case insensitive match (?i) or //i -if(BLAS MATCHES "[Aa][Tt][Ll][Aa][Ss]") +if(__BLAS MATCHES "atlas") message(STATUS "Using Atlas for BLAS") set(Atlas_NEED_LAPACK ${USE_LAPACK}) @@ -183,7 +190,7 @@ if(BLAS MATCHES "[Aa][Tt][Ll][Aa][Ss]") return() endif() -if(BLAS MATCHES "[Oo][Pp][Ee][Nn]") +if(__BLAS MATCHES "open") message(STATUS "Using OpenBLAS for BLAS") set(OpenBLAS_NEED_LAPACK ${USE_LAPACK}) @@ -205,7 +212,7 @@ if(BLAS MATCHES "[Oo][Pp][Ee][Nn]") return() endif() -if(BLAS MATCHES "[Mm][Kk][Ll]") +if(__BLAS MATCHES "mkl") message(STATUS "Using MKL for BLAS") if(NOT MKL_FOUND) @@ -234,7 +241,7 @@ if(BLAS MATCHES "[Mm][Kk][Ll]") endif() endif() -if(BLAS MATCHES "([Aa][Pp][Pp][Ll][Ee]|[Aa][Cc][Cc][Ee][Ll][Ee][Rr][Aa][Tt][Ee])") +if(BLAS MATCHES "(apple|accelerate)") if(NOT APPLE) message(FATAL_ERROR "Apple Accelerate framework's BLAS feature is available only on macOS") return() diff --git a/cmake/Modules/FindMKLML.cmake b/cmake/Modules/FindMKLML.cmake index 2bab8bba05bc..321b4c6e8b2e 100644 --- a/cmake/Modules/FindMKLML.cmake +++ b/cmake/Modules/FindMKLML.cmake @@ -72,6 +72,8 @@ set(LOOKED_FOR MKLML_INCLUDE_DIR ) +set(MKLML_LIBRARIES) + # Find Intel OpenMP set(MKL_USE_INTEL_OMP) @@ -120,5 +122,5 @@ if(MKLML_FOUND) mark_as_advanced(${LOOKED_FOR}) - message(STATUS "Found MKLML (include: ${MKL_INCLUDE_DIRS}, libraries: ${MKL_LIBRARIES})") + message(STATUS "Found MKLML (include: ${MKL_INCLUDE_DIR}, libraries: ${MKL_LIBRARIES})") endif() From 14ec7c53ac0be231acefc7cfc5d7ec9a57e4fd56 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Mon, 13 Aug 2018 18:04:35 +0200 Subject: [PATCH 61/78] Small improvement to MKL libraries search --- cmake/Modules/FindMKL.cmake | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cmake/Modules/FindMKL.cmake b/cmake/Modules/FindMKL.cmake index c3554aba1b67..24567514db48 100644 --- a/cmake/Modules/FindMKL.cmake +++ b/cmake/Modules/FindMKL.cmake @@ -57,6 +57,9 @@ set(MKL_INCLUDE_SEARCH_PATHS "${MKLROOT}" "${INTEL_ROOT}/mkl" + + /usr + /usr/local ) # ---[ Find include dir @@ -74,6 +77,9 @@ set(MKL_LIB_SEARCH_PATHS "${INTEL_ROOT}/compiler" "${MKLROOT}/.." "${MKLROOT}/../compiler" + + /usr + /usr/local ) set(__looked_for MKL_INCLUDE_DIR) @@ -82,7 +88,7 @@ set(__looked_for MKL_INCLUDE_DIR) if(CMAKE_SIZEOF_VOID_P EQUAL 4) set(__path_suffixes lib lib/ia32) else() - set(__path_suffixes lib lib/intel64) + set(__path_suffixes lib lib64 lib/intel64) endif() set(__mkl_libs "") From f9266adc89d11a1c704fe36c07ee82b5fae882df Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Mon, 13 Aug 2018 18:35:08 +0200 Subject: [PATCH 62/78] Fixed MKL force after it was found --- cmake/ChooseBLAS.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/ChooseBLAS.cmake b/cmake/ChooseBLAS.cmake index 42d72dd01c23..a85470121700 100644 --- a/cmake/ChooseBLAS.cmake +++ b/cmake/ChooseBLAS.cmake @@ -83,7 +83,7 @@ function(try_mkl) set(MKL_LIBRARIES ${MKL_LIBRARIES} PARENT_SCOPE) set(MKLROOT ${MKLROOT} PARENT_SCOPE) - set(BLAS MKL PARENT_SCOPE) + set(BLAS mkl PARENT_SCOPE) else() message(STATUS "MKL framework not found") endif() @@ -124,7 +124,7 @@ function(try_mklml) set(MKL_USE_INTEL_OMP ${MKL_USE_INTEL_OMP} PARENT_SCOPE) set(MKLROOT ${MKLROOT} PARENT_SCOPE) - set(BLAS MKL PARENT_SCOPE) + set(BLAS mkl PARENT_SCOPE) message(STATUS "MKLML framework found") From 78bbb432e8f9bb17e88d7c27aa7f337c0e3d27ed Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Thu, 23 Aug 2018 13:24:40 +0200 Subject: [PATCH 63/78] Added workaround for another mshadow inclusion --- CMakeLists.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 776def25f4aa..b6e10d1fef84 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -550,8 +550,15 @@ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/dmlc-core/cmake) endif() if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/mshadow/cmake) + # Workaroud to prevent mshadow from processing BLAS libraries. The main problem is with MKL - if MKLML is used it + # would still try to find MKL instead and will fail. + # BLAS libraries for MXNet are setup in cmake/ChooseBLAS.cmake + set(__BLAS ${BLAS}) + set(BLAS "Override") add_subdirectory("3rdparty/mshadow") + set(BLAS ${__BLAS}) endif() + FILE(GLOB_RECURSE SOURCE "src/*.cc" "src/*.h" "include/*.h") FILE(GLOB_RECURSE CUDA "src/*.cu" "src/*.cuh") From ff406ddfb37bd31d147407fa8ccee07cd250b295 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Thu, 23 Aug 2018 13:51:23 +0200 Subject: [PATCH 64/78] Added debug statements --- cmake/Modules/FindMKLML.cmake | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/cmake/Modules/FindMKLML.cmake b/cmake/Modules/FindMKLML.cmake index 321b4c6e8b2e..3d93bb168cc0 100644 --- a/cmake/Modules/FindMKLML.cmake +++ b/cmake/Modules/FindMKLML.cmake @@ -100,15 +100,25 @@ else() list(APPEND __MKL_LIB_NAMES mklml_gnu) endif() +list(APPEND __MKL_LIB_NAMES mklml) + mark_as_advanced(__MKL_LIB_NAMES) +message("MKLML_LIBRARY=${MKLML_LIBRARY}") +message("__MKL_LIB_NAMES=${__MKL_LIB_NAMES}") +message("MKLML_LIB_SEARCH_PATHS=${MKLML_LIB_SEARCH_PATHS}") +message("PATH_SUFFIXES=${PATH_SUFFIXES}") + find_library(MKLML_LIBRARY - NAMES ${__MKL_LIB_NAMES} mklml + NAMES ${__MKL_LIB_NAMES} PATHS ${MKLML_LIB_SEARCH_PATHS} PATH_SUFFIXES ${PATH_SUFFIXES} ) + mark_as_advanced(MKLML_LIBRARY) +message("AFTER: MKLML_LIBRARY=${MKLML_LIBRARY}") + list(APPEND LOOKED_FOR MKLML_LIBRARY) list(APPEND MKLML_LIBRARIES ${MKLML_LIBRARY}) From c9b55411b7ad92d745246ce83cbfb0bbf31df0ba Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Thu, 23 Aug 2018 14:11:10 +0200 Subject: [PATCH 65/78] Improved workaround for mshadow --- CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index b6e10d1fef84..9af3cb240902 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -372,9 +372,12 @@ else() # would still try to find MKL instead and will fail. # BLAS libraries for MXNet are setup in cmake/ChooseBLAS.cmake set(__BLAS ${BLAS}) + set(__USE_MKL_IF_AVAILABLE ${USE_MKL_IF_AVAILABLE}) + set(USE_MKL_IF_AVAILABLE False) set(BLAS "Override") include(3rdparty/mshadow/cmake/mshadow.cmake) set(BLAS ${__BLAS}) + set(USE_MKL_IF_AVAILABLE ${__USE_MKL_IF_AVAILABLE}) include(3rdparty/mshadow/cmake/Utils.cmake) include(3rdparty/mshadow/cmake/Cuda.cmake) @@ -554,9 +557,12 @@ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/mshadow/cmake) # would still try to find MKL instead and will fail. # BLAS libraries for MXNet are setup in cmake/ChooseBLAS.cmake set(__BLAS ${BLAS}) + set(__USE_MKL_IF_AVAILABLE ${USE_MKL_IF_AVAILABLE}) + set(USE_MKL_IF_AVAILABLE False) set(BLAS "Override") add_subdirectory("3rdparty/mshadow") set(BLAS ${__BLAS}) + set(USE_MKL_IF_AVAILABLE ${__USE_MKL_IF_AVAILABLE}) endif() FILE(GLOB_RECURSE SOURCE "src/*.cc" "src/*.h" "include/*.h") From 78660063a456bff96f2ab226f73c0b271db167be Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Thu, 23 Aug 2018 14:34:47 +0200 Subject: [PATCH 66/78] Fixed intel/gnu omp recognition --- cmake/Modules/FindMKLML.cmake | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/cmake/Modules/FindMKLML.cmake b/cmake/Modules/FindMKLML.cmake index 3d93bb168cc0..b2cbe87bc457 100644 --- a/cmake/Modules/FindMKLML.cmake +++ b/cmake/Modules/FindMKLML.cmake @@ -46,11 +46,13 @@ set(MKLML_INCLUDE_SEARCH_PATHS # ---[ Find libraries if(CMAKE_SIZEOF_VOID_P EQUAL 4) - set(PATH_SUFFIXES lib lib/ia32) + set(__PATH_SUFFIXES lib lib/ia32) else() - set(PATH_SUFFIXES lib lib/intel64) + set(__PATH_SUFFIXES lib lib64 lib/intel64) endif() +mark_as_advanced(__PATH_SUFFIXES) + set(MKLML_LIB_SEARCH_PATHS ${MKLML_LIB_SEARCH_PATHS} @@ -80,7 +82,7 @@ set(MKL_USE_INTEL_OMP) find_library(IOMP5_LIBRARY NAMES iomp5 libiomp5.lib libiomp5md.lib PATHS ${MKLML_LIB_SEARCH_PATHS} - PATH_SUFFIXES ${PATH_SUFFIXES} + PATH_SUFFIXES ${__PATH_SUFFIXES} ) mark_as_advanced(IOMP5_LIBRARY) @@ -96,23 +98,21 @@ set(__MKL_LIB_NAMES libmklml.lib libmklmlmd.lib) if(MKL_USE_INTEL_OMP) list(APPEND __MKL_LIB_NAMES mklml_intel) -else() - list(APPEND __MKL_LIB_NAMES mklml_gnu) endif() -list(APPEND __MKL_LIB_NAMES mklml) +list(APPEND __MKL_LIB_NAMES mklml_gnu mklml) mark_as_advanced(__MKL_LIB_NAMES) message("MKLML_LIBRARY=${MKLML_LIBRARY}") message("__MKL_LIB_NAMES=${__MKL_LIB_NAMES}") message("MKLML_LIB_SEARCH_PATHS=${MKLML_LIB_SEARCH_PATHS}") -message("PATH_SUFFIXES=${PATH_SUFFIXES}") +message("PATH_SUFFIXES=${__PATH_SUFFIXES}") find_library(MKLML_LIBRARY NAMES ${__MKL_LIB_NAMES} PATHS ${MKLML_LIB_SEARCH_PATHS} - PATH_SUFFIXES ${PATH_SUFFIXES} + PATH_SUFFIXES ${__PATH_SUFFIXES} ) mark_as_advanced(MKLML_LIBRARY) From 47d878b217a78237c3dfd99bcb958bc242f73e97 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Thu, 23 Aug 2018 14:44:40 +0200 Subject: [PATCH 67/78] Added Intel OpenMP usage check --- cmake/Modules/FindMKLML.cmake | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/cmake/Modules/FindMKLML.cmake b/cmake/Modules/FindMKLML.cmake index b2cbe87bc457..9c15a16cfde1 100644 --- a/cmake/Modules/FindMKLML.cmake +++ b/cmake/Modules/FindMKLML.cmake @@ -104,11 +104,6 @@ list(APPEND __MKL_LIB_NAMES mklml_gnu mklml) mark_as_advanced(__MKL_LIB_NAMES) -message("MKLML_LIBRARY=${MKLML_LIBRARY}") -message("__MKL_LIB_NAMES=${__MKL_LIB_NAMES}") -message("MKLML_LIB_SEARCH_PATHS=${MKLML_LIB_SEARCH_PATHS}") -message("PATH_SUFFIXES=${__PATH_SUFFIXES}") - find_library(MKLML_LIBRARY NAMES ${__MKL_LIB_NAMES} PATHS ${MKLML_LIB_SEARCH_PATHS} @@ -117,7 +112,13 @@ find_library(MKLML_LIBRARY mark_as_advanced(MKLML_LIBRARY) -message("AFTER: MKLML_LIBRARY=${MKLML_LIBRARY}") +if(MKLML_LIBRARY MATCHES "mklml_intel") + set(MKL_USE_INTEL_OMP True) + message("MKLML uses Intel OpenMP libraries") +else() + set(MKL_USE_INTEL_OMP False) + message("MKLML uses GNU OpenMP libraries") +endif() list(APPEND LOOKED_FOR MKLML_LIBRARY) list(APPEND MKLML_LIBRARIES ${MKLML_LIBRARY}) From 0b8040c5e3c3ffc4d17f2dd8b3a23d64ea2f7e6d Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Thu, 23 Aug 2018 14:53:56 +0200 Subject: [PATCH 68/78] Reverted Intel OpenMP removal in the download script --- cmake/DownloadMKLML.cmake | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/cmake/DownloadMKLML.cmake b/cmake/DownloadMKLML.cmake index 47b07f3cc595..52b5191d1b19 100644 --- a/cmake/DownloadMKLML.cmake +++ b/cmake/DownloadMKLML.cmake @@ -61,26 +61,6 @@ elseif(UNIX) set(MKLROOT "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}") - # The MXNet option USE_OPENMP is switching OpenMP for the MXNet project. MKLML will depend on it in any case. - # Using -fopenmp with -liomp5 (linking to Intel OpenMP) leads to undefined behavior. The not needed - # Intel OpenMP library needs to be removed that it couldn't be used accidentially. For example, - # MKLDNN 3rdparty/mkldnn/cmake/MKL.cmake will discover it and use if found. - # https://github.com/intel/mkl-dnn/blob/master/README.md - set(REMOVE_INTEL_OPENMP ${USE_OPENMP}) - - if(REMOVE_INTEL_OPENMP) - message(STATUS "Intel OpenMP library will be removed") - endif() - - if(REMOVE_INTEL_OPENMP) - file(REMOVE ${MKLROOT}/lib/libiomp5.so) - file(REMOVE ${MKLROOT}/lib/libmklml_intel.so) - file(RENAME ${MKLROOT}/lib/libmklml_gnu.so ${MKLROOT}/lib/libmklml.so) - else() - file(REMOVE ${MKLROOT}/lib/libmklml_gnu.so) - file(RENAME ${MKLROOT}/lib/libmklml_intel.so ${MKLROOT}/lib/libmklml.so) - endif() - message(STATUS "Setting MKLROOT path to ${MKLROOT}") else() From 6cd96b8a3b0bd81159478d5b19bba42deb204f58 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Thu, 23 Aug 2018 16:49:46 +0200 Subject: [PATCH 69/78] Upgraded MKLML release to v0.16 --- cmake/DownloadMKLML.cmake | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/cmake/DownloadMKLML.cmake b/cmake/DownloadMKLML.cmake index 52b5191d1b19..163890a4f057 100644 --- a/cmake/DownloadMKLML.cmake +++ b/cmake/DownloadMKLML.cmake @@ -19,10 +19,13 @@ message(STATUS "Downloading MKLML...") +set(MKLML_RELEASE v0.16) +set(MKLML_RELEASE_FILE_SUFFIX 2019.0.20180710) + if(MSVC) - set(MKL_NAME "mklml_win_2018.0.3.20180406") + set(MKL_NAME "mklml_win_${MKLML_RELEASE_FILE_SUFFIX}") - file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.zip" + file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/${MKLML_RELEASE}/${MKL_NAME}.zip" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.zip" EXPECTED_MD5 "8DD73E7D3F19F004551809824C4E8970" SHOW_PROGRESS) file(DOWNLOAD "https://github.com/apache/incubator-mxnet/releases/download/utils/7z.exe" @@ -38,9 +41,9 @@ if(MSVC) message(STATUS "Setting MKLROOT path to ${MKLROOT}") elseif(APPLE) - set(MKL_NAME "mklml_mac_2018.0.3.20180406") + set(MKL_NAME "mklml_mac_${MKLML_RELEASE_FILE_SUFFIX}") - file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.tgz" + file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/${MKLML_RELEASE}/${MKL_NAME}.tgz" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" EXPECTED_MD5 "23a6f7fd04fb1fa6de0d52a2ec5a2a14" SHOW_PROGRESS) execute_process(COMMAND "tar" "-xzf" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" @@ -51,9 +54,9 @@ elseif(APPLE) message(STATUS "Setting MKLROOT path to ${MKLROOT}") elseif(UNIX) - set(MKL_NAME "mklml_lnx_2018.0.3.20180406") + set(MKL_NAME "mklml_lnx_${MKLML_RELEASE_FILE_SUFFIX}") - file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/v0.14/${MKL_NAME}.tgz" + file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/${MKLML_RELEASE}/${MKL_NAME}.tgz" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" EXPECTED_MD5 "DAF7EFC3C1C0036B447213004467A8AE" SHOW_PROGRESS) execute_process(COMMAND "tar" "-xzf" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" From 6c25ea3c0e77464400fb1f5befc4860171de5b44 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Thu, 23 Aug 2018 17:14:22 +0200 Subject: [PATCH 70/78] Improved log wording about OpenMP --- cmake/Modules/FindMKLML.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/Modules/FindMKLML.cmake b/cmake/Modules/FindMKLML.cmake index 9c15a16cfde1..23c89f33cafc 100644 --- a/cmake/Modules/FindMKLML.cmake +++ b/cmake/Modules/FindMKLML.cmake @@ -117,7 +117,7 @@ if(MKLML_LIBRARY MATCHES "mklml_intel") message("MKLML uses Intel OpenMP libraries") else() set(MKL_USE_INTEL_OMP False) - message("MKLML uses GNU OpenMP libraries") + message("MKLML uses platform provided OpenMP libraries") endif() list(APPEND LOOKED_FOR MKLML_LIBRARY) From ce50b8e4579c977cfc50a43f57ec95d83cefcf3f Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Thu, 23 Aug 2018 17:43:40 +0200 Subject: [PATCH 71/78] Updated md5 hases for MKLML files --- cmake/DownloadMKLML.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/DownloadMKLML.cmake b/cmake/DownloadMKLML.cmake index 163890a4f057..c7d5d6aba5fc 100644 --- a/cmake/DownloadMKLML.cmake +++ b/cmake/DownloadMKLML.cmake @@ -27,7 +27,7 @@ if(MSVC) file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/${MKLML_RELEASE}/${MKL_NAME}.zip" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.zip" - EXPECTED_MD5 "8DD73E7D3F19F004551809824C4E8970" SHOW_PROGRESS) + EXPECTED_MD5 "b4f7676b4ad5448782945559bfe4a418" SHOW_PROGRESS) file(DOWNLOAD "https://github.com/apache/incubator-mxnet/releases/download/utils/7z.exe" "${CMAKE_CURRENT_BINARY_DIR}/mklml/7z2.exe" EXPECTED_MD5 "E1CF766CF358F368EC97662D06EA5A4C" SHOW_PROGRESS) @@ -45,7 +45,7 @@ elseif(APPLE) file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/${MKLML_RELEASE}/${MKL_NAME}.tgz" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" - EXPECTED_MD5 "23a6f7fd04fb1fa6de0d52a2ec5a2a14" SHOW_PROGRESS) + EXPECTED_MD5 "fecd3083f20fc009b95f7554005eb7ef" SHOW_PROGRESS) execute_process(COMMAND "tar" "-xzf" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" "-C" "${CMAKE_CURRENT_BINARY_DIR}/mklml/") From 66367a846afcc51041e18047253110bb57ed5d22 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Mon, 27 Aug 2018 17:50:43 +0200 Subject: [PATCH 72/78] Reverted MKLML upgrade --- cmake/DownloadMKLML.cmake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmake/DownloadMKLML.cmake b/cmake/DownloadMKLML.cmake index c7d5d6aba5fc..412258fbfb34 100644 --- a/cmake/DownloadMKLML.cmake +++ b/cmake/DownloadMKLML.cmake @@ -19,15 +19,15 @@ message(STATUS "Downloading MKLML...") -set(MKLML_RELEASE v0.16) -set(MKLML_RELEASE_FILE_SUFFIX 2019.0.20180710) +set(MKLML_RELEASE v0.14) +set(MKLML_RELEASE_FILE_SUFFIX 2018.0.3.20180406) if(MSVC) set(MKL_NAME "mklml_win_${MKLML_RELEASE_FILE_SUFFIX}") file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/${MKLML_RELEASE}/${MKL_NAME}.zip" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.zip" - EXPECTED_MD5 "b4f7676b4ad5448782945559bfe4a418" SHOW_PROGRESS) + EXPECTED_MD5 "8DD73E7D3F19F004551809824C4E8970" SHOW_PROGRESS) file(DOWNLOAD "https://github.com/apache/incubator-mxnet/releases/download/utils/7z.exe" "${CMAKE_CURRENT_BINARY_DIR}/mklml/7z2.exe" EXPECTED_MD5 "E1CF766CF358F368EC97662D06EA5A4C" SHOW_PROGRESS) @@ -45,7 +45,7 @@ elseif(APPLE) file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/${MKLML_RELEASE}/${MKL_NAME}.tgz" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" - EXPECTED_MD5 "fecd3083f20fc009b95f7554005eb7ef" SHOW_PROGRESS) + EXPECTED_MD5 "23a6f7fd04fb1fa6de0d52a2ec5a2a14" SHOW_PROGRESS) execute_process(COMMAND "tar" "-xzf" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" "-C" "${CMAKE_CURRENT_BINARY_DIR}/mklml/") From ff327c1ac83edc21c4d796a62452c43905bc1366 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Mon, 15 Oct 2018 17:47:15 +0000 Subject: [PATCH 73/78] Improved documentation based on Aaron's feedback --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9af3cb240902..e43c48b73a7b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -114,12 +114,12 @@ endif() # # It has following flavours: # -# * MKL is a full library, containing all the functionality. It is free under +# * MKL is a complete full math library, containing basic and LAPACK functions. It is free under # community support licensing (https://software.intel.com/en-us/articles/free-mkl), # but needs to be downloaded and installed manually. # -# * MKLML is a subset of MKL. It contains smaller number of functions to reduce the -# size of the download and reduce the number of dynamic libraries user needs. This +# * MKLML is a subset of MKL. It contains a smaller number of functions to reduce the +# size of the download and reduce the number of dynamic libraries the user needs. This # is the most effective option since it can be downloaded and installed automatically # by the cmake script (see cmake/DownloadMKLML.cmake). # From e1f5563cb88a8ee654cc9183c5a4e12e98651f3e Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Fri, 9 Nov 2018 14:16:10 +0100 Subject: [PATCH 74/78] Small fixes --- CMakeLists.txt | 2 +- cmake/ChooseBLAS.cmake | 31 +++++++++++++++---------------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e43c48b73a7b..0b561825feec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -164,7 +164,7 @@ mxnet_option(USE_APPLE_ACCELERATE_IF_AVAILABLE "Use Apple Accelerate framework i # libraries don't include it, thus the cmake script will check the presence of an # indicating function "cheev_" within the available choosen libraries and switch the # functionality off if not found. -mxnet_option(USE_LAPACK "Build with lapack support" ON) +mxnet_option(USE_LAPACK "Build with LAPACK support" ON) include(cmake/ChooseBLAS.cmake) diff --git a/cmake/ChooseBLAS.cmake b/cmake/ChooseBLAS.cmake index a85470121700..b4d888f7fcc8 100644 --- a/cmake/ChooseBLAS.cmake +++ b/cmake/ChooseBLAS.cmake @@ -48,8 +48,10 @@ function(try_mkldnn) file(COPY ${CMAKE_SOURCE_DIR}/3rdparty/mkldnn/config_template.vcxproj.user DESTINATION ${CMAKE_SOURCE_DIR}) endif() - set(WITH_TEST OFF) - set(WITH_EXAMPLE OFF) + set(WITH_TEST OFF CACHE INTERNAL "" FORCE) + set(WITH_EXAMPLE OFF CACHE INTERNAL "" FORCE) + set(ARCH_OPT_FLAGS "" CACHE INTERNAL "" FORCE) + add_subdirectory(3rdparty/mkldnn) include_directories(3rdparty/mkldnn/include) @@ -83,7 +85,7 @@ function(try_mkl) set(MKL_LIBRARIES ${MKL_LIBRARIES} PARENT_SCOPE) set(MKLROOT ${MKLROOT} PARENT_SCOPE) - set(BLAS mkl PARENT_SCOPE) + set(__BLAS mkl PARENT_SCOPE) else() message(STATUS "MKL framework not found") endif() @@ -124,7 +126,7 @@ function(try_mklml) set(MKL_USE_INTEL_OMP ${MKL_USE_INTEL_OMP} PARENT_SCOPE) set(MKLROOT ${MKLROOT} PARENT_SCOPE) - set(BLAS mkl PARENT_SCOPE) + set(__BLAS mkl PARENT_SCOPE) message(STATUS "MKLML framework found") @@ -135,10 +137,6 @@ function(try_accelerate) return() endif() - set(__BLAS) - string(TOLOWER "${BLAS}" __BLAS) - mark_as_advanced(__BLAS) - if(__BLAS MATCHES "mkl") return() endif() @@ -165,10 +163,10 @@ if(USE_MKL_IF_AVAILABLE) try_mkl() try_mklml() try_mkldnn() +else() + try_accelerate() endif() -try_accelerate() - if(__BLAS MATCHES "atlas") message(STATUS "Using Atlas for BLAS") @@ -188,6 +186,7 @@ if(__BLAS MATCHES "atlas") endif() return() + endif() if(__BLAS MATCHES "open") @@ -216,7 +215,7 @@ if(__BLAS MATCHES "mkl") message(STATUS "Using MKL for BLAS") if(NOT MKL_FOUND) - message(FATAL_ERROR "Blas set to MKL but it could not be found") + message(FATAL_ERROR "Blas set to MKL, but it could not be found") endif() include_directories(SYSTEM ${MKL_INCLUDE_DIR}) @@ -226,7 +225,6 @@ if(__BLAS MATCHES "mkl") add_definitions(-DMSHADOW_USE_MKL=1) if(USE_LAPACK) - include(CheckFunctionExists) set(CMAKE_REQUIRED_LIBRARIES ${MKL_LIBRARIES}) check_function_exists("cheev_" LAPACK_FOUND) @@ -236,12 +234,13 @@ if(__BLAS MATCHES "mkl") else() switch_lapack(False) endif() - - return() endif() + + return() + endif() -if(BLAS MATCHES "(apple|accelerate)") +if(__BLAS MATCHES "(apple|accelerate)") if(NOT APPLE) message(FATAL_ERROR "Apple Accelerate framework's BLAS feature is available only on macOS") return() @@ -269,4 +268,4 @@ if(BLAS MATCHES "(apple|accelerate)") return() endif() -message(FATAL_ERROR "BLAS ${BLAS} not recognized") +message(FATAL_ERROR "BLAS ${__BLAS} not recognized") From 0620b00dd81eaf7f6090c581d6bb478d258eff80 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Fri, 9 Nov 2018 15:43:18 +0100 Subject: [PATCH 75/78] Bumped MKLDNN to v0.17-rc version --- 3rdparty/mkldnn | 2 +- cmake/DownloadMKLML.cmake | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/3rdparty/mkldnn b/3rdparty/mkldnn index 9910b480296a..21fb5f2af1dd 160000 --- a/3rdparty/mkldnn +++ b/3rdparty/mkldnn @@ -1 +1 @@ -Subproject commit 9910b480296a0d1496db466531e56729b3922bbf +Subproject commit 21fb5f2af1dd14e132af4f1b79160977ee487818 diff --git a/cmake/DownloadMKLML.cmake b/cmake/DownloadMKLML.cmake index 412258fbfb34..de25bdc8b670 100644 --- a/cmake/DownloadMKLML.cmake +++ b/cmake/DownloadMKLML.cmake @@ -19,15 +19,15 @@ message(STATUS "Downloading MKLML...") -set(MKLML_RELEASE v0.14) -set(MKLML_RELEASE_FILE_SUFFIX 2018.0.3.20180406) +set(MKLML_RELEASE v0.17-rc) +set(MKLML_RELEASE_FILE_SUFFIX 2019.0.1.20180928) if(MSVC) set(MKL_NAME "mklml_win_${MKLML_RELEASE_FILE_SUFFIX}") file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/${MKLML_RELEASE}/${MKL_NAME}.zip" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.zip" - EXPECTED_MD5 "8DD73E7D3F19F004551809824C4E8970" SHOW_PROGRESS) + EXPECTED_MD5 "443e661bdfd32dbbc99b460b43afceee" SHOW_PROGRESS) file(DOWNLOAD "https://github.com/apache/incubator-mxnet/releases/download/utils/7z.exe" "${CMAKE_CURRENT_BINARY_DIR}/mklml/7z2.exe" EXPECTED_MD5 "E1CF766CF358F368EC97662D06EA5A4C" SHOW_PROGRESS) @@ -45,7 +45,7 @@ elseif(APPLE) file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/${MKLML_RELEASE}/${MKL_NAME}.tgz" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" - EXPECTED_MD5 "23a6f7fd04fb1fa6de0d52a2ec5a2a14" SHOW_PROGRESS) + EXPECTED_MD5 "95f887af332205b1d15b392260003952" SHOW_PROGRESS) execute_process(COMMAND "tar" "-xzf" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" "-C" "${CMAKE_CURRENT_BINARY_DIR}/mklml/") @@ -58,7 +58,7 @@ elseif(UNIX) file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/${MKLML_RELEASE}/${MKL_NAME}.tgz" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" - EXPECTED_MD5 "DAF7EFC3C1C0036B447213004467A8AE" SHOW_PROGRESS) + EXPECTED_MD5 "a63abf155361322b9c03f8fc50f4f317" SHOW_PROGRESS) execute_process(COMMAND "tar" "-xzf" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" "-C" "${CMAKE_CURRENT_BINARY_DIR}/mklml/") From 97dbf9b50fb6d2c0a642f636a6c05fd6630941be Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Fri, 9 Nov 2018 16:05:17 +0100 Subject: [PATCH 76/78] Fixd multiple problems --- cmake/ChooseBLAS.cmake | 6 ++++++ cmake/Modules/FindMKL.cmake | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/cmake/ChooseBLAS.cmake b/cmake/ChooseBLAS.cmake index b4d888f7fcc8..a7a36c46fec2 100644 --- a/cmake/ChooseBLAS.cmake +++ b/cmake/ChooseBLAS.cmake @@ -52,6 +52,10 @@ function(try_mkldnn) set(WITH_EXAMPLE OFF CACHE INTERNAL "" FORCE) set(ARCH_OPT_FLAGS "" CACHE INTERNAL "" FORCE) + if(NOT MKL_FOUND) + set(MKLDNN_USE_MKL "NONE") + endif() + add_subdirectory(3rdparty/mkldnn) include_directories(3rdparty/mkldnn/include) @@ -83,6 +87,7 @@ function(try_mkl) set(MKL_FOUND ${MKL_FOUND} PARENT_SCOPE) set(MKL_INCLUDE_DIR ${MKL_INCLUDE_DIR} PARENT_SCOPE) set(MKL_LIBRARIES ${MKL_LIBRARIES} PARENT_SCOPE) + set(MKLDNN_USE_MKL "FULL" PARENT_SCOPE) set(MKLROOT ${MKLROOT} PARENT_SCOPE) set(__BLAS mkl PARENT_SCOPE) @@ -124,6 +129,7 @@ function(try_mklml) set(MKL_INCLUDE_DIR ${MKL_INCLUDE_DIR} PARENT_SCOPE) set(MKL_LIBRARIES ${MKL_LIBRARIES} PARENT_SCOPE) set(MKL_USE_INTEL_OMP ${MKL_USE_INTEL_OMP} PARENT_SCOPE) + set(MKLDNN_USE_MKL "ML" PARENT_SCOPE) set(MKLROOT ${MKLROOT} PARENT_SCOPE) set(__BLAS mkl PARENT_SCOPE) diff --git a/cmake/Modules/FindMKL.cmake b/cmake/Modules/FindMKL.cmake index 24567514db48..4c2692c28f67 100644 --- a/cmake/Modules/FindMKL.cmake +++ b/cmake/Modules/FindMKL.cmake @@ -74,6 +74,8 @@ set(MKL_LIB_SEARCH_PATHS "${MKLROOT}" "${INTEL_RTL_ROOT}" + "${INTEL_ROOT}" + "${INTEL_ROOT}/mkl" "${INTEL_ROOT}/compiler" "${MKLROOT}/.." "${MKLROOT}/../compiler" @@ -137,8 +139,10 @@ foreach(__lib ${__mkl_libs}) set(__mkl_lib "lib${__mkl_lib}.a") endif() + message(WARNING "Finding ${__mkl_lib_upper}_LIBRARY in ${MKL_LIB_SEARCH_PATHS}") + find_library(${__mkl_lib_upper}_LIBRARY - NAMES ${__mkl_lib} + NAMES ${__mkl_lib} mkl_${__mkl_lib} PATHS ${MKL_LIB_SEARCH_PATHS} PATH_SUFFIXES ${__path_suffixes} DOC "The path to Intel(R) MKL ${__mkl_lib} library") From 07bcddb95c1623016a4a4bb99a175e3456c49c7d Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Tue, 20 Nov 2018 11:01:48 +0100 Subject: [PATCH 77/78] Updated submodules --- 3rdparty/mkldnn | 2 +- 3rdparty/ps-lite | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/3rdparty/mkldnn b/3rdparty/mkldnn index 21fb5f2af1dd..9910b480296a 160000 --- a/3rdparty/mkldnn +++ b/3rdparty/mkldnn @@ -1 +1 @@ -Subproject commit 21fb5f2af1dd14e132af4f1b79160977ee487818 +Subproject commit 9910b480296a0d1496db466531e56729b3922bbf diff --git a/3rdparty/ps-lite b/3rdparty/ps-lite index 226e82c53095..8a763892a973 160000 --- a/3rdparty/ps-lite +++ b/3rdparty/ps-lite @@ -1 +1 @@ -Subproject commit 226e82c53095d64866821245024d5342996787f4 +Subproject commit 8a763892a973afc1acd3d4b469d05bb338a83a6e From bb92ac56b8058c816cc8b5b7f1361df36a4c1ab7 Mon Sep 17 00:00:00 2001 From: Anton Chernov Date: Tue, 20 Nov 2018 11:05:46 +0100 Subject: [PATCH 78/78] Reverted MKLDNN_RELEASE name change --- cmake/DownloadMKLML.cmake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmake/DownloadMKLML.cmake b/cmake/DownloadMKLML.cmake index de25bdc8b670..a25f69e0c559 100644 --- a/cmake/DownloadMKLML.cmake +++ b/cmake/DownloadMKLML.cmake @@ -19,13 +19,13 @@ message(STATUS "Downloading MKLML...") -set(MKLML_RELEASE v0.17-rc) +set(MKLDNN_RELEASE v0.17-rc) set(MKLML_RELEASE_FILE_SUFFIX 2019.0.1.20180928) if(MSVC) set(MKL_NAME "mklml_win_${MKLML_RELEASE_FILE_SUFFIX}") - file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/${MKLML_RELEASE}/${MKL_NAME}.zip" + file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/${MKLDNN_RELEASE}/${MKL_NAME}.zip" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.zip" EXPECTED_MD5 "443e661bdfd32dbbc99b460b43afceee" SHOW_PROGRESS) file(DOWNLOAD "https://github.com/apache/incubator-mxnet/releases/download/utils/7z.exe" @@ -43,7 +43,7 @@ if(MSVC) elseif(APPLE) set(MKL_NAME "mklml_mac_${MKLML_RELEASE_FILE_SUFFIX}") - file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/${MKLML_RELEASE}/${MKL_NAME}.tgz" + file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/${MKLDNN_RELEASE}/${MKL_NAME}.tgz" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" EXPECTED_MD5 "95f887af332205b1d15b392260003952" SHOW_PROGRESS) execute_process(COMMAND "tar" "-xzf" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" @@ -56,7 +56,7 @@ elseif(APPLE) elseif(UNIX) set(MKL_NAME "mklml_lnx_${MKLML_RELEASE_FILE_SUFFIX}") - file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/${MKLML_RELEASE}/${MKL_NAME}.tgz" + file(DOWNLOAD "https://github.com/intel/mkl-dnn/releases/download/${MKLDNN_RELEASE}/${MKL_NAME}.tgz" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz" EXPECTED_MD5 "a63abf155361322b9c03f8fc50f4f317" SHOW_PROGRESS) execute_process(COMMAND "tar" "-xzf" "${CMAKE_CURRENT_BINARY_DIR}/mklml/${MKL_NAME}.tgz"