поймать тупик в простой нечетно-четной отправке

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

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, а не следующему!


person user562264    schedule 04.01.2011    source источник
comment
Предоставляя код, убедитесь, что он отформатирован соответствующим образом. Сделайте отступ в строках кода на четыре пробела. Вы также получаете информацию о форматировании в правой части страницы «задать вопрос».   -  person canavanin    schedule 04.01.2011


Ответы (2)


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

person janneb    schedule 04.01.2011
comment
Извините, это часть большой программы, и я просто вставляю некоторые части, я уже выделил T этой строкой после первого условия if: ALLOCATE(T(LIM+2,JM+2)) - person user562264; 07.01.2011

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

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

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

person user585123    schedule 21.01.2011