Skip to content

[SYCL][UR] Improve support for preinstalled OpenCL deps #19649

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: sycl
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 2 additions & 61 deletions opencl/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,71 +11,12 @@ if (MSVC)
)
endif()

# Repo URLs

set(OCL_HEADERS_REPO
"https://github.com/KhronosGroup/OpenCL-Headers.git")
set(OCL_LOADER_REPO
"https://github.com/KhronosGroup/OpenCL-ICD-Loader.git")

# Repo tags/hashes

set(OCL_HEADERS_TAG 6eabe90aa7b6cff9c67800a2fe25a0cd88d8b749)
set(OCL_LOADER_TAG ddf6c70230a79cdb8fcccfd3c775b09e6820f42e)

# OpenCL Headers
if(NOT OpenCL_HEADERS)
message(STATUS "Will fetch OpenCL headers from ${OCL_HEADERS_REPO}")

FetchContent_Declare(ocl-headers
GIT_REPOSITORY ${OCL_HEADERS_REPO}
GIT_TAG ${OCL_HEADERS_TAG}
)
else()
message(STATUS "OpenCL headers are added manually ${OpenCL_HEADERS}")

FetchContent_Declare(ocl-headers
URL ${OpenCL_HEADERS}
)
endif()

FetchContent_MakeAvailable(ocl-headers)
FetchContent_GetProperties(ocl-headers)
set(OpenCL_INCLUDE_DIR
${ocl-headers_SOURCE_DIR} CACHE PATH "Path to OpenCL Headers")

target_compile_definitions(Headers INTERFACE -DCL_TARGET_OPENCL_VERSION=300)
add_library(OpenCL-Headers ALIAS Headers)

# OpenCL Library (ICD Loader)

# Set OPENCL_ICD_LOADER_HEADERS_DIR, as prerequisite for ICD build
set(OPENCL_ICD_LOADER_HEADERS_DIR
${OpenCL_INCLUDE_DIR} CACHE PATH "Path to OpenCL Headers")

# LLVM build sets this OFF by default, but we need OpenCL to be built as shared
# library.
set(BUILD_SHARED_LIBS ON)

if(NOT OpenCL_LIBRARY_SRC)
message(STATUS "Will fetch OpenCL ICD Loader from ${OCL_LOADER_REPO}")

FetchContent_Declare(ocl-icd
GIT_REPOSITORY ${OCL_LOADER_REPO}
GIT_TAG ${OCL_LOADER_TAG}
)
else()
# TODO: add possibility to use prebuilt OpenCL library rather than building
# together with llvm.
message(STATUS
"OpenCL ICD Loader sources added manually ${OpenCL_LIBRARY_SRC}")

FetchContent_Declare(ocl-icd
URL ${OpenCL_LIBRARY_SRC}
)
endif()
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/../unified-runtime/cmake")

FetchContent_MakeAvailable(ocl-icd)
add_library(OpenCL-ICD ALIAS OpenCL)
include(FetchOpenCL)

add_subdirectory(opencl-aot)
2 changes: 1 addition & 1 deletion opencl/opencl-aot/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,4 @@ endif()
target_link_libraries(${OPENCL_AOT_PROJECT_NAME}
PRIVATE
OpenCL-Headers
OpenCL-ICD)
${OpenCL_LIBRARY})
22 changes: 12 additions & 10 deletions sycl/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -145,20 +145,22 @@ set(SYCL_INCLUDE_DIR "include")
set(SYCL_INCLUDE_BUILD_DIR ${LLVM_BINARY_DIR}/${SYCL_INCLUDE_DIR})

add_llvm_external_project(opencl)
list(FIND LLVM_ENABLE_PROJECTS opencl OPENCL_FOUND)
if(OPENCL_FOUND EQUAL -1)
list(FIND LLVM_ENABLE_PROJECTS opencl OPENCL_PROJ_FOUND)
if(OPENCL_PROJ_FOUND EQUAL -1)
message(FATAL_ERROR "opencl external project required but not found.")
endif()

# Copy OpenCL Headers into sycl headers build directory
# Compiler does automatic lookup bin/../include based on clang binary location,
# e.g. when run LIT tests
file(COPY ${OpenCL_INCLUDE_DIR}/CL DESTINATION ${SYCL_INCLUDE_BUILD_DIR})
if(NOT OpenCL_FOUND)
# Copy OpenCL Headers into sycl headers build directory
# Compiler does automatic lookup bin/../include based on clang binary location,
# e.g. when run LIT tests
file(COPY ${OpenCL_INCLUDE_DIR}/CL DESTINATION ${SYCL_INCLUDE_BUILD_DIR})

# Include OpenCL Headers into final bundle.
install(DIRECTORY ${OpenCL_INCLUDE_DIR}/CL
DESTINATION ${SYCL_INCLUDE_DIR}
COMPONENT OpenCL-Headers)
# Include OpenCL Headers into final bundle.
install(DIRECTORY ${OpenCL_INCLUDE_DIR}/CL
DESTINATION ${SYCL_INCLUDE_DIR}
COMPONENT OpenCL-Headers)
endif()

# Option for enabling building the SYCL major release preview library.
option(SYCL_ENABLE_MAJOR_RELEASE_PREVIEW_LIB "Enable build of the SYCL major release preview library" ON)
Expand Down
2 changes: 0 additions & 2 deletions sycl/cmake/modules/FetchUnifiedRuntime.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,6 @@ if("hip" IN_LIST SYCL_ENABLE_BACKENDS)
endif()
if("opencl" IN_LIST SYCL_ENABLE_BACKENDS)
set(UR_BUILD_ADAPTER_OPENCL ON)
set(UR_OPENCL_ICD_LOADER_LIBRARY OpenCL-ICD CACHE FILEPATH
"Path of the OpenCL ICD Loader library" FORCE)
endif()
if("native_cpu" IN_LIST SYCL_ENABLE_BACKENDS)
set(UR_BUILD_ADAPTER_NATIVE_CPU ON)
Expand Down
4 changes: 1 addition & 3 deletions sycl/tools/sycl-prof/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@ target_compile_options(sycl-prof PRIVATE -fno-exceptions -fno-rtti)
add_library(sycl_profiler_collector SHARED collector.cpp)
target_compile_definitions(sycl_profiler_collector PRIVATE XPTI_CALLBACK_API_EXPORTS)
target_link_libraries(sycl_profiler_collector PRIVATE xptifw)
if (TARGET OpenCL-Headers)
target_link_libraries(sycl_profiler_collector PRIVATE OpenCL-Headers)
endif()
target_link_libraries(sycl_profiler_collector PRIVATE OpenCL-Headers)
target_include_directories(sycl_profiler_collector PRIVATE
"${sycl_inc_dir}"
"${sycl_src_dir}"
Expand Down
4 changes: 1 addition & 3 deletions sycl/tools/sycl-sanitize/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,7 @@ add_library(sycl_sanitizer_collector SHARED collector.cpp)
target_compile_definitions(sycl_sanitizer_collector PRIVATE XPTI_CALLBACK_API_EXPORTS)
target_link_libraries(sycl_sanitizer_collector PRIVATE xptifw)
target_link_libraries(sycl_sanitizer_collector PRIVATE UnifiedRuntime-Headers)
if (TARGET OpenCL-Headers)
target_link_libraries(sycl_sanitizer_collector PRIVATE OpenCL-Headers)
endif()
target_link_libraries(sycl_sanitizer_collector PRIVATE OpenCL-Headers)

target_include_directories(sycl_sanitizer_collector PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/../xpti_helpers/"
Expand Down
4 changes: 1 addition & 3 deletions sycl/tools/sycl-trace/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,7 @@ endif()

target_compile_definitions(sycl_ur_trace_collector PRIVATE XPTI_CALLBACK_API_EXPORTS)
target_link_libraries(sycl_ur_trace_collector PRIVATE xptifw)
if (TARGET OpenCL-Headers)
target_link_libraries(sycl_ur_trace_collector PRIVATE OpenCL-Headers)
endif()
target_link_libraries(sycl_ur_trace_collector PRIVATE OpenCL-Headers)
target_link_libraries(sycl_ur_trace_collector PRIVATE UnifiedRuntime-Headers)

target_include_directories(sycl_ur_trace_collector PRIVATE
Expand Down
91 changes: 91 additions & 0 deletions unified-runtime/cmake/FetchOpenCL.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
# Finds or fetches OpenCL Headers and the ICD loader.
if(TARGET OpenCL-Headers)
return()
endif()

# Repo URLs

set(OCL_HEADERS_REPO
"https://github.com/KhronosGroup/OpenCL-Headers.git")
set(OCL_LOADER_REPO
"https://github.com/KhronosGroup/OpenCL-ICD-Loader.git")

# Repo tags/hashes

set(OCL_HEADERS_TAG 6eabe90aa7b6cff9c67800a2fe25a0cd88d8b749)
set(OCL_LOADER_TAG ddf6c70230a79cdb8fcccfd3c775b09e6820f42e)

find_package(OpenCL 3.0 QUIET)
if(OpenCL_FOUND)
# The OpenCL-Headers CMake files don't provide granular info
# on what is and isn't supposed, just the overall OpenCL version.
# The current tag we are using happens to define an extension, so just check
# if that extension exists to make sure the system install is not
# too old.
set(OPENCL_TEST_PROGRAM "#define CL_TARGET_OPENCL_VERSION 300
#include <CL/cl_ext.h>
#ifndef cl_khr_spirv_queries
#error Unsupported header version
#endif
int main(int, char*[]) { return 0; }"
)
include(CheckCXXSourceCompiles)
set(CMAKE_REQUIRED_INCLUDES ${OpenCL_INCLUDE_DIRS})
set(CMAKE_REQUIRED_LIBRARIES ${OPENCL_Library})
check_cxx_source_compiles("${OPENCL_TEST_PROGRAM}" OPENCL_HEADERS_VERSION_SUPPORTED)
if(NOT OPENCL_HEADERS_VERSION_SUPPORTED)
message(WARNING "Preinstalled OpenCL-Headers are not supported, "
"use commit ${OCL_HEADERS_TAG} or later. Will fetch OpenCL.")
set(OpenCL_FOUND FALSE CACHE BOOL "" FORCE)
endif()
endif()

# Ideally we could use the FIND_PACKAGE_ARGS argument to FetchContent_Declare to avoid
# the conditonals, but that was added in CMake 3.24 and the current minimum we require is
# 3.20.

# OpenCL Headers
if(NOT OpenCL_FOUND)
FetchContent_GetProperties(ocl-headers)

if(NOT ocl-headers_POPULATED)
message(STATUS "Will fetch OpenCL headers from ${OCL_HEADERS_REPO}")
FetchContent_Declare(ocl-headers
GIT_REPOSITORY ${OCL_HEADERS_REPO}
GIT_TAG ${OCL_HEADERS_TAG}
)
FetchContent_MakeAvailable(ocl-headers)
endif()
set(OpenCL_INCLUDE_DIR ${ocl-headers_SOURCE_DIR} CACHE PATH "" FORCE)

else()
message(STATUS "Using OpenCL headers at ${OpenCL_INCLUDE_DIR}")
endif()

# OpenCL Library (ICD Loader)

set(BUILD_SHARED_LIBS ON)

if(NOT OpenCL_FOUND)

FetchContent_GetProperties(ocl-icd)
if(NOT ocl-icd_POPULATED)
message(STATUS "Will fetch OpenCL ICD Loader from ${OCL_LOADER_REPO}")
FetchContent_Declare(ocl-icd
GIT_REPOSITORY ${OCL_LOADER_REPO}
GIT_TAG ${OCL_LOADER_TAG}
)

FetchContent_MakeAvailable(ocl-icd)
endif()
set(OpenCL_LIBRARY OpenCL::OpenCL CACHE PATH "" FORCE)
else()
message(STATUS
"Using OpenCL ICD Loader at ${OpenCL_LIBRARY}")
endif()

add_library(OpenCL-Headers INTERFACE)
target_include_directories(OpenCL-Headers INTERFACE ${OpenCL_INCLUDE_DIR})
target_compile_definitions(OpenCL-Headers INTERFACE -DCL_TARGET_OPENCL_VERSION=300 -DCL_USE_DEPRECATED_OPENCL_1_2_APIS=1)

set(OpenCL_FOUND ${OpenCL_FOUND} CACHE BOOL INTERNAL)
53 changes: 7 additions & 46 deletions unified-runtime/source/adapters/opencl/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@

set(OPENCL_DIR "${CMAKE_CURRENT_SOURCE_DIR}" CACHE PATH "OpenCL adapter directory")

set(UR_OPENCL_INCLUDE_DIR "" CACHE PATH "Directory containing the OpenCL Headers")
set(UR_OPENCL_ICD_LOADER_LIBRARY "" CACHE FILEPATH "Path of the OpenCL ICD Loader library")
include(FetchOpenCL)

find_package(Threads REQUIRED)

Expand Down Expand Up @@ -53,52 +52,13 @@ set_target_properties(${TARGET_NAME} PROPERTIES
SOVERSION "${PROJECT_VERSION_MAJOR}"
)

if(UR_OPENCL_INCLUDE_DIR)
set(OpenCLIncludeDirectory ${UR_OPENCL_INCLUDE_DIR})
else()
FetchContent_Declare(OpenCL-Headers
GIT_REPOSITORY "https://github.com/KhronosGroup/OpenCL-Headers.git"
GIT_TAG 6eabe90aa7b6cff9c67800a2fe25a0cd88d8b749
)
FetchContent_MakeAvailable(OpenCL-Headers)
FetchContent_GetProperties(OpenCL-Headers
SOURCE_DIR OpenCLIncludeDirectory
)
# https://github.com/intel/llvm/issues/19648
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND LLVM_ENABLE_PEDANTIC)
target_compile_options(ur_adapter_opencl PRIVATE -std=gnu++17)
endif()

# The OpenCL target can be set manually on upstream cmake to avoid using
# find_package().
if(UR_OPENCL_ICD_LOADER_LIBRARY)
set(OpenCLICDLoaderLibrary ${UR_OPENCL_ICD_LOADER_LIBRARY})
else()
find_package(OpenCL 3.0)
if(NOT OpenCL_FOUND)
FetchContent_Declare(OpenCL-ICD-Loader
GIT_REPOSITORY "https://github.com/KhronosGroup/OpenCL-ICD-Loader.git"
GIT_TAG main
)
FetchContent_MakeAvailable(OpenCL-ICD-Loader)
endif()
set(OpenCLICDLoaderLibrary OpenCL::OpenCL)
endif()

# Make interface library use within the project.
add_library(OpenCLICDLoader INTERFACE)
target_link_libraries(OpenCLICDLoader INTERFACE "${OpenCLICDLoaderLibrary}")
target_include_directories(OpenCLICDLoader INTERFACE ${OpenCLIncludeDirectory})

message(STATUS "OpenCL Include Directory: ${OpenCLIncludeDirectory}")
message(STATUS "OpenCL ICD Loader Library: ${OpenCLICDLoaderLibrary}")

# Suppress a compiler message about undefined CL_TARGET_OPENCL_VERSION.
# Define all symbols up to OpenCL 3.0.
target_compile_definitions(ur_adapter_opencl PRIVATE
CL_TARGET_OPENCL_VERSION=300
CL_USE_DEPRECATED_OPENCL_1_2_APIS
)

target_include_directories(${TARGET_NAME} PRIVATE
${OpenCLIncludeDirectory}
${OpenCL_INCLUDE_DIRECTORY}
"${CMAKE_CURRENT_SOURCE_DIR}/../../"
)

Expand All @@ -107,5 +67,6 @@ target_link_libraries(${TARGET_NAME} PRIVATE
${PROJECT_NAME}::common
${PROJECT_NAME}::umf
Threads::Threads
${OpenCLICDLoaderLibrary}
OpenCL-Headers
${OpenCL_LIBRARY}
)
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,5 @@ endif()

if (UR_BUILD_ADAPTER_OPENCL)
target_sources(exp_command_buffer-test PRIVATE "append_native_opencl.cpp")
target_compile_definitions(exp_command_buffer-test PRIVATE CL_TARGET_OPENCL_VERSION=300)
target_link_libraries(exp_command_buffer-test PRIVATE OpenCLICDLoader)
target_link_libraries(exp_command_buffer-test PRIVATE ${OpenCL_LIBRARY} OpenCL-Headers)
endif()
Loading