ruby-changes:68869
From: Alan <ko1@a...>
Date: Thu, 21 Oct 2021 08:14:59 +0900 (JST)
Subject: [ruby-changes:68869] 7f4b9e8e61 (master): YJIT: make ratio_in_yjit more accurate
https://git.ruby-lang.org/ruby.git/commit/?id=7f4b9e8e61 From 7f4b9e8e6103c039f1f73e6d51f956f8c662b49a Mon Sep 17 00:00:00 2001 From: Alan Wu <XrXr@u...> Date: Tue, 6 Apr 2021 16:28:41 -0400 Subject: YJIT: make ratio_in_yjit more accurate Don't count instructions that take exit to the interpreter. --- yjit_codegen.c | 6 +++--- yjit_iface.c | 12 ++++++++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/yjit_codegen.c b/yjit_codegen.c index 60560b70c8..fd029b3287 100644 --- a/yjit_codegen.c +++ b/yjit_codegen.c @@ -318,9 +318,9 @@ yjit_gen_block(ctx_t* ctx, block_t* block, rb_execution_context_t* ec) https://github.com/ruby/ruby/blob/trunk/yjit_codegen.c#L318 //fprintf(stderr, "compiling %d: %s\n", insn_idx, insn_name(opcode)); //print_str(cb, insn_name(opcode)); - // Count bytecode instructions that execute in generated code - // FIXME: when generation function returns false, we shouldn't increment - // this counter. + // :count-placement: + // Count bytecode instructions that execute in generated code. + // Note that the increment happens even when the output takes side exit. GEN_COUNTER_INC(cb, exec_instruction); // Call the code generation function diff --git a/yjit_iface.c b/yjit_iface.c index 989f7f9a56..32b9c52da5 100644 --- a/yjit_iface.c +++ b/yjit_iface.c @@ -791,9 +791,17 @@ print_insn_count_buffer(const struct insn_count *buffer, int how_many, int left_ https://github.com/ruby/ruby/blob/trunk/yjit_iface.c#L791 total_exit_count += buffer[i].count; } + // Number of instructions that finish executing in YJIT. See :count-placement:. + int64_t retired_in_yjit = yjit_runtime_counters.exec_instruction - total_exit_count; + // Average length of instruction sequences executed by YJIT double avg_len_in_yjit = (double)yjit_runtime_counters.exec_instruction / total_exit_count; + // Proportion of instructions that retire in YJIT + double total_insns_count = retired_in_yjit + vm_insns_count; + double ratio = retired_in_yjit / total_insns_count; + + fprintf(stderr, "ratio_in_yjit: %9.1f%%\n", ratio * 100); fprintf(stderr, "avg_len_in_yjit: %10.1f\n", avg_len_in_yjit); fprintf(stderr, "total_exit_count: %10ld\n", total_exit_count); fprintf(stderr, "most frequent exit op:\n"); @@ -817,15 +825,11 @@ print_yjit_stats(void) https://github.com/ruby/ruby/blob/trunk/yjit_iface.c#L825 const struct insn_count *sorted_exit_ops = sort_insn_count_array(exit_op_count); - double total_insns_count = vm_insns_count + yjit_runtime_counters.exec_instruction; - double ratio = yjit_runtime_counters.exec_instruction / total_insns_count; - fprintf(stderr, "compiled_iseq_count: %10" PRId64 "\n", rb_compiled_iseq_count); fprintf(stderr, "inline_code_size: %10d\n", cb->write_pos); fprintf(stderr, "outlined_code_size: %10d\n", ocb->write_pos); fprintf(stderr, "vm_insns_count: %10" PRId64 "\n", vm_insns_count); fprintf(stderr, "yjit_exec_insns_count: %10" PRId64 "\n", yjit_runtime_counters.exec_instruction); - fprintf(stderr, "ratio_in_yjit: %9.1f%%\n", ratio * 100); print_insn_count_buffer(sorted_exit_ops, 10, 4); } #endif // if RUBY_DEBUG -- cgit v1.2.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/