ruby-changes:68784
From: Maxime <ko1@a...>
Date: Thu, 21 Oct 2021 08:13:32 +0900 (JST)
Subject: [ruby-changes:68784] 0710bec01e (master): Implement --ujit-call-threshold
https://git.ruby-lang.org/ruby.git/commit/?id=0710bec01e From 0710bec01e405af596fa3e8e29ba38bb8176e39d Mon Sep 17 00:00:00 2001 From: Maxime Chevalier-Boisvert <maxime.chevalierboisvert@s...> Date: Tue, 23 Feb 2021 15:22:20 -0500 Subject: Implement --ujit-call-threshold --- mjit.h | 2 +- ruby.c | 7 ++++--- ujit.h | 19 +++++++++---------- ujit_iface.c | 20 +++++++++++++++++--- 4 files changed, 31 insertions(+), 17 deletions(-) diff --git a/mjit.h b/mjit.h index 0264962da8..83f5cb919a 100644 --- a/mjit.h +++ b/mjit.h @@ -150,7 +150,7 @@ mjit_exec(rb_execution_context_t *ec) https://github.com/ruby/ruby/blob/trunk/mjit.h#L150 } #ifndef MJIT_HEADER - if (rb_ujit_enabled_p() && !mjit_call_p && body->total_calls == UJIT_CALL_THRESHOLD) { + if (rb_ujit_enabled_p() && !mjit_call_p && body->total_calls == rb_ujit_call_threshold()) { rb_ujit_compile_iseq(iseq); return Qundef; } diff --git a/ruby.c b/ruby.c index b5c705002a..78d400278f 100644 --- a/ruby.c +++ b/ruby.c @@ -1033,12 +1033,13 @@ set_option_encoding_once(const char *type, VALUE *name, const char *e, long elen https://github.com/ruby/ruby/blob/trunk/ruby.c#L1033 static void setup_ujit_options(const char *s, struct rb_ujit_options *ujit_opt) { - *ujit_opt = (struct rb_ujit_options) { 0 }; - if (*s != '-') return; const size_t l = strlen(++s); - if (opt_match_noarg(s, l, "stats")) { + if (opt_match_arg(s, l, "call-threshold")) { + ujit_opt->call_threshold = atoi(s + 1); + } + else if (opt_match_noarg(s, l, "stats")) { ujit_opt->gen_stats = true; } else { diff --git a/ujit.h b/ujit.h index c2e03e5e26..6957e9178f 100644 --- a/ujit.h +++ b/ujit.h @@ -32,22 +32,21 @@ typedef struct rb_iseq_struct rb_iseq_t; https://github.com/ruby/ruby/blob/trunk/ujit.h#L32 #endif struct rb_ujit_options { + bool ujit_enabled; + + // Number of method calls after which to start generating code + // Threshold==1 means compile on first execution + unsigned call_threshold; + + // Capture and print out stats bool gen_stats; }; RUBY_SYMBOL_EXPORT_BEGIN -RUBY_EXTERN bool rb_ujit_enabled; +bool rb_ujit_enabled_p(void); +unsigned rb_ujit_call_threshold(void); RUBY_SYMBOL_EXPORT_END -static inline -bool rb_ujit_enabled_p(void) -{ - return rb_ujit_enabled; -} - -// Threshold==1 means compile on first execution -#define UJIT_CALL_THRESHOLD (2u) - void rb_ujit_collect_vm_usage_insn(int insn); void rb_ujit_method_lookup_change(VALUE cme_or_cc); void rb_ujit_compile_iseq(const rb_iseq_t *iseq); diff --git a/ujit_iface.c b/ujit_iface.c index b9368b2fe1..9893c73467 100644 --- a/ujit_iface.c +++ b/ujit_iface.c @@ -24,12 +24,12 @@ VALUE cUjitBlock; https://github.com/ruby/ruby/blob/trunk/ujit_iface.c#L24 VALUE cUjitDisasm; VALUE cUjitDisasmInsn; -bool rb_ujit_enabled; - +#if RUBY_DEBUG static int64_t vm_insns_count = 0; int64_t rb_ujit_exec_insns_count = 0; static int64_t exit_op_count[VM_INSTRUCTION_SIZE] = { 0 }; int64_t rb_compiled_iseq_count = 0; +#endif // Machine code blocks (executable memory) extern codeblock_t *cb; @@ -627,6 +627,16 @@ rb_ujit_iseq_free(const struct rb_iseq_constant_body *body) https://github.com/ruby/ruby/blob/trunk/ujit_iface.c#L627 rb_darray_free(body->ujit_blocks); } +bool rb_ujit_enabled_p(void) +{ + return rb_ujit_opts.ujit_enabled; +} + +unsigned rb_ujit_call_threshold(void) +{ + return rb_ujit_opts.call_threshold; +} + void rb_ujit_init(struct rb_ujit_options *options) { @@ -636,8 +646,12 @@ rb_ujit_init(struct rb_ujit_options *options) https://github.com/ruby/ruby/blob/trunk/ujit_iface.c#L646 } rb_ujit_opts = *options; + rb_ujit_opts.ujit_enabled = true; - rb_ujit_enabled = true; + // Normalize options + if (rb_ujit_opts.call_threshold < 1) { + rb_ujit_opts.call_threshold = 10; + } ujit_init_core(); ujit_init_codegen(); -- cgit v1.2.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/