[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