From a349d4820cc18997a0b23e25540694ed8e12126f Mon Sep 17 00:00:00 2001 From: Jonas Hahnfeld Date: Tue, 30 Jan 2018 16:49:13 +0000 Subject: [PATCH] [libomptarget] Check for library with CUDA Driver API That's what we really need to link the CUDA plugin against, not the CUDA runtime API in CUDA_LIBRARIES! While the latter comes with the CUDA SDK, the Driver API is installed with the kernel driver and there is at most one per system. As fallback we can use the stubs library distributed with the CUDA SDK for linking. Differential Revision: https://reviews.llvm.org/D42643 llvm-svn: 323787 --- .../Modules/LibomptargetGetDependencies.cmake | 33 ++++++++- .../libomptarget/plugins/cuda/CMakeLists.txt | 74 +++++++++---------- 2 files changed, 67 insertions(+), 40 deletions(-) diff --git a/openmp/libomptarget/cmake/Modules/LibomptargetGetDependencies.cmake b/openmp/libomptarget/cmake/Modules/LibomptargetGetDependencies.cmake index 37227c096486..acdaff21e2cc 100644 --- a/openmp/libomptarget/cmake/Modules/LibomptargetGetDependencies.cmake +++ b/openmp/libomptarget/cmake/Modules/LibomptargetGetDependencies.cmake @@ -115,10 +115,37 @@ mark_as_advanced( find_package(CUDA QUIET) set(LIBOMPTARGET_DEP_CUDA_FOUND ${CUDA_FOUND}) -set(LIBOMPTARGET_DEP_CUDA_LIBRARIES ${CUDA_LIBRARIES}) set(LIBOMPTARGET_DEP_CUDA_INCLUDE_DIRS ${CUDA_INCLUDE_DIRS}) mark_as_advanced( LIBOMPTARGET_DEP_CUDA_FOUND - LIBOMPTARGET_DEP_CUDA_INCLUDE_DIRS - LIBOMPTARGET_DEP_CUDA_LIBRARIES) + LIBOMPTARGET_DEP_CUDA_INCLUDE_DIRS) + +################################################################################ +# Looking for CUDA Driver API... (needed for CUDA plugin) +################################################################################ + +find_library ( + LIBOMPTARGET_DEP_CUDA_DRIVER_LIBRARIES + NAMES + cuda + PATHS + /lib64) + +# There is a libcuda.so in lib64/stubs that can be used for linking. +if (NOT LIBOMPTARGET_DEP_CUDA_DRIVER_LIBRARIES AND CUDA_FOUND) + get_filename_component(CUDA_LIBDIR ${CUDA_LIBRARIES} DIRECTORY) + find_library ( + LIBOMPTARGET_DEP_CUDA_DRIVER_LIBRARIES + NAMES + cuda + HINTS + "${CUDA_LIBDIR}/stubs") +endif() + +find_package_handle_standard_args( + LIBOMPTARGET_DEP_CUDA_DRIVER + DEFAULT_MSG + LIBOMPTARGET_DEP_CUDA_DRIVER_LIBRARIES) + +mark_as_advanced(LIBOMPTARGET_DEP_CUDA_DRIVER_LIBRARIES) diff --git a/openmp/libomptarget/plugins/cuda/CMakeLists.txt b/openmp/libomptarget/plugins/cuda/CMakeLists.txt index 83ece5409e84..8763065e78cd 100644 --- a/openmp/libomptarget/plugins/cuda/CMakeLists.txt +++ b/openmp/libomptarget/plugins/cuda/CMakeLists.txt @@ -10,41 +10,41 @@ # Build a plugin for a CUDA machine if available. # ##===----------------------------------------------------------------------===## -if(LIBOMPTARGET_DEP_LIBELF_FOUND) - if(LIBOMPTARGET_DEP_CUDA_FOUND) - if(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(ppc64le)$" AND CMAKE_SYSTEM_NAME MATCHES "Linux") - - libomptarget_say("Building CUDA offloading plugin.") - - # Define the suffix for the runtime messaging dumps. - add_definitions(-DTARGET_NAME=CUDA) - - if(LIBOMPTARGET_CMAKE_BUILD_TYPE MATCHES debug) - add_definitions(-DCUDA_ERROR_REPORT) - endif() - - include_directories(${LIBOMPTARGET_DEP_CUDA_INCLUDE_DIRS}) - include_directories(${LIBOMPTARGET_DEP_LIBELF_INCLUDE_DIRS}) - - add_library(omptarget.rtl.cuda SHARED src/rtl.cpp) - - # Install plugin under the lib destination folder. - install(TARGETS omptarget.rtl.cuda LIBRARY DESTINATION lib${OPENMP_LIBDIR_SUFFIX}) - - target_link_libraries(omptarget.rtl.cuda - ${LIBOMPTARGET_DEP_CUDA_LIBRARIES} - cuda - ${LIBOMPTARGET_DEP_LIBELF_LIBRARIES} - "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/../exports") - - # Report to the parent scope that we are building a plugin for CUDA. - set(LIBOMPTARGET_SYSTEM_TARGETS "${LIBOMPTARGET_SYSTEM_TARGETS} nvptx64-nvidia-cuda" PARENT_SCOPE) - else() - libomptarget_say("Not building CUDA offloading plugin: only support CUDA in Linux x86_64 or ppc64le hosts.") - endif() - else() - libomptarget_say("Not building CUDA offloading plugin: CUDA not found in system.") - endif() -else(LIBOMPTARGET_DEP_LIBELF_FOUND) +if (NOT(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(ppc64le)$" AND CMAKE_SYSTEM_NAME MATCHES "Linux")) + libomptarget_say("Not building CUDA offloading plugin: only support CUDA in Linux x86_64 or ppc64le hosts.") + return() +elseif (NOT LIBOMPTARGET_DEP_LIBELF_FOUND) libomptarget_say("Not building CUDA offloading plugin: libelf dependency not found.") -endif(LIBOMPTARGET_DEP_LIBELF_FOUND) + return() +elseif(NOT LIBOMPTARGET_DEP_CUDA_FOUND) + libomptarget_say("Not building CUDA offloading plugin: CUDA not found in system.") + return() +elseif(NOT LIBOMPTARGET_DEP_CUDA_DRIVER_FOUND) + libomptarget_say("Not building CUDA offloading plugin: CUDA Driver API not found in system.") + return() +endif() + +libomptarget_say("Building CUDA offloading plugin.") + +# Define the suffix for the runtime messaging dumps. +add_definitions(-DTARGET_NAME=CUDA) + +if(LIBOMPTARGET_CMAKE_BUILD_TYPE MATCHES debug) + add_definitions(-DCUDA_ERROR_REPORT) +endif() + +include_directories(${LIBOMPTARGET_DEP_CUDA_INCLUDE_DIRS}) +include_directories(${LIBOMPTARGET_DEP_LIBELF_INCLUDE_DIRS}) + +add_library(omptarget.rtl.cuda SHARED src/rtl.cpp) + +# Install plugin under the lib destination folder. +install(TARGETS omptarget.rtl.cuda LIBRARY DESTINATION lib${OPENMP_LIBDIR_SUFFIX}) + +target_link_libraries(omptarget.rtl.cuda + ${LIBOMPTARGET_DEP_CUDA_DRIVER_LIBRARIES} + ${LIBOMPTARGET_DEP_LIBELF_LIBRARIES} + "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/../exports") + +# Report to the parent scope that we are building a plugin for CUDA. +set(LIBOMPTARGET_SYSTEM_TARGETS "${LIBOMPTARGET_SYSTEM_TARGETS} nvptx64-nvidia-cuda" PARENT_SCOPE)