2015-10-20 3 views
1

У меня есть вопрос, касающийся связи с использованием библиотеки MPI в C. Вот мой пример кода:MPI Asynchoronous Отправлять и получать не работает, как ожидалось

#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 <10 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 

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

Спасибо!

ответ

5

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

+0

Ah..thanks !! Так что мне действительно нужен сон :) – ashokadhikari

Смежные вопросы