この単純な MPI Fortran 90 コードを 4 つのプロセッサで実行しようとしています。問題は、各プロセッサによって計算された配列の要素の値をマージまたは同期できないことです。コードは次のとおりです。
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 番目のプロセッサによって計算された配列の要素がすべて等しいことがわかるため、通信に問題があります。 1に、他の要素はすべてゼロに等しい! これは、0 番目のプロセッサが他のプロセッサから情報を受信していないか、または他のプロセッサが他のプロセッサに情報を送信していないことを意味します。
mpi_send と mpi_recv について教えてください。