メモリの階層構造
グローバルメモリ >> コンスタントメモリ > シェアードメモリ >> レジスタ
スレッド間のデータ共有手段
グローバルメモリ経由 >> シェアードメモリ経由 > ワープシャッフル命令(同一ワープ内のみ)
グローバルメモリのアクセスパターン
ストライドアクセスは避ける。目指せコアレスアクセス、アラインアクセス
ランダムアクセスはストライドアクセスよりよっぽどまし。
ロード、ストア命令回数が少なくなればなるほどいい
シェアードメモリのアクセスパターン
ハードウェアによって違うが、2次元的にアクセスしていて、取り出し口は一次元的なので、バンクコンフリクトしないようにワープ内でコアレスアクセスするのがいい。
ストライドアクセスするときは、パディングを入れて、無理やりバンクコンフリクトを回避するのも一つの手。
最悪32倍の命令が必要になる場合もありうる(ストライドアクセス)
レジスタの使用量
レジスタはすべてのスレッドで分けて使う。なので、使用レジスタ数が少なくても十分早ければ別ストリームによる並列化もできて最高。遅ければ一スレッドあたりの仕事を増やして、使用レジスタ数を増やしてやるのも吉。
シェアードメモリの量とL1キャッシュの量はトレードオフ
シェアードメモリを使うなら徹底的に使え
nvprofとかを使って律速の確認や、各メトリクスを確かめろ
バンクコンフリクトの回数とか、いろんなメトリクスを調べられる。
上の指針は目安であって、確かめろ!
計測しながらやれ!
計算アルゴリズムは何よりも大事
計算方法のレベルでは最適化が簡単にはできないがオーダーレベルで良くなるのでやれ!
上の指針は定数倍しかよくならない。