[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]