Вопрос по MPI с Фортраном: как транслировать данные в общую память? - PullRequest
0 голосов
/ 10 февраля 2020

Я работаю над кодом Фортрана с MPI для трассировки лучей.

Проблема в том, что код имеет большой массив, необходимый для всех процессоров.

Но этот массив только для чтения для всех процессоров на каждом временном шаге, затем он обновляется в начале следующего временного шага.

Текущий код использует один процессор для чтения этого массива из внешнего файла, а затем просто передает его в все процессоры. Таким образом, у каждого процессора есть копия этого массива.

Чтобы сэкономить память, я планировал использовать OpenMP, но этот вопрос Код MPR Fortran: как обмениваться данными на узле через openMP? показывает, что MPI3.0 может сделать свое дело.

Но в ответах на поставленный выше вопрос, к сожалению, нет примера того, как транслировать массив на узлы. Интересно, кто-нибудь может помочь привести пример?

Заранее спасибо!

РЕДАКТИРОВАТЬ: я включил некоторые дополнительные детали структуры кода, как это было предложено Владимиром.

Ниже псевдокод, отображающий текущую обработку в коде:

allocate(largearray,size)
do i=1,10
  !!! Update largearray
  if(myrank==0) then
     ~~~read from file~~~ largearray
     call MPI_BCAST(largearray,size,MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD,ierr)
     do while(.true.)
       call MPI_RECEIVE(results)
       call collector(results,final_product)
       exit
     end do
     call output(final_product,i)
  else
     call MPI_BCAST(largearray,size,MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD,ierr)
     call radiation(largearray,beams)
     call raytracing(beams,largearray,results)
     call MPI_SEND(results,0)
  end if
end do
deallocate(largearray)
...