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