石子 发表于 2024-5-25 22:38:52

MPI并行中MPI_INIT与finalize的意义

本帖最后由 石子 于 2024-5-25 22:53 编辑

各位好,我的MPI fortran程序遇到一些问题,求助大家。
我要求解一个较大空间区域的物理问题,网格数为,共迭代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:36

测试代码及结果:
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:43

本帖最后由 Transpose 于 2024-5-26 09:24 编辑

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


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

确实和openmp不一样

石子 发表于 2024-5-26 20:08:46

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

好的 谢谢

li913 发表于 2024-5-27 09:11:43

你只要系统看看书就知道,init必须是程序的第一个执行语句,finalize的最后一个。如果不这样,也可执行,效果不可控。

石子 发表于 2024-5-27 11:52:04

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

谢谢,学习了,之前确实没看到过:'(
页: [1]
查看完整版本: MPI并行中MPI_INIT与finalize的意义