Skip to content

Commit

Permalink
Merge pull request #45 from deephealthproject/pull_request
Browse files Browse the repository at this point in the history
Improve CMake CUDA support
  • Loading branch information
RParedesPalacios committed Oct 16, 2019
2 parents 1e69996 + 126ae50 commit 46305c2
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 33 deletions.
49 changes: 16 additions & 33 deletions CMakeLists.txt
Expand Up @@ -10,7 +10,7 @@ SET(CMAKE_CXX_STANDARD_REQUIRED ON)
option(BUILD_PYTHON "Compile python binding" OFF)
option(BUILD_TESTS "Compile tests" OFF)
option(BUILD_EXAMPLES "Compile examples" ON)
SET(BUILD_TARGET "CPU" CACHE STRING "Compile library for {cpu, gpu, fpga}")
SET(BUILD_TARGET "CPU" CACHE STRING "Compile library for {CPU, GPU, FPGA}")
set_property(CACHE BUILD_TARGET PROPERTY STRINGS CPU GPU FPGA)

# PROPERTIES *******************************
Expand All @@ -32,14 +32,13 @@ endif()
# CUDA FLAGS
# Is this the best approach?
#set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --expt-relaxed-constexpr -lcudart -lcublas -lcurand")
#set(EDDL_WITH_CUDA OFF CACHE BOOL "Enable CUDA support if checked")

# Device specific setup
if(BUILD_TARGET STREQUAL "CPU")
message("Compiling for CPU...")
elseif(BUILD_TARGET STREQUAL "GPU")
message("Compiling for GPU...")
set(EDDL_WITH_CUDA ON BOOL FORCE)
set(EDDL_WITH_CUDA ON CACHE BOOL "Enable CUDA support if checked")
elseif(BUILD_TARGET STREQUAL "FPGA")
message("Compiling for FPGA...")
message(FATAL_ERROR "FPGA not implemented, CMake will exit." )
Expand All @@ -58,7 +57,7 @@ message(STATUS "CUDA Enabled: " ${EDDL_WITH_CUDA} )
message(STATUS "C++ flags: " ${CMAKE_CXX_FLAGS} )
message(STATUS "CUDA flags: " ${CMAKE_CUDA_FLAGS} )

# Add cuda (if possible)
# Add CUDA (if possible)
if(EDDL_WITH_CUDA)
include(CheckLanguage)
check_language(CUDA)
Expand All @@ -69,9 +68,6 @@ if(EDDL_WITH_CUDA)
set(CMAKE_CUDA_STANDARD 11)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
endif()
set(CUDA_TOOLKIT_ROOT_DIR "${CMAKE_CUDA_COMPILER}")
get_filename_component(CUDA_TOOLKIT_ROOT_DIR "${CUDA_TOOLKIT_ROOT_DIR}/../.." ABSOLUTE)
message(STATUS "CUDA ROOT DIR: " ${CUDA_TOOLKIT_ROOT_DIR})
else()
message(WARNING "No CUDA support")
endif()
Expand Down Expand Up @@ -375,12 +371,24 @@ set_target_properties(eddl PROPERTIES
CUDA_SEPARABLE_COMPILATION ON
CUDA_RESOLVE_DEVICE_SYMBOLS ON)


# OpenMP
find_package(OpenMP)
if (OPENMP_FOUND)
target_link_libraries(eddl PRIVATE OpenMP::OpenMP_CXX)
endif()


# CUDA
if(EDDL_WITH_CUDA AND CMAKE_CUDA_COMPILER)
target_link_libraries(eddl
PRIVATE cublas
PRIVATE cudart
PRIVATE curand
)
endif()


# pthreads setup for windows os
# The following commands should be removed when pthread linux
# specific calls will be replaced by thread c++ standard calls
Expand All @@ -396,40 +404,15 @@ if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
PRIVATE optimized "${EDDL_PTHREADS_INSTALL_PATH}/lib/libpthreadVCE3.lib"
PRIVATE optimized "${EDDL_PTHREADS_INSTALL_PATH}/lib/libpthreadVSE3.lib")
target_include_directories(eddl PUBLIC "${EDDL_PTHREADS_INSTALL_PATH}/include")

if(EDDL_WITH_CUDA AND CMAKE_CUDA_COMPILER)
set(EDDL_CUDA_LIBRARIES_PATH "${CUDA_TOOLKIT_ROOT_DIR}/lib/x64" CACHE PATH "Path to cublas, cudart, and curand libs")
if (EDDL_CUDA_LIBRARIES_PATH STREQUAL "")
message(ERROR ": cudart, cublas, and curand paths must be specified")
else()
target_link_libraries(eddl
PRIVATE "${EDDL_CUDA_LIBRARIES_PATH}/cublas.lib"
PRIVATE "${EDDL_CUDA_LIBRARIES_PATH}/cudart.lib"
PRIVATE "${EDDL_CUDA_LIBRARIES_PATH}/curand.lib"
)
endif()
endif()
endif()


# pthreads setup for linux os
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
SET(CMAKE_THREAD_PREFER_PTHREAD TRUE)
SET(THREADS_PREFER_PTHREAD_FLAG TRUE)
find_package(Threads REQUIRED)
target_link_libraries(eddl PRIVATE Threads::Threads)

if(EDDL_WITH_CUDA AND CMAKE_CUDA_COMPILER)
set(EDDL_CUDA_LIBRARIES_PATH "${CUDA_TOOLKIT_ROOT_DIR}/lib64" CACHE PATH "Path to cublas, cudart, and curand libs")
if (EDDL_CUDA_LIBRARIES_PATH STREQUAL "")
message(ERROR ": cudart, cublas, and curand paths must be specified")
else()
target_link_libraries(eddl
PRIVATE "${EDDL_CUDA_LIBRARIES_PATH}/libcublas.so"
PRIVATE "${EDDL_CUDA_LIBRARIES_PATH}/libcudart.so"
PRIVATE "${EDDL_CUDA_LIBRARIES_PATH}/libcurand.so"
)
endif()
endif()
endif()

## [BINDING] Create python binding
Expand Down
6 changes: 6 additions & 0 deletions cmake/EDDLConfig.cmake.in
@@ -1,12 +1,18 @@
include(CMakeFindDependencyMacro)

SET(EDDL_WITH_CUDA @EDDL_WITH_CUDA@)

# pthreads setup for linux os
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
SET(CMAKE_THREAD_PREFER_PTHREAD TRUE)
SET(THREADS_PREFER_PTHREAD_FLAG TRUE)
find_dependency(Threads)
endif()

if (${EDDL_WITH_CUDA})
enable_language(CUDA)
endif()

find_dependency(OpenMP)
include("@CMAKE_INSTALL_PREFIX@/EDDLTargets.cmake")

Expand Down

0 comments on commit 46305c2

Please sign in to comment.