Builderscon 2019 http://builderscon.io/builderscon/tokyo/2019
Optimizing Ruby with JITBuilderscon 2019 / Takashi Kokubun࠷ͷݴޠΛࢦͯ͠
View Slide
Ruby 2.6 ͔ΒJITΛ։ൃ
Γ·ͨ͠ [Misc #16094]
(࠷దԽࢹͰͷ)Rubyͷಛ
1. ϝιουఆ࠶ఆٛ͠์1 + 1 #=> 100
2. ߦ͕ਐΉͱҙͷ͜ͱ͕ى͖Δa = 1 + 1
2. ߦ͕ਐΉͱҙͷ͜ͱ͕ى͖Δa = 1 + 1a #=> 2
2. ߦ͕ਐΉͱҙͷ͜ͱ͕ى͖Δa = 1 + 1a #=> 2a #=> 100!?
2. ߦ͕ਐΉͱҙͷ͜ͱ͕ى͖Δ
2. ߦ͕ਐΉͱҙͷ͜ͱ͕ى͖Δʮ3ߦʹୡͨ͠Β a = 100ʯ
3. ଞʹָ͍͠ػೳ͕͍ͬͺ͍• eval• ଋറڥͷΦϒδΣΫτԽ (binding, Proc)• ҙΦϒδΣΫτͷྻڍػೳ (ObjectSpace)• Φʔόʔϑϩʔ͢Δͱܕ͕มΘΔ• ΞυϨεมΘΓ์ͷώʔϓྖҬ (GC.compact)
ຊͷΰʔϧ͜ͷ࠷దԽ͕ࠔͳݴޠΛݶք·ͰߴԽ͢Δָ͠͞Λମݧ͍ͯͨͩ͘͠
RubyΠϯλϓϦλͷ͘͠Έ
1. RubyͷίʔυΛಡΈࠐΉ
2. ύʔεͯ͠ߏจʹ͢ΔEFGUXP
3. ίϯύΠϧ໋ͯ͠ྩྻʹ͢ΔEFGUXP UXPQVUPCKFDUQVUPCKFDUTFOEMFBWF
4. VMͰ໋ྩྻΛ࣮ߦ͢ΔEFGUXP UXPQVUPCKFDUQVUPCKFDUTFOEMFBWF7JSUVBM.BDIJOFελοΫ
4. VMͰ໋ྩྻΛ࣮ߦ͢ΔEFGUXP UXPQVUPCKFDUTFOEMFBWF7JSUVBM.BDIJOFελοΫ
4. VMͰ໋ྩྻΛ࣮ߦ͢ΔEFGUXP UXPTFOEMFBWF7JSUVBM.BDIJOFελοΫ
4. VMͰ໋ྩྻΛ࣮ߦ͢ΔEFGUXP UXPMFBWF7JSUVBM.BDIJOFελοΫ
͜ͷϑΣʔζͷڍಈΛ͍ͨ͘͠EFGUXP UXPQVUPCKFDUQVUPCKFDUTFOEMFBWF7JSUVBM.BDIJOFελοΫ
5. JIT ίϯύΠϥͰߴԽ͢ΔUXPQVUPCKFDUQVUPCKFDUTFOEMFBWF7JSUVBM.BDIJOFελοΫ+*5
5. JIT ίϯύΠϥͰߴԽ͢ΔUXPQVUPCKFDUQVUPCKFDUTFOEMFBWF7JSUVBM.BDIJOFελοΫ+*5ࠓͷͱ͜Ζ*OUFHFS࠶ఆٛ͞Εͯͳ͍ͳ
5. JIT ίϯύΠϥͰߴԽ͢ΔUXPQVUPCKFDUQVUPCKFDUTFOEMFBWF7JSUVBM.BDIJOFελοΫ+*5ͳͷͰ
5. JIT ίϯύΠϥͰߴԽ͢ΔUXPQVUPCKFDUQVUPCKFDUTFOEMFBWF7JSUVBM.BDIJOFελοΫ+*5͍ɺ͕࠶ఆٛ͞ΕͨΒ͔
JITͰͲͷ͘Β͍͘ͳΔͷ͔
JITʹ͓͚Δੑೳ্NES emulator: github.com/mame/optcarrotfps0234669922.00.00.00.00.00.00.00.034.2Details: https://gist.github.com/k0kubun/0337e1f40b146b2cae7b7c8e6a79973a1.0xVersion
JITʹ͓͚Δੑೳ্NES emulator: github.com/mame/optcarrotfps0234669922.02.12.22.30.00.00.00.039.137.937.834.2Details: https://gist.github.com/k0kubun/0337e1f40b146b2cae7b7c8e6a79973a1.1xVersion
JITʹ͓͚Δੑೳ্NES emulator: github.com/mame/optcarrotfps0234669922.02.12.22.32.42.50.00.049.046.239.137.937.834.2Details: https://gist.github.com/k0kubun/0337e1f40b146b2cae7b7c8e6a79973a1.4xVersion
JITʹ͓͚Δੑೳ্NES emulator: github.com/mame/optcarrotfps0234669922.02.12.22.32.42.52.60.055.949.046.239.137.937.834.2Details: https://gist.github.com/k0kubun/0337e1f40b146b2cae7b7c8e6a79973a1.6xVersion
JITʹ͓͚Δੑೳ্NES emulator: github.com/mame/optcarrotfps0234669922.02.12.22.32.42.52.62.6JIT85.855.949.046.239.137.937.834.2Details: https://gist.github.com/k0kubun/0337e1f40b146b2cae7b7c8e6a79973a2.5xVersion
͜ͷ͕ࠩग़Δཧ༝Λݟ͍͖ͯ·͢NES emulator: github.com/mame/optcarrotfps0234669922.62.6JIT85.855.90.00.00.00.00.00.0Details: https://gist.github.com/k0kubun/0337e1f40b146b2cae7b7c8e6a79973aVersion
JITίϯύΠϥͲͷΑ͏ʹߴԽΛ͢Δ͔?
JITͷجૅ0ػցޠʹ͚ͨͩ͠Ͱ͘ͳΒͳ͍
VM࣮ߦ → ػցޠ ͰͷੑೳมԽNES emulator: github.com/mame/optcarrotfps0234669922.6native2.6JIT85.855.9?(-O3 w/ VM໋ྩΠϯϥΠϯԽͳ͠)
VM࣮ߦ → ػցޠ ͰͷੑೳมԽNES emulator: github.com/mame/optcarrotfps0234669922.6native2.6JIT85.856.255.9(-O3 w/ VM໋ྩΠϯϥΠϯԽͳ͠)
ػցޠʹ͚ͨͩ͠Ͱ͘ͳΒͳ͍• VMͷ࣮͕ͦͦػցޠͰಈ͍͍ͯΔ• VMͰ࣮͞Ε͍ͯΔෳࡶͳॲཧΛ؆ུԽͰ͖ͳ͚Ε͘ͳΒͳ͍
VMͷதͰԿ͕ى͖͍ͯΔ͔(Ͳ͕͘͜Ͱ͖ͦ͏Ͱ͠ΐ͏͔?)
RubyͷJITCίϯύΠϥΛ͏• ࣮ߦ࣌ʹCίϯύΠϥΛ࣮ߦͯ͠ಈతϥΠϒϥϦΛੜɺಈతϩʔυ• ϝϦοτ: Ҡ২ੑͷ୲อ͕ͦΕͳΓʹָɺෳͷ࠷దԽόοΫΤϯυΛ͑Δ• σϝϦοτ: JITίϯύΠϧத·͋·͋ϦιʔεΛ͏ɺϓϩηεγάφϧͷѻ͍͕ࡶʹͳΔ
RubyͷJITCίϯύΠϥΛ͏• CίϯύΠϥී௨ͷCͷίʔυͰ࠷దԽͰ͖Δൣғ͔͠࠷దԽͰ͖ͳ͍• Rubyಛ༗ͷಛผͳॲཧΛऔΓআ͘ͷେମࣗͰ࣮͢Δ͔͠ͳ͍
ίϯύΠϥͷ࠷దԽʹΑΔߴԽNES emulator: github.com/mame/optcarrotfps0234669922.6nativecompiler2.6JIT85.862.556.255.9(-O3 w/ VM໋ྩΠϯϥΠϯԽ͋Γ)
JITͷجૅ1ϓϩάϥϜΧϯλͷ࠷దԽ
ϓϩάϥϜΧϯλͷ࠷దԽ• VMͷϓϩάϥϜΧϯλͷҙٛͷҰͭVM໋ྩσΟεύον͕ͩɺ͜Εෆཁʹͳ͍ͬͯΔ• ͰɺϓϩάϥϜΧϯλಈ͔͞ͳ͍͍͔ͯ͘?
ϓϩάϥϜΧϯλͷ࠷దԽ• ଞͷϓϩάϥϜΧϯλͷ༻్:• ྫ֎ͷΩϟονςʔϒϧʹΘΕΔ• ྫ֎͕ͳ͘ͱߦ൪߸ͷܭࢉʹΘΕΔ
ϓϩάϥϜΧϯλͷ࠷దԽNES emulator: github.com/mame/optcarrotfps0234669922.6nativecompilerpc2.6JIT85.862.762.556.255.9
JITͷجૅ2ελοΫϙΠϯλͷ࠷దԽ
ελοΫϙΠϯλͷ࠷దԽ• VMͷελοΫϙΠϯλͷҙٛVMͷελοΫͷૢ࡞ʹ͋Δ• ωΠςΟϒͳελοΫϨδελͰಉ͡ૢ࡞Λ࣮ݱͯ͠ελοΫϙΠϯλΛΊΒΕͳ͍͔?
ελοΫϙΠϯλͷ࠷దԽ• ϝιουݺͼग़͢͠ΔࡍʹVMͷελοΫʹ͞ͳ͍ͱݺͼग़ͨ͠ϝιου͔ΒࢀরͰ͖ͳ͍• େҬग़ޙʹΘΕΔ
ελοΫϙΠϯλͷ࠷దԽNES emulator: github.com/mame/optcarrotfps0234669922.6nativecompilerpc sp2.6JIT85.866.462.762.556.255.9
·͔ͩͳΓ͕ࠩ͋Δ NES emulator: github.com/mame/optcarrotfps0234669922.6nativecompilerpc sp2.6JIT85.866.462.762.556.255.9
Ͳ͏ͨ͠Βߋʹ͘ͳΔͷ͔?• PC/SPͷૢ࡞ผʹϘτϧωοΫͰͳ͍ͷͰ͜ΕͰ͘ͳΒͳ͍• Ή͠ΖRubyͷಈతͳಛੑͷαϙʔτͷͨΊʹ͘͠ͳ͍ͬͯΔ࠷దԽΛ࣮ݱ͢Δํ͕ॏཁ
JITͷڧΈΛੜ͔ͨ͠࠷దԽ
JITͷԠ༻1ϝιουΠϯϥΠϯԽ
ϝιουΠϯϥΠϯԽ• 1+1Λܭࢉ͢ΔΑΓRubyͷϝιουݺͼग़͠ॲཧͷํ͕ෳࡶ• ϝιουݺͼग़͠ͷΦʔόʔϔουΛແʹͰ͖ͳ͍͔? => ΠϯϥΠϯԽ
ϝιουΠϯϥΠϯԽ• ΠϯϥΠϯԽ͢ΔͱɺίʔϧελοΫͷૢ࡞͕ͳ͘ͳΔ͚ͩͰͳ͘ɺϝιουݺͼग़͠Λӽ͑ͯ࠷దԽ͕ޮ͘• ͔͠͠ΠϯϥΠϯԽͨ͠ޙਖ਼͍͠ڍಈʹదʹ෮ؼͰ͖Δඞཁ͕͋Δ• “Deoptimization” ͱ͍͏
Rubyͷϝιουݺͼग़͠ͷ͘͠Έ• άϩʔόϧϝιουΩϟογϡͱΠϯϥΠϯϝιουΩϟογϡ͕͋Δ• ΠϯϥΠϯϝιουΩϟογϡશͯͷcall siteʹରͯ͠ଘࡏ͢Δ• ͜ΕΛDeoptimizationʹ͏
ϝιουΠϯϥΠϯԽ• ΠϯϥΠϯԽ͢ΔϝιουͰߦ൪߸Λऔಘͨ͠Γྫ֎͕ඈΜͩΓ͠ͳ͍͜ͱΛอূ͠ͳ͍ͱ͍͚ͳ͍• VM໋ྩͷϝλσʔλΛ༻ҙ͓ͯ͘͠
ϝιουΠϯϥΠϯԽ
ϝιουΠϯϥΠϯԽNES emulator: github.com/mame/optcarrotfps0234669922.6nativecompilerpc spinline2.6JIT85.872.466.462.762.556.255.9
JITͷԠ༻2Πϯελϯεมͷ࠷దԽ
Πϯελϯεมͷ࠷దԽ• ΠϯελϯεมΛಡΉʹԿ͔ϝϞϦͷϩʔυΛ͠ͳ͍ͱ͍͚ͳ͍ => ͍• ຊདྷϩʔυ͠ͳ͍ͱ͍͚ͳ͍ΛJITੜίʔυͰଈʹͰ͖ͳ͍͔?
RubyͷΠϯελϯεมͷ͘͠Έ• Ϋϥε͝ͱʹɺ͋ΔΠϯελϯεม͕֨ೲ͞Ε͍ͯΔΠϯσοΫε͕ҟͳΔ• ܧঝͯ͠ಉ໋͡ྩྻ͕ڞ༗͞Ε͍ͯΔͱյΕΔ
Πϯελϯεมͷ࠷దԽ• ϝιουΠϯϥΠϯԽͱಉ༷ͷํ๏ͰDeoptimization͢Δ• Ճ͑ͯɺ༨ܭͳϒϥϯνΛΔ͜ͱͰίϯύΠϥͷ࠷దԽ͕ޮ͖͘͢͢Δ
Πϯελϯεมͷ࠷దԽ
Πϯελϯεมͷ࠷దԽNES emulator: github.com/mame/optcarrotfps0234669922.6nativecompilerpc spinlineivar2.6JIT85.885.872.466.462.762.556.255.9
Ruby·ͩਐԽΛ͍ͯ͠Δ(TruffleRuby 170fps ग़Δ)
·ͱΊ• Ruby࠷ͷݴޠͱͳΓಘΔ͔ʁ• ଞͷݴޠͰॻ͚ΔίʔυɺେͦΕ૬ʹ࠷దԽͰ͖Δ• Rubyಛ༗ͬΆ͍ݴޠػೳઅͷ͋Δར༻Λ