diff --git a/opencl/CMakeLists.txt b/opencl/CMakeLists.txt index 6c771c709381d..aa317994840ea 100644 --- a/opencl/CMakeLists.txt +++ b/opencl/CMakeLists.txt @@ -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) diff --git a/opencl/opencl-aot/CMakeLists.txt b/opencl/opencl-aot/CMakeLists.txt index 732da7b1e273c..9aa34cfabde15 100644 --- a/opencl/opencl-aot/CMakeLists.txt +++ b/opencl/opencl-aot/CMakeLists.txt @@ -25,4 +25,4 @@ endif() target_link_libraries(${OPENCL_AOT_PROJECT_NAME} PRIVATE OpenCL-Headers - OpenCL-ICD) + ${OpenCL_LIBRARY}) diff --git a/sycl/CMakeLists.txt b/sycl/CMakeLists.txt index a02ff64ae6ec8..20e940fce9f91 100644 --- a/sycl/CMakeLists.txt +++ b/sycl/CMakeLists.txt @@ -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) diff --git a/sycl/cmake/modules/FetchUnifiedRuntime.cmake b/sycl/cmake/modules/FetchUnifiedRuntime.cmake index 33368f2b9c197..c24dac5ee1b66 100644 --- a/sycl/cmake/modules/FetchUnifiedRuntime.cmake +++ b/sycl/cmake/modules/FetchUnifiedRuntime.cmake @@ -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) diff --git a/sycl/tools/sycl-ls/CMakeLists.txt b/sycl/tools/sycl-ls/CMakeLists.txt index 0597586193be1..aa0d8851cf0ac 100644 --- a/sycl/tools/sycl-ls/CMakeLists.txt +++ b/sycl/tools/sycl-ls/CMakeLists.txt @@ -14,7 +14,6 @@ target_compile_definitions(sycl-ls PRIVATE SYCL_DISABLE_IMAGE_ASPECT_WARNING SYC target_link_libraries(sycl-ls PRIVATE ${sycl_lib} - OpenCL-Headers UnifiedRuntime-Headers ) if (WIN32) diff --git a/sycl/tools/sycl-prof/CMakeLists.txt b/sycl/tools/sycl-prof/CMakeLists.txt index 09586c1b857ca..c37040614206c 100644 --- a/sycl/tools/sycl-prof/CMakeLists.txt +++ b/sycl/tools/sycl-prof/CMakeLists.txt @@ -15,9 +15,6 @@ 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_include_directories(sycl_profiler_collector PRIVATE "${sycl_inc_dir}" "${sycl_src_dir}" diff --git a/sycl/tools/sycl-sanitize/CMakeLists.txt b/sycl/tools/sycl-sanitize/CMakeLists.txt index 280b4760e302f..4a1e6e3c9cc93 100644 --- a/sycl/tools/sycl-sanitize/CMakeLists.txt +++ b/sycl/tools/sycl-sanitize/CMakeLists.txt @@ -14,9 +14,6 @@ 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_include_directories(sycl_sanitizer_collector PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../xpti_helpers/" diff --git a/sycl/tools/sycl-trace/CMakeLists.txt b/sycl/tools/sycl-trace/CMakeLists.txt index 1bb26dac05329..2f825c1aa3dae 100644 --- a/sycl/tools/sycl-trace/CMakeLists.txt +++ b/sycl/tools/sycl-trace/CMakeLists.txt @@ -79,9 +79,6 @@ 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 UnifiedRuntime-Headers) target_include_directories(sycl_ur_trace_collector PRIVATE diff --git a/unified-runtime/cmake/FetchOpenCL.cmake b/unified-runtime/cmake/FetchOpenCL.cmake new file mode 100644 index 0000000000000..f1ad1349010fc --- /dev/null +++ b/unified-runtime/cmake/FetchOpenCL.cmake @@ -0,0 +1,92 @@ +# Finds or fetches OpenCL Headers and the ICD loader. +if(TARGET OpenCL-Headers) + # If we already ran this module (so the OpenCL-Headers target exists), + # everything is already set up, nothing to do. + 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 + #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) diff --git a/unified-runtime/source/adapters/opencl/CMakeLists.txt b/unified-runtime/source/adapters/opencl/CMakeLists.txt index fc2a4b786293f..faaeec4bfdab6 100644 --- a/unified-runtime/source/adapters/opencl/CMakeLists.txt +++ b/unified-runtime/source/adapters/opencl/CMakeLists.txt @@ -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) @@ -53,52 +52,12 @@ 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} "${CMAKE_CURRENT_SOURCE_DIR}/../../" ) @@ -107,5 +66,6 @@ target_link_libraries(${TARGET_NAME} PRIVATE ${PROJECT_NAME}::common ${PROJECT_NAME}::umf Threads::Threads - ${OpenCLICDLoaderLibrary} + OpenCL-Headers + ${OpenCL_LIBRARY} ) diff --git a/unified-runtime/test/conformance/exp_command_buffer/native-command/CMakeLists.txt b/unified-runtime/test/conformance/exp_command_buffer/native-command/CMakeLists.txt index aecbbb7f73f68..83560e39f8a86 100644 --- a/unified-runtime/test/conformance/exp_command_buffer/native-command/CMakeLists.txt +++ b/unified-runtime/test/conformance/exp_command_buffer/native-command/CMakeLists.txt @@ -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()