第1回 関東GPGPU勉強会 TopCoder/NVIDIA主催CUDAプログラミングコンテスト参加記

3,145 views
2,980 views

Published on

Published in: Technology
0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,145
On SlideShare
0
From Embeds
0
Number of Embeds
64
Actions
Shares
0
Downloads
12
Comments
0
Likes
8
Embeds 0
No embeds

No notes for slide

第1回 関東GPGPU勉強会 TopCoder/NVIDIA主催CUDAプログラミングコンテスト参加記

  1. 1. @foota2012年6月2日
  2. 2.  @foota / nox 並列処理のコードを書くIT企業に勤務  並列処理・GPGPU  機械学習 以前は某研究機関の研究員  分子動力学(MD)計算  創薬の研究 「良いもの。悪いもの。」  http://handasse.blogspot.com/
  3. 3.  TopCoderとは CUDA Superhero Challenge 問題を読む 問題を考える 問題を解く まとめ
  4. 4.  世界で最も規模の大きい競技プログラミ ングを運営する組織 代表的なプログラミングコンテストとし て、数時間の短期間で問題を解くSRMと 数週間の長期間で問題を解くマラソン マッチ(MM)がある 今日話すCUDA Superhero Challengeは GPGPUを利用したマラソンマッチ 最近ではデータマイニングなどの機械学 習を利用した賞金付きマラソンマッチが 多い
  5. 5.  2009年10月に開催された、TopCoderと NVIDIAによるCUDAの国際プログラミン グコンテスト 賞金総額 $5,000 ! しかし、賞金圏内ぎりぎりの5位だったの で$250と金額はしょぼい…
  6. 6.  連結成分ラベリングをGPUを使ってでき るだけ高速に解くだけ 連結成分ラベリングって何?
  7. 7.  連続した同じ領域(色)ごとにラベル付けを行う。 閾値を設けて、隣り合うピクセルの色の差が閾値以下 なら同じ領域だとみなす。  |赤1-赤0| + |緑1-緑0| + |青1-青0| ≦ 閾値 連結度は4と8があり、4なら上下左右と結合していて、 8ならそれに加えてななめの方向も結合している。 上記の画像を連結度4として考えた場合、水色、黄色、 緑色、ピンク、青色、オレンジの5つの領域に分けら れる。結合度8の場合は2つの領域に分けられる。
  8. 8.  入力画像は、面積が3億ピクセル、一辺の 長さが2万ピクセルを最大とする 1画像につき1分以内に計算しなければな らない 使用できるメモリは2,500MBまで コンテストで使用されるGPUデバイスは Tesla C1060
  9. 9. 4 5 0, 1 102, 3 7 6 8 9
  10. 10. 14 1115 13 16 12
  11. 11. 17 18
  12. 12. No. 連結度 閾値 サイズ No. 連結度 閾値 サイズ0 4 0 64x64 10 8 60 987x7351 8 30 64x64 11 4 30 1374x10402 4 25 100x300 12 4 10 1500x11313 8 0 100x300 13 8 60 4194x41944 8 0 1000x768 14 8 60 6672x63405 4 25 4000x4000 15 4 30 900x9006 4 10 800x600 16 8 60 6000x60007 8 60 1316x1252 17 4 10 16000x160008 4 10 1502x1482 18 8 30 14321x100009 4 30 2145x1213
  13. 13. DefinitionClass: CCLMethod: cuda_cclParameters: vector<int>, int, int, intReturns: vector<int>Method vector<int> cuda_ccl(vector<int> image, int W,signature: int degree_of_connectivity, int threshold)
  14. 14.  CPU: Intel Xeon X5650 @2.67GHz GPU: Tesla C2050
  15. 15.  ラベルの初期化として、左上から順番に 番号を付ける。 それぞれのピクセルで、その周りのピク セルのラベルと比較して最も小さいラベ ルを新しいラベルする。 それを繰り返して、ラベルが更新されな くなったら終了。 GPGPUなら複数スレッドで一気にラベル を更新できるし速そうだ!
  16. 16. 1 2 3 4 5 6 7 89 10 11 12 13 14 15 1617 18 19 20 21 22 23 2425 26 27 28 29 30 31 3233 34 35 36 37 38 39 4041 42 43 44 45 46 47 4849 50 51 52 53 54 55 5657 58 59 60 61 62 63 64
  17. 17. 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 1 2 3 4 5 6 7 7 89 10 9 10 11 9 12 1 2 3 4 13 1 2 3 4 5 14 1 2 3 4 5 6 14 15 1 2 3 4 5 6 16 7 8179 10 18 9 10 11 19 9 12 20 1 2 3 4 13 21 1 2 3 4 5 14 22 1 2 3 4 5 6 14 15 23 1 2 3 4 5 6 16 24 7 817259 17 18 26 9 10 18 19 27 9 10 18 19 27 28 9 13 21 29 1 2 3 4 5 14 22 30 1 2 3 4 5 6 14 15 23 31 1 2 3 4 5 6 14 15 23 31 32 1 2 3 4 5 61725339 17 18 26 34 9 10 18 19 27 35 9 10 18 19 27 28 36 9 10 18 19 27 28 36 37 9 14 22 30 38 1 2 3 4 5 6 14 15 23 31 39 1 2 3 4 5 6 14 15 23 31 32 40 1 2 3 4 5 6172533419 17 18 26 34 42 9 10 18 19 27 35 43 9 14 22 30 38 44 1 2 3 4 5 6 14 22 30 38 44 45 1 2 3 4 5 6 14 22 30 38 46 1 2 3 4 5 6 14 15 23 31 39 47 1 2 3 4 5 6 14 15 23 31 32 40 48 1 2 3 4 5 617253341499 14 22 30 38 44 50 1 2 3 4 5 6 14 22 30 38 44 50 51 1 2 3 4 5 6 14 22 30 38 44 52 1 2 3 4 5 6 14 22 30 38 44 45 53 1 2 3 4 5 6 54 54 55 54 55 561725334149579 14 22 30 38 44 50 58 1 2 3 4 5 6 54 59 54 59 60 54 60 61 54 62 54 55 63 54 55 56 64
  18. 18. No. 連結度 閾値 サイズ CPU GPU 倍率0 4 0 64x64 0.012176 0.110757 0.1101 8 30 64x64 0.010722 0.114190 0.0942 4 25 100x300 0.596673 0.170903 3.4913 8 0 100x300 0.348009 0.115680 3.0084 8 0 1000x768 9.350450 0.379094 24.6655 4 25 4000x4000 237.985000 15.749900 15.1106 4 10 800x600 5.883900 0.323574 18.1847 8 60 1316x1252 0.284824 1.326350 0.2158 4 10 1502x1482 32.217800 1.473260 21.8689 4 30 2145x1213 1.219730 3.723310 0.328
  19. 19. No. 連結度 閾値 サイズ CPU GPU 倍率10 8 60 987x735 0.062973 0.488163 0.12911 4 30 1374x1040 8.120030 1.567890 5.17912 4 10 1500x1131 16.570400 0.507686 32.63913 8 60 4194x4194 1111.440000 27.248900 40.78814 8 60 6672x6340 1199.790000 101.794000 11.78615 4 30 900x900 0.322443 0.755994 0.42716 8 60 6000x6000 35.604300 65.525000 0.54317 4 10 16000x16000 5723.870000 2472.830000 2.31518 8 30 14321x10000 425661.000000 10855.60000 39.211
  20. 20.  もっと速くできないか? ピクセル一つずつ確認していくのは効率 が悪い気がする。 一列すべてを処理してしまってはどうだ ろうか。 4方向もしくは8方向を順に調べよう!
  21. 21. 1 1 2 1 3 1 4 1 5 1 6 7 7 89 10 9 11 9 12 1 4 13 1 4 5 14 1 4 6 15 1 4 16 7 8179 10 18 9 11 19 9 20 1 4 21 1 4 5 22 1 4 6 15 23 1 4 24 7 8259 10 26 9 11 27 9 28 9 29 1 5 30 1 5 6 15 31 1 4 5 32 1 5339 10 34 9 11 35 9 28 36 9 37 9 38 1 6 15 39 1 4 6 32 40 1 5 6419 10 42 9 11 43 9 44 1 6 44 45 1 6 46 1 6 15 47 1 4 6 32 48 1 5 6499 44 50 1 6 44 50 51 1 6 44 52 1 6 44 45 53 1 6 54 54 55 54 56579 44 50 58 1 6 54 59 54 59 60 54 59 61 54 62 54 55 63 54 56 64
  22. 22. No. 連結度 閾値 サイズ CPU GPU 倍率0 4 0 64x64 0.002382 0.106349 0.0221 8 30 64x64 0.010193 0.105844 0.0962 4 25 100x300 0.096171 0.236392 0.4073 8 0 100x300 0.032573 0.135166 0.2414 8 0 1000x768 3.502950 0.981031 3.5715 4 25 4000x4000 124.643000 6.453890 19.3136 4 10 800x600 0.319645 0.213199 1.4997 8 60 1316x1252 0.774412 0.277574 2.7908 4 10 1502x1482 15.520500 3.608650 4.3019 4 30 2145x1213 0.970901 0.342785 2.832
  23. 23. No. 連結度 閾値 サイズ CPU GPU 倍率10 8 60 987x735 0.153554 0.144784 1.06111 4 30 1374x1040 3.325760 0.696785 4.77312 4 10 1500x1131 7.125450 1.447230 4.92413 8 60 4194x4194 31.172800 2.270510 13.72914 8 60 6672x6340 3728.890000 218.461000 17.06915 4 30 900x900 0.138539 0.138232 1.00216 8 60 6000x6000 52.699100 3.995920 13.18817 4 10 16000x16000 7510.120000 403.630000 18.60618 8 30 14321x10000 6392.590000 343.640000 18.603
  24. 24.  さらにもっと速くできないか? あるピクセルの周りに小さいラベルを持つピ クセルがあり、そのピクセルの周りにはもっ と小さいラベルを持つピクセルがあり、さら にその先にはもっともっと小さいラベルを持 つピクセルが…というようにラベルをたどっ て行けるんじゃね? 周りのラベルを調べる走査フェーズ、一番小 さいラベルをたどる解析フェーズ、ラベルを 付け直すラベル付けフェーズの3つのフェー ズで構成する。
  25. 25. 1 21 1 2 32 1 3 43 1 4 54 1 5 65 1 6 7 87 7 8 9 109 1110 124 10 11 12 9 9 1 135 13 1 146 1514 168 14 15 16 1 1 7179 1810 1911 2012 2113 2214 2315 241617 18 19 20 21 22 23 24 9 9 9 1 1 1 1 72517 2618 2719 2827 2921 3022 3123 3231 25 26 27 28 29 30 31 32 9 9 9 9 1 1 1 13325 3426 3527 3628 3736 3830 3931 4032 33 34 35 36 37 38 39 40 9 9 9 9 9 1 1 14133 4234 4335 441 4544 4638 4739 4840 41 42 43 44 441 46 47 48 9 9 9 1 45 1 1 1 14941 5044 5150 5244 5345 49 441 5044 441 441 9 50 441 52 53 44 51 44 44 1 44 1 1 1 54 5554 5655 54 54 55 565749 5850 5954 6059 6160 6254 6355 6456 57 5044 59 5954 5954 62 63 64 9 441 54 60 61 54 54 54 44 50 58 1 54 59 54
  26. 26. No. 連結度 閾値 サイズ CPU GPU 倍率0 4 0 64x64 0.000890 0.102171 0.0091 8 30 64x64 0.004953 0.099847 0.0502 4 25 100x300 0.006969 0.101593 0.0693 8 0 100x300 0.006359 0.100254 0.0634 8 0 1000x768 0.159436 0.107507 1.4835 4 25 4000x4000 1.968550 0.200410 9.8236 4 10 800x600 0.075281 0.103099 0.7307 8 60 1316x1252 0.231614 0.118273 1.9588 4 10 1502x1482 0.502064 0.119762 4.1929 4 30 2145x1213 0.273070 0.121070 2.255
  27. 27. No. 連結度 閾値 サイズ CPU GPU 倍率10 8 60 987x735 0.068256 0.109083 0.62611 4 30 1374x1040 0.315708 0.111239 2.83812 4 10 1500x1131 0.430731 0.116800 3.68813 8 60 4194x4194 3.432670 0.215678 15.91614 8 60 6672x6340 14.829300 0.424460 34.93715 4 30 900x900 0.082415 0.107684 0.76516 8 60 6000x6000 8.459500 0.363360 23.28117 4 10 16000x16000 50.543600 0.276371 182.88318 8 30 14321x10000 50.221500 1.696280 29.607
  28. 28.  No.13の解像度4,194×4,194 の画像で比較してみる。 隣接伝播のCPUでは1,111秒 の実行時間が掛かっていたが、 ラベル等価のGPUでは0.21秒 になった。5,000倍以上の高速化を実現! GPU同士の比較では126倍の差が出た。 No.18では隣接伝播のCPUとラベル等価の GPUで25万倍以上の差がついた!
  29. 29.  アルゴリズムが重要。その上でGPGPUに よる高速化を行えば、素晴らしい成果を 期待できる。 アルゴリズムを深く考える訓練として、 TopCoderのマラソンマッチはおすすめ! 最近では1万ドルほどの賞金付きマラソン マッチが多いので小遣い稼ぎになるかも?
  30. 30.  Github  https://github.com/foota/ccl References  K. Hawick, A. Leist and D. Playne, Parallel graph component labelling with GPUs and CUDA, Parallel Computing 36 (12) 655-678 (2010)  O. Kalentev, A. Rai, S. Kemnitz and R. Schneider, Connected component labeling on a 2D grid using CUDA, J. Parallel Distrib. Comput. 71 (4) 615-620 (2011)  V. M. A. Oliveira and R. A. Lotufo, A study on connected components labeling algorithms using GPUs, SIBGRAPI (2010)
  31. 31. ご清聴ありがとうございました

×