ac/perfcounter: rework computing the number of block instances on GFX12

This needs to be generalized to older generations.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39083>
This commit is contained in:
Samuel Pitoiset 2025-12-24 15:26:37 +01:00 committed by Marge Bot
parent a90b913817
commit e377060e5c

View file

@ -1282,36 +1282,73 @@ bool ac_init_perfcounters(const struct radeon_info *info,
block->b = &blocks[i];
block->num_instances = MAX2(1, block->b->instances);
if (!strcmp(block->b->b->name, "CB") ||
!strcmp(block->b->b->name, "DB") ||
!strcmp(block->b->b->name, "RMI"))
block->num_instances = info->max_se;
else if (!strcmp(block->b->b->name, "TCC"))
block->num_instances = info->max_tcc_blocks;
else if (!strcmp(block->b->b->name, "IA"))
block->num_instances = MAX2(1, info->max_se / 2);
else if (!strcmp(block->b->b->name, "TA") ||
!strcmp(block->b->b->name, "TCP") ||
!strcmp(block->b->b->name, "TD")) {
block->num_instances = MAX2(1, info->max_good_cu_per_sa);
}
if (info->gfx_level >= GFX12) {
/* TODO: Generalize this to older generations. */
const uint32_t num_rb_per_se = info->num_rb / info->num_se;
const uint32_t rb_per_sa = num_rb_per_se / info->max_sa_per_se;
if (info->gfx_level >= GFX10) {
if (!strcmp(block->b->b->name, "TCP")) {
block->num_global_instances = MAX2(1, info->num_cu_per_sh) * info->num_se * info->max_sa_per_se;
} else if (!strcmp(block->b->b->name, "SQ")) {
block->num_global_instances = block->num_instances * info->num_se;
} else if (!strcmp(block->b->b->name, "GL1C") ||
!strcmp(block->b->b->name, "SQ_WGP")) {
switch (block->b->b->gpu_block) {
case CB:
case DB:
block->num_instances = rb_per_sa;
break;
case GL2C:
block->num_instances = info->num_tcc_blocks;
break;
case TA:
case TD:
case TCP:
block->num_instances = MAX2(1, info->max_good_cu_per_sa);
break;
default:
break;
}
switch (block->b->b->distribution) {
case AC_PC_PER_SHADER_ARRAY:
block->num_global_instances = block->num_instances * info->num_se * info->max_sa_per_se;
} else if (!strcmp(block->b->b->name, "GL2C") ||
!strcmp(block->b->b->name, "GCEA")) {
block->num_instances = block->num_global_instances = info->num_tcc_blocks;
} else if (!strcmp(block->b->b->name, "CPF")) {
block->num_instances = block->num_global_instances = 1;
} else if (!strcmp(block->b->b->name, "TA") ||
!strcmp(block->b->b->name, "TD")) {
break;
case AC_PC_PER_SHADER_ENGINE:
block->num_global_instances = block->num_instances * info->num_se;
break;
case AC_PC_GLOBAL_BLOCK:
block->num_global_instances = block->num_instances;
break;
default:
UNREACHABLE("Invalid perf block distribution mode.");
}
} else {
if (!strcmp(block->b->b->name, "CB") ||
!strcmp(block->b->b->name, "DB") ||
!strcmp(block->b->b->name, "RMI"))
block->num_instances = info->max_se;
else if (!strcmp(block->b->b->name, "TCC"))
block->num_instances = info->max_tcc_blocks;
else if (!strcmp(block->b->b->name, "IA"))
block->num_instances = MAX2(1, info->max_se / 2);
else if (!strcmp(block->b->b->name, "TA") ||
!strcmp(block->b->b->name, "TCP") ||
!strcmp(block->b->b->name, "TD")) {
block->num_instances = MAX2(1, info->max_good_cu_per_sa);
}
if (info->gfx_level >= GFX10) {
if (!strcmp(block->b->b->name, "TCP")) {
block->num_global_instances = MAX2(1, info->num_cu_per_sh) * info->num_se * info->max_sa_per_se;
} else if (!strcmp(block->b->b->name, "SQ")) {
block->num_global_instances = block->num_instances * info->num_se;
} else if (!strcmp(block->b->b->name, "GL1C") ||
!strcmp(block->b->b->name, "SQ_WGP")) {
block->num_global_instances = block->num_instances * info->num_se * info->max_sa_per_se;
} else if (!strcmp(block->b->b->name, "GL2C") ||
!strcmp(block->b->b->name, "GCEA")) {
block->num_instances = block->num_global_instances = info->num_tcc_blocks;
} else if (!strcmp(block->b->b->name, "CPF")) {
block->num_instances = block->num_global_instances = 1;
} else if (!strcmp(block->b->b->name, "TA") ||
!strcmp(block->b->b->name, "TD")) {
block->num_global_instances = block->num_instances;
}
}
}