LoginSignup
1
1

More than 1 year has passed since last update.

[CUDA] 速いカーネルを書くために

Last updated at Posted at 2022-09-14

メモリの階層構造

グローバルメモリ >> コンスタントメモリ > シェアードメモリ >> レジスタ

スレッド間のデータ共有手段

グローバルメモリ経由 >> シェアードメモリ経由 > ワープシャッフル命令(同一ワープ内のみ)

グローバルメモリのアクセスパターン

ストライドアクセスは避ける。目指せコアレスアクセス、アラインアクセス
ランダムアクセスはストライドアクセスよりよっぽどまし。
ロード、ストア命令回数が少なくなればなるほどいい

シェアードメモリのアクセスパターン

ハードウェアによって違うが、2次元的にアクセスしていて、取り出し口は一次元的なので、バンクコンフリクトしないようにワープ内でコアレスアクセスするのがいい。
ストライドアクセスするときは、パディングを入れて、無理やりバンクコンフリクトを回避するのも一つの手。
最悪32倍の命令が必要になる場合もありうる(ストライドアクセス)

レジスタの使用量

レジスタはすべてのスレッドで分けて使う。なので、使用レジスタ数が少なくても十分早ければ別ストリームによる並列化もできて最高。遅ければ一スレッドあたりの仕事を増やして、使用レジスタ数を増やしてやるのも吉。

シェアードメモリの量とL1キャッシュの量はトレードオフ

シェアードメモリを使うなら徹底的に使え

nvprofとかを使って律速の確認や、各メトリクスを確かめろ

バンクコンフリクトの回数とか、いろんなメトリクスを調べられる。

上の指針は目安であって、確かめろ!

計測しながらやれ!

計算アルゴリズムは何よりも大事

計算方法のレベルでは最適化が簡単にはできないがオーダーレベルで良くなるのでやれ!
上の指針は定数倍しかよくならない。

以上を忘れないこと。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1