Fortran Coder

查看: 1958|回复: 1

[并行] MPI收集数据

[复制链接]

58

帖子

21

主题

0

精华

专家

F 币
283 元
贡献
173 点
发表于 2022-9-2 02:03:11 | 显示全部楼层 |阅读模式
大家好,

我想请教一段用FORTRAN写的MPI并行程序。代码如下:

DO i = 1, nomi, 1
   IF (MOD(i-1,world_size) /= world_rank) CYCLE
   kkim = kkimp(i,
   CALL proce(i,ndegen,nbc,npo,kkim,hil,thil,tecv,teve,bcb,eni,er,pi,nne,hb,bcp1)
   IF (world_rank == 0) THEN
      bcp2 = bcp1 !The 6th line
      DO j = 1, world_size-1, 1
         IF (i-1+j == nomi) EXIT
         k = i + j + 1000
         CALL MPI_RECV(bcp3,nomi*nne*6,MPI_DOUBLE_COMPLEX,j,k,MPI_COMM_WORLD,MPI_STATUS_IGNORE,ierr)
         bcp2 = bcp2 + bcp3
      END DO
   ELSE
      k = i + 1000
      CALL MPI_SEND(bcp1,nomi*nne*6,MPI_DOUBLE_COMPLEX,0,k,MPI_COMM_WORLD,ierr)
   END IF
END DO

假设根进程(root processor)在外循环里一共被使用了两次,每次都会调用子程序proce,并从子程序得到传回的数组bcp1。

当用根进程(root processor)使用数组bcp2,从各个进程(包括其自身)收集各自得到的数组bcp1时,根进程(root processor)需要先收集自己得到的数组bcp1。

因为假设根进程(root processor)在外循环里一共被使用了两次,根进程(root processor)一共要从自身收集两次bcp1数组。那程序里的第6行(标记为!The 6th line),写成bcp2 = bcp1是否合理呢?

我觉得这样写,会使得根进程(root processor)在循环里第二次被使用得到的数组bcp1,覆盖掉第一次被使用得到的数组bcp1,进而导致丢失了第一次使用时得到的数组bcp1信息。

如果不丢失信息,应该进行叠加,也就是把第6行写成bcp2 = bcp2 + bcp1;但程序里却不是这样写的。

我想不通是什么原因,能否请大家给些建议呢?或者是否是程序写错了呢?

谢谢啦。

盼复。

58

帖子

21

主题

0

精华

专家

F 币
283 元
贡献
173 点
 楼主| 发表于 2022-9-7 01:51:28 | 显示全部楼层
等了几天,没有等到回复。

能否麻烦大家,给些建议呢?或者类似的以MPI收集数据的FORTRAN程序例子呢?

拜谢大家啦。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-3-29 15:53

Powered by Tencent X3.4

© 2013-2024 Tencent

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