openblas.cmake 7.3 KB
Newer Older
1
# Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved.
2
#
L
liaogang 已提交
3 4 5
# Licensed 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
6
#
L
liaogang 已提交
7
# http://www.apache.org/licenses/LICENSE-2.0
8
#
L
liaogang 已提交
9 10 11 12 13 14
# 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.

15 16 17 18
IF(USE_EIGEN_FOR_BLAS)
    return()
ENDIF(USE_EIGEN_FOR_BLAS)

L
liaogang 已提交
19
INCLUDE(cblas)
L
liaogang 已提交
20

L
liaogang 已提交
21 22
IF(NOT ${CBLAS_FOUND})
    INCLUDE(ExternalProject)
L
liaogang 已提交
23

Y
Yu Yang 已提交
24 25
    SET(CBLAS_SOURCES_DIR ${THIRD_PARTY_PATH}/openblas)
    SET(CBLAS_INSTALL_DIR ${THIRD_PARTY_PATH}/install/openblas)
J
JiabinYang 已提交
26
    SET(CBLAS_INC_DIR "${CBLAS_INSTALL_DIR}/include" CACHE PATH "openblas include directory." FORCE)
L
liaogang 已提交
27

28 29
    SET(CBLAS_LIBRARIES
        "${CBLAS_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}openblas${CMAKE_STATIC_LIBRARY_SUFFIX}"
30
        CACHE FILEPATH "openblas library." FORCE)
L
liaogang 已提交
31

32 33
    ADD_DEFINITIONS(-DPADDLE_USE_OPENBLAS)

P
peizhilin 已提交
34 35 36 37 38 39
    IF (WITH_PREBUILD_OPENBLAS)
        SET(CBLAS_FOUND true)
        MESSAGE(STATUS, "Use prebuild openblas, please put it at " ${CBLAS_INSTALL_DIR})
    ELSE(WITH_PREBUILD_OPENBLAS)
        SET(OPENBLAS_CC "${CMAKE_C_COMPILER} -Wno-unused-but-set-variable -Wno-unused-variable")
        SET(OPENBLAS_COMMIT "v0.2.20")
40

P
peizhilin 已提交
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
        IF(CMAKE_CROSSCOMPILING)
            SET(OPTIONAL_ARGS HOSTCC=${HOST_C_COMPILER})
            GET_FILENAME_COMPONENT(CROSS_SUFFIX ${CMAKE_C_COMPILER} DIRECTORY)
            SET(CROSS_SUFFIX ${CROSS_SUFFIX}/)
            IF(ANDROID)
                IF(ANDROID_ABI MATCHES "^armeabi(-v7a)?$")
                    # use softfp
                    SET(OPTIONAL_ARGS ${OPTIONAL_ARGS} TARGET=ARMV7 ARM_SOFTFP_ABI=1 USE_THREAD=0)
                ELSEIF(ANDROID_ABI STREQUAL "arm64-v8a")
                    SET(OPTIONAL_ARGS ${OPTIONAL_ARGS} TARGET=ARMV8 BINARY=64 USE_THREAD=0)
                ENDIF()
            ELSEIF(IOS)
                IF(CMAKE_OSX_ARCHITECTURES MATCHES "arm64")
                    SET(OPENBLAS_CC "${OPENBLAS_CC} ${CMAKE_C_FLAGS} -isysroot ${CMAKE_OSX_SYSROOT}")
                    SET(OPENBLAS_CC "${OPENBLAS_CC} -arch arm64")
                    SET(OPTIONAL_ARGS ${OPTIONAL_ARGS} TARGET=ARMV8 BINARY=64 USE_THREAD=0 CROSS_SUFFIX=${CROSS_SUFFIX})
                ELSE()
                    MESSAGE(FATAL_ERROR "OpenBLAS only support arm64 architectures on iOS. "
                           "You can set IOS_USE_VECLIB_FOR_BLAS=ON or USE_EIGEN_FOR_BLAS=ON to use other blas library instead.")
                ENDIF()
            ELSEIF(RPI)
                # use hardfp
                SET(OPTIONAL_ARGS ${OPTIONAL_ARGS} TARGET=ARMV7 USE_THREAD=0)
64
            ENDIF()
P
peizhilin 已提交
65 66 67 68 69 70 71
        ELSE()
            IF(APPLE)
                SET(OPENBLAS_CC "${CMAKE_C_COMPILER} -isysroot ${CMAKE_OSX_SYSROOT}")
            ENDIF()
            SET(OPTIONAL_ARGS "")
            IF(CMAKE_SYSTEM_PROCESSOR MATCHES "^x86(_64)?$")
                SET(OPTIONAL_ARGS DYNAMIC_ARCH=1 NUM_THREADS=64)
H
hedaoyuan 已提交
72
            ENDIF()
73
        ENDIF()
74

P
peizhilin 已提交
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
        IF(WIN32)
            ExternalProject_Add(
                extern_openblas
                ${EXTERNAL_PROJECT_LOG_ARGS}
    #              GIT_REPOSITORY      https://github.com/xianyi/OpenBLAS.git
                GIT_REPOSITORY      http://admin@localhost:8080/r/openblas.git
    #              GIT_TAG             ${OPENBLAS_COMMIT}
                PREFIX              ${CBLAS_SOURCES_DIR}
                INSTALL_DIR         ${CBLAS_INSTALL_DIR}
                BUILD_IN_SOURCE     1
                CMAKE_ARGS    -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
                -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
                -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
                -DCMAKE_C_FLAGS_DEBUG=${DCMAKE_C_FLAGS_DEBUG}
                -DCMAKE_C_FLAGS_RELEASE=${DCMAKE_C_FLAGS_RELEASE}
                -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
                -DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}
                -DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}
                -DNO_SHARED=ON
                -DNO_STATIC=OFF
                -DBUILD_WITHOUT_LAPACK=ON
                -DUSE_THREAD=OFF
                -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
                CMAKE_CACHE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=${CBLAS_INSTALL_DIR}
                -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON
                -DCMAKE_BUILD_TYPE:STRING=${THIRD_PARTY_BUILD_TYPE}
                )
        ELSE(WIN32)
            SET(COMMON_ARGS CC=${OPENBLAS_CC} NO_SHARED=1 NO_LAPACK=1 libs)
            ExternalProject_Add(
                extern_openblas
                ${EXTERNAL_PROJECT_LOG_ARGS}
                #  GIT_REPOSITORY      https://github.com/xianyi/OpenBLAS.git
                GIT_REPOSITORY      http://admin@localhost:8080/r/openblas.git
                #  GIT_TAG             ${OPENBLAS_COMMIT}
                PREFIX              ${CBLAS_SOURCES_DIR}
                INSTALL_DIR         ${CBLAS_INSTALL_DIR}
                BUILD_IN_SOURCE     1
                BUILD_COMMAND       ${CMAKE_MAKE_PROGRAM} ${COMMON_ARGS} ${OPTIONAL_ARGS}
                INSTALL_COMMAND     ${CMAKE_MAKE_PROGRAM} install NO_SHARED=1 NO_LAPACK=1 PREFIX=<INSTALL_DIR>
                && rm -r ${CBLAS_INSTALL_DIR}/lib/cmake ${CBLAS_INSTALL_DIR}/lib/pkgconfig
                UPDATE_COMMAND      ""
                CONFIGURE_COMMAND   ""
                )
        ENDIF(WIN32)
    ENDIF (WITH_PREBUILD_OPENBLAS)

Y
Yu Yang 已提交
122
    SET(CBLAS_PROVIDER openblas)
123
    IF(WITH_C_API)
J
JiabinYang 已提交
124
        INSTALL(DIRECTORY ${CBLAS_INC_DIR} DESTINATION third_party/openblas)
125 126 127 128 129 130 131 132 133
        # Because libopenblas.a is a symbolic link of another library, thus need to
        # install the whole directory.
        IF(ANDROID)
            SET(TMP_INSTALL_DIR third_party/openblas/lib/${ANDROID_ABI})
        ELSE()
            SET(TMP_INSTALL_DIR third_party/openblas/lib)
        ENDIF()
        INSTALL(CODE "execute_process(
            COMMAND ${CMAKE_COMMAND} -E copy_directory ${CBLAS_INSTALL_DIR}/lib
134
                    ${CMAKE_INSTALL_PREFIX}/${TMP_INSTALL_DIR}
135 136 137 138 139 140 141
            )"
        )
        INSTALL(CODE "MESSAGE(STATUS \"Installing: \"
                \"${CBLAS_INSTALL_DIR}/lib -> ${CMAKE_INSTALL_PREFIX}/${TMP_INSTALL_DIR}\"
            )"
        )
    ENDIF()
L
liaogang 已提交
142
ENDIF(NOT ${CBLAS_FOUND})
L
liaogang 已提交
143

144
MESSAGE(STATUS "BLAS library: ${CBLAS_LIBRARIES}")
J
JiabinYang 已提交
145 146
MESSAGE(STATUS "BLAS Include: ${CBLAS_INC_DIR}")
INCLUDE_DIRECTORIES(${CBLAS_INC_DIR})
L
liaogang 已提交
147

148 149
# FIXME(gangliao): generate cblas target to track all high performance
# linear algebra libraries for cc_library(xxx SRCS xxx.c DEPS cblas)
L
liaogang 已提交
150
SET(dummyfile ${CMAKE_CURRENT_BINARY_DIR}/cblas_dummy.c)
151
FILE(WRITE ${dummyfile} "const char *dummy_cblas = \"${dummyfile}\";")
Y
Yancey1989 已提交
152
ADD_LIBRARY(cblas STATIC ${dummyfile})
153 154 155 156 157 158

IF("${CBLAS_PROVIDER}" STREQUAL "MKLML")
  TARGET_LINK_LIBRARIES(cblas dynload_mklml)
ELSE()
  TARGET_LINK_LIBRARIES(cblas ${CBLAS_LIBRARIES})
ENDIF("${CBLAS_PROVIDER}" STREQUAL "MKLML")
159

T
tensor-tang 已提交
160 161 162 163 164
IF(WITH_LIBXSMM)
  TARGET_LINK_LIBRARIES(cblas ${LIBXSMM_LIBS})
  ADD_DEPENDENCIES(cblas extern_libxsmm)
ENDIF()

L
liaogang 已提交
165 166 167
IF(NOT ${CBLAS_FOUND})
    ADD_DEPENDENCIES(cblas extern_openblas)
    LIST(APPEND external_project_dependencies cblas)
T
tensor-tang 已提交
168 169 170 171
ELSE()
    IF("${CBLAS_PROVIDER}" STREQUAL "MKLML")
        ADD_DEPENDENCIES(cblas mklml)
    ENDIF()
L
liaogang 已提交
172
ENDIF(NOT ${CBLAS_FOUND})