【发布时间】: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 吗?
【问题讨论】:
-
我不确定你做错了什么,或者问题是编程还是配置。但此链接可能会有所帮助:condor.cc.ku.edu/~grobe/docs/intro-MPI.shtml
-
谢谢。我使用了与链接建议相同的程序