From 0490bc5d554031e58901c2e70b5e796bef9be5c4 Mon Sep 17 00:00:00 2001 From: Gagik Hakobyan Date: Fri, 9 Nov 2018 22:10:48 +0400 Subject: [PATCH] added cmakefile --- CMakeLists.txt | 225 +++++++++++++++++++++++++++++++++++++++++++ FindCUDNN.cmake | 181 ++++++++++++++++++++++++++++++++++ Makefile | 105 -------------------- src/gemm.c | 3 +- src/image_opencv.cpp | 8 +- 5 files changed, 415 insertions(+), 107 deletions(-) create mode 100644 CMakeLists.txt create mode 100644 FindCUDNN.cmake delete mode 100644 Makefile diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..02e2de50 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,225 @@ +cmake_minimum_required(VERSION 3.8) + +set(GPU ON) +set(CUDNN ON) +set(OPENCV ON) +set(DEBUG ON) + +#add_definitions(-DOPENMP) +cmake_policy(SET CMP0054 NEW) +cmake_policy(SET CMP0071 NEW) +cmake_policy(SET CMP0046 NEW) + +project(darknet) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) + +set(CMAKE_C_COMPILER /usr/bin/gcc) + +# Find includes in corresponding build directories +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(CMAKE_CONFIGURATION_TYPES Debug Release CACHE TYPE INTERNAL FORCE) + +include_directories(${PROJECT_SOURCE_DIR}/include) + +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/install) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/install) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/install) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/install) +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/install) + +include(CMakeParseArguments) + +# gather_flags +# Gathers all lists of flags for printing or manipulation +macro (gather_flags with_linker result) + set(${result} "") + # add the main flags without a config + list(APPEND ${result} CMAKE_C_FLAGS) + list(APPEND ${result} CMAKE_CXX_FLAGS) + if(${with_linker}) + list(APPEND ${result} CMAKE_EXE_LINKER_FLAGS) + list(APPEND ${result} CMAKE_MODULE_LINKER_FLAGS) + list(APPEND ${result} CMAKE_SHARED_LINKER_FLAGS) + list(APPEND ${result} CMAKE_STATIC_LINKER_FLAGS) + endif() + + if("${CMAKE_CONFIGURATION_TYPES}" STREQUAL "" AND NOT "${CMAKE_BUILD_TYPE}" STREQUAL "") + # handle single config generators - like makefiles/ninja - when CMAKE_BUILD_TYPE is set + string(TOUPPER ${CMAKE_BUILD_TYPE} config) + list(APPEND ${result} CMAKE_C_FLAGS_${config}) + list(APPEND ${result} CMAKE_CXX_FLAGS_${config}) + if(${with_linker}) + list(APPEND ${result} CMAKE_EXE_LINKER_FLAGS_${config}) + list(APPEND ${result} CMAKE_MODULE_LINKER_FLAGS_${config}) + list(APPEND ${result} CMAKE_SHARED_LINKER_FLAGS_${config}) + list(APPEND ${result} CMAKE_STATIC_LINKER_FLAGS_${config}) + endif() + else() + # handle multi config generators (like msvc, xcode) + foreach(config ${CMAKE_CONFIGURATION_TYPES}) + string(TOUPPER ${config} config) + list(APPEND ${result} CMAKE_C_FLAGS_${config}) + list(APPEND ${result} CMAKE_CXX_FLAGS_${config}) + if(${with_linker}) + list(APPEND ${result} CMAKE_EXE_LINKER_FLAGS_${config}) + list(APPEND ${result} CMAKE_MODULE_LINKER_FLAGS_${config}) + list(APPEND ${result} CMAKE_SHARED_LINKER_FLAGS_${config}) + list(APPEND ${result} CMAKE_STATIC_LINKER_FLAGS_${config}) + endif() + endforeach() + endif() +endmacro() + +# set_runtime +# Sets the runtime (static/dynamic) for msvc/gcc +macro (set_runtime) + cmake_parse_arguments(ARG "STATIC;DYNAMIC" "" "" ${ARGN}) + + if(ARG_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "unrecognized arguments: ${ARG_UNPARSED_ARGUMENTS}") + endif() + + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" STREQUAL "") + message(AUTHOR_WARNING "set_runtime() does not support clang yet!") + endif() + + gather_flags(0 flags_configs) + + # add/replace the flags + # note that if the user has messed with the flags directly this function might fail + # - for example if with MSVC and the user has removed the flags - here we just switch/replace them + if("${ARG_STATIC}") + foreach(flags ${flags_configs}) + if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") + if(NOT ${flags} MATCHES "-static-libstdc\\+\\+") + set(${flags} "${${flags}} -static-libstdc++") + endif() + if(NOT ${flags} MATCHES "-static-libgcc") + set(${flags} "${${flags}} -static-libgcc") + endif() + elseif(MSVC) + if(${flags} MATCHES "/MD") + string(REGEX REPLACE "/MD" "/MT" ${flags} "${${flags}}") + endif() + endif() + endforeach() + elseif("${ARG_DYNAMIC}") + foreach(flags ${flags_configs}) + if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") + if(${flags} MATCHES "-static-libstdc\\+\\+") + string(REGEX REPLACE "-static-libstdc\\+\\+" "" ${flags} "${${flags}}") + endif() + if(${flags} MATCHES "-static-libgcc") + string(REGEX REPLACE "-static-libgcc" "" ${flags} "${${flags}}") + endif() + elseif(MSVC) + if(${flags} MATCHES "/MT") + string(REGEX REPLACE "/MT" "/MD" ${flags} "${${flags}}") + endif() + endif() + endforeach() + endif() + + # foreach(flags ${flags_configs}) + # message(STATUS "${flags}: ${${flags}}") + # endforeach() +endmacro() + +set(CompilerFlags + CMAKE_CXX_FLAGS + CMAKE_CXX_FLAGS_DEBUG + CMAKE_CXX_FLAGS_RELEASE + CMAKE_C_FLAGS + CMAKE_C_FLAGS_DEBUG + CMAKE_C_FLAGS_RELEASE +) + +foreach(CompilerFlag ${CompilerFlags}) + string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}") +endforeach() + +file(GLOB C_SOURCES "src/*.c" "src/*.h") +file(GLOB CPP_SOURCES "src/*.cpp") +file(GLOB APP_SOURCES "examples/*.c") +file(GLOB CUDA_SOURCES "src/*.cu") + +list(REMOVE_ITEM C_SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/src/compare.c) + +list(REMOVE_ITEM APP_SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/examples/attention.c + ${CMAKE_CURRENT_SOURCE_DIR}/examples/rnn_vid.c + ${CMAKE_CURRENT_SOURCE_DIR}/examples/swag.c + ${CMAKE_CURRENT_SOURCE_DIR}/examples/dice.c + ${CMAKE_CURRENT_SOURCE_DIR}/examples/voxel.c + ${CMAKE_CURRENT_SOURCE_DIR}/examples/writing.c + ${CMAKE_CURRENT_SOURCE_DIR}/examples/darknet.c + ) + +if (GPU AND CUDNN) + add_definitions(-DCUDNN) + include(FindCUDNN.cmake) + add_definitions(${CUDNN_DEFINITIONS}) + include_directories(${CUDNN_INCLUDE_DIRS}) +endif() + +if (GPU) + add_definitions(-DGPU) + find_package(CUDA REQUIRED) + include_directories(${CUDA_INCLUDE_DIRS}) +endif() + +if (OPENCV) + add_definitions(-DOPENCV) + set(OpenCV_STATIC ON) + find_package(OpenCV REQUIRED) + include_directories(${OpenCV_INCLUDE_DIRS}) +endif() + +if (OPENCV AND GPU) + set(OpenCV_CUDA ON) +endif() + +if (DEBUG) + add_definitions(-DDEBUG) +endif() + +set_runtime(STATIC) + +add_library(darknet_cpp STATIC ${CPP_SOURCES}) +add_library(darknet_app STATIC ${APP_SOURCES}) + +add_executable(${PROJECT_NAME} ${C_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/examples/darknet.c) +#CUDA_ADD_CUBLAS_TO_TARGET(${PROJECT_NAME}) + +target_link_libraries(${PROJECT_NAME} + darknet_cpp + darknet_app + pthread +) + +if (OPENCV) + target_link_libraries(${PROJECT_NAME} + ${OpenCV_LIBS} + ) +endif() + +if (GPU) + cuda_add_library(darknet_cuda STATIC ${CUDA_SOURCES}) + target_link_libraries(${PROJECT_NAME} + darknet_cuda + cublas + curand + ${CUDA_LIBRARIES} + ) +endif() + +if (CUDNN) + target_link_libraries(${PROJECT_NAME} + ${CUDNN_LIBRARIES} + ) +endif() + diff --git a/FindCUDNN.cmake b/FindCUDNN.cmake new file mode 100644 index 00000000..28ad01e4 --- /dev/null +++ b/FindCUDNN.cmake @@ -0,0 +1,181 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. +#.rst: +# FindCUDNN +# ------- +# +# Find CUDNN library +# +# Valiables that affect result: +# , , : as usual +# +# : as usual, plus we do find '5.1' version if you wanted '5' +# (not if you wanted '5.0', as usual) +# +# Result variables +# ^^^^^^^^^^^^^^^^ +# +# This module will set the following variables in your project: +# +# ``CUDNN_INCLUDE`` +# where to find cudnn.h. +# ``CUDNN_LIBRARY`` +# the libraries to link against to use CUDNN. +# ``CUDNN_FOUND`` +# If false, do not try to use CUDNN. +# ``CUDNN_VERSION`` +# Version of the CUDNN library we looked for +# +# Exported functions +# ^^^^^^^^^^^^^^^^ +# function(CUDNN_INSTALL version __dest_libdir [__dest_incdir]) +# This function will try to download and install CUDNN. +# CUDNN5 and CUDNN6 are supported. +# +# + +function(CUDNN_INSTALL version dest_libdir dest_incdir dest_bindir) + message(STATUS "CUDNN_INSTALL: Installing CUDNN ${version}, lib:${dest_libdir}, inc:${dest_incdir}, bin:${dest_bindir}") + string(REGEX REPLACE "-rc$" "" version_base "${version}") + set(tar_libdir cuda/lib64) + set(tar_incdir cuda/include) + + if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") + set(url_extension tgz) + if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64") + set(url_arch_name linux-x64 ) + elseif("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "ppc") + set(url_arch_name linux-ppc64le ) + # TX1 has to be installed via JetPack + endif() + elseif (APPLE) + set(url_extension tgz) + set(tar_libdir cuda/lib) + set(url_arch_name osx-x64) + elseif(WIN32) + set(url_extension zip) + set(tar_bindir cuda/bin) + set(tar_libdir cuda/lib/x64) + if(CMAKE_SYSTEM_VERSION MATCHES "10") + set(url_arch_name windows10-x64) + else() + set(url_arch_name windows7-x64) + endif() + endif() + + # Download and install CUDNN locally if not found on the system + if(url_arch_name) + set(download_dir ${CMAKE_CURRENT_BINARY_DIR}/downloads/cudnn${version}) + file(MAKE_DIRECTORY ${download_dir}) + set(cudnn_filename cudnn-${CUDA_VERSION}-${url_arch_name}-v${version}.${url_extension}) + set(base_url http://developer.download.nvidia.com/compute/redist/cudnn) + set(cudnn_url ${base_url}/v${version_base}/${cudnn_filename}) + set(cudnn_file ${download_dir}/${cudnn_filename}) + + if(NOT EXISTS ${cudnn_file}) + message(STATUS "Downloading CUDNN library from NVIDIA...") + file(DOWNLOAD ${cudnn_url} ${cudnn_file} + SHOW_PROGRESS STATUS cudnn_status + ) + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzvf ${cudnn_file} WORKING_DIRECTORY ${download_dir} RESULT_VARIABLE cudnn_status) + + if(NOT "${cudnn_status}" MATCHES "0") + message(STATUS "Was not able to download CUDNN from ${cudnn_url}. Please install CuDNN manually from https://developer.nvidia.com/cuDNN") + endif() + endif() + + if(dest_bindir AND tar_bindir) + file(COPY ${download_dir}/${tar_bindir}/ DESTINATION ${dest_bindir}) + endif() + + if(dest_incdir) + file(COPY ${download_dir}/${tar_incdir}/ DESTINATION ${dest_incdir}) + endif() + + file(COPY ${download_dir}/${tar_libdir}/ DESTINATION ${dest_libdir} ) + + get_filename_component(dest_dir ${dest_libdir} DIRECTORY) + + set(CUDNN_ROOT_DIR ${dest_dir} PARENT_SCOPE) + unset(CUDNN_LIBRARY CACHE) + unset(CUDNN_INCLUDE_DIR CACHE) + + endif(url_arch_name) +endfunction() + +##################################################### + +find_package(PkgConfig) +pkg_check_modules(PC_CUDNN QUIET CUDNN) + +get_filename_component(__libpath_cudart "${CUDA_CUDART_LIBRARY}" PATH) + +# We use major only in library search as major/minor is not entirely consistent among platforms. +# Also, looking for exact minor version of .so is in general not a good idea. +# More strict enforcement of minor/patch version is done if/when the header file is examined. +if(CUDNN_FIND_VERSION_EXACT) + SET(__cudnn_ver_suffix ".${CUDNN_FIND_VERSION_MAJOR}") + SET(__cudnn_lib_win_name cudnn64_${CUDNN_FIND_VERSION_MAJOR}) +else() + SET(__cudnn_lib_win_name cudnn64) +endif() + +find_library(CUDNN_LIBRARY + NAMES libcudnn.so${__cudnn_ver_suffix} libcudnn${__cudnn_ver_suffix}.dylib ${__cudnn_lib_win_name} + PATHS $ENV{LD_LIBRARY_PATH} ${__libpath_cudart} ${CUDNN_ROOT_DIR} ${PC_CUDNN_LIBRARY_DIRS} ${CMAKE_INSTALL_PREFIX} + PATH_SUFFIXES lib lib64 bin + DOC "CUDNN library." ) + +if(CUDNN_LIBRARY) + SET(CUDNN_MAJOR_VERSION ${CUDNN_FIND_VERSION_MAJOR}) + set(CUDNN_VERSION ${CUDNN_MAJOR_VERSION}) + get_filename_component(__found_cudnn_root ${CUDNN_LIBRARY} PATH) + find_path(CUDNN_INCLUDE_DIR + NAMES cudnn.h + HINTS ${PC_CUDNN_INCLUDE_DIRS} ${CUDNN_ROOT_DIR} ${CUDA_TOOLKIT_INCLUDE} ${__found_cudnn_root} + PATH_SUFFIXES include + DOC "Path to CUDNN include directory." ) +endif() + +if(CUDNN_LIBRARY AND CUDNN_INCLUDE_DIR) + file(READ ${CUDNN_INCLUDE_DIR}/cudnn.h CUDNN_VERSION_FILE_CONTENTS) + string(REGEX MATCH "define CUDNN_MAJOR * +([0-9]+)" + CUDNN_MAJOR_VERSION "${CUDNN_VERSION_FILE_CONTENTS}") + string(REGEX REPLACE "define CUDNN_MAJOR * +([0-9]+)" "\\1" + CUDNN_MAJOR_VERSION "${CUDNN_MAJOR_VERSION}") + string(REGEX MATCH "define CUDNN_MINOR * +([0-9]+)" + CUDNN_MINOR_VERSION "${CUDNN_VERSION_FILE_CONTENTS}") + string(REGEX REPLACE "define CUDNN_MINOR * +([0-9]+)" "\\1" + CUDNN_MINOR_VERSION "${CUDNN_MINOR_VERSION}") + string(REGEX MATCH "define CUDNN_PATCHLEVEL * +([0-9]+)" + CUDNN_PATCH_VERSION "${CUDNN_VERSION_FILE_CONTENTS}") + string(REGEX REPLACE "define CUDNN_PATCHLEVEL * +([0-9]+)" "\\1" + CUDNN_PATCH_VERSION "${CUDNN_PATCH_VERSION}") + set(CUDNN_VERSION ${CUDNN_MAJOR_VERSION}.${CUDNN_MINOR_VERSION}) +endif() + +if(CUDNN_MAJOR_VERSION) + ## Fixing the case where 5.1 does not fit 'exact' 5. + if(CUDNN_FIND_VERSION_EXACT AND NOT CUDNN_FIND_VERSION_MINOR) + if("${CUDNN_MAJOR_VERSION}" STREQUAL "${CUDNN_FIND_VERSION_MAJOR}") + set(CUDNN_VERSION ${CUDNN_FIND_VERSION}) + endif() + endif() +else() + # Try to set CUDNN version from config file + set(CUDNN_VERSION ${PC_CUDNN_CFLAGS_OTHER}) +endif() + +find_package_handle_standard_args( + CUDNN + FOUND_VAR CUDNN_FOUND + REQUIRED_VARS CUDNN_LIBRARY + VERSION_VAR CUDNN_VERSION + ) + +if(CUDNN_FOUND) + set(CUDNN_LIBRARIES ${CUDNN_LIBRARY}) + set(CUDNN_INCLUDE_DIRS ${CUDNN_INCLUDE_DIR}) + set(CUDNN_DEFINITIONS ${PC_CUDNN_CFLAGS_OTHER}) +endif() + diff --git a/Makefile b/Makefile deleted file mode 100644 index 63e15e65..00000000 --- a/Makefile +++ /dev/null @@ -1,105 +0,0 @@ -GPU=0 -CUDNN=0 -OPENCV=0 -OPENMP=0 -DEBUG=0 - -ARCH= -gencode arch=compute_30,code=sm_30 \ - -gencode arch=compute_35,code=sm_35 \ - -gencode arch=compute_50,code=[sm_50,compute_50] \ - -gencode arch=compute_52,code=[sm_52,compute_52] -# -gencode arch=compute_20,code=[sm_20,sm_21] \ This one is deprecated? - -# This is what I use, uncomment if you know your arch and want to specify -# ARCH= -gencode arch=compute_52,code=compute_52 - -VPATH=./src/:./examples -SLIB=libdarknet.so -ALIB=libdarknet.a -EXEC=darknet -OBJDIR=./obj/ - -CC=gcc -CPP=g++ -NVCC=nvcc -AR=ar -ARFLAGS=rcs -OPTS=-Ofast -LDFLAGS= -lm -pthread -COMMON= -Iinclude/ -Isrc/ -CFLAGS=-Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC - -ifeq ($(OPENMP), 1) -CFLAGS+= -fopenmp -endif - -ifeq ($(DEBUG), 1) -OPTS=-O0 -g -endif - -CFLAGS+=$(OPTS) - -ifeq ($(OPENCV), 1) -COMMON+= -DOPENCV -CFLAGS+= -DOPENCV -LDFLAGS+= `pkg-config --libs opencv` -lstdc++ -COMMON+= `pkg-config --cflags opencv` -endif - -ifeq ($(GPU), 1) -COMMON+= -DGPU -I/usr/local/cuda/include/ -CFLAGS+= -DGPU -LDFLAGS+= -L/usr/local/cuda/lib64 -lcuda -lcudart -lcublas -lcurand -endif - -ifeq ($(CUDNN), 1) -COMMON+= -DCUDNN -CFLAGS+= -DCUDNN -LDFLAGS+= -lcudnn -endif - -OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o detection_layer.o route_layer.o upsample_layer.o box.o normalization_layer.o avgpool_layer.o layer.o local_layer.o shortcut_layer.o logistic_layer.o activation_layer.o rnn_layer.o gru_layer.o crnn_layer.o demo.o batchnorm_layer.o region_layer.o reorg_layer.o tree.o lstm_layer.o l2norm_layer.o yolo_layer.o iseg_layer.o image_opencv.o -EXECOBJA=captcha.o lsd.o super.o art.o tag.o cifar.o go.o rnn.o segmenter.o regressor.o classifier.o coco.o yolo.o detector.o nightmare.o instance-segmenter.o darknet.o -ifeq ($(GPU), 1) -LDFLAGS+= -lstdc++ -OBJ+=convolutional_kernels.o deconvolutional_kernels.o activation_kernels.o im2col_kernels.o col2im_kernels.o blas_kernels.o crop_layer_kernels.o dropout_layer_kernels.o maxpool_layer_kernels.o avgpool_layer_kernels.o -endif - -EXECOBJ = $(addprefix $(OBJDIR), $(EXECOBJA)) -OBJS = $(addprefix $(OBJDIR), $(OBJ)) -DEPS = $(wildcard src/*.h) Makefile include/darknet.h - -all: obj backup results $(SLIB) $(ALIB) $(EXEC) -#all: obj results $(SLIB) $(ALIB) $(EXEC) - - -$(EXEC): $(EXECOBJ) $(ALIB) - $(CC) $(COMMON) $(CFLAGS) $^ -o $@ $(LDFLAGS) $(ALIB) - -$(ALIB): $(OBJS) - $(AR) $(ARFLAGS) $@ $^ - -$(SLIB): $(OBJS) - $(CC) $(CFLAGS) -shared $^ -o $@ $(LDFLAGS) - -$(OBJDIR)%.o: %.cpp $(DEPS) - $(CPP) $(COMMON) $(CFLAGS) -c $< -o $@ - -$(OBJDIR)%.o: %.c $(DEPS) - $(CC) $(COMMON) $(CFLAGS) -c $< -o $@ - -$(OBJDIR)%.o: %.cu $(DEPS) - $(NVCC) $(ARCH) $(COMMON) --compiler-options "$(CFLAGS)" -c $< -o $@ - -obj: - mkdir -p obj -backup: - mkdir -p backup -results: - mkdir -p results - -.PHONY: clean - -clean: - rm -rf $(OBJS) $(SLIB) $(ALIB) $(EXEC) $(EXECOBJ) $(OBJDIR)/* - diff --git a/src/gemm.c b/src/gemm.c index 648027f2..08eea1e7 100644 --- a/src/gemm.c +++ b/src/gemm.c @@ -229,7 +229,8 @@ void time_gpu(int TA, int TB, int m, int k, int n) clock_t start = clock(), end; for(i = 0; i