0

For some reason MPI_Waitall is waiting forever when I enter 10000 as the length for the sequence. Basically I create 4 lists of length n/4 where in this case n is 10000 and I an using non-blocking send so my process 0 does not wait for each list to be sent separately as they do not share any values so they are not overwritten. Keep in mind that the program works with smaller numbers like 1000 or 100 but I am not sure why it does not work with 10000+.

Here is my code:

#include "ore_header.h"

int main(int argc, char** argv) {

    srand(time(NULL));

    int     my_rank, p;
    void    generate_sequence(int *arr, int n);
    int     subsequence_check(int *arr,int n, int m);


    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &p);
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
    int     total;
    int     length;
    int     flag;
    int     seq_length;
    MPI_Status      stats[p];
    MPI_Request     reqs[p];
    int     p_length=0;
    int     *buf[p];
    if (my_rank == 0) {
        printf("Enter length and sequence length\n");
        scanf("%d %d",&length, &seq_length);
        p_length = length / p;
        for (int i = 0; i < p; i++) {
            buf[i] = (int*)malloc(p_length*sizeof(int));
            generate_sequence(buf[i], p_length);
            MPI_Isend(buf[i], p_length, MPI_INT, i, 0, MPI_COMM_WORLD, &reqs[i]);
            printf("Data sent to process %d\n", i);
        }
        MPI_Waitall(p, reqs, stats); //Program wont go past this line 
        printf("\n\n Data sent to all processes \n\n");
    }

    MPI_Bcast(&p_length, 1, MPI_INT, 0, MPI_COMM_WORLD);
    MPI_Bcast(&seq_length, 1, MPI_INT, 0, MPI_COMM_WORLD);

    buf[my_rank] = (int*)malloc(p_length*sizeof(int));

    MPI_Recv(buf[my_rank], p_length, MPI_INT, 0, 0, MPI_COMM_WORLD, &stats[my_rank]);
    printf("\nData received on process: %d   Length: %d\n",my_rank,p_length);
    //for (int i = 0; i < p_length; i++) {
    //  printf("%d",buf[my_rank][i]);
    //}
    //printf("\n");

    total = subsequence_check(buf[my_rank],p_length,seq_length);
    printf("\nI am process: %d\nTotal: %d\n",my_rank,total);
    MPI_Finalize();

    return (0);
}
Malush
  • 33
  • 5
  • Possible duplicate of [MPI hangs on MPI\_Send for large messages](http://stackoverflow.com/questions/15833947/mpi-hangs-on-mpi-send-for-large-messages) – Zulan Jan 27 '17 at 09:25
  • 2
    1) The deadlock is due to `MPI_Waitall` being called on rank 0 **before** rank 0 issues the corresponding receive. 2) `srand(time())` in an MPI program is a [bad idea](https://stackoverflow.com/questions/20141239/random-number-to-each-process-in-mpi) 3) Learn about `MPI_Scatter`. 4) Generate the data in a distributed way in the first place, then your program will scale better. – Zulan Jan 27 '17 at 09:28

0 Answers0