From c04d5e7efa7c47a2919f7af4a2b3ecbc0ee632fa Mon Sep 17 00:00:00 2001 From: Serge Martin Date: Sun, 27 Sep 2020 15:45:33 +0200 Subject: [PATCH] clover: implements clGetKernelWorkGroupInfo CL_KERNEL_COMPILE_WORK_GROUP_SIZE Reviewed-by: Francisco Jerez Part-of: --- src/gallium/frontends/clover/core/kernel.cpp | 2 +- src/gallium/frontends/clover/core/module.cpp | 1 + src/gallium/frontends/clover/core/module.hpp | 6 +++++- src/gallium/frontends/clover/llvm/codegen/common.cpp | 11 +++++++++++ src/gallium/frontends/clover/nir/invocation.cpp | 3 ++- src/gallium/frontends/clover/spirv/invocation.cpp | 3 ++- 6 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/gallium/frontends/clover/core/kernel.cpp b/src/gallium/frontends/clover/core/kernel.cpp index 56d30eda655..4cc12147ee7 100644 --- a/src/gallium/frontends/clover/core/kernel.cpp +++ b/src/gallium/frontends/clover/core/kernel.cpp @@ -140,7 +140,7 @@ kernel::optimal_block_size(const command_queue &q, std::vector kernel::required_block_size() const { - return { 0, 0, 0 }; + return find(name_equals(_name), program().symbols()).reqd_work_group_size; } kernel::argument_range diff --git a/src/gallium/frontends/clover/core/module.cpp b/src/gallium/frontends/clover/core/module.cpp index aa7d3d06570..b9510168558 100644 --- a/src/gallium/frontends/clover/core/module.cpp +++ b/src/gallium/frontends/clover/core/module.cpp @@ -191,6 +191,7 @@ namespace { proc(S &s, QT &x) { _proc(s, x.name); _proc(s, x.attributes); + _proc(s, x.reqd_work_group_size); _proc(s, x.section); _proc(s, x.offset); _proc(s, x.args); diff --git a/src/gallium/frontends/clover/core/module.hpp b/src/gallium/frontends/clover/core/module.hpp index 6117f7fb9ed..92c090f70d7 100644 --- a/src/gallium/frontends/clover/core/module.hpp +++ b/src/gallium/frontends/clover/core/module.hpp @@ -129,15 +129,19 @@ namespace clover { struct symbol { symbol(const std::string &name, const std::string &attributes, + const std::vector<::size_t> &reqd_work_group_size, resource_id section, size_t offset, const std::vector &args) : name(name), attributes(attributes), + reqd_work_group_size(reqd_work_group_size), section(section), offset(offset), args(args) { } - symbol() : name(), attributes(), section(0), offset(0), args() { } + symbol() : name(), attributes(), reqd_work_group_size({0, 0, 0}), + section(0), offset(0), args() { } std::string name; std::string attributes; + std::vector<::size_t> reqd_work_group_size; resource_id section; size_t offset; std::vector args; diff --git a/src/gallium/frontends/clover/llvm/codegen/common.cpp b/src/gallium/frontends/clover/llvm/codegen/common.cpp index 0cb71482ab6..cb2a9f67f35 100644 --- a/src/gallium/frontends/clover/llvm/codegen/common.cpp +++ b/src/gallium/frontends/clover/llvm/codegen/common.cpp @@ -103,6 +103,16 @@ namespace { cl_address_qualifier, cl_access_qualifier); } + std::vector + get_reqd_work_group_size(const Module &mod, + const std::string &kernel_name) { + const Function &f = *mod.getFunction(kernel_name); + auto vector_metadata = get_uint_vector_kernel_metadata(f, "reqd_work_group_size"); + + return vector_metadata.empty() ? std::vector({0, 0, 0}) : vector_metadata; + } + + std::string kernel_attributes(const Module &mod, const std::string &kernel_name) { std::vector attributes; @@ -285,6 +295,7 @@ clover::llvm::build_module_common(const Module &mod, const ::std::string name(llvm_name); if (offsets.count(name)) m.syms.emplace_back(name, kernel_attributes(mod, name), + get_reqd_work_group_size(mod, name), 0, offsets.at(name), make_kernel_args(mod, name, c)); } diff --git a/src/gallium/frontends/clover/nir/invocation.cpp b/src/gallium/frontends/clover/nir/invocation.cpp index 991ebd694e6..bb278954f13 100644 --- a/src/gallium/frontends/clover/nir/invocation.cpp +++ b/src/gallium/frontends/clover/nir/invocation.cpp @@ -390,7 +390,8 @@ module clover::nir::spirv_to_nir(const module &mod, const device &dev, reinterpret_cast(&header) + sizeof(header)); text.data.insert(text.data.end(), blob.data, blob.data + blob.size); - m.syms.emplace_back(sym.name, std::string(), section_id, 0, args); + m.syms.emplace_back(sym.name, std::string(), + std::vector(), section_id, 0, args); m.secs.push_back(text); section_id++; } diff --git a/src/gallium/frontends/clover/spirv/invocation.cpp b/src/gallium/frontends/clover/spirv/invocation.cpp index eaf99fac202..2b9caf178ba 100644 --- a/src/gallium/frontends/clover/spirv/invocation.cpp +++ b/src/gallium/frontends/clover/spirv/invocation.cpp @@ -346,7 +346,8 @@ namespace { case SpvOpFunctionEnd: if (kernel_name.empty()) break; - m.syms.emplace_back(kernel_name, std::string(), 0, kernel_nb, args); + m.syms.emplace_back(kernel_name, std::string(), + std::vector(), 0, kernel_nb, args); ++kernel_nb; kernel_name.clear(); args.clear();