From 58f2e3da9f503aa0fe416b190818bbdb234710ab Mon Sep 17 00:00:00 2001 From: Nikita Grigorian Date: Thu, 6 Aug 2026 18:44:30 -0700 Subject: [PATCH 1/3] Update OpenCL loader search --- libsyclinterface/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libsyclinterface/CMakeLists.txt b/libsyclinterface/CMakeLists.txt index 10ee68675f..031ef7064f 100644 --- a/libsyclinterface/CMakeLists.txt +++ b/libsyclinterface/CMakeLists.txt @@ -91,14 +91,14 @@ if(DPCTL_ENABLE_L0_PROGRAM_CREATION) endif() if (UNIX) - find_library(PI_OPENCL_LIB - NAMES pi_opencl ur_adapter_opencl + find_library(OPENCL_LIB + NAMES ur_adapter_opencl OpenCL HINTS ${IntelSyclCompiler_LIBRARY_DIR} ) find_program(READELF_PROG readelf) find_program(GREP_PROG grep) execute_process( - COMMAND ${READELF_PROG} -d ${PI_OPENCL_LIB} + COMMAND ${READELF_PROG} -d ${OPENCL_LIB} COMMAND ${GREP_PROG} OpenCL COMMAND ${GREP_PROG} -Po "libOpenCL[^\]]*" OUTPUT_VARIABLE LIBCL_LOADER_FILENAME From 6b1990d88a6710d2c0fbdb9152621693a8df461c Mon Sep 17 00:00:00 2001 From: Nikita Grigorian Date: Thu, 6 Aug 2026 23:45:24 -0700 Subject: [PATCH 2/3] Use default OCL ICD loader filename Also update Level Zero and OCL loader logic further --- libsyclinterface/CMakeLists.txt | 72 ++++++++++++++++++++------------- 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/libsyclinterface/CMakeLists.txt b/libsyclinterface/CMakeLists.txt index 031ef7064f..e71080602a 100644 --- a/libsyclinterface/CMakeLists.txt +++ b/libsyclinterface/CMakeLists.txt @@ -48,6 +48,10 @@ set(LIBZE_SET_LOADER_FILENAME "" CACHE STRING "User-provided Level Zero Loader f set(LIBZE_DEFAULT_LOADER_FILENAME "libze_loader.so.1" CACHE STRING "Default Level Zero Loader filename") +set(LIBCL_SET_LOADER_FILENAME "" CACHE STRING "User-provided OpenCL ICD Loader filename") + +set(LIBCL_DEFAULT_LOADER_FILENAME "libOpenCL.so.1" CACHE STRING "Default OpenCL ICD Loader filename") + # Minimum version requirement only when oneAPI dpcpp is used. if(DPCTL_DPCPP_FROM_ONEAPI) find_package(IntelSyclCompiler 2021.3.0 REQUIRED) @@ -65,21 +69,24 @@ if(DPCTL_ENABLE_L0_PROGRAM_CREATION) endif() if (UNIX) if ("x${LIBZE_SET_LOADER_FILENAME}" STREQUAL "x") - find_library(PI_LEVEL_ZERO_LIB - NAMES pi_level_zero ur_adapter_level_zero + find_library(LEVEL_ZERO_LIB + NAMES ur_adapter_level_zero HINTS ${IntelSyclCompiler_LIBRARY_DIR} ) - find_program(READELF_PROG readelf) - find_program(GREP_PROG grep) - execute_process( - COMMAND ${READELF_PROG} -d ${PI_LEVEL_ZERO_LIB} - COMMAND ${GREP_PROG} libze_loader - COMMAND ${GREP_PROG} -Po "libze_loader[^\]]*" - OUTPUT_VARIABLE LIBZE_LOADER_FILENAME - OUTPUT_STRIP_TRAILING_WHITESPACE - ERROR_STRIP_TRAILING_WHITESPACE - ) - # if libze_loader is statically linked, LIBZE_LOADER_FILENAME will be an empty string + if (LEVEL_ZERO_LIB) + find_program(READELF_PROG readelf) + find_program(GREP_PROG grep) + execute_process( + COMMAND ${READELF_PROG} -d ${LEVEL_ZERO_LIB} + COMMAND ${GREP_PROG} libze_loader + COMMAND ${GREP_PROG} -Po "libze_loader[^\]]*" + OUTPUT_VARIABLE LIBZE_LOADER_FILENAME + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + endif() + # empty if the adapter was not found or if it links the Level Zero + # loader statically if ("x${LIBZE_LOADER_FILENAME}" STREQUAL "x") set(LIBZE_LOADER_FILENAME ${LIBZE_DEFAULT_LOADER_FILENAME}) endif() @@ -91,20 +98,31 @@ if(DPCTL_ENABLE_L0_PROGRAM_CREATION) endif() if (UNIX) - find_library(OPENCL_LIB - NAMES ur_adapter_opencl OpenCL - HINTS ${IntelSyclCompiler_LIBRARY_DIR} - ) - find_program(READELF_PROG readelf) - find_program(GREP_PROG grep) - execute_process( - COMMAND ${READELF_PROG} -d ${OPENCL_LIB} - COMMAND ${GREP_PROG} OpenCL - COMMAND ${GREP_PROG} -Po "libOpenCL[^\]]*" - OUTPUT_VARIABLE LIBCL_LOADER_FILENAME - OUTPUT_STRIP_TRAILING_WHITESPACE - ERROR_STRIP_TRAILING_WHITESPACE - ) + if ("x${LIBCL_SET_LOADER_FILENAME}" STREQUAL "x") + find_library(OPENCL_LIB + NAMES ur_adapter_opencl OpenCL + HINTS ${IntelSyclCompiler_LIBRARY_DIR} + ) + if (OPENCL_LIB) + find_program(READELF_PROG readelf) + find_program(GREP_PROG grep) + execute_process( + COMMAND ${READELF_PROG} -d ${OPENCL_LIB} + COMMAND ${GREP_PROG} OpenCL + COMMAND ${GREP_PROG} -Po "libOpenCL[^\]]*" + OUTPUT_VARIABLE LIBCL_LOADER_FILENAME + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + endif() + # Empty if the adapter was not found or if it links the ICD loader + # statically + if ("x${LIBCL_LOADER_FILENAME}" STREQUAL "x") + set(LIBCL_LOADER_FILENAME ${LIBCL_DEFAULT_LOADER_FILENAME}) + endif() + else () + set(LIBCL_LOADER_FILENAME ${LIBCL_SET_LOADER_FILENAME}) + endif() set(LIBCL_LOADER_FILENAME ${LIBCL_LOADER_FILENAME} PARENT_SCOPE) endif() From 6291348cb5637a2b0fc7c3d38a5fa450be3df1a6 Mon Sep 17 00:00:00 2001 From: Nikita Grigorian Date: Thu, 6 Aug 2026 23:50:33 -0700 Subject: [PATCH 3/3] Document Level-Zero and OCL behavior in nightly builds --- .../contributor_guides/building.rst | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/docs/doc_sources/contributor_guides/building.rst b/docs/doc_sources/contributor_guides/building.rst index df2a8c35b2..adb0dbd83a 100644 --- a/docs/doc_sources/contributor_guides/building.rst +++ b/docs/doc_sources/contributor_guides/building.rst @@ -186,6 +186,30 @@ You can retrieve available options and their descriptions using the option :code:`--help`. +Runtime loaders when using a nightly DPC++ build +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:py:mod:`dpctl` creates kernel bundles from OpenCL* source and from SPIR-V by +calling into the OpenCL ICD loader and the Level Zero loader directly. + +The oneAPI DPC++ Compiler installation and the conda packages provide these +loaders as dependencies. Nightly builds of the open source DPC++ toolchain, +however, bundle neither, so they must be installed separately: + +- ``libOpenCL.so.1``, from the OpenCL ICD loader (for example, ``ocl-icd`` + conda package or ``ocl-icd-libopencl1`` system package) +- ``libze_loader.so.1``, from the Level Zero loader (for example, the + ``level-zero`` conda package or the ``libze1`` system package) + +Both can be installed from the toolchain's own dependencies. The DPC++ toolchain +pins them in `devops/dependencies.json `_, +as the ``level_zero`` and ``oclcpu`` entries. + +Should a loader be installed under a different file name, override the name that +:py:mod:`dpctl` uses with the ``LIBCL_SET_LOADER_FILENAME`` and +``LIBZE_SET_LOADER_FILENAME`` CMake variables. + + Building the libsyclinterface Library =======================================