Skip to content

Commit 10af536

Browse files
authored
[SYCL][UR] Improve support for preinstalled OpenCL deps (#19649)
Unify OpenCL detection logic to improve packaging for Linux distros. Right now two different projects, `opencl-aot` and the UR OCL plugin depend on OpenCL (both the headers and the ICD loader) They both have their own detection logic and CMake variables to use a preinstalled version. Move the detection logic to using the standard `find_package` and unify the logic. There are now no CMake variables to specify the repo, commit or install directory. If `find_package` fails because the install is in a weird location, the user should add the path to `CMAKE_MODULE_PATH`. The user can use `FETCHCONTENT_SOURCE_DIR_ocl-headers` or `FETCHCONTENT_SOURCE_DIR_ocl-icd` if they really want a custom repo location without it being installed on the system. Improvement of our OpenCL handling was directly requested by NixOS developers, see below issue. Issue: #19635 --------- Signed-off-by: Sarnie, Nick <[email protected]>
1 parent 8850b4e commit 10af536

File tree

11 files changed

+114
-132
lines changed

11 files changed

+114
-132
lines changed

opencl/CMakeLists.txt

Lines changed: 2 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -11,71 +11,12 @@ if (MSVC)
1111
)
1212
endif()
1313

14-
# Repo URLs
15-
16-
set(OCL_HEADERS_REPO
17-
"https://github.com/KhronosGroup/OpenCL-Headers.git")
18-
set(OCL_LOADER_REPO
19-
"https://github.com/KhronosGroup/OpenCL-ICD-Loader.git")
20-
21-
# Repo tags/hashes
22-
23-
set(OCL_HEADERS_TAG 6eabe90aa7b6cff9c67800a2fe25a0cd88d8b749)
24-
set(OCL_LOADER_TAG ddf6c70230a79cdb8fcccfd3c775b09e6820f42e)
25-
26-
# OpenCL Headers
27-
if(NOT OpenCL_HEADERS)
28-
message(STATUS "Will fetch OpenCL headers from ${OCL_HEADERS_REPO}")
29-
30-
FetchContent_Declare(ocl-headers
31-
GIT_REPOSITORY ${OCL_HEADERS_REPO}
32-
GIT_TAG ${OCL_HEADERS_TAG}
33-
)
34-
else()
35-
message(STATUS "OpenCL headers are added manually ${OpenCL_HEADERS}")
36-
37-
FetchContent_Declare(ocl-headers
38-
URL ${OpenCL_HEADERS}
39-
)
40-
endif()
41-
42-
FetchContent_MakeAvailable(ocl-headers)
43-
FetchContent_GetProperties(ocl-headers)
44-
set(OpenCL_INCLUDE_DIR
45-
${ocl-headers_SOURCE_DIR} CACHE PATH "Path to OpenCL Headers")
46-
47-
target_compile_definitions(Headers INTERFACE -DCL_TARGET_OPENCL_VERSION=300)
48-
add_library(OpenCL-Headers ALIAS Headers)
49-
50-
# OpenCL Library (ICD Loader)
51-
52-
# Set OPENCL_ICD_LOADER_HEADERS_DIR, as prerequisite for ICD build
53-
set(OPENCL_ICD_LOADER_HEADERS_DIR
54-
${OpenCL_INCLUDE_DIR} CACHE PATH "Path to OpenCL Headers")
55-
5614
# LLVM build sets this OFF by default, but we need OpenCL to be built as shared
5715
# library.
5816
set(BUILD_SHARED_LIBS ON)
5917

60-
if(NOT OpenCL_LIBRARY_SRC)
61-
message(STATUS "Will fetch OpenCL ICD Loader from ${OCL_LOADER_REPO}")
62-
63-
FetchContent_Declare(ocl-icd
64-
GIT_REPOSITORY ${OCL_LOADER_REPO}
65-
GIT_TAG ${OCL_LOADER_TAG}
66-
)
67-
else()
68-
# TODO: add possibility to use prebuilt OpenCL library rather than building
69-
# together with llvm.
70-
message(STATUS
71-
"OpenCL ICD Loader sources added manually ${OpenCL_LIBRARY_SRC}")
72-
73-
FetchContent_Declare(ocl-icd
74-
URL ${OpenCL_LIBRARY_SRC}
75-
)
76-
endif()
18+
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/../unified-runtime/cmake")
7719

78-
FetchContent_MakeAvailable(ocl-icd)
79-
add_library(OpenCL-ICD ALIAS OpenCL)
20+
include(FetchOpenCL)
8021

8122
add_subdirectory(opencl-aot)

opencl/opencl-aot/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,4 @@ endif()
2525
target_link_libraries(${OPENCL_AOT_PROJECT_NAME}
2626
PRIVATE
2727
OpenCL-Headers
28-
OpenCL-ICD)
28+
${OpenCL_LIBRARY})

sycl/CMakeLists.txt

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -145,20 +145,22 @@ set(SYCL_INCLUDE_DIR "include")
145145
set(SYCL_INCLUDE_BUILD_DIR ${LLVM_BINARY_DIR}/${SYCL_INCLUDE_DIR})
146146

147147
add_llvm_external_project(opencl)
148-
list(FIND LLVM_ENABLE_PROJECTS opencl OPENCL_FOUND)
149-
if(OPENCL_FOUND EQUAL -1)
148+
list(FIND LLVM_ENABLE_PROJECTS opencl OPENCL_PROJ_FOUND)
149+
if(OPENCL_PROJ_FOUND EQUAL -1)
150150
message(FATAL_ERROR "opencl external project required but not found.")
151151
endif()
152152

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

158-
# Include OpenCL Headers into final bundle.
159-
install(DIRECTORY ${OpenCL_INCLUDE_DIR}/CL
160-
DESTINATION ${SYCL_INCLUDE_DIR}
161-
COMPONENT OpenCL-Headers)
159+
# Include OpenCL Headers into final bundle.
160+
install(DIRECTORY ${OpenCL_INCLUDE_DIR}/CL
161+
DESTINATION ${SYCL_INCLUDE_DIR}
162+
COMPONENT OpenCL-Headers)
163+
endif()
162164

163165
# Option for enabling building the SYCL major release preview library.
164166
option(SYCL_ENABLE_MAJOR_RELEASE_PREVIEW_LIB "Enable build of the SYCL major release preview library" ON)

sycl/cmake/modules/FetchUnifiedRuntime.cmake

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@ if("hip" IN_LIST SYCL_ENABLE_BACKENDS)
5656
endif()
5757
if("opencl" IN_LIST SYCL_ENABLE_BACKENDS)
5858
set(UR_BUILD_ADAPTER_OPENCL ON)
59-
set(UR_OPENCL_ICD_LOADER_LIBRARY OpenCL-ICD CACHE FILEPATH
60-
"Path of the OpenCL ICD Loader library" FORCE)
6159
endif()
6260
if("native_cpu" IN_LIST SYCL_ENABLE_BACKENDS)
6361
set(UR_BUILD_ADAPTER_NATIVE_CPU ON)

sycl/tools/sycl-ls/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ target_compile_definitions(sycl-ls PRIVATE SYCL_DISABLE_IMAGE_ASPECT_WARNING SYC
1414
target_link_libraries(sycl-ls
1515
PRIVATE
1616
${sycl_lib}
17-
OpenCL-Headers
1817
UnifiedRuntime-Headers
1918
)
2019
if (WIN32)

sycl/tools/sycl-prof/CMakeLists.txt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@ target_compile_options(sycl-prof PRIVATE -fno-exceptions -fno-rtti)
1515
add_library(sycl_profiler_collector SHARED collector.cpp)
1616
target_compile_definitions(sycl_profiler_collector PRIVATE XPTI_CALLBACK_API_EXPORTS)
1717
target_link_libraries(sycl_profiler_collector PRIVATE xptifw)
18-
if (TARGET OpenCL-Headers)
19-
target_link_libraries(sycl_profiler_collector PRIVATE OpenCL-Headers)
20-
endif()
2118
target_include_directories(sycl_profiler_collector PRIVATE
2219
"${sycl_inc_dir}"
2320
"${sycl_src_dir}"

sycl/tools/sycl-sanitize/CMakeLists.txt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@ add_library(sycl_sanitizer_collector SHARED collector.cpp)
1414
target_compile_definitions(sycl_sanitizer_collector PRIVATE XPTI_CALLBACK_API_EXPORTS)
1515
target_link_libraries(sycl_sanitizer_collector PRIVATE xptifw)
1616
target_link_libraries(sycl_sanitizer_collector PRIVATE UnifiedRuntime-Headers)
17-
if (TARGET OpenCL-Headers)
18-
target_link_libraries(sycl_sanitizer_collector PRIVATE OpenCL-Headers)
19-
endif()
2017

2118
target_include_directories(sycl_sanitizer_collector PRIVATE
2219
"${CMAKE_CURRENT_SOURCE_DIR}/../xpti_helpers/"

sycl/tools/sycl-trace/CMakeLists.txt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,6 @@ endif()
7979

8080
target_compile_definitions(sycl_ur_trace_collector PRIVATE XPTI_CALLBACK_API_EXPORTS)
8181
target_link_libraries(sycl_ur_trace_collector PRIVATE xptifw)
82-
if (TARGET OpenCL-Headers)
83-
target_link_libraries(sycl_ur_trace_collector PRIVATE OpenCL-Headers)
84-
endif()
8582
target_link_libraries(sycl_ur_trace_collector PRIVATE UnifiedRuntime-Headers)
8683

8784
target_include_directories(sycl_ur_trace_collector PRIVATE
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
# Finds or fetches OpenCL Headers and the ICD loader.
2+
if(TARGET OpenCL-Headers)
3+
# If we already ran this module (so the OpenCL-Headers target exists),
4+
# everything is already set up, nothing to do.
5+
return()
6+
endif()
7+
8+
# Repo URLs
9+
10+
set(OCL_HEADERS_REPO
11+
"https://github.com/KhronosGroup/OpenCL-Headers.git")
12+
set(OCL_LOADER_REPO
13+
"https://github.com/KhronosGroup/OpenCL-ICD-Loader.git")
14+
15+
# Repo tags/hashes
16+
17+
set(OCL_HEADERS_TAG 6eabe90aa7b6cff9c67800a2fe25a0cd88d8b749)
18+
set(OCL_LOADER_TAG ddf6c70230a79cdb8fcccfd3c775b09e6820f42e)
19+
20+
find_package(OpenCL 3.0 QUIET)
21+
if(OpenCL_FOUND)
22+
# The OpenCL-Headers CMake files don't provide granular info
23+
# on what is and isn't supposed, just the overall OpenCL version.
24+
# The current tag we are using happens to define an extension, so just check
25+
# if that extension exists to make sure the system install is not
26+
# too old.
27+
set(OPENCL_TEST_PROGRAM "#define CL_TARGET_OPENCL_VERSION 300
28+
#include <CL/cl_ext.h>
29+
#ifndef cl_khr_spirv_queries
30+
#error Unsupported header version
31+
#endif
32+
int main(int, char*[]) { return 0; }"
33+
)
34+
include(CheckCXXSourceCompiles)
35+
set(CMAKE_REQUIRED_INCLUDES ${OpenCL_INCLUDE_DIRS})
36+
set(CMAKE_REQUIRED_LIBRARIES ${OPENCL_Library})
37+
check_cxx_source_compiles("${OPENCL_TEST_PROGRAM}" OPENCL_HEADERS_VERSION_SUPPORTED)
38+
if(NOT OPENCL_HEADERS_VERSION_SUPPORTED)
39+
message(WARNING "Preinstalled OpenCL-Headers are not supported, "
40+
"use commit ${OCL_HEADERS_TAG} or later. Will fetch OpenCL.")
41+
set(OpenCL_FOUND FALSE CACHE BOOL "" FORCE)
42+
endif()
43+
endif()
44+
45+
# Ideally we could use the FIND_PACKAGE_ARGS argument to FetchContent_Declare to avoid
46+
# the conditonals, but that was added in CMake 3.24 and the current minimum we require is
47+
# 3.20.
48+
49+
# OpenCL Headers
50+
if(NOT OpenCL_FOUND)
51+
FetchContent_GetProperties(ocl-headers)
52+
53+
if(NOT ocl-headers_POPULATED)
54+
message(STATUS "Will fetch OpenCL headers from ${OCL_HEADERS_REPO}")
55+
FetchContent_Declare(ocl-headers
56+
GIT_REPOSITORY ${OCL_HEADERS_REPO}
57+
GIT_TAG ${OCL_HEADERS_TAG}
58+
)
59+
FetchContent_MakeAvailable(ocl-headers)
60+
endif()
61+
set(OpenCL_INCLUDE_DIR ${ocl-headers_SOURCE_DIR} CACHE PATH "" FORCE)
62+
else()
63+
message(STATUS "Using OpenCL headers at ${OpenCL_INCLUDE_DIR}")
64+
endif()
65+
66+
# OpenCL Library (ICD Loader)
67+
68+
set(BUILD_SHARED_LIBS ON)
69+
70+
if(NOT OpenCL_FOUND)
71+
72+
FetchContent_GetProperties(ocl-icd)
73+
if(NOT ocl-icd_POPULATED)
74+
message(STATUS "Will fetch OpenCL ICD Loader from ${OCL_LOADER_REPO}")
75+
FetchContent_Declare(ocl-icd
76+
GIT_REPOSITORY ${OCL_LOADER_REPO}
77+
GIT_TAG ${OCL_LOADER_TAG}
78+
)
79+
80+
FetchContent_MakeAvailable(ocl-icd)
81+
endif()
82+
set(OpenCL_LIBRARY OpenCL::OpenCL CACHE PATH "" FORCE)
83+
else()
84+
message(STATUS
85+
"Using OpenCL ICD Loader at ${OpenCL_LIBRARY}")
86+
endif()
87+
88+
add_library(OpenCL-Headers INTERFACE)
89+
target_include_directories(OpenCL-Headers INTERFACE ${OpenCL_INCLUDE_DIR})
90+
target_compile_definitions(OpenCL-Headers INTERFACE -DCL_TARGET_OPENCL_VERSION=300 -DCL_USE_DEPRECATED_OPENCL_1_2_APIS=1)
91+
92+
set(OpenCL_FOUND ${OpenCL_FOUND} CACHE BOOL INTERNAL)

unified-runtime/source/adapters/opencl/CMakeLists.txt

Lines changed: 6 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55

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

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

1110
find_package(Threads REQUIRED)
1211

@@ -53,52 +52,12 @@ set_target_properties(${TARGET_NAME} PROPERTIES
5352
SOVERSION "${PROJECT_VERSION_MAJOR}"
5453
)
5554

56-
if(UR_OPENCL_INCLUDE_DIR)
57-
set(OpenCLIncludeDirectory ${UR_OPENCL_INCLUDE_DIR})
58-
else()
59-
FetchContent_Declare(OpenCL-Headers
60-
GIT_REPOSITORY "https://github.com/KhronosGroup/OpenCL-Headers.git"
61-
GIT_TAG 6eabe90aa7b6cff9c67800a2fe25a0cd88d8b749
62-
)
63-
FetchContent_MakeAvailable(OpenCL-Headers)
64-
FetchContent_GetProperties(OpenCL-Headers
65-
SOURCE_DIR OpenCLIncludeDirectory
66-
)
55+
# https://github.com/intel/llvm/issues/19648
56+
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND LLVM_ENABLE_PEDANTIC)
57+
target_compile_options(ur_adapter_opencl PRIVATE -std=gnu++17)
6758
endif()
6859

69-
# The OpenCL target can be set manually on upstream cmake to avoid using
70-
# find_package().
71-
if(UR_OPENCL_ICD_LOADER_LIBRARY)
72-
set(OpenCLICDLoaderLibrary ${UR_OPENCL_ICD_LOADER_LIBRARY})
73-
else()
74-
find_package(OpenCL 3.0)
75-
if(NOT OpenCL_FOUND)
76-
FetchContent_Declare(OpenCL-ICD-Loader
77-
GIT_REPOSITORY "https://github.com/KhronosGroup/OpenCL-ICD-Loader.git"
78-
GIT_TAG main
79-
)
80-
FetchContent_MakeAvailable(OpenCL-ICD-Loader)
81-
endif()
82-
set(OpenCLICDLoaderLibrary OpenCL::OpenCL)
83-
endif()
84-
85-
# Make interface library use within the project.
86-
add_library(OpenCLICDLoader INTERFACE)
87-
target_link_libraries(OpenCLICDLoader INTERFACE "${OpenCLICDLoaderLibrary}")
88-
target_include_directories(OpenCLICDLoader INTERFACE ${OpenCLIncludeDirectory})
89-
90-
message(STATUS "OpenCL Include Directory: ${OpenCLIncludeDirectory}")
91-
message(STATUS "OpenCL ICD Loader Library: ${OpenCLICDLoaderLibrary}")
92-
93-
# Suppress a compiler message about undefined CL_TARGET_OPENCL_VERSION.
94-
# Define all symbols up to OpenCL 3.0.
95-
target_compile_definitions(ur_adapter_opencl PRIVATE
96-
CL_TARGET_OPENCL_VERSION=300
97-
CL_USE_DEPRECATED_OPENCL_1_2_APIS
98-
)
99-
10060
target_include_directories(${TARGET_NAME} PRIVATE
101-
${OpenCLIncludeDirectory}
10261
"${CMAKE_CURRENT_SOURCE_DIR}/../../"
10362
)
10463

@@ -107,5 +66,6 @@ target_link_libraries(${TARGET_NAME} PRIVATE
10766
${PROJECT_NAME}::common
10867
${PROJECT_NAME}::umf
10968
Threads::Threads
110-
${OpenCLICDLoaderLibrary}
69+
OpenCL-Headers
70+
${OpenCL_LIBRARY}
11171
)

0 commit comments

Comments
 (0)