2016-07-13 12 views
0

OpenMPを使用する私は、単純なアルゴリズムを異なるスレッドで分割しましたが、実行時間は大幅に増加しています。これは、同じCPUコアで実行されているすべてのスレッドが原因である可能性があります。 CPUがデュアルコアまたはクアッドコアであれば、スレッド数をCPUコア数よりも多く割り当てることはあまり役に立ちません。 2つのスレッドで実行時間が増えています。OpenMPの特定のスレッドを特定のCPUコアに割り当てる方法があるかどうかを知りたいですか?

+4

スレッドを移動させないようにOpenMPを指示するスレッドをバインドすることはできますが、少なくともOpenMP 4.0より前に調べてみると、特定のスレッドをパーティクルコアに割り当てるメソッドはありません。スレッドをバインドする場合は、コードを開始するときに定義されたトポロジでスタックされます。 OpenMP以外の関数を使用して、特定のコアにバインドするスレッドを指定する必要があります。 –

+0

Windowsでハイパースレッディングを使用すると、少なくともデフォルトのトポロジでは、明らかに理想的ではない最初の2つのスレッドが同じコアに配置されます。私はLinuxとWindows(最初のモジュールの最初の2つのスレッド)でAMDモジュールと同じことが起こると思います。 AMDモジュールは実際には単一の浮動小数点コアです。 IntelとAMDでデフォルトのスレッド数を使用するだけでは、すべてのコアがいっぱいになるので問題はありませんが、スレッド数を少なくして論理プロセッサの数を増やすと、 –

+0

なぜスレッド数を制御したいのですか?なぜデフォルトを使用しないのですか? –

答えて

-1

はい、どのCPUがスレッドを取得するかを決定できます

例えば、Thread Affinity Interface (Linux* and Windows*)を使用することによって、タロンミーによって提案される。しかし、記事に記載されている内容に注意してください。

スレッドアフィニティはアプリケーションの速度に大きな影響を与えます。


遅く実行を取得するために、2つの主な理由が適用される場合があります:

1)あなたのコアより多くのスレッドを持っている場合は、残りのスレッドはに減少し他の人のために待機しますシリアル実行。

これで、2つのコアがあると仮定すると、実行可能な4つのスレッドがあると仮定すると、すべてのスレッドがリソース(つまりコア)を競合するため競合状態になるため、2つが実行されます他の2人は待たなければならない。

2)問題のサイズが小さい

並行走行は無料ではありません。あなたは多くのハウスキーピングをしなければならず、一般的にパラレル実行を調整しなければなりません。あなたはOpenMPを再生しなければならず、OSはもっと多くのスレッド/プロセスも処理しなければなりません。

問題のサイズが十分でない限り、パラレル実行をオーケストレーションするオーバーヘッドが実行を支配するため、スピードアップは表示されません(さらに悪いことに、あなたの場合のように減速が見られます)。あなたのアプリケーションの。

+0

https://software.intel.com/en-us/node/522691 – talonmies

+0

ええ、インテルは1つ、確かに私は忘れてしまった! upvoteとリンクのために感謝@タロンダム。私は私の答えを更新します。 – gsamaras

+0

gccも同様です。そして私はこれをアップヴォートしなかった – talonmies

関連する問題