From ad2703653f306f0fa751ddfd546d1d93ce348630 Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Wed, 4 Dec 2019 14:46:31 +0000 Subject: [PATCH] radv: add code for exposing compiler statistics MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Statistics will be added to ACO in later commits. Signed-off-by: Rhys Perry Reviewed-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen Reviewed-by: Daniel Schürmann Part-of: --- 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; }; -- 2.30.2