diff --git a/unified-runtime/source/adapters/offload/CMakeLists.txt b/unified-runtime/source/adapters/offload/CMakeLists.txt index a60b5ef78eb09..f790bf802759a 100644 --- a/unified-runtime/source/adapters/offload/CMakeLists.txt +++ b/unified-runtime/source/adapters/offload/CMakeLists.txt @@ -25,7 +25,9 @@ add_ur_adapter(${TARGET_NAME} set(UR_OFFLOAD_INSTALL_DIR "" CACHE PATH "Path to the directory containing libomptarget.so etc") set(UR_OFFLOAD_INCLUDE_DIR "" CACHE PATH "Path to the directory containing LLVM headers") +set(UR_OFFLOAD_BUILD_FROM_SOURCE OFF) if (UR_OFFLOAD_INSTALL_DIR STREQUAL "" OR UR_OFFLOAD_INCLUDE_DIR STREQUAL "") + set(UR_OFFLOAD_BUILD_FROM_SOURCE ON) include(ExternalProject) set(LLVM_PROJECT_SOURCE_DIR ${CMAKE_BINARY_DIR}/llvm-src-offload) set(LLVM_PROJECT_TAG 32beea0605f37ea7a6429375d41b19ee78ddfe7d) @@ -132,12 +134,41 @@ if (CUDA_cuda_driver_LIBRARY) target_compile_definitions(${TARGET_NAME} PRIVATE UR_CUDA_ENABLED) endif() +if(UR_OFFLOAD_BUILD_FROM_SOURCE) + set(UR_OFFLOAD_LLVMOFFLOAD_LIBRARY + "${UR_OFFLOAD_INSTALL_DIR}/lib/libLLVMOffload${CMAKE_SHARED_LIBRARY_SUFFIX}") +else() + find_library(UR_OFFLOAD_LLVMOFFLOAD_LIBRARY + NAMES LLVMOffload + HINTS "${UR_OFFLOAD_INSTALL_DIR}" + PATH_SUFFIXES + "${CMAKE_INSTALL_LIBDIR}" + lib + lib64 + NO_DEFAULT_PATH + ) + if(NOT UR_OFFLOAD_LLVMOFFLOAD_LIBRARY) + file(GLOB UR_OFFLOAD_LLVMOFFLOAD_LIBRARY_CANDIDATES + "${UR_OFFLOAD_INSTALL_DIR}/lib*/libLLVMOffload${CMAKE_SHARED_LIBRARY_SUFFIX}" + "${UR_OFFLOAD_INSTALL_DIR}/lib*/*/libLLVMOffload${CMAKE_SHARED_LIBRARY_SUFFIX}" + ) + if(UR_OFFLOAD_LLVMOFFLOAD_LIBRARY_CANDIDATES) + list(SORT UR_OFFLOAD_LLVMOFFLOAD_LIBRARY_CANDIDATES) + list(GET UR_OFFLOAD_LLVMOFFLOAD_LIBRARY_CANDIDATES 0 UR_OFFLOAD_LLVMOFFLOAD_LIBRARY) + endif() + endif() + if(NOT UR_OFFLOAD_LLVMOFFLOAD_LIBRARY) + message(FATAL_ERROR + "Failed to find libLLVMOffload in ${UR_OFFLOAD_INSTALL_DIR}") + endif() +endif() + target_link_libraries(${TARGET_NAME} PRIVATE ${PROJECT_NAME}::headers ${PROJECT_NAME}::common ${PROJECT_NAME}::umf ur_common - ${UR_OFFLOAD_INSTALL_DIR}/lib/libLLVMOffload.so + ${UR_OFFLOAD_LLVMOFFLOAD_LIBRARY} ${ADDITIONAL_LINK_LIBS} ) diff --git a/unified-runtime/source/adapters/offload/enqueue.cpp b/unified-runtime/source/adapters/offload/enqueue.cpp index 4405e21cc2918..540bc2b515f82 100644 --- a/unified-runtime/source/adapters/offload/enqueue.cpp +++ b/unified-runtime/source/adapters/offload/enqueue.cpp @@ -19,6 +19,8 @@ #include "ur2offload.hpp" namespace { +constexpr ol_event_flags_t OL_DEFAULT_EVENT_FLAGS = 0; + ol_result_t waitOnEvents(ol_queue_handle_t Queue, const ur_event_handle_t *UrEvents, size_t NumEvents) { if (NumEvents) { @@ -41,7 +43,8 @@ ol_result_t makeEvent(ur_command_t Type, ol_queue_handle_t OlQueue, ur_queue_handle_t UrQueue, ur_event_handle_t *UrEvent) { if (UrEvent) { auto *Event = new ur_event_handle_t_(Type, UrQueue); - if (auto Res = olCreateEvent(OlQueue, &Event->OffloadEvent)) { + if (auto Res = olCreateEvent(OlQueue, OL_DEFAULT_EVENT_FLAGS, + &Event->OffloadEvent)) { delete Event; return Res; }; @@ -84,7 +87,8 @@ ur_result_t doWait(ur_queue_handle_t hQueue, uint32_t numEventsInWaitList, if (Q == TargetQueue) { continue; } - OL_RETURN_ON_ERR(olCreateEvent(Q, &OffloadHandles.emplace_back())); + OL_RETURN_ON_ERR(olCreateEvent(Q, OL_DEFAULT_EVENT_FLAGS, + &OffloadHandles.emplace_back())); } OL_RETURN_ON_ERR(olWaitEvents(TargetQueue, OffloadHandles.data(), OffloadHandles.size())); @@ -202,7 +206,8 @@ static ur_result_t urEnqueueKernelLaunch( OL_RETURN_ON_ERR(olLaunchKernel( Queue, hQueue->OffloadDevice, hKernel->OffloadKernel, - hKernel->Args.getStorage(), hKernel->Args.getStorageSize(), &LaunchArgs)); + hKernel->Args.getStorage(), hKernel->Args.getStorageSize(), &LaunchArgs, + nullptr)); OL_RETURN_ON_ERR(makeEvent(UR_COMMAND_KERNEL_LAUNCH, Queue, hQueue, phEvent)); return UR_RESULT_SUCCESS; @@ -261,7 +266,8 @@ ur_result_t doMemcpy(ur_command_t Command, ur_queue_handle_t hQueue, olMemcpy(Queue, DestPtr, DestDevice, SrcPtr, SrcDevice, size)); if (phEvent) { auto *Event = new ur_event_handle_t_(Command, hQueue); - if (auto Res = olCreateEvent(Queue, &Event->OffloadEvent)) { + if (auto Res = olCreateEvent(Queue, OL_DEFAULT_EVENT_FLAGS, + &Event->OffloadEvent)) { delete Event; return offloadResultToUR(Res); };