[Mesa-dev] [PATCH] clover: Allow OpenCL version override

Jan Vesely jan.vesely at rutgers.edu
Thu Oct 6 17:15:57 UTC 2016


On Thu, 2016-10-06 at 16:26 +0200, Vedran Miletić wrote:
> CLOVER_CL_VERSION_OVERRIDE allows overriding default OpenCL version
> supported by Clover, analogous to MESA_GL_VERSION_OVERRIDE for
> OpenGL.
> CLOVER_CL_C_VERSION_OVERRIDE allows overridng default OpenCL C
> version.

WHat's the use of CL_C_VERSION_OVERRIDE? as implemented it only
modifies behaviour of the device API query. The specs say that it's
also the default value of -cl-std used by the compiler. does it makes
sense to add "cl-std=" option if CLOVER_CL_C_VERSION_OVERRIDE is
present?

Jan

> ---
>  docs/envvars.html                                     | 12
> ++++++++++++
>  src/gallium/state_trackers/clover/api/device.cpp      |  4 ++--
>  src/gallium/state_trackers/clover/api/platform.cpp    |  4 ++--
>  src/gallium/state_trackers/clover/core/device.cpp     | 19
> +++++++++++++++++++
>  src/gallium/state_trackers/clover/core/device.hpp     |  4 ++++
>  src/gallium/state_trackers/clover/core/platform.cpp   |  9 +++++++++
>  src/gallium/state_trackers/clover/core/platform.hpp   |  3 +++
>  src/gallium/state_trackers/clover/core/program.cpp    |  4 +++-
>  src/gallium/state_trackers/clover/llvm/invocation.cpp | 18
> ++++++++++++++----
>  src/gallium/state_trackers/clover/llvm/invocation.hpp |  1 +
>  src/gallium/state_trackers/clover/llvm/util.hpp       |  4 ++--
>  11 files changed, 71 insertions(+), 11 deletions(-)
> 
> diff --git a/docs/envvars.html b/docs/envvars.html
> index cf57ca5..f76827b 100644
> --- a/docs/envvars.html
> +++ b/docs/envvars.html
> @@ -235,6 +235,18 @@ Setting to "tgsi", for example, will print all
> the TGSI shaders.
>  See src/mesa/state_tracker/st_debug.c for other options.
>  </ul>
>  
> +<h3>Clover state tracker environment variables</h3>
> +
> +<ul>
> +<li>CLOVER_CL_VERSION_OVERRIDE - allows overriding OpenCL version
> returned by
> +    clGetPlatformInfo(CL_PLATFORM_VERSION) and
> +    clGetDeviceInfo(CL_DEVICE_VERSION). Note that the setting sets
> the version
> +    of the platform and all the devices to the same value.
> +<li>CLOVER_CL_C_VERSION_OVERRIDE - allows overriding OpenCL C
> version reported
> +    by clGetDeviceInfo(CL_DEVICE_OPENCL_C_VERSION) and the value of
> the
> +    __OPENCL_VERSION__ macro in the OpenCL compiler.
> +</ul>
> +
>  <h3>Softpipe driver environment variables</h3>
>  <ul>
>  <li>SOFTPIPE_DUMP_FS - if set, the softpipe driver will print
> fragment shaders
> diff --git a/src/gallium/state_trackers/clover/api/device.cpp
> b/src/gallium/state_trackers/clover/api/device.cpp
> index f7bd61b..e23de7a 100644
> --- a/src/gallium/state_trackers/clover/api/device.cpp
> +++ b/src/gallium/state_trackers/clover/api/device.cpp
> @@ -301,7 +301,7 @@ clGetDeviceInfo(cl_device_id d_dev,
> cl_device_info param,
>        break;
>  
>     case CL_DEVICE_VERSION:
> -      buf.as_string() = "OpenCL 1.1 Mesa " PACKAGE_VERSION
> +      buf.as_string() = "OpenCL " + dev.opencl_version() + " Mesa "
> PACKAGE_VERSION
>  #ifdef MESA_GIT_SHA1
>                          " (" MESA_GIT_SHA1 ")"
>  #endif
> @@ -355,7 +355,7 @@ clGetDeviceInfo(cl_device_id d_dev,
> cl_device_info param,
>        break;
>  
>     case CL_DEVICE_OPENCL_C_VERSION:
> -      buf.as_string() = "OpenCL C 1.1 ";
> +      buf.as_string() = "OpenCL C " + dev.opencl_c_version() + " ";
>        break;
>  
>     case CL_DEVICE_PARENT_DEVICE:
> diff --git a/src/gallium/state_trackers/clover/api/platform.cpp
> b/src/gallium/state_trackers/clover/api/platform.cpp
> index b1b1fdf..f344ec8 100644
> --- a/src/gallium/state_trackers/clover/api/platform.cpp
> +++ b/src/gallium/state_trackers/clover/api/platform.cpp
> @@ -50,7 +50,7 @@ clover::GetPlatformInfo(cl_platform_id d_platform,
> cl_platform_info param,
>                          size_t size, void *r_buf, size_t *r_size)
> try {
>     property_buffer buf { r_buf, size, r_size };
>  
> -   obj(d_platform);
> +   auto &platform = obj(d_platform);
>  
>     switch (param) {
>     case CL_PLATFORM_PROFILE:
> @@ -58,7 +58,7 @@ clover::GetPlatformInfo(cl_platform_id d_platform,
> cl_platform_info param,
>        break;
>  
>     case CL_PLATFORM_VERSION:
> -      buf.as_string() = "OpenCL 1.1 Mesa " PACKAGE_VERSION
> +      buf.as_string() = "OpenCL " + platform.opencl_version() + "
> Mesa " PACKAGE_VERSION
>  #ifdef MESA_GIT_SHA1
>                          " (" MESA_GIT_SHA1 ")"
>  #endif
> diff --git a/src/gallium/state_trackers/clover/core/device.cpp
> b/src/gallium/state_trackers/clover/core/device.cpp
> index 8825f99..fce6fb3 100644
> --- a/src/gallium/state_trackers/clover/core/device.cpp
> +++ b/src/gallium/state_trackers/clover/core/device.cpp
> @@ -24,6 +24,7 @@
>  #include "core/platform.hpp"
>  #include "pipe/p_screen.h"
>  #include "pipe/p_state.h"
> +#include "util/u_debug.h"
>  
>  using namespace clover;
>  
> @@ -48,6 +49,14 @@ device::device(clover::platform &platform,
> pipe_loader_device *ldev) :
>           pipe->destroy(pipe);
>        throw error(CL_INVALID_DEVICE);
>     }
> +
> +   const std::string cl_version_override =
> +                             debug_get_option("CLOVER_CL_VERSION_OVE
> RRIDE", "");
> +   ocl_version = !cl_version_override.empty() ? cl_version_override
> : "1.1";
> +
> +   const std::string clc_version_override =
> +                            debug_get_option("CLOVER_CLC_VERSION_OVE
> RRIDE", "");
> +   oclc_version = !clc_version_override.empty() ?
> clc_version_override : "1.1";
>  }
>  
>  device::~device() {
> @@ -209,6 +218,16 @@ device::vendor_name() const {
>     return pipe->get_device_vendor(pipe);
>  }
>  
> +std::string
> +device::opencl_version() const {
> +    return ocl_version;
> +}
> +
> +std::string
> +device::opencl_c_version() const {
> +    return oclc_version;
> +}
> +
>  enum pipe_shader_ir
>  device::ir_format() const {
>     return (enum pipe_shader_ir) pipe->get_shader_param(
> diff --git a/src/gallium/state_trackers/clover/core/device.hpp
> b/src/gallium/state_trackers/clover/core/device.hpp
> index 6cf6c7f..b71cafd 100644
> --- a/src/gallium/state_trackers/clover/core/device.hpp
> +++ b/src/gallium/state_trackers/clover/core/device.hpp
> @@ -71,6 +71,8 @@ namespace clover {
>        cl_uint address_bits() const;
>        std::string device_name() const;
>        std::string vendor_name() const;
> +      std::string opencl_version() const;
> +      std::string opencl_c_version() const;
>        enum pipe_shader_ir ir_format() const;
>        std::string ir_target() const;
>        enum pipe_endian endianness() const;
> @@ -86,6 +88,8 @@ namespace clover {
>     private:
>        pipe_screen *pipe;
>        pipe_loader_device *ldev;
> +      std::string ocl_version;
> +      std::string oclc_version;
>     };
>  }
>  
> diff --git a/src/gallium/state_trackers/clover/core/platform.cpp
> b/src/gallium/state_trackers/clover/core/platform.cpp
> index 489e8dc..c5d47f0 100644
> --- a/src/gallium/state_trackers/clover/core/platform.cpp
> +++ b/src/gallium/state_trackers/clover/core/platform.cpp
> @@ -21,6 +21,7 @@
>  //
>  
>  #include "core/platform.hpp"
> +#include "util/u_debug.h"
>  
>  using namespace clover;
>  
> @@ -38,4 +39,12 @@ platform::platform() : adaptor_range(evals(),
> devs) {
>           pipe_loader_release(&ldev, 1);
>        }
>     }
> +
> +   const std::string cl_version_override =
> +                             debug_get_option("CLOVER_CL_VERSION_OVE
> RRIDE", "");
> +   ocl_version = !cl_version_override.empty() ? cl_version_override
> : "1.1";
> +}
> +
> +std::string platform::opencl_version() {
> +    return ocl_version;
>  }
> diff --git a/src/gallium/state_trackers/clover/core/platform.hpp
> b/src/gallium/state_trackers/clover/core/platform.hpp
> index e849645..b283044 100644
> --- a/src/gallium/state_trackers/clover/core/platform.hpp
> +++ b/src/gallium/state_trackers/clover/core/platform.hpp
> @@ -40,8 +40,11 @@ namespace clover {
>        platform &
>        operator=(const platform &platform) = delete;
>  
> +      std::string opencl_version();
> +
>     protected:
>        std::vector<intrusive_ref<device>> devs;
> +      std::string ocl_version;
>     };
>  }
>  
> diff --git a/src/gallium/state_trackers/clover/core/program.cpp
> b/src/gallium/state_trackers/clover/core/program.cpp
> index 79ac851..0cb5e77 100644
> --- a/src/gallium/state_trackers/clover/core/program.cpp
> +++ b/src/gallium/state_trackers/clover/core/program.cpp
> @@ -54,7 +54,9 @@ program::compile(const ref_vector<device> &devs,
> const std::string &opts,
>              const module m = (dev.ir_format() == PIPE_SHADER_IR_TGSI
> ?
>                                tgsi::compile_program(_source, log) :
>                                llvm::compile_program(_source,
> headers,
> -                                                    dev.ir_target(),
> opts, log));
> +                                                    dev.ir_target(),
> +                                                    dev.opencl_c_ver
> sion(),
> +                                                    opts, log));
>              _builds[&dev] = { m, opts, log };
>           } catch (...) {
>              _builds[&dev] = { module(), opts, log };
> diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp
> b/src/gallium/state_trackers/clover/llvm/invocation.cpp
> index b5e8b52..2a47acf 100644
> --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
> +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
> @@ -24,6 +24,8 @@
>  // OTHER DEALINGS IN THE SOFTWARE.
>  //
>  
> +#include <cassert>
> +
>  #include <llvm/IR/DiagnosticPrinter.h>
>  #include <llvm/IR/DiagnosticInfo.h>
>  #include <llvm/IR/LLVMContext.h>
> @@ -139,7 +141,8 @@ namespace {
>     compile(LLVMContext &ctx, clang::CompilerInstance &c,
>             const std::string &name, const std::string &source,
>             const header_map &headers, const std::string &target,
> -           const std::string &opts, std::string &r_log) {
> +           const std::string &opencl_version, const std::string
> &opts,
> +           std::string &r_log) {
>        c.getFrontendOpts().ProgramAction =
> clang::frontend::EmitLLVMOnly;
>        c.getHeaderSearchOpts().UseBuiltinIncludes = true;
>        c.getHeaderSearchOpts().UseStandardSystemIncludes = true;
> @@ -154,7 +157,13 @@ namespace {
>        c.getPreprocessorOpts().Includes.push_back("clc/clc.h");
>  
>        // Add definition for the OpenCL version
> -      c.getPreprocessorOpts().addMacroDef("__OPENCL_VERSION__=110");
> +      auto ocl_version_major_minor = tokenize(opencl_version, '.');
> +      assert(ocl_version_major_minor.size() == 2);
> +      int ocl_version_major = stoi(ocl_version_major_minor[0]);
> +      int ocl_version_minor = stoi(ocl_version_major_minor[1]);
> +      int ocl_version_number = ocl_version_major * 100 +
> ocl_version_minor * 10;
> +      c.getPreprocessorOpts().addMacroDef("__OPENCL_VERSION__=" +
> +                                          std::to_string(ocl_version
> _number));
>  
>        // clc.h requires that this macro be defined:
>        c.getPreprocessorOpts().addMacroDef("cl_clang_storage_class_sp
> ecifiers");
> @@ -197,6 +206,7 @@ module
>  clover::llvm::compile_program(const std::string &source,
>                                const header_map &headers,
>                                const std::string &target,
> +                              const std::string &opencl_version,
>                                const std::string &opts,
>                                std::string &r_log) {
>     if (has_flag(debug::clc))
> @@ -205,8 +215,8 @@ clover::llvm::compile_program(const std::string
> &source,
>     auto ctx = create_context(r_log);
>     auto c = create_compiler_instance(target, tokenize(opts + "
> input.cl"),
>                                       r_log);
> -   auto mod = compile(*ctx, *c, "input.cl", source, headers, target,
> opts,
> -                      r_log);
> +   auto mod = compile(*ctx, *c, "input.cl", source, headers, target,
> +                      opencl_version, opts, r_log);
>  
>     if (has_flag(debug::llvm))
>        debug::log(".ll", print_module_bitcode(*mod));
> diff --git a/src/gallium/state_trackers/clover/llvm/invocation.hpp
> b/src/gallium/state_trackers/clover/llvm/invocation.hpp
> index 5b3530c..2493cbf 100644
> --- a/src/gallium/state_trackers/clover/llvm/invocation.hpp
> +++ b/src/gallium/state_trackers/clover/llvm/invocation.hpp
> @@ -33,6 +33,7 @@ namespace clover {
>        module compile_program(const std::string &source,
>                               const header_map &headers,
>                               const std::string &target,
> +                             const std::string &opencl_version,
>                               const std::string &opts,
>                               std::string &r_log);
>  
> diff --git a/src/gallium/state_trackers/clover/llvm/util.hpp
> b/src/gallium/state_trackers/clover/llvm/util.hpp
> index 8db6f20..fd47d3a 100644
> --- a/src/gallium/state_trackers/clover/llvm/util.hpp
> +++ b/src/gallium/state_trackers/clover/llvm/util.hpp
> @@ -40,12 +40,12 @@ namespace clover {
>        }
>  
>        inline std::vector<std::string>
> -      tokenize(const std::string &s) {
> +      tokenize(const std::string &s, const char sep = ' ') {
>           std::vector<std::string> ss;
>           std::istringstream iss(s);
>           std::string t;
>  
> -         while (getline(iss, t, ' '))
> +         while (getline(iss, t, sep))
>              ss.push_back(t);
>  
>           return ss;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20161006/e00087aa/attachment.sig>


More information about the mesa-dev mailing list