大学の課題で PVM を使用してアルゴリズムを並列化しようとしています。アルゴリズムをソートしましたが、並列化はほとんど機能しません -明確な理由もなくプロセスが断続的に停止します。パターンは見当たりません。同じパラメータで実行すると 10 回は機能し、次の作業でスタックする可能性があります...
pvm
(マスターまたは子プロセスの) どの関数もエラー コードを返さず、子は正常に完了したように見え、エラーはコンソールに到達していません。マスターが子供たちからのすべての通信を受信していないように見えますが、たまに実行されるだけです。
奇妙なことに、メッセージをスキップしているだけではないと思います-子から結果が欠落し、完全なシグナルを正常に送信したことはまだありません(つまり、実行が完了に達しておらず、予期しない結果を返します) - まるで子プロセスが切断され、特定のポイントからのすべてのメッセージが届かなくなったかのようです。
結果をバッチ処理して送信するメッセージは少なくなりますが、より大きくなると、信頼性が向上するようです.
pvm_send
PVM が送信されたメッセージとその友人を失うことは正常ですか、一般的ですか、それとも予想されますか? すべてのプロセスが単一のホストまたは複数のホストで実行されると、エラーが発生することに注意してください。
私は何か間違ったことをしていますか?これを防ぐために私にできることはありますか?
アップデート
以下の非常に単純なテスト ケースでエラーを再現しました。このコードでは、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 );
}