Fortran MPI(同步数组)

时间:2012-06-18 23:15:46

标签: arrays merge fortran mpi

我试图在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吗?

1 个答案:

答案 0 :(得分:4)

看看你对MPI_Recv的电话。您将在循环的每次迭代中接收到相同的位置。你(可能)想要的是改变第一个参数的值,具体取决于II的值。