Memory 关于使用Fortran进行MPI的问题:如何将数据广播到共享内存?

Memory 关于使用Fortran进行MPI的问题:如何将数据广播到共享内存?,memory,fortran,mpi,Memory,Fortran,Mpi,我正在编写一个Fortran代码,在光线跟踪上使用MPI 问题是代码有一个大数组,所有处理器都需要这个数组 但该阵列在每个时间步对所有处理器都是只读的, 然后在下一时间步开始时更新 当前代码使用一个处理器从外部文件读取此数组, 然后简单地将其广播到所有处理器。这样,每个处理器都有一个该阵列的副本 为了节省一些内存,我计划使用OpenMP,但这个问题表明MPI3.0可以做到这一点 但在上述问题的答案中,不幸的是,没有关于如何将数组广播到节点的示例。 我想知道是否有人能提供一个例子 提前谢谢 编辑:

我正在编写一个Fortran代码,在光线跟踪上使用MPI

问题是代码有一个大数组,所有处理器都需要这个数组

但该阵列在每个时间步对所有处理器都是只读的, 然后在下一时间步开始时更新

当前代码使用一个处理器从外部文件读取此数组, 然后简单地将其广播到所有处理器。这样,每个处理器都有一个该阵列的副本

为了节省一些内存,我计划使用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)

欢迎光临,请拿着这本书阅读。我们可能需要您提供更多的实际代码。我们需要知道哪些数据在哪里,哪些流程需要直接访问哪些数据的哪些部分以及哪些数据的私有部分。目前不需要在不足的伪代码中共享。为什么不在每个节点上运行一个MPI任务,让OpenMP使用所有可用资源?@GillesGouaillardet这通常是最好的方法,但在已经使用MPI并且只想共享一些只读(ish)的代码中对象使用MPI的共享内存设施可能会比较容易,而代码的其余部分则或多或少保持不变—您没有$omp以这种方式并行处理大量循环。我一直想写一个答案,但现在没有时间。最简单的方法是使用mpi_comm_split_类型创建一个n节点通信器,使用mpi_comm_split_类型创建一个仅包含由mpi_comm_split_类型创建的通信器中秩为零的进程的通信器,以及跨最后一个通信器的mpi_bcast-小心地同步非参与进程。代码本身完全在mpi中。在更新后的伪代码中,辐射和光线跟踪子例程都涉及MPI,因此切换到OpenMP的工作量太大@这可能是一个愚蠢的问题,但是如何使用mpi_comm_split来创建您提到的通信器呢?谢谢