Slide 1

Slide 1 text

HalideͬΆ͍Կ͔Λ࡞ͬͯΈΔςετ Programming Yuichi Yoshida Chief engineer, DENSO IT Laboratory, Inc. #Θ͍Θ͍swift @sonson_twit © 2014 DENSO IT Laboratory, Inc., All rights reserved. Redistribution or public display not permitted without written permission from DENSO IT Laboratory, Inc. LLVMͰܭࢉάϥϑΛJITίϯύΠϧ

Slide 2

Slide 2 text

αϯϓϧίʔυ • https://github.com/sonsongithub/llvm_jit_compile • https://github.com/sonsongithub/llvm-tutorial • Ϗϧυʹ͸llvm͕ඞཁ • macOSͷ৔߹ brew install llvm • ubuntuͷ৔߹ apt install llvm

Slide 3

Slide 3 text

ܭࢉάϥϑ

Slide 4

Slide 4 text

Computational Graph • ܭࢉΛάϥϑͱͯ͠อ࣋͢Δ • ී௨ͷίʔυͰ͸ɼ݁Ռ͔͠ಘΒΕͳ͍ • ͳͥɼͦΕ͕ඞཁʁ • ඍ෼͍͔ͨ͠Β • ͳͥɼඍ෼͍ͨ͠ͷ͔ʁ

Slide 5

Slide 5 text

χϡʔϥϧωοτϫʔΫ f1 y W1 W2 W3 W4 f2 f3 x ֶशɿ ͷ஋Λௐ੔͍ͯ͘͠ ͜ͷͨΊʹ Ͱඍ෼͢Δඞཁ͕͋Δ ·ͨ ΋ඍ෼͢Δඞཁ͕͋Δ Back propagationͰݕࡧʂ y Wi f

Slide 6

Slide 6 text

ඍ෼ • χϡʔϥϧωοτϫʔΫΛ࣮૷͢Δ৔߹ • ϑΥϫʔυ • ग़ྗΛܭࢉ͢Δ࣮૷ • όοΫϫʔυ • ௐ੔͢Δͱ͖ʹܭࢉ͢Δ࣮૷ • ࣮͸ɼϑΥϫʔυͷܭࢉͷඍ෼ • ैདྷ͸ɼ͜ΕΒΛผʑʹ࣮૷͍ͯͨ͠ • ࣮૷͕ඇৗʹ໘౗ɾɾɾɾඍ෼͸खܭࢉ • όάͷԹচ

Slide 7

Slide 7 text

ࣗಈඍ෼ • ඍ෼͸ɼ࣮͸ࣗಈతʹͰ͖Δʢࡶʹݴ͏ͱʣ • ਺ֶͷڭՊॻΈ͍ͯͩ͘͞ • ੵ෼͸ͦͷݶΓͰ͸͋Γ·ͤΜ

Slide 8

Slide 8 text

ී௨ʹ࣮૷͢Δͱ // x=10ͷͱ͖ͷdy/dwͷ஋͕ཉ͍͠ double w = 1; double x = 10; // ͜͜Ͱଈ࣌ʹܭࢉ͞ΕΔɽ double y = sin(w * x); double temp_x = 10; // खͰ୅਺తʹܭࢉͨࣜ͠Λ // ιʔείʔυ্Ͱ࣮૷͢Δඞཁ͕͋Δ double dy_dw = cos(w * temp_x) * temp_x; std::cout << dy_dw << std::endl;

Slide 9

Slide 9 text

ܭࢉάϥϑ͕ར༻Ͱ͖Ε͹ // ܭࢉάϥϑͷ৔߹ Param w; Var x,y; // ͜͜Ͱ͸ܭࢉ͞Εͳ͍ɽܭࢉάϥϑ͕ߏங͞ΕΔɽ // “define by run”ͱݺ͹ΕΔ y = math.sin(w * x); double temp_x = 10; // ඍ෼͸ɼܭࢉάϥϑʹج͖ͮɼࣗಈతʹܭࢉ͞ΕΔɽ double dy_dw = y.diff(temp_x); std::cout << dy_dw << std::endl;

Slide 10

Slide 10 text

ฒྻԽ

Slide 11

Slide 11 text

ฒྻԽͷͨΊͷख๏ • SIMD sin(a) sin(a) sin(a) sin(a)

Slide 12

Slide 12 text

ฒྻԽͷͨΊͷख๏ • ϚϧνεϨου sin(a) sin(a)

Slide 13

Slide 13 text

ฒྻԽͷͨΊͷख๏ • ϚϧνεϨου+SIMD sin(a) sin(a) sin(a) sin(a) sin(a) sin(a) sin(a) sin(a)

Slide 14

Slide 14 text

LLVMͷԠ༻ྫɾɾɾɾHalide • εϨου • SIMD • GPU • ͳͲͳͲɾɾɾ

Slide 15

Slide 15 text

Halideͷ৔߹ HalideͳΒɼ͜ͷίʔυͰશͯͷ؀ڥʹϙʔτͰ͖Δ [10] • εϨου • SIMD • GPU • ͳͲͳͲɾɾɾ

Slide 16

Slide 16 text

[11]

Slide 17

Slide 17 text

Halideͷίʔυ C++ͰίϯύΠϧՄೳ

Slide 18

Slide 18 text

Halideͷ࣮ࡍ $DPEF )BMJEF'VOD )BMJEF%4- #JOBSZ "45 ී௨ʹ ίϯύΠϧ Ϗϧυʹ͸ LLVMͱ Halide͕ඞཁ ੩తʹίϯύΠϧ΋Մೳ

Slide 19

Slide 19 text

Halideͷ࣮ࡍ $DPEF )BMJEF'VOD )BMJEF%4- #JOBSZ )BMJEF*3 --7.*3 #JOBSZ Halide::Func಺ͷ AST͔ΒIRΛੜ੒ Halide IR͔Β LLVM IRΛੜ੒ LLVMͰ όΠφϦΛੜ੒ "45 ࣮ߦ؀ڥΛηοτ

Slide 20

Slide 20 text

$DPEF )BMJEF'VOD )BMJEF%4- Halideͷ࣮ࡍ #JOBSZ )BMJEF*3 --7.*3 #JOBSZ ࣮ߦ Halide::Func಺ͷ AST͔ΒIRΛੜ੒ Halide IR͔Β LLVM IRΛੜ੒ LLVMͰ όΠφϦΛੜ੒ "45 ࣮ߦ؀ڥΛηοτ ࠷ۙ͸͜ͷลͰ QPMZIFESBMPQUJNJ[BUJPOͷͨΊʹ ΋͏Ұஈ֊*3Λు͍ͯ࠷దԽ͢ΔΒ͍͠

Slide 21

Slide 21 text

$DPEF )BMJEF'VOD )BMJEF%4- Halideͷ࣮ࡍ "45 #JOBSZ )BMJEF*3 --7.*3 #JOBSZ ࣮ߦ Halide::Func಺ͷ AST͔ΒIRΛੜ੒ Halide IR͔Β LLVM IRΛੜ੒ LLVMͰ όΠφϦΛੜ੒ "45 ࣮ߦ؀ڥΛηοτ Ϗϧυʹ͸ LLVMͱ Halide͕ඞཁ Polyhederal IR

Slide 22

Slide 22 text

ܭࢉάϥϑ·ͱΊ • ࣗಈඍ෼ • TensoFlow, PyTorchɾɾɾɾɾ • χϡʔϥϧωοτϫʔΫͷֶशʹඞਢͷٕज़ • ฒྻԽͳͲʹ΋ • Halide • ͭ·Γ • ܭࢉΛఆ͓͍ٛͯͯ͠ɼϥϯλΠϜͰͳΜͧ͢Δ • ࣗಈతʹͳΜͧ͢Δͷָ͕ʹͳΔ

Slide 23

Slide 23 text

LLVMͰؔ਺Λ࡞ͬͯΈΑ͏

Slide 24

Slide 24 text

llvm::JIT • Ͳ͏΍ΒJITʹ͸͍͔ͭ͘API/࣮૷͕͋ΔͬΆ͍ • MCJIT • depracatedΒ͍͠ɾɾɾ • Ͱ΋γϯϓϧͰݟ௨͕͍͍͠ • ORC JIT • KaleidoscopeJIT.hʹ࣮૷͞Ε͍ͯΔ΋ͷ • ·ͩ͜ͷลɾɾɾશવௐࠪͰ͖ͯͳ͍ • http://llvm.1065342.n5.nabble.com/llvm-dev- Questions-about-moving-from-MCJIT-to-Orc-JIT- td129151.html

Slide 25

Slide 25 text

ࠓ೔ͷྲྀΕ • LLVM API for C++ͰίʔυΛॻ͘ • IRBuilder • ίʔυΛ֬ೝɼLLVM IRΛు͘ɼ • MCJIT API • ExecutionEngine • ίϯύΠϧ • C++ͷؔ਺ͷϙΠϯλΛήοτ͢Δ

Slide 26

Slide 26 text

LLVM IRΛίʔυ͔Β࡞Δ LLVMͷAPIͰLLVM IRΛ૊ΈཱͯΔ --7.͕؅ཧ͢Δ$POUFYU

Slide 27

Slide 27 text

LLVM IRΛίʔυ͔Β࡞Δ LLVMͷAPIͰLLVM IRΛ૊ΈཱͯΔ --7.͕؅ཧ͢Δ$POUFYU .PEVMF

Slide 28

Slide 28 text

LLVM IRΛίʔυ͔Β࡞Δ LLVMͷAPIͰLLVM IRΛ૊ΈཱͯΔ --7.͕؅ཧ͢Δ$POUFYU .PEVMF 'VODUJPO 'VODUJPO

Slide 29

Slide 29 text

LLVM IRΛίʔυ͔Β࡞Δ LLVMͷAPIͰLLVM IRΛ૊ΈཱͯΔ --7.͕؅ཧ͢Δ$POUFYU .PEVMF 'VODUJPO #MPDL FOUSZ 'VODUJPO #MPDL UIFO SFUVSO

Slide 30

Slide 30 text

଍͠ࢉ • add.cpp • ೋ߲ԋࢉ͸API͕༻ҙ͞Ε͍ͯΔͷͰͦΕΛ࢖͏ • CreateFAddͳͲ

Slide 31

Slide 31 text

ؔ਺ݺͼग़͠ • call.cpp • ͷcosΛݺͼग़͢ • ࣗ෼ͰϩʔΧϧͰ࣮૷ͨؔ͠਺Λݺͼग़͢ • Cͷ໊લ • C++ͷmangled name • खॱ • ؔ਺ΛϞδϡʔϧʹ௥Ճ • module͔Βؔ਺Λऔಘ • ݺͼग़͢

Slide 32

Slide 32 text

ϙΠϯλ • pointer.cpp • ౰વϙΠϯλ΋ॲཧͰ͖Δ • StoreͱLoadͰ஋Λॻ͖ࠐΊΔ

Slide 33

Slide 33 text

ؔ਺Λ࣮ߦ͢Δ // Get pointer to a function which is built by EngineBuilder. // ؔ਺ͷϙΠϯλͰड͚Δ auto f = reinterpret_cast( engineBuilder->getFunctionAddress(name); if (f == NULL) { cout << "error" << endl; return 1; } // Execution // a + b double a = 10; cout << f(&a) << endl;

Slide 34

Slide 34 text

ܭࢉάϥϑ • graph.cpp • ೋม਺ݻఆͷγϯϓϧͳྫ • ΫϥεͱԋࢉࢠͰߏจ໦Λ࡞Δ • VarΫϥεͱVarΫϥεΛ଍ͯ͠ɼExpressionΛɾɾɾ • LLVM Tutorial KaleidoscopeϕʔεͰ։ൃ

Slide 35

Slide 35 text

ܭࢉάϥϑ • graph.cpp • ೋม਺ݻఆͷγϯϓϧͳྫ • ΫϥεͱԋࢉࢠͰߏจ໦Λ࡞Δ • VarΫϥεͱVarΫϥεΛ଍ͯ͠ɼExpressionΛɾɾɾ • LLVM Tutorial KaleidoscopeϕʔεͰ։ൃ • ՝୊ • C++ͷϙΠϯλͰड͚ΔgetFunctionAddress • Ҿ਺ͱ໭Γ஋Λࣗ༝ʹઃܭͰ͖ͳ͍

Slide 36

Slide 36 text

ࢀߟจݙ • ͖ͭͶ͞ΜͰ΋Θ͔ΔLLVM • llvm.org • LLVM Tutorial, C++൛Λಡ΋͏ • swift.org • SwiftݴޠαΠτ • https://halide-lang.org • ݁ہɾɾɾίʔυಡΉͷ͕खͬऔΓૣ͠ɾɾɾɾɾ • Halideͷͬ͟ͱͨ͠આ໌ɾɾɾFixStars͕೤৺ʹ׆ಈ͍ͯ͠Δɼ͢͹Β͍͠ • https://www.slideshare.net/fixstars/halide-82788728 • https://qiita.com/fukushima1981/items/fa3537234e19baffc761 • Polyhedral Model • εέδϡʔϧ໰୊Λઢܗ୅਺ʹؼண͠ɼ੔਺ܭը໰୊Ͱղ͘Έ͍ͨͳ • ·ͩɼΑʔ͔ΘΒ͔Μ • Darkroomͱ͍͏ٕज़ͷத਎ͬΆ͍ • https://www.slideshare.net/fixstars/prelude-to-halidepublic-108059122