0

デバイスGeForceGTX680

プログラムでは、カーネル内で処理される非常に長い配列があります(約1 GBの整数)。必要に応じて、配列はいくつかのオーバーラップ(ブロック間のオーバーラップはk)でブロックに順番に分割されます。各ブロックのサイズを固定しました(ブロックサイズはm)。これで、配列は(0、m)(mk、(mk)+ m)、....)の順に分割されます。

上記の計算によると、私のプログラムに必要なブロックの数はおよそ(1GB / m)になります。GPUではブロックの総数が制限されているので、どうすれば効果的にそれを行うことができますか?カーネル内にループがない状態で、ホストからカーネルを繰り返し呼び出す必要がありますか?または、カーネルを1回呼び出してから、カーネル内で複数回ループする必要がありますか?または、合計ブロック数=(1 GB / m)でカーネルを1回だけ呼び出す必要がありますか?

このプログラムのブロック数の最良の値として何を置くことができ、どのような方法がありますか?

4

1 に答える 1

1

アプリの最初のバージョンには、次のシーケンスをお勧めします。

初期化:

  • GPU 上の配列の 2 つのオーバーラップしないブロック (スロット 1 および 2) に GPU 上のスペースを割り当てます。
  • 重複していない最初のブロックをスロット 1 にコピーする

ループ:

  • 次の重複しないブロックをスロット 2 にコピーします
  • スロット 1 で実行され、部分的にスロット 2 で実行されるカーネルを実行する
  • スロット 2 の内容をスロット 1 にコピー (GPU から GPU メモリへのコピー)

それ以降のバージョンでは、スロット 1 とスロット 2 に交互にコピーし、スロット 2 をオーバーフローさせる代わりにスロット 1 の先頭から開始するようにアドレス指定をカーネル内でラップすることにより、GPU から GPU へのコピーを回避できます。考えてみてください。スロット 1 とスロット 2 はリング バッファに配置されます。カーネルが以前のスロットで実行されている間に、スロットを追加し、配列のブロックを新しいスロットに非同期にコピーすることで、パフォーマンスを向上させることもできます。

于 2012-11-25T19:26:11.107 に答える