我试图在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吗?
答案 0 :(得分:4)
看看你对MPI_Recv的电话。您将在循环的每次迭代中接收到相同的位置。你(可能)想要的是改变第一个参数的值,具体取决于II的值。