SINGA-172 Add CMake supporting for Cuda and Cudnn libs
Note: Before compilation, user should specify CMAKE_INCLUDE_PATH &
CMAKE_LIBRARY_PATH as system environment variables.
Usage:
mkdir build;
cmake ..;
make;
./bin/test_singa;
Project: http://git-wip-us.apache.org/repos/asf/incubator-singa/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-singa/commit/3a872014
Tree: http://git-wip-us.apache.org/repos/asf/incubator-singa/tree/3a872014
Diff: http://git-wip-us.apache.org/repos/asf/incubator-singa/diff/3a872014
Branch: refs/heads/master
Commit: 3a872014d73c8883f4c63a59612cfb8ea0a7811f
Parents: c3a0558
Author: xiezl <[email protected]>
Authored: Tue May 17 23:56:04 2016 +0800
Committer: xiezl <[email protected]>
Committed: Tue May 17 23:56:04 2016 +0800
----------------------------------------------------------------------
CMakeLists.txt | 19 +++++++++++++------
cmake/Cuda.cmake | 20 ++++++++++++++++++++
cmake/Thirdparty/FindCUDNN.cmake | 33 +++++++++++++++++++++++++++++++++
3 files changed, 66 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/3a872014/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/CMakeLists.txt b/CMakeLists.txt
index dd92d03..8457bf2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,23 +2,30 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(singa)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++11 -DUSE_CUDA -DUSE_CUDNN")
+list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Thirdparty)
+#message(STATUS "module path: ${CMAKE_MODULE_PATH}")
+
# Flags
IF(UNIX OR APPLE)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wall")
ENDIF()
+INCLUDE(cmake/ProtoBuf.cmake)
+INCLUDE(cmake/Cuda.cmake)
# Includes
-SET(singa_include_dir ${PROJECT_SOURCE_DIR}/include)
-INCLUDE_DIRECTORIES(${singa_include_dir} ${PROJECT_BINARY_DIR})
-INCLUDE_DIRECTORIES("/home/wangwei/local/cudnn5/include"
"/usr/local/cuda/include")
+SET(SINGA_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include)
+include_directories(${SINGA_INCLUDE_DIR})
+#INCLUDE_DIRECTORIES(${singa_include_dir} ${PROJECT_BINARY_DIR})
+#INCLUDE_DIRECTORIES("/home/wangwei/local/cudnn5/include"
"/usr/local/cuda/include")
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
-SET(singa_linker_lib cudnn)
-LINK_DIRECTORIES(${LIBRARY_OUTPUT_PATH} "/home/wangwei/local/cudnn5/lib64/")
+#SET(singa_linker_lib cudnn)
+#LINK_DIRECTORIES(${LIBRARY_OUTPUT_PATH} "/home/wangwei/local/cudnn5/lib64/")
+
+#message(STATUS "include_dir: ${SINGA_INCLUDE_DIR}")
-INCLUDE(cmake/ProtoBuf.cmake)
ADD_SUBDIRECTORY(src)
ADD_SUBDIRECTORY(test)
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/3a872014/cmake/Cuda.cmake
----------------------------------------------------------------------
diff --git a/cmake/Cuda.cmake b/cmake/Cuda.cmake
new file mode 100644
index 0000000..e3338af
--- /dev/null
+++ b/cmake/Cuda.cmake
@@ -0,0 +1,20 @@
+
+find_package(CUDA 5.5 QUIET)
+
+if(NOT CUDA_FOUND)
+ return()
+endif()
+
+set(HAVE_CUDA TRUE)
+message(STATUS "Found cuda_v${CUDA_VERSION}")
+include_directories(SYSTEM ${CUDA_INCLUDE_DIRS})
+list(APPEND SINGA_LINKER_LIBS ${CUDA_CUDART_LIBRARY} ${CUDA_curand_LIBRARY}
${CUDA_CUBLAS_LIBRARIES})
+
+#if(USE_CUDNN)
+#include(cmake/Modules/Cudnn.cmake)
+ find_package(CUDNN REQUIRED)
+ include_directories(SYSTEM ${CUDNN_INCLUDE_DIR})
+ list(APPEND SINGA_LINKER_LIBS ${CUDNN_LIBRARIES})
+ add_definitions(-DUSE_CUDNN)
+#endif()
+
http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/3a872014/cmake/Thirdparty/FindCUDNN.cmake
----------------------------------------------------------------------
diff --git a/cmake/Thirdparty/FindCUDNN.cmake b/cmake/Thirdparty/FindCUDNN.cmake
new file mode 100644
index 0000000..faf98d9
--- /dev/null
+++ b/cmake/Thirdparty/FindCUDNN.cmake
@@ -0,0 +1,33 @@
+
+find_path(CUDNN_INCLUDE_DIR NAME "cudnn.h" PATHS "$ENV{CMAKE_INCLUDE_PATH}")
+find_library(CUDNN_LIBRARIES NAME "libcudnn.so" PATHS
"$ENV{CMAKE_LIBRARY_PATH}")
+
+#message("cudnn include path:${CUDNN_INCLUDE_DIR} lib path:
${CUDNN_LIBRARIES}")
+#message("env include path:$ENV{CUDNN_DIR} next: $ENV{CMAKE_INCLUDE_PATH}")
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(CUDNN DEFAULT_MSG CUDNN_INCLUDE_DIR
CUDNN_LIBRARIES)
+
+if(CUDNN_FOUND)
+ file(READ ${CUDNN_INCLUDE_DIR}/cudnn.h CUDNN_VERSION_FILE_CONTENTS)
+ string(REGEX MATCH "define CUDNN_MAJOR * +([0-9]+)"
+ CUDNN_VERSION_MAJOR "${CUDNN_VERSION_FILE_CONTENTS}")
+ string(REGEX REPLACE "define CUDNN_MAJOR * +([0-9]+)" "\\1"
+ CUDNN_VERSION_MAJOR "${CUDNN_VERSION_MAJOR}")
+ string(REGEX MATCH "define CUDNN_MINOR * +([0-9]+)"
+ CUDNN_VERSION_MINOR "${CUDNN_VERSION_FILE_CONTENTS}")
+ string(REGEX REPLACE "define CUDNN_MINOR * +([0-9]+)" "\\1"
+ CUDNN_VERSION_MINOR "${CUDNN_VERSION_MINOR}")
+ string(REGEX MATCH "define CUDNN_PATCHLEVEL * +([0-9]+)"
+ CUDNN_VERSION_PATCH "${CUDNN_VERSION_FILE_CONTENTS}")
+ string(REGEX REPLACE "define CUDNN_PATCHLEVEL * +([0-9]+)" "\\1"
+ CUDNN_VERSION_PATCH "${CUDNN_VERSION_PATCH}")
+
+ if(NOT CUDNN_VERSION_MAJOR)
+ set(CUDNN_VERSION "???")
+ else()
+ set(CUDNN_VERSION
"${CUDNN_VERSION_MAJOR}.${CUDNN_VERSION_MINOR}.${CUDNN_VERSION_PATCH}")
+ endif()
+ message(STATUS "Found Cudnn_v${CUDNN_VERSION} at ${CUDNN_INCLUDE_DIR}")
+ mark_as_advanced(CUDNN_INCLUDE_DIR CUDNN_LIBRARIES)
+
+endif()