Использование MPI_GATHERV, где у «корня» нет буфера отправки - PullRequest
1 голос
/ 27 октября 2019

Я хочу использовать функцию 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)

1 Ответ

1 голос
/ 27 октября 2019

(Превращая мой комментарий в ответ)

Да, законно присвоить нулевой размер и передать его. Именно это я и делаю

...