0

この単純な 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 について教えてください。

4

1 に答える 1

4

MPI_Recv への呼び出しを見てください。ループの各反復で同じ場所に受信しています。(おそらく) 必要なのは、II の値に応じて、最初の引数の値を変更することです。

于 2012-06-18T23:25:51.843 に答える