diff options
author | Adam Kosiorek <a.kosiorek@samsung.com> | 2014-07-01 09:56:20 +0200 |
---|---|---|
committer | Jeff Donahue <jeff.donahue@gmail.com> | 2014-08-17 01:07:11 -0700 |
commit | ececfc0c0ca98e242ef3b7634f1bfcb431028bd8 (patch) | |
tree | cfc2fe8a563398d5a683efd173e7f8820f176487 | |
parent | 2882cda5682840a71b7ab7709ed3a350b00afd81 (diff) | |
download | caffe-ececfc0c0ca98e242ef3b7634f1bfcb431028bd8.tar.gz caffe-ececfc0c0ca98e242ef3b7634f1bfcb431028bd8.tar.bz2 caffe-ececfc0c0ca98e242ef3b7634f1bfcb431028bd8.zip |
cmake build system
25 files changed, 894 insertions, 6 deletions
@@ -62,3 +62,9 @@ _site *.sublime-workspace *.sublime-project +# Eclipse Project settings +*.*project + + +# CMake generated files +*.gen.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..cc50a3a1 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,72 @@ +cmake_minimum_required(VERSION 2.8) +project( Caffe ) + +### Build Options ########################################################################## + +option(BUILD_PYTHON "Build Python wrapper" OFF) +option(BUILD_MATLAB "Build Matlab wrapper" OFF) +option(BUILD_EXAMPLES "Build examples" ON) +option(BUILD_SHARED_LIBS "Build SHARED libs if ON and STATIC otherwise" OFF) + +if(NOT BLAS) + set(BLAS atlas) +endif() + +if(NOT CUDA_TEST_DEVICE) + set(CUDA_TEST_DEVICE -1) +endif() + +# Install Prefix +if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set (CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Default install path" FORCE ) +endif() + +### Configuration ########################################################################### + +# Enable CTest from top build directory +enable_testing() + +# Compiler Flags +set(CMAKE_CXX_COMPILER_FLAGS ${CMAKE_CXX_COMPILER_FLAGS} -Wall) +set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fPIC) +set(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE} -O3) + +# Include Directories +set(${PROJECT_NAME}_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/include) +include_directories(${${PROJECT_NAME}_INCLUDE_DIRS}) +include_directories(${CMAKE_SOURCE_DIR}/src) + +# CMake module path for custom module finding +set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/CMakeScripts) + +# CUDA is required globally +find_package(CUDA 5.5 REQUIRED) +include_directories(${CUDA_INCLUDE_DIRS}) + + +### Subdirectories ########################################################################## + +add_subdirectory(src/gtest) +add_subdirectory(src/caffe) +add_subdirectory(tools) + +if(BUILD_EXAMPLES) + message(STATUS "Examples enabled") + add_subdirectory(examples) +endif() + +if(BUILD_PYTHON) + message(STATUS "Python enabled") + add_subdirectory(python) +endif() + +if(BUILD_MATLAB) + message(STATUS "Matlab enabled") + add_subdirectory(matlab) +endif() + +### Install ################################################################################# + +# Install Includes +file(GLOB folders ${${PROJECT_NAME}_INCLUDE_DIRS}/*) +install(DIRECTORY ${folders} DESTINATION include) diff --git a/CMakeScripts/FindAtlas.cmake b/CMakeScripts/FindAtlas.cmake new file mode 100644 index 00000000..27657a6c --- /dev/null +++ b/CMakeScripts/FindAtlas.cmake @@ -0,0 +1,61 @@ +# 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 +# +# The following are set after configuration is done: +# Atlas_FOUND +# Atlas_INCLUDE_DIRS +# Atlas_LIBRARIES +# Atlas_LIBRARYRARY_DIRS + +set(Atlas_INCLUDE_SEARCH_PATHS + /usr/include/atlas + /usr/include/atlas-base + $ENV{Atlas_ROOT_DIR} + $ENV{Atlas_ROOT_DIR}/include +) + +set(Atlas_LIB_SEARCH_PATHS + /usr/lib/atlas + /usr/lib/atlas-base + $ENV{Atlas_ROOT_DIR} + $ENV{Atlas_ROOT_DIR}/lib +) + +find_path(Atlas_CBLAS_INCLUDE_DIR NAMES cblas.h PATHS ${Atlas_INCLUDE_SEARCH_PATHS}) +find_path(Atlas_CLAPACK_INCLUDE_DIR NAMES clapack.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_library(Atlas_LAPACK_LIBRARY NAMES alapack_r alapack lapack_atlas PATHS ${Atlas_LIB_SEARCH_PATHS}) + +set(LOOKED_FOR + + Atlas_CBLAS_INCLUDE_DIR + Atlas_CLAPACK_INCLUDE_DIR + + Atlas_CBLAS_LIBRARY + Atlas_BLAS_LIBRARY + Atlas_LAPACK_LIBRARY +) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Atlas DEFAULT_MSG ${LOOKED_FOR}) + +if(ATLAS_FOUND) + + mark_as_advanced(${LOOKED_FOR}) + + set(Atlas_INCLUDE_DIR + ${Atlas_CBLAS_INCLUDE_DIR} + ${Atlas_CLAPACK_INCLUDE_DIR} + ) + + set(Atlas_LIBRARIES + ${Atlas_LAPACK_LIBRARY} + ${Atlas_CBLAS_LIBRARY} + ${Atlas_BLAS_LIBRARY} + ) + +endif(ATLAS_FOUND) + diff --git a/CMakeScripts/FindGlog.cmake b/CMakeScripts/FindGlog.cmake new file mode 100644 index 00000000..0dc30abd --- /dev/null +++ b/CMakeScripts/FindGlog.cmake @@ -0,0 +1,48 @@ +# - Try to find Glog +# +# The following variables are optionally searched for defaults +# GLOG_ROOT_DIR: Base directory where all GLOG components are found +# +# The following are set after configuration is done: +# GLOG_FOUND +# GLOG_INCLUDE_DIRS +# GLOG_LIBRARIES +# GLOG_LIBRARYRARY_DIRS + +include(FindPackageHandleStandardArgs) + +set(GLOG_ROOT_DIR "" CACHE PATH "Folder contains Google glog") + +if(WIN32) + find_path(GLOG_INCLUDE_DIR glog/logging.h + PATHS ${GLOG_ROOT_DIR}/src/windows) +else() + find_path(GLOG_INCLUDE_DIR glog/logging.h + PATHS ${GLOG_ROOT_DIR}) +endif() + +if(MSVC) + find_library(GLOG_LIBRARY_RELEASE libglog_static + PATHS ${GLOG_ROOT_DIR} + PATH_SUFFIXES Release) + + find_library(GLOG_LIBRARY_DEBUG libglog_static + PATHS ${GLOG_ROOT_DIR} + PATH_SUFFIXES Debug) + + set(GLOG_LIBRARY optimized ${GLOG_LIBRARY_RELEASE} debug ${GLOG_LIBRARY_DEBUG}) +else() + find_library(GLOG_LIBRARY glog + PATHS ${GLOG_ROOT_DIR} + PATH_SUFFIXES + lib + lib64) +endif() + +find_package_handle_standard_args(GLOG DEFAULT_MSG + GLOG_INCLUDE_DIR GLOG_LIBRARY) + +if(GLOG_FOUND) + set(GLOG_INCLUDE_DIRS ${GLOG_INCLUDE_DIR}) + set(GLOG_LIBRARIES ${GLOG_LIBRARY}) +endif() diff --git a/CMakeScripts/FindLAPACK.cmake b/CMakeScripts/FindLAPACK.cmake new file mode 100644 index 00000000..9641c45d --- /dev/null +++ b/CMakeScripts/FindLAPACK.cmake @@ -0,0 +1,190 @@ +# - Find LAPACK library +# This module finds an installed fortran library that implements the LAPACK +# linear-algebra interface (see http://www.netlib.org/lapack/). +# +# The approach follows that taken for the autoconf macro file, acx_lapack.m4 +# (distributed at http://ac-archive.sourceforge.net/ac-archive/acx_lapack.html). +# +# This module sets the following variables: +# LAPACK_FOUND - set to true if a library implementing the LAPACK interface is found +# LAPACK_LIBRARIES - list of libraries (using full path name) for LAPACK + +# Note: I do not think it is a good idea to mixup different BLAS/LAPACK versions +# Hence, this script wants to find a Lapack library matching your Blas library + +# Do nothing if LAPACK was found before +IF(NOT LAPACK_FOUND) + +SET(LAPACK_LIBRARIES) +SET(LAPACK_INFO) + +IF(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED) + FIND_PACKAGE(BLAS) +ELSE(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED) + FIND_PACKAGE(BLAS REQUIRED) +ENDIF(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED) + +# Old search lapack script +include(CheckFortranFunctionExists) + +macro(Check_Lapack_Libraries LIBRARIES _prefix _name _flags _list _blas) + # This macro checks for the existence of the combination of fortran libraries + # given by _list. If the combination is found, this macro checks (using the + # Check_Fortran_Function_Exists macro) whether can link against that library + # combination using the name of a routine given by _name using the linker + # flags given by _flags. If the combination of libraries is found and passes + # the link test, LIBRARIES is set to the list of complete library paths that + # have been found. Otherwise, LIBRARIES is set to FALSE. + # N.B. _prefix is the prefix applied to the names of all cached variables that + # are generated internally and marked advanced by this macro. + set(_libraries_work TRUE) + set(${LIBRARIES}) + set(_combined_name) + foreach(_library ${_list}) + set(_combined_name ${_combined_name}_${_library}) + if(_libraries_work) + if (WIN32) + find_library(${_prefix}_${_library}_LIBRARY + NAMES ${_library} PATHS ENV LIB PATHS ENV PATH) + else (WIN32) + if(APPLE) + find_library(${_prefix}_${_library}_LIBRARY + NAMES ${_library} + PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 + ENV DYLD_LIBRARY_PATH) + else(APPLE) + find_library(${_prefix}_${_library}_LIBRARY + NAMES ${_library} + PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 + ENV LD_LIBRARY_PATH) + endif(APPLE) + endif(WIN32) + mark_as_advanced(${_prefix}_${_library}_LIBRARY) + set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY}) + set(_libraries_work ${${_prefix}_${_library}_LIBRARY}) + endif(_libraries_work) + endforeach(_library ${_list}) + if(_libraries_work) + # Test this combination of libraries. + set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}} ${_blas}) + if (CMAKE_Fortran_COMPILER_WORKS) + check_fortran_function_exists(${_name} ${_prefix}${_combined_name}_WORKS) + else (CMAKE_Fortran_COMPILER_WORKS) + check_function_exists("${_name}_" ${_prefix}${_combined_name}_WORKS) + endif (CMAKE_Fortran_COMPILER_WORKS) + set(CMAKE_REQUIRED_LIBRARIES) + mark_as_advanced(${_prefix}${_combined_name}_WORKS) + set(_libraries_work ${${_prefix}${_combined_name}_WORKS}) + endif(_libraries_work) + if(NOT _libraries_work) + set(${LIBRARIES} FALSE) + endif(NOT _libraries_work) +endmacro(Check_Lapack_Libraries) + + +if(BLAS_FOUND) + + # Intel MKL + IF((NOT LAPACK_INFO) AND (BLAS_INFO STREQUAL "mkl")) + IF(MKL_LAPACK_LIBRARIES) + SET(LAPACK_LIBRARIES ${MKL_LAPACK_LIBRARIES} ${MKL_LIBRARIES}) + ELSE(MKL_LAPACK_LIBRARIES) + SET(LAPACK_LIBRARIES ${MKL_LIBRARIES}) + ENDIF(MKL_LAPACK_LIBRARIES) + SET(LAPACK_INCLUDE_DIR ${MKL_INCLUDE_DIR}) + SET(LAPACK_INFO "mkl") + ENDIF() + + # OpenBlas + IF((NOT LAPACK_INFO) AND (BLAS_INFO STREQUAL "open")) + SET(CMAKE_REQUIRED_LIBRARIES ${BLAS_LIBRARIES}) + check_function_exists("cheev_" OPEN_LAPACK_WORKS) + if(OPEN_LAPACK_WORKS) + SET(LAPACK_INFO "open") + else() + message(STATUS "It seems OpenBlas has not been compiled with Lapack support") + endif() + endif() + + # GotoBlas + IF((NOT LAPACK_INFO) AND (BLAS_INFO STREQUAL "goto")) + SET(CMAKE_REQUIRED_LIBRARIES ${BLAS_LIBRARIES}) + check_function_exists("cheev_" GOTO_LAPACK_WORKS) + if(GOTO_LAPACK_WORKS) + SET(LAPACK_INFO "goto") + else() + message(STATUS "It seems GotoBlas has not been compiled with Lapack support") + endif() + endif() + + # ACML + IF((NOT LAPACK_INFO) AND (BLAS_INFO STREQUAL "acml")) + SET(CMAKE_REQUIRED_LIBRARIES ${BLAS_LIBRARIES}) + check_function_exists("cheev_" ACML_LAPACK_WORKS) + if(ACML_LAPACK_WORKS) + SET(LAPACK_INFO "acml") + else() + message(STATUS "Strangely, this ACML library does not support Lapack?!") + endif() + endif() + + # Accelerate + IF((NOT LAPACK_INFO) AND (BLAS_INFO STREQUAL "accelerate")) + SET(CMAKE_REQUIRED_LIBRARIES ${BLAS_LIBRARIES}) + check_function_exists("cheev_" ACCELERATE_LAPACK_WORKS) + if(ACCELERATE_LAPACK_WORKS) + SET(LAPACK_INFO "accelerate") + else() + message(STATUS "Strangely, this Accelerate library does not support Lapack?!") + endif() + endif() + + # vecLib + IF((NOT LAPACK_INFO) AND (BLAS_INFO STREQUAL "veclib")) + SET(CMAKE_REQUIRED_LIBRARIES ${BLAS_LIBRARIES}) + check_function_exists("cheev_" VECLIB_LAPACK_WORKS) + if(VECLIB_LAPACK_WORKS) + SET(LAPACK_INFO "veclib") + else() + message(STATUS "Strangely, this vecLib library does not support Lapack?!") + endif() + endif() + + # Generic LAPACK library? + IF((NOT LAPACK_INFO) AND (BLAS_INFO STREQUAL "generic")) + check_lapack_libraries( + LAPACK_LIBRARIES + LAPACK + cheev + "" + "lapack" + "${BLAS_LIBRARIES}" + ) + if(LAPACK_LIBRARIES) + SET(LAPACK_INFO "generic") + endif(LAPACK_LIBRARIES) + endif() + +else(BLAS_FOUND) + message(STATUS "LAPACK requires BLAS") +endif(BLAS_FOUND) + +if(LAPACK_INFO) + set(LAPACK_FOUND TRUE) +else(LAPACK_INFO) + set(LAPACK_FOUND FALSE) +endif(LAPACK_INFO) + +IF (NOT LAPACK_FOUND AND LAPACK_FIND_REQUIRED) + message(FATAL_ERROR "Cannot find a library with LAPACK API. Please specify library location.") +ENDIF (NOT LAPACK_FOUND AND LAPACK_FIND_REQUIRED) +IF(NOT LAPACK_FIND_QUIETLY) + IF(LAPACK_FOUND) + MESSAGE(STATUS "Found a library with LAPACK API. (${LAPACK_INFO})") + ELSE(LAPACK_FOUND) + MESSAGE(STATUS "Cannot find a library with LAPACK API. Not using LAPACK.") + ENDIF(LAPACK_FOUND) +ENDIF(NOT LAPACK_FIND_QUIETLY) + +# Do nothing if LAPACK was found before +ENDIF(NOT LAPACK_FOUND) diff --git a/CMakeScripts/FindLMDB.cmake b/CMakeScripts/FindLMDB.cmake new file mode 100644 index 00000000..e615f542 --- /dev/null +++ b/CMakeScripts/FindLMDB.cmake @@ -0,0 +1,28 @@ +# Try to find the LMBD libraries and headers +# LMDB_FOUND - system has LMDB lib +# LMDB_INCLUDE_DIR - the LMDB include directory +# LMDB_LIBRARIES - Libraries needed to use LMDB + +# FindCWD based on FindGMP by: +# Copyright (c) 2006, Laurent Montel, <montel@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. + +# Adapted from FindCWD by: +# Copyright 2013 Conrad Steenberg <conrad.steenberg@gmail.com> +# Aug 31, 2013 + +if (LMDB_INCLUDE_DIR AND LMDB_LIBRARIES) + # Already in cache, be silent + set(LMDB_FIND_QUIETLY TRUE) +endif (LMDB_INCLUDE_DIR AND LMDB_LIBRARIES) + +find_path(LMDB_INCLUDE_DIR NAMES "lmdb.h" HINTS "$ENV{LMDB_DIR}/include") +find_library(LMDB_LIBRARIES NAMES lmdb HINTS $ENV{LMDB_DIR}/lib ) +MESSAGE(STATUS "LMDB lib: " ${LMDB_LIBRARIES} ) +MESSAGE(STATUS "LMDB include: " ${LMDB_INCLUDE} ) + +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(LMDB DEFAULT_MSG LMDB_INCLUDE_DIR LMDB_LIBRARIES) + +mark_as_advanced(LMDB_INCLUDE_DIR LMDB_LIBRARIES) diff --git a/CMakeScripts/FindLevelDB.cmake b/CMakeScripts/FindLevelDB.cmake new file mode 100644 index 00000000..f3386f26 --- /dev/null +++ b/CMakeScripts/FindLevelDB.cmake @@ -0,0 +1,37 @@ +# - Find LevelDB +# +# LEVELDB_INCLUDE - Where to find leveldb/db.h +# LEVELDB_LIBS - List of libraries when using LevelDB. +# LEVELDB_FOUND - True if LevelDB found. + +get_filename_component(module_file_path ${CMAKE_CURRENT_LIST_FILE} PATH) + +# Look for the header file. +find_path(LEVELDB_INCLUDE NAMES leveldb/db.h PATHS $ENV{LEVELDB_ROOT}/include /opt/local/include /usr/local/include /usr/include DOC "Path in which the file leveldb/db.h is located." ) +mark_as_advanced(LEVELDB_INCLUDE) + +# Look for the library. +# Does this work on UNIX systems? (LINUX) +find_library(LEVELDB_LIBS NAMES leveldb PATHS /usr/lib $ENV{LEVELDB_ROOT}/lib DOC "Path to leveldb library." ) +mark_as_advanced(LEVELDB_LIBS) + +# Copy the results to the output variables. +if (LEVELDB_INCLUDE AND LEVELDB_LIBS) + message(STATUS "Found leveldb in ${LEVELDB_INCLUDE} ${LEVELDB_LIBS}") + set(LEVELDB_FOUND 1) + include(CheckCXXSourceCompiles) + set(CMAKE_REQUIRED_LIBRARY ${LEVELDB_LIBS} pthread) + set(CMAKE_REQUIRED_INCLUDES ${LEVELDB_INCLUDE}) + else () + set(LEVELDB_FOUND 0) + endif () + + # Report the results. + if (NOT LEVELDB_FOUND) + set(LEVELDB_DIR_MESSAGE "LEVELDB was not found. Make sure LEVELDB_LIBS and LEVELDB_INCLUDE are set.") + if (LEVELDB_FIND_REQUIRED) + message(FATAL_ERROR "${LEVELDB_DIR_MESSAGE}") + elseif (NOT LEVELDB_FIND_QUIETLY) + message(STATUS "${LEVELDB_DIR_MESSAGE}") + endif () + endif ()
\ No newline at end of file diff --git a/CMakeScripts/FindMKL.cmake b/CMakeScripts/FindMKL.cmake new file mode 100644 index 00000000..eb2d9f88 --- /dev/null +++ b/CMakeScripts/FindMKL.cmake @@ -0,0 +1,113 @@ +# - Find Intel MKL
+# Find the MKL libraries
+#
+# Options:
+#
+# MKL_STATAIC : use static linking
+# MKL_MULTI_THREADED: use multi-threading
+# MKL_SDL : Single Dynamic Library interface
+#
+# This module defines the following variables:
+#
+# MKL_FOUND : True if MKL_INCLUDE_DIR are found
+# MKL_INCLUDE_DIR : where to find mkl.h, etc.
+# MKL_INCLUDE_DIRS : set when MKL_INCLUDE_DIR found
+# MKL_LIBRARIES : the library to link against.
+
+
+include(FindPackageHandleStandardArgs)
+
+set(INTEL_ROOT "/opt/intel" CACHE PATH "Folder contains intel libs")
+set(MKL_ROOT ${INTEL_ROOT}/mkl CACHE PATH "Folder contains MKL")
+
+# Find include dir
+find_path(MKL_INCLUDE_DIR mkl.h
+ PATHS ${MKL_ROOT}/include)
+
+# Find include directory
+# There is no include folder under linux
+if(WIN32)
+ find_path(INTEL_INCLUDE_DIR omp.h
+ PATHS ${INTEL_ROOT}/include)
+ set(MKL_INCLUDE_DIR ${MKL_INCLUDE_DIR} ${INTEL_INCLUDE_DIR})
+endif()
+
+# Find libraries
+
+# Handle suffix
+set(_MKL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
+
+if(WIN32)
+ if(MKL_STATAIC)
+ set(CMAKE_FIND_LIBRARY_SUFFIXES .lib)
+ else()
+ set(CMAKE_FIND_LIBRARY_SUFFIXES _dll.lib)
+ endif()
+else()
+ if(MKL_STATAIC)
+ set(CMAKE_FIND_LIBRARY_SUFFIXES .a)
+ else()
+ set(CMAKE_FIND_LIBRARY_SUFFIXES .so)
+ endif()
+endif()
+
+
+# MKL is composed by four layers: Interface, Threading, Computational and RTL
+
+if(MKL_SDL)
+ find_library(MKL_LIBRARY mkl_rt
+ PATHS ${MKL_ROOT}/lib/ia32/)
+
+ set(MKL_MINIMAL_LIBRARY ${MKL_LIBRARY})
+else()
+ ######################### Interface layer #######################
+ if(WIN32)
+ set(MKL_INTERFACE_LIBNAME mkl_intel_c)
+ else()
+ set(MKL_INTERFACE_LIBNAME mkl_intel)
+ endif()
+
+ find_library(MKL_INTERFACE_LIBRARY ${MKL_INTERFACE_LIBNAME}
+ PATHS ${MKL_ROOT}/lib/ia32/)
+
+ ######################## Threading layer ########################
+ if(MKL_MULTI_THREADED)
+ set(MKL_THREADING_LIBNAME mkl_intel_thread)
+ else()
+ set(MKL_THREADING_LIBNAME mkl_sequential)
+ endif()
+
+ find_library(MKL_THREADING_LIBRARY ${MKL_THREADING_LIBNAME}
+ PATHS ${MKL_ROOT}/lib/ia32/)
+
+ ####################### Computational layer #####################
+ find_library(MKL_CORE_LIBRARY mkl_core
+ PATHS ${MKL_ROOT}/lib/ia32/)
+ find_library(MKL_FFT_LIBRARY mkl_cdft_core
+ PATHS ${MKL_ROOT}/lib/ia32/)
+ find_library(MKL_SCALAPACK_LIBRARY mkl_scalapack_core
+ PATHS ${MKL_ROOT}/lib/ia32/)
+
+ ############################ RTL layer ##########################
+ if(WIN32)
+ set(MKL_RTL_LIBNAME libiomp5md)
+ else()
+ set(MKL_RTL_LIBNAME libiomp5)
+ endif()
+ find_library(MKL_RTL_LIBRARY ${MKL_RTL_LIBNAME}
+ PATHS ${INTEL_RTL_ROOT}/lib)
+
+ set(MKL_LIBRARY ${MKL_INTERFACE_LIBRARY} ${MKL_THREADING_LIBRARY} ${MKL_CORE_LIBRARY} ${MKL_FFT_LIBRARY} ${MKL_SCALAPACK_LIBRARY} ${MKL_RTL_LIBRARY})
+ set(MKL_MINIMAL_LIBRARY ${MKL_INTERFACE_LIBRARY} ${MKL_THREADING_LIBRARY} ${MKL_CORE_LIBRARY} ${MKL_RTL_LIBRARY})
+endif()
+
+set(CMAKE_FIND_LIBRARY_SUFFIXES ${_MKL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
+
+find_package_handle_standard_args(MKL DEFAULT_MSG
+ MKL_INCLUDE_DIR MKL_LIBRARY MKL_MINIMAL_LIBRARY)
+
+if(MKL_FOUND)
+ set(MKL_INCLUDE_DIRS ${MKL_INCLUDE_DIR})
+ set(MKL_LIBRARIES ${MKL_LIBRARY})
+ set(MKL_MINIMAL_LIBRARIES ${MKL_LIBRARY})
+endif()
diff --git a/CMakeScripts/FindOpenBLAS.cmake b/CMakeScripts/FindOpenBLAS.cmake new file mode 100644 index 00000000..297a7b6b --- /dev/null +++ b/CMakeScripts/FindOpenBLAS.cmake @@ -0,0 +1,62 @@ + + +SET(Open_BLAS_INCLUDE_SEARCH_PATHS + /usr/include + /usr/include/openblas-base + /usr/local/include + /usr/local/include/openblas-base + /opt/OpenBLAS/include + $ENV{OpenBLAS_HOME} + $ENV{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 + $ENV{OpenBLAS}cd + $ENV{OpenBLAS}/lib + $ENV{OpenBLAS_HOME} + $ENV{OpenBLAS_HOME}/lib + ) + +FIND_PATH(OpenBLAS_INCLUDE_DIR NAMES cblas.h PATHS ${ATLAS_POSSIBLE_INCLUDE_PATHS}) +FIND_LIBRARY(OpenBLAS_LIB NAMES openblas PATHS ${Open_BLAS_LIB_SEARCH_PATHS}) + +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( + OpenBLAS_INCLUDE_DIR + OpenBLAS_LIB + OpenBLAS +) + @@ -512,12 +512,12 @@ proto: $(PROTO_GEN_CC) $(PROTO_GEN_HEADER) $(PROTO_BUILD_DIR)/%.pb.cc $(PROTO_BUILD_DIR)/%.pb.h : \ $(PROTO_SRC_DIR)/%.proto | $(PROTO_BUILD_DIR) - protoc --proto_path=src --cpp_out=$(BUILD_DIR)/src $< + protoc --proto_path=$(PROTO_SRC_DIR) --cpp_out=$(PROTO_BUILD_DIR) $< @ echo $(PY_PROTO_BUILD_DIR)/%_pb2.py : $(PROTO_SRC_DIR)/%.proto \ $(PY_PROTO_INIT) | $(PY_PROTO_BUILD_DIR) - protoc --proto_path=src --python_out=python $< + protoc --proto_path=$(PROTO_SRC_DIR) --python_out=$(PY_PROTO_BUILD_DIR) $< @ echo $(PY_PROTO_INIT): | $(PY_PROTO_BUILD_DIR) diff --git a/matlab/CMakeLists.txt b/matlab/CMakeLists.txt new file mode 100644 index 00000000..f6a03ee4 --- /dev/null +++ b/matlab/CMakeLists.txt @@ -0,0 +1 @@ +project( Matlab )
\ No newline at end of file diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt new file mode 100644 index 00000000..e09257c5 --- /dev/null +++ b/python/CMakeLists.txt @@ -0,0 +1,20 @@ +project( Python ) + +# Python +find_package(PythonLibs REQUIRED) +include_directories(${PYTHON_INCLUDE_DIRS}) + +# Boost.Python +find_package(Boost 1.49 COMPONENTS python REQUIRED) +include_directories(${Boost_INCLUDE_DIRS}) + +file(GLOB_RECURSE Python_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) + +add_library(pycaffe SHARED ${Python_SOURCES}) +target_link_libraries(pycaffe caffe ${PYTHON_LIBRARIES} ${Boost_LIBRARIES}) + +### Install ################################################################################# + +install(DIRECTORY caffe DESTINATION python) +install(FILES requirements.txt DESTINATION python) +install(TARGETS pycaffe DESTINATION python/caffe)
\ No newline at end of file diff --git a/src/caffe/CMakeLists.txt b/src/caffe/CMakeLists.txt new file mode 100644 index 00000000..d953d0b2 --- /dev/null +++ b/src/caffe/CMakeLists.txt @@ -0,0 +1,105 @@ +project( CaffeSrc ) + +# Threads +find_package(Threads REQUIRED) + +# Google-glog +find_package(Glog REQUIRED) +include_directories(${GLOG_INCLUDE_DIRS}) + +# CUDA +set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} + -gencode arch=compute_20,code=sm_20 + -gencode arch=compute_20,code=sm_21 + -gencode arch=compute_30,code=sm_30 + -gencode arch=compute_35,code=sm_35 +) + +# BLAS +if(BLAS STREQUAL "atlas") + + find_package(Atlas REQUIRED) + include_directories(${Atlas_INCLUDE_DIR}) + set(BLAS_LIBRARIES ${Atlas_LIBRARIES}) + +elseif(BLAS STREQUAL "open") + + find_package(OpenBLAS REQUIRED) + include_directories(${OpenBLAS_INCLUDE_DIR}) + set(BLAS_LIBRARIES ${OpenBLAS_LIB}) + +elseif(BLAS STREQUAL "mkl") + + find_package(MKL REQUIRED) + include_directories(${MKL_INCLUDE_DIR}) + set(BLAS_LIBRARIES ${MKL_LIBRARIES}) + +endif() + +# HDF5 +find_package(HDF5 COMPONENTS HL REQUIRED) +include_directories(${HDF5_INCLUDE_DIRS}) + +# OpenCV +find_package(OpenCV COMPONENTS core highgui imgproc REQUIRED) +include_directories(${OpenCV_INCLUDE_DIRS}) + +# LevelDB +find_package(LevelDB REQUIRED) +include_directories(${LEVELDB_INCLUDE}) + +# LMDB +find_package(LMDB REQUIRED) +include_directories(${LMDB_INCLUDE_DIR}) + +# Boost +find_package(Boost 1.46 COMPONENTS system REQUIRED) +include_directories( ${Boost_INCLUDE_DIR} ) +link_directories( ${Boost_LIBRARY_DIRS} ) + +add_subdirectory(proto) + +# Recursively find source files + +# cuda sources +file(GLOB_RECURSE CU_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cu) + +# test sources +file(GLOB_RECURSE TEST_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/test_*.cpp) + +# all cpp sources +file(GLOB_RECURSE CPP_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) + +# remove test sources from cpp sources +list(REMOVE_ITEM CPP_SOURCES ${TEST_SOURCES}) + +add_library(caffe ${CPP_SOURCES}) +cuda_add_library(caffe_cu ${CU_SOURCES}) + +# both depend on proto +add_dependencies(caffe proto) +add_dependencies(caffe_cu proto) + +target_link_libraries(caffe caffe_cu proto + ${GLOG_LIBRARIES} + ${CUDA_curand_LIBRARY} + ${HDF5_LIBRARIES} + ${OpenCV_LIBS} + ${LEVELDB_LIBS} + ${LMDB_LIBRARIES} + ${CUDA_CUBLAS_LIBRARIES} + ${BLAS_LIBRARIES} + ${CMAKE_THREAD_LIBS_INIT} +) + +#set output directory +set_target_properties(caffe PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib +) + +add_subdirectory(test) + +### Install ################################################################################# + +install(TARGETS caffe DESTINATION lib) diff --git a/src/caffe/proto/CMakeLists.txt b/src/caffe/proto/CMakeLists.txt new file mode 100644 index 00000000..a4b2c00e --- /dev/null +++ b/src/caffe/proto/CMakeLists.txt @@ -0,0 +1,35 @@ +cmake_minimum_required(VERSION 2.8) +project( Proto ) + +# Google Protocol Buffers +find_package( Protobuf REQUIRED ) + +# As of Ubuntu 14.04 protoc is no longer a part of libprotobuf-dev package and should be installed +# separately as in: sudo apt-get install protobuf-compiler +if(PROTOBUF_PROTOC_EXECUTABLE) + message(STATUS "Found PROTOBUF Compiler: ${PROTOBUF_PROTOC_EXECUTABLE}") +else() + message(FATAL_ERROR "Could not find PROTOBUF Compiler") +endif() + +include_directories(${PROTOBUF_INCLUDE_DIR}) +file(GLOB ProtoFiles "${CMAKE_CURRENT_SOURCE_DIR}/*.proto") +PROTOBUF_GENERATE_CPP(ProtoSources ProtoHeaders ${ProtoFiles}) + +add_library(proto + ${ProtoSources} + ${ProtoHeaders} +) + +target_link_libraries(proto ${PROTOBUF_LIBRARIES}) + +# Copy proto headers to include/caffe/proto/ +foreach(header ${ProtoHeaders}) + + ADD_CUSTOM_COMMAND(TARGET proto + COMMAND cmake -E copy ${header} + ${Caffe_INCLUDE_DIRS}/caffe/proto/ + DEPENDS ${header} +) + +endforeach(header) diff --git a/src/caffe/proto/caffe_pretty_print.proto b/src/caffe/proto/caffe_pretty_print.proto index 225138a4..6f0a5f6b 100644 --- a/src/caffe/proto/caffe_pretty_print.proto +++ b/src/caffe/proto/caffe_pretty_print.proto @@ -2,7 +2,7 @@ syntax = "proto2"; package caffe; -import "caffe/proto/caffe.proto"; +import "caffe.proto"; // A near-duplicate of NetParameter with fields re-numbered to beautify // automatic prototext dumps. The main practical purpose is to print inputs diff --git a/src/caffe/test/CMakeLists.txt b/src/caffe/test/CMakeLists.txt new file mode 100644 index 00000000..721df27d --- /dev/null +++ b/src/caffe/test/CMakeLists.txt @@ -0,0 +1,46 @@ +# +# +# All test files' names must begin with a "test_" prefix +# +# +cmake_minimum_required(VERSION 2.8) +project( Test ) + +# Set CUDA Device number and CMAKE_SOURCE_DIR +add_definitions(-DCMAKE_BUILD) +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/cmake_test_defines.hpp.in + ${CMAKE_CURRENT_SOURCE_DIR}/cmake_test_defines.hpp.gen.cmake +) + +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/test_data/sample_data_list.txt.in + ${CMAKE_CURRENT_SOURCE_DIR}/test_data/sample_data_list.txt.gen.cmake +) + +include_directories( + ${Caffe_SOURCE_DIR} +) + +set(TEST_MAIN test_caffe_main.cpp) +list(REMOVE_ITEM TEST_SOURCES ${TEST_MAIN}) + + +foreach(source ${TEST_SOURCES}) + + get_filename_component(name ${source} NAME_WE) + add_executable(${name}.test ${TEST_MAIN} ${source} ../blob.cpp) + target_link_libraries(${name}.test gtest caffe) + add_test(${name} ${name}.test) + + # output dir + set_target_properties(${name}.test PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) + +endforeach() + +add_executable(test_all.test ${TEST_SOURCES} ${TEST_MAIN}) +target_link_libraries(test_all.test gtest caffe) + +# output dir +set_target_properties(test_all.test PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) + diff --git a/src/caffe/test/cmake_test_defines.hpp.in b/src/caffe/test/cmake_test_defines.hpp.in new file mode 100644 index 00000000..617968df --- /dev/null +++ b/src/caffe/test/cmake_test_defines.hpp.in @@ -0,0 +1,5 @@ + +#define CUDA_TEST_DEVICE @CUDA_TEST_DEVICE@ +#define CMAKE_SOURCE_DIR "@CMAKE_SOURCE_DIR@/src/" +#define Examples_SOURCE_DIR "@Examples_SOURCE_DIR@/" +#define CMAKE_EXT ".gen.cmake"
\ No newline at end of file diff --git a/src/caffe/test/test_caffe_main.cpp b/src/caffe/test/test_caffe_main.cpp index df188fd3..ad6e189a 100644 --- a/src/caffe/test/test_caffe_main.cpp +++ b/src/caffe/test/test_caffe_main.cpp @@ -26,6 +26,10 @@ int main(int argc, char** argv) { device = atoi(argv[1]); cudaSetDevice(device); cout << "Setting to use device " << device << endl; + } else if (CUDA_TEST_DEVICE >= 0) { + + // Use the device assigned in build configuration; but with a lower priority + device = CUDA_TEST_DEVICE; } cudaGetDevice(&device); cout << "Current device id: " << device << endl; diff --git a/src/caffe/test/test_caffe_main.hpp b/src/caffe/test/test_caffe_main.hpp new file mode 100644 index 00000000..76f50be8 --- /dev/null +++ b/src/caffe/test/test_caffe_main.hpp @@ -0,0 +1,29 @@ +// Copyright 2014 BVLC and contributors. + +// The main caffe test code. Your test cpp code should include this hpp +// to allow a main function to be compiled into the binary. +#ifndef CAFFE_TEST_TEST_CAFFE_MAIN_HPP_ +#define CAFFE_TEST_TEST_CAFFE_MAIN_HPP_ + +#include <cuda_runtime.h> +#include <glog/logging.h> +#include <gtest/gtest.h> + +#include <cstdlib> +#include <cstdio> + +using std::cout; +using std::endl; + +#ifdef CMAKE_BUILD + #include "cmake_test_defines.hpp.gen.cmake" +#else + #define CUDA_TEST_DEVICE -1 + #define CMAKE_SOURCE_DIR "src/" + #define Examples_SOURCE_DIR "examples/" + #define CMAKE_EXT "" +#endif + +int main(int argc, char** argv); + +#endif // CAFFE_TEST_TEST_CAFFE_MAIN_HPP_ diff --git a/src/caffe/test/test_data/sample_data_list.txt.in b/src/caffe/test/test_data/sample_data_list.txt.in new file mode 100644 index 00000000..9860ef58 --- /dev/null +++ b/src/caffe/test/test_data/sample_data_list.txt.in @@ -0,0 +1,2 @@ +@CMAKE_SOURCE_DIR@/src/caffe/test/test_data/sample_data.h5 +@CMAKE_SOURCE_DIR@/src/caffe/test/test_data/sample_data_2_gzip.h5
\ No newline at end of file diff --git a/src/caffe/test/test_hdf5_output_layer.cpp b/src/caffe/test/test_hdf5_output_layer.cpp index 696165cd..f3ddfcd9 100644 --- a/src/caffe/test/test_hdf5_output_layer.cpp +++ b/src/caffe/test/test_hdf5_output_layer.cpp @@ -23,7 +23,7 @@ class HDF5OutputLayerTest : public MultiDeviceTest<TypeParam> { protected: HDF5OutputLayerTest() : output_file_name_(tmpnam(NULL)), - input_file_name_("src/caffe/test/test_data/sample_data.h5"), + input_file_name_(CMAKE_SOURCE_DIR "caffe/test/test_data/sample_data.h5"), blob_data_(new Blob<Dtype>()), blob_label_(new Blob<Dtype>()), num_(5), diff --git a/src/caffe/test/test_hdf5data_layer.cpp b/src/caffe/test/test_hdf5data_layer.cpp index f903afb7..1de82330 100644 --- a/src/caffe/test/test_hdf5data_layer.cpp +++ b/src/caffe/test/test_hdf5data_layer.cpp @@ -31,7 +31,7 @@ class HDF5DataLayerTest : public MultiDeviceTest<TypeParam> { blob_top_vec_.push_back(blob_top_label_); // Check out generate_sample_data.py in the same directory. - filename = new string("src/caffe/test/test_data/sample_data_list.txt"); + filename = new string(CMAKE_SOURCE_DIR "caffe/test/test_data/sample_data_list.txt" CMAKE_EXT); LOG(INFO) << "Using sample HDF5 data file " << filename; } diff --git a/src/caffe/test/test_image_data_layer.cpp b/src/caffe/test/test_image_data_layer.cpp index 5232c118..17d67bd1 100644 --- a/src/caffe/test/test_image_data_layer.cpp +++ b/src/caffe/test/test_image_data_layer.cpp @@ -37,7 +37,7 @@ class ImageDataLayerTest : public MultiDeviceTest<TypeParam> { std::ofstream outfile(filename_->c_str(), std::ofstream::out); LOG(INFO) << "Using temporary file " << *filename_; for (int i = 0; i < 5; ++i) { - outfile << "examples/images/cat.jpg " << i; + outfile << Examples_SOURCE_DIR "images/cat.jpg " << i; } outfile.close(); } diff --git a/src/gtest/CMakeLists.txt b/src/gtest/CMakeLists.txt new file mode 100644 index 00000000..82a4120c --- /dev/null +++ b/src/gtest/CMakeLists.txt @@ -0,0 +1,6 @@ +project(gtest CXX C) +cmake_minimum_required(VERSION 2.6.2) + +add_library(gtest gtest-all.cpp) +add_library(gtest_main gtest_main.cc) +target_link_libraries(gtest_main gtest)
\ No newline at end of file diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt new file mode 100644 index 00000000..81ecf7cd --- /dev/null +++ b/tools/CMakeLists.txt @@ -0,0 +1,18 @@ +project( Tools ) + +# Find all source files +file(GLOB_RECURSE Tools_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) + +# Build each source file independently +foreach(source ${Tools_SOURCES}) + get_filename_component(name ${source} NAME_WE) + add_executable(${name} ${source}) + target_link_libraries(${name} caffe) + +### Install ################################################################################# + + install(TARGETS ${name} DESTINATION tools) + + +endforeach(source) + |