Kevino Sun
Kevino Sun

Reputation: 62

Very strange MPI behavior

I wrote a program on MPI where it would go around each processor in a sort of ring fashion x amount of times (for example if I wanted it to go twice around the "ring" of four processors it would go to 0, 1, 2, 3, 0 ,1....3).

Everything compiled fine but when I ran the program on my Ubuntu VM it would never output anything. It wouldn't even run the first output. Can anyone explain what's going on?

This is my code:

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

int main(int argc, char **argv){
    int rank, size, tag, next, from, num;
    tag = 201;
    MPI_Status status;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    next = (rank + 1)/ size;
    from = (rank - 1)/size;
    if (rank == 0){
            printf("How many times around the ring? :: ");
        scanf ("%d", &num);
        MPI_Send(&num, 1, MPI_INT, 1, tag, MPI_COMM_WORLD);
    }
    do{
        MPI_Recv(&num, 1, MPI_INT, from, tag, MPI_COMM_WORLD, &status);
        printf("Process %d received %d from process %d\n", rank, num, status.MPI_SOURCE);
        if (rank == 0){
            num--;
            printf("Process 0 has decremented the number\n");
        }
        printf("Process %d sending %d to process %d\n", rank, num ,next);
        MPI_Send(&num, 1, MPI_INT, next, tag, MPI_COMM_WORLD);
    }while (num > 0);
    printf("Process %d has exited", rank);
    if (rank == 0){
        MPI_Recv(&num, 1, MPI_INT, size - 1, tag, MPI_COMM_WORLD, &status);
        printf("Process 0 has received the last round, exiting");
    }
    MPI_Finalize();
    return 0;
}

Upvotes: 1

Views: 355

Answers (2)

Lorendeau Benjamin
Lorendeau Benjamin

Reputation: 11

Whether your code is good or not, your first printf should be output.

If you have no messages printed at all, even the printf in the "if(rank==)" block, then it could be a problem with your VM. Are you sure you have any network interface activated on that VM ?

If the answer is yes, it might be useful to check its compatibility with MPI by checking the OpenMPI FAQ over tcp questions. Sections 7 (How do I tell Open MPI which TCP networks to use?) and 13 (Does Open MPI support virtual IP interfaces?) seems both interesting for any possible problems with running MPI in a Virtual Machine.

Upvotes: 0

Jonathan Dursi
Jonathan Dursi

Reputation: 50947

There's a problem with your neighbour assignment. If we insert the following line after the next/from calculation

printf("Rank %d: from = %d, next = %d\n", rank, from, next);

we get:

$ mpirun -np 4 ./ring
Rank 0: from = 0, next = 0
Rank 1: from = 0, next = 0
Rank 2: from = 0, next = 0
Rank 3: from = 0, next = 1

You want something more like

next = (rank + 1) % size;
from = (rank - 1 + size) % size;

which gives

$ mpirun -np 4 ./ring
Rank 0: from = 3, next = 1
Rank 1: from = 0, next = 2
Rank 2: from = 1, next = 3
Rank 3: from = 2, next = 0

and after that your code seems to work.

Upvotes: 3

Related Questions