【问题标题】:Fortran MPI (synchronizing an array)Fortran MPI(同步数组)
【发布时间】:2012-06-20 23:40:22
【问题描述】:

我正在尝试在 4 个处理器上运行这个简单的 MPI Fortran 90 代码。问题是我无法合并或同步每个处理器计算的数组元素的值。代码如下:

PROGRAM TRY
USE MPI


integer status(mpi_status_size)
INTEGER                            I, J, K, II, IERR, MY_ID, NUM_PROCS, PSP
INTEGER     , PARAMETER                 :: GRIDX =8 
REAL        , DIMENSION(gridx)          :: PSI
psi=0
PRINT*, 'YASER'

 call mpi_init(ierr)
 call mpi_comm_rank(MPI_COMM_WORLD,my_id,ierr)
 call mpi_comm_size(MPI_COMM_WORLD,num_procs,ierr)

 DO I=1+MY_ID*GRIDX/NUM_PROCS, (MY_ID+1)*GRIDX/NUM_PROCS
    PSI(I)=1.0
 END DO

 **IF (MY_ID .NE. 0) THEN
    CALL mpi_send( PSI(1+MY_ID*GRIDX/NUM_PROCS:(MY_ID+1)*GRIDX/NUM_PROCS),GRIDX/NUM_PROCS,mpi_real, 0,10,mpi_comm_world,ierr)
 END IF
 IF (MY_ID .EQ. 0) THEN
    DO II=1,NUM_PROCS-1
        CALL mpi_recv(PSI(1+MY_ID*GRIDX/NUM_PROCS:(MY_ID+1)*GRIDX/NUM_PROCS),GRIDX/NUM_PROCS,mpi_real, &
        II,10,mpi_comm_world,status,ierr)
    END DO
 END IF**



 IF (MY_ID .EQ. 0) THEN
    OPEN(PSP,FILE='TRYpsi.txt')
    DO I=1, GRIDX
        WRITE (PSP,*)  PSI(I)
    END DO
    CLOSE(PSP)
 END IF

 CALL MPI_FINALIZE(IERR)
 END PROGRAM TRY

然而,虽然每个处理器都正确地完成了它的工作并使 'psi' 等于 1,但问题在于它们的通信,因为当我打开 TRYpsi.txt 时,我看到虽然数组的元素由第 0 个处理器计算都等于一,其他元素都等于零!这意味着第 0 个处理器尚未收到来自其他处理器的信息,或者其他处理器尚未将信息发送给其他处理器。

您能帮我处理 mpi_send 和 mpi_recv 吗?

【问题讨论】:

标签: arrays merge fortran mpi


【解决方案1】:

查看您对 MPI_Recv 的调用。在循环的每次迭代中,您都将接收到相同的位置。您(可能)想要的是根据 II 的值更改第一个参数的值。

【讨论】:

  • 我不确定我是否理解你的意思。然而,原因是第 0 个处理器应该从所有其他处理器接收信息。这就是为什么我需要定义一个循环来覆盖所有处理器的 ID(从 1 到 3,而不是零)。
  • 是的,我明白这一点。但是,在您的循环中,您不会根据循环变量改变 mpi_recv() 的第一个参数(recv 缓冲区) - 所以在第二次迭代中,您会覆盖第一次迭代中写入的数据,依此类推。跨度>
  • 是的!你说的对!我已经纠正了它,代码工作正常!非常感谢
  • 没问题。 :) 如果您的问题得到解决,您可以接受答案。
  • 另一个提示:在大多数情况下,使用 MPI 中的集合函数比使用 send/recv 自己实现它们要好得多。但当然 send/recv 一开始在概念上更简单。
猜你喜欢
  • 2012-03-16
  • 2010-12-03
  • 1970-01-01
  • 2019-09-14
  • 2014-02-24
  • 2012-04-14
  • 2015-06-09
  • 2015-11-04
  • 2011-01-16
相关资源
最近更新 更多