From 405349bec9ab3acd5019e921de6861b9bea5dd6e Mon Sep 17 00:00:00 2001 From: Dmitri Mokhov Date: Tue, 8 Sep 2020 17:30:59 -0700 Subject: [PATCH] [SYCL] Fix OpenCL version check when verifying SPIR-V online compilation support Enumerate through historic OpenCL versions, like in the plugin. --- .../program_manager/program_manager.cpp | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/sycl/source/detail/program_manager/program_manager.cpp b/sycl/source/detail/program_manager/program_manager.cpp index c597b70669af6..631e4ef27b714 100644 --- a/sycl/source/detail/program_manager/program_manager.cpp +++ b/sycl/source/detail/program_manager/program_manager.cpp @@ -218,19 +218,20 @@ getOrBuild(KernelProgramCache &KPCache, KeyT &&CacheKey, AcquireFT &&Acquire, } } +// TODO replace this with a new PI API function static bool isDeviceBinaryTypeSupported(const context &C, RT::PiDeviceBinaryType Format) { + // All formats except PI_DEVICE_BINARY_TYPE_SPIRV are supported. + if (Format != PI_DEVICE_BINARY_TYPE_SPIRV) + return true; + const backend ContextBackend = detail::getSyclObjImpl(C)->getPlugin().getBackend(); // The CUDA backend cannot use SPIR-V - if (ContextBackend == backend::cuda && Format == PI_DEVICE_BINARY_TYPE_SPIRV) + if (ContextBackend == backend::cuda) return false; - // All formats except PI_DEVICE_BINARY_TYPE_SPIRV are supported. - if (Format != PI_DEVICE_BINARY_TYPE_SPIRV) - return true; - vector_class Devices = C.get_devices(); // Program type is SPIR-V, so we need a device compiler to do JIT. @@ -240,9 +241,14 @@ static bool isDeviceBinaryTypeSupported(const context &C, } // OpenCL 2.1 and greater require clCreateProgramWithIL - if ((ContextBackend == backend::opencl) && - C.get_platform().get_info() >= "2.1") - return true; + if (ContextBackend == backend::opencl) { + std::string ver = C.get_platform().get_info(); + if (ver.find("OpenCL 1.0") == std::string::npos && + ver.find("OpenCL 1.1") == std::string::npos && + ver.find("OpenCL 1.2") == std::string::npos && + ver.find("OpenCL 2.0") == std::string::npos) + return true; + } for (const device &D : Devices) { // We need cl_khr_il_program extension to be present