Changeset 364


Ignore:
Timestamp:
10/09/15 16:13:43 (9 years ago)
Author:
dubos
Message:

Bugfix : memory leak in transfert_mpi / New : detect send_message not paired with wait_message

Location:
codes/icosagcm/trunk/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/trunk/src/advect_tracer.f90

    r347 r364  
    8282    IF (first) THEN 
    8383      first=.FALSE. 
    84       CALL init_message(f_u,req_e1_vect,req_u) 
    85       CALL init_message(f_cc,req_e1_scal,req_cc) 
    86       CALL init_message(f_wfluxt,req_i1,req_wfluxt) 
    87       CALL init_message(f_q,req_i1,req_q) 
    88       CALL init_message(f_rhodz,req_i1,req_rhodz) 
    89       CALL init_message(f_gradq3d,req_i1,req_gradq3d) 
     84      CALL init_message(f_u,req_e1_vect,req_u, 'req_u') 
     85      CALL init_message(f_cc,req_e1_scal,req_cc, 'req_cc') 
     86      CALL init_message(f_wfluxt,req_i1,req_wfluxt, 'req_wfluxt') 
     87      CALL init_message(f_q,req_i1,req_q, 'req_q') 
     88      CALL init_message(f_rhodz,req_i1,req_rhodz, 'req_rhodz') 
     89      CALL init_message(f_gradq3d,req_i1,req_gradq3d, 'req_gradq3d') 
    9090    ENDIF 
    9191     
    9292!!$OMP BARRIER 
    9393 
     94    IF(nqtot<1) RETURN 
    9495    CALL trace_start("advect_tracer")  
    9596 
  • codes/icosagcm/trunk/src/observable.f90

    r356 r364  
    3232    USE omp_para 
    3333    TYPE(t_field),POINTER :: f_ps(:), f_u(:), f_q(:) 
    34     IF (is_master) PRINT *,'CALL write_output_fields_basic' 
     34!    IF (is_master) PRINT *,'CALL write_output_fields_basic' 
    3535    CALL un2ulonlat(f_u, f_buf_ulon, f_buf_ulat) 
    3636    CALL output_field("ulon",f_buf_ulon) 
  • codes/icosagcm/trunk/src/timeloop_gcm.f90

    r363 r364  
    195195    !$OMP MASTER 
    196196    CALL SYSTEM_CLOCK(start_clock) 
     197    CALL SYSTEM_CLOCK(count_rate=rate_clock) 
    197198    !$OMP END MASTER    
    198199 
     
    203204    DO it=itau0+1,itau0+itaumax 
    204205 
    205        CALL check_conserve_detailed('detailed_budget 0', & 
    206             f_ps,f_dps,f_u,f_theta_rhodz,f_phis,it) 
    207  
    208        IF (xios_output) CALL xios_update_calendar(it) 
     206       IF (is_master) CALL print_iteration(it, itau0, itaumax, start_clock, rate_clock) 
     207       IF (xios_output) THEN 
     208          CALL xios_update_calendar(it) 
     209       ELSE 
     210          CALL update_time_counter(dt*it) 
     211       END IF 
     212 
    209213       IF (it==itau0+1 .OR. MOD(it,itau_sync)==0) THEN 
    210214          CALL send_message(f_ps,req_ps0) 
     
    220224       ENDIF 
    221225 
    222        IF (is_master) PRINT *,"It No :",It,"   t :",dt*It 
    223  
    224226       IF (mod(it,itau_out)==0 ) THEN 
    225           CALL update_time_counter(dt*it) 
    226227          CALL write_output_fields_basic(f_ps, f_u, f_q) 
    227228       ENDIF 
     229 
     230       CALL check_conserve_detailed('detailed_budget 0', & 
     231            f_ps,f_dps,f_u,f_theta_rhodz,f_phis,it) 
    228232 
    229233       CALL guided(it*dt,f_ps,f_theta_rhodz,f_u,f_q) 
     
    235239          CALL HEVI_scheme(it, fluxt_zero) 
    236240       END SELECT 
    237  
     241        
    238242       CALL check_conserve_detailed('detailed_budget 1', & 
    239243            f_ps,f_dps,f_u,f_theta_rhodz,f_phis,it) 
     
    266270        
    267271       IF(MOD(it,itau_adv)==0) THEN 
    268           IF(nqtot>0) CALL advect_tracer(f_hfluxt,f_wfluxt,f_u, f_q,f_rhodz)  ! update q and rhodz after RK step 
     272          CALL advect_tracer(f_hfluxt,f_wfluxt,f_u, f_q,f_rhodz)  ! update q and rhodz after RK step 
    269273          fluxt_zero=.TRUE. 
    270274          ! FIXME : check that rhodz is consistent with ps 
     
    278282             END DO 
    279283          ENDIF 
    280            
    281284       END IF 
    282285        
     
    301304    !$OMP MASTER 
    302305    CALL SYSTEM_CLOCK(stop_clock) 
    303     CALL SYSTEM_CLOCK(count_rate=rate_clock) 
    304306     
    305307    IF (mpi_rank==0) THEN  
     
    310312    ! CONTAINS 
    311313  END SUBROUTINE timeloop 
    312    
     314 
     315  SUBROUTINE print_iteration(it,itau0,itaumax,start_clock,rate_clock) 
     316    INTEGER :: it, itau0, itaumax, start_clock, stop_clock, rate_clock, throughput 
     317    REAL :: per_step,total, elapsed 
     318    WRITE(*,'(A,I7,A,F8.1)') "It No :",it,"   t :",dt*it 
     319    IF(MOD(it,10)==0) THEN 
     320       CALL SYSTEM_CLOCK(stop_clock) 
     321       elapsed = (stop_clock-start_clock)*1./rate_clock 
     322       per_step = elapsed/(it-itau0) 
     323       throughput = dt/per_step 
     324       total = per_step*(itaumax-itau0) 
     325       WRITE(*,'(A,I5,A,F6.2,A,I6)') 'Time spent (s):',INT(elapsed), & 
     326            '  -- ms/step : ', 1000*per_step, & 
     327            '  -- Throughput :', throughput 
     328       WRITE(*,'(A,I5,A,I5)') 'Whole job (min) :', INT(total/60.), & 
     329            '  -- Completion in (min) : ', INT((total-elapsed)/60.) 
     330    END IF 
     331  END SUBROUTINE print_iteration 
     332 
    313333END MODULE timeloop_gcm_mod 
  • codes/icosagcm/trunk/src/transfert_mpi.f90

    r358 r364  
    6161   
    6262  TYPE t_message 
     63    CHARACTER(LEN=100) :: name ! for debug 
    6364    TYPE(t_request), POINTER :: request(:) 
    6465    INTEGER :: nreq 
     
    7273    LOGICAL :: completed 
    7374    LOGICAL :: pending 
     75    LOGICAL :: open      ! for debug 
    7476    INTEGER :: number 
    7577  END TYPE t_message 
     
    816818 
    817819 
    818   SUBROUTINE init_message_seq(field, request, message) 
     820  SUBROUTINE init_message_seq(field, request, message, name) 
    819821  USE field_mod 
    820822  USE domain_mod 
     
    826828    TYPE(t_request),POINTER :: request(:) 
    827829    TYPE(t_message) :: message 
    828  
     830    CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: name 
    829831!$OMP MASTER     
    830832    message%request=>request 
     833    IF(PRESENT(name)) THEN 
     834       message%name = TRIM(name) 
     835    ELSE 
     836       message%name = 'unknown' 
     837    END IF 
    831838!$OMP END MASTER     
    832839!$OMP BARRIER     
     
    879886 
    880887     
    881   SUBROUTINE init_message_mpi(field,request, message) 
     888  SUBROUTINE init_message_mpi(field,request, message, name) 
    882889  USE field_mod 
    883890  USE domain_mod 
     
    890897    TYPE(t_request),POINTER :: request(:) 
    891898    TYPE(t_message) :: message 
     899    CHARACTER(LEN=*), INTENT(IN),OPTIONAL :: name 
    892900 
    893901    TYPE(ARRAY),POINTER :: recv,send  
     
    904912!$OMP BARRIER 
    905913!$OMP MASTER 
     914    IF(PRESENT(name)) THEN 
     915       message%name = TRIM(name) 
     916    ELSE 
     917       message%name = 'unknown' 
     918    END IF 
    906919    message%number=message_number 
    907920    message_number=message_number+1 
     
    921934    message%pending=.FALSE. 
    922935    message%completed=.FALSE. 
    923    
     936    message%open=.FALSE. 
     937 
    924938    DO ind=1,ndomain 
    925939      req=>request(ind) 
     
    10461060    ENDIF 
    10471061     
    1048  
     1062    DEALLOCATE(message%mpi_req) 
     1063    DEALLOCATE(message%buffers) 
     1064    DEALLOCATE(message%status) 
    10491065 
    10501066!$OMP END MASTER 
     
    11121128 
    11131129!$OMP MASTER 
     1130    IF(message%open) THEN 
     1131       PRINT *, 'send_message_mpi : message ' // TRIM(message%name) // & 
     1132            ' is still open, no call to wait_message_mpi after last send_message_mpi' 
     1133       CALL ABORT 
     1134    END IF 
     1135    message%open=.TRUE. ! will be set to .FALSE. by wait_message_mpi 
     1136 
    11141137    message%field=>field 
    11151138 
     
    14611484    INTEGER :: offset 
    14621485 
     1486    message%open=.FALSE. 
    14631487    IF (.NOT. message%pending) RETURN 
    14641488 
Note: See TracChangeset for help on using the changeset viewer.