MPI_ERR_RANK: Ungültiger Rang

Bekam ich den oben genannten Fehler mit dem folgenden Programm in C. Das Programm verwendet 3-d-hypercube-Topologie zu finden, die Summe aller Elemente einer 8-element-array. Es nutzt MPI-Bibliothek.:

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

8 Prozesse durch den Aufruf

mpirun -n 8 ./a.out

Runtime error message:

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)
  • Es ist ein Fehler in der „tree logic“ von Ihrem Recvs. Etwas versucht zu senden, um einen negativen Wert oder einen Rang größer als 7. Ich würde schreiben, die Logik Zweige jeder Rang hat.
  • Wie viele Aufgaben nutzen Sie für Ihren test ?
  • 8 Aufgaben. Auch aktualisierte details, die für die gleichen in Frage.
InformationsquelleAutor Gaurav Singh | 2017-09-07



One Reply
  1. 1

    Sieht es aus wie ein Fehler in der Verwendung der bitweisen und.

    Sollte es beispielsweise sein,

    if (rank & 2)

    statt

    if (rank&2 == 1)

    rank&2 ist eine bitweise und-Verknüpfung, das heißt sein Wert ist entweder 0 oder 2 (und es ist nie 1)

    • Vielen Dank für diese. Und ich denke, ich sollte wirklich mehr Aufmerksamkeit schenken, um die Logik vor Fragen, Zweifel. Dies wird einen dummen Fehler.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.