質問が2つあります。最初の1つは:MPIを使用するクライアント/サーバーアプリケーション
私はmsmpiを使用するつもりです。私はソケットを使用してはならない "mpi"を意味します。私のアプリケーションはスケーラブルな分散データ構造です。最初に、サーバーには可変サイズのファイルが含まれています(サイズは挿入によって増加し、削除によって減少する可能性があります)。ファイルのサイズが一定の制限を超えると、ファイルは分割され、最初のサーバーに残ります後半は新しいサーバーに移動します。クライアントは、ファイルの分割操作のイメージを持つように、検索するデータのアドレスによって常にクライアントに通知する必要があります。最後に、私はそれをより明確にすることを望む。
2つ目は、次のとおりです。私は単純なクライアント/サーバーアプリケーションをコンパイルしようとした
MS-MPIやMPICH2で(コードソースは怒鳴るです)、それは動作しませんし、「致命的な私にエラーメッセージを表示しますmpi_open_port()や他のスタックエラー "でubunto 11.10にopen mpiをインストールし、サーバー側で動作していた同じ例を実行しようとしましたが、ポート名がわかりましたが、クライアント側でエラーが出ましたメッセージ:
[user-Compaq-610:03833] [[39604,1],0] ORTE_ERROR_LOG: Not found in file ../../../../../../ompi/mca/dpm/orte/dpm_orte.c at line 155
[user-Compaq-610:3833] *** An error occurred in MPI_Comm_connect
[user-Compaq-610:3833] *** on communicator MPI_COMM_WORLD
[user-Compaq-610:3833] *** MPI_ERR_INTERN: internal error
[user-Compaq-610:3833] *** MPI_ERRORS_ARE_FATAL (your MPI job will now abort)
--------------------------------------------------------------------------
mpirun has exited due to process rank 0 with PID 3833 on
node toufik-Compaq-610 exiting without calling "finalize". This may
have caused other processes in the application to be
terminated by signals sent by mpirun (as reported here).
ので、私は素晴らしいことだ、私は問題が何であるか困惑している、と私はそれを修正しようとしているときを過ごし、 体があればそれで私を助けてくれるでしょうし、事前にuに感謝します。
ソースコードはここにある:
/* the server side */
#include <stdio.h>
#include <mpi.h>
main(int argc, char **argv)
{
int my_id;
char port_name[MPI_MAX_PORT_NAME];
MPI_Comm newcomm;
int passed_num;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_id);
passed_num = 111;
if (my_id == 0)
{
MPI_Open_port(MPI_INFO_NULL, port_name);
printf("%s\n\n", port_name); fflush(stdout);
} /* endif */
MPI_Comm_accept(port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &newcomm);
if (my_id == 0)
{
MPI_Send(&passed_num, 1, MPI_INT, 0, 0, newcomm);
printf("after sending passed_num %d\n", passed_num); fflush(stdout);
MPI_Close_port(port_name);
} /* endif */
MPI_Finalize();
exit(0);
} /* end main() */
と、クライアント側で:
#include <stdio.h>
#include <mpi.h>
int main(int argc, char **argv)
{
int passed_num;
int my_id;
MPI_Comm newcomm;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_id);
MPI_Comm_connect(argv[1], MPI_INFO_NULL, 0, MPI_COMM_WORLD, &newcomm);
if (my_id == 0)
{
MPI_Status status;
MPI_Recv(&passed_num, 1, MPI_INT, 0, 0, newcomm, &status);
printf("after receiving passed_num %d\n", passed_num); fflush(stdout);
} /* endif */
MPI_Finalize();
return 0;
//exit(0);
} /* end main() */
なぜ戻り値をチェックしていませんか? –
私はbegginer以来、私はよくUをundersatndしていない、あなたにもっと、そして感謝を説明してください。 –
@ iMade575:すべてのC MPI関数呼び出しは、ステータスコードを整数として返します。エラーが発生したかどうかを確認するには、コードごとにチェックする必要があります。 'MPI_Error_string'はエラーコードを人間が読める文字列に変換して出力します。 – talonmies