Fortran Coder

标题: MPI并行中MPI_INIT与finalize的意义 [打印本页]

作者: 石子    时间: 2024-5-25 22:38
标题: MPI并行中MPI_INIT与finalize的意义
本帖最后由 石子 于 2024-5-25 22:53 编辑

各位好,我的MPI fortran程序遇到一些问题,求助大家。
我要求解一个较大空间区域的物理问题,网格数为[Nx, Ny],共迭代Nt次数,共分配了num个核进行计算。目前的程序结构如下:

program main
{
此处为变量声明
}

需要串行的部分

do t=1,Nt
      call MPI_INIT...

      此处为并行算法

     call MPI_Finalize...
end do
end program

然而,实际效果是,在MPI_INIT之前,串行区域由num个核执行,我进行了测试,发现确实这样,
感觉这个逻辑和Open MP不太一样,Open MP在并行区域没开始之前就是串行。而MPI似乎一直是多核执行,那么MPI_init和finalize的意义在哪里呢?如果说MPI_INIT可以初始化MPI_Comm_World的话,那似乎MPI_FINALIZE也是不需要的。



作者: 石子    时间: 2024-5-25 22:54
测试代码及结果:
[Fortran] 纯文本查看 复制代码
program test2
use mpi
     integer rank, n_ranks, ierr
     integer status(MPI_STATUS_SIZE)
     character(len=13)  message,message1
     print*,'before MPI init'
     ! First call MPI_Init
     call MPI_Init(ierr)

     ! Check that there are two ranks
     call MPI_Comm_size(MPI_COMM_WORLD, n_ranks, ierr)
     if (n_ranks .ne. 2) then
          write(6,*) "This example exactly requires two ranks"
          error stop
     end if

     ! Get my rank
     call MPI_Comm_rank(MPI_COMM_WORLD, rank, ierr)

     if (rank == 0) then
          message = "Hello, world!"
          call MPI_Send( message, 13, MPI_CHARACTER, 1, 0, MPI_COMM_WORLD, ierr)
     end if

     if (rank == 1) then
          call MPI_Recv( message1, 13, MPI_CHARACTER, 0, 0, MPI_COMM_WORLD, status, ierr)
          write(6,*) message1
     end if
     ! Call MPI_Finalize at the end
     call MPI_Finalize(ierr)
end program


before MPI init
before MPI init
Hello, world!

作者: Transpose    时间: 2024-5-26 09:21
本帖最后由 Transpose 于 2024-5-26 09:24 编辑

MPI_Init 之后,可以针对指定的核操作,使用mpi_send,mpi_recv等函数进行节点之间的数据操作。
如果不使用MPI_init, 此时依旧是多核运行,但是无法对指定的核操作,也无法使用mpi的函数进行节点间的数据操作。


MPI_Finalize只是终止了后续数据交换的行为,本身还是多核运行的。

确实和openmp不一样

作者: 石子    时间: 2024-5-26 20:08
Transpose 发表于 2024-5-26 09:21
MPI_Init 之后,可以针对指定的核操作,使用mpi_send,mpi_recv等函数进行节点之间的数据操作。
如果不使用M ...

好的 谢谢
作者: li913    时间: 2024-5-27 09:11
你只要系统看看书就知道,init必须是程序的第一个执行语句,finalize的最后一个。如果不这样,也可执行,效果不可控。
作者: 石子    时间: 2024-5-27 11:52
li913 发表于 2024-5-27 09:11
你只要系统看看书就知道,init必须是程序的第一个执行语句,finalize的最后一个。如果不这样,也可执行,效 ...

谢谢,学习了,之前确实没看到过




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2