プロセス0からプロセス1にデータを送信しようとしています。このプログラムは、バッファサイズが64kb未満の場合に成功しますが、バッファがはるかに大きくなるとハングします。 次のコードは、この問題を再現する必要があります(ハングします)が、n
未満8000バッファサイズが64KBを超えるMPIセンドとレックハングアップ
int main(int argc, char *argv[]){
int world_size, world_rank,
count;
MPI_Status status;
MPI_Init(NULL, NULL);
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
if(world_size < 2){
printf("Please add another process\n");
exit(1);
}
int n = 8200;
double *d = malloc(sizeof(double)*n);
double *c = malloc(sizeof(double)*n);
printf("malloc results %p %p\n", d, c);
if(world_rank == 0){
printf("sending\n");
MPI_Send(c, n, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD);
printf("sent\n");
}
if(world_rank == 1){
printf("recv\n");
MPI_Recv(d, n, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status);
MPI_Get_count(&status, MPI_DOUBLE, &count);
printf("recved, count:%d source:%d tag:%d error:%d\n", count, status.MPI_SOURCE, status.MPI_TAG, status.MPI_ERROR);
}
MPI_Finalize();
}
Output n = 8200;
malloc results 0x1cb05f0 0x1cc0640
recv
malloc results 0x117d5f0 0x118d640
sending
Output n = 8000;
malloc results 0x183c5f0 0x184c000
recv
malloc results 0x1ea75f0 0x1eb7000
sending
sent
recved, count:8000 source:0 tag:0 error:0
になるように変更された場合、私はこのquestionと類似しており、このquestionを見つけ成功するはずですが、私はそこに問題を信じますデッドロックを作成することです。各プロセスで1回の送信または受信しか実行されていないため、同様の問題は発生しません。
EDIT:ステータスチェックを追加しました。
EDIT2:OpenMPIがインストールされていて、MKLをインストールしたときにインテルのMPIのインプリメンテーションもインストールされていたようです。私のコードはOpenMPIヘッダーとライブラリでコンパイルされていましたが、Intelのmpirunで実行されていました。 OpenMPIからmpirun実行可能ファイルを使用して実行すると、すべて正常に動作します。
コードはうまく見えますが、実際にはOpenMPIインストールで正常に動作します。インストールに関する詳細情報を提供してください。そのインストールで十分に複雑なMPIコードを実行できましたか?これが発生する場所についても情報を提供してください。出力と、ハングするプロセスをデバッグしようとする試みが助けになります。 – Zulan
私は@ Zulanに同意しますが、私はRuvuに 'status'を確認するよう頼んでいます。 – gsamaras
また、** mallocの結果**の値をチェックしてください! – Zulan