Slide 1

Slide 1 text

©OpenStreetMap contributors Hidekazu Takami クーダでハニワ 1

Slide 2

Slide 2 text

©Project PLATEAU / MLIT Japan へっぽこ プログラマーの悩み 2

Slide 3

Slide 3 text

©Project PLATEAU / MLIT Japan 3 PCで を描きたい!!

Slide 4

Slide 4 text

©Project PLATEAU / MLIT Japan 4 をめちゃ高速で!!

Slide 5

Slide 5 text

©Project PLATEAU / MLIT Japan 5 のであれば

Slide 6

Slide 6 text

©Project PLATEAU / MLIT Japan 自己紹介 6 で

Slide 7

Slide 7 text

©Project PLATEAU / MLIT Japan 7 格闘家[ミルコ・クロコップ

Slide 8

Slide 8 text

©Project PLATEAU / MLIT Japan = 8 Compute Unified Device Architecture NVIDIA CEO ジェンスン・フアン⽒

Slide 9

Slide 9 text

©Project PLATEAU / MLIT Japan 9 = マンデルブロ集合

Slide 10

Slide 10 text

©Project PLATEAU / MLIT Japan 自己紹介 10 で

Slide 11

Slide 11 text

©OpenStreetMap contributors へっぽこプログラマ NVIDIAのGPUを使ってCUDAを利用し、マンデルブロ集合を描くとめちゃくちゃ早く作成できるよ でもNVIDIAのGPUお値段高いけどね、革ジャンさん安く売ってよ、おねがい!! 11

Slide 12

Slide 12 text

©Project PLATEAU / MLIT Japan 高見 英和 自己紹介 Takami Hidekazu ● おもにバックエンド担当することがおおい ● 動的型付け言語(Pythonなど)はやや苦手 ● ロードバイクとバイオリンが趣味かな~ 12

Slide 13

Slide 13 text

©Project PLATEAU / MLIT Japan 自己紹介 13 マンデルブロ集合(ハニワ)

Slide 14

Slide 14 text

©Project PLATEAU / MLIT Japan 14 わからん!!

Slide 15

Slide 15 text

©Project PLATEAU / MLIT Japan 15 複素数

Slide 16

Slide 16 text

©Project PLATEAU / MLIT Japan 16 実数(実部)+虚数(虚部) 1+1i

Slide 17

Slide 17 text

©Project PLATEAU / MLIT Japan 17 0 1 ▼ 2 -2 √2 ▼ 実数

Slide 18

Slide 18 text

©Project PLATEAU / MLIT Japan 18 0 2i -2i 1+1i 虚数

Slide 19

Slide 19 text

©Project PLATEAU / MLIT Japan 19 0 2i -2i 1+1i -2 2

Slide 20

Slide 20 text

©Project PLATEAU / MLIT Japan 20 漸化式 (ぜんかしき)

Slide 21

Slide 21 text

©Project PLATEAU / MLIT Japan 21 Z0 =0 Zn+1 =Zn +C 2 ここに複素数の値をいれる (描画位置の値) 1+1i

Slide 22

Slide 22 text

©Project PLATEAU / MLIT Japan 22 Z0 =0 Z2 =(1+1i)+(1+1i) 2 Z1 =0+(1+1i) 2

Slide 23

Slide 23 text

©Project PLATEAU / MLIT Japan 23 1000回繰り返して Zの値の絶対値が2を超えると黒 それ以外は白とする 1+1i 0.4+0.6i

Slide 24

Slide 24 text

©Project PLATEAU / MLIT Japan 24 つまり

Slide 25

Slide 25 text

©Project PLATEAU / MLIT Japan 25 1000X1000画像を作るには 1000x1000x1000回(十億回)の計算が必要になる

Slide 26

Slide 26 text

©Project PLATEAU / MLIT Japan 26 0 2i -2i 1+1i -2 2 0.0 0.1000 1000.0 1000.1000

Slide 27

Slide 27 text

©Project PLATEAU / MLIT Japan 27 マンデルブロ集合はフラクタルな図形なので どこまでも拡大できる 10万倍 縦横幅2 縦横幅0.00002

Slide 28

Slide 28 text

©Project PLATEAU / MLIT Japan 28 色の付け方 HSV色空間 ● 色相 (Hue) ● 彩度 (Saturation, Chroma) ● 明度 (Value, Brightness) 漸化式で2を超えるまでの 回数(n)を360度で表現する 色が決定する

Slide 29

Slide 29 text

©Project PLATEAU / MLIT Japan 29 サンプルコード C++ X軸ループ、Y軸ループ、漸化式ループの3重ループ

Slide 30

Slide 30 text

©Project PLATEAU / MLIT Japan 30 サンプルコード C++

Slide 31

Slide 31 text

©Project PLATEAU / MLIT Japan 31 高速にするにはGPU(CUDA)を使う

Slide 32

Slide 32 text

©Project PLATEAU / MLIT Japan 32 GPUで三角形ばっかり描くのはもったいない。 そのスーパーな並列処理をなんにでも 使えるようにしたら?

Slide 33

Slide 33 text

©Project PLATEAU / MLIT Japan 33 CUDAコアを作って▲もかけるが、 いろいろな計算もできるようにした! しかもライブラリーも作ったよ! (cuda toolkit)

Slide 34

Slide 34 text

©Project PLATEAU / MLIT Japan 34 CUDAコア SM

Slide 35

Slide 35 text

©Project PLATEAU / MLIT Japan 35

Slide 36

Slide 36 text

©Project PLATEAU / MLIT Japan 36 GPUのプログラムって難しいイメージ?

Slide 37

Slide 37 text

©Project PLATEAU / MLIT Japan 37 実はそんなに難しくない

Slide 38

Slide 38 text

©Project PLATEAU / MLIT Japan 38 CPUで利用されるメモリとGPUで利用されるメモリは別の場所にあるため ホスト側のメモリ情報をデバイス側へ転送する カーネルを使って同時並行処理する デバイス側のメモリ情報をホスト側に戻す

Slide 39

Slide 39 text

©Project PLATEAU / MLIT Japan 39 カーネルとは各CUDAコアで実行する関数みたいなもの カーネルがCUDAコアで同時に実行される ブロックとスレッドの指定でカーネルが処理するピクセルが決まる (今回の場合)

Slide 40

Slide 40 text

©Project PLATEAU / MLIT Japan 40 サンプルコード(cuda)

Slide 41

Slide 41 text

©Project PLATEAU / MLIT Japan 41 サンプルコード(cuda)

Slide 42

Slide 42 text

©Project PLATEAU / MLIT Japan 42 速度比較 使用PC CPU:Intel i5 12400 6コア 12スレッド GPU:NVIDIA GTX1070 CUDAコア 1920基 フ ル

Slide 43

Slide 43 text

©Project PLATEAU / MLIT Japan 43 RTX4090 10/20日現在 CUDAコア 16,384基!! GTX1070 CUDAコア 1929基

Slide 44

Slide 44 text

©Project PLATEAU / MLIT Japan 44 ● スケール: ○ 0.00002 縦横 ● 中心位置: ○ 0.743643135 X ○ 0.131825963i Y

Slide 45

Slide 45 text

©Project PLATEAU / MLIT Japan 45 速度比較 CPUシングルスレッド:10070.4 ms(10s) GPU(CUDA) :75.90 ms (0.8s) CPUマルチスレッド :1352.06 ms (1s) Intel i5 (12スレッド) (GTX1070 1920コア)

Slide 46

Slide 46 text

©Project PLATEAU / MLIT Japan 46 ms 132倍 18倍

Slide 47

Slide 47 text

©OpenStreetMap contributors まとめ 47

Slide 48

Slide 48 text

©OpenStreetMap contributors ● PCでハニワ(マンデルブロ集合) を描きたい ● CUDAを使うとマンデルブロ集合は高速に描ける ● CUDAのプログラミングは意外と簡単 ● CPU側とGPU側のメモリは別なのでデータの受け渡しが必要 ● NVIDIAさんもっとGPU安く売ってくれないですかね? 48

Slide 49

Slide 49 text

©OpenStreetMap contributors ● Rust de ハニワ ● https://github.com/Guarneri009/rust-mandelbrot ● Haskell de ハニワ ● https://github.com/Guarneri009/haskell-mandelbrot 49

Slide 50

Slide 50 text

©OpenStreetMap contributors 終わり ます 50