Multicore Programming Contest GPU Challenge 2009 ツールキット解説書 ver.1.0 対応版
-
Upload
rashad-morin -
Category
Documents
-
view
41 -
download
4
description
Transcript of Multicore Programming Contest GPU Challenge 2009 ツールキット解説書 ver.1.0 対応版
Multicore Programming Contest GPU Challenge 2009
ツールキット解説書ver.1.0 対応版
GPU Challenge 2009実行委員会
Cell Challenge 2009 併設企画GPU Challenge 2009
これはなに?
• GPU Challenge 2009 規定課題に取り組む際のベースとなるツールキットの解説です
• Cell Challenge 2009 ツールキット解説書(Cell Challenge 2009 実行委員会による ) を、許諾を得て転載・一部改変したものです
規定課題「文字列の編集距離計算」
• 2 つの文字列の近さを計る方法• かな漢字変換エンジンや, DNA の相同性検索などに利用される
• 2 つの文字列の 編集距離– 片方の文字列から,もう一方の文字列を得るための操作
回数の最小値– 使用可能な操作は以下の 3 種類
• 削除: 1 つの文字を取り除く• 挿入: 1 つの文字を新たに付け加える• 置換: 1 つの文字を別の文字で置き換える
– 参考になる URI 「 wikipedia: レーベンシュタイン距離」http://ja.wikipedia.org/wiki/%E3%83%AC%E3%83%BC%E3%83%99%E3%83%B3%E3%82%B7%E3%83%A5%E3%82%BF%E3%82%A4%E3%83%B3%E8%B7%9D%E9%9B%A2
編集距離の操作例• 「 weight 」と「 write 」の編集距離• 以下の操作で「 weight 」から「 write 」になる
weight1. weighte ( 挿入: e)2. wrighte ( 置換: e → r)3. wrihte ( 削除: g)4. write ( 削除: h)
• 3 回以下の操作では「 weight 」を「 write 」できない• よって編集距離は 「 4 」• 削除,挿入,置換は文字列の中のどの位置で行っても
よい
w e i g h t
w
r
i
t
e
編集距離計算のアルゴリズム ( 概要 )
• 「動的計画法(Dynamic Programming)」が有名
• 操作回数を表を作って求める
weightwrite
文字列 1文字列 2
writeweight
操作回数を格納するテーブル
編集距離計算のアルゴリズム ( 手順 )
1. 最左列,最上行のセルは 1 ~ N , 1 ~ M の値と仮定
2. 上,左上,左のセル値と,当該の行と列の文字列を使い,以下の方法で各セルの値を計算する
A) 文字列が同一ならば左上セルの値B) 異なるならば左上セルの値 +1( 置
換 )C) 左セルの値 +1( 挿入 )D) 上セルの値 +1( 削除 )E) (A)-(E) の最小値をセルの値に設定
3. テーブルの左上から値を求める4. 右下端のセル値が最終的な
編集距離となる
0 w e i g h t
w
r
i
t
e
このスライドにはアニメーションが設定されてい
ます
0
1
2
3
4
1 2 3 4 5
1
1
2 3 4 5
2
3 2 2
2
4 3 3 3
3 4
3 3
4
アニメーションでは列ごとに計算しているが,「上,左上,左のセル値」が決定しているセルならば計算手順は任意
1 2 3 4 5 6
1
2
3
4
5
N
M
アルゴリズムの並列化 (1)• 以下のデータがあれば,各セル
の計算が可能– 文字列– 左上セル,左セル,上セルの値
⇒ 図中の同じ文字色のセルどうしは,並列に実行可能!
しかしこの並びを素直に配列で表現すると, GPU ではメモリアクセス性能が低下
⇒ ”Coalesced access” を可能としたい
w e i g h t
w
r
i
t
e
01234
1 2 3 4 51
12 3 4 5
23 2 2
2
4 3 3 3
3 43 3
4
このスライドにはアニメーションが設定されてい
ます
Coalesced access については, NVIDIA CUDA Programming Guide 2.0 の 5.1.2.1 を参照
「 Compute Capability 1.2 and Higher 」の部分です. ( 利用する GPU は 1.3 なので )
アルゴリズムの並列化 (2)• GPU のスレッド達が同時にアク
セスする領域は,メモリ上で固まっていた方が効率的 (coalesced access)
⇒ ツールキットでは,左図のように表配置を「ずらす」ことにより,同じ文字色のセルを,メモリ上で固めて配置
• 計算は左図の上から下へ順に行われる
• ツールキットでは,メモリを節約するため,最新の三行だけをGPU のメモリ (Global memory) に保持している
w w e i g h t
r
i
t
e
01234
11234
2
12
23
33
22
3
44
3
33
55434
ツールキット ver1.0• 2 つのテキストファイルを入力すると,それらの中の文字列
を読み込んで編集距離を求める• GPU 内で複数のスレッドブロック・複数のスレッドを起動
する⇒複数の Streaming Multiprocessor(SM) および SP を使用する
• 制約:各文字列の文字数は 128 の倍数– いろいろなサイズの例題ファイル付き
(file1, file2, … , file20)
• getrndstr.c を使用すると,任意長のランダム文字列を生成できる
$ gcc -O3 -o getrndstr getrndstr.c$ ./getrndstr 128 13 > file9999
乱数種 13 で生成される 128 文字の文字列を格納したファイル file9999 を生成する
実行方法 (1/3)
• Toolkit のディレクトリ内でコンパイルgt901@gpuc1:~/toolkit-1.0> makenvcc -c -O2 main_host.cppnvcc -c -O2 -g device.cunvcc -O2 -o ldistance main_host.o device.o
実行方法 (2/3)
• 練習問題の実行gt901@gpuc1:~/toolkit-1.0> ./run3.shanswer = 19168strnum(a)= 20480strnum(b)= 20480Initializing CUDA: 3.97771811 secondsGPU eclock : 0.41952395 seconds[CPU] : 19168[GPU] : 19168SUCCESSFUL.
さまざまな練習問題を実行する, run1.sh ~ run9.sh が用意されています
GPU を用いた計算時間
2つの文字列の長さ
GPU を用いた計算結果 ( 編集距離 )
実行方法 (3/3)• 自作問題 (getrndstr などによる ) の実行gt901@gpuc1:~/toolkit-1.0> ./ldistance file7 file8 19168answer = 19168strnum(a)= 20480strnum(b)= 20480Initializing CUDA: 3.97771811 secondsGPU eclock : 0.41952395 seconds[CPU] : 19168[GPU] : 19168SUCCESSFUL.
文字列長
GPU を用いた計算時間
2つの文字列の長さ
GPU を用いた計算結果 ( 編集距離 )
巨大な文字列を対象にした場合,計算時間が非常に長くなることがあります
「答え」を与えないと CPU で検算を行います。
検算の時間は計算時間には含まれません
第一ファイル
第二ファイル
答え(省略可 )
規定課題への取り組み方• 規定課題では, CPUプログラムおよび GPU のプログラム (device.cu) を実装する– 以下のプログラムを実装してください
• CUDA で記述された,編集距離を計算するプログラム (device.cu)• device_user()関数を実装してください.ツールキットの
device_user() を基に改造を行うのは,もちろん ok です
– 以下のファイルは変更が許可されません• main関数などを含むプログラム (main_host.cpp)
– device.cu に加え,新たにプログラムファイル (*.c, *.cpp, *.cu, *.h など ) を追加することは ok
• それに応じて, Makefile を変更すること
参加者が実装するdevice_user関数について (1)
unsigned intdevice_user (char *str1, int lenStr1, char *str2, int
lenStr2)• device_user関数は CPU 上で呼ばれます• この関数に与えられるポインタ引数は全て, CPU のメモリ (ホストメ
モリ ) を指します– GPU 上のメモリへのコピー (cudaMemcpy) などは, device_user関数内で行
う必要があります• 各入力文字列の先頭ポインタ : str1, str2• 各入力文字列の長さ : lenStr1, lenStr2
– lenStr1, lenStr2 はそれぞれ 1M-128(=1,048,448) 以下です– lenStr1, lenStr2 はそれぞれ 128 の倍数です– lenStr1 と lenStr2 の積は 2 の 34乗 (=17,179,869,184) 以下です
• 計算結果は返り値としてかえすこと
参加者が実装するdevice_user関数について (2)
• 参加者のプログラムは 1 つの GPU のみを用いること. device_user関数の中で cudaSetDevice関数などを呼んではいけない. – 委員会の準備する計算機には 2 つずつ GPU が搭載されています
が,各チームはそのうちの 1 つだけを使うことになります )
• 参加者のプログラムは CPU コアを高々 1 つだけ用いること.ホストと GPU の間の通信や GPUカーネル関数の終了待ちなどにも CPU コアが使われるので注意のこと.
メモリについて• 参加者はホストメモリ (malloc などによる ) , GPU 上の
Global memory(cudaMalloc などによる ) を自由に利用できます– GPU 上の shared memory, texture memory なども ok
• メモリ容量に注意してください– ホスト : 32GB– GPU (Global memory): 4GB
• 特に, lenStr1 * lenStr2 のサイズの int二次元配列は,最大(2 の 34乗 ) の場合にはホストにも GPU にも乗りません ツールキットで行っているような,使用メモリ量を抑える工夫が必要
プログラムの実行時の注意
• 複数の参加者が,計算機を紳士協定で共用します (2009/02/03 現在 )– 各チーム (偶数・奇数 ) が許可されている方のマシン
だけにログイン可能です.– 一度のプログラム実行は, 10 分までとしてください
.また,一チームが連続して複数回プログラムを実行することはできますが,長期間占有することは避けてください.プログラムの実行前には, ps コマンドや top コマンドでマシン利用状況を確認することをおすすめします.
ツールキット ver1.0 の計算手順• 複数のスレッドブロックおよび,それぞれ複数ス
レッドを用いて並列に編集距離を計算するコードの例
• 並列化できる部分は,前述の「アルゴリズムの並列化」を参照– ( 表上で )斜めに並んだセルは並列化可能– 効率化のため ( アクセスの coalescing) ,同時にアクセス
する部分がまとまるように表を作成
ツールキットのメモリ利用
• 左図は実際には全てがメモリにおかれることはなく,最新の三行だけが GPU のGlobal memory におかれる
• あるステップでは, p[1], p[2] から読み込んで p[0] に書き込み
• 次のステップでは, p[2], p[0] から読み込んで p[1] に書き込み・・・ 3 つのバッファを順繰りに利用
w w e i g h t
r
i
t
e
01234
11234
2
12
23
33
22
3
44
3
33
55434
lenStr2
並列処理の方法• ずらした表において,横に並んだセルを並列に
実行したい– 最大 1M-128個のセル– GPU では,一度に 65535個までのスレッドブロック
,スレッドブロック内には 512個までのスレッドを起動可能 (y 方向, z 方向を使えばよりたくさん )
合計 1M-128個のスレッドの同時起動は可能– 実際の Streaming multiprocessor 数より多くのスレッド
ブロックを起動すると,一般的にはメモリアクセスコストを隠せて性能上有利
ツールキットでは最大 lenStr2個のスレッドを起動し,一スレッドが一セルを計算する
おわり