2016-04-03 2 views
5

プロセス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実行可能ファイルを使用して実行すると、すべて正常に動作します。

+1

コードはうまく見えますが、実際にはOpenMPIインストールで正常に動作します。インストールに関する詳細情報を提供してください。そのインストールで十分に複雑なMPIコードを実行できましたか?これが発生する場所についても情報を提供してください。出力と、ハングするプロセスをデバッグしようとする試みが助けになります。 – Zulan

+0

私は@ Zulanに同意しますが、私はRuvuに 'status'を確認するよう頼んでいます。 – gsamaras

+0

また、** mallocの結果**の値をチェックしてください! – Zulan

答えて

3

問題は、IntelのMPIとOpenMPIの両方がインストールされていました。 私は/ usr/include/mpiを見ました。時間は、OpenMPIのが所有しているが、mpiccのとmpirunのは、Intelの実装からあった:私は使用を保証するために

/usr/bin/mpicc 

/usr/bin/mpirun 

を実行することによって、問題を解決することができた

$ which mpicc 
/opt/intel/composerxe/linux/mpi/intel64/bin/mpicc 
$ which mpirun 
/opt/intel/composerxe/linux/mpi/intel64/bin/mpirun 

OpenMPI。

私のインストールを確認するための@Zulanと@gsamarasに感謝します。

+0

Ruvu!あなたもこれを解決するのに苦労しました+2。 – gsamaras

+0

[環境モジュール](https://en.wikipedia.org/wiki/Environment_Modules_(ソフトウェア))をチェックすることを強くお勧めします。これにより、複数のバージョンと同じソフトウェアをインストールすることができます。後で、PATHを正しく設定したかどうかを心配することなく、使用したいバージョンを決定することができます。 –

1

コードは問題ありません。私は、バージョン3.1.3(mpiexec --version)でチェック:

linux16:/home/users/grad1459>mpicc -std=c99 -O1 -o px px.c -lm 
linux16:/home/users/grad1459>mpiexec -n 2 ./px 
malloc results 0x92572e8 0x9267330 
sending 
sent 
malloc results 0x9dc92e8 0x9dd9330 
recv 
recved, count:8200 source:0 tag:0 error:1839744 

その結果、問題は、インストールが付属しています。次のトラブルシューティングオプションを実行します。

  1. のmallocの結果を確認してください*
  2. チェックstatus

私はmalloc()の戻り値はあなた以来、NULLであることを賭けるだろうそれ以上のメモリを要求すると失敗すると言います。システムがそのメモリを提供することを拒否している可能性があります。


は、私はこの問題は、インストールに付属して、一部が正しかったが、OPのように言った:

問題は、私はOpenMPIのがインストールされていることだったようだが、インテルからのMPIの実装をインストール私はMKLをインストールしました。私のコードはOpenMPIヘッダーとライブラリでコンパイルされていましたが、Intelのmpirunで実行されていました。 OpenMPIからmpirun実行可能ファイルを使用して実行すると、すべて正常に動作します。

* checking that `malloc` succeeded in C

関連する問題