Mesa (master): v3d: choose a larger CSD supergroup size if possible

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue May 4 16:21:54 UTC 2021


Module: Mesa
Branch: master
Commit: f099fc3e071d95e3d42694af7d6780c4dc01462a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f099fc3e071d95e3d42694af7d6780c4dc01462a

Author: Iago Toral Quiroga <itoral at igalia.com>
Date:   Thu Apr 29 09:25:05 2021 +0200

v3d: choose a larger CSD supergroup size if possible

Reviewed-by: Alejandro Piñeiro <apinheiro at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10541>

---

 src/broadcom/compiler/nir_to_vir.c  |  2 ++
 src/gallium/drivers/v3d/v3dx_draw.c | 36 +++++++++++++++++++++++++-----------
 2 files changed, 27 insertions(+), 11 deletions(-)

diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c
index e313a82d731..2bbf613934d 100644
--- a/src/broadcom/compiler/nir_to_vir.c
+++ b/src/broadcom/compiler/nir_to_vir.c
@@ -3765,6 +3765,8 @@ const nir_shader_compiler_options v3d_nir_options = {
         .lower_to_scalar = true,
         .has_fsub = true,
         .has_isub = true,
+        .divergence_analysis_options =
+                nir_divergence_multiple_workgroup_per_compute_subgroup,
 };
 
 /**
diff --git a/src/gallium/drivers/v3d/v3dx_draw.c b/src/gallium/drivers/v3d/v3dx_draw.c
index 1611a8027c5..f0f5228943e 100644
--- a/src/gallium/drivers/v3d/v3dx_draw.c
+++ b/src/gallium/drivers/v3d/v3dx_draw.c
@@ -35,6 +35,7 @@
 #include "v3d_cl.h"
 #include "broadcom/compiler/v3d_compiler.h"
 #include "broadcom/common/v3d_macros.h"
+#include "broadcom/common/v3d_util.h"
 #include "broadcom/cle/v3dx_pack.h"
 
 static void
@@ -1551,25 +1552,38 @@ v3d_launch_grid(struct pipe_context *pctx, const struct pipe_grid_info *info)
                 v3d->compute_num_workgroups[2] = info->grid[2];
         }
 
+        uint32_t num_wgs = 1;
         for (int i = 0; i < 3; i++) {
+                num_wgs *= v3d->compute_num_workgroups[i];
                 submit.cfg[i] |= (v3d->compute_num_workgroups[i] <<
                                   V3D_CSD_CFG012_WG_COUNT_SHIFT);
         }
 
-        perf_debug("CSD only using single WG per SG currently, "
-                   "should increase that when possible.");
-        int wgs_per_sg = 1;
-        int wg_size = info->block[0] * info->block[1] * info->block[2];
-        submit.cfg[3] |= wgs_per_sg << V3D_CSD_CFG3_WGS_PER_SG_SHIFT;
-        submit.cfg[3] |= ((DIV_ROUND_UP(wgs_per_sg * wg_size, 16) - 1) <<
-                          V3D_CSD_CFG3_BATCHES_PER_SG_M1_SHIFT);
+        uint32_t wg_size = info->block[0] * info->block[1] * info->block[2];
+
+        struct v3d_compute_prog_data *compute =
+                v3d->prog.compute->prog_data.compute;
+        uint32_t wgs_per_sg =
+                v3d_csd_choose_workgroups_per_supergroup(
+                        &v3d->screen->devinfo,
+                        compute->base.has_control_barrier,
+                        compute->base.threads,
+                        num_wgs, wg_size);
+
+        uint32_t batches_per_sg = DIV_ROUND_UP(wgs_per_sg * wg_size, 16);
+        uint32_t whole_sgs = num_wgs / wgs_per_sg;
+        uint32_t rem_wgs = num_wgs - whole_sgs * wgs_per_sg;
+        uint32_t num_batches = batches_per_sg * whole_sgs +
+                               DIV_ROUND_UP(rem_wgs * wg_size, 16);
+
+        submit.cfg[3] |= (wgs_per_sg & 0xf) << V3D_CSD_CFG3_WGS_PER_SG_SHIFT;
+        submit.cfg[3] |=
+                (batches_per_sg - 1) << V3D_CSD_CFG3_BATCHES_PER_SG_M1_SHIFT;
         submit.cfg[3] |= (wg_size & 0xff) << V3D_CSD_CFG3_WG_SIZE_SHIFT;
 
-        int batches_per_wg = DIV_ROUND_UP(wg_size, 16);
+
         /* Number of batches the dispatch will invoke (minus 1). */
-        submit.cfg[4] = batches_per_wg * (v3d->compute_num_workgroups[0] *
-                                          v3d->compute_num_workgroups[1] *
-                                          v3d->compute_num_workgroups[2]) - 1;
+        submit.cfg[4] = num_batches - 1;
 
         /* Make sure we didn't accidentally underflow. */
         assert(submit.cfg[4] != ~0);



More information about the mesa-commit mailing list