Асинхронная отправка и получение MPI не работает должным образом

У меня вопрос относительно связи с использованием библиотеки MPI на C. Вот мой пример кода:

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

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

    // Initialize the MPI Environment
    MPI_Init (&argc, &argv);

    int world_size;
    MPI_Comm_size (MPI_COMM_WORLD, &world_size);

    int world_rank;
    MPI_Comm_rank (MPI_COMM_WORLD, &world_rank);

    int workers = world_size - 1;

    if (world_rank == 0) {
    }
    else if (world_rank == 1) {
        int to_recv;
        int to_send = world_rank;
        MPI_Request request1, request2;
        MPI_Irecv (&to_recv, sizeof (int), MPI_INT, world_rank + 1, 0, MPI_COMM_WORLD, &request1);
        MPI_Isend (&to_send, sizeof (int), MPI_INT, world_rank + 1, 0, MPI_COMM_WORLD, &request2);

        MPI_Wait (&request1, MPI_STATUS_IGNORE);
        MPI_Wait (&request2, MPI_STATUS_IGNORE);

        printf("I am %d\n", world_rank);
        printf("I received rank %d\n", to_recv);
    }
    else if (world_rank == workers) {
        int to_recv;
        int to_send = world_rank;
        MPI_Request request1, request2;
        MPI_Irecv (&to_recv, sizeof (int), MPI_INT, world_rank - 1, 0, MPI_COMM_WORLD, &request1);
        MPI_Isend (&to_send, sizeof (int), MPI_INT, world_rank - 1, 0, MPI_COMM_WORLD, &request2);

        MPI_Wait (&request1, MPI_STATUS_IGNORE);
        MPI_Wait (&request2, MPI_STATUS_IGNORE);

        printf("I am %d\n", world_rank);
        printf("I received rank %d\n", to_recv);
    }
    else {
        int to_recvl, to_recvr;
        int to_send1 = world_rank, to_send2 = world_rank;

        MPI_Request request1, request2, request3, request4;

        MPI_Irecv (&to_recvl, sizeof (int), MPI_INT, world_rank - 1, 0, MPI_COMM_WORLD, &request1);
        MPI_Isend (&to_send1, sizeof (int), MPI_INT, world_rank - 1, 0, MPI_COMM_WORLD, &request2);

        MPI_Irecv (&to_recvr, sizeof (int), MPI_INT, world_rank + 1, 0, MPI_COMM_WORLD, &request3);
        MPI_Isend (&to_send2, sizeof (int), MPI_INT, world_rank + 1, 0, MPI_COMM_WORLD, &request4);

        MPI_Wait (&request1, MPI_STATUS_IGNORE);
        MPI_Wait (&request2, MPI_STATUS_IGNORE);

        MPI_Wait (&request3, MPI_STATUS_IGNORE);
        MPI_Wait (&request4, MPI_STATUS_IGNORE);

        printf("I am %d\n", world_rank);
        printf("I received ranks %d and %d\n", to_recvl, to_recvr);
    }

    MPI_Finalize ();

    return 0;
}

Вот чего я в основном хочу добиться:

Скажем, у меня есть 11 порожденных процессов (0 - главный, а процесс - 1-10 рабочих). Потом,

  • процесс 1 отправляет свой ранг процессу 2
  • процесс 1 получает ранг от процесса 2
  • процесс 10 отправляет свой ранг процессу 9
  • процесс 10 получает ранг от процесса 9
  • процесс i отправляет свой ранг процессам i + 1 и i-1 (1 ‹i‹ 10)
  • процесс i получает ранг от процесса i + 1 и i-1 (1 ‹i‹ 10)

При запуске программы в некоторых случаях я получаю мусорные значения, например, добавленный ниже:

I am 2
I received ranks 1 and 3
I am 3
I received ranks 2 and 4
I am 4
I received ranks 1499161032 and 5
I am 6
I received ranks 1488867784 and 7
I am 9
I received rank 8
I am 32767
I received rank 2
I am 5
I received ranks 1507000776 and 6
I am 7
I received ranks 6 and 8
I am 8
I received ranks 7 and 9

Я не знаю, в чем проблема. Любая помощь будет принята с благодарностью.

Спасибо!


person ashokadhikari    schedule 20.10.2015    source источник


Ответы (1)


Довольно простая проблема: второй параметр в ваших MPI_Isend() и MPI_Irecv() должен быть count элементами, которые вы хотите отправить или получить. Вы используете sizeof(int), который в большинстве систем равен 4, в то время как вы хотите отправить / получить только 1 элемент, поэтому счетчик должен быть 1.

person Pooja Nilangekar    schedule 20.10.2015