[Beignet] Building beignet with OpenCL 2.0 support in distros

Igor Gnatenko ignatenkobrain at fedoraproject.org
Sat Jan 21 17:58:29 UTC 2017


On Sat, 2017-01-21 at 17:39 +0000, Rebecca N. Palmer wrote:
> > I have a first attempt at "enable/disable 2.0 at run time" written,
> > but haven't yet tested it. 
> 
> It worked for me, and here it is; testing on other hardware (in
> particular, hardware that supports 2.0: the last 15 tests of the test
> suite appear to be the ones that test that) would be appreciated.
> 
> (Upstream may not want to take this as-is, as it doesn't scale very
> well to more than one 2.0-supporting hardware generation: it's
> intended as a quick relatively-low-risk fix for packagers.)
Thanks a lot for patch! I've applied it in Fedora: https://src.fedorapr
oject.org/cgit/rpms/beignet.git/commit/?h=master&id=4280d7eeb53ca94aae0
d81b7820a347536a1866a

CC me for anything related ;)
> 
> Signed-off-by: Rebecca N. Palmer <rebecca_palmer at zoho.com>
> 
> --- beignet-1.3.0.orig/CMakeLists.txt
> +++ beignet-1.3.0/CMakeLists.txt
> @@ -231,19 +231,8 @@ IF (EXPERIMENTAL_DOUBLE)
>    ADD_DEFINITIONS(-DENABLE_FP64)
>  ENDIF(EXPERIMENTAL_DOUBLE)
>  
> -OPTION(ENABLE_OPENCL_20 "Enable opencl 2.0 support" OFF)
> +OPTION(ENABLE_OPENCL_20 "Enable opencl 2.0 support" ON)
>  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)
>  
>    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.")
> --- beignet-1.3.0.orig/backend/src/backend/program.cpp
> +++ beignet-1.3.0/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__)
> @@ -1023,14 +1025,18 @@ EXTEND_QUOTE:
>  
>      if (useDefaultCLCVersion) {
>  #ifdef ENABLE_OPENCL_20
> +      if(maxoclVersion >= 200){
> +#else
> +      if(0){
> +#endif
>        clOpt.push_back("-D__OPENCL_C_VERSION__=200");
>        clOpt.push_back("-cl-std=CL2.0");
>        oclVersion = 200;
> -#else
> +      }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 +1067,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 +1087,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 +1150,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))
> --- beignet-1.3.0.orig/src/cl_device_data.h
> +++ beignet-1.3.0/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__ */
>  
> --- beignet-1.3.0.orig/src/cl_gen9_device.h
> +++ beignet-1.3.0/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
>  
> --- beignet-1.3.0.orig/src/cl_gt_device.h
> +++ beignet-1.3.0/src/cl_gt_device.h
> @@ -16,7 +16,13 @@
>   *
>   * Author: Benjamin Segovia <benjamin.segovia at intel.com>
>   */
> -
> +#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 +45,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,
> --- beignet-1.3.0.orig/src/cl_platform_id.c
> +++ beignet-1.3.0/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")
> --- beignet-1.3.0.orig/src/cl_platform_id.h
> +++ beignet-1.3.0/src/cl_platform_id.h
> @@ -72,8 +72,10 @@ extern cl_int cl_get_platform_ids(cl_uin
>  #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__ */
>  
> 

-- 
-Igor Gnatenko


More information about the Beignet mailing list