From: "Alex Bennée" <alex.bennee@linaro.org>
To: qemu-devel@nongnu.org
Cc: Paolo Bonzini <pbonzini@redhat.com>,
vandersonmr <vandersonmr2@gmail.com>,
Richard Henderson <rth@twiddle.net>
Subject: Re: [Qemu-devel] [PATCH v5 04/10] accel: replacing part of CONFIG_PROFILER with TBStats
Date: Thu, 15 Aug 2019 15:54:05 +0100 [thread overview]
Message-ID: <87o90qmqcy.fsf@linaro.org> (raw)
In-Reply-To: <20190815021857.19526-5-vandersonmr2@gmail.com>
vandersonmr <vandersonmr2@gmail.com> writes:
> We add some of the statistics collected in the TCGProfiler
> into the TBStats, having the statistics not only for the whole
> emulation but for each TB. Then, we removed these stats
> from TCGProfiler and reconstruct the information for the
> "info jit" using the sum of all TBStats statistics.
>
> The goal is to have one unique and better way of collecting
> emulation statistics. Moreover, checking dynamiclly if the
> profiling is enabled showed to have an insignificant impact
> on the performance:
> https://wiki.qemu.org/Internships/ProjectIdeas/TCGCodeQuality#Overheads.
>
> Signed-off-by: Vanderson M. do Rosario <vandersonmr2@gmail.com>
> ---
> accel/tcg/tb-stats.c | 95 +++++++++++++++++++++++++++++++++++++++
> accel/tcg/translate-all.c | 8 +---
> include/exec/tb-stats.h | 11 +++++
> tcg/tcg.c | 93 +++++---------------------------------
> tcg/tcg.h | 10 -----
> 5 files changed, 118 insertions(+), 99 deletions(-)
>
> diff --git a/accel/tcg/tb-stats.c b/accel/tcg/tb-stats.c
> index 3489133e9e..9b720d9b86 100644
> --- a/accel/tcg/tb-stats.c
> +++ b/accel/tcg/tb-stats.c
> @@ -1,9 +1,104 @@
> #include "qemu/osdep.h"
>
> #include "disas/disas.h"
> +#include "exec/exec-all.h"
> +#include "tcg.h"
> +
> +#include "qemu/qemu-print.h"
>
> #include "exec/tb-stats.h"
>
> +struct jit_profile_info {
> + uint64_t translations;
> + uint64_t aborted;
> + uint64_t ops;
> + unsigned ops_max;
> + uint64_t del_ops;
> + uint64_t temps;
> + unsigned temps_max;
> + uint64_t host;
> + uint64_t guest;
> + uint64_t search_data;
> +};
> +
> +/* accumulate the statistics from all TBs */
> +static void collect_jit_profile_info(void *p, uint32_t hash, void *userp)
> +{
> + struct jit_profile_info *jpi = userp;
> + TBStatistics *tbs = p;
> +
> + jpi->translations += tbs->translations.total;
> + jpi->ops += tbs->code.num_tcg_ops;
> + if (stat_per_translation(tbs, code.num_tcg_ops) > jpi->ops_max) {
> + jpi->ops_max = stat_per_translation(tbs, code.num_tcg_ops);
> + }
> + jpi->del_ops += tbs->code.deleted_ops;
> + jpi->temps += tbs->code.temps;
> + if (stat_per_translation(tbs, code.temps) > jpi->temps_max) {
> + jpi->temps_max = stat_per_translation(tbs, code.temps);
> + }
> + jpi->host += tbs->code.out_len;
> + jpi->guest += tbs->code.in_len;
> + jpi->search_data += tbs->code.search_out_len;
> +}
> +
> +/* dump JIT statisticis using TCGProfile and TBStats */
> +void dump_jit_profile_info(TCGProfile *s)
> +{
> + if (!tb_stats_collection_enabled()) {
> + return;
> + }
> +
> + struct jit_profile_info *jpi = g_new0(struct jit_profile_info, 1);
> +
> + qht_iter(&tb_ctx.tb_stats, collect_jit_profile_info, jpi);
> +
> + if (jpi->translations) {
> + qemu_printf("translated TBs %" PRId64 "\n", jpi->translations);
> + qemu_printf("avg ops/TB %0.1f max=%d\n",
> + jpi->ops / (double) jpi->translations, jpi->ops_max);
> + qemu_printf("deleted ops/TB %0.2f\n",
> + jpi->del_ops / (double) jpi->translations);
> + qemu_printf("avg temps/TB %0.2f max=%d\n",
> + jpi->temps / (double) jpi->translations, jpi->temps_max);
> + qemu_printf("avg host code/TB %0.1f\n",
> + jpi->host / (double) jpi->translations);
> + qemu_printf("avg search data/TB %0.1f\n",
> + jpi->search_data / (double) jpi->translations);
> +
> + if (s) {
> + int64_t tot = s->interm_time + s->code_time;
> + qemu_printf("JIT cycles %" PRId64 " (%0.3f s at 2.4 GHz)\n",
> + tot, tot / 2.4e9);
> + qemu_printf("cycles/op %0.1f\n",
> + jpi->ops ? (double)tot / jpi->ops : 0);
> + qemu_printf("cycles/in byte %0.1f\n",
> + jpi->guest ? (double)tot / jpi->guest : 0);
> + qemu_printf("cycles/out byte %0.1f\n",
> + jpi->host ? (double)tot / jpi->host : 0);
> + qemu_printf("cycles/search byte %0.1f\n",
> + jpi->search_data ? (double)tot / jpi->search_data : 0);
> + if (tot == 0) {
> + tot = 1;
> + }
> + qemu_printf(" gen_interm time %0.1f%%\n",
> + (double)s->interm_time / tot * 100.0);
> + qemu_printf(" gen_code time %0.1f%%\n",
> + (double)s->code_time / tot * 100.0);
> + qemu_printf("optim./code time %0.1f%%\n",
> + (double)s->opt_time / (s->code_time ? s->code_time : 1)
> + * 100.0);
> + qemu_printf("liveness/code time %0.1f%%\n",
> + (double)s->la_time / (s->code_time ? s->code_time : 1) * 100.0);
> + qemu_printf("cpu_restore count %" PRId64 "\n",
> + s->restore_count);
> + qemu_printf(" avg cycles %0.1f\n",
> + s->restore_count ? (double)s->restore_time / s->restore_count : 0);
> + }
> + }
I think the g_free(jpi) should be moved from the later patches to here.
Otherwise:
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
--
Alex Bennée
next prev parent reply other threads:[~2019-08-15 14:55 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-15 2:18 [Qemu-devel] [PATCH v5 00/10] Measure Tiny Code Generation Quality vandersonmr
2019-08-15 2:18 ` [Qemu-devel] [PATCH v5 01/10] accel: introducing TBStatistics structure vandersonmr
2019-08-15 13:13 ` Alex Bennée
2019-08-15 2:18 ` [Qemu-devel] [PATCH v5 02/10] accel: collecting TB execution count vandersonmr
2019-08-15 13:38 ` Alex Bennée
2019-08-15 2:18 ` [Qemu-devel] [PATCH v5 03/10] accel: collecting JIT statistics vandersonmr
2019-08-15 14:29 ` Alex Bennée
2019-08-15 2:18 ` [Qemu-devel] [PATCH v5 04/10] accel: replacing part of CONFIG_PROFILER with TBStats vandersonmr
2019-08-15 14:54 ` Alex Bennée [this message]
2019-08-15 2:18 ` [Qemu-devel] [PATCH v5 05/10] accel: adding TB_JIT_TIME and full replacing CONFIG_PROFILER vandersonmr
2019-08-15 2:18 ` [Qemu-devel] [PATCH v5 06/10] log: adding -d tb_stats to control tbstats vandersonmr
2019-08-15 2:18 ` [Qemu-devel] [PATCH v5 07/10] monitor: adding tb_stats hmp command vandersonmr
2019-08-15 8:53 ` Dr. David Alan Gilbert
2019-08-15 2:18 ` [Qemu-devel] [PATCH v5 08/10] Adding info [tbs|tb|coverset] commands to HMP. These commands allow the exploration of TBs generated by the TCG. Understand which one hotter, with more guest/host instructions... and examine their guest, host and IR code vandersonmr
2019-08-15 8:59 ` Dr. David Alan Gilbert
2019-08-21 14:16 ` Vanderson Martins do Rosario
2019-08-21 14:29 ` Dr. David Alan Gilbert
2019-08-15 2:18 ` [Qemu-devel] [PATCH v5 09/10] monitor: adding new info cfg command vandersonmr
2019-08-15 9:14 ` Dr. David Alan Gilbert
2019-08-15 2:18 ` [Qemu-devel] [PATCH v5 10/10] linux-user: dumping hot TBs at the end of the execution vandersonmr
2019-08-15 14:26 ` Aleksandar Markovic
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87o90qmqcy.fsf@linaro.org \
--to=alex.bennee@linaro.org \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=rth@twiddle.net \
--cc=vandersonmr2@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.