2017-09-07 29 views
2

Cで次のプログラムを実行すると、上記のエラーが発生しました。このプログラムでは、3次元ハイパーキューブトポロジを使用して8要素配列のすべての要素の合計を検索します。これは、MPIライブラリを使用しています。:MPI_ERR_RANK:無効なランク

mpirun -n 8 ./a.out 

ランタイムエラーメッセージを呼び出すことによって8つのプロセスを使用し

#include<stdio.h> 
#include<mpi.h> 

int main(int argc, char **argv) 
{ 
    int rank, n, src, dest; 
    MPI_Init(&argc, &argv); 
    MPI_Status status; 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    MPI_Comm_size(MPI_COMM_WORLD, &n); 
    int tag = 100; 
    int receive; 
    int array[8] = {10, 20, 30, 40, 50, 60, 70, 80}; 

    if (rank&1 == 1) 
     MPI_Send(&array[rank], 1, MPI_INT, rank-1, tag, MPI_COMM_WORLD); 
    else 
    { 
     MPI_Recv(&receive, 1, MPI_INT, rank+1, tag, MPI_COMM_WORLD, &status); 
     array[rank] += receive; 
     if (rank&2 == 1) 
      MPI_Send(&array[rank], 1, MPI_INT, rank-2, tag, MPI_COMM_WORLD); 
     else 
     { 
      MPI_Recv(&receive, 1, MPI_INT, rank+2, tag, MPI_COMM_WORLD, &status); 
      array[rank] += receive; 
      if (rank&4 == 1) 
       MPI_Send(&array[rank], 1, MPI_INT, rank-4, tag, MPI_COMM_WORLD); 
      else 
      { 
       MPI_Recv(&receive, 1, MPI_INT, rank+4, tag, MPI_COMM_WORLD, &status); 
       array[rank] += receive; 
       printf("\n%d \n", array[0]); 
      } 
     } 
    } 
    MPI_Finalize(); 
    return 0; 
} 

:それはあなたが使用方法に誤りのように見えます

An error occurred in MPI_Recv 
reported by process [3153068033,6] 
on communicator MPI_COMM_WORLD 
MPI_ERR_RANK: invalid rank 
MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort, 
and potentially your MPI job) 
+1

あなたの 'Recv'の"ツリーロジック "にエラーがあります。何かが負のランクまたは7より大きいランクに送られようとしています。 – OregonTrail

+0

テストにはいくつのタスクを使用しますか? –

+0

@GillesGouaillardet 8タスク。また、質問の同じものの詳細を更新しました。 –

答えて

2

をビットと。

例えば、それは代わり

if (rank&2 == 1) 

rank&2

if (rank & 2) 

なければならないが、その値は0又は2のいずれかである(それは1ことはない)を意味し、ビット単位で、

+0

ありがとうございます。疑問を呈する前に論理にもっと注意を払うべきだと思う。これは愚かな間違いです。 –