195
comm1d, ierr )
call MPI_RECV( a(l, e+l), nx, MPI_DOUBLE_PRECISION, nbrtop, 1,
comm1d, status, ierr )
call MPI_SEND( a(l, s), nx, MPI_DOUBLE_PRECISION, nbrbottom,
1,comm1d, ierr)
endif
return
end
В этой программе четные процессы посылают первыми, а нечет-
ные процессы принимают первыми.
Комбинированные send и receive. Спаривание посылки и приема
эффективно, но может быть трудным в реализации при сложном
взаимодействии процессов (например, на нерегулярной сетке). Аль-
тернативой является использование процедуры
MPI_SENDRECV.
Эта процедура позволяет послать и принять данные, не заботясь о
том, что может иметь место дедлок из-за нехватки буферного про-
странства. В этом случае каждый процесс посылает данные процессу,
расположенному выше, и принимает данные от процесса, располо-
женного ниже, как это показано в следующей программе:
subroutine exchng1 ( a, nx, s, e, comm1d, nbrbottom, nbrtop )
use mpi
integer nx, s, e, comm1d, nbrbottom, nbrtop
double precision a(0:nx+l, s-l:e+l)
integer status (MPI_STATUS_SIZE), ierr
call MPI_SENDRECV( a(l,e), nx, MPI_DOUBLE_PRECISION, nbrtop, 0,
a(l,s-l), nx, MPI_DOUBLE_PRECISION, nbrbottom, 0, comm1d, status, ierr )
call MPI_SENDRECV( a(l,s), nx, MPI_DOUBLE_PRECISION, nbrbottom, I,
a(l,e+l), nx, MPI_DOUBLE_PRECISION, nbrtop, 1, comm1d, status, ierr )
return
end
Буферизованные Sends. MPI позволяет программисту зарезерви-
ровать буфер, в котором данные могут быть размещены до их достав-
ки по назначению. Это снимает с программиста ответственность за
безопасное упорядочивание операций посылки и приема. Изменение в
обменных процедурах будет простым – вызов
MPI_SEND замещает-
ся на вызов
MPI_BSEND:
subroutine exchng1 (a, nx, s, e, comm1d, nbrbottom, nbrtop )
use mpi
integer nx, s, e, integer coimn1d, nbrbottom, nbrtop