[Mesa-dev] [PATCH 05/11] intel/compiler: Use null destination register for memory fence messages

Francisco Jerez currojerez at riseup.net
Wed Mar 21 21:56:58 UTC 2018


Matt Turner <mattst88 at gmail.com> writes:

> From Message Descriptor section in gfxspecs:
>
>   "Memory fence messages without Commit Enable set do not return
>    anything to the thread (response length is 0 and destination
>    register is null)."
>
> This fixes a GPU hang in simulation in the piglit test
> arb_shader_image_load_store-shader-mem-barrier
>

On what platform?

> The mem fence message doesn't send any data, and previously we were
> setting the SEND's src0 to the same register as the destination. I've
> kept that behavior, so src0 will now be the null register in a number of
> cases, necessitating a few changes in the EU validator. The simulator
> and real hardware seem to be okay with this.
> ---
>  src/intel/compiler/brw_eu_emit.c        |  4 ++--
>  src/intel/compiler/brw_eu_validate.c    | 13 +++++++++++--
>  src/intel/compiler/brw_fs_nir.cpp       | 14 +++++++++++---
>  src/intel/compiler/test_eu_validate.cpp |  9 +++++++++
>  4 files changed, 33 insertions(+), 7 deletions(-)
>
> diff --git a/src/intel/compiler/brw_eu_emit.c b/src/intel/compiler/brw_eu_emit.c
> index f039af56d05..fe7fa8723e1 100644
> --- a/src/intel/compiler/brw_eu_emit.c
> +++ b/src/intel/compiler/brw_eu_emit.c
> @@ -3289,8 +3289,8 @@ brw_memory_fence(struct brw_codegen *p,
>  {
>     const struct gen_device_info *devinfo = p->devinfo;
>     const bool commit_enable =
> -      devinfo->gen >= 10 || /* HSD ES # 1404612949 */
> -      (devinfo->gen == 7 && !devinfo->is_haswell);
> +      !(dst.file == BRW_ARCHITECTURE_REGISTER_FILE &&
> +        dst.nr == BRW_ARF_NULL);
>     struct brw_inst *insn;
>  
>     brw_push_insn_state(p);
> diff --git a/src/intel/compiler/brw_eu_validate.c b/src/intel/compiler/brw_eu_validate.c
> index d3189d1ef5e..e16dfc3aaf3 100644
> --- a/src/intel/compiler/brw_eu_validate.c
> +++ b/src/intel/compiler/brw_eu_validate.c
> @@ -168,6 +168,14 @@ src1_has_scalar_region(const struct gen_device_info *devinfo, const brw_inst *in
>            brw_inst_src1_hstride(devinfo, inst) == BRW_HORIZONTAL_STRIDE_0;
>  }
>  
> +static bool
> +is_mfence(const struct gen_device_info *devinfo, const brw_inst *inst)
> +{
> +   return brw_inst_opcode(devinfo, inst) == BRW_OPCODE_SEND &&
> +          brw_inst_sfid(devinfo, inst) == GEN7_SFID_DATAPORT_DATA_CACHE &&
> +          brw_inst_dp_msg_type(devinfo, inst) == GEN7_DATAPORT_DC_MEMORY_FENCE;
> +}
> +
>  static unsigned
>  num_sources_from_inst(const struct gen_device_info *devinfo,
>                        const brw_inst *inst)
> @@ -236,7 +244,7 @@ sources_not_null(const struct gen_device_info *devinfo,
>     if (num_sources == 3)
>        return (struct string){};
>  
> -   if (num_sources >= 1)
> +   if (num_sources >= 1 && !is_mfence(devinfo, inst))
>        ERROR_IF(src0_is_null(devinfo, inst), "src0 is null");
>  
>     if (num_sources == 2)
> @@ -256,7 +264,8 @@ send_restrictions(const struct gen_device_info *devinfo,
>                 "send must use direct addressing");
>  
>        if (devinfo->gen >= 7) {
> -         ERROR_IF(!src0_is_grf(devinfo, inst), "send from non-GRF");
> +         ERROR_IF(!src0_is_grf(devinfo, inst) && !is_mfence(devinfo, inst),
> +                  "send from non-GRF");
>           ERROR_IF(brw_inst_eot(devinfo, inst) &&
>                    brw_inst_src0_da_reg_nr(devinfo, inst) < 112,
>                    "send with EOT must use g112-g127");
> diff --git a/src/intel/compiler/brw_fs_nir.cpp b/src/intel/compiler/brw_fs_nir.cpp
> index dbd2105f7e9..063f0256829 100644
> --- a/src/intel/compiler/brw_fs_nir.cpp
> +++ b/src/intel/compiler/brw_fs_nir.cpp
> @@ -3859,9 +3859,17 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr
>     case nir_intrinsic_memory_barrier_image:
>     case nir_intrinsic_memory_barrier: {
>        const fs_builder ubld = bld.group(8, 0);
> -      const fs_reg tmp = ubld.vgrf(BRW_REGISTER_TYPE_UD, 2);
> -      ubld.emit(SHADER_OPCODE_MEMORY_FENCE, tmp)
> -         ->size_written = 2 * REG_SIZE;
> +      if (devinfo->gen == 7 && !devinfo->is_haswell) {
> +         const fs_reg tmp = ubld.vgrf(BRW_REGISTER_TYPE_UD, 2);
> +         ubld.emit(SHADER_OPCODE_MEMORY_FENCE, tmp)
> +            ->size_written = 2 * REG_SIZE;
> +      } else {
> +         const fs_reg tmp =
> +            /* HSD ES #1404612949 */
> +            devinfo->gen >= 10 ? ubld.vgrf(BRW_REGISTER_TYPE_UD)
> +                               : bld.null_reg_d();
> +         ubld.emit(SHADER_OPCODE_MEMORY_FENCE, tmp);
> +      }
>        break;
>     }
>  
> diff --git a/src/intel/compiler/test_eu_validate.cpp b/src/intel/compiler/test_eu_validate.cpp
> index 161db994b2b..8169f951b2d 100644
> --- a/src/intel/compiler/test_eu_validate.cpp
> +++ b/src/intel/compiler/test_eu_validate.cpp
> @@ -168,6 +168,15 @@ TEST_P(validation_test, math_src1_null_reg)
>     }
>  }
>  
> +TEST_P(validation_test, mfence_src0_null_reg)
> +{
> +   /* On HSW+ mfence's src0 is the null register */
> +   if (devinfo.gen >= 8 || devinfo.is_haswell) {
> +      brw_memory_fence(p, null);
> +      EXPECT_TRUE(validate(p));
> +   }
> +}
> +
>  TEST_P(validation_test, opcode46)
>  {
>     /* opcode 46 is "push" on Gen 4 and 5
> -- 
> 2.16.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 227 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180321/84240256/attachment.sig>


More information about the mesa-dev mailing list