1 / 21

Multicore Programming Contest GPU Challenge 2009 ツールキット解説書 ver.1.0 対応版

Multicore Programming Contest GPU Challenge 2009 ツールキット解説書 ver.1.0 対応版. GPU Challenge 2009 実行委員会. これはなに?. GPU Challenge 2009 規定課題に取り組む際のベースとなるツールキットの解説です Cell Challenge 2009 ツールキット解説書 (Cell Challenge 2009 実行委員会による ) を、許諾を得て転載・一部改変したものです. 規定課題 「 文字列の編集距離計算 」. 2 つの文字列の近さを計る方法

Download Presentation

Multicore Programming Contest GPU Challenge 2009 ツールキット解説書 ver.1.0 対応版

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Multicore Programming Contest GPUChallenge 2009ツールキット解説書ver.1.0対応版 GPU Challenge 2009実行委員会 Cell Challenge 2009併設企画 GPU Challenge 2009

  2. これはなに? GPU Challenge 2009規定課題に取り組む際のベースとなるツールキットの解説です Cell Challenge 2009ツールキット解説書(Cell Challenge 2009実行委員会による)を、許諾を得て転載・一部改変したものです

  3. 規定課題「文字列の編集距離計算」 • 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

  4. 編集距離の操作例 • 「weight」と「write」の編集距離 • 以下の操作で「weight」から「write」になる • weight • weighte(挿入:e) • wrighte (置換:e → r) • wrihte (削除:g) • write (削除:h) • 3回以下の操作では「weight」を「write」できない • よって編集距離は 「4」 • 削除,挿入,置換は文字列の中のどの位置で行ってもよい

  5. 編集距離計算のアルゴリズム(概要) weight 文字列1 write 文字列2 操作回数を 格納する テーブル weight write 「動的計画法(Dynamic Programming)」が有名 操作回数を表を作って求める

  6. 編集距離計算のアルゴリズム(手順) このスライドには アニメーションが設定されています N 2 3 5 6 1 4 1 2 0 3 4 5 1 4 5 1 2 3 2 1 2 2 3 4 2 1 3 3 2 2 3 3 4 3 4 4 5 4 3 3 3 M アニメーションでは列ごとに計算しているが, 「上,左上,左のセル値」が決定しているセル ならば計算手順は任意 • 最左列,最上行のセルは1~N,1~Mの値と仮定 • 上,左上,左のセル値と,当該の行と列の文字列を使い,以下の方法で各セルの値を計算する • 文字列が同一ならば左上セルの値 • 異なるならば左上セルの値+1(置換) • 左セルの値+1(挿入) • 上セルの値+1(削除) • (A)-(E)の最小値をセルの値に設定 • テーブルの左上から値を求める • 右下端のセル値が最終的な編集距離となる

  7. アルゴリズムの並列化 (1) このスライドには アニメーションが設定されています 1 2 0 3 4 5 4 5 1 2 3 1 2 2 3 4 2 1 3 2 2 3 3 3 4 4 4 3 3 3 Coalesced accessについては,NVIDIA CUDA Programming Guide 2.0の5.1.2.1を参照 「Compute Capability 1.2 and Higher」の部分です.(利用するGPUは1.3なので) • 以下のデータがあれば,各セルの計算が可能 • 文字列 • 左上セル,左セル,上セルの値 ⇒ 図中の同じ文字色のセルどうしは,並列に実行可能! しかしこの並びを素直に配列で表現すると,GPUではメモリアクセス性能が低下 ⇒”Coalesced access”を可能としたい

  8. アルゴリズムの並列化(2) 0 1 1 2 2 1 3 2 2 3 4 4 3 3 1 5 4 2 2 4 5 3 2 3 4 3 3 3 3 4 GPUのスレッド達が同時にアクセスする領域は,メモリ上で固まっていた方が効率的(coalesced access) ⇒ツールキットでは,左図のように表配置を「ずらす」ことにより,同じ文字色のセルを,メモリ上で固めて配置 計算は左図の上から下へ順に行われる ツールキットでは,メモリを節約するため,最新の三行だけをGPUのメモリ(Global memory)に保持している

  9. ツールキット ver1.0 $ gcc -O3 -o getrndstr getrndstr.c $ ./getrndstr 128 13 > file9999 乱数種13で生成される128文字の文字列を格納したファイルfile9999を生成する • 2つのテキストファイルを入力すると,それらの中の文字列を読み込んで編集距離を求める • GPU内で複数のスレッドブロック・複数のスレッドを起動する⇒複数のStreaming Multiprocessor(SM)およびSPを使用する • 制約:各文字列の文字数は128の倍数 • いろいろなサイズの例題ファイル付き(file1, file2, … , file20) • getrndstr.c を使用すると,任意長のランダム文字列を生成できる

  10. 実行方法(1/3) Toolkitのディレクトリ内でコンパイル gt901@gpuc1:~/toolkit-1.0> make nvcc -c -O2 main_host.cpp nvcc -c -O2 -g device.cu nvcc -O2 -o ldistance main_host.o device.o

  11. 実行方法(2/3) 2つの文字列の長さ GPUを用いた計算時間 GPUを用いた計算結果(編集距離) 練習問題の実行 gt901@gpuc1:~/toolkit-1.0> ./run3.sh answer = 19168 strnum(a)= 20480 strnum(b)= 20480 Initializing CUDA: 3.97771811 seconds GPU eclock : 0.41952395 seconds [CPU] : 19168 [GPU] : 19168 SUCCESSFUL. さまざまな練習問題を実行する,run1.sh ~ run9.shが用意されています

  12. 実行方法(3/3) 第一ファイル 第二ファイル 答え (省略可) 2つの文字列の長さ GPUを用いた計算時間 GPUを用いた計算結果(編集距離) 「答え」を与えないとCPUで検算を行います。 検算の時間は計算時間には含まれません 巨大な文字列を対象にした場合,計算時間が非常に長くなることがあります 自作問題(getrndstrなどによる)の実行 gt901@gpuc1:~/toolkit-1.0> ./ldistance file7 file8 19168 answer = 19168 strnum(a)= 20480 strnum(b)= 20480 Initializing CUDA: 3.97771811 seconds GPU eclock : 0.41952395 seconds [CPU] : 19168 [GPU] : 19168 SUCCESSFUL. 文字列長

  13. 規定課題への取り組み方 • 規定課題では,CPUプログラムおよびGPUのプログラム(device.cu)を実装する • 以下のプログラムを実装してください • CUDAで記述された,編集距離を計算するプログラム(device.cu) • device_user()関数を実装してください.ツールキットのdevice_user()を基に改造を行うのは,もちろんokです • 以下のファイルは変更が許可されません • main関数などを含むプログラム(main_host.cpp) • device.cuに加え,新たにプログラムファイル(*.c, *.cpp, *.cu, *.hなど)を追加することはok • それに応じて,Makefileを変更すること

  14. 参加者が実装するdevice_user関数について(1) unsigned int device_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)以下です • 計算結果は返り値としてかえすこと

  15. 参加者が実装するdevice_user関数について(2) • 参加者のプログラムは1つのGPUのみを用いること. device_user関数の中でcudaSetDevice関数などを呼んではいけない. • 委員会の準備する計算機には2つずつGPUが搭載されていますが,各チームはそのうちの1つだけを使うことになります) • 参加者のプログラムはCPUコアを高々1つだけ用いること.ホストとGPUの間の通信やGPUカーネル関数の終了待ちなどにも CPUコアが使われるので注意のこと.

  16. メモリについて • 参加者はホストメモリ(mallocなどによる),GPU上のGlobal memory(cudaMallocなどによる)を自由に利用できます • GPU上のshared memory, texture memoryなどもok • メモリ容量に注意してください • ホスト: 32GB • GPU (Global memory): 4GB • 特に,lenStr1 * lenStr2のサイズのint二次元配列は,最大(2の34乗)の場合にはホストにもGPUにも乗りません  ツールキットで行っているような,使用メモリ量を抑える工夫が必要

  17. プログラムの実行時の注意 • 複数の参加者が,計算機を紳士協定で共用します(2009/02/03現在) • 各チーム(偶数・奇数)が許可されている方のマシンだけにログイン可能です. • 一度のプログラム実行は,10分までとしてください.また,一チームが連続して複数回プログラムを実行することはできますが,長期間占有することは避けてください. プログラムの実行前には,psコマンドやtopコマンドでマシン利用状況を確認することをおすすめします.

  18. ツールキットver1.0の計算手順 • 複数のスレッドブロックおよび,それぞれ複数スレッドを用いて並列に編集距離を計算するコードの例 • 並列化できる部分は,前述の「アルゴリズムの並列化」を参照 • (表上で)斜めに並んだセルは並列化可能 • 効率化のため(アクセスのcoalescing),同時にアクセスする部分がまとまるように表を作成

  19. ツールキットのメモリ利用 lenStr2 0 1 1 2 2 1 3 2 2 3 4 4 3 3 1 5 4 2 2 4 5 3 2 3 4 3 3 3 3 4 左図は実際には全てがメモリにおかれることはなく,最新の三行だけがGPUのGlobal memoryにおかれる あるステップでは,p[1], p[2]から読み込んでp[0]に書き込み 次のステップでは,p[2], p[0]から読み込んでp[1]に書き込み ・・・3つのバッファを順繰りに利用

  20. 並列処理の方法 • ずらした表において,横に並んだセルを並列に実行したい • 最大1M-128個のセル • GPUでは,一度に65535個までのスレッドブロック,スレッドブロック内には512個までのスレッドを起動可能 (y方向,z方向を使えばよりたくさん) • 合計1M-128個のスレッドの同時起動は可能 • 実際のStreaming multiprocessor数より多くのスレッドブロックを起動すると,一般的にはメモリアクセスコストを隠せて性能上有利  ツールキットでは最大lenStr2個のスレッドを起動し,一スレッドが一セルを計算する

  21. おわり

More Related