[Beignet] [PATCH] GBE: try to avoid bank conflict in register allocator.

Song, Ruiling ruiling.song at intel.com
Wed Apr 27 07:45:27 UTC 2016


I have fix them and send v2. Thanks!

> -----Original Message-----
> From: Luo, Xionghu
> Sent: Wednesday, April 27, 2016 3:18 PM
> To: Song, Ruiling <ruiling.song at intel.com>; beignet at lists.freedesktop.org
> Cc: Song, Ruiling <ruiling.song at intel.com>
> Subject: RE: [Beignet] [PATCH] GBE: try to avoid bank conflict in register
> allocator.
> 
> Seems some build warnings and errors. Please double check.
> 
> Luo Xionghu
> Best Regards
> 
> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> Ruiling Song
> Sent: Monday, January 1, 2001 12:58 PM
> To: beignet at lists.freedesktop.org
> Cc: Song, Ruiling <ruiling.song at intel.com>
> Subject: [Beignet] [PATCH] GBE: try to avoid bank conflict in register allocator.
> 
> Signed-off-by: Ruiling Song <ruiling.song at intel.com>
> ---
>  backend/src/backend/gen_reg_allocation.cpp | 31
> ++++++++++++++++++++++++++++--
>  1 file changed, 29 insertions(+), 2 deletions(-)
> 
> diff --git a/backend/src/backend/gen_reg_allocation.cpp
> b/backend/src/backend/gen_reg_allocation.cpp
> index 89c53d4..ccb76a1 100644
> --- a/backend/src/backend/gen_reg_allocation.cpp
> +++ b/backend/src/backend/gen_reg_allocation.cpp
> @@ -35,6 +35,7 @@
>  #include <iomanip>
> 
> 
> +#define HALF_REGISTER_FILE_OFFSET (32*64)
>  namespace gbe
>  {
>    /////////////////////////////////////////////////////////////////////////////
> @@ -48,8 +49,9 @@ namespace gbe
>     */
>    struct GenRegInterval {
>      INLINE GenRegInterval(ir::Register reg) :
> -      reg(reg), minID(INT_MAX), maxID(-INT_MAX) {}
> +      reg(reg), minID(INT_MAX), maxID(-INT_MAX), conflictReg(0) {}
>      ir::Register reg;     //!< (virtual) register of the interval
> +    ir::Register conflictReg;
>      int32_t minID, maxID; //!< Starting and ending points
>    };
> 
> @@ -1052,7 +1054,17 @@ namespace gbe
>      // and the source is a scalar Dword. If that is the case, the byte register
>      // must get 4byte alignment register offset.
>      alignment = (alignment + 3) & ~3;
> -    while ((grfOffset = ctx.allocate(size, alignment)) == 0) {
> +
> +    bool direction = true;
> +    if (interval.conflictReg != 0) {
> +      // try to allocate conflict registers in top/bottom half.
> +      if (RA.contains(interval.conflictReg)) {
> +        if (RA.find(interval.conflictReg)->second < HALF_REGISTER_FILE_OFFSE) {
> +          direction = false;
> +        }
> +      }
> +    }
> +    while ((grfOffset = ctx.allocate(size, alignment, direction)) == 0)
> + {
>        const bool success = this->expireGRF(interval);
>        if (success == false) {
>          if (spillAtInterval(interval, size, alignment) == false) @@ -1104,6 +1116,7
> @@ namespace gbe
>        for (auto &insn : block.insnList) {
>          const uint32_t srcNum = insn.srcNum, dstNum = insn.dstNum;
>          insn.ID  = insnID;
> +        bool is3SrcOp = insn.opcode == SELECTION_OP_MAD;
>          for (uint32_t srcID = 0; srcID < srcNum; ++srcID) {
>            const GenRegister &selReg = insn.src(srcID);
>            const ir::Register reg = selReg.reg(); @@ -1113,6 +1126,20 @@
> namespace gbe
>                reg == ir::ocl::groupid1  ||
>                reg == ir::ocl::groupid2)
>              continue;
> +          ir::Register conflictReg = ir::Register(0);
> +          if (is3SrcOp) {
> +            if (srcID == 1)
> +              conflictReg = insn.src(2).reg();
> +            else if (srcID == 2)
> +              conflictReg = insn.src(1).reg();
> +          }
> +          // we only let it conflict with one register, and with smaller reg number,
> +          // as smaller virtual register usually comes first,
> +          // and linear scan allocator allocate from smaller to larger register
> +          // so, conflict with larger register number will not make any effect.
> +          if (this->intervals[reg].conflictReg == 0 ||
> +              this->intervals[reg].conflictReg > conflictReg)
> +          this->intervals[reg].conflictReg = conflictReg;
>            this->intervals[reg].minID = std::min(this->intervals[reg].minID, insnID);
>            this->intervals[reg].maxID = std::max(this->intervals[reg].maxID, insnID);
>          }
> --
> 2.4.1
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list