アイスランドクローネ日記帳

音楽のこと、旅行のこと、ふと思ったこと、全く思っていないこと等を書きます。

CUDAプログラミング実践講座 超並列プロセッサにおけるプログラミング技法 [David B.Kirk, Wen-mei W.Hwu(著)]

CUDAの本を読みました。
基本的な文法だけでなく、パフォーマンス改善のポイントや、
MRIの画像再構成や分子シミュレーションの具体例もあって楽しめました。



デバイスのメモリにデータコピーしてから
カーネル関数でスレッドのインデックスを使ってゴリゴリ計算して
ホストのメモリに返しておしまい、というのが僕のCUDAに関する全知識でしたが、
そんな単純な話じゃないんだということがこの本を読んでよく分かりました。

グローバルメモリへのアクセスがパフォーマンスにかなり効いてくるらしく、
グローバルメモリはだいぶ目の敵にされています。

グローバルメモリのデータを共有メモリに移して効率よく使うために、
TILEでデータを区切って、TILEごとに共有メモリにコピーしてブロック内スレッドの同期をとったりします。
変更しないデータはConstantで宣言してコンスタントメモリに入れたり、
何度も繰り返し使うデータはローカル変数を定義することでレジスタに割り当てます。
そこまでしてグローバルメモリを避けるかと感心してしまいます。

しかもレジスタの数を増やすとトータルのレジスタ数が足りなくなって、
並列に動くブロック数が減って逆効果だったりするので(パフォーマンスクリフ)
そこらへんのチューニングは難しそう。
この辺の話は全体的に組み込みみたいな雰囲気がぷんぷんして楽しいです。

メモリアクセスの空き時間をうまく使うために
データをプリフェッチして共有メモリにコピーするとか、
floatの積和演算の割合を挙げるためにループをベタ書きに展開するとか、
どう考えてもソースコードの見通しが悪くなることも平気で推奨していて痛快です。
しかもやるとかえって遅くなる場合もあるのが難しそうです。

あとは、実際に同時に走るスレッドの集合であるワープという概念があって、
ワープ内でifの分岐が異なると効率が低下するので、
条件式がTRUEになるワープとFALSEになるワープがうまく分離されるようにしてやる、
というのもすごく力技な感じがします。
トーナメントの例がとてもわかりやすいです。

後半は、IEEEの浮動小数点の標準にまるまる1章が費やされています。
計算順序で結果が変わってくるという話をするためのしっかりとした筋書きです。
加算するときは昇順に並び替えてから並列計算のグルーピングをすると、
近い値同士をまず足し算するので誤差が少ない、ということです。
でもそれよりも、浮動小数点の値が0付近で非正規化されているということが
ちゃんと分かっていなかったので読んでよかったです。

MRIの具体例は楽しみにしていたのですが、画像再構成の処理全体に関する説明はほとんどなく、
並列化する部分の計算のことしか分からず。まぁ本のスコープから考えて当たり前ですが。
今までの内容に加えて、ループフィッションやループ交換、
構造体を使った配列の並び替え、さらにはGPU内臓超越関数ユニット(SFU)の使用まで、
いろんな工夫やチューニングがたくさん出てきてお腹いっぱいになります。

終盤には、アムダールの法則、グスタフソンの法則、カットオフビニング、
さらにはOpenCLと話が広がって、単なるCUDAの本ではなくなっていきます。
OpenCLがここまでCUDAに似ているというのは意外でしたが、
よく考えたら標準化にNVIDIAも関わっているので当然なのかもしれません。
NDRangeだとかワークグループ、ワークアイテムだとか、言葉が違うのが困ります。
あとはソースコードを文字列として関数に渡す動的コンパイルなのもデバッグがしんどそうです。
でもCUDAと違ってDSPやFPGAでも動かせる、というのはナイスな心意気なので応援したいです。
現状ここまでアーキテクチャ依存だとなかなか大変そうですが、
ベンダーに依存しない標準化は重要だと思います。

さて、この本は2010年初版発行ですが、本文の中に何度も
「近い将来コンパイラがやってくれるようになるかも」みたいなことが出てくるので、
既に現在の状況と乖離があるかもしれません。
GPUまわりは変化が速すぎます。
でもこういう本は少し古い方が原点が分かるのでいいと思います。

あと、世の中でここまで並列計算が盛んになってくると、
PvsNPを始めとする計算量理論の世界が最近どういう動きになっているのかも少し気になります。
まぁどんなにGPUやFPGAが進化してもスレッドが有限である以上
計算量のオーダーには影響しないはずですが、
何かおもしろいことを考える人もいそうな気がします。


  1. 2016/12/26(月) 01:23:27|
  2. | トラックバック:0
  3. | コメント:0
<<Exceptional C++ 47のクイズ形式によるプログラム問題と解法[Harb Sutter(著) 浜田真理(訳) 浜田光之(監修)] (ピアソン・エデュケーション) | ホーム | Java言語で学ぶデザインパターン入門【マルチスレッド編】[結城浩(著)](Softbank Creative)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://myumbrella.blog42.fc2.com/tb.php/340-816638ea
この記事にトラックバックする(FC2ブログユーザー)