Bug #20489
openRactor behavior strange in ruby master
Description
This is a tarai program
Run./ruby tarai_ractor.rb 2 8
is to use 2 thread to run 8 times tarai function total, that means 4 times tarai for each ractor(thread).
GC.disable
def split_len(len, split)
ret = []
mod = len % split
head = 0
tail = 0
split.times do |i|
if head >= len
break
end
k = 0
if i < mod then k = 1 end
tail = tail + (len/split) + k
ret.append(head...tail)
head = tail
end
return ret
end
def ary_split(ary, split)
return split_len(ary.length,split)
end
def item_check(item)
if item[0] != nil
1 + item_check(item[0]) + item_check(item[1])
else
1
end
end
def tarai(x, y, z) =
x <= y ? y : tarai(tarai(x-1, y, z),
tarai(y-1, z, x),
tarai(z-1, x, y))
times = ARGV[0].to_i
split = ARGV[1].to_i
p split_len(times, split)
split_len(times, split).each.map do |sp|
Ractor.new (sp) {
s = _1
s.each do
tarai(13, 7, 0)
end
}
end.each(&:take)
The problem is in ruby 3.1.2 and ruby 3.3
./ruby tarai_ractor.rb 1 1
has simiular execute time with ./ruby tarai_ractor.rb 8 8
because each thread only run 1 time of tarai function, like follow:
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-linux]:
time ruby exp_ractor_tarai.rb 1 1
[0...1]
<internal:ractor>:267: warning: Ractor is experimental, and the behavior may change in future versions of Ruby! Also there are many implementation issues.
real 0m1.442s
user 0m1.429s
sys 0m0.014s
time ruby exp_ractor_tarai.rb 8 8
[0...1, 1...2, 2...3, 3...4, 4...5, 5...6, 6...7, 7...8]
<internal:ractor>:267: warning: Ractor is experimental, and the behavior may change in future versions of Ruby! Also there are many implementation issues.
real 0m1.857s
user 0m13.817s
sys 0m0.041s
But in ruby master(ruby 3.4.0dev)
ruby 3.4.0dev (2024-05-14T01:58:31Z master 9d01f657b3) [x86_64-linux]
1 ractor 1 tarai:
time ../ruby exp_ractor_tarai.rb 1 1
`RubyGems' were not loaded.
`error_highlight' was not loaded.
`did_you_mean' was not loaded.
`syntax_suggest' was not loaded.
[0...1]
exp_ractor_tarai.rb:47: warning: Ractor is experimental, and the behavior may change in future versions of Ruby! Also there are many implementation issues.
real 0m1.671s
user 0m1.666s
sys 0m0.005s
8 ractor 8 tarai:
time ../ruby exp_ractor_tarai.rb 8 8
`RubyGems' were not loaded.
`error_highlight' was not loaded.
`did_you_mean' was not loaded.
`syntax_suggest' was not loaded.
[0...1, 1...2, 2...3, 3...4, 4...5, 5...6, 6...7, 7...8]
exp_ractor_tarai.rb:47: warning: Ractor is experimental, and the behavior may change in future versions of Ruby! Also there are many implementation issues.
real 0m18.408s
user 1m58.659s
sys 0m0.021s
And in ruby 3.4.0dev when run time ../ruby exp_ractor_tarai.rb 16 16
16 thread should be used in system monitoring while only 8 threads are used.
Ruby 3.3 and Ruby 3.1.2 do not have this problem.
Files
Updated by ko1 (Koichi Sasada) 6 months ago
Thank you. I'll investigate it.
Updated by hsbt (Hiroshi SHIBATA) about 2 months ago
- Status changed from Open to Assigned
- Assignee set to ko1 (Koichi Sasada)