Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Cコンパイラを利用したRubyのJITコンパイラ / Programming Symposium 60

Cコンパイラを利用したRubyのJITコンパイラ / Programming Symposium 60

第60回 プログラミング・シンポジウム

Takashi Kokubun

January 12, 2019
Tweet

More Decks by Takashi Kokubun

Other Decks in Programming

Transcript

  1. CίϯύΠϥΛར༻ͨ͠
    RubyͷJITίϯύΠϥ
    ࠃ෼ਸࢤ / Arm Treasure Data
    ୈ60ճ ϓϩάϥϛϯά γϯϙδ΢Ϝ

    View Slide

  2. ࣗݾ঺հ
    • ࠃ෼ ਸࢤ (@k0kubun)

    • ॴଐ: τϨδϟʔσʔλגࣜձࣾ (Arm͕ങऩ)

    • Rubyίϛολʔ 3೥໨

    • JITίϯύΠϥΛ։ൃ

    • ςϯϓϨʔτΤϯδϯͷϝϯςφ

    View Slide

  3. LLRB - LLVMϕʔεͷRubyͷJIT

    View Slide

  4. Ruby 2.6ͰͷJIT։ൃ

    View Slide

  5. ΞδΣϯμ
    • RubyͷJITख๏ͷ֓ཁ

    • ར఺ɺܽ఺ɺ࣮ݱՄೳͳ࠷దԽྫ

    • ੑೳධՁ

    View Slide

  6. RubyͷJITख๏ͷ֓ཁ

    View Slide

  7. RubyͱJITʹ͍ͭͯ
    • Ruby: ಈతܕ෇͚ͷΦϒδΣΫτࢦ޲εΫϦϓτݴޠ

    • ελοΫϕʔεͷόΠτίʔυΛ࣋ͭVirtual Machine

    • JITίϯύΠϧ: ࣮ߦ࣌ίϯύΠϧ

    • ຊൃදͰ͸ɺRuby VMͷόΠτίʔυͷ͔ΘΓʹɺJITͰੜ੒
    ͨ͠ػցޠΛݺͼग़͢͜ͱͰ࠷దԽ͢Δ໨తʹ࢖͏

    View Slide

  8. RubyʹJITΛಋೖ͢Δഎܠͱ໨త
    എܠ:

    • Ruby͸WebΞϓϦέʔγϣϯʹΑ͘࢖ΘΕΔ

    ໨త:

    • WebΞϓϦέʔγϣϯαʔόʔͳͲ௕ظ࣮ߦ͢Δϓϩ
    άϥϜͰੑೳΛ্͛ɺϢʔβʔମݧΛ޲্ͤͨ͞Γɺ
    αʔόʔ୆਺ΛݮΒͨ͠Γ͍ͨ͠

    View Slide

  9. ຊख๏ͷ֓ཁ
    • ΠϯλϓϦλىಈ࣌ʹJIT༻ͷεϨουΛىಈ

    • Ruby 2.6ͷ࣌఺Ͱ͸σϑΥϧτͰͳ͍ͷͰɺཁ --jit

    • ϝΠϯͷεϨουͰ5ճҎ্ݺͼग़͞Εͨϝιου͕
    Ωϡʔʹੵ·ΕΔ

    • JIT༻ͷεϨου͕ϝιου୯ҐͰόΠτίʔυΛػցޠ
    ʹίϯύΠϧ

    View Slide

  10. ຊख๏ͷ֓ཁ
    1. όΠτίʔυΛCͷίʔυʹม׵ + CͷϨϕϧͰ࠷దԽ

    2. σΟεΫ (/tmp) ʹ .c ͷϑΝΠϧΛॻ͖ग़͢

    3. RubyΠϯλϓϦλ͕࣮ߦ࣌ʹCίϯύΠϥϓϩηεΛىಈ

    4. ੜ੒ͨ͠ .so ϑΝΠϧΛಈతϩʔυ

    5. όΠτίʔυͷ୅ΘΓʹϩʔυͨؔ͠਺ΛݺͿΑ͏ʹมߋ

    View Slide

  11. ຊख๏ͷ֓ཁ

    View Slide

  12. ຊख๏ͷ֓ཁ

    View Slide

  13. View Slide

  14. RubyͷJITख๏ͷར఺

    View Slide

  15. ར఺ 1: ΞηϯϒϦίʔυੜ੒͔Βͷ։์
    • ؆୯: ςϯϓϨʔτΤϯδϯͰಈతͳCίʔυੜ੒

    • VMΛ࣮૷͢Δ͚ͩͰσϑΥϧτͷJIT࣮૷Λࣗಈੜ੒Ͱ͖Δ

    • ϙʔλϒϧ: ΠϯλϓϦλ͕ϏϧυͰ͖Δ؀ڥͰ͸࢖͑Δ͸ͣ

    • Cͷ࢓༷͕มΘΒͳ͍ͷͰLLVMͷΑ͏ʹඇޓ׵ʹৼΓճ͞Εͳ͍

    View Slide

  16. ར఺ 2: σόοΨΛ࢖ͬͨղੳίετͷ௿Լ
    • gdb౳Ͱσόοά͢ΔࡍɺVMͷ࣮૷ͱಉ͡C͚ͩΛݟΔ͜
    ͱʹͳΔ

    • ίʔυੜ੒͕ࣗલͳΒɺσόοά৘ใೖΕΔͷ΋ࣗલʹͳ
    Γେมͦ͏

    View Slide

  17. ར఺ 3: ௿ϨΠϠʔͷ࠷దԽͷ
    CίϯύΠϥ΁ͷҠৡ
    • ༷ʑͳ࠷దԽςΫχοΫΛ࠶ൃ໌͢ΔϦιʔε͸ͳ͍

    • ੜ੒ίʔυ͔ΒVMͷؔ਺Λ༰қʹΠϯϥΠϯԽՄೳ

    View Slide

  18. ར఺ 4: ෳ਺ͷίϯύΠϥج൫͕׆༻Մೳ
    • GCCͱClang/LLVMͷ྆ํ͕ར༻ՄೳͰɺVisual Studioʹ
    ΋ରԠ

    • ΍Ζ͏ͱࢥ͑͹LLVM PassΛࣗ࡞ͯ͠ opt(1) ͔Β࢖͑Δ
    ͔΋͠Εͳ͍

    View Slide

  19. RubyͷJITख๏ͷܽ఺

    View Slide

  20. ܽ఺ 1: ຊख๏ͷϩʔυํ๏ʹΑΔ
    Φʔόʔϔου
    • dlopen ͢Δͱ֤ϝιου(.soϑΝΠϧ)͕3ͭͷϖʔδʹ෼ׂ
    ͞Εͯϩʔυ͞ΕɺΩϟογϡʹѱӨڹ

    • ͳͷͰɺޙͰෳ਺ͷϝιουΛ·ͱΊͯ࠶ίϯύΠϧ͍ͯ͠
    Δ͕ɺ໘౗

    View Slide

  21. ܽ఺ 1: ຊख๏ͷϩʔυํ๏ʹΑΔ
    Φʔόʔϔου
    ৄࡉ: http://shinh.hatenablog.com/entry/2018/06/10/235314

    View Slide

  22. ܽ఺ 1: ຊख๏ͷϩʔυํ๏ʹΑΔ
    Φʔόʔϔου
    https://github.com/ruby/ruby/pull/1921

    View Slide

  23. ܽ఺ 2: ࣮ߦ࣌ґଘͷෳࡶԽ - CίϯύΠϥ
    • ͜Ε·ͰɺCίϯύΠϥ͸ΠϯλϓϦλ͔Β࣮ߦՄೳͳඞ
    ཁ͸ͳ͔ͬͨ

    • ϓϦίϯύΠϧυϔομ͸CίϯύΠϥͷόʔδϣϯʹґ
    ଘ͢ΔͷͰɺຖճίϯύΠϧ

    View Slide

  24. ܽ఺ 3: ίϯύΠϥ͝ͱͷࠩҟͷରԠ
    • CίϯύΠϥ͝ͱʹҟͳΔΦϓγϣϯʹରԠ͢Δඞཁ͕͋Δ

    • جຊతʹ͸ΠϯλϓϦλͷϏϧυͱಉ͡CFLAGS͕ඞਢͩ
    ͕ɺҰ෦͸ٯʹ࡟Βͳ͍ͱಈ͔ͳ͍

    • GCCʹউखͳύον͕౰ͨͬͯΔOSͷσΟετϦϏϡʔ
    γϣϯ΋͋Δ

    • Visual Studio͸ϓϦϓϩηε͚ͩͯ͠ग़ྗ͕Ͱ͖ͣશ͘ผͷ
    ϏϧυγεςϜ

    View Slide

  25. ܽ఺ 4: ϓϩηε؅ཧ෦෼ͷ
    อकίετͷ૿େ
    • Ruby͕ىಈͨ͠ࢠϓϩηεΛશͯwait͢Δϝιου͕͋
    Δ͕ɺ౰વJIT༻GCC͸଴ͪͨ͘ͳ͍

    • ͳͷͰɺϩοΫΛऔΓͭͭpidͷϦετΛ؅ཧ͢Δ

    • ϚϧνεϨου + Ϛϧνϓϩηε + γάφϧϋϯυϥ =
    ແݶͷrace condition

    • JITεϨου͸GVLͳ͠ɺϝΠϯͷεϨου΋JITεϨο
    υ΋fork͠·͘ΓɺSIGCHLDདྷ·͘Γ

    View Slide

  26. ܽ఺ 5: ηΩϡϦςΟ্ͷݒ೦
    • CίϯύΠϥ΍ϔομɺϥΠϒϥϦ౳͕ࠩ͠ସ͑ΒΕΔͱࠔΔ

    • CίϯύΠϥ͸Ϗϧυ࣌ͱશ͘ಉ͡ϑϧύεΛ࢖͏

    • /tmp ʹݩ͔ΒϑΝΠϧ͕͋Δ৔߹͸஄͘

    • ࢓૊Έ্Ͳ͏͠Α͏΋ͳ͍΋ͷ͸ׂΓ੾Δ

    • Ϣʔβʔ͕GCCΛࣗ༝ʹ࣮ߦͰ͖ΔΑ͏ͳϓϩάϥϜ͸ͦΕࣗମ͕੬ऑ

    • GCC΍ϔομɺੜ੒ίʔυ͕ࠩ͠ସ͑ΒΕΔύʔϛογϣϯΛऔΒΕͯ΋ෛ͚

    View Slide

  27. RubyͷJITख๏Ͱ
    ࣮ݱՄೳͳ࠷దԽྫ

    View Slide

  28. ࠷దԽ 1: ελοΫϙΠϯλɺ
    ϓϩάϥϜΧ΢ϯλͷҠಈ࡟ݮ
    • ελοΫϕʔεͷVM͕࢖͏ελοΫϙΠϯλͷૢ࡞͕ෆཁ

    • ྫ֎ͰେҬ୤ग़ͯ͠΋ελοΫ͸໭ͤͳ͍ͱ͍͚ͳ͍ͷ
    Ͱɺྫ֎Λcatch͠ͳ͍ϝιουʹݶΔ

    • όΠτίʔυͷσΟεύονʹ࢖͏ϓϩάϥϜΧ΢ϯλͷ
    ૢ࡞͕ෆཁ

    • ߦ൪߸ΛऔΔϝιουݺͼग़͠ͷखલͰ͸Ͳ͏ʹ͔෮׆
    ͤ͞Δඞཁ͕͋Δ

    View Slide

  29. ࠷దԽ 2: ΠϯϥΠϯԽΛར༻ͨ͠
    ίϯύΠϥʹΑΔ࠷దԽ
    • ݱࡏ͸ओʹόΠτίʔυ໋ྩͷ࣮૷͕ੜ੒ίʔυ಺͔ΒΠ
    ϯϥΠϯԽՄೳ

    • Ϧςϥϧͷ஋ͱόΠτίʔυ໋ྩͷ࣮૷ΛΠϯϥΠϯ
    Խ͢Δ͚ͩͰɺ1 + 2 ʹର͠ 3 Λੜ੒Ͱ͖Δ

    • CͷίϯύΠϥ͸ؔ਺αΠζ͕େ͖͍ͱΠϯϥΠϯԽ͠
    ͳ͘ͳΔͷͰɺ໌ࣔతͳΠϯϥΠϯԽࢦఆ͕ඞཁͳ͜
    ͱ΋

    View Slide

  30. ࠷దԽ 2: ΠϯϥΠϯԽΛར༻ͨ͠
    ίϯύΠϥʹΑΔ࠷దԽ
    ࣮ݧஈ֊ͷ΋ͷ:

    • RubyͰهड़͞Εͨϝιου͸ΠϯϥΠϯԽ͕؆୯ͳ͜ͱ
    ͸Θ͔͍ͬͯΔ

    • શͯΛΠϯϥΠϯԽ͢ΔͱίϯύΠϧ͕࣌ؒ৳ͼΔͷͰɺ
    Ͳ͜·ͰίϯύΠϧ͢Δ͔ݕ౼த

    • ϧʔϓͷΠϯϥΠϯԽ͕Ͱ͖Δͱޮ͕͘ɺϧʔϓ༻ϝιο
    υ͸CͰ࣮૷͞Ε͓ͯΓɺগ࣮͠૷͕େม

    View Slide

  31. ࠷దԽ 3: ࣮ߦ࣌ͷ৘ใʹґଘͨ͠
    ίʔυੜ੒
    • Կ౓͔ݺͼग़͠ࡁͷϝιουʹରͯ͠JITΛߦͳ͏ͷͰɺ
    JITίϯύΠϧ࣌ʹ͸࣮ߦ࣌ͷܕ৘ใ͕खʹೖΔ

    • ྫ: ϝιουݺͼग़͠ͷ໋ྩʹ͸ɺϝιουΩϟογϡ
    ʹϨγʔόͷΫϥε৘ใ͕͋Δɺ౳

    • ͦͷܕʹಛԽͯ͠ແବͳ෼ذΛআڈͨ͠Γɺؒ઀ࢀরΛΠ
    ϯϥΠϯԽ͢ΔͳͲ͢Δͱߴ଎ʹͳΔ

    View Slide

  32. ੑೳධՁ

    View Slide

  33. ϚΠΫϩϕϯνϚʔΫ: ଎౓
    Ruby 2.6.0 w/ https://github.com/benchmark-driver/mjit-benchmarks
    JIT off ͱൺֱͨ͠଎౓ൺ཰
    0
    2
    4
    5
    7
    aread
    aref
    aset
    aw
    rte
    call
    const2
    const
    fannk fib
    ivread
    ivw
    rite
    m
    andelbrot
    m
    eteor
    nbody
    nest-ntim
    es
    nest-w
    rite
    norm
    nsvb
    red-black
    sieve
    trees
    w
    hile
    6.6
    1.2
    1.7
    1.1
    1.0
    1.4
    2.4
    1.3
    1.2
    1.0
    1.3
    4.6
    3.6
    2.8
    1.0
    5.5
    5.5
    0.9
    2.6
    2.7
    4.6
    2.8
    1.0
    1.0
    1.0
    1.0
    1.0
    1.0
    1.0
    1.0
    1.0
    1.0
    1.0
    1.0
    1.0
    1.0
    1.0
    1.0
    1.0
    1.0
    1.0
    1.0
    1.0
    1.0
    JIT off JIT on
    Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu

    View Slide

  34. ϚΠΫϩϕϯνϚʔΫ: ϝϞϦ
    Ruby 2.6.0 w/ https://github.com/benchmark-driver/mjit-benchmarks
    Max Resident Set Size (MB)
    0
    13
    25
    38
    50
    aread
    aref
    aset
    aw
    rte
    call
    const2
    const
    fannk fib
    ivread
    ivw
    rite
    m
    andelbrot
    m
    eteor
    nest-ntim
    es
    nest-w
    hile
    norm
    nsvb
    w
    hile
    38.2
    43.7
    38.3
    42.1
    38.3
    44.2
    45.1
    38.3
    38.2
    38.3
    38.3
    38.3
    38.2
    38.3
    38.3
    38.3
    38.3
    38.3
    14.4
    14.5
    14.9
    14.2
    14.4
    15.3
    14.2
    14.3
    14.4
    14.3
    15.0
    14.2
    14.2
    14.8
    14.2
    14.3
    14.3
    14.4
    JIT off JIT on
    Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu

    View Slide

  35. ϚΠΫϩϕϯνϚʔΫ: ϝϞϦ
    Ruby 2.6.0 w/ https://github.com/benchmark-driver/mjit-benchmarks
    Max Resident Set Size (MB)
    0
    100
    200
    300
    400
    red-black
    sieve
    trees
    89.4
    193.9
    299.4
    89.4
    193.5
    301.7
    JIT off JIT on
    Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu

    View Slide

  36. ΞϓϦέʔγϣϯੑೳ 1: ଎౓
    Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu
    Ruby 2.6.0 w/ NESΤϛϡϨʔλ Optcarrot
    Frames Per Second
    0
    23
    45
    68
    90 86.6
    53.8
    JIT off JIT on

    View Slide

  37. ΞϓϦέʔγϣϯੑೳ 1: ϝϞϦ
    Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu
    Ruby 2.6.0 w/ NESΤϛϡϨʔλ Optcarrot
    Max Resident Set Size (MB)
    0
    16
    32
    48
    64 63.7
    62.8
    JIT off JIT on

    View Slide

  38. ΞϓϦέʔγϣϯੑೳ 2: ଎౓
    Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu
    Ruby 2.6.0 w/ https://github.com/benchmark-driver/sinatra
    Request Per Second
    0
    2,125
    4,250
    6,375
    8,500
    7,466.5
    8,442.1
    JIT off JIT on

    View Slide

  39. ΞϓϦέʔγϣϯੑೳ 2: ϝϞϦ
    Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu
    Ruby 2.6.0 w/ https://github.com/benchmark-driver/sinatra
    Max Resident Set Size (MB)
    0
    18
    35
    53
    70
    64.4
    23.7
    JIT off JIT on

    View Slide

  40. ੑೳิ଍
    Intel 4.0GHz i7-4790K 8ίΞ, ϝϞϦ16GB, x86-64 Ubuntu ʹ͓͍ͯɺ

    • 1ճͷJITίϯύΠϧʹ͔͔Δ࣌ؒ͸ 60ʙ250 ms ఔ౓

    • JIT༗ޮʹ͢Δͱɺ࣮ࡍʹJIT͍ͯ͠ͳͯ͘΋ϐʔΫ࣌ϝϞϦফඅྔ
    ͕24ʙ28MBఔ౓૿͑Δ͕ɺϝιου1ͭ͸8KBͱ͔ͳͷͰޡࠩ

    • 24ʙ28MB෦෼͸ະௐࠪ: pthread, mutex, ϑϥάͷจࣈྻ, ...?

    • GCCͷϝϞϦফඅ: 4.6MBఔ౓, ClangͷϝϞϦফඅ: 24.1MBఔ౓

    • /tmp ͷফඅ͸1ϝιου͋ͨΓ࠷௿ .c 12KBɺ.o 4KBɺ.so 8KB

    View Slide

  41. ࠓޙͷల๬
    WebΞϓϦέʔγϣϯʹ͓͚Δੑೳ޲্ʹϑΥʔΧε:

    • ࡉ͔͘ίϯύΠϧ͢ΔͱVMىಈճ਺͕૿͑ΔͷͰɺେ͖͘
    ΠϯϥΠϯԽͯ͠·ͱΊͯίϯύΠϧ

    • খ͞ͳϝιου͸caller͔ΒίϯύΠϧͯ͠ΠϯϥΠϯԽ

    • ଎͘Ͱ͖ͳͦ͞͏ͳϝιου͸ίϯύΠϧ͠ͳ͍౳ɺ࠷దԽ
    ର৅ͷબ୒ઓུΛվળ͢Δ

    View Slide

  42. ·ͱΊ
    • CίϯύΠϥΛ࢖ͬͨJITख๏ͷτϨʔυΦϑΛઆ໌ͨ͠

    • ίϯύΠϥࣗମͷϝϯςφϯε͸؆୯ʹͳΔ

    • ͦΕΛࢧ͑Δج൫ͷอक΍࣮ߦ࣌ͷڍಈ͸ෳࡶԽ͢Δ

    • Ruby 2.6͸JITʹΑΓCPUܭࢉத৺ͷ༻్Ͱ1.6ഒߴ଎Խͨ͠

    • খ͞ͳϝιου͕ͨ͘͞Μ͋Δ৔߹ͷੑೳ͸վળத

    View Slide