diff --git a/.github/intel-llvm-mirror-base-commit b/.github/intel-llvm-mirror-base-commit index 8abe736e8e..e049aa99ec 100644 --- a/.github/intel-llvm-mirror-base-commit +++ b/.github/intel-llvm-mirror-base-commit @@ -1 +1 @@ -d25d6d6919de5c15e69e5b69d848b05876da23a3 +542a00b45276bd9a24ba85c041b0d5535a896593 diff --git a/cmake/FetchOpenCL.cmake b/cmake/FetchOpenCL.cmake new file mode 100644 index 0000000000..f1ad134901 --- /dev/null +++ b/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/source/adapters/level_zero/v2/queue_create.cpp b/source/adapters/level_zero/v2/queue_create.cpp index a8270b192d..be211cb198 100644 --- a/source/adapters/level_zero/v2/queue_create.cpp +++ b/source/adapters/level_zero/v2/queue_create.cpp @@ -94,6 +94,7 @@ ur_result_t urQueueCreateWithNativeHandle( bool ownNativeHandle = pProperties ? pProperties->isNativeHandleOwned : false; ur_queue_flags_t flags = 0; + bool isNativeHandleImmediate = true; if (pProperties) { void *pNext = pProperties->pNext; @@ -104,11 +105,30 @@ ur_result_t urQueueCreateWithNativeHandle( const ur_queue_properties_t *pUrProperties = reinterpret_cast(extendedProperties); flags = pUrProperties->flags; + } else if (extendedProperties->stype == + UR_STRUCTURE_TYPE_QUEUE_NATIVE_DESC) { + const ur_queue_native_desc_t *pUrNativeDesc = + reinterpret_cast( + extendedProperties); + if (pUrNativeDesc->pNativeData) { + // The pNativeData has value if if the native handle is an immediate + // command list. + isNativeHandleImmediate = + *(reinterpret_cast((pUrNativeDesc->pNativeData))) == 1; + } } pNext = extendedProperties->pNext; } } + if (!isNativeHandleImmediate) { + UR_LOG(ERR, "urQueueCreateWithNativeHandle: " + "Native handle is not an immediate command " + "list; only immediate command lists are " + "supported."); + return UR_RESULT_ERROR_UNSUPPORTED_FEATURE; + } + ze_bool_t isImmediate = false; ZE2UR_CALL( zeCommandListIsImmediate, diff --git a/source/adapters/offload/device.cpp b/source/adapters/offload/device.cpp index 6ca2ddf24b..9990258dae 100644 --- a/source/adapters/offload/device.cpp +++ b/source/adapters/offload/device.cpp @@ -107,11 +107,13 @@ UR_APIEXPORT ur_result_t UR_APICALL urDeviceGetInfo(ur_device_handle_t hDevice, } // Unimplemented features case UR_DEVICE_INFO_PROGRAM_SET_SPECIALIZATION_CONSTANTS: + case UR_DEVICE_INFO_KERNEL_SET_SPECIALIZATION_CONSTANTS: case UR_DEVICE_INFO_USM_POOL_SUPPORT: case UR_DEVICE_INFO_COMMAND_BUFFER_SUPPORT_EXP: case UR_DEVICE_INFO_IMAGE_SUPPORT: case UR_DEVICE_INFO_VIRTUAL_MEMORY_SUPPORT: case UR_DEVICE_INFO_MEM_CHANNEL_SUPPORT: + case UR_DEVICE_INFO_HOST_PIPE_READ_WRITE_SUPPORT: // TODO: Atomic queries in Offload case UR_DEVICE_INFO_ATOMIC_64: case UR_DEVICE_INFO_IMAGE_SRGB: @@ -134,6 +136,71 @@ UR_APIEXPORT ur_result_t UR_APICALL urDeviceGetInfo(ur_device_handle_t hDevice, } return UR_RESULT_SUCCESS; } + case UR_DEVICE_INFO_PARTITION_MAX_SUB_DEVICES: { + return ReturnValue(0u); + } + case UR_DEVICE_INFO_PARTITION_AFFINITY_DOMAIN: { + return ReturnValue(0u); + } + case UR_DEVICE_INFO_PARTITION_TYPE: { + if (pPropSizeRet) { + *pPropSizeRet = 0; + } + return UR_RESULT_SUCCESS; + } + case UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_CHAR: { + return ReturnValue(1u); + } + case UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_SHORT: { + return ReturnValue(1u); + } + case UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_INT: { + return ReturnValue(1u); + } + case UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_LONG: { + return ReturnValue(1u); + } + case UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_FLOAT: { + return ReturnValue(1u); + } + case UR_DEVICE_INFO_PREFERRED_VECTOR_WIDTH_DOUBLE: { + return ReturnValue(1u); + } + case UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_CHAR: { + return ReturnValue(1u); + } + case UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_SHORT: { + return ReturnValue(1u); + } + case UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_INT: { + return ReturnValue(1u); + } + case UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_LONG: { + return ReturnValue(1u); + } + case UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_FLOAT: { + return ReturnValue(1u); + } + case UR_DEVICE_INFO_NATIVE_VECTOR_WIDTH_DOUBLE: { + return ReturnValue(1u); + } + case UR_DEVICE_INFO_SINGLE_FP_CONFIG: + case UR_DEVICE_INFO_DOUBLE_FP_CONFIG: { + // This minimal set of flags will at least signal to sycl that we support + // the basic FP types. + ur_device_fp_capability_flags_t SupportedFlags = + UR_DEVICE_FP_CAPABILITY_FLAG_INF_NAN | + UR_DEVICE_FP_CAPABILITY_FLAG_ROUND_TO_NEAREST; + return ReturnValue(SupportedFlags); + } + case UR_DEVICE_INFO_AVAILABLE: { + return ReturnValue(ur_bool_t{true}); + } + case UR_DEVICE_INFO_BUILT_IN_KERNELS: { + // An empty string is returned if no built-in kernels are supported by the + // device. + return ReturnValue(""); + } default: return UR_RESULT_ERROR_UNSUPPORTED_ENUMERATION; } diff --git a/source/adapters/opencl/CMakeLists.txt b/source/adapters/opencl/CMakeLists.txt index fc2a4b7862..faaeec4bfd 100644 --- a/source/adapters/opencl/CMakeLists.txt +++ b/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/test/conformance/exp_command_buffer/native-command/CMakeLists.txt b/test/conformance/exp_command_buffer/native-command/CMakeLists.txt index aecbbb7f73..83560e39f8 100644 --- a/test/conformance/exp_command_buffer/native-command/CMakeLists.txt +++ b/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()