Re: [Mesa-dev] [PATCH 16/20] nir: Add a ballot32 intrinsic
On Thu, Jul 6, 2017 at 7:39 PM, Connor Abbottwrote: > I've thought about this a little bit, and I think we'd rather just > decrease the bitsize of the intrinsic rather than add a whole new one. > The separate intrinsic isn't really buying you anything, I don't think > it's going to make anything simpler. Thanks. That's a good idea. I've fixed that locally. I think I tried doing that during development and ran into some other problem. Regardless, it all works now. I'll resend 16/20 and 18/20. ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev
Re: [Mesa-dev] [PATCH 16/20] nir: Add a ballot32 intrinsic
I've thought about this a little bit, and I think we'd rather just decrease the bitsize of the intrinsic rather than add a whole new one. The separate intrinsic isn't really buying you anything, I don't think it's going to make anything simpler. On Thu, Jul 6, 2017 at 4:48 PM, Matt Turnerwrote: > Some hardware, like i965, doesn't support group sizes greater than 32. > In that case, we can use the ballot32 intrinsic instead, which will > simplify our code generation. > --- > src/compiler/nir/nir.h| 2 ++ > src/compiler/nir/nir_intrinsics.h | 3 +++ > src/compiler/nir/nir_opt_intrinsics.c | 17 + > src/intel/compiler/brw_compiler.c | 1 + > 4 files changed, 23 insertions(+) > > diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h > index 3591048574..a3d8df0b19 100644 > --- a/src/compiler/nir/nir.h > +++ b/src/compiler/nir/nir.h > @@ -1844,6 +1844,8 @@ typedef struct nir_shader_compiler_options { > */ > bool use_interpolated_input_intrinsics; > > + unsigned max_subgroup_size; > + > unsigned max_unroll_iterations; > } nir_shader_compiler_options; > > diff --git a/src/compiler/nir/nir_intrinsics.h > b/src/compiler/nir/nir_intrinsics.h > index 96ecfbc338..61ad9f6643 100644 > --- a/src/compiler/nir/nir_intrinsics.h > +++ b/src/compiler/nir/nir_intrinsics.h > @@ -106,6 +106,9 @@ INTRINSIC(ballot, 1, ARR(1), true, 1, 0, 0, xx, xx, xx, > NIR_INTRINSIC_CAN_ELIMIN > INTRINSIC(read_invocation, 2, ARR(0, 1), true, 0, 0, 0, xx, xx, xx, > NIR_INTRINSIC_CAN_ELIMINATE) > INTRINSIC(read_first_invocation, 1, ARR(0), true, 0, 0, 0, xx, xx, xx, > NIR_INTRINSIC_CAN_ELIMINATE) > > +/* Equivalent to ballot, but only returns the low 32-bits */ > +INTRINSIC(ballot32, 1, ARR(1), true, 1, 0, 0, xx, xx, xx, > NIR_INTRINSIC_CAN_ELIMINATE) > + > /* > * Memory barrier with semantics analogous to the compute shader > * groupMemoryBarrier(), memoryBarrierAtomicCounter(), memoryBarrierBuffer(), > diff --git a/src/compiler/nir/nir_opt_intrinsics.c > b/src/compiler/nir/nir_opt_intrinsics.c > index 0cd75d8b28..023e169a99 100644 > --- a/src/compiler/nir/nir_opt_intrinsics.c > +++ b/src/compiler/nir/nir_opt_intrinsics.c > @@ -69,6 +69,23 @@ opt_intrinsics_impl(nir_function_impl *impl) > replacement = nir_imm_int(, NIR_TRUE); > break; > } > + case nir_intrinsic_ballot: { > +assert(b.shader->options->max_subgroup_size != 0); > +if (b.shader->options->max_subgroup_size > 32) > + continue; > + > +nir_intrinsic_instr *ballot = > + nir_intrinsic_instr_create(b.shader, nir_intrinsic_ballot32); > +nir_ssa_dest_init(>instr, >dest, 1, 32, NULL); > +ballot->src[0] = intrin->src[0]; > + > +nir_builder_instr_insert(, >instr); > + > +replacement = nir_pack_64_2x32_split(, > + >dest.ssa, > + nir_imm_int(, 0)); > +break; > + } > default: > break; > } > diff --git a/src/intel/compiler/brw_compiler.c > b/src/intel/compiler/brw_compiler.c > index 9ad5d8e4ee..6970bcb40f 100644 > --- a/src/intel/compiler/brw_compiler.c > +++ b/src/intel/compiler/brw_compiler.c > @@ -57,6 +57,7 @@ static const struct nir_shader_compiler_options > scalar_nir_options = { > .lower_unpack_snorm_4x8 = true, > .lower_unpack_unorm_2x16 = true, > .lower_unpack_unorm_4x8 = true, > + .max_subgroup_size = 64, /* FIXME */ > .max_unroll_iterations = 32, > }; > > -- > 2.13.0 > > ___ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev
[Mesa-dev] [PATCH 16/20] nir: Add a ballot32 intrinsic
Some hardware, like i965, doesn't support group sizes greater than 32. In that case, we can use the ballot32 intrinsic instead, which will simplify our code generation. --- src/compiler/nir/nir.h| 2 ++ src/compiler/nir/nir_intrinsics.h | 3 +++ src/compiler/nir/nir_opt_intrinsics.c | 17 + src/intel/compiler/brw_compiler.c | 1 + 4 files changed, 23 insertions(+) diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 3591048574..a3d8df0b19 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -1844,6 +1844,8 @@ typedef struct nir_shader_compiler_options { */ bool use_interpolated_input_intrinsics; + unsigned max_subgroup_size; + unsigned max_unroll_iterations; } nir_shader_compiler_options; diff --git a/src/compiler/nir/nir_intrinsics.h b/src/compiler/nir/nir_intrinsics.h index 96ecfbc338..61ad9f6643 100644 --- a/src/compiler/nir/nir_intrinsics.h +++ b/src/compiler/nir/nir_intrinsics.h @@ -106,6 +106,9 @@ INTRINSIC(ballot, 1, ARR(1), true, 1, 0, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMIN INTRINSIC(read_invocation, 2, ARR(0, 1), true, 0, 0, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE) INTRINSIC(read_first_invocation, 1, ARR(0), true, 0, 0, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE) +/* Equivalent to ballot, but only returns the low 32-bits */ +INTRINSIC(ballot32, 1, ARR(1), true, 1, 0, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE) + /* * Memory barrier with semantics analogous to the compute shader * groupMemoryBarrier(), memoryBarrierAtomicCounter(), memoryBarrierBuffer(), diff --git a/src/compiler/nir/nir_opt_intrinsics.c b/src/compiler/nir/nir_opt_intrinsics.c index 0cd75d8b28..023e169a99 100644 --- a/src/compiler/nir/nir_opt_intrinsics.c +++ b/src/compiler/nir/nir_opt_intrinsics.c @@ -69,6 +69,23 @@ opt_intrinsics_impl(nir_function_impl *impl) replacement = nir_imm_int(, NIR_TRUE); break; } + case nir_intrinsic_ballot: { +assert(b.shader->options->max_subgroup_size != 0); +if (b.shader->options->max_subgroup_size > 32) + continue; + +nir_intrinsic_instr *ballot = + nir_intrinsic_instr_create(b.shader, nir_intrinsic_ballot32); +nir_ssa_dest_init(>instr, >dest, 1, 32, NULL); +ballot->src[0] = intrin->src[0]; + +nir_builder_instr_insert(, >instr); + +replacement = nir_pack_64_2x32_split(, + >dest.ssa, + nir_imm_int(, 0)); +break; + } default: break; } diff --git a/src/intel/compiler/brw_compiler.c b/src/intel/compiler/brw_compiler.c index 9ad5d8e4ee..6970bcb40f 100644 --- a/src/intel/compiler/brw_compiler.c +++ b/src/intel/compiler/brw_compiler.c @@ -57,6 +57,7 @@ static const struct nir_shader_compiler_options scalar_nir_options = { .lower_unpack_snorm_4x8 = true, .lower_unpack_unorm_2x16 = true, .lower_unpack_unorm_4x8 = true, + .max_subgroup_size = 64, /* FIXME */ .max_unroll_iterations = 32, }; -- 2.13.0 ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev