Slide 1

Slide 1 text

iOS ΤϯδχΞͷͨΊͷ LLVM Optimiazation 2014/11/29 ԣ඿΁ͳͪΐ͜iOSษڧձ#34.1 @dealforest Toshihro Morimoto

Slide 2

Slide 2 text

ࣗݾ঺հ http://about.me/dealforest ! ! iOS App / Web Application(perl, ruby) @dealforest Toshihro Morimoto

Slide 3

Slide 3 text

Έͳ͞Μ ͜Μͳܦݧ͋Γ·ͤΜ͔ʁ

Slide 4

Slide 4 text

Debug ϏϧυͰ͔֬͠ೝͤͣ ৹ࠪʹͩͯ͠͠·ͬͨ͜ͱ

Slide 5

Slide 5 text

͍͟ϦϦʔε͞ΕΔͱ...

Slide 6

Slide 6 text

ʊਓਓਓਓਓਓਓਓʊ ʼɹಥવͷ Crashɹʻ ʉY^Y^Y^Y^Y^Y^Yʉ

Slide 7

Slide 7 text

ͳͥͦΜͳ͜ͱ͕͓͖Δͷ͔ʁ

Slide 8

Slide 8 text

LLVM ͷ࠷దԽʹΑΓ ͜ͷΑ͏ͳ͜ͱ͕ ى͖ͯ͠·͏έʔε͕͋Γ·͢

Slide 9

Slide 9 text

LLVM ͷ࠷దԽ͸ԿΛ͍ͯ͠Δͷ͔ʁ

Slide 10

Slide 10 text

όΠφϦαΠζΛখͨ͘͞͠Γ ॲཧΛߴ଎Խͨ͠Γ͠·͢ (಺༰͸ઃఆʹΑͬͯมΘΓ·͢)

Slide 11

Slide 11 text

ͪΌΜͱ Release ϏϧυͰ ςετ͠Ζͬͯݴ͑͹ ͦ͏ͳΜͰ͚͢ͲͶɻɻɻɻ

Slide 12

Slide 12 text

Ͳ͏ͯ͠࠷దԽͰ Crash ͢ΔΑ͏ʹ ͳͬͯ͠·ͬͨͷ͔

Slide 13

Slide 13 text

࠷దԽͰԿ͕ߦΘΕ͍ͯΔͷ͔

Slide 14

Slide 14 text

ࠓճ͸ͦΕΛௐ΂ͯΈ·ͨ͠

Slide 15

Slide 15 text

஫ҙࣄ߲ ༻ޠ / ༻๏ڞʹؒҧ͍͕͋ΔՄೳੑ͕ ͋Γ·͢ͷͰ͔͋͠Βͣ

Slide 16

Slide 16 text

ͦ΋ͦ΋Ͳ͜Ͱઃఆ͢Δͷʁ

Slide 17

Slide 17 text

Build Settings

Slide 18

Slide 18 text

࠷దԽͷछྨ • O0 : ࠷΋଎͘ίϯύΠϧग़དྷɺ࠷΋σόοΨϒϧͳίʔυΛ ੜ੒͢Δɻ࠷దԽͳ͠ • O1 : جຊతͳ࠷దԽΛ࣮ߦ͢Δ • O2 : ΄ͱΜͲ͢΂ͯͷ࠷దԽΛ࣮ߦ͢Δ • O3 : O2 ͱࣅ͍ͯΔ͕ίϯύΠϧʹΑΓ͕͔͔࣌ؒΓ αΠζ͕େ͖͘ͳΔɻ͔͠͠ੑೳͷྑ͍ίʔυΛੜ੒͢Δ • Os : O2ͷ࠷దԽʹՃ͑ͯίʔυαΠζΛ཈͑Δ • Ofast : ن໿ΛҰ෦ແࢹͨ͠࠷దԽΛߦ͏Α͏ͳͷͰ࢖Θͳ͍΄͏ ͕͍͍Ͱ͢ɻ by Compiler-Level Optimizations

Slide 19

Slide 19 text

͍·͍ͪϐϯͱ͖·ͤΜͶ

Slide 20

Slide 20 text

Ξό΢τ͗͢Δ…

Slide 21

Slide 21 text

͜ΕΛ஌ΔͨΊʹ͸ LLVM ͷਂ෵Λ ೷͔ͳ͍ͱ͍͚·ͤΜͰͨ͠

Slide 22

Slide 22 text

ͱ͍ͬͯ΋ LLVM ͷ֓೦ࣗମ͕ γϯϓϧͰͱͯ΋෼͔Γ΍͍͢ʂ

Slide 23

Slide 23 text

ͦ΋ͦ΋ LLVM ͬͯԿʁ

Slide 24

Slide 24 text

LLVM

Slide 25

Slide 25 text

LLVM LLVM ͱ͸ɺίϯύΠϧ࣌ɺϦϯΫ࣌ɺ࣮ߦ࣌ͳͲ ͋ΒΏΔ࣌఺ͰϓϩάϥϜΛ࠷దԽ͢ΔΑ͏ઃܭ ͞Εͨɺ೚ҙͷϓϩάϥϛϯάݴޠʹରԠՄೳͳ ίϯύΠϥج൫Ͱ͋Δɻ౰ॳ͸ɺLLVM ͷ໊শͷ༝ དྷ͸ɺLow Level Virtual Machine (௿ਫ४Ծ૝ػց) ͷུͰ͋Δͱ͍͕ͯͨ͠ɺݱࡏ͸ɺԿͷ಄จࣈͰ ΋ͳ͍ͱ͍ͯ͠Δɻ by Wikipekia

Slide 26

Slide 26 text

LLVM - Phase- by LLVM and NVVM

Slide 27

Slide 27 text

LLVM - Phase- • Front-end • Middle-end • Back-end

Slide 28

Slide 28 text

LLVM - Phase Front-end - • ࣈ۟ղੳ • ߏจղੳ • தؒίʔυ(LLVM IR)࡞੒

Slide 29

Slide 29 text

LLVM - Phase Middle-end - தؒίʔυͷ࠷దԽΛ͠ɺ ࠷దԽ͞ΕͨதؒίʔυΛग़ྗ͢Δ

Slide 30

Slide 30 text

LLVM - Phase Back-end - ࠷దԽ͞Εͨதؒίʔυ͔Βλʔήοτʹ ߹ΘͤͨίʔυΛग़ྗ͢Δ ಛఆͷ CPU ͷωΠςΟϒίʔυͱ͔ Javascript ͱ͔

Slide 31

Slide 31 text

;Ή;Ή

Slide 32

Slide 32 text

ࠓճ͸࠷దԽͷ͜ͱΛ஌Γ͍ͨͷͰ Middle-end Λௐ΂Ε͹Αͦ͞͏Ͱ͢Ͷ

Slide 33

Slide 33 text

Middle-end(LLVM optimiser) Λ ௐ΂͍ͯ͘ͱ Pass ͱ͍͏࢓૊Έʹ ͍͖͖ͭ·͢

Slide 34

Slide 34 text

Pass Middle-end Ͱ࠷దԽ͢ΔॲཧΛ͍ͯ͠Δ LLVM IR ͷίʔυΛର৅ʹɺͦͷ಺༰Λղ ੳ͠ɺ࠷దԽ΍ɺ໋ྩͷஔ׵ͳͲΛߦ͏ͨ ΊͷϑϨʔϜϫʔΫ

Slide 35

Slide 35 text

ͭ·Γ͸ͲΜͳ Pass ͕࣮ߦ͞Ε͍ͯΔ͔Λ ௐ΂Ε͹ͲΜͳ࠷దԽ͕ߦΘΕ͍ͯΔ͔͕ ෼͔Δͱ͍͏Θ͚Ͱ͢Ͷ

Slide 36

Slide 36 text

؀ڥߏங $ brew install llvm ! `/usr/local/Cellar/llvm/3.5.0/bin/opt` ͱ࣮ߦ͢ Δͷ͕ΊΜͲ͍͘͞৔߹͸ `brew link llvm` Λ࣮ߦ͢Δ

Slide 37

Slide 37 text

ௐࠪϑϩʔ 1. ࠷దԽͳ͠ͷ .o ϑΝΠϧΛ࡞੒͢Δઃ ఆΛௐ΂Δ 2. ͦͷઃఆΛ༻͍ͯதؒίʔυ(LLVM IR)Λ ࡞੒ 3. ֤࠷దԽΛ࣮ߦͯ͠ϑΝΠϧʹग़ྗ 4. diff ΛͱΓ Pass ͷࠩ෼Λௐ΂Δ

Slide 38

Slide 38 text

࠷దԽͳ͠ͷ .o ϑΝΠϧΛ ࡞੒͢ΔઃఆΛௐ΂Δ xcodebuild build -configuration Debug

Slide 39

Slide 39 text

தؒίʔυ(LLVM IR)Λ࡞੒ • ઌ΄Ͳௐ΂ͨઃఆΛར༻ • `-S -emit-llvm` ΦϓγϣϯΛ௥Ճͯ͠த ؒίʔυΛग़ྗ • `-o` ͷ஋Λมߋͯ͠தؒίʔυͷग़ྗઌ Λมߋ(.o -> .ll)

Slide 40

Slide 40 text

֤࠷దԽΛ࣮ߦͯ͠ϑΝΠϧʹग़ྗ $ /usr/local/Cellar/llvm/3.5.0/bin/opt \ -debug-pass=Structure \ -O1 [தؒίʔυ].ll > /dev/null ! ඞཁͳ৘ใ͸ඪ४Τϥʔग़ྗʹදࣔ͞ΕΔ

Slide 41

Slide 41 text

֤࠷దԽΛ࣮ߦͯ͠ϑΝΠϧʹग़ྗ

Slide 42

Slide 42 text

ݟʹ͍͘ͷͰ gist ʹ·ͱΊ·ͨ͠ https://gist.github.com/dealforest/ 718df40a09d8e27758c7

Slide 43

Slide 43 text

ͦ΋ͦ΋ Debug ࣌΋ Os ΍Ε͹͍͍Μ͡Ό...

Slide 44

Slide 44 text

! ͱࢥ͚ͬͨͲɺίϯύΠϧ͕͔͔࣌ؒΔͷͱɺC, C++ ͷίʔυͰ BreakPoint Λ࢓ֻ͚ͨΓ͢Δͱશ͘ ݟ౰ҧ͍ͳߦͰఀࢭͨ͠Γ͠·͢ ͳͷͰ։ൃαΠΫϧʹӨڹ͕Ͱͯ͠·͏ͷͰ O0 ͕ ࠾༻͞Ε͍ͯΔͱΘ͚Ͱ͢Ͷɻೲಘ @niwatako ͞Μᐌ͘ɺObjective-C Ͱ΋ͣΕΔΒ͍͠ Ͱ͢

Slide 45

Slide 45 text

·ͱΊ ࠷దԽ͸ࢥͬͯΔҎ্ʹ৭ʑ͍ͬͯ͡ΔͷͰͪΌ Μͱ֬ೝ͠·͠ΐ͏ Ή͠Ζ֬ೝ͔ͯ͠Β͡Όͳ͍ͱɺ৹ࠪʹͩͤͳ͍ εΩʔϜΛͭ͘Δ͜ͱ͕େࣄ

Slide 46

Slide 46 text

http://www.amazon.co.jp/dp/4883379310/

Slide 47

Slide 47 text

͓·͚ Xcode6 ͔Β௥Ճ͞Εͨ Profile Guided Optimization(PGO) ͱ͍͏࠷దԽ͕͋Δ ؆୯ʹ͍͏ͱɺ࢖༻ස౓ͷߴ͍ॱʹίʔυϨΠΞ ΢τΛ࠷దԽ͢ΔΒ͍͠ ͸΍͘ͳΔΑʂ

Slide 48

Slide 48 text

͓·͚ Xcode6 ͔Β௥Ճ͞Εͨ࠷దԽ Profile Guided Optimization(PGO) ͕͋Δ ؆୯ʹ͍͏ͱΑ͘࢖͏ॱ൪ʹίʔυϨΠΞ΢τΛ ࠷దԽ͢ΔΒ͍͠ ͸΍͘ͳΔΑʂ

Slide 49

Slide 49 text

͓·͚ ৄ͘͠͸ʮ What's New in LLVMʯΛΈ͍ͯͩ͘͞

Slide 50

Slide 50 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠