diff --git a/.github/intel-llvm-mirror-base-commit b/.github/intel-llvm-mirror-base-commit index 4b024d3a9a..78b97bc53d 100644 --- a/.github/intel-llvm-mirror-base-commit +++ b/.github/intel-llvm-mirror-base-commit @@ -1 +1 @@ -6133d210a53fa455357c97f818de0e15940b05e7 +8959a5e5a6cebac8993c58c5597638b4510be91f diff --git a/cmake/FetchLevelZero.cmake b/cmake/FetchLevelZero.cmake index cf1ca5e823..b0cf93240c 100644 --- a/cmake/FetchLevelZero.cmake +++ b/cmake/FetchLevelZero.cmake @@ -3,146 +3,139 @@ # See LICENSE.TXT # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -set(UR_LEVEL_ZERO_LOADER_LIBRARY "" CACHE FILEPATH "Path of the Level Zero Loader library") -set(UR_LEVEL_ZERO_INCLUDE_DIR "" CACHE FILEPATH "Directory containing the Level Zero Headers") -set(UR_LEVEL_ZERO_LOADER_REPO "" CACHE STRING "Github repo to get the Level Zero loader sources from") -set(UR_LEVEL_ZERO_LOADER_TAG "" CACHE STRING " GIT tag of the Level Loader taken from github repo") -set(UR_COMPUTE_RUNTIME_REPO "" CACHE STRING "Github repo to get the compute runtime sources from") -set(UR_COMPUTE_RUNTIME_TAG "" CACHE STRING " GIT tag of the compute runtime taken from github repo") - -# If UR_COMPUTE_RUNTIME_FETCH_REPO is set to OFF, then UR_COMPUTE_RUNTIME_REPO should be defined and -# should point to the compute runtime repo. -set(UR_COMPUTE_RUNTIME_FETCH_REPO ON CACHE BOOL "Flag to indicate wheather to fetch the compute runtime repo") - -# Copy Level Zero loader/headers locally to the build to avoid leaking their path. -set(LEVEL_ZERO_COPY_DIR ${CMAKE_CURRENT_BINARY_DIR}/level_zero_loader) -if (NOT UR_LEVEL_ZERO_LOADER_LIBRARY STREQUAL "") - get_filename_component(LEVEL_ZERO_LIB_NAME "${UR_LEVEL_ZERO_LOADER_LIBRARY}" NAME) - set(LEVEL_ZERO_LIBRARY ${LEVEL_ZERO_COPY_DIR}/${LEVEL_ZERO_LIB_NAME}) - message(STATUS "Level Zero Adapter: Copying Level Zero loader to local build tree") - file(COPY ${UR_LEVEL_ZERO_LOADER_LIBRARY} DESTINATION ${LEVEL_ZERO_COPY_DIR} FOLLOW_SYMLINK_CHAIN) +if(TARGET LevelZeroLoader) + # We only need to run this once. + return() endif() -if (NOT UR_LEVEL_ZERO_INCLUDE_DIR STREQUAL "") - set(LEVEL_ZERO_INCLUDE_DIR ${LEVEL_ZERO_COPY_DIR}) - message(STATUS "Level Zero Adapter: Copying Level Zero headers to local build tree") - file(COPY ${UR_LEVEL_ZERO_INCLUDE_DIR}/ DESTINATION ${LEVEL_ZERO_COPY_DIR}) -endif() - -if (NOT DEFINED LEVEL_ZERO_LIBRARY OR NOT DEFINED LEVEL_ZERO_INCLUDE_DIR) - message(STATUS "Level Zero Adapter: Download Level Zero loader and headers from github.com") - - # Workaround warnings/errors for Level Zero build - set(CMAKE_CXX_FLAGS_BAK "${CMAKE_CXX_FLAGS}") - if (UNIX) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-but-set-variable") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-pedantic") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-stringop-truncation") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-parameter") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-c++98-compat-extra-semi") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-warning-option") - endif() - set(BUILD_STATIC ON) - if (UR_LEVEL_ZERO_LOADER_REPO STREQUAL "") - set(UR_LEVEL_ZERO_LOADER_REPO "https://github.com/oneapi-src/level-zero.git") - endif() - if (UR_LEVEL_ZERO_LOADER_TAG STREQUAL "") - set(UR_LEVEL_ZERO_LOADER_TAG 35c037cdf4aa9a2e6df34b6f1ce1bdc86ac5422f) - endif() - - # Disable due to a bug https://github.com/oneapi-src/level-zero/issues/104 - set(CMAKE_INCLUDE_CURRENT_DIR OFF) - # Prevent L0 loader from exporting extra symbols - set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS OFF) +find_package(PkgConfig QUIET) +# LevelZero doesn't install a CMake config target, just PkgConfig, +# so try using that to find the install and if it's not available +# just try to search for the path. +if(PkgConfig_FOUND) + pkg_check_modules(level-zero level-zero>=1.22.3) + if(level-zero_FOUND) + set(LEVEL_ZERO_INCLUDE_DIR "${level-zero_INCLUDEDIR}/level_zero") + set(LEVEL_ZERO_LIBRARY_SRC "${level-zero_LIBDIR}") + set(LEVEL_ZERO_LIB_NAME "${level-zero_LIBRARIES}") + message(STATUS "Level Zero Adapter: Using preinstalled level zero loader at ${level-zero_LINK_LIBRARIES}") + endif() +else() + set(L0_HEADER_PATH "loader/ze_loader.h") + find_path(L0_HEADER ${L0_HEADER_PATH} ${CMAKE_PREFIX_PATH} PATH_SUFFIXES "level_zero") + find_library(ZE_LOADER NAMES ze_loader HINTS /usr ${CMAKE_PREFIX_PATH}) + if(L0_HEADER AND ZE_LOADER) + set(LEVEL_ZERO_INCLUDE_DIR "${L0_HEADER}") + set(LEVEL_ZERO_LIBRARY "${ZE_LOADER}") + message(STATUS "Level Zero Adapter: Using preinstalled level zero loader at ${LEVEL_ZERO_LIBRARY}") + add_library(ze_loader INTERFACE) + endif() +endif() - set(CMAKE_MSVC_RUNTIME_LIBRARY_BAK "${CMAKE_MSVC_RUNTIME_LIBRARY}") - # UMF has not yet been able to build as static - set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>DLL") - message(STATUS "Level Zero Adapter: Will fetch Level Zero Loader from ${UR_LEVEL_ZERO_LOADER_REPO}") - include(FetchContent) - FetchContent_Declare(level-zero-loader - GIT_REPOSITORY ${UR_LEVEL_ZERO_LOADER_REPO} - GIT_TAG ${UR_LEVEL_ZERO_LOADER_TAG} +if(NOT LEVEL_ZERO_LIB_NAME AND NOT LEVEL_ZERO_LIBRARY) + message(STATUS "Level Zero Adapter: Download Level Zero loader and headers from github.com") + + # Workaround warnings/errors for Level Zero build + set(CMAKE_CXX_FLAGS_BAK "${CMAKE_CXX_FLAGS}") + if (UNIX) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-but-set-variable") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-pedantic") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-stringop-truncation") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-parameter") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-c++98-compat-extra-semi") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-warning-option") + endif() + set(BUILD_STATIC ON) + + set(UR_LEVEL_ZERO_LOADER_REPO "https://github.com/oneapi-src/level-zero.git") + # Remember to update the pkg_check_modules minimum version above when updating the + # clone tag + set(UR_LEVEL_ZERO_LOADER_TAG 35c037cdf4aa9a2e6df34b6f1ce1bdc86ac5422f) + + # Disable due to a bug https://github.com/oneapi-src/level-zero/issues/104 + set(CMAKE_INCLUDE_CURRENT_DIR OFF) + # Prevent L0 loader from exporting extra symbols + set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS OFF) + + set(CMAKE_MSVC_RUNTIME_LIBRARY_BAK "${CMAKE_MSVC_RUNTIME_LIBRARY}") + # UMF has not yet been able to build as static + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>DLL") + message(STATUS "Level Zero Adapter: Will fetch Level Zero Loader from ${UR_LEVEL_ZERO_LOADER_REPO}") + include(FetchContent) + FetchContent_Declare(level-zero-loader + GIT_REPOSITORY ${UR_LEVEL_ZERO_LOADER_REPO} + GIT_TAG ${UR_LEVEL_ZERO_LOADER_TAG} ) - if(MSVC) - set(USE_Z7 ON) - endif() - FetchContent_MakeAvailable(level-zero-loader) - FetchContent_GetProperties(level-zero-loader) - - # Restore original flags - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_BAK}") - set(CMAKE_MSVC_RUNTIME_LIBRARY "${CMAKE_MSVC_RUNTIME_LIBRARY_BAK}") - - target_compile_options(ze_loader PRIVATE - $<$,GNU;Clang;Intel;IntelLLVM>:-Wno-error> - $<$:/WX- /UUNICODE> + if(MSVC) + set(USE_Z7 ON) + endif() + FetchContent_MakeAvailable(level-zero-loader) + FetchContent_GetProperties(level-zero-loader) + + # Restore original flags + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_BAK}") + set(CMAKE_MSVC_RUNTIME_LIBRARY "${CMAKE_MSVC_RUNTIME_LIBRARY_BAK}") + set(LEVEL_ZERO_LIBRARY ze_loader) + set(LEVEL_ZERO_INCLUDE_DIR + ${level-zero-loader_SOURCE_DIR}/include CACHE PATH "Path to Level Zero Headers") + + set(LEVEL_ZERO_TARGET_INCLUDE_DIR "${CMAKE_INSTALL_INCLUDEDIR}") + + file(GLOB LEVEL_ZERO_LOADER_API_HEADERS "${LEVEL_ZERO_INCLUDE_DIR}/*.h") + file(COPY ${LEVEL_ZERO_LOADER_API_HEADERS} DESTINATION ${LEVEL_ZERO_INCLUDE_DIR}/level_zero) + + target_compile_options(ze_loader PRIVATE + $<$,GNU;Clang;Intel;IntelLLVM>:-Wno-error> + $<$:/WX- /UUNICODE> ) - - set(LEVEL_ZERO_LIBRARY ze_loader) - set(LEVEL_ZERO_INCLUDE_DIR - ${level-zero-loader_SOURCE_DIR}/include CACHE PATH "Path to Level Zero Headers") endif() add_library(LevelZeroLoader INTERFACE) # The MSVC linker does not like / at the start of a path, so to work around this # we split it into a link library and a library path, where the path is allowed # to have leading /. +if(NOT LEVEL_ZERO_LIBRARY_SRC OR NOT LEVEL_ZERO_LIB_NAME) get_filename_component(LEVEL_ZERO_LIBRARY_SRC "${LEVEL_ZERO_LIBRARY}" DIRECTORY) get_filename_component(LEVEL_ZERO_LIB_NAME "${LEVEL_ZERO_LIBRARY}" NAME) +endif() + +if(NOT LEVEL_ZERO_TARGET_INCLUDE_DIR) + set(LEVEL_ZERO_TARGET_INCLUDE_DIR ${LEVEL_ZERO_INCLUDE_DIR}) + endif() + target_link_directories(LevelZeroLoader INTERFACE "$" - "$" + "$" ) target_link_libraries(LevelZeroLoader INTERFACE "${LEVEL_ZERO_LIB_NAME}" ) -file(GLOB LEVEL_ZERO_LOADER_API_HEADERS "${LEVEL_ZERO_INCLUDE_DIR}/*.h") -file(COPY ${LEVEL_ZERO_LOADER_API_HEADERS} DESTINATION ${LEVEL_ZERO_INCLUDE_DIR}/level_zero) add_library(LevelZeroLoader-Headers INTERFACE) target_include_directories(LevelZeroLoader-Headers - INTERFACE "$" - "$" + INTERFACE "$" + "$" ) - find_path(L0_COMPUTE_RUNTIME_HEADERS NAMES "ze_intel_gpu.h" PATH_SUFFIXES "level_zero" ) -if(NOT UR_COMPUTE_RUNTIME_REPO AND L0_COMPUTE_RUNTIME_HEADERS) +if(L0_COMPUTE_RUNTIME_HEADERS) set(COMPUTE_RUNTIME_LEVEL_ZERO_INCLUDE "${L0_COMPUTE_RUNTIME_HEADERS}") set(COMPUTE_RUNTIME_REPO_PATH "${L0_COMPUTE_RUNTIME_HEADERS}") -elseif (UR_COMPUTE_RUNTIME_FETCH_REPO) - # Fetch only if UR_COMPUTE_RUNTIME_FETCH_REPO is set to ON. - if (UR_COMPUTE_RUNTIME_REPO STREQUAL "") - set(UR_COMPUTE_RUNTIME_REPO "https://github.com/intel/compute-runtime.git") - endif() - if (UR_COMPUTE_RUNTIME_TAG STREQUAL "") - set(UR_COMPUTE_RUNTIME_TAG 25.05.32567.17) - endif() +else() + set(UR_COMPUTE_RUNTIME_REPO "https://github.com/intel/compute-runtime.git") + set(UR_COMPUTE_RUNTIME_TAG 25.05.32567.17) include(FetchContent) # Sparse fetch only the dir with level zero headers for experimental features to avoid pulling in the entire compute-runtime. FetchContentSparse_Declare(exp-headers ${UR_COMPUTE_RUNTIME_REPO} "${UR_COMPUTE_RUNTIME_TAG}" "level_zero/include") FetchContent_GetProperties(exp-headers) if(NOT exp-headers_POPULATED) - FetchContent_Populate(exp-headers) + FetchContent_Populate(exp-headers) endif() - set(COMPUTE_RUNTIME_LEVEL_ZERO_INCLUDE "${exp-headers_SOURCE_DIR}") set(COMPUTE_RUNTIME_REPO_PATH "${exp-headers_SOURCE_DIR}/../..") - -# When UR_COMPUTE_RUNTIME_FETCH_REPO is OFF, use UR_COMPUTE_RUNTIME_REPO as repo. -else() - - # Check if UR_COMPUTE_RUNTIME_REPO is set. Throw if not. - if (UR_COMPUTE_RUNTIME_REPO STREQUAL "") - message(FATAL_ERROR "UR_COMPUTE_RUNTIME_FETCH_REPO is set to OFF but UR_COMPUTE_RUNTIME_REPO is not set. Please set it to the compute runtime repo.") - endif() - - set(COMPUTE_RUNTIME_LEVEL_ZERO_INCLUDE "${UR_COMPUTE_RUNTIME_REPO}/level_zero/include") - set(COMPUTE_RUNTIME_REPO_PATH "${UR_COMPUTE_RUNTIME_REPO}") endif() message(STATUS "Using Level Zero include headers from ${COMPUTE_RUNTIME_LEVEL_ZERO_INCLUDE}") @@ -152,5 +145,7 @@ message(STATUS "Level Zero Adapter: Using Level Zero headers from ${COMPUTE_RUNT target_include_directories(ComputeRuntimeLevelZero-Headers INTERFACE "$" "$" - "$" + "$" ) + +set(LEVEL_ZERO_INCLUDE_DIR "${LEVEL_ZERO_INCLUDE_DIR}" CACHE PATH INTERNAL) diff --git a/source/adapters/level_zero/CMakeLists.txt b/source/adapters/level_zero/CMakeLists.txt index 8130322cf3..4edccc79d2 100644 --- a/source/adapters/level_zero/CMakeLists.txt +++ b/source/adapters/level_zero/CMakeLists.txt @@ -64,11 +64,14 @@ if(UR_BUILD_ADAPTER_L0) target_compile_definitions(ur_adapter_level_zero PUBLIC UR_STATIC_LEVEL_ZERO) if(UR_STATIC_ADAPTER_L0) target_compile_definitions(ur_adapter_level_zero PUBLIC UR_STATIC_ADAPTER_LEVEL_ZERO) - + set(ADAPTER_L0_TARGETS_TO_INSTALL ur_umf LevelZeroLoader LevelZeroLoader-Headers ComputeRuntimeLevelZero-Headers) # 'utils' target from 'level-zero-loader' includes path which is prefixed # in the source directory, this breaks the installation of 'utils' target. - set_target_properties(level_zero_utils PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "") - install(TARGETS ur_umf LevelZeroLoader LevelZeroLoader-Headers ComputeRuntimeLevelZero-Headers ze_loader level_zero_utils + if(TARGET level_zero_utils) + set_target_properties(level_zero_utils PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "") + list(APPEND ADAPTER_L0_TARGETS_TO_INSTALL level_zero_utils) + endif() + install(TARGETS ${ADAPTER_L0_TARGETS_TO_INSTALL} EXPORT ${PROJECT_NAME}-targets ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} diff --git a/source/adapters/level_zero/v2/context.cpp b/source/adapters/level_zero/v2/context.cpp index b96e05e9d3..3d2a7758d6 100644 --- a/source/adapters/level_zero/v2/context.cpp +++ b/source/adapters/level_zero/v2/context.cpp @@ -35,11 +35,28 @@ filterP2PDevices(ur_device_handle_t hSourceDevice, } static std::vector> -populateP2PDevices(size_t maxDevices, - const std::vector &devices) { - std::vector> p2pDevices(maxDevices); +populateP2PDevices(const std::vector &devices) { + std::vector allDevices; + std::function collectDeviceAndSubdevices = + [&allDevices, &collectDeviceAndSubdevices](ur_device_handle_t device) { + allDevices.push_back(device); + for (auto &subDevice : device->SubDevices) { + collectDeviceAndSubdevices(subDevice); + } + }; + for (auto &device : devices) { - p2pDevices[device->Id.value()] = filterP2PDevices(device, devices); + collectDeviceAndSubdevices(device); + } + + uint64_t maxDeviceId = 0; + for (auto &device : allDevices) { + maxDeviceId = std::max(maxDeviceId, device->Id.value()); + } + + std::vector> p2pDevices(maxDeviceId + 1); + for (auto &device : allDevices) { + p2pDevices[device->Id.value()] = filterP2PDevices(device, allDevices); } return p2pDevices; } @@ -83,8 +100,7 @@ ur_context_handle_t_::ur_context_handle_t_(ze_context_handle_t hContext, nativeEventsPool(this, std::make_unique( this, v2::QUEUE_IMMEDIATE, v2::EVENT_FLAGS_PROFILING_ENABLED)), - p2pAccessDevices(populateP2PDevices( - phDevices[0]->Platform->getNumDevices(), this->hDevices)), + p2pAccessDevices(populateP2PDevices(this->hDevices)), defaultUSMPool(this, nullptr), asyncPool(this, nullptr) {} ur_result_t ur_context_handle_t_::retain() {