出于某种原因,当我用大数字测试我的程序时,MPI_Waitall会陷入困境(我相信会陷入僵局)

时间:2017-01-26 23:13:35

标签: c mpi

由于某些原因,当我输入10000作为序列的长度时,MPI_Waitall会永远等待。基本上我创建4个长度为n / 4的列表,在这种情况下,n为10000,我使用非阻塞发送,所以我的进程0不等待每个列表单独发送,因为它们不共享任何值,所以它们不是覆盖。 请记住,该程序使用较小的数字,如1000或100,但我不知道为什么它不适用于10000 +。

这是我的代码:

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

0 个答案:

没有答案