2013-09-18 3 views
3

Я делаю свою домашнюю работу ти следующего задания:MPI_Sendrecv_replace() проблема мертвой блокировки

Каждый процесс имеет двойной как вход. Использование функции MPI_Sendrecv_replace() своп все парные с процессами противоположного разряд (первый & последний, второй & последний, но один, ...). В каждом процессе выводится полученное число.

Так вот код, который я написал.

#include "mpi.h" 
#include <stdio.h> 
#include "pt4.h" 

int main(int argc, char *argv[]) 
{ 
    MPI_Init(&argc,&argv); 
    int flag; 
    MPI_Initialized(&flag); 
    if (flag == 0) 
     return; 
    int rank, size; 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

    double n; 
    pt >> n; // pt is a stream provided by side library (works perfectly fine) 

    int oppositeRank = (size - 1) - rank; 

    if (rank != oppositeRank) 
    { 
     MPI_Status status; 
     MPI_Sendrecv_replace(&n, 1, MPI_DOUBLE, oppositeRank, 0, 
          rank, 0, MPI_COMM_WORLD, &status); 
    } 

    pt << n; 
    MPI_Finalize(); 
    return 0; 
} 

Хотя этот код не содержит никаких проблем, он никогда не останавливается. Итак, почему? Что я делаю не так?

ответ

7

Заменить это:

 MPI_Sendrecv_replace(&n, 1, MPI_DOUBLE, oppositeRank, 0, 
         rank, 0, MPI_COMM_WORLD, &status); 

с этим:

 MPI_Sendrecv_replace(&n, 1, MPI_DOUBLE, oppositeRank, 0, 
         oppositeRank, 0, MPI_COMM_WORLD, &status); 

Вы можете найти this documentation page полезным.

Эта функция отправляет буфер процессору (dest или 4-й аргумент) и получает от другого (source, 6-й аргумент). Чтобы сделать обмен, вы отправляете на другой уровень и получаете от того же ранга. В вашем случае вы отправляете на противоположный ранг и получаете от себя, что никогда не придет, отсюда и тупик.

+0

Спасибо! Оно работает. Я пропустил понимание значения параметра источника. – DaZzz

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