5

スレッドダイバージェンスという用語は、CUDAで使用されます。私の理解では、さまざまなスレッドがさまざまなタスクを実行するように割り当てられている状況であり、これによりパフォーマンスが大幅に低下します。

私は疑問に思っていましたが、openmpでこれを行うことに対して同様のペナルティがありますか?たとえば、6コアプロセッサと6スレッドのプログラムがあるとします。3つのスレッドに特定のタスクを実行させ、他の3つのスレッドにまったく異なるタスクを実行させる条件がある場合、パフォーマンスに大きな影響がありますか?本質的には、openmpを使用してMIMDを実行するようなものだと思います。

基本的に、私はopenmpとCUDAを使ってプログラムを書いています。2つのスレッドでCUDAカーネルを実行し、残りのスレッドでCコードを実行したいと思います。ありがとう。

4

4 に答える 4

7

いいえ、OpenMPを使用してスレッドを分岐してもパフォーマンスに影響はありません。命令がコアのセットに同時にブロードキャストされる方法のため、これはCUDAの問題です。OpenMPスレッドがCPUコアを対象とする場合、各CPUコアには、従うべき独自の独立した一連の命令があり、他のシングルスレッドプログラムと同じように実行されます。

スレッドの分岐に続いて同期バリアがある場合、コアの一部が十分に活用されていないことがあります。これは、高速のスレッドが低速のスレッドに追いつくのを待つためです。

于 2012-04-20T16:26:54.103 に答える
3

CPUの並列処理について言えば、特定のスレッド設計パターンを使用することによる本質的なパフォーマンスへの影響はありません。少なくとも理論的なレベルではありません。

私が見る唯一の問題は、スレッドがさまざまなことを行っており、完了時間が異なる可能性があるため、一部のスレッドは作業の終了後にアイドル状態になり、他のスレッドがより長いタスクを完了するのを待つ可能性があることです。

于 2012-04-20T16:27:16.330 に答える
1

CUDAでのスレッドの相違という用語は、ボックのすべてのスレッドが同じ結果の条件を評価するわけではない状況を指します。そのような糸は発散すると言われています。発散するスレッドが同じワープにある場合、そのようなスレッドは連続して作業を実行する可能性があり、パフォーマンスの低下につながります。

ただし、OpenMPに同じ問題があるかどうかはわかりません。異なるスレッドが異なる作業を実行する場合、おそらくランタイムによって負荷分散が使用される可能性がありますが、必ずしも作業のシリアル化につながるわけではありません。

于 2012-04-23T04:58:00.407 に答える
1

すべてのopenmpスレッドには独自のPCがあるため、openmpにはこの種の問題はありません。

于 2012-04-30T13:40:12.833 に答える