2009-04-02 5 views
0

各プロセスの整数配列の内容を出力したい。問題は、競争状態のためにすべてが混乱していることです。MPI:一度にstdout - 1プロセスをロックしますか?

最も簡単な解決策は何ですか?私はデバッグしたくありません。ソートアルゴリズムを実行しているので、内容を表示したい。したがって、ソートの前後に表示すると便利です。

私はlock.cでこれを追加しました:

#include <stdio.h> 
static int lock=0; //Don't use if timing execution 
void capture(int rank) { 
    while(lock!=0); 
    lock = 1; 
    printf("\nCaptured by %d\n", rank); 
} 
void release() { 
    lock = 0; 
} 

と(キャプチャを呼び出す)のものを印刷する前に、その後、印刷後に()をリリース。はい、セマフォのようなハックです。しかし、それは動作していない、任意のアイデア?

+0

「それは動作していません」と言われると、あなたはどういう意味ですか?personnaly、別のスレッドの出力が混ざっていると思いますか?それはあなたが意味することですか? –

+0

はい、競合状態です。 – syaz

答えて

1

各プロセスには、独自の変数のコピーがあります。だから、それは共有されておらず、あなたはそれを同期のために使うことはできません。

+0

ロックは静的とみなされ、スレッド間で共有されます。 –

+0

@OfekShilonしかし、MPIは共有メモリシステムではないので、スレッド間で共有されるかもしれませんが、MPI *プロセス間では共有されません*。 – Nathan

2

メッセージパッシングインターフェイスを意味すると仮定した場合、出力文字列をバッファに書き込み、それらをランク0プロセスに送信するのが最善の方法です。このプロセスは、実際の作業を行うのではなく、出力文字列をフィルタリングして出力するために使用する必要があります。

実際の作業を行うために他のランクを残してください。私は上記の解決策は、私は各ランクにローカルなので動作しないと思う。

また、その間にソート作業を行うことができないため、メッセージが出力されるまで個々のランクを停止することは望ましくありません。

各ランクは1からNまでです。文字列は"NNN:SSSSSS"の形式になります。ここで、Nはランク、Sは文字列です。ランク0は、特定のメッセージをフィルタリングしたり、別のファイルに異なるメッセージを書き込んだり、すべての作業ランクがシャットダウンしたら、それらを結合(ソート)することができます。 、これは、非効率的である。もちろん、

for(int i = 0; i < size; ++i) { 
    MPI_Barrier(MPI_COMM_WORLD); 
    if (i == rank) { 
     printf("..."); 
    } 
} 

が、それは次のようになります。

2

あなたはすべてのプロセスのSTDOUTsを収集MPIを使用していると仮定すると、あなたはそうのように、順序を強制するMPI_Barrierを()を使用することができますすべての情報をランク0に戻すように手配するよりも少し簡単です。

+0

ありがとう、エドリック! は感謝..私はこれを私自身のバージョンにかなり多くのあなたの正確なソリューションを持っていた...しかし、物事はまだ調子が悪いなっていたので、私は、バリア()への呼び出しを持っていませんでした。 –

関連する問題