2012-04-20 15 views
5

用語「スレッドの分岐」はCUDAで使用されています。私の理解から、別のスレッドを割り当てて別々のタスクを実行し、結果として大きなパフォーマンスが得られるという状況です。Openmpスレッドの分岐?

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

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

+0

ただ興味がありますが、OpenMPでこれをどうやって行うのでしょうか?私はあなたの質問が既に答えられていることを知っていますが、コードの一部を見てうれしいです。 –

+0

これは話題にはなりませんが、ホストコードが過度に複雑になる前に、CUDAに複数のCPUスレッドを必要としないかもしれません - CUDA 4.0以降では、単一のホストスレッドからマルチGPUプログラミングを行うことができます。あなたはホスト側で行うべき並行作業がありますが、複数のスレッドは複雑さを追加することはできません。 CPUと並行して作業する場合は、CUDA用に1つのCPUスレッドを使用し、残りのCPUスレッドを並列に使用することができます。 – harrism

答えて

7

いいえ、OpenMPを使用する分岐スレッドの場合、パフォーマンスは低下しません。命令がコアセットに同時にブロードキャストされるため、CUDAの問題です。 OpenMPスレッドがCPUコアをターゲットとする場合、各CPUコアは独自の独立した命令セットを持ち、他のシングルスレッドプログラムと同様に動作します。あなたがスレッド発散次の同期の障壁を持っている場合には、低速のスレッドが追いつくのを待つより早くスレッドを強制するため

あなたは、あなたのコアの一部が十分に活用されて表示されることがあります。

+0

お返事ありがとうございます!スタックオーバーフローの最初のポストと私は10分で2つの応答を取得します。めっちゃすごい。 – Justin

3

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

私が見る唯一の問題は、スレッドが完了時間を変化させている可能性が異なることをやっているので、スレッドのいくつかは他の人が長いタスクを終了するのを待って、自分の仕事を終えた後、アイドル状態かもしれないということです。

+0

お返事ありがとうございます。 – Justin

1

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

私はOpenMPに同じ問題があるとは確信していません。異なるスレッドが異なる作業を実行する場合、ロードバランシングはランタイムによっておそらく使用されるかもしれませんが、必ずしも作業のシリアライゼーションには至りません。

1

openmpにはこの種の問題はありません。なぜなら、openmpスレッドにはそれぞれ独自のPCがあるからです。