0

大学の課題で PVM を使用してアルゴリズムを並列化しようとしています。アルゴリズムをソートしましたが、並列化はほとんど機能しません -明確な理由もなくプロセスが断続的に停止します。パターンは見当たりません。同じパラメータで実行すると 10 回は機能し、次の作業でスタックする可能性があります...

pvm(マスターまたは子プロセスの) どの関数もエラー コードを返さず、子は正常に完了したように見え、エラーはコンソールに到達していません。マスターが子供たちからのすべての通信を受信して​​いないように見えますが、たまに実行されるだけです。

奇妙なことに、メッセージをスキップしているだけではないと思います-子から結果が欠落し、完全なシグナルを正常に送信したことはまだありません(つまり、実行が完了に達しておらず、予期しない結果を返します) - まるで子プロセスが切断され、特定のポイントからのすべてのメッセージが届かなくなったかのようです。

結果をバッチ処理して送信するメッセージは少なくなりますが、より大きくなると、信頼性が向上するようです.

pvm_sendPVM が送信されたメッセージとその友人を失うことは正常ですか、一般的ですか、それとも予想されますか? すべてのプロセスが単一のホストまたは複数のホストで実行されると、エラーが発生することに注意してください。

私は何か間違ったことをしていますか?これを防ぐために私にできることはありますか?

アップデート

以下の非常に単純なテスト ケースでエラーを再現しました。このコードでは、4 つの子を生成してそれぞれに 1 つの数値を送信し、各子は受け取った数値を 5 倍して送り返します。ほとんど常に機能しますが、3 つの数字のみが出力されてフリーズすることがあります。1 人の子供の結果が欠落しています (その子供は完了しているはずです)。

主人:

int main()
{
    pvm_start_pvmd( 0 , NULL , 0 );

    int taskIDs[global::taskCount];
    pvm_spawn( "/path/to/pvmtest/child" , NULL , 0 , NULL , global::taskCount , taskIDs );

    int numbers[constant::taskCount] = { 5 , 10 , 15 , 20 };
    for( int i=0 ; i<constant::taskCount ; ++i )
    {
        pvm_initsend( 0 );
        pvm_pkint( &numbers[i] , 1 , 1 );
        pvm_send( taskIDs[i] , 0 );
    }

    int received;
    for( int i=0 ; i<global::taskCount ; ++i )
    {
        pvm_recv( -1 , -1 );
        pvm_upkint( &received , 1 , 1 );
        std::cout << recieved << std::endl;
    }

    pvm_halt();
}

子:

int main()
{
    int number;

    pvm_recv( -1 , -1 );
    pvm_upkint( &number , 1 , 1 );

    number *= 10;

    pvm_initsend( 0 );
    pvm_pkint( &number , 1 , 1 );
    pvm_send( pvm_parent() , 0 );
}
4

1 に答える 1

0

本当の答えではありませんが、2 つのことが一緒に変更され、問題が解決したようです。

  1. pvm_exit()スレーブ バイナリの最後に呼び出しを追加しましたが、これが最適なようです。

  2. クラスター上の PVM の構成が変更されました...どういうわけか...詳細はわかりませんが、以前は PVM 操作に参加できなかったいくつかのノードができるようになりました。他のものも同様に変更されている可能性があります。

私の問題を解決するために、1秒以内に何かが変更されたのではないかと思います。

于 2010-11-23T13:28:56.240 に答える