From c11911e4e11fa6e00d63ac973b810008a88dafc8 Mon Sep 17 00:00:00 2001 From: pradeep Date: Mon, 4 Nov 2019 10:18:41 +0530 Subject: [PATCH 1/7] Locate cudnn header for cmake include command --- src/backend/cuda/CMakeLists.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/backend/cuda/CMakeLists.txt b/src/backend/cuda/CMakeLists.txt index 6a0064644b..5281fa134d 100644 --- a/src/backend/cuda/CMakeLists.txt +++ b/src/backend/cuda/CMakeLists.txt @@ -13,6 +13,13 @@ dependency_check(CUDA_FOUND "CUDA not found.") find_cuda_helper_libs(nvrtc) find_cuda_helper_libs(nvrtc-builtins) find_cuda_helper_libs(cudnn) +get_filename_component(__found_cudnn_root ${CUDA_cudnn_LIBRARY} PATH) +find_path(CUDA_cudnn_INCLUDE_DIR + NAMES cudnn.h + HINTS ${__found_cudnn_root} ${CUDNN_ROOT_DIR} ${CUDA_TOOLKIT_INCLUDE} + PATH_SUFFIXES include + DOC "Path to CUDNN include directory.") +mark_as_advanced(CUDA_cudnn_INCLUDE_DIR) get_filename_component(CUDA_LIBRARIES_PATH ${CUDA_cudart_static_LIBRARY} DIRECTORY CACHE) @@ -507,6 +514,7 @@ target_include_directories (afcuda $ PRIVATE ${CUDA_INCLUDE_DIRS} + ${CUDA_cudnn_INCLUDE_DIR} ${ArrayFire_SOURCE_DIR}/src/api/c ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/kernel From b24a677c4abc6fa439db934f8374580c20b95979 Mon Sep 17 00:00:00 2001 From: pradeep Date: Mon, 4 Nov 2019 12:35:00 +0530 Subject: [PATCH 2/7] Throw error from cmake when cudnn not found --- src/backend/cuda/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/backend/cuda/CMakeLists.txt b/src/backend/cuda/CMakeLists.txt index 5281fa134d..e7c10eadd9 100644 --- a/src/backend/cuda/CMakeLists.txt +++ b/src/backend/cuda/CMakeLists.txt @@ -21,6 +21,10 @@ find_path(CUDA_cudnn_INCLUDE_DIR DOC "Path to CUDNN include directory.") mark_as_advanced(CUDA_cudnn_INCLUDE_DIR) +if(CUDA_cudnn_INCLUDE_DIR-NOTFOUND) + message(FATAL_ERROR "cuDNN framework required for CUDA backend.") +endif() + get_filename_component(CUDA_LIBRARIES_PATH ${CUDA_cudart_static_LIBRARY} DIRECTORY CACHE) include(FileToString) From dcb4fe6c852ab67795f97d6c3e8f54de508a11b4 Mon Sep 17 00:00:00 2001 From: pradeep Date: Wed, 13 Nov 2019 21:54:13 +0530 Subject: [PATCH 3/7] Address review feedback --- src/backend/cuda/CMakeLists.txt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/backend/cuda/CMakeLists.txt b/src/backend/cuda/CMakeLists.txt index e7c10eadd9..bf263148a1 100644 --- a/src/backend/cuda/CMakeLists.txt +++ b/src/backend/cuda/CMakeLists.txt @@ -8,18 +8,20 @@ include(InternalUtils) include(select_compute_arch) +set(AF_CUDNN_ROOT_DIR "" CACHE PATH "cuDNN installation root path") + dependency_check(CUDA_FOUND "CUDA not found.") find_cuda_helper_libs(nvrtc) find_cuda_helper_libs(nvrtc-builtins) find_cuda_helper_libs(cudnn) -get_filename_component(__found_cudnn_root ${CUDA_cudnn_LIBRARY} PATH) +get_filename_component(found_cudnn_root ${CUDA_cudnn_LIBRARY} PATH) find_path(CUDA_cudnn_INCLUDE_DIR NAMES cudnn.h - HINTS ${__found_cudnn_root} ${CUDNN_ROOT_DIR} ${CUDA_TOOLKIT_INCLUDE} + HINTS ${found_cudnn_root} ${AF_CUDNN_ROOT_DIR} ${CUDA_TOOLKIT_INCLUDE} PATH_SUFFIXES include DOC "Path to CUDNN include directory.") -mark_as_advanced(CUDA_cudnn_INCLUDE_DIR) +mark_as_advanced(CUDA_cudnn_INCLUDE_DIR AF_CUDNN_ROOT_DIR) if(CUDA_cudnn_INCLUDE_DIR-NOTFOUND) message(FATAL_ERROR "cuDNN framework required for CUDA backend.") From 921964f38bf0823e5298c0e1785a5f0980d6e5d5 Mon Sep 17 00:00:00 2001 From: pradeep Date: Fri, 15 Nov 2019 13:03:05 +0530 Subject: [PATCH 4/7] Use FindcuDNN cmake module for cuDNN framework --- CMakeLists.txt | 1 + CMakeModules/FindcuDNN.cmake | 155 ++++++++++++++++++++++++++++++++ src/backend/cuda/CMakeLists.txt | 17 +--- 3 files changed, 157 insertions(+), 16 deletions(-) create mode 100644 CMakeModules/FindcuDNN.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 312bd97058..c6bb17d1b3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,6 +30,7 @@ arrayfire_set_cmake_default_variables() set(MKL_THREAD_LAYER "Intel OpenMP" CACHE STRING "The thread layer to choose for MKL") find_package(CUDA 7.0) +find_package(cuDNN 7.3) find_package(OpenCL 1.2) find_package(OpenGL) find_package(FreeImage) diff --git a/CMakeModules/FindcuDNN.cmake b/CMakeModules/FindcuDNN.cmake new file mode 100644 index 0000000000..621961466d --- /dev/null +++ b/CMakeModules/FindcuDNN.cmake @@ -0,0 +1,155 @@ +# Fetched the original content of this file from +# https://github.com/soumith/cudnn.torch/blob/master/cmake/FindcuDNN.cmake +# which is distributed under the OSI-approved BSD 3-Clause License. + +# 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) +# Usage +# ----- +# add_exectuable(helloworld main.cpp) +# target_link_libraries(helloworld PRIVATE nvidia::cuDNN) +# +# Note: It is recommended to avoid using variables set by the find module. +# +# Result variables +# ---------------- +# +# This module will set the following variables in your project: +# +# ``cuDNN_INCLUDE_DIRS`` +# where to find cudnn.h. +# ``cuDNN_LINK_LIBRARY`` +# the libraries to link against to use cuDNN. +# ``cuDNN_DLL_LIBRARY`` +# Windows DLL of cuDNN +# ``cuDNN_FOUND`` +# If false, do not try to use cuDNN. +# ``cuDNN_VERSION`` +# Version of the cuDNN library we looked for +# +# NOTE: ALWAYS call find_package(cuDNN ...) after find_package(CUDA) +# as this find module uses from cache variables set by find +# CUDA module + +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_LINK_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 link library." ) + +if(WIN32 AND cuDNN_LINK_LIBRARY) + find_file(cuDNN_DLL_LIBRARY + NAMES ${cudnn_lib_win_name}${CMAKE_SHARED_LIBRARY_SUFFIX} + PATHS + $ENV{PATH} + ${libpath_cudart} + ${cuDNN_ROOT_DIR} + ${PC_CUDNN_LIBRARY_DIRS} + ${CMAKE_INSTALL_PREFIX} + PATH_SUFFIXES lib lib64 bin + DOC "cuDNN Windows DLL." ) +endif() + +if(cuDNN_LINK_LIBRARY) + set(cuDNN_MAJOR_VERSION ${cuDNN_FIND_VERSION_MAJOR}) + set(cuDNN_VERSION ${cuDNN_MAJOR_VERSION}) + get_filename_component(found_cudnn_root ${cuDNN_LINK_LIBRARY} PATH) + find_path(cuDNN_INCLUDE_DIRS + NAMES cudnn.h + HINTS + ${PC_CUDNN_INCLUDE_DIRS} + ${cuDNN_ROOT_DIR} + ${CUDA_TOOLKIT_INCLUDE} + ${found_cudnn_root} + PATH_SUFFIXES include + DOC "cuDNN include directory path." ) +endif() + +if(cuDNN_LINK_LIBRARY AND cuDNN_INCLUDE_DIRS) + file(READ ${cuDNN_INCLUDE_DIRS}/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 + REQUIRED_VARS cuDNN_LINK_LIBRARY cuDNN_INCLUDE_DIRS + VERSION_VAR cuDNN_VERSION + ) + +mark_as_advanced(cuDNN_LINK_LIBRARY cuDNN_INCLUDE_DIRS cuDNN_DLL_LIBRARY) + +if(cuDNN_FOUND) + add_library(nvidia::cuDNN SHARED IMPORTED) + if(WIN32) + set_target_properties(nvidia::cuDNN + PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGE "C" + INTERFACE_INCLUDE_DIRECTORIES "${cuDNN_INCLUDE_DIRS}" + IMPORTED_LOCATION "${cuDNN_DLL_LIBRARY}" + IMPORTED_IMPLIB "${cuDNN_LINK_LIBRARY}" + ) + else() + set_target_properties(nvidia::cuDNN + PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGE "C" + INTERFACE_INCLUDE_DIRECTORIES "${cuDNN_INCLUDE_DIRS}" + IMPORTED_LOCATION "${cuDNN_LINK_LIBRARY}" + ) + endif() +endif() diff --git a/src/backend/cuda/CMakeLists.txt b/src/backend/cuda/CMakeLists.txt index bf263148a1..d0734eb412 100644 --- a/src/backend/cuda/CMakeLists.txt +++ b/src/backend/cuda/CMakeLists.txt @@ -8,24 +8,10 @@ include(InternalUtils) include(select_compute_arch) -set(AF_CUDNN_ROOT_DIR "" CACHE PATH "cuDNN installation root path") - dependency_check(CUDA_FOUND "CUDA not found.") find_cuda_helper_libs(nvrtc) find_cuda_helper_libs(nvrtc-builtins) -find_cuda_helper_libs(cudnn) -get_filename_component(found_cudnn_root ${CUDA_cudnn_LIBRARY} PATH) -find_path(CUDA_cudnn_INCLUDE_DIR - NAMES cudnn.h - HINTS ${found_cudnn_root} ${AF_CUDNN_ROOT_DIR} ${CUDA_TOOLKIT_INCLUDE} - PATH_SUFFIXES include - DOC "Path to CUDNN include directory.") -mark_as_advanced(CUDA_cudnn_INCLUDE_DIR AF_CUDNN_ROOT_DIR) - -if(CUDA_cudnn_INCLUDE_DIR-NOTFOUND) - message(FATAL_ERROR "cuDNN framework required for CUDA backend.") -endif() get_filename_component(CUDA_LIBRARIES_PATH ${CUDA_cudart_static_LIBRARY} DIRECTORY CACHE) @@ -520,7 +506,6 @@ target_include_directories (afcuda $ PRIVATE ${CUDA_INCLUDE_DIRS} - ${CUDA_cudnn_INCLUDE_DIR} ${ArrayFire_SOURCE_DIR}/src/api/c ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/kernel @@ -549,7 +534,7 @@ target_link_libraries(afcuda ${CUDA_CUFFT_LIBRARIES} ${CUDA_cusolver_LIBRARY} ${CUDA_cusparse_LIBRARY} - ${CUDA_cudnn_LIBRARY} + nvidia::cuDNN ${CMAKE_DL_LIBS} ) From 62993eeed37b82e098dcd28d3006d4a7446b9e39 Mon Sep 17 00:00:00 2001 From: pradeep Date: Fri, 15 Nov 2019 17:01:06 +0530 Subject: [PATCH 5/7] Improvements to FindcuDNN after Windows testing --- CMakeModules/FindcuDNN.cmake | 121 +++++++++++++------------------- src/backend/cuda/CMakeLists.txt | 3 + 2 files changed, 52 insertions(+), 72 deletions(-) diff --git a/CMakeModules/FindcuDNN.cmake b/CMakeModules/FindcuDNN.cmake index 621961466d..c453f891dc 100644 --- a/CMakeModules/FindcuDNN.cmake +++ b/CMakeModules/FindcuDNN.cmake @@ -10,8 +10,6 @@ # 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) # Usage # ----- # add_exectuable(helloworld main.cpp) @@ -42,62 +40,16 @@ 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_LINK_LIBRARY - NAMES - libcudnn.so${cudnn_ver_suffix} - libcudnn${cudnn_ver_suffix}.dylib - ${cudnn_lib_win_name} - PATHS - $ENV{LD_LIBRARY_PATH} - ${libpath_cudart} +find_path(cuDNN_INCLUDE_DIRS + NAMES cudnn.h + HINTS + ${PC_CUDNN_INCLUDE_DIRS} ${cuDNN_ROOT_DIR} - ${PC_CUDNN_LIBRARY_DIRS} - ${CMAKE_INSTALL_PREFIX} - PATH_SUFFIXES lib lib64 bin - DOC "cuDNN link library." ) - -if(WIN32 AND cuDNN_LINK_LIBRARY) - find_file(cuDNN_DLL_LIBRARY - NAMES ${cudnn_lib_win_name}${CMAKE_SHARED_LIBRARY_SUFFIX} - PATHS - $ENV{PATH} - ${libpath_cudart} - ${cuDNN_ROOT_DIR} - ${PC_CUDNN_LIBRARY_DIRS} - ${CMAKE_INSTALL_PREFIX} - PATH_SUFFIXES lib lib64 bin - DOC "cuDNN Windows DLL." ) -endif() + ${CUDA_TOOLKIT_INCLUDE} + PATH_SUFFIXES include + DOC "cuDNN include directory path." ) -if(cuDNN_LINK_LIBRARY) - set(cuDNN_MAJOR_VERSION ${cuDNN_FIND_VERSION_MAJOR}) - set(cuDNN_VERSION ${cuDNN_MAJOR_VERSION}) - get_filename_component(found_cudnn_root ${cuDNN_LINK_LIBRARY} PATH) - find_path(cuDNN_INCLUDE_DIRS - NAMES cudnn.h - HINTS - ${PC_CUDNN_INCLUDE_DIRS} - ${cuDNN_ROOT_DIR} - ${CUDA_TOOLKIT_INCLUDE} - ${found_cudnn_root} - PATH_SUFFIXES include - DOC "cuDNN include directory path." ) -endif() - -if(cuDNN_LINK_LIBRARY AND cuDNN_INCLUDE_DIRS) +if(cuDNN_INCLUDE_DIRS) file(READ ${cuDNN_INCLUDE_DIRS}/cudnn.h CUDNN_VERSION_FILE_CONTENTS) string(REGEX MATCH "define CUDNN_MAJOR * +([0-9]+)" CUDNN_MAJOR_VERSION "${CUDNN_VERSION_FILE_CONTENTS}") @@ -114,23 +66,48 @@ if(cuDNN_LINK_LIBRARY AND cuDNN_INCLUDE_DIRS) 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() +# Choose lib suffix to be exact major version if requested +# otherwise, just pick the one read from cudnn.h header +if(cuDNN_FIND_VERSION_EXACT) + set(cudnn_ver_suffix "${cuDNN_FIND_VERSION_MAJOR}") else() - # Try to set CUDNN version from config file - set(cuDNN_VERSION ${PC_CUDNN_CFLAGS_OTHER}) + set(cudnn_ver_suffix "${CUDNN_MAJOR_VERSION}") endif() -find_package_handle_standard_args( - cuDNN +if(cuDNN_INCLUDE_DIRS) + get_filename_component(libpath_cudart "${CUDA_CUDART_LIBRARY}" PATH) + + find_library(cuDNN_LINK_LIBRARY + NAMES + libcudnn.so.${cudnn_ver_suffix} + libcudnn.${cudnn_ver_suffix}.dylib + cudnn + PATHS + $ENV{LD_LIBRARY_PATH} + ${libpath_cudart} + ${cuDNN_ROOT_DIR} + ${PC_CUDNN_LIBRARY_DIRS} + ${CMAKE_INSTALL_PREFIX} + PATH_SUFFIXES lib lib64 bin lib/x64 bin/x64 + DOC "cuDNN link library." ) + + if(WIN32 AND cuDNN_LINK_LIBRARY) + find_file(cuDNN_DLL_LIBRARY + NAMES cudnn64_${cudnn_ver_suffix}${CMAKE_SHARED_LIBRARY_SUFFIX} + PATHS + $ENV{PATH} + ${libpath_cudart} + ${cuDNN_ROOT_DIR} + ${PC_CUDNN_LIBRARY_DIRS} + ${CMAKE_INSTALL_PREFIX} + PATH_SUFFIXES lib lib64 bin lib/x64 bin/x64 + DOC "cuDNN Windows DLL." ) + endif() +endif() + +find_package_handle_standard_args(cuDNN REQUIRED_VARS cuDNN_LINK_LIBRARY cuDNN_INCLUDE_DIRS - VERSION_VAR cuDNN_VERSION - ) + VERSION_VAR cuDNN_VERSION) mark_as_advanced(cuDNN_LINK_LIBRARY cuDNN_INCLUDE_DIRS cuDNN_DLL_LIBRARY) @@ -144,12 +121,12 @@ if(cuDNN_FOUND) IMPORTED_LOCATION "${cuDNN_DLL_LIBRARY}" IMPORTED_IMPLIB "${cuDNN_LINK_LIBRARY}" ) - else() + else(WIN32) set_target_properties(nvidia::cuDNN PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGE "C" INTERFACE_INCLUDE_DIRECTORIES "${cuDNN_INCLUDE_DIRS}" IMPORTED_LOCATION "${cuDNN_LINK_LIBRARY}" ) - endif() -endif() + endif(WIN32) +endif(cuDNN_FOUND) diff --git a/src/backend/cuda/CMakeLists.txt b/src/backend/cuda/CMakeLists.txt index d0734eb412..550b07ce0f 100644 --- a/src/backend/cuda/CMakeLists.txt +++ b/src/backend/cuda/CMakeLists.txt @@ -12,6 +12,9 @@ dependency_check(CUDA_FOUND "CUDA not found.") find_cuda_helper_libs(nvrtc) find_cuda_helper_libs(nvrtc-builtins) +if(NOT cuDNN_FOUND) + message(FATAL_ERROR "Atleast cuDNN version 7.3 is required, please install.") +endif() get_filename_component(CUDA_LIBRARIES_PATH ${CUDA_cudart_static_LIBRARY} DIRECTORY CACHE) From 8e8e1b705a3fdfc37fe18760c72e8a7ecb575f64 Mon Sep 17 00:00:00 2001 From: pradeep Date: Fri, 15 Nov 2019 23:47:09 +0530 Subject: [PATCH 6/7] Add copyright notice to FindcuDNN --- CMakeModules/FindcuDNN.cmake | 26 ++++++++++++++++++-------- src/backend/cuda/CMakeLists.txt | 2 +- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/CMakeModules/FindcuDNN.cmake b/CMakeModules/FindcuDNN.cmake index c453f891dc..4cee660568 100644 --- a/CMakeModules/FindcuDNN.cmake +++ b/CMakeModules/FindcuDNN.cmake @@ -1,7 +1,17 @@ # Fetched the original content of this file from -# https://github.com/soumith/cudnn.torch/blob/master/cmake/FindcuDNN.cmake -# which is distributed under the OSI-approved BSD 3-Clause License. - +# https://github.com/soumith/cudnn.torch +# +# Original Copyright: +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. +# +# Copyright (c) 2017, ArrayFire +# All rights reserved. +# +# This file is distributed under 3-clause BSD license. +# The complete license agreement can be obtained at: +# http://arrayfire.com/licenses/BSD-3-Clause +# # FindcuDNN # ------- # @@ -13,7 +23,7 @@ # Usage # ----- # add_exectuable(helloworld main.cpp) -# target_link_libraries(helloworld PRIVATE nvidia::cuDNN) +# target_link_libraries(helloworld PRIVATE cuDNN::cuDNN) # # Note: It is recommended to avoid using variables set by the find module. # @@ -90,7 +100,7 @@ if(cuDNN_INCLUDE_DIRS) ${CMAKE_INSTALL_PREFIX} PATH_SUFFIXES lib lib64 bin lib/x64 bin/x64 DOC "cuDNN link library." ) - + if(WIN32 AND cuDNN_LINK_LIBRARY) find_file(cuDNN_DLL_LIBRARY NAMES cudnn64_${cudnn_ver_suffix}${CMAKE_SHARED_LIBRARY_SUFFIX} @@ -112,9 +122,9 @@ find_package_handle_standard_args(cuDNN mark_as_advanced(cuDNN_LINK_LIBRARY cuDNN_INCLUDE_DIRS cuDNN_DLL_LIBRARY) if(cuDNN_FOUND) - add_library(nvidia::cuDNN SHARED IMPORTED) + add_library(cuDNN::cuDNN SHARED IMPORTED) if(WIN32) - set_target_properties(nvidia::cuDNN + set_target_properties(cuDNN::cuDNN PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGE "C" INTERFACE_INCLUDE_DIRECTORIES "${cuDNN_INCLUDE_DIRS}" @@ -122,7 +132,7 @@ if(cuDNN_FOUND) IMPORTED_IMPLIB "${cuDNN_LINK_LIBRARY}" ) else(WIN32) - set_target_properties(nvidia::cuDNN + set_target_properties(cuDNN::cuDNN PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGE "C" INTERFACE_INCLUDE_DIRECTORIES "${cuDNN_INCLUDE_DIRS}" diff --git a/src/backend/cuda/CMakeLists.txt b/src/backend/cuda/CMakeLists.txt index 550b07ce0f..37f9b94af0 100644 --- a/src/backend/cuda/CMakeLists.txt +++ b/src/backend/cuda/CMakeLists.txt @@ -537,7 +537,7 @@ target_link_libraries(afcuda ${CUDA_CUFFT_LIBRARIES} ${CUDA_cusolver_LIBRARY} ${CUDA_cusparse_LIBRARY} - nvidia::cuDNN + cuDNN::cuDNN ${CMAKE_DL_LIBS} ) From a9e16a4f7dcc8c7073d17abd22aed1d8bf9af905 Mon Sep 17 00:00:00 2001 From: pradeep Date: Fri, 15 Nov 2019 23:54:21 +0530 Subject: [PATCH 7/7] Address additional feedback --- CMakeModules/FindcuDNN.cmake | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CMakeModules/FindcuDNN.cmake b/CMakeModules/FindcuDNN.cmake index 4cee660568..fd49fbe96b 100644 --- a/CMakeModules/FindcuDNN.cmake +++ b/CMakeModules/FindcuDNN.cmake @@ -17,6 +17,9 @@ # # Find cuDNN library # +# This module creates imported target cuDNN::cuDNN upon successfull +# lookup of cuDNN headers and libraries. +# # Valiables that affect result: # , , : as usual # @@ -42,14 +45,12 @@ # If false, do not try to use cuDNN. # ``cuDNN_VERSION`` # Version of the cuDNN library we looked for -# -# NOTE: ALWAYS call find_package(cuDNN ...) after find_package(CUDA) -# as this find module uses from cache variables set by find -# CUDA module find_package(PkgConfig) pkg_check_modules(PC_CUDNN QUIET cuDNN) +find_package(CUDA QUIET) + find_path(cuDNN_INCLUDE_DIRS NAMES cudnn.h HINTS