Я хочу использовать функцию MPI MPI_GATHERV
, где каждый ранг MPI имеет определенный буфер с различными размерами, который необходимо собрать в процессе Root. Мой корневой процесс будет собирать только буферы, но, как обычно, сам не имеет буфера отправки.
Например
RANK1
buf_sz =3
buf(1) = 1
buf(2) = 2
buf(3) = 3
Ранг 2
buf_sz =3
buf(1) = 4
buf(2) = 5
buf(3) = 6
После MPI_GATHERV мой Root должен иметь
buf(1) = 1
buf(2) = 2
buf(3) = 3
buf(4) = 4
buf(5) = 5
buf(6) = 6
На данный момент это будет означать, что в Root мне придется применить sendbuf, который имеет нулевые элементы и нулевой счет. Я не уверен, насколько четко и безопасно это обычно?
Пример кода
if(myrankid == root)then
allocate(displ(3))
allocate(counts(3))
displ(1) = 0
displ(2) = 0
displ(3) = 3
counts(1) = 0
counts(2) = 3
counts(3) = 3
allocate(buf_send(0))
sendcount = 0
allocate(recvbuf(6))
else
allocate(displ(1))
allocate(counts(1))
allocate(buf_send(3))
allocate(recvbuf(1))
sendcount = 3
endif
MPI_Gatherv(buf_send, sendcount, mpi_integer,&
recvbuf, counts, displs,&
mpi_integer, root, mpi_comm_world)