2

皆さん、私の考えが正しいか確認してください。

カーネル関数があるとしますmykernel(double *array)。カーネル内のコードを 128 回実行したい。ホストからカーネルを呼び出すとき、これを行うには 2 つの方法があります。

mykernel<<<128, 1>>>(myarray);
//or
mykernel<<<1, 128>>>(myarray);

最初の呼び出しで、それぞれ 1 つのスレッドを実行する 128 個のブロックを作成します。2 回目の呼び出しでは、128 スレッドのブロックを 1 つ作成します。ただし、カーネル内のコードは同じ配列で動作しているため、2 番目の呼び出しを使用する方が効率的です。

私はばかですか、それともCUDAの学習に固執する必要がありますか? :)

4

3 に答える 3

5

場合によります。最初の呼び出しで複数のブロックが作成されますが、各ブロックは小さすぎて GPU のマルチプロセッサを効率的に使用できません (ワープ サイズよりもさらに小さくなります)。2 番目の呼び出しは、GPU 上の複数のマルチプロセッサを利用しません。本当に 128 スレッドしか必要ない場合は、次のような方法を試すことをお勧めします。

mykernel<<<4, 32>>>(myarray);

ただし、一般的に、パフォーマンスを最適化するには、さまざまなパラメーターを使用してコードをベンチマークする必要があります.YMMV.

于 2013-05-31T20:13:25.650 に答える
1

CUDA スレッドの最も効果的な利用は、32 のブロック単位です。これらはワープと呼ばれます。

1ワープ=32スレッド。

したがって、これを念頭に置いてコードをモデル化してください。

于 2013-05-31T20:19:58.430 に答える
0

128回実行するとはどういう意味ですか? 配列を 128 回反復する必要があり、各反復が以前の結果に依存する場合は、配列を適切な断片に分割してコードを実行し、同期して繰り返す必要があります。

一般に、要素が 128 個しかない場合は、メモリへのアクセスが高速になる可能性があるため、それらすべてを 1 つのブロックで実行しても問題ありません。

于 2013-05-31T20:16:45.700 に答える