2012-03-20 9 views
1

私の並列プログラムは、C++とOpenMPIを使用して実装されています。私はそれをテストするとき、私はより多くの時間を費やすより多くのCPUを使用することがわかった。これはどうしたらできますか?次のようにMPIより多くのCPU使用時間がかかる

私のコードの構造は次のとおりです。

MPI::Init 

if (rank == 0) 
{ Read files } 

MPI::Bcast 
MPI::Scatter 

for (i=0; i<N;i++) 
{ 
    do something here 
    MPI::Gather 
    if(rank ==0) 
    { save result} 
} 

MPI::Finallize() 

END

をBEGIN、私はこのことについて混乱しています。

+1

MPIについてはあまりよく分かりませんが、あなたは仕事の負荷がかなり長い場合、あなたは悪い結果を見るつもりです。 – 111111

答えて

1

あなたのプログラムでは、並列実行されるコードは、http://en.wikipedia.org/wiki/Amdahlのs_lawを宣言しています。また、コンピュータアーキテクチャなどのパフォーマンスに影響を与えるパラメータが他にもたくさんあります。たとえば、共有メモリシステムを使用する場合、ファイルが大きいとパフォーマンスが低下する可能性があります。この場合、通信に派生データ型を使用する必要があります。ネットワーク速度は分散システムにとって重要です。

1

環境と実行されている実際のコードについての情報がなくてもわかりませんが、MPI::Gather()MPI::Bcast()は呼び出しをブロックしています。プロセスは、すべてのプロセスがこの時点に達するのを待つ必要があります。

1つのCPUが非常に遅い - それがBcast()に達するのを待っている場合、合計時間が遅くなります。

+0

あなたはこれについて正しいです。しかし、パフォーマンスを向上させるためにできることはありますか? – user1253764

+0

これは必ずしも真実ではありません。MPI標準を引用するためには、「集合的な通信呼び出しがあるかもしれないし、 がそうでないかもしれません、すべての呼び出しプロセスを同期させる効果があります。 (第5.1章、V 2.2) – Zulan

2

拡張コメント、答えられない:

を111111さんのコメント@、ワークロードがない限り十分な大きさであることは、並列化は、実際に遅い計算することができ、正確です。コードの概要だけを投稿するので、これを明確に問題の根源として診断することはできませんが、ジャンプするのは不合理な結論ではありません。

一般に、シリアルプログラムのパラレルバージョンは、すべての状況でより高速になることは期待できません。並列化にはコストがかかります(「並列オーバーヘッド」とも呼ばれます)。たとえば、ブロードキャストとスキャターのオペレーションはこのオーバーヘッドに貢献します。並列コードで実行するだけです。時間がかかる場合は、複数のCPUで高速な計算を行うことができます。

私は先に進んで、あなたが並列プログラミングに比較的新しいことを推測し、この問題、並列化のコストと利点のうち、あなたのコードと問題に関して学ぶべきものであることを示唆しています。実験から得られたデータによってバックアップされ、ジョブのサイズを増やしたときやプロセッサの数を増やすときにプログラムのパフォーマンスがどのように変化するかを理解することを、間違いなく目指すべきです。

EDIT

ワンさらにマイナーポイント:あなたがあなたのプログラムのタイミングのために右のルーチンを使用してください。 mph_wtime()を使用することをお勧めします。私は素朴なプログラマーがutimeのようなものへの呼び出しを使用して、すべてのN個のプロセッサーが使用する時間を合計することになります。あなたが興味を持っているのは、最初から最後までの(または2つの興味のあるポイントの間の)壁時計の時間だけです。

関連する問題