Because use -cl-std=CL1.2 by default when OpenCL 2.0 enabled, I prefer to 
always report address_bits = 32 now.
OpenCL spec consider only one address bits in one device, but when GEN9 now 
support both 32 bits and 64 bits address, so there is no way to comply with 
spec.
I think we could change both GEN9's OpenCL 1.2 and Open2.0 address to 64 bits 
after there is no obvious performance drop.

An other issue is that beignet OpenCL 2.0 don't support i386 system now, maybe 
we also need set CAN_OPENCL_20 to off in i386 system.

And also need to update readme after this patch merged.

The other part of the patchset LGTM. 

> -----Original Message-----
> From: Beignet [mailto:beignet-boun...@lists.freedesktop.org] On Behalf Of
> Xiuli Pan
> Sent: Tuesday, January 24, 2017 16:48
> To: beignet@lists.freedesktop.org
> Cc: Pan, Xiuli <xiuli....@intel.com>
> Subject: [Beignet] [PATCH 5/5] Enable OpenCL 2.0 only where supported
> 
> From: Pan Xiuli <xiuli....@intel.com>
> 
> 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.
> 
> Contributor: Rebecca N. Palmer <rebecca_pal...@zoho.com>
> Signed-off-by: Pan Xiuli <xiuli....@intel.com>
> ---
>  CMakeLists.txt                  | 39 +++++++++++++++++++++++++--------------
>  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, 54 insertions(+), 28 deletions(-)
> 
> diff --git a/CMakeLists.txt b/CMakeLists.txt index 59abc45..75af35e 100644
> --- a/CMakeLists.txt
> +++ b/CMakeLists.txt
> @@ -231,20 +231,15 @@ 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 (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) @@ -252,9 +247,25 @@
> IF (ENABLE_OPENCL_20)
>    IF (LLVM_VERSION_NODOT VERSION_LESS 39)
>      MESSAGE(FATAL_ERROR "Please update LLVM to version 3.9 or later to
> enable OpenCL 2.0.")
>    ENDIF (LLVM_VERSION_NODOT VERSION_LESS 39)
> +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)
> -ENDIF(ENABLE_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)
> 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 <benjamin.sego...@intel.com>
>   */
> -
> +#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
> Beignet@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/beignet
_______________________________________________
Beignet mailing list
Beignet@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/beignet

Reply via email to