3

サイズ 2^18 の 2 つの列ベクトルに対して SAXPY を実行する単純な CUDA カーネルを作成しました。

私の GPU である Tesla C2070 は、ブロックごとに最大 1024 スレッドを実行できることがわかりました。したがって、ブロック サイズを X = 1024、Y = 1、Z = 1 にしました。グリッド サイズも X = 2^18 / 1024、Y = 1、Z = 1 にしました。ブロックごとのすべての単一スレッドが使用されていたこと。

ただし、ブロック サイズ X = 512 および X = 128 でカーネルを実行すると、ブロック サイズ X = 1024 でカーネルを実行するよりも一貫して高速になることがわかりました。

何故ですか?ブロック サイズが 1024 未満の場合、スレッドを浪費していませんか?

4

2 に答える 2

3

SAXPY などのレベル 1 BLAS 関数は、メモリ帯域幅に制限があります。操作

y <- alpha * x + y

単一の FMAD のみを実行しますが、2 つのロードとグローバル メモリからのストアが必要です。C2070 には、約 37.5Gfloat/s のグローバル メモリ帯域幅と 500 GFMAD/s の単精度演算スループットがあります。そのため、パフォーマンスは ALU ではなく、メモリ コントローラーによって決まります。多くの場合、メモリ帯域幅が制限されたカーネルでブロックあたりのスレッド数を減らすと、メモリ コントローラーとキャッシュ リソースの競合が減り、帯域幅の使用率が向上するため、パフォーマンスが向上します。

これはおそらく、SAXPY カーネルで起こっていることです。ベンチマークによって最適なブロックサイズを見つけることができるはずですが、私の経験では、C2070 のような Fermi デバイスではブロックあたり 128 ~ 384 スレッドになります。

于 2012-10-28T06:41:02.707 に答える
1

読み取り/書き込み/データ共有のキャッシュに共有メモリを使用するコードの場合、ブロック サイズが小さくなると、スレッドごとにより大きな共有メモリ ブロックが使用される可能性があり、その結果、適切なメモリ アクセス パターン (合体の増加) の可能性が高くなります。

私の経験では、ブロックあたり 128 ~ 192 のスレッドが、より多くのスレッドを起動できる場合でも、ほとんどの場合、コードの最高のパフォーマンスをもたらすというタロンミーに同意します。

于 2012-10-28T13:32:59.210 に答える