[Beignet] [PATCH 1/3] Backend: Add intel_reqd_sub_group_size support

Pan, Xiuli xiuli.pan at intel.com
Tue Jun 13 09:03:54 UTC 2017


The spec has required the subgroup size to be 8 or 16, and I think we may need to fail the build in some other place.

-----Original Message-----
From: Yang, Rong R 
Sent: Tuesday, June 13, 2017 16:44
To: Pan, Xiuli <xiuli.pan at intel.com>; beignet at lists.freedesktop.org
Cc: Pan, Xiuli <xiuli.pan at intel.com>
Subject: RE: [Beignet] [PATCH 1/3] Backend: Add intel_reqd_sub_group_size support



> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf 
> Of Xiuli Pan
> Sent: Monday, June 5, 2017 16:28
> To: beignet at lists.freedesktop.org
> Cc: Pan, Xiuli <xiuli.pan at intel.com>
> Subject: [Beignet] [PATCH 1/3] Backend: Add intel_reqd_sub_group_size 
> support
> 
> From: Pan Xiuli <xiuli.pan at intel.com>
> 
> If we get intel_reqd_sub_group_size attribute from frontend then set 
> it to backend.
> 
> Signed-off-by: Pan Xiuli <xiuli.pan at intel.com>
> ---
>  backend/src/backend/context.cpp       |  6 +-----
>  backend/src/backend/gen_program.cpp   | 28 ++++++++++++++++++++----
> ----
>  backend/src/llvm/llvm_gen_backend.cpp | 20 ++++++++++++++++++++
>  3 files changed, 41 insertions(+), 13 deletions(-)
> 
> diff --git a/backend/src/backend/context.cpp 
> b/backend/src/backend/context.cpp index e9ddd17..c9500c8 100644
> --- a/backend/src/backend/context.cpp
> +++ b/backend/src/backend/context.cpp
> @@ -340,7 +340,6 @@ namespace gbe
>    ///////////////////////////////////////////////////////////////////////////
>    // Generic Context (shared by the simulator and the HW context)
>    
> //////////////////////////////////////////////////////////////////////
> /////
> -  IVAR(OCL_SIMD_WIDTH, 8, 15, 16);
> 
>    Context::Context(const ir::Unit &unit, const std::string &name) :
>      unit(unit), fn(*unit.getFunction(name)), name(name), 
> liveness(NULL), dag(NULL), useDWLabel(false) @@ -361,10 +360,7 @@ namespace gbe
>    }
> 
>    void Context::startNewCG(uint32_t simdWidth) {
> -    if (simdWidth == 0 || OCL_SIMD_WIDTH != 15)
> -      this->simdWidth = nextHighestPowerOf2(OCL_SIMD_WIDTH);
> -    else
> -      this->simdWidth = simdWidth;
> +    this->simdWidth = simdWidth;
>      GBE_SAFE_DELETE(this->registerAllocator);
>      GBE_SAFE_DELETE(this->scratchAllocator);
>      GBE_ASSERT(dag != NULL && liveness != NULL); diff --git 
> a/backend/src/backend/gen_program.cpp
> b/backend/src/backend/gen_program.cpp
> index c1827b1..26b646a 100644
> --- a/backend/src/backend/gen_program.cpp
> +++ b/backend/src/backend/gen_program.cpp
> @@ -59,6 +59,7 @@
>  #include <clang/CodeGen/CodeGenAction.h>  #endif
> 
> +#include "sys/cvar.hpp"
>  #include <cstring>
>  #include <sstream>
>  #include <memory>
> @@ -138,17 +139,24 @@ namespace gbe {
>    }
> 
>    /*! We must avoid spilling at all cost with Gen */
> -  static const struct CodeGenStrategy {
> +  struct CodeGenStrategy {
>      uint32_t simdWidth;
>      uint32_t reservedSpillRegs;
>      bool limitRegisterPressure;
> -  } codeGenStrategy[] = {
> +  };
> +  static const struct CodeGenStrategy codeGenStrategyDefault[] = {
>      {16, 0, false},
>      {8, 0, false},
>      {8, 8, false},
>      {8, 16, false},
>    };
> +  static const struct CodeGenStrategy codeGenStrategySimd16[] = {
> +    {16, 0, false},
> +    {16, 8, false},
> +    {16, 16, false},
> +  };
> 
> +  IVAR(OCL_SIMD_WIDTH, 8, 15, 16);
>    Kernel *GenProgram::compileKernel(const ir::Unit &unit, const 
> std::string &name,
>                                      bool relaxMath, int profiling) {  
> #ifdef GBE_COMPILER_AVAILABLE @@ -156,19 +164,23 @@ namespace gbe {
>      // when the function already provides the simd width we need to use (i.e.
>      // non zero)
>      const ir::Function *fn = unit.getFunction(name);
> +    const struct CodeGenStrategy* codeGenStrategy = 
> + codeGenStrategyDefault;
>      if(fn == NULL)
>        GBE_ASSERT(0);
> -    uint32_t codeGenNum = sizeof(codeGenStrategy) /
> sizeof(codeGenStrategy[0]);
> +    uint32_t codeGenNum = sizeof(codeGenStrategyDefault) / 
> + sizeof(codeGenStrategyDefault[0]);
>      uint32_t codeGen = 0;
>      GenContext *ctx = NULL;
> -    if (fn->getSimdWidth() == 8) {
> +    if ( fn->getSimdWidth() != 0 && OCL_SIMD_WIDTH != 15) {
> +      GBE_ASSERTM(0, "unsupported SIMD width!");
> +    }else if (fn->getSimdWidth() == 8 || OCL_SIMD_WIDTH == 8) {
>        codeGen = 1;
> -    } else if (fn->getSimdWidth() == 16) {
> -      codeGenNum = 1;
> -    } else if (fn->getSimdWidth() == 0) {
> +    } else if (fn->getSimdWidth() == 16 || OCL_SIMD_WIDTH == 16){
> +      codeGenStrategy = codeGenStrategySimd16;
> +      codeGenNum = 3;
Don't hard the codeGenStrategySimd16's array size here.

> +    } else if (fn->getSimdWidth() == 0 && OCL_SIMD_WIDTH == 15) {
>        codeGen = 0;
>      } else
> -      GBE_ASSERT(0);
> +      GBE_ASSERTM(0, "unsupported SIMD width!");
>      Kernel *kernel = NULL;
> 
>      // Stop when compilation is successful diff --git 
> a/backend/src/llvm/llvm_gen_backend.cpp
> b/backend/src/llvm/llvm_gen_backend.cpp
> index c8e29c5..b2d9b1b 100644
> --- a/backend/src/llvm/llvm_gen_backend.cpp
> +++ b/backend/src/llvm/llvm_gen_backend.cpp
> @@ -2125,6 +2125,7 @@ namespace gbe
>      // Loop over the kernel metadatas to set the required work group size.
>      size_t reqd_wg_sz[3] = {0, 0, 0};
>      size_t hint_wg_sz[3] = {0, 0, 0};
> +    size_t reqd_sg_sz = 0;
>      ir::FunctionArgument::InfoFromLLVM llvmInfo;
>      MDNode *addrSpaceNode = NULL;
>      MDNode *typeNameNode = NULL;
> @@ -2220,6 +2221,23 @@ namespace gbe
>        functionAttributes += buffer;
>        functionAttributes += " ";
>      }
> +    if ((attrNode = F.getMetadata("intel_reqd_sub_group_size"))) {
> +      GBE_ASSERT(attrNode->getNumOperands() == 1);
> +      ConstantInt *sz = mdconst::extract<ConstantInt>(attrNode-
> >getOperand(0));
> +      GBE_ASSERT(sz);
> +      reqd_sg_sz = sz->getZExtValue();
> +      GBE_ASSERT(reqd_sg_sz == 8 || reqd_sg_sz == 16);
I think fail the program building is better then assert.


> +      functionAttributes += "intel_reqd_sub_group_size";
> +      std::stringstream param;
> +      char buffer[100] = {0};
> +      param << "(";
> +      param << reqd_sg_sz;
> +      param << ")";
> +      param >> buffer;
> +      functionAttributes += buffer;
> +      functionAttributes += " ";
> +    }
> +
>  #else
>      /* First find the meta data belong to this function. */
>      MDNode *node = getKernelFunctionMetadata(&F); @@ -2345,6 +2363,8 
> @@ namespace gbe  #endif /* LLVM 3.9 Function metadata */
> 
>      ctx.getFunction().setCompileWorkGroupSize(reqd_wg_sz[0],
> reqd_wg_sz[1], reqd_wg_sz[2]);
> +    if (reqd_sg_sz)
> +      ctx.setSimdWidth(reqd_sg_sz);
> 
>      ctx.getFunction().setFunctionAttributes(functionAttributes);
>      // Loop over the arguments and output registers for them
> --
> 2.7.4
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list