diff --git a/SURCOUCHE/mode_mppdb.f90 b/SURCOUCHE/mode_mppdb.f90 index f75294638f2abdd1fbc1db5fc97223b0b1156b77..8a31afd52664753c319c5ebfb82f119a7452d021 100644 --- a/SURCOUCHE/mode_mppdb.f90 +++ b/SURCOUCHE/mode_mppdb.f90 @@ -257,7 +257,9 @@ CONTAINS USE MODD_PARAMETERS, ONLY : JPHEXT USE MODI_GATHER_ll USE MODD_VAR_ll , ONLY : MPI_PRECISION + USE MODD_MPIF , ONLY : MPI_INTEGER, MPI_STATUS_IGNORE, MPI_MAX + USE MODE_DEVICE IMPLICIT NONE @@ -275,15 +277,16 @@ CONTAINS INTEGER,PARAMETER :: ITAG = 12345 - INTEGER :: I_FIRST_SON, IRECVSTATUS + INTEGER :: I_FIRST_SON INTEGER :: I_FIRST_FATHER - REAL :: MAX_DIFF , MAX_VAL + REAL :: MAX_DIFF , MAX_VAL , MAX_DIFF_ll INTEGER :: IIB_ll,IIE_ll,IJB_ll,IJE_ll REAL,POINTER, DIMENSION(:,:,:) :: TAB_INTERIOR_ll ! for easy debug -!!$ REAL, DIMENSION(size(ptab,1),size(ptab,2),size(ptab,3)) :: ZTAB - + REAL, DIMENSION(size(ptab,1),size(ptab,2),size(ptab,3)) :: ZTAB + LOGICAL :: G_PTAB_ON_DEVICE + INTEGER :: IPAS,NPAS,NPAS_ll #ifdef MNH_SP4 !pas de mpi_spawn sur IBM-SP ni MPI_ARGV_NULL etc ... @@ -292,95 +295,100 @@ CONTAINS IF ( ( .NOT. MPPDB_INITIALIZED ) .OR. (SIZE(PTAB) == 0 ) ) RETURN ! CALL MPPDB_BARRIER() -!!$ !$acc data create(ZTAB) -!!$ !$acc data pcopyin(PTAB) -!!$ !$acc kernels pcopyin(PTAB) -!!$ ZTAB=PTAB -!!$ !$acc end kernels -!!$ !$acc end data -!!$ !$acc update host(ZTAB) -!!$ !$acc end data -!!$ PTAB=ZTAB - -!!$ ZTAB = PTAB - ! - IF(MPPDB_FATHER_WORLD) THEN - ! - ! Reconstruct the all PTAB in TAB_ll - ! - CALL GET_GLOBALDIMS_ll (IIMAX_ll,IJMAX_ll) - IIU_ll = IIMAX_ll+2*JPHEXT - IJU_ll = IJMAX_ll+2*JPHEXT - IKU_ll = SIZE(PTAB,3) - ALLOCATE(TAB_ll(IIU_ll,IJU_ll,IKU_ll)) - ALLOCATE(TAB_SAVE_ll(IIU_ll,IJU_ll,IKU_ll)) - CALL GATHERALL_FIELD_ll('XY',PTAB,TAB_ll,IINFO_ll) - IF (MPPDB_IRANK_WORLD.EQ.0) THEN - ! - ! I'm the first FATHER => recieve the correct globale ARRAY from first son - ! - ALLOCATE(TAB_SON_ll(IIU_ll,IJU_ll,IKU_ll)) - ! - ! the first son , is the next processus after this 'world' so - ! - I_FIRST_SON = MPPDB_NBPROC_WORLD - ! - CALL MPI_RECV(TAB_SON_ll,SIZE(TAB_SON_ll),MPI_PRECISION,I_FIRST_SON, & - ITAG, MPPDB_INTRA_COMM, IRECVSTATUS, IINFO_ll) - ! - TAB_SAVE_ll = TAB_ll - TAB_ll = ABS ( TAB_ll - TAB_SON_ll ) - ! - IF (MPPDB_CHECK_LB) THEN - IIB_ll = 1 ; IJB_ll = 1 - IIE_ll = IIU_ll ; IJE_ll = IJU_ll - ELSE - IIB_ll = 1 + JPHEXT ; IJB_ll = 1 + JPHEXT - IIE_ll = IIU_ll-JPHEXT ; IJE_ll = IJU_ll-JPHEXT - END IF - MAX_VAL = MAXVAL( ABS (TAB_SON_ll) ) - IF ( MAX_VAL .EQ. 0.0 ) MAX_VAL = 1.0 - MAX_DIFF = MAXVAL( TAB_ll(IIB_ll:IIE_ll,IIB_ll:IJE_ll,1:IKU_ll) / MAX_VAL) - TAB_INTERIOR_ll => TAB_ll(IIB_ll:IIE_ll,IIB_ll:IJE_ll,1:IKU_ll) - ! - IF (MAX_DIFF > PRECISION ) THEN - write(6, '(" MPPDB_CHECK3D :: PB MPPDB_CHECK3D =",A40," ERROR=",e15.8," MAXVAL=",e15.8)' ) MESSAGE,MAX_DIFF , MAX_VAL - ELSE - write(6, '(" MPPDB_CHECK3D :: OK MPPDB_CHECK3D =",A40," ERROR=",e15.8," MAXVAL=",e15.8)' ) MESSAGE,MAX_DIFF , MAX_VAL + CALL GET_FROM_DEVICE(PTAB,ZTAB,G_PTAB_ON_DEVICE) + + NPAS = 1 + IF (G_PTAB_ON_DEVICE) NPAS=2 + CALL MPI_ALLREDUCE(NPAS,NPAS_ll,1,MPI_INTEGER,MPI_MAX,MPPDB_INTRA_COMM,IINFO_ll) + + MAX_DIFF = 0.0 + + DO IPAS=1,NPAS_ll + IF ((IPAS.EQ.2) .AND. G_PTAB_ON_DEVICE ) ZTAB = PTAB ! the 2 time test the value on host + ! + IF(MPPDB_FATHER_WORLD) THEN + ! + ! Reconstruct the all PTAB in TAB_ll + ! + CALL GET_GLOBALDIMS_ll (IIMAX_ll,IJMAX_ll) + IIU_ll = IIMAX_ll+2*JPHEXT + IJU_ll = IJMAX_ll+2*JPHEXT + IKU_ll = SIZE(PTAB,3) + IF (.NOT. ALLOCATED(TAB_ll)) ALLOCATE(TAB_ll(IIU_ll,IJU_ll,IKU_ll)) + IF (.NOT. ALLOCATED(TAB_SAVE_ll)) ALLOCATE(TAB_SAVE_ll(IIU_ll,IJU_ll,IKU_ll)) + CALL GATHERALL_FIELD_ll('XY',ZTAB,TAB_ll,IINFO_ll) + + IF (MPPDB_IRANK_WORLD.EQ.0) THEN + ! + ! I'm the first FATHER => recieve the correct globale ARRAY from first son + ! + IF (.NOT. ALLOCATED(TAB_SON_ll)) ALLOCATE(TAB_SON_ll(IIU_ll,IJU_ll,IKU_ll)) + ! + ! the first son , is the next processus after this 'world' so + ! + I_FIRST_SON = MPPDB_NBPROC_WORLD + ! + CALL MPI_RECV(TAB_SON_ll,SIZE(TAB_SON_ll),MPI_PRECISION,I_FIRST_SON, & + ITAG,MPPDB_INTRA_COMM,MPI_STATUS_IGNORE,IINFO_ll) + ! + TAB_SAVE_ll = TAB_ll + TAB_ll = ABS ( TAB_ll - TAB_SON_ll ) + ! + IF (MPPDB_CHECK_LB) THEN + IIB_ll = 1 ; IJB_ll = 1 + IIE_ll = IIU_ll ; IJE_ll = IJU_ll + ELSE + IIB_ll = 1 + JPHEXT ; IJB_ll = 1 + JPHEXT + IIE_ll = IIU_ll-JPHEXT ; IJE_ll = IJU_ll-JPHEXT + END IF + MAX_VAL = MAXVAL( ABS (TAB_SON_ll) ) + IF ( MAX_VAL .EQ. 0.0 ) MAX_VAL = 1.0 + MAX_DIFF = MAXVAL( TAB_ll(IIB_ll:IIE_ll,IIB_ll:IJE_ll,1:IKU_ll) / MAX_VAL) + TAB_INTERIOR_ll => TAB_ll(IIB_ll:IIE_ll,IIB_ll:IJE_ll,1:IKU_ll) + ! + IF (MAX_DIFF > PRECISION ) THEN + write(6, '(" MPPDB_CHECK3D :: PB MPPDB_CHECK3D =",A40," ERROR=",e15.8," MAXVAL=",e15.8," PTAB_ON_DEVICE=",l1," IPAS=",I1)' ) MESSAGE,MAX_DIFF,MAX_VAL,G_PTAB_ON_DEVICE,IPAS + ELSE + write(6, '(" MPPDB_CHECK3D :: OK MPPDB_CHECK3D =",A40," ERROR=",e15.8," MAXVAL=",e15.8," PTAB_ON_DEVICE=",l1," IPAS=",I1)' ) MESSAGE,MAX_DIFF,MAX_VAL,G_PTAB_ON_DEVICE,IPAS + END IF + call flush(6) + ! + DEALLOCATE(TAB_ll,TAB_SON_ll) + ! END IF - call flush(6) + ELSE ! - DEALLOCATE(TAB_ll,TAB_SON_ll) + ! Reconstruct the all PTAB in TAB_ll ! - END IF - ELSE - ! - ! Reconstruct the all PTAB in TAB_ll - ! - CALL GET_GLOBALDIMS_ll (IIMAX_ll,IJMAX_ll) - IIU_ll = IIMAX_ll+2*JPHEXT - IJU_ll = IJMAX_ll+2*JPHEXT - IKU_ll = SIZE(PTAB,3) - ALLOCATE(TAB_ll(IIU_ll,IJU_ll,IKU_ll)) - CALL GATHERALL_FIELD_ll('XY',PTAB,TAB_ll,IINFO_ll) - ! - ! SON WORLD - ! - IF (MPPDB_IRANK_WORLD.EQ.0) THEN + CALL GET_GLOBALDIMS_ll (IIMAX_ll,IJMAX_ll) + IIU_ll = IIMAX_ll+2*JPHEXT + IJU_ll = IJMAX_ll+2*JPHEXT + IKU_ll = SIZE(PTAB,3) + IF (.NOT. ALLOCATED(TAB_ll)) ALLOCATE(TAB_ll(IIU_ll,IJU_ll,IKU_ll)) + CALL GATHERALL_FIELD_ll('XY',ZTAB,TAB_ll,IINFO_ll) ! - ! first son --> send the good array to the first father + ! SON WORLD ! - I_FIRST_FATHER = 0 - CALL MPI_BSEND(TAB_ll,SIZE(TAB_ll),MPI_PRECISION,I_FIRST_FATHER, & - ITAG, MPPDB_INTRA_COMM, IINFO_ll) + IF (MPPDB_IRANK_WORLD.EQ.0) THEN + ! + ! first son --> send the good array to the first father + ! + I_FIRST_FATHER = 0 + CALL MPI_BSEND(TAB_ll,SIZE(TAB_ll),MPI_PRECISION,I_FIRST_FATHER, & + ITAG, MPPDB_INTRA_COMM, IINFO_ll) + END IF END IF - END IF + + CALL MPPDB_BARRIER() - CALL MPPDB_BARRIER() + CALL MPI_ALLREDUCE(MAX_DIFF,MAX_DIFF_ll,1,MPI_PRECISION,MPI_MAX,MPPDB_INTRA_COMM,IINFO_ll) + !IF ( MAX_DIFF_ll .EQ. 0.0 ) EXIT + + END DO #endif END SUBROUTINE MPPDB_CHECK3D - + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -431,7 +439,7 @@ CONTAINS USE MODD_PARAMETERS, ONLY : JPHEXT USE MODI_GATHER_ll USE MODD_VAR_ll , ONLY : MPI_PRECISION - + USE MODD_MPIF , ONLY : MPI_INTEGER, MPI_STATUS_IGNORE IMPLICIT NONE @@ -449,7 +457,7 @@ CONTAINS INTEGER,PARAMETER :: ITAG = 12345 - INTEGER :: I_FIRST_SON, IRECVSTATUS + INTEGER :: I_FIRST_SON INTEGER :: I_FIRST_FATHER REAL :: MAX_DIFF , MAX_VAL INTEGER :: IIB_ll,IIE_ll,IJB_ll,IJE_ll @@ -485,7 +493,7 @@ CONTAINS I_FIRST_SON = MPPDB_NBPROC_WORLD ! CALL MPI_RECV(TAB_SON_ll,SIZE(TAB_SON_ll),MPI_PRECISION,I_FIRST_SON, & - ITAG, MPPDB_INTRA_COMM, IRECVSTATUS, IINFO_ll) + ITAG, MPPDB_INTRA_COMM,MPI_STATUS_IGNORE,IINFO_ll) ! TAB_ll = ABS(TAB_ll - TAB_SON_ll) ! @@ -574,13 +582,12 @@ CONTAINS INTEGER,PARAMETER :: ITAG = 12345 - INTEGER :: I_FIRST_SON, IRECVSTATUS + INTEGER :: I_FIRST_SON INTEGER :: I_FIRST_FATHER REAL :: MAX_DIFF , MAX_VAL INTEGER :: IIB_ll,IIE_ll,IJB_ll,IJE_ll INTEGER :: JI INTEGER :: IIB,IIE,IJB,IJE - INTEGER, DIMENSION(MPI_STATUS_SIZE) :: STATUS #ifdef MNH_SP4 !pas de mpi_spawn sur IBM-SP ni MPI_ARGV_NULL etc ... @@ -612,7 +619,7 @@ CONTAINS IF (IIB /= 0) THEN TX3DP=>Z3D(IIB:IIE,IJB:IJE,:) IF (ISP /= JI) THEN - CALL MPI_RECV(TX3DP,SIZE(TX3DP),MPI_PRECISION,JI-1,99,NMNH_COMM_WORLD,STATUS,IINFO_ll) + CALL MPI_RECV(TX3DP,SIZE(TX3DP),MPI_PRECISION,JI-1,99,NMNH_COMM_WORLD,MPI_STATUS_IGNORE,IINFO_ll) ELSE CALL GET_DISTRIB_LB(HLBTYPE,JI,'LOC','WRITE',KRIM,IIB,IIE,IJB,IJE) TX3DP = PLB(IIB:IIE,IJB:IJE,:) @@ -643,7 +650,7 @@ CONTAINS I_FIRST_SON = MPPDB_NBPROC_WORLD ! CALL MPI_RECV(TAB_SON_ll,SIZE(TAB_SON_ll),MPI_PRECISION,I_FIRST_SON, & - ITAG, MPPDB_INTRA_COMM, IRECVSTATUS, IINFO_ll) + ITAG, MPPDB_INTRA_COMM,MPI_STATUS_IGNORE, IINFO_ll) ! ALLOCATE(TAB_SAVE_ll(SIZE(Z3D,1),SIZE(Z3D,2),SIZE(Z3D,3))) @@ -685,3 +692,4 @@ CONTAINS END MODULE MODE_MPPDB +