From: Pan Xiuli <[email protected]> This allows a single beignet binary to both offer 2.0 where available, and still work on older hardware. V2: Default to 1.2 when -cl-std is not set (required by the OpenCL spec, and also likely to be faster). V3: Only enable OpenCL 2.0 when llvm version is 39. V4: Only enable OpenCL 2.0 on x64 host.
Contributor: Rebecca N. Palmer <[email protected]> Signed-off-by: Pan Xiuli <[email protected]> --- CMakeLists.txt | 46 ++++++++++++++++++++++++++++------------- backend/src/backend/program.cpp | 19 +++++++++-------- src/cl_device_data.h | 2 ++ src/cl_gen9_device.h | 2 ++ src/cl_gt_device.h | 12 +++++++++-- src/cl_platform_id.c | 2 +- src/cl_platform_id.h | 6 ++++-- 7 files changed, 61 insertions(+), 28 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3246567..70fc10e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -234,20 +234,18 @@ IF (EXPERIMENTAL_DOUBLE) ADD_DEFINITIONS(-DENABLE_FP64) ENDIF(EXPERIMENTAL_DOUBLE) -OPTION(ENABLE_OPENCL_20 "Enable opencl 2.0 support" OFF) -IF (ENABLE_OPENCL_20) - Find_Program(LSPCI lspci) - IF (NOT LSPCI) - MESSAGE(FATAL_ERROR "Looking for lspci - not found") - ENDIF (NOT LSPCI) - EXECUTE_PROCESS(COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/GetGenID.sh" - RESULT_VARIABLE SUPPORT_OCL20_DEVICE - OUTPUT_VARIABLE PCI_ID_NOT_USED) - - IF (NOT SUPPORT_OCL20_DEVICE EQUAL 1) - MESSAGE(FATAL_ERROR "Only SKL and newer devices support OpenCL 2.0 now, your device don't support.") - ENDIF (NOT SUPPORT_OCL20_DEVICE EQUAL 1) +SET(CAN_OPENCL_20 ON) +IF (CMAKE_SIZEOF_VOID_P EQUAL 4) + SET(CAN_OPENCL_20 OFF) +ENDIF (CMAKE_SIZEOF_VOID_P EQUAL 4) +IF (NOT HAVE_DRM_INTEL_BO_SET_SOFTPIN) + SET(CAN_OPENCL_20 OFF) +ENDIF (NOT HAVE_DRM_INTEL_BO_SET_SOFTPIN) +IF (LLVM_VERSION_NODOT VERSION_LESS 39) + SET(CAN_OPENCL_20 OFF) +ENDIF (LLVM_VERSION_NODOT VERSION_LESS 39) +IF (ENABLE_OPENCL_20) IF (NOT HAVE_DRM_INTEL_BO_SET_SOFTPIN) MESSAGE(FATAL_ERROR "Please update libdrm to version 2.4.66 or later to enable OpenCL 2.0.") ENDIF (NOT HAVE_DRM_INTEL_BO_SET_SOFTPIN) @@ -256,9 +254,29 @@ IF (ENABLE_OPENCL_20) MESSAGE(FATAL_ERROR "Please update LLVM to version 3.9 or later to enable OpenCL 2.0.") ENDIF (LLVM_VERSION_NODOT VERSION_LESS 39) - ADD_DEFINITIONS(-DENABLE_OPENCL_20) + IF (CMAKE_SIZEOF_VOID_P EQUAL 4) + MESSAGE(FATAL_ERROR "Please use x64 host to enable OpenCL 2.0.") + ENDIF (CMAKE_SIZEOF_VOID_P EQUAL 4) ENDIF(ENABLE_OPENCL_20) +IF (DEFINED ENABLE_OPENCL_20) + IF (ENABLE_OPENCL_20 AND CAN_OPENCL_20) + SET(CAN_OPENCL_20 ON) + ELSE(ENABLE_OPENCL_20 AND CAN_OPENCL_20) + SET(CAN_OPENCL_20 OFF) + ENDIF (ENABLE_OPENCL_20 AND CAN_OPENCL_20) +ENDIF (DEFINED ENABLE_OPENCL_20) + +OPTION(ENABLE_OPENCL_20 "Enable opencl 2.0 support" ${CAN_OPENCL_20}) + +IF (CAN_OPENCL_20) + SET (ENABLE_OPENCL_20 ON) + MESSAGE(STATUS "Building with OpenCL 2.0.") + ADD_DEFINITIONS(-DENABLE_OPENCL_20) +ELSE (CAN_OPENCL_20) + MESSAGE(STATUS "Building with OpenCL 1.2.") +ENDIF(CAN_OPENCL_20) + set (LIBCL_DRIVER_VERSION_MAJOR 1) set (LIBCL_DRIVER_VERSION_MINOR 4) if (ENABLE_OPENCL_20) diff --git a/backend/src/backend/program.cpp b/backend/src/backend/program.cpp index 85d0aa9..09c79d8 100644 --- a/backend/src/backend/program.cpp +++ b/backend/src/backend/program.cpp @@ -31,6 +31,7 @@ #include "ir/value.hpp" #include "ir/unit.hpp" #include "ir/printf.hpp" +#include "src/cl_device_data.h" #ifdef GBE_COMPILER_AVAILABLE #include "llvm/llvm_to_gen.hpp" @@ -855,6 +856,7 @@ namespace gbe { size_t *errSize, uint32_t &oclVersion) { + uint32_t maxoclVersion = oclVersion; std::string pchFileName; bool findPCH = false; #if defined(__ANDROID__) @@ -1022,15 +1024,9 @@ EXTEND_QUOTE: } if (useDefaultCLCVersion) { -#ifdef ENABLE_OPENCL_20 - clOpt.push_back("-D__OPENCL_C_VERSION__=200"); - clOpt.push_back("-cl-std=CL2.0"); - oclVersion = 200; -#else clOpt.push_back("-D__OPENCL_C_VERSION__=120"); clOpt.push_back("-cl-std=CL1.2"); oclVersion = 120; -#endif } //for clCompilerProgram usage. if(temp_header_path){ @@ -1061,7 +1057,12 @@ EXTEND_QUOTE: clOpt.push_back("-include-pch"); clOpt.push_back(pchFileName); } - + if (oclVersion > maxoclVersion){ + if (err && stringSize > 0 && errSize) { + *errSize = snprintf(err, stringSize, "Requested OpenCL version %lf is higher than maximum supported version %lf\n", (float)oclVersion/100.0,(float)maxoclVersion/100.0); + } + return false; + } return true; } @@ -1076,7 +1077,7 @@ EXTEND_QUOTE: std::vector<std::string> clOpt; std::string dumpLLVMFileName, dumpASMFileName; std::string dumpSPIRBinaryName; - uint32_t oclVersion = 0; + uint32_t oclVersion = MAX_OCLVERSION(deviceID); if (!processSourceAndOption(source, options, NULL, clOpt, dumpLLVMFileName, dumpASMFileName, dumpSPIRBinaryName, optLevel, @@ -1139,7 +1140,7 @@ EXTEND_QUOTE: std::vector<std::string> clOpt; std::string dumpLLVMFileName, dumpASMFileName; std::string dumpSPIRBinaryName; - uint32_t oclVersion = 0; + uint32_t oclVersion = MAX_OCLVERSION(deviceID); if (!processSourceAndOption(source, options, temp_header_path, clOpt, dumpLLVMFileName, dumpASMFileName, dumpSPIRBinaryName, optLevel, stringSize, err, errSize, oclVersion)) diff --git a/src/cl_device_data.h b/src/cl_device_data.h index 4ee4ca3..f3c5204 100644 --- a/src/cl_device_data.h +++ b/src/cl_device_data.h @@ -363,5 +363,7 @@ #define IS_GEN9(devid) (IS_SKYLAKE(devid) || IS_BROXTON(devid) || IS_KABYLAKE(devid)) +#define MAX_OCLVERSION(devid) (IS_GEN9(devid) ? 200 : 120) + #endif /* __CL_DEVICE_DATA_H__ */ diff --git a/src/cl_gen9_device.h b/src/cl_gen9_device.h index be30a49..b0a3ab8 100644 --- a/src/cl_gen9_device.h +++ b/src/cl_gen9_device.h @@ -27,5 +27,7 @@ .max_mem_alloc_size = 4 * 1024 * 1024 * 1024ul, .global_mem_size = 4 * 1024 * 1024 * 1024ul, +#define GEN9_DEVICE 1 #include "cl_gt_device.h" +#undef GEN9_DEVICE diff --git a/src/cl_gt_device.h b/src/cl_gt_device.h index cf5ad7a..9a1c20e 100644 --- a/src/cl_gt_device.h +++ b/src/cl_gt_device.h @@ -16,7 +16,15 @@ * * Author: Benjamin Segovia <[email protected]> */ - +#undef LIBCL_VERSION_STRING +#undef LIBCL_C_VERSION_STRING +#ifdef GEN9_DEVICE +#define LIBCL_VERSION_STRING GEN9_LIBCL_VERSION_STRING +#define LIBCL_C_VERSION_STRING GEN9_LIBCL_C_VERSION_STRING +#else +#define LIBCL_VERSION_STRING NONGEN9_LIBCL_VERSION_STRING +#define LIBCL_C_VERSION_STRING NONGEN9_LIBCL_C_VERSION_STRING +#endif /* Common fields for both all GT devices (IVB / SNB) */ .device_type = CL_DEVICE_TYPE_GPU, .device_id=0,/* == device_id (set when requested) */ @@ -39,7 +47,7 @@ .native_vector_width_float = 4, .native_vector_width_double = 2, .native_vector_width_half = 8, -#ifdef ENABLE_OPENCL_20 +#if defined(ENABLE_OPENCL_20) && defined (GEN9_DEVICE) .address_bits = 64, #else .address_bits = 32, diff --git a/src/cl_platform_id.c b/src/cl_platform_id.c index 1f21f5d..2afafb2 100644 --- a/src/cl_platform_id.c +++ b/src/cl_platform_id.c @@ -32,7 +32,7 @@ static struct _cl_platform_id intel_platform_data = { DECL_INFO_STRING(profile, "FULL_PROFILE") - DECL_INFO_STRING(version, LIBCL_VERSION_STRING) + DECL_INFO_STRING(version, GEN9_LIBCL_VERSION_STRING) DECL_INFO_STRING(name, "Intel Gen OCL Driver") DECL_INFO_STRING(vendor, "Intel") DECL_INFO_STRING(icd_suffix_khr, "Intel") diff --git a/src/cl_platform_id.h b/src/cl_platform_id.h index 3fdb920..89e0857 100644 --- a/src/cl_platform_id.h +++ b/src/cl_platform_id.h @@ -72,8 +72,10 @@ extern cl_int cl_get_platform_ids(cl_uint num_entries, #else #define LIBCL_DRIVER_VERSION_STRING _JOINT(LIBCL_DRIVER_VERSION_MAJOR, LIBCL_DRIVER_VERSION_MINOR) #endif -#define LIBCL_VERSION_STRING "OpenCL " _JOINT(LIBCL_C_VERSION_MAJOR, LIBCL_C_VERSION_MINOR) " beignet " LIBCL_DRIVER_VERSION_STRING BEIGNET_GIT_SHA1_STRING -#define LIBCL_C_VERSION_STRING "OpenCL C " _JOINT(LIBCL_C_VERSION_MAJOR, LIBCL_C_VERSION_MINOR) " beignet " LIBCL_DRIVER_VERSION_STRING BEIGNET_GIT_SHA1_STRING +#define GEN9_LIBCL_VERSION_STRING "OpenCL " _JOINT(LIBCL_C_VERSION_MAJOR, LIBCL_C_VERSION_MINOR) " beignet " LIBCL_DRIVER_VERSION_STRING BEIGNET_GIT_SHA1_STRING +#define GEN9_LIBCL_C_VERSION_STRING "OpenCL C " _JOINT(LIBCL_C_VERSION_MAJOR, LIBCL_C_VERSION_MINOR) " beignet " LIBCL_DRIVER_VERSION_STRING BEIGNET_GIT_SHA1_STRING +#define NONGEN9_LIBCL_VERSION_STRING "OpenCL 1.2 beignet " LIBCL_DRIVER_VERSION_STRING BEIGNET_GIT_SHA1_STRING +#define NONGEN9_LIBCL_C_VERSION_STRING "OpenCL C 1.2 beignet " LIBCL_DRIVER_VERSION_STRING BEIGNET_GIT_SHA1_STRING #endif /* __CL_PLATFORM_ID_H__ */ -- 2.7.4 _______________________________________________ Beignet mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/beignet
