Mesa (master): radv: add code for exposing compiler statistics
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Apr 3 12:23:10 UTC 2020
Module: Mesa
Branch: master
Commit: ad2703653f306f0fa751ddfd546d1d93ce348630
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ad2703653f306f0fa751ddfd546d1d93ce348630
Author: Rhys Perry <pendingchaos02 at gmail.com>
Date: Wed Dec 4 14:46:31 2019 +0000
radv: add code for exposing compiler statistics
Statistics will be added to ACO in later commits.
Signed-off-by: Rhys Perry <pendingchaos02 at gmail.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Reviewed-by: Daniel Schürmann <daniel at schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/2965>
---
src/amd/compiler/aco_interface.cpp | 2 ++
src/amd/vulkan/radv_pipeline.c | 14 ++++++++++++++
src/amd/vulkan/radv_shader.c | 26 +++++++++++++++++++++-----
src/amd/vulkan/radv_shader.h | 17 +++++++++++++++--
4 files changed, 52 insertions(+), 7 deletions(-)
diff --git a/src/amd/compiler/aco_interface.cpp b/src/amd/compiler/aco_interface.cpp
index 686fdca14e9..378a138d245 100644
--- a/src/amd/compiler/aco_interface.cpp
+++ b/src/amd/compiler/aco_interface.cpp
@@ -168,6 +168,8 @@ void aco_compile_shader(unsigned shader_count,
legacy_binary->base.is_gs_copy_shader = args->is_gs_copy_shader;
legacy_binary->base.total_size = size;
+ legacy_binary->stats_size = 0;
+
memcpy(legacy_binary->data, code.data(), code.size() * sizeof(uint32_t));
legacy_binary->exec_size = exec_size;
legacy_binary->code_size = code.size() * sizeof(uint32_t);
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index c992fce9537..f78043bf39e 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -5625,6 +5625,20 @@ VkResult radv_GetPipelineExecutableStatisticsKHR(
}
++s;
+ if (shader->statistics) {
+ for (unsigned i = 0; i < shader->statistics->count; i++) {
+ struct radv_compiler_statistic_info *info = &shader->statistics->infos[i];
+ uint32_t value = shader->statistics->values[i];
+ if (s < end) {
+ desc_copy(s->name, info->name);
+ desc_copy(s->description, info->desc);
+ s->format = VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_UINT64_KHR;
+ s->value.u64 = value;
+ }
+ ++s;
+ }
+ }
+
if (!pStatistics)
*pStatisticCount = s - pStatistics;
else if (s > end) {
diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c
index 70a51ee01d0..797c90159b8 100644
--- a/src/amd/vulkan/radv_shader.c
+++ b/src/amd/vulkan/radv_shader.c
@@ -1026,15 +1026,20 @@ radv_shader_variant_create(struct radv_device *device,
ac_rtld_close(&rtld_binary);
} else {
struct radv_shader_binary_legacy* bin = (struct radv_shader_binary_legacy *)binary;
- memcpy(dest_ptr, bin->data, bin->code_size);
+ memcpy(dest_ptr, bin->data + bin->stats_size, bin->code_size);
/* Add end-of-code markers for the UMR disassembler. */
uint32_t *ptr32 = (uint32_t *)dest_ptr + bin->code_size / 4;
for (unsigned i = 0; i < DEBUGGER_NUM_MARKERS; i++)
ptr32[i] = DEBUGGER_END_OF_CODE_MARKER;
- variant->ir_string = bin->ir_size ? strdup((const char*)(bin->data + bin->code_size)) : NULL;
- variant->disasm_string = bin->disasm_size ? strdup((const char*)(bin->data + bin->code_size + bin->ir_size)) : NULL;
+ variant->ir_string = bin->ir_size ? strdup((const char*)(bin->data + bin->stats_size + bin->code_size)) : NULL;
+ variant->disasm_string = bin->disasm_size ? strdup((const char*)(bin->data + bin->stats_size + bin->code_size + bin->ir_size)) : NULL;
+
+ if (bin->stats_size) {
+ variant->statistics = calloc(bin->stats_size, 1);
+ memcpy(variant->statistics, bin->data, bin->stats_size);
+ }
}
return variant;
}
@@ -1203,6 +1208,7 @@ radv_shader_variant_destroy(struct radv_device *device,
free(variant->nir_string);
free(variant->disasm_string);
free(variant->ir_string);
+ free(variant->statistics);
free(variant);
}
@@ -1332,13 +1338,23 @@ generate_shader_stats(struct radv_device *device,
"Code Size: %d bytes\n"
"LDS: %d blocks\n"
"Scratch: %d bytes per wave\n"
- "Max Waves: %d\n"
- "********************\n\n\n",
+ "Max Waves: %d\n",
conf->num_sgprs, conf->num_vgprs,
conf->spilled_sgprs, conf->spilled_vgprs,
variant->info.private_mem_vgprs, variant->exec_size,
conf->lds_size, conf->scratch_bytes_per_wave,
max_simd_waves);
+
+ if (variant->statistics) {
+ _mesa_string_buffer_printf(buf, "*** COMPILER STATS ***\n");
+ for (unsigned i = 0; i < variant->statistics->count; i++) {
+ struct radv_compiler_statistic_info *info = &variant->statistics->infos[i];
+ uint32_t value = variant->statistics->values[i];
+ _mesa_string_buffer_printf(buf, "%s: %lu\n", info->name, value);
+ }
+ }
+
+ _mesa_string_buffer_printf(buf, "********************\n\n\n");
}
void
diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h
index 99644b1ebf0..eb414829d96 100644
--- a/src/amd/vulkan/radv_shader.h
+++ b/src/amd/vulkan/radv_shader.h
@@ -349,9 +349,10 @@ struct radv_shader_binary_legacy {
unsigned exec_size;
unsigned ir_size;
unsigned disasm_size;
+ unsigned stats_size;
- /* data has size of code_size + ir_size + disasm_size + 2, where
- * the +2 is for 0 of the ir strings. */
+ /* data has size of stats_size + code_size + ir_size + disasm_size + 2,
+ * where the +2 is for 0 of the ir strings. */
uint8_t data[0];
};
@@ -362,6 +363,17 @@ struct radv_shader_binary_rtld {
uint8_t data[0];
};
+struct radv_compiler_statistic_info {
+ char name[32];
+ char desc[64];
+};
+
+struct radv_compiler_statistics {
+ unsigned count;
+ struct radv_compiler_statistic_info *infos;
+ uint32_t values[];
+};
+
struct radv_shader_variant {
uint32_t ref_count;
@@ -378,6 +390,7 @@ struct radv_shader_variant {
char *nir_string;
char *disasm_string;
char *ir_string;
+ struct radv_compiler_statistics *statistics;
struct list_head slab_list;
};
More information about the mesa-commit
mailing list