[Beignet] [PATCH] SKL: Fix opencv perf hang.

Zhigang Gong zhigang.gong at linux.intel.com
Tue Feb 10 17:44:13 PST 2015


LGTM, will push latter, thanks.

On Tue, Feb 10, 2015 at 05:01:23PM +0800, Yang Rong wrote:
> SKL has 32 barrier per subslice, and R2.0 add a bit to "Barrier ID MSB" for it.
> So need and 0x8f000000 to get barrier id.
> 
> Fix opencv hange:
> opencv_perf_imgproc/OCL_ImgSize_TmplSize_Method_MatType_MatchTemplate
> opencv_perf_imgproc/OCL_MomentsFixture_Moments
> 
> Signed-off-by: Yang Rong <rong.r.yang at intel.com>
> ---
>  backend/src/backend/gen9_context.cpp | 26 ++++++++++++++++++++++++++
>  backend/src/backend/gen9_context.hpp |  1 +
>  backend/src/backend/gen_context.hpp  |  2 +-
>  3 files changed, 28 insertions(+), 1 deletion(-)
> 
> diff --git a/backend/src/backend/gen9_context.cpp b/backend/src/backend/gen9_context.cpp
> index b47ae2a..326f5a1 100644
> --- a/backend/src/backend/gen9_context.cpp
> +++ b/backend/src/backend/gen9_context.cpp
> @@ -28,4 +28,30 @@ namespace gbe
>    void Gen9Context::newSelection(void) {
>      this->sel = GBE_NEW(Selection9, *this);
>    }
> +
> +  void Gen9Context::emitBarrierInstruction(const SelectionInstruction &insn) {
> +    const GenRegister src = ra->genReg(insn.src(0));
> +    const GenRegister fenceDst = ra->genReg(insn.dst(0));
> +    uint32_t barrierType = insn.extra.barrierType;
> +    const GenRegister barrierId = ra->genReg(GenRegister::ud1grf(ir::ocl::barrierid));
> +
> +    if (barrierType == ir::syncGlobalBarrier) {
> +      p->FENCE(fenceDst);
> +      p->MOV(fenceDst, fenceDst);
> +    }
> +    p->push();
> +      // As only the payload.2 is used and all the other regions are ignored
> +      // SIMD8 mode here is safe.
> +      p->curr.execWidth = 8;
> +      p->curr.physicalFlag = 0;
> +      p->curr.noMask = 1;
> +      // Copy barrier id from r0.
> +      p->AND(src, barrierId, GenRegister::immud(0x8f000000));
> +      // A barrier is OK to start the thread synchronization *and* SLM fence
> +      p->BARRIER(src);
> +      p->curr.execWidth = 1;
> +      // Now we wait for the other threads
> +      p->WAIT();
> +    p->pop();
> +  }
>  }
> diff --git a/backend/src/backend/gen9_context.hpp b/backend/src/backend/gen9_context.hpp
> index 4123414..8acad8c 100644
> --- a/backend/src/backend/gen9_context.hpp
> +++ b/backend/src/backend/gen9_context.hpp
> @@ -36,6 +36,7 @@ namespace gbe
>      Gen9Context(const ir::Unit &unit, const std::string &name, uint32_t deviceID, bool relaxMath = false)
>              : Gen8Context(unit, name, deviceID, relaxMath) {
>      };
> +    virtual void emitBarrierInstruction(const SelectionInstruction &insn);
>  
>    protected:
>      virtual GenEncoder* generateEncoder(void) {
> diff --git a/backend/src/backend/gen_context.hpp b/backend/src/backend/gen_context.hpp
> index c68e6cf..f64b916 100644
> --- a/backend/src/backend/gen_context.hpp
> +++ b/backend/src/backend/gen_context.hpp
> @@ -145,7 +145,7 @@ namespace gbe
>      void emitEotInstruction(const SelectionInstruction &insn);
>      void emitNoOpInstruction(const SelectionInstruction &insn);
>      void emitWaitInstruction(const SelectionInstruction &insn);
> -    void emitBarrierInstruction(const SelectionInstruction &insn);
> +    virtual void emitBarrierInstruction(const SelectionInstruction &insn);
>      void emitFenceInstruction(const SelectionInstruction &insn);
>      void emitMathInstruction(const SelectionInstruction &insn);
>      virtual void emitRead64Instruction(const SelectionInstruction &insn);
> -- 
> 1.8.3.2
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list