0

各プロセスの整数配列の内容を出力したい。問題は、競合状態のためにすべてが雑然としていることです。

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

これを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;
}

そして、印刷する前に capture() を呼び出し、印刷後に release() を呼び出します。はい、これはセマフォのようなハックです。しかし、それは機能していません、何かアイデアはありますか?

4

3 に答える 3

5

すべてのプロセスの STDOUT を収集する MPI を使用していると仮定すると、次のように MPI_Barrier() を使用して順序付けを強制できます。

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

もちろん、これは非効率的ですが、すべての情報をランク 0 に送り返すように手配するよりも少し簡単かもしれません。

于 2009-04-07T12:10:05.450 に答える
3

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

実際の仕事をするために他のランクを残してください。私は各ランクにローカルであるため、上記のソリューションは機能しないと思います。

また、メッセージを使用して個々のランクを停止することは望ましくありません(出力できるようになるまで)。その間、ランクは並べ替え作業を実行できなくなります。

ランク1からNまでのそれぞれに機能させ、文字列をランク0に送信します"NNN:SSSSSS"。文字列は、Nがランク、Sが文字列の形式にすることができます。ランク0は、特定のメッセージを除外したり、さまざまなメッセージをさまざまなファイルに書き込んだりして、すべての作業ランクがシャットダウンしたら、それらを結合(ソート)することができます。

于 2009-04-02T08:11:38.693 に答える
1

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

于 2009-04-02T08:09:26.513 に答える