Skip to content

Commit e3af0d5

Browse files
committed
[SYCL][UR] Improve support for preinstalled OpenCL deps
Signed-off-by: Sarnie, Nick <nick.sarnie@intel.com>
1 parent b62432d commit e3af0d5

File tree

10 files changed

+121
-132
lines changed

10 files changed

+121
-132
lines changed

opencl/CMakeLists.txt

Lines changed: 1 addition & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -11,71 +11,10 @@ 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()
77-
78-
FetchContent_MakeAvailable(ocl-icd)
79-
add_library(OpenCL-ICD ALIAS OpenCL)
18+
include(FetchOpenCL)
8019

8120
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/FetchOpenCL.cmake

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

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-prof/CMakeLists.txt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@ 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()
18+
target_link_libraries(sycl_profiler_collector PRIVATE OpenCL-Headers)
2119
target_include_directories(sycl_profiler_collector PRIVATE
2220
"${sycl_inc_dir}"
2321
"${sycl_src_dir}"

sycl/tools/sycl-sanitize/CMakeLists.txt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@ 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()
17+
target_link_libraries(sycl_sanitizer_collector PRIVATE OpenCL-Headers)
2018

2119
target_include_directories(sycl_sanitizer_collector PRIVATE
2220
"${CMAKE_CURRENT_SOURCE_DIR}/../xpti_helpers/"

sycl/tools/sycl-trace/CMakeLists.txt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,7 @@ 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()
82+
target_link_libraries(sycl_ur_trace_collector PRIVATE OpenCL-Headers)
8583
target_link_libraries(sycl_ur_trace_collector PRIVATE UnifiedRuntime-Headers)
8684

8785
target_include_directories(sycl_ur_trace_collector PRIVATE

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

Lines changed: 16 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,16 @@
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+
if(UR_STANDALONE_BUILD)
9+
file(DOWNLOAD https://raw.githubusercontent.com/sarnex/llvm/refs/heads/deps/sycl/cmake/modules/FetchOpenCL.cmake "${CMAKE_CURRENT_BINARY_DIR}/FetchOpenCL.cmake")
10+
11+
if(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/FetchOpenCL.cmake")
12+
message(FATAL_ERROR "Failed to download SYCL CMake module")
13+
endif()
14+
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_BINARY_DIR}")
15+
endif()
16+
17+
include(FetchOpenCL)
1018

1119
find_package(Threads REQUIRED)
1220

@@ -53,52 +61,13 @@ set_target_properties(${TARGET_NAME} PROPERTIES
5361
SOVERSION "${PROJECT_VERSION_MAJOR}"
5462
)
5563

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-
)
67-
endif()
68-
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)
64+
# https://github.com/intel/llvm/issues/19648
65+
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND LLVM_ENABLE_PEDANTIC)
66+
target_compile_options(ur_adapter_opencl PRIVATE -std=gnu++17)
8367
endif()
8468

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-
10069
target_include_directories(${TARGET_NAME} PRIVATE
101-
${OpenCLIncludeDirectory}
70+
${OpenCL_INCLUDE_DIRECTORY}
10271
"${CMAKE_CURRENT_SOURCE_DIR}/../../"
10372
)
10473

@@ -107,5 +76,6 @@ target_link_libraries(${TARGET_NAME} PRIVATE
10776
${PROJECT_NAME}::common
10877
${PROJECT_NAME}::umf
10978
Threads::Threads
110-
${OpenCLICDLoaderLibrary}
79+
OpenCL-Headers
80+
${OpenCL_LIBRARY}
11181
)

unified-runtime/test/conformance/exp_command_buffer/native-command/CMakeLists.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,5 @@ endif()
2020

2121
if (UR_BUILD_ADAPTER_OPENCL)
2222
target_sources(exp_command_buffer-test PRIVATE "append_native_opencl.cpp")
23-
target_compile_definitions(exp_command_buffer-test PRIVATE CL_TARGET_OPENCL_VERSION=300)
24-
target_link_libraries(exp_command_buffer-test PRIVATE OpenCLICDLoader)
23+
target_link_libraries(exp_command_buffer-test PRIVATE ${OpenCL_LIBRARY} OpenCL-Headers)
2524
endif()

0 commit comments

Comments
 (0)