2017-09-07 4 views
2

Ich habe den oben genannten Fehler beim Ausführen des folgenden Programms in C erhalten. Das Programm verwendet 3-d-Hyperwürfel-Topologie, um die Summe aller Elemente eines Array mit 8 Elementen zu finden. Es nutzt MPI-Bibliothek .:MPI_ERR_RANK: ungültiger Rang

#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; 
} 

Gebraucht 8 Prozesse durch den Aufruf

mpirun -n 8 ./a.out 

Runtime Fehlermeldung:

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

Es gibt einen Fehler in der "Baumlogik" Ihrer 'Recv's. Etwas versucht, zu einem negativen Rang oder einem Rang größer als 7 zu senden. Ich würde schreiben, welche Logik jeden Rang abzweigt. – OregonTrail

+0

Wie viele Aufgaben verwenden Sie für Ihren Test? –

+0

@GillesGouaillardet 8 Aufgaben. Auch aktualisierte Details für das gleiche in der Frage. –

Antwort

2

Es sieht aus wie ein Fehler in der Art und Weise Sie verwenden bitweise und.

Zum Beispiel sollte es

if (rank & 2) 

statt

if (rank&2 == 1) 

rank&2 sein ist eine bitweise und, was bedeutet, sein Wert ist entweder 0 oder 2 (und es ist 1 nie)

+0

Danke dafür. Und ich denke, ich sollte der Logik wirklich mehr Aufmerksamkeit schenken, bevor ich zweifle. Das wird ein dummer Fehler. –