Commit a23a9ec615e160c9ac008f27d554a79255ca27b0
1 parent
95af5ce5
profiler clean up
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4537 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
93 additions
and
13 deletions
tcg/tcg.c
| ... | ... | @@ -1156,10 +1156,7 @@ void tcg_liveness_analysis(TCGContext *s) |
| 1156 | 1156 | } |
| 1157 | 1157 | tcg_set_nop(s, gen_opc_buf + op_index, args, def->nb_args); |
| 1158 | 1158 | #ifdef CONFIG_PROFILER |
| 1159 | - { | |
| 1160 | - extern int64_t dyngen_tcg_del_op_count; | |
| 1161 | - dyngen_tcg_del_op_count++; | |
| 1162 | - } | |
| 1159 | + s->del_op_count++; | |
| 1163 | 1160 | #endif |
| 1164 | 1161 | } else { |
| 1165 | 1162 | do_not_remove: |
| ... | ... | @@ -1822,7 +1819,13 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf, |
| 1822 | 1819 | } |
| 1823 | 1820 | #endif |
| 1824 | 1821 | |
| 1822 | +#ifdef CONFIG_PROFILER | |
| 1823 | + s->la_time -= profile_getclock(); | |
| 1824 | +#endif | |
| 1825 | 1825 | tcg_liveness_analysis(s); |
| 1826 | +#ifdef CONFIG_PROFILER | |
| 1827 | + s->la_time += profile_getclock(); | |
| 1828 | +#endif | |
| 1826 | 1829 | |
| 1827 | 1830 | #ifdef DEBUG_DISAS |
| 1828 | 1831 | if (unlikely(loglevel & CPU_LOG_TB_OP_OPT)) { |
| ... | ... | @@ -1911,10 +1914,7 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf, |
| 1911 | 1914 | case 0 ... INDEX_op_end - 1: |
| 1912 | 1915 | /* legacy dyngen ops */ |
| 1913 | 1916 | #ifdef CONFIG_PROFILER |
| 1914 | - { | |
| 1915 | - extern int64_t dyngen_old_op_count; | |
| 1916 | - dyngen_old_op_count++; | |
| 1917 | - } | |
| 1917 | + s->old_op_count++; | |
| 1918 | 1918 | #endif |
| 1919 | 1919 | tcg_reg_alloc_bb_end(s); |
| 1920 | 1920 | if (search_pc >= 0) { |
| ... | ... | @@ -1954,13 +1954,15 @@ int dyngen_code(TCGContext *s, uint8_t *gen_code_buf) |
| 1954 | 1954 | { |
| 1955 | 1955 | #ifdef CONFIG_PROFILER |
| 1956 | 1956 | { |
| 1957 | - extern int64_t dyngen_op_count; | |
| 1958 | - extern int dyngen_op_count_max; | |
| 1959 | 1957 | int n; |
| 1960 | 1958 | n = (gen_opc_ptr - gen_opc_buf); |
| 1961 | - dyngen_op_count += n; | |
| 1962 | - if (n > dyngen_op_count_max) | |
| 1963 | - dyngen_op_count_max = n; | |
| 1959 | + s->op_count += n; | |
| 1960 | + if (n > s->op_count_max) | |
| 1961 | + s->op_count_max = n; | |
| 1962 | + | |
| 1963 | + s->temp_count += s->nb_temps; | |
| 1964 | + if (s->nb_temps > s->temp_count_max) | |
| 1965 | + s->temp_count_max = s->nb_temps; | |
| 1964 | 1966 | } |
| 1965 | 1967 | #endif |
| 1966 | 1968 | |
| ... | ... | @@ -1980,3 +1982,60 @@ int dyngen_code_search_pc(TCGContext *s, uint8_t *gen_code_buf, long offset) |
| 1980 | 1982 | { |
| 1981 | 1983 | return tcg_gen_code_common(s, gen_code_buf, offset); |
| 1982 | 1984 | } |
| 1985 | + | |
| 1986 | +#ifdef CONFIG_PROFILER | |
| 1987 | +void tcg_dump_info(FILE *f, | |
| 1988 | + int (*cpu_fprintf)(FILE *f, const char *fmt, ...)) | |
| 1989 | +{ | |
| 1990 | + TCGContext *s = &tcg_ctx; | |
| 1991 | + int64_t tot; | |
| 1992 | + | |
| 1993 | + tot = s->interm_time + s->code_time; | |
| 1994 | + cpu_fprintf(f, "JIT cycles %" PRId64 " (%0.3f s at 2.4 GHz)\n", | |
| 1995 | + tot, tot / 2.4e9); | |
| 1996 | + cpu_fprintf(f, "translated TBs %" PRId64 " (aborted=%" PRId64 " %0.1f%%)\n", | |
| 1997 | + s->tb_count, | |
| 1998 | + s->tb_count1 - s->tb_count, | |
| 1999 | + s->tb_count1 ? (double)(s->tb_count1 - s->tb_count) / s->tb_count1 * 100.0 : 0); | |
| 2000 | + cpu_fprintf(f, "avg ops/TB %0.1f max=%d\n", | |
| 2001 | + s->tb_count ? (double)s->op_count / s->tb_count : 0, s->op_count_max); | |
| 2002 | + cpu_fprintf(f, "old ops/total ops %0.1f%%\n", | |
| 2003 | + s->op_count ? (double)s->old_op_count / s->op_count * 100.0 : 0); | |
| 2004 | + cpu_fprintf(f, "deleted ops/TB %0.2f\n", | |
| 2005 | + s->tb_count ? | |
| 2006 | + (double)s->del_op_count / s->tb_count : 0); | |
| 2007 | + cpu_fprintf(f, "avg temps/TB %0.2f max=%d\n", | |
| 2008 | + s->tb_count ? | |
| 2009 | + (double)s->temp_count / s->tb_count : 0, | |
| 2010 | + s->temp_count_max); | |
| 2011 | + | |
| 2012 | + cpu_fprintf(f, "cycles/op %0.1f\n", | |
| 2013 | + s->op_count ? (double)tot / s->op_count : 0); | |
| 2014 | + cpu_fprintf(f, "cycles/in byte %0.1f\n", | |
| 2015 | + s->code_in_len ? (double)tot / s->code_in_len : 0); | |
| 2016 | + cpu_fprintf(f, "cycles/out byte %0.1f\n", | |
| 2017 | + s->code_out_len ? (double)tot / s->code_out_len : 0); | |
| 2018 | + if (tot == 0) | |
| 2019 | + tot = 1; | |
| 2020 | + cpu_fprintf(f, " gen_interm time %0.1f%%\n", | |
| 2021 | + (double)s->interm_time / tot * 100.0); | |
| 2022 | + cpu_fprintf(f, " gen_code time %0.1f%%\n", | |
| 2023 | + (double)s->code_time / tot * 100.0); | |
| 2024 | + cpu_fprintf(f, "liveness/code time %0.1f%%\n", | |
| 2025 | + (double)s->la_time / (s->code_time ? s->code_time : 1) * 100.0); | |
| 2026 | + cpu_fprintf(f, "cpu_restore count %" PRId64 "\n", | |
| 2027 | + s->restore_count); | |
| 2028 | + cpu_fprintf(f, " avg cycles %0.1f\n", | |
| 2029 | + s->restore_count ? (double)s->restore_time / s->restore_count : 0); | |
| 2030 | + { | |
| 2031 | + extern void dump_op_count(void); | |
| 2032 | + dump_op_count(); | |
| 2033 | + } | |
| 2034 | +} | |
| 2035 | +#else | |
| 2036 | +void dump_tcg_info(FILE *f, | |
| 2037 | + int (*cpu_fprintf)(FILE *f, const char *fmt, ...)) | |
| 2038 | +{ | |
| 2039 | + cpu_fprintf("[TCG profiler not compiled]\n"); | |
| 2040 | +} | |
| 2041 | +#endif | ... | ... |
tcg/tcg.h
| ... | ... | @@ -236,6 +236,25 @@ struct TCGContext { |
| 236 | 236 | TCGHelperInfo *helpers; |
| 237 | 237 | int nb_helpers; |
| 238 | 238 | int allocated_helpers; |
| 239 | + | |
| 240 | +#ifdef CONFIG_PROFILER | |
| 241 | + /* profiling info */ | |
| 242 | + int64_t tb_count1; | |
| 243 | + int64_t tb_count; | |
| 244 | + int64_t op_count; /* total insn count */ | |
| 245 | + int op_count_max; /* max insn per TB */ | |
| 246 | + int64_t temp_count; | |
| 247 | + int temp_count_max; | |
| 248 | + int64_t old_op_count; | |
| 249 | + int64_t del_op_count; | |
| 250 | + int64_t code_in_len; | |
| 251 | + int64_t code_out_len; | |
| 252 | + int64_t interm_time; | |
| 253 | + int64_t code_time; | |
| 254 | + int64_t la_time; | |
| 255 | + int64_t restore_count; | |
| 256 | + int64_t restore_time; | |
| 257 | +#endif | |
| 239 | 258 | }; |
| 240 | 259 | |
| 241 | 260 | extern TCGContext tcg_ctx; |
| ... | ... | @@ -281,6 +300,8 @@ TCGv tcg_global_mem_new(TCGType type, int reg, tcg_target_long offset, |
| 281 | 300 | const char *name); |
| 282 | 301 | TCGv tcg_temp_new(TCGType type); |
| 283 | 302 | char *tcg_get_arg_str(TCGContext *s, char *buf, int buf_size, TCGv arg); |
| 303 | +void tcg_dump_info(FILE *f, | |
| 304 | + int (*cpu_fprintf)(FILE *f, const char *fmt, ...)); | |
| 284 | 305 | |
| 285 | 306 | #define TCG_CT_ALIAS 0x80 |
| 286 | 307 | #define TCG_CT_IALIAS 0x40 | ... | ... |