From f31927f158d3ffea0205c5efbf8a821b87824b64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20=C5=9Awi=C4=99cicki?= Date: Wed, 13 Aug 2025 14:34:53 +0200 Subject: [PATCH 1/3] Include subdevices when populating p2p access devices (#19772) --- source/adapters/level_zero/v2/context.cpp | 28 ++++++++++++++++++----- 1 file changed, 22 insertions(+), 6 deletions(-) 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() { From 0990c2058ef0c87fb07c8ea111ec4e520ce36f99 Mon Sep 17 00:00:00 2001 From: Nick Sarnie Date: Wed, 13 Aug 2025 21:39:48 +0000 Subject: [PATCH 2/3] Improve support for pre-installed Level Zero and simplify (#19763) First, try finding preinstalled Level Zero using pkg-config first If that fails, try to find include/header dirs on the OS And if those both fail, fetch from github (both headers and loader). No need for variables to set the repo and commit to clone, it's highly unlikely anyone will do this and if they want to they can use the existing CMake FetchContent override infrastructure. I also removed a variable about whether to use fetchcontent or not. We should just do what everyone expects by default, try to find it on the system and if we do use it, otherwise fallback to fetching it. This was requested by NixOS developers, see the below issue. https://github.com/intel/llvm/issues/19635 Signed-off-by: Sarnie, Nick --- cmake/FetchLevelZero.cmake | 201 +++++++++++----------- source/adapters/level_zero/CMakeLists.txt | 9 +- 2 files changed, 104 insertions(+), 106 deletions(-) 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} From 3bd57a2a8644daf484435ca9296e81410355d3ed Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 14 Aug 2025 00:41:54 +0000 Subject: [PATCH 3/3] Update intel/llvm mirror base commit to 8959a5e5 --- .github/intel-llvm-mirror-base-commit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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