SlideShare a Scribd company logo
1 of 33
@foota
2012年6月2日
   @foota / nox
   並列処理のコードを書くIT企業に勤務
       並列処理・GPGPU
       機械学習
   以前は某研究機関の研究員
       分子動力学(MD)計算
       創薬の研究
   「良いもの。悪いもの。」
       http://handasse.blogspot.com/
 TopCoderとは
 CUDA Superhero Challenge

 問題を読む

 問題を考える

 問題を解く

 まとめ
 世界で最も規模の大きい競技プログラミ
  ングを運営する組織
 代表的なプログラミングコンテストとし
  て、数時間の短期間で問題を解くSRMと
  数週間の長期間で問題を解くマラソン
  マッチ(MM)がある
 今日話すCUDA Superhero Challengeは
  GPGPUを利用したマラソンマッチ
 最近ではデータマイニングなどの機械学
  習を利用した賞金付きマラソンマッチが
  多い
 2009年10月に開催された、TopCoderと
  NVIDIAによるCUDAの国際プログラミン
  グコンテスト
 賞金総額 $5,000 !

 しかし、賞金圏内ぎりぎりの5位だったの

  で$250と金額はしょぼい…
 連結成分ラベリングをGPUを使ってでき
  るだけ高速に解くだけ
 連結成分ラベリングって何?
   連続した同じ領域(色)ごとにラベル付けを行う。
   閾値を設けて、隣り合うピクセルの色の差が閾値以下
    なら同じ領域だとみなす。
       |赤1-赤0| + |緑1-緑0| + |青1-青0| ≦ 閾値
   連結度は4と8があり、4なら上下左右と結合していて、
    8ならそれに加えてななめの方向も結合している。
   上記の画像を連結度4として考えた場合、水色、黄色、
    緑色、ピンク、青色、オレンジの5つの領域に分けら
    れる。結合度8の場合は2つの領域に分けられる。
 入力画像は、面積が3億ピクセル、一辺の
  長さが2万ピクセルを最大とする
 1画像につき1分以内に計算しなければな
  らない
 使用できるメモリは2,500MBまで

 コンテストで使用されるGPUデバイスは
  Tesla C1060
4                5
  0, 1                   10



2, 3
                     7
         6




                 8
                     9
14



          11
15             13




     16




     12
17   18
No.   連結度   閾値    サイズ        No.   連結度   閾値     サイズ
0      4    0      64x64     10     8    60     987x735
1      8    30     64x64     11     4    30    1374x1040
2      4    25    100x300    12     4    10    1500x1131
3      8    0     100x300    13     8    60    4194x4194
4      8    0    1000x768    14     8    60    6672x6340
5      4    25   4000x4000   15     4    30     900x900
6      4    10    800x600    16     8    60    6000x6000
7      8    60   1316x1252   17     4    10   16000x16000
8      4    10   1502x1482   18     8    30   14321x10000
9      4    30   2145x1213
Definition


Class:       CCL
Method:      cuda_ccl
Parameters: vector<int>, int, int, int
Returns:     vector<int>
Method       vector<int> cuda_ccl(vector<int> image, int W,
signature:   int degree_of_connectivity, int threshold)
 CPU: Intel Xeon X5650 @2.67GHz
 GPU: Tesla C2050
 ラベルの初期化として、左上から順番に
  番号を付ける。
 それぞれのピクセルで、その周りのピク
  セルのラベルと比較して最も小さいラベ
  ルを新しいラベルする。
 それを繰り返して、ラベルが更新されな
  くなったら終了。
 GPGPUなら複数スレッドで一気にラベル
  を更新できるし速そうだ!
1    2    3    4    5    6    7    8

9    10   11   12   13   14   15   16

17   18   19   20   21   22   23   24

25   26   27   28   29   30   31   32

33   34   35   36   37   38   39   40

41   42   43   44   45   46   47   48

49   50   51   52   53   54   55   56

57   58   59   60   61   62   63   64
1    1
     2    1
          2
          3    1
               2
               3
               4    1
                    2
                    3
                    4
                    5    1
                         2
                         3
                         4
                         5
                         6    7    7
                                   8

9    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
                                   8

17
9    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
                                   8

17
25
9    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
                                   6

17
25
33
9    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
                                   6

17
25
33
41
9    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
                                   6

17
25
33
41
49
9    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
                                   56

17
25
33
41
49
57
9    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
No. 連結度 閾値    サイズ         CPU          GPU        倍率
0   4   0      64x64       0.012176    0.110757    0.110
1   8   30     64x64       0.010722    0.114190    0.094
2   4   25    100x300      0.596673    0.170903    3.491
3   8   0     100x300      0.348009    0.115680    3.008
4   8   0    1000x768      9.350450    0.379094   24.665
5   4   25   4000x4000   237.985000   15.749900   15.110
6   4   10    800x600      5.883900    0.323574   18.184
7   8   60   1316x1252     0.284824    1.326350    0.215
8   4   10   1502x1482    32.217800    1.473260   21.868
9   4   30   2145x1213     1.219730    3.723310    0.328
No. 連結度 閾値      サイズ             CPU            GPU        倍率
10   8   60     987x735          0.062973      0.488163    0.129
11   4   30    1374x1040         8.120030      1.567890    5.179
12   4   10    1500x1131        16.570400      0.507686   32.639
13   8   60    4194x4194      1111.440000     27.248900   40.788
14   8   60    6672x6340      1199.790000    101.794000   11.786
15   4   30     900x900          0.322443      0.755994    0.427
16   8   60    6000x6000        35.604300     65.525000    0.543
17   4   10   16000x16000     5723.870000   2472.830000    2.315
18   8   30   14321x10000   425661.000000   10855.60000   39.211
 もっと速くできないか?
 ピクセル一つずつ確認していくのは効率
  が悪い気がする。
 一列すべてを処理してしまってはどうだ
  ろうか。
 4方向もしくは8方向を順に調べよう!
1    1
     2    1
          3    1
               4    1
                    5    1
                         6    7    7
                                   8

9    10
     9    11
          9    12
               1
               4    13
                    1
                    4
                    5    14
                         1
                         4
                         6    15
                              1
                              4    16
                                   7
                                   8

17
9    10
     18
     9    11
          19
          9    20
               1
               4    21
                    1
                    4
                    5    22
                         1
                         4
                         6    15
                              23
                              1
                              4    24
                                   7
                                   8

25
9    10
     26
     9    11
          27
          9    28
               9    29
                    1
                    5    30
                         1
                         5
                         6    15
                              31
                              1
                              4
                              5    32
                                   1
                                   5

33
9    10
     34
     9    11
          35
          9    28
               36
               9    37
                    9    38
                         1
                         6    15
                              39
                              1
                              4
                              6    32
                                   40
                                   1
                                   5
                                   6

41
9    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
                                   6

49
9    44
     50
     1
     6    44
          50
          51
          1
          6    44
               52
               1
               6    44
                    45
                    53
                    1
                    6    54   54
                              55   54
                                   56

57
9    44
     50
     58
     1
     6    54
          59   54
               59
               60   54
                    59
                    61   54
                         62   54
                              55
                              63   54
                                   56
                                   64
No. 連結度 閾値    サイズ         CPU         GPU        倍率
0   4   0      64x64       0.002382   0.106349    0.022
1   8   30     64x64       0.010193   0.105844    0.096
2   4   25    100x300      0.096171   0.236392    0.407
3   8   0     100x300      0.032573   0.135166    0.241
4   8   0    1000x768      3.502950   0.981031    3.571
5   4   25   4000x4000   124.643000   6.453890   19.313
6   4   10    800x600      0.319645   0.213199    1.499
7   8   60   1316x1252     0.774412   0.277574    2.790
8   4   10   1502x1482    15.520500   3.608650    4.301
9   4   30   2145x1213     0.970901   0.342785    2.832
No. 連結度 閾値      サイズ           CPU           GPU        倍率
10   8   60     987x735        0.153554     0.144784    1.061
11   4   30    1374x1040       3.325760     0.696785    4.773
12   4   10    1500x1131       7.125450     1.447230    4.924
13   8   60    4194x4194      31.172800     2.270510   13.729
14   8   60    6672x6340    3728.890000   218.461000   17.069
15   4   30     900x900        0.138539     0.138232    1.002
16   8   60    6000x6000      52.699100     3.995920   13.188
17   4   10   16000x16000   7510.120000   403.630000   18.606
18   8   30   14321x10000   6392.590000   343.640000   18.603
   さらにもっと速くできないか?
   あるピクセルの周りに小さいラベルを持つピ
    クセルがあり、そのピクセルの周りにはもっ
    と小さいラベルを持つピクセルがあり、さら
    にその先にはもっともっと小さいラベルを持
    つピクセルが…というようにラベルをたどっ
    て行けるんじゃね?
   周りのラベルを調べる走査フェーズ、一番小
    さいラベルをたどる解析フェーズ、ラベルを
    付け直すラベル付けフェーズの3つのフェー
    ズで構成する。
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    7

179 1810 1911 2012 2113 2214 2315 2416
17 18 19 20 21 22 23 24
 9   9    9    1    1    1    1    7

2517 2618 2719 2827 2921 3022 3123 3231
 25 26 27 28 29 30 31 32
  9   9    9    9    1    1    1    1

3325 3426 3527 3628 3736 3830 3931 4032
 33 34 35 36 37 38 39 40
  9   9    9    9    9    1    1    1

4133 4234 4335 441 4544 4638 4739 4840
 41 42 43 44 441 46 47 48
  9   9    9    1   45
                     1   1    1    1

4941 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 56

5749 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
No. 連結度 閾値    サイズ        CPU        GPU        倍率
0   4   0      64x64     0.000890   0.102171   0.009
1   8   30     64x64     0.004953   0.099847   0.050
2   4   25    100x300    0.006969   0.101593   0.069
3   8   0     100x300    0.006359   0.100254   0.063
4   8   0    1000x768    0.159436   0.107507   1.483
5   4   25   4000x4000   1.968550   0.200410   9.823
6   4   10    800x600    0.075281   0.103099   0.730
7   8   60   1316x1252   0.231614   0.118273   1.958
8   4   10   1502x1482   0.502064   0.119762   4.192
9   4   30   2145x1213   0.273070   0.121070   2.255
No. 連結度 閾値      サイズ         CPU         GPU         倍率
10   8   60     987x735      0.068256   0.109083     0.626
11   4   30    1374x1040     0.315708   0.111239     2.838
12   4   10    1500x1131     0.430731   0.116800     3.688
13   8   60    4194x4194     3.432670   0.215678    15.916
14   8   60    6672x6340    14.829300   0.424460    34.937
15   4   30     900x900      0.082415   0.107684     0.765
16   8   60    6000x6000     8.459500   0.363360    23.281
17   4   10   16000x16000   50.543600   0.276371   182.883
18   8   30   14321x10000   50.221500   1.696280    29.607
 No.13の解像度4,194×4,194
  の画像で比較してみる。
 隣接伝播のCPUでは1,111秒
  の実行時間が掛かっていたが、
  ラベル等価のGPUでは0.21秒
  になった。5,000倍以上の高速化を実現!
 GPU同士の比較では126倍の差が出た。

 No.18では隣接伝播のCPUとラベル等価の

  GPUで25万倍以上の差がついた!
 アルゴリズムが重要。その上でGPGPUに
  よる高速化を行えば、素晴らしい成果を
  期待できる。
 アルゴリズムを深く考える訓練として、
  TopCoderのマラソンマッチはおすすめ!
 最近では1万ドルほどの賞金付きマラソン
  マッチが多いので小遣い稼ぎになるかも?
   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)
ご清聴ありがとうございました

More Related Content

What's hot

20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチンyohhoy
 
大規模分散システムの現在 -- Twitter
大規模分散システムの現在 -- Twitter大規模分散システムの現在 -- Twitter
大規模分散システムの現在 -- Twittermaruyama097
 
マルチコアを用いた画像処理
マルチコアを用いた画像処理マルチコアを用いた画像処理
マルチコアを用いた画像処理Norishige Fukushima
 
うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移
うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移
うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移まべ☆てっく運営
 
CSPO、CSM研修に参加して
CSPO、CSM研修に参加してCSPO、CSM研修に参加して
CSPO、CSM研修に参加してArata Fujimura
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣Masahiro Nishimi
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜京大 マイコンクラブ
 
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門Fixstars Corporation
 
Pycairo を使ってみる その1
Pycairo を使ってみる その1Pycairo を使ってみる その1
Pycairo を使ってみる その1ryos36
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けモノビット エンジン
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説murachue
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?京大 マイコンクラブ
 
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理DADA246
 
40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていることonozaty
 
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0Masakazu Matsushita
 
Node.js×mongo dbで3年間サービス運用してみた話
Node.js×mongo dbで3年間サービス運用してみた話Node.js×mongo dbで3年間サービス運用してみた話
Node.js×mongo dbで3年間サービス運用してみた話leverages_event
 
ROS2勉強会@別府 第7章Pythonクライアントライブラリrclpy
ROS2勉強会@別府 第7章PythonクライアントライブラリrclpyROS2勉強会@別府 第7章Pythonクライアントライブラリrclpy
ROS2勉強会@別府 第7章PythonクライアントライブラリrclpyAtsuki Yokota
 
ブラック企業から学ぶMVCモデル
ブラック企業から学ぶMVCモデルブラック企業から学ぶMVCモデル
ブラック企業から学ぶMVCモデルYuta Hiroto
 

What's hot (20)

20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
大規模分散システムの現在 -- Twitter
大規模分散システムの現在 -- Twitter大規模分散システムの現在 -- Twitter
大規模分散システムの現在 -- Twitter
 
マルチコアを用いた画像処理
マルチコアを用いた画像処理マルチコアを用いた画像処理
マルチコアを用いた画像処理
 
うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移
うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移
うちではこうやっています UI構築のルールとPlaymakerを使った画面遷移
 
CSPO、CSM研修に参加して
CSPO、CSM研修に参加してCSPO、CSM研修に参加して
CSPO、CSM研修に参加して
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
 
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
Pycairo を使ってみる その1
Pycairo を使ってみる その1Pycairo を使ってみる その1
Pycairo を使ってみる その1
 
Oss貢献超入門
Oss貢献超入門Oss貢献超入門
Oss貢献超入門
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
 
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
 
40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること
 
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
 
Node.js×mongo dbで3年間サービス運用してみた話
Node.js×mongo dbで3年間サービス運用してみた話Node.js×mongo dbで3年間サービス運用してみた話
Node.js×mongo dbで3年間サービス運用してみた話
 
ROS2勉強会@別府 第7章Pythonクライアントライブラリrclpy
ROS2勉強会@別府 第7章PythonクライアントライブラリrclpyROS2勉強会@別府 第7章Pythonクライアントライブラリrclpy
ROS2勉強会@別府 第7章Pythonクライアントライブラリrclpy
 
ブラック企業から学ぶMVCモデル
ブラック企業から学ぶMVCモデルブラック企業から学ぶMVCモデル
ブラック企業から学ぶMVCモデル
 

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

Gunmaweb#11 jojoshiritori
Gunmaweb#11 jojoshiritoriGunmaweb#11 jojoshiritori
Gunmaweb#11 jojoshiritoriivoryworks .
 
Eco Rutas del Agua
Eco Rutas del AguaEco Rutas del Agua
Eco Rutas del AguaPoeda
 
TDD Boot Camp 東京 for C++ 課題
TDD Boot Camp 東京 for C++ 課題TDD Boot Camp 東京 for C++ 課題
TDD Boot Camp 東京 for C++ 課題Takashi Imagire
 
すごろくのルート検索
すごろくのルート検索すごろくのルート検索
すごろくのルート検索Toyokazu Tsugehara
 
ئةدةبى كوردى
ئةدةبى كوردىئةدةبى كوردى
ئةدةبى كوردىdr.luqmanraouf
 

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

Ticklir on JPN TOUR
Ticklir on JPN TOURTicklir on JPN TOUR
Ticklir on JPN TOUR
 
Gunmaweb#11 jojoshiritori
Gunmaweb#11 jojoshiritoriGunmaweb#11 jojoshiritori
Gunmaweb#11 jojoshiritori
 
Eco Rutas del Agua
Eco Rutas del AguaEco Rutas del Agua
Eco Rutas del Agua
 
TDD Boot Camp 東京 for C++ 課題
TDD Boot Camp 東京 for C++ 課題TDD Boot Camp 東京 for C++ 課題
TDD Boot Camp 東京 for C++ 課題
 
Arara
AraraArara
Arara
 
すごろくのルート検索
すごろくのルート検索すごろくのルート検索
すごろくのルート検索
 
ئةدةبى كوردى
ئةدةبى كوردىئةدةبى كوردى
ئةدةبى كوردى
 

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

  • 2. @foota / nox  並列処理のコードを書くIT企業に勤務  並列処理・GPGPU  機械学習  以前は某研究機関の研究員  分子動力学(MD)計算  創薬の研究  「良いもの。悪いもの。」  http://handasse.blogspot.com/
  • 3.  TopCoderとは  CUDA Superhero Challenge  問題を読む  問題を考える  問題を解く  まとめ
  • 4.  世界で最も規模の大きい競技プログラミ ングを運営する組織  代表的なプログラミングコンテストとし て、数時間の短期間で問題を解くSRMと 数週間の長期間で問題を解くマラソン マッチ(MM)がある  今日話すCUDA Superhero Challengeは GPGPUを利用したマラソンマッチ  最近ではデータマイニングなどの機械学 習を利用した賞金付きマラソンマッチが 多い
  • 5.  2009年10月に開催された、TopCoderと NVIDIAによるCUDAの国際プログラミン グコンテスト  賞金総額 $5,000 !  しかし、賞金圏内ぎりぎりの5位だったの で$250と金額はしょぼい…
  • 6.
  • 7.
  • 8.  連結成分ラベリングをGPUを使ってでき るだけ高速に解くだけ  連結成分ラベリングって何?
  • 9. 連続した同じ領域(色)ごとにラベル付けを行う。  閾値を設けて、隣り合うピクセルの色の差が閾値以下 なら同じ領域だとみなす。  |赤1-赤0| + |緑1-緑0| + |青1-青0| ≦ 閾値  連結度は4と8があり、4なら上下左右と結合していて、 8ならそれに加えてななめの方向も結合している。  上記の画像を連結度4として考えた場合、水色、黄色、 緑色、ピンク、青色、オレンジの5つの領域に分けら れる。結合度8の場合は2つの領域に分けられる。
  • 10.  入力画像は、面積が3億ピクセル、一辺の 長さが2万ピクセルを最大とする  1画像につき1分以内に計算しなければな らない  使用できるメモリは2,500MBまで  コンテストで使用されるGPUデバイスは Tesla C1060
  • 11. 4 5 0, 1 10 2, 3 7 6 8 9
  • 12. 14 11 15 13 16 12
  • 13. 17 18
  • 14. No. 連結度 閾値 サイズ No. 連結度 閾値 サイズ 0 4 0 64x64 10 8 60 987x735 1 8 30 64x64 11 4 30 1374x1040 2 4 25 100x300 12 4 10 1500x1131 3 8 0 100x300 13 8 60 4194x4194 4 8 0 1000x768 14 8 60 6672x6340 5 4 25 4000x4000 15 4 30 900x900 6 4 10 800x600 16 8 60 6000x6000 7 8 60 1316x1252 17 4 10 16000x16000 8 4 10 1502x1482 18 8 30 14321x10000 9 4 30 2145x1213
  • 15. Definition Class: CCL Method: cuda_ccl Parameters: vector<int>, int, int, int Returns: vector<int> Method vector<int> cuda_ccl(vector<int> image, int W, signature: int degree_of_connectivity, int threshold)
  • 16.  CPU: Intel Xeon X5650 @2.67GHz  GPU: Tesla C2050
  • 17.  ラベルの初期化として、左上から順番に 番号を付ける。  それぞれのピクセルで、その周りのピク セルのラベルと比較して最も小さいラベ ルを新しいラベルする。  それを繰り返して、ラベルが更新されな くなったら終了。  GPGPUなら複数スレッドで一気にラベル を更新できるし速そうだ!
  • 18. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
  • 19. 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 1 2 3 4 5 6 7 7 8 9 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 8 17 9 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 8 17 25 9 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 6 17 25 33 9 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 6 17 25 33 41 9 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 6 17 25 33 41 49 9 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 56 17 25 33 41 49 57 9 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
  • 20. No. 連結度 閾値 サイズ CPU GPU 倍率 0 4 0 64x64 0.012176 0.110757 0.110 1 8 30 64x64 0.010722 0.114190 0.094 2 4 25 100x300 0.596673 0.170903 3.491 3 8 0 100x300 0.348009 0.115680 3.008 4 8 0 1000x768 9.350450 0.379094 24.665 5 4 25 4000x4000 237.985000 15.749900 15.110 6 4 10 800x600 5.883900 0.323574 18.184 7 8 60 1316x1252 0.284824 1.326350 0.215 8 4 10 1502x1482 32.217800 1.473260 21.868 9 4 30 2145x1213 1.219730 3.723310 0.328
  • 21. No. 連結度 閾値 サイズ CPU GPU 倍率 10 8 60 987x735 0.062973 0.488163 0.129 11 4 30 1374x1040 8.120030 1.567890 5.179 12 4 10 1500x1131 16.570400 0.507686 32.639 13 8 60 4194x4194 1111.440000 27.248900 40.788 14 8 60 6672x6340 1199.790000 101.794000 11.786 15 4 30 900x900 0.322443 0.755994 0.427 16 8 60 6000x6000 35.604300 65.525000 0.543 17 4 10 16000x16000 5723.870000 2472.830000 2.315 18 8 30 14321x10000 425661.000000 10855.60000 39.211
  • 22.  もっと速くできないか?  ピクセル一つずつ確認していくのは効率 が悪い気がする。  一列すべてを処理してしまってはどうだ ろうか。  4方向もしくは8方向を順に調べよう!
  • 23. 1 1 2 1 3 1 4 1 5 1 6 7 7 8 9 10 9 11 9 12 1 4 13 1 4 5 14 1 4 6 15 1 4 16 7 8 17 9 10 18 9 11 19 9 20 1 4 21 1 4 5 22 1 4 6 15 23 1 4 24 7 8 25 9 10 26 9 11 27 9 28 9 29 1 5 30 1 5 6 15 31 1 4 5 32 1 5 33 9 10 34 9 11 35 9 28 36 9 37 9 38 1 6 15 39 1 4 6 32 40 1 5 6 41 9 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 6 49 9 44 50 1 6 44 50 51 1 6 44 52 1 6 44 45 53 1 6 54 54 55 54 56 57 9 44 50 58 1 6 54 59 54 59 60 54 59 61 54 62 54 55 63 54 56 64
  • 24. No. 連結度 閾値 サイズ CPU GPU 倍率 0 4 0 64x64 0.002382 0.106349 0.022 1 8 30 64x64 0.010193 0.105844 0.096 2 4 25 100x300 0.096171 0.236392 0.407 3 8 0 100x300 0.032573 0.135166 0.241 4 8 0 1000x768 3.502950 0.981031 3.571 5 4 25 4000x4000 124.643000 6.453890 19.313 6 4 10 800x600 0.319645 0.213199 1.499 7 8 60 1316x1252 0.774412 0.277574 2.790 8 4 10 1502x1482 15.520500 3.608650 4.301 9 4 30 2145x1213 0.970901 0.342785 2.832
  • 25. No. 連結度 閾値 サイズ CPU GPU 倍率 10 8 60 987x735 0.153554 0.144784 1.061 11 4 30 1374x1040 3.325760 0.696785 4.773 12 4 10 1500x1131 7.125450 1.447230 4.924 13 8 60 4194x4194 31.172800 2.270510 13.729 14 8 60 6672x6340 3728.890000 218.461000 17.069 15 4 30 900x900 0.138539 0.138232 1.002 16 8 60 6000x6000 52.699100 3.995920 13.188 17 4 10 16000x16000 7510.120000 403.630000 18.606 18 8 30 14321x10000 6392.590000 343.640000 18.603
  • 26. さらにもっと速くできないか?  あるピクセルの周りに小さいラベルを持つピ クセルがあり、そのピクセルの周りにはもっ と小さいラベルを持つピクセルがあり、さら にその先にはもっともっと小さいラベルを持 つピクセルが…というようにラベルをたどっ て行けるんじゃね?  周りのラベルを調べる走査フェーズ、一番小 さいラベルをたどる解析フェーズ、ラベルを 付け直すラベル付けフェーズの3つのフェー ズで構成する。
  • 27. 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 7 179 1810 1911 2012 2113 2214 2315 2416 17 18 19 20 21 22 23 24 9 9 9 1 1 1 1 7 2517 2618 2719 2827 2921 3022 3123 3231 25 26 27 28 29 30 31 32 9 9 9 9 1 1 1 1 3325 3426 3527 3628 3736 3830 3931 4032 33 34 35 36 37 38 39 40 9 9 9 9 9 1 1 1 4133 4234 4335 441 4544 4638 4739 4840 41 42 43 44 441 46 47 48 9 9 9 1 45 1 1 1 1 4941 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 56 5749 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
  • 28. No. 連結度 閾値 サイズ CPU GPU 倍率 0 4 0 64x64 0.000890 0.102171 0.009 1 8 30 64x64 0.004953 0.099847 0.050 2 4 25 100x300 0.006969 0.101593 0.069 3 8 0 100x300 0.006359 0.100254 0.063 4 8 0 1000x768 0.159436 0.107507 1.483 5 4 25 4000x4000 1.968550 0.200410 9.823 6 4 10 800x600 0.075281 0.103099 0.730 7 8 60 1316x1252 0.231614 0.118273 1.958 8 4 10 1502x1482 0.502064 0.119762 4.192 9 4 30 2145x1213 0.273070 0.121070 2.255
  • 29. No. 連結度 閾値 サイズ CPU GPU 倍率 10 8 60 987x735 0.068256 0.109083 0.626 11 4 30 1374x1040 0.315708 0.111239 2.838 12 4 10 1500x1131 0.430731 0.116800 3.688 13 8 60 4194x4194 3.432670 0.215678 15.916 14 8 60 6672x6340 14.829300 0.424460 34.937 15 4 30 900x900 0.082415 0.107684 0.765 16 8 60 6000x6000 8.459500 0.363360 23.281 17 4 10 16000x16000 50.543600 0.276371 182.883 18 8 30 14321x10000 50.221500 1.696280 29.607
  • 30.  No.13の解像度4,194×4,194 の画像で比較してみる。  隣接伝播のCPUでは1,111秒 の実行時間が掛かっていたが、 ラベル等価のGPUでは0.21秒 になった。5,000倍以上の高速化を実現!  GPU同士の比較では126倍の差が出た。  No.18では隣接伝播のCPUとラベル等価の GPUで25万倍以上の差がついた!
  • 31.  アルゴリズムが重要。その上でGPGPUに よる高速化を行えば、素晴らしい成果を 期待できる。  アルゴリズムを深く考える訓練として、 TopCoderのマラソンマッチはおすすめ!  最近では1万ドルほどの賞金付きマラソン マッチが多いので小遣い稼ぎになるかも?
  • 32. 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)