Skip to content

Commit 2dd65f1

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

File tree

9 files changed

+138
-130
lines changed

9 files changed

+138
-130
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: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -145,20 +145,27 @@ 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()
164+
165+
install(FILES ${PROJECT_SOURCE_DIR}/cmake/modules/FetchOpenCL.cmake
166+
DESTINATION ${CMAKE_INSTALL_DATADIR}/cmake/sycl
167+
COMPONENT OpenCL-Headers
168+
)
162169

163170
# Option for enabling building the SYCL major release preview library.
164171
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+
set(OpenCL_LIBRARY OpenCL CACHE PATH "" FORCE)
77+
endif()
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: 29 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,29 @@
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+
# function(FetchContentSparse_Declare name GIT_REPOSITORY GIT_TAG GIT_DIR)
10+
#FetchContentSparse(intel-llvm-fetch-opencl https://github.com/intel/llvm HEAD "fetch-opencl")
11+
#endif()
12+
13+
if(UR_STANDALONE_BUILD)
14+
find_file(FETCHOPENCL_CMAKE
15+
FetchOpenCL.cmake
16+
PATHS
17+
${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}
18+
${CMAKE_INSTALL_PREFIX}/share
19+
/usr/share
20+
PATH_SUFFIXES cmake/sycl
21+
)
22+
23+
if(NOT FETCHOPENCL_CMAKE)
24+
include(${FETCHOPENCL_CMAKE})
25+
else()
26+
message(FATAL_ERROR "FetchOpenCL.cmake not found, install the DPC++ compiler first")
27+
endif()
28+
else()
29+
include(FetchOpenCL)
30+
endif()
1031

1132
find_package(Threads REQUIRED)
1233

@@ -53,52 +74,13 @@ set_target_properties(${TARGET_NAME} PROPERTIES
5374
SOVERSION "${PROJECT_VERSION_MAJOR}"
5475
)
5576

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)
77+
# https://github.com/intel/llvm/issues/19648
78+
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND LLVM_ENABLE_PEDANTIC)
79+
target_compile_options(ur_adapter_opencl PRIVATE -std=gnu++17)
8380
endif()
8481

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-
10082
target_include_directories(${TARGET_NAME} PRIVATE
101-
${OpenCLIncludeDirectory}
83+
${OpenCL_INCLUDE_DIRECTORY}
10284
"${CMAKE_CURRENT_SOURCE_DIR}/../../"
10385
)
10486

@@ -107,5 +89,6 @@ target_link_libraries(${TARGET_NAME} PRIVATE
10789
${PROJECT_NAME}::common
10890
${PROJECT_NAME}::umf
10991
Threads::Threads
110-
${OpenCLICDLoaderLibrary}
92+
OpenCL-Headers
93+
${OpenCL_LIBRARY}
11194
)

0 commit comments

Comments
 (0)