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

ゲームの通信をつくる仕事はどうなるのだろう?
ゲームの通信をつくる仕事はどうなるのだろう?ゲームの通信をつくる仕事はどうなるのだろう?
ゲームの通信をつくる仕事はどうなるのだろう?Kengo Nakajima
 
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門Fixstars Corporation
 
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないことNorishige Fukushima
 
【Unity】 Behavior TreeでAIを作る
 【Unity】 Behavior TreeでAIを作る 【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作るtorisoup
 
SLAM勉強会(3) LSD-SLAM
SLAM勉強会(3) LSD-SLAMSLAM勉強会(3) LSD-SLAM
SLAM勉強会(3) LSD-SLAMIwami Kazuya
 
ITエンジニアに易しいUI/UXデザイン
ITエンジニアに易しいUI/UXデザインITエンジニアに易しいUI/UXデザイン
ITエンジニアに易しいUI/UXデザインRoy Kim
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチMasami Ichikawa
 
基礎線形代数講座
基礎線形代数講座基礎線形代数講座
基礎線形代数講座SEGADevTech
 
マルチコアを用いた画像処理
マルチコアを用いた画像処理マルチコアを用いた画像処理
マルチコアを用いた画像処理Norishige Fukushima
 
SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~
SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~
SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~SSII
 
SSII2019企画: 画像および LiDAR を用いた自動走行に関する動向
SSII2019企画: 画像および LiDAR を用いた自動走行に関する動向SSII2019企画: 画像および LiDAR を用いた自動走行に関する動向
SSII2019企画: 画像および LiDAR を用いた自動走行に関する動向SSII
 
Slurmのジョブスケジューリングと実装
Slurmのジョブスケジューリングと実装Slurmのジョブスケジューリングと実装
Slurmのジョブスケジューリングと実装Ryuichi Sakamoto
 
さくらのVPS で IPv4 over IPv6ルータの構築
さくらのVPS で IPv4 over IPv6ルータの構築さくらのVPS で IPv4 over IPv6ルータの構築
さくらのVPS で IPv4 over IPv6ルータの構築Tomocha Potter
 
Cuda fortranの利便性を高めるfortran言語の機能
Cuda fortranの利便性を高めるfortran言語の機能Cuda fortranの利便性を高めるfortran言語の機能
Cuda fortranの利便性を高めるfortran言語の機能智啓 出川
 
SSII2020TS: 物理ベースビジョンの過去・現在・未来 〜 カメラ・物体・光のインタラクションを モデル化するには 〜
SSII2020TS: 物理ベースビジョンの過去・現在・未来 〜 カメラ・物体・光のインタラクションを モデル化するには 〜SSII2020TS: 物理ベースビジョンの過去・現在・未来 〜 カメラ・物体・光のインタラクションを モデル化するには 〜
SSII2020TS: 物理ベースビジョンの過去・現在・未来 〜 カメラ・物体・光のインタラクションを モデル化するには 〜SSII
 

What's hot (20)

ゲームの通信をつくる仕事はどうなるのだろう?
ゲームの通信をつくる仕事はどうなるのだろう?ゲームの通信をつくる仕事はどうなるのだろう?
ゲームの通信をつくる仕事はどうなるのだろう?
 
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
 
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
 
【Unity】 Behavior TreeでAIを作る
 【Unity】 Behavior TreeでAIを作る 【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作る
 
AlphaGoのしくみ
AlphaGoのしくみAlphaGoのしくみ
AlphaGoのしくみ
 
G2o
G2oG2o
G2o
 
SLAM勉強会(3) LSD-SLAM
SLAM勉強会(3) LSD-SLAMSLAM勉強会(3) LSD-SLAM
SLAM勉強会(3) LSD-SLAM
 
ITエンジニアに易しいUI/UXデザイン
ITエンジニアに易しいUI/UXデザインITエンジニアに易しいUI/UXデザイン
ITエンジニアに易しいUI/UXデザイン
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
SLAM勉強会(PTAM)
SLAM勉強会(PTAM)SLAM勉強会(PTAM)
SLAM勉強会(PTAM)
 
基礎線形代数講座
基礎線形代数講座基礎線形代数講座
基礎線形代数講座
 
マルチコアを用いた画像処理
マルチコアを用いた画像処理マルチコアを用いた画像処理
マルチコアを用いた画像処理
 
SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~
SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~
SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~
 
猫でも分かる UE4のAnimation Blueprintの運用について
猫でも分かる UE4のAnimation Blueprintの運用について猫でも分かる UE4のAnimation Blueprintの運用について
猫でも分かる UE4のAnimation Blueprintの運用について
 
SSII2019企画: 画像および LiDAR を用いた自動走行に関する動向
SSII2019企画: 画像および LiDAR を用いた自動走行に関する動向SSII2019企画: 画像および LiDAR を用いた自動走行に関する動向
SSII2019企画: 画像および LiDAR を用いた自動走行に関する動向
 
Slurmのジョブスケジューリングと実装
Slurmのジョブスケジューリングと実装Slurmのジョブスケジューリングと実装
Slurmのジョブスケジューリングと実装
 
さくらのVPS で IPv4 over IPv6ルータの構築
さくらのVPS で IPv4 over IPv6ルータの構築さくらのVPS で IPv4 over IPv6ルータの構築
さくらのVPS で IPv4 over IPv6ルータの構築
 
UniRx の1歩目
UniRx の1歩目UniRx の1歩目
UniRx の1歩目
 
Cuda fortranの利便性を高めるfortran言語の機能
Cuda fortranの利便性を高めるfortran言語の機能Cuda fortranの利便性を高めるfortran言語の機能
Cuda fortranの利便性を高めるfortran言語の機能
 
SSII2020TS: 物理ベースビジョンの過去・現在・未来 〜 カメラ・物体・光のインタラクションを モデル化するには 〜
SSII2020TS: 物理ベースビジョンの過去・現在・未来 〜 カメラ・物体・光のインタラクションを モデル化するには 〜SSII2020TS: 物理ベースビジョンの過去・現在・未来 〜 カメラ・物体・光のインタラクションを モデル化するには 〜
SSII2020TS: 物理ベースビジョンの過去・現在・未来 〜 カメラ・物体・光のインタラクションを モデル化するには 〜
 

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)