Fortran Coder

查看: 265|回复: 5

[并行] MPI并行中MPI_INIT与finalize的意义

[复制链接]

35

帖子

16

主题

0

精华

专家

F 币
399 元
贡献
396 点
发表于 2024-5-25 22:38:52 | 显示全部楼层 |阅读模式
本帖最后由 石子 于 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也是不需要的。


欢迎交流

35

帖子

16

主题

0

精华

专家

F 币
399 元
贡献
396 点
 楼主| 发表于 2024-5-25 22:54:36 | 显示全部楼层
测试代码及结果:
[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!
欢迎交流

160

帖子

2

主题

1

精华

大师

Vim

F 币
965 元
贡献
470 点

规矩勋章

发表于 2024-5-26 09:21:43 | 显示全部楼层
本帖最后由 Transpose 于 2024-5-26 09:24 编辑

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


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

确实和openmp不一样

35

帖子

16

主题

0

精华

专家

F 币
399 元
贡献
396 点
 楼主| 发表于 2024-5-26 20:08:46 | 显示全部楼层
Transpose 发表于 2024-5-26 09:21
MPI_Init 之后,可以针对指定的核操作,使用mpi_send,mpi_recv等函数进行节点之间的数据操作。
如果不使用M ...

好的 谢谢
欢迎交流

819

帖子

2

主题

0

精华

大宗师

F 币
3862 元
贡献
2301 点
发表于 2024-5-27 09:11:43 | 显示全部楼层
你只要系统看看书就知道,init必须是程序的第一个执行语句,finalize的最后一个。如果不这样,也可执行,效果不可控。

35

帖子

16

主题

0

精华

专家

F 币
399 元
贡献
396 点
 楼主| 发表于 2024-5-27 11:52:04 | 显示全部楼层
li913 发表于 2024-5-27 09:11
你只要系统看看书就知道,init必须是程序的第一个执行语句,finalize的最后一个。如果不这样,也可执行,效 ...

谢谢,学习了,之前确实没看到过
欢迎交流
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-6-25 00:04

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表