More Related Content Similar to 第1回 関東GPGPU勉強会 TopCoder/NVIDIA主催CUDAプログラミングコンテスト参加記 Similar to 第1回 関東GPGPU勉強会 TopCoder/NVIDIA主催CUDAプログラミングコンテスト参加記 (7) 第1回 関東GPGPU勉強会 TopCoder/NVIDIA主催CUDAプログラミングコンテスト参加記2. @foota / nox
並列処理のコードを書くIT企業に勤務
並列処理・GPGPU
機械学習
以前は某研究機関の研究員
分子動力学(MD)計算
創薬の研究
「良いもの。悪いもの。」
http://handasse.blogspot.com/
4. 世界で最も規模の大きい競技プログラミ
ングを運営する組織
代表的なプログラミングコンテストとし
て、数時間の短期間で問題を解くSRMと
数週間の長期間で問題を解くマラソン
マッチ(MM)がある
今日話すCUDA Superhero Challengeは
GPGPUを利用したマラソンマッチ
最近ではデータマイニングなどの機械学
習を利用した賞金付きマラソンマッチが
多い
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
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)
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
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)