Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

enable constant cache on ractors #4022

Merged
merged 1 commit into from Jan 4, 2021
Merged

enable constant cache on ractors #4022

merged 1 commit into from Jan 4, 2021

Conversation

ko1
Copy link
Contributor

@ko1 ko1 commented Jan 4, 2021

constant cache IC is accessed by non-atomic manner and there are
thread-safety issues, so Ruby 3.0 disables to use const cache on
non-main ractors.

This patch enables it by introducing imemo_constcache and allocates
it by every re-fill of const cache like imemo_callcache.

Now IC only has one entry IC::entry and it points to
iseq_inline_constant_cache_entry, managed by T_IMEMO object.

Now IC is atomic data structure so rb_mjit_before_vm_ic_update() and
rb_mjit_after_vm_ic_update() is not needed.

@ko1
Copy link
Contributor Author

ko1 commented Jan 4, 2021

Warning[:experimental] = false

def tarai(x, y, z) = Object && # useless constant reference
  x <= y ? y : tarai(tarai(x-1, y, z),
                     tarai(y-1, z, x),
                     tarai(z-1, x, y))
def task = tarai(12, 6, 0)
#
require 'benchmark'

Benchmark.bm{|x|
  x.report('seq'){ 4.times{ task } }
  x.report('par'){ 4.times.map{ Ractor.new{ task } }.each(&:take) }
}
master (095972e799):
       user     system      total        real
seq  1.618664   0.001916   1.620580 (  1.620620)
par 18.168252  16.840400  35.008652 (  9.452195)

This patch:
       user     system      total        real
seq  1.587542   0.000000   1.587542 (  1.587548)
par  1.950062   0.000000   1.950062 (  0.497173)

constant cache `IC` is accessed by non-atomic manner and there are
thread-safety issues, so Ruby 3.0 disables to use const cache on
non-main ractors.

This patch enables it by introducing `imemo_constcache` and allocates
it by every re-fill of const cache like `imemo_callcache`.
[Bug #17510]

Now `IC` only has one entry `IC::entry` and it points to
`iseq_inline_constant_cache_entry`, managed by T_IMEMO object.

`IC` is atomic data structure so `rb_mjit_before_vm_ic_update()` and
`rb_mjit_after_vm_ic_update()` is not needed.
@ko1 ko1 merged commit e7fc353 into ruby:master Jan 4, 2021
@ko1 ko1 deleted the ractor_const_cache branch January 4, 2021 17:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
1 participant