поймать тупик в простой нечетной отправке - PullRequest
1 голос
/ 04 января 2011

Я пытаюсь решить простую проблему с MPI, моя реализация - MPICH2, а мой код на Fortran.Я использовал блокировку отправки и получения, идея настолько проста, но когда я запускаю ее, она падает !!!Я понятия не имею, что не так?Кто-нибудь может сделать цитату по этому вопросу, пожалуйста?есть фрагмент кода:

integer, parameter :: IM=100, JM=100
REAL, ALLOCATABLE  :: T(:,:), TF(:,:)

CALL MPI_COMM_RANK(MPI_COMM_WORLD,RNK,IERR)
CALL MPI_COMM_SIZE(MPI_COMM_WORLD,SIZ,IERR)

prv = rnk-1
nxt = rnk+1
LIM = INT(IM/SIZ)

IF (rnk==0) THEN
    ALLOCATE(TF(IM,JM))
    prv = MPI_PROC_NULL
ELSEIF(rnk==siz-1) THEN
    NXT = MPI_PROC_NULL
    LIM = LIM+MOD(IM,SIZ)
END IF

IF (MOD(RNK,2)==0) THEN
    CALL MPI_SEND(T(2,:),JM+2,MPI_REAL,PRV,10,MPI_COMM_WORLD,IERR)
    CALL MPI_RECV(T(1,:),JM+2,MPI_REAL,PRV,20,MPI_COMM_WORLD,STAT,IERR)
ELSE
    CALL MPI_RECV(T(LIM+2,:),JM+2,MPI_REAL,NXT,10,MPI_COMM_WORLD,STAT,IERR)
    CALL MPI_SEND(T(LIM+1,:),JM+2,MPI_REAL,NXT,20,MPI_COMM_WORLD,IERR)
END IF

, как я понял, четные процессы не получают ничего, в то время как нечетные завершают отправку успешно, в некоторых случаях, когда я добавлял некоторую печать, чтобы наблюдать за происходящим, я виделчто переменная NXT меняется во время процедуры отправки !!!например, весь нечетный процесс отправлял сообщение процессу 0, а не следующему!

Ответы [ 2 ]

1 голос
/ 04 января 2011

Массив T не выделен, поэтому чтение или запись из него является ошибкой.

0 голосов
/ 22 января 2011

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

1) убедитесь, что rnk, size и prv являются целыми числами.Скорее всего, prv является действительным (по умолчанию правила набора текста), и вы отправляете действительное число целому числу, поэтому теги не совпадают, поэтому тупик.

2) Я бы использовал sendrcv вместо send / recv;раздел кодов recv / send.Два sendrecv более чистые (2 строки кода против 7), гарантированно не блокируются и работают быстрее, если у вас двунаправленные ссылки (почти всегда верно).

...