3

CUDA の最小二乗最適化をプログラムしました。1 つのデータセットを最適化すると、問題なく動作します。さらに使用するには、同時に 3 つのデータセットを使用できるように実装する必要があります。このコードは、3 つのカーネルと、その間にデータを準備するためのホスト コードなどで構成されています。単純な実装では、データ セットごとにプログラムを 3 回呼び出します。

シリアル計算

しかし、私の仕事は、それを同時に 3 回実行する方法を見つけることです。 マルチスレッド

openmp や posix などのライブラリを使用するときに、プログラムまたは並行カーネルを 3 つのホスト スレッドから同時に呼び出すことは可能ですか、それとも良い考えですか? または、独自のスケジューラーをプログラムする必要がありますか?

4

1 に答える 1

2

「同時に 4 ブロック」とは、マルチプロセッサ (MP) ごとに 4 ブロックという意味ですか?

Q の追加コメントによると、560 Tiにはおそらく 384/32=12 個のマルチプロセッサ (MP) が搭載されています。1 つのカーネルに対して 12*4=48 を超えるブロックを起動すると、3 つのカーネルを同時に実行できなくなります。

この場合、タスクの規模がカーネルの同時実行には大きすぎますが、このブログに示されているように、データ転送とカーネルの実行をオーバーラップできる可能性があります。

詳細については、CUDA プログラミング ガイドの非同期同時実行セクションを参照してください。

一方、データセットごとにホスト コードもいくつかあるため、あるデータセットのホスト コードと別のデータセットのカーネルを同時に実行することで、プログラムを高速化できます。

ホスト コードの並列化には、posix/omp を使用してから、各カーネルを異なる CUDA ストリームで対応するホスト スレッドにバインドできます。

于 2013-01-23T08:33:29.803 に答える