Я работаю над кодом Фортрана с 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)