MPI_Barrier () блокируется в начале - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь синхронизировать свои процессы в начале выполнения через MPI_Barrier, но моя программа блокируется на нем. Тем не менее, я вижу, что все процессы достигают этой линии, печатая на экране в предыдущей инструкции.

    int num_processes, packet_size, partner_rank; 
    double start_comm_time, end_comm_time, comm_time;
    comm_time = 0;
    if(argc==3) { 
        if (sscanf (argv[1], "%i", &num_processes) != 1) {
            fprintf(stderr, "error - parameter 1 not an integer");
        } else;
        if (sscanf (argv[2], "%i", &packet_size) != 1) {
            fprintf(stderr, "error - parameter 2 not an integer");
        } else;
     }
    else {
            printf("\n Usage: broadcast $count $packet_size");
            return 0; 
    }

    char buf_send[packet_size], buf_recv[packet_size];
    buf_send[0] = 0;

    // Initialize
    MPI_Init(NULL, NULL);

    int world_rank;

    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
    int world_size;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);

    printf("\n Comm size %d \n", world_size);
    printf("\n Process %d before barrier \n", world_rank);
    // Time MPI_Bcast
    MPI_Barrier(MPI_COMM_WORLD);
    printf("\n Process %d after barrier \n", world_rank);
    start_comm_time = MPI_Wtime();
    MPI_Bcast(buf_send, packet_size, MPI_CHAR, 0, MPI_COMM_WORLD);
    printf("\n Process %d before second barrier \n", world_rank);
    MPI_Barrier(MPI_COMM_WORLD);
    end_comm_time = MPI_Wtime();

Вот что я получаю в распечатке:

 Comm size 6 

 Process 0 before barrier 

 Comm size 6 

 Process 2 before barrier 

 Comm size 6 

 Process 3 before barrier 
 Comm size 6 

 Process 1 before barrier 

 Comm size 6 

 Process 4 before barrier 

 Comm size 6 

 Process 5 before barrier

1 Ответ

0 голосов
/ 28 января 2020

Я удалил временные и MPI_Bcast части вашей программы (потому что она неполная), и она хорошо работает на моей машине, без блокировки. Так что может быть что-то не так с другими частями вашего кода.

По всей вашей программе, я не думаю, что у вашего кода есть какие-то проблемы. Проблема, вероятно, в вашей среде MPI. Я также запускаю его на своей машине, используя mpirun -n 6 ./xxx 6 1, и вот что я получаю:

 Comm size 6 

 Process 0 before barrier 

 Comm size 6 

 Process 5 before barrier 

 Comm size 6 

 Process 2 before barrier 

 Comm size 6 

 Comm size 6 

 Process 1 before barrier 

 Process 3 before barrier 

 Comm size 6 

 Process 4 before barrier 

 Process 0 after barrier 

 Process 0 before second barrier 

 Process 1 after barrier 

 Process 1 before second barrier 

 Process 4 after barrier 

 Process 4 before second barrier 

 Process 5 after barrier 

 Process 5 before second barrier 

 Process 2 after barrier 

 Process 2 before second barrier 

 Process 3 after barrier 

 Process 3 before second barrier 
...