Changeset 962


Ignore:
Timestamp:
07/25/19 11:36:36 (5 years ago)
Author:
adurocher
Message:

Merge 'profiling' to trunk

Location:
codes/icosagcm/trunk
Files:
4 added
1 deleted
3 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/trunk/src/parallel/omp_para.F90

    r604 r962  
    5959 
    6060CONTAINS 
     61 
     62  FUNCTION get_omp_size() result(omp_size) 
     63#ifdef CPP_USING_OMP 
     64    use omp_lib, only : omp_get_max_threads 
     65    integer :: omp_size 
     66    omp_size = omp_get_max_threads() 
     67#else 
     68    integer :: omp_size 
     69    omp_size = 1 
     70#endif 
     71  END FUNCTION 
    6172 
    6273  SUBROUTINE init_omp_para(is_mpi_master) 
  • codes/icosagcm/trunk/src/parallel/transfert_mpi.f90

    r953 r962  
    8888  END INTERFACE 
    8989 
     90  integer :: profile_mpi_copies, profile_mpi_waitall, profile_mpi_omp_barrier 
     91 
    9092CONTAINS 
    9193        
     
    103105 
    104106    CALL register_id('MPI', id_mpi) 
     107    CALL register_id('MPI_copies', profile_mpi_copies) 
     108    CALL register_id('MPI_waitall', profile_mpi_waitall) 
     109    CALL register_id('MPI_omp_barrier', profile_mpi_omp_barrier) 
    105110 
    106111    CALL create_request(field_t,req_i1) 
     
    10681073 
    10691074 
    1070     IF (field(1)%data_type==type_real) THEN 
    1071  
    1072       IF (field(1)%ndim==2) THEN 
    1073       
    1074         DO ireq=1,message%nreq 
    1075           CALL free_mpi_buffer(message%buffers(ireq)%r) 
    1076         ENDDO 
    1077        
    1078       ELSE  IF (field(1)%ndim==3) THEN 
    1079  
    1080         DO ireq=1,message%nreq 
    1081           CALL free_mpi_buffer(message%buffers(ireq)%r) 
    1082         ENDDO 
    1083        
    1084       ELSE  IF (field(1)%ndim==4) THEN 
    1085  
    1086         DO ireq=1,message%nreq 
    1087           CALL free_mpi_buffer(message%buffers(ireq)%r) 
    1088         ENDDO 
    1089  
    1090       ENDIF 
     1075    IF (message%field(1)%data_type==type_real) THEN 
     1076      DO ireq=1,message%nreq 
     1077        CALL free_mpi_buffer(message%buffers(ireq)%r) 
     1078      ENDDO     
    10911079    ENDIF 
    10921080 
     
    12201208    if( field(1)%ondevice .AND. .NOT. message%ondevice ) call update_device_message_mpi(message) 
    12211209 
     1210CALL enter_profile(profile_mpi_omp_barrier) 
    12221211!$OMP BARRIER 
     1212CALL exit_profile(profile_mpi_omp_barrier) 
    12231213 
    12241214 
     
    12411231    ENDIF 
    12421232!$OMP END MASTER 
     1233CALL enter_profile(profile_mpi_omp_barrier) 
    12431234!$OMP BARRIER 
     1235CALL exit_profile(profile_mpi_omp_barrier) 
    12441236      
    12451237    IF (field(1)%data_type==type_real) THEN 
     
    12631255              offset=send%offset 
    12641256              msize=send%size 
     1257              call enter_profile(profile_mpi_copies) 
    12651258              !$acc parallel loop default(present) async if (field(ind)%ondevice) 
    12661259              DO n=1,msize 
    12671260                buffer_r(offset+n)=rval2d(value(n)) 
    12681261              ENDDO 
     1262              call exit_profile(profile_mpi_copies) 
    12691263 
    12701264              IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) THEN 
     
    12991293              sgn=>recv%sign 
    13001294              msize=recv%size 
     1295              call enter_profile(profile_mpi_copies) 
    13011296              !$acc parallel loop default(present) async if (field(ind)%ondevice) 
    13021297              DO n=1,msize 
    13031298                rval2d(value(n))=src_rval2d(src_value(n))*sgn(n) 
    13041299              ENDDO 
    1305                  
     1300              call exit_profile(profile_mpi_copies) 
    13061301                     
    13071302            ELSE 
     
    13531348              msize=send%size 
    13541349              moffset=send%offset 
    1355               CALL trace_start("copy_to_buffer") 
     1350              call enter_profile(profile_mpi_copies) 
    13561351 
    13571352              !$acc parallel loop default(present) async if (field(ind)%ondevice) 
     
    13631358                ENDDO 
    13641359              ENDDO 
    1365               CALL trace_end("copy_to_buffer") 
     1360              call exit_profile(profile_mpi_copies) 
    13661361 
    13671362              IF (mpi_threading_mode==MPI_THREAD_SERIALIZED.OR.mpi_threading_mode==MPI_THREAD_MULTIPLE .AND. omp_level_size>1) THEN 
    1368                 !$OMP BARRIER 
     1363CALL enter_profile(profile_mpi_omp_barrier) 
     1364!$OMP BARRIER 
     1365CALL exit_profile(profile_mpi_omp_barrier) 
     1366 
    13691367              ENDIF 
    13701368               
     
    13841382            ELSE 
    13851383              IF (mpi_threading_mode==MPI_THREAD_SERIALIZED.OR.mpi_threading_mode==MPI_THREAD_MULTIPLE .AND. omp_level_size>1) THEN 
    1386                 !$OMP BARRIER 
     1384CALL enter_profile(profile_mpi_omp_barrier) 
     1385!$OMP BARRIER 
     1386CALL exit_profile(profile_mpi_omp_barrier) 
     1387 
    13871388              ENDIF 
    13881389            ENDIF 
     
    13911392          IF (mpi_threading_mode==MPI_THREAD_SERIALIZED.OR.mpi_threading_mode==MPI_THREAD_MULTIPLE .AND. omp_level_size>1) THEN 
    13921393            DO isend=req%nsend+1,max_req 
    1393               !$OMP BARRIER 
     1394CALL enter_profile(profile_mpi_omp_barrier) 
     1395!$OMP BARRIER 
     1396CALL exit_profile(profile_mpi_omp_barrier) 
     1397 
    13941398            ENDDO 
    13951399          ENDIF 
     
    14141418              msize=recv%size 
    14151419 
     1420              call enter_profile(profile_mpi_copies) 
    14161421              CALL trace_start("copy_data") 
    14171422              !$acc parallel loop collapse(2) default(present) async if (field(ind)%ondevice) 
     
    14211426                ENDDO 
    14221427              ENDDO 
     1428              call exit_profile(profile_mpi_copies) 
    14231429              CALL trace_end("copy_data") 
    14241430 
     
    14731479              moffset=send%offset 
    14741480 
     1481              call enter_profile(profile_mpi_copies) 
    14751482              CALL trace_start("copy_to_buffer") 
    14761483              !$acc parallel loop default(present) collapse(2) async if (field(ind)%ondevice) 
     
    14861493              ENDDO 
    14871494              CALL trace_end("copy_to_buffer") 
     1495              call exit_profile(profile_mpi_copies) 
    14881496 
    14891497              IF (mpi_threading_mode==MPI_THREAD_SERIALIZED.OR.mpi_threading_mode==MPI_THREAD_MULTIPLE .AND. omp_level_size>1) THEN 
    1490                 !$OMP BARRIER 
     1498CALL enter_profile(profile_mpi_omp_barrier) 
     1499!$OMP BARRIER 
     1500CALL exit_profile(profile_mpi_omp_barrier) 
     1501 
    14911502              ENDIF 
    14921503 
     
    15061517            ELSE 
    15071518              IF (mpi_threading_mode==MPI_THREAD_SERIALIZED.OR.mpi_threading_mode==MPI_THREAD_MULTIPLE .AND. omp_level_size>1) THEN 
    1508                 !$OMP BARRIER 
     1519CALL enter_profile(profile_mpi_omp_barrier) 
     1520!$OMP BARRIER 
     1521CALL exit_profile(profile_mpi_omp_barrier) 
     1522 
    15091523              ENDIF 
    15101524            ENDIF 
     
    15131527          IF (mpi_threading_mode==MPI_THREAD_SERIALIZED.OR.mpi_threading_mode==MPI_THREAD_MULTIPLE .AND. omp_level_size>1) THEN 
    15141528            DO isend=req%nsend+1,max_req 
    1515               !$OMP BARRIER 
     1529CALL enter_profile(profile_mpi_omp_barrier) 
     1530!$OMP BARRIER 
     1531CALL exit_profile(profile_mpi_omp_barrier) 
     1532 
    15161533            ENDDO 
    15171534          ENDIF 
     
    15271544          rval4d=>field(ind)%rval4d 
    15281545          req=>message%request(ind) 
    1529  
     1546           
    15301547          DO irecv=1,req%nrecv 
    15311548            recv=>req%recv(irecv) 
     
    15361553              sgn=>recv%sign 
    15371554              msize=recv%size 
     1555              call enter_profile(profile_mpi_copies) 
    15381556              CALL trace_start("copy_data") 
    1539  
    15401557              !$acc parallel loop collapse(3) default(present) async if (field(ind)%ondevice) 
    15411558              DO d4=1,dim4 
     
    15461563                ENDDO 
    15471564              ENDDO 
    1548                  
     1565              call exit_profile(profile_mpi_copies) 
    15491566              CALL trace_end("copy_data") 
    15501567                    
     
    15731590 
    15741591      IF (mpi_threading_mode==MPI_THREAD_FUNNELED .OR. mpi_threading_mode==MPI_THREAD_SINGLE) THEN 
     1592CALL enter_profile(profile_mpi_omp_barrier) 
    15751593!$acc wait 
    15761594!$OMP BARRIER 
     1595CALL exit_profile(profile_mpi_omp_barrier) 
    15771596!$OMP MASTER         
    15781597 
     
    16121631      ENDIF               
    16131632    ENDIF 
    1614      
     1633CALL enter_profile(profile_mpi_omp_barrier) 
    16151634!$OMP BARRIER 
     1635CALL exit_profile(profile_mpi_omp_barrier) 
     1636  
    16161637!    CALL trace_end("send_message_mpi") 
    16171638 
     
    16721693      IF (field(1)%ndim==2) THEN 
    16731694 
    1674 !$OMP MASTER 
    1675         IF (.NOT. message%completed) CALL MPI_WAITALL(nreq,message%mpi_req,          & 
     1695call enter_profile(profile_mpi_waitall) 
     1696!$OMP MASTER          
     1697         IF (.NOT. message%completed) CALL MPI_WAITALL(nreq,message%mpi_req,          & 
    16761698          message%status,ierr) 
    16771699!$OMP END MASTER 
    16781700!$OMP BARRIER 
    1679          
     1701call exit_profile(profile_mpi_waitall) 
     1702        call enter_profile(profile_mpi_copies) 
    16801703        DO ind=1,ndomain 
    16811704          IF (.NOT. assigned_domain(ind) .OR. .NOT. is_omp_level_master) CYCLE 
     
    17011724         
    17021725        ENDDO 
     1726        call exit_profile(profile_mpi_copies) 
    17031727       
    17041728       
    17051729      ELSE  IF (field(1)%ndim==3) THEN 
    1706  
     1730         call enter_profile(profile_mpi_waitall) 
    17071731!$OMP MASTER 
    1708         IF (.NOT. message%completed) CALL MPI_WAITALL(nreq,message%mpi_req,          & 
    1709           message%status,ierr) 
     1732         IF (.NOT. message%completed) CALL MPI_WAITALL(nreq,message%mpi_req,          & 
     1733              message%status,ierr) 
    17101734!$OMP END MASTER 
    17111735!$OMP BARRIER 
     1736        call exit_profile(profile_mpi_waitall) 
    17121737 
    17131738         
     
    17301755              msize=recv%size 
    17311756              moffset=recv%offset 
     1757              call enter_profile(profile_mpi_copies) 
    17321758              CALL trace_start("copy_from_buffer") 
    17331759               
     
    17531779                 
    17541780              CALL trace_end("copy_from_buffer") 
     1781              call exit_profile(profile_mpi_copies) 
    17551782            ENDIF 
    17561783          ENDDO 
     
    17591786 
    17601787      ELSE  IF (field(1)%ndim==4) THEN 
     1788call enter_profile(profile_mpi_waitall) 
    17611789!$OMP MASTER 
    17621790        IF (.NOT. message%completed) CALL MPI_WAITALL(nreq,message%mpi_req,          & 
     
    17641792!$OMP END MASTER 
    17651793!$OMP BARRIER 
     1794        call exit_profile(profile_mpi_waitall) 
    17661795 
    17671796                 
     
    17841813              msize=recv%size 
    17851814              moffset=recv%offset 
     1815              call enter_profile(profile_mpi_copies) 
    17861816              CALL trace_start("copy_from_buffer") 
    17871817              !$acc parallel loop default(present) collapse(2) async if (field(ind)%ondevice) 
     
    17971827              ENDDO 
    17981828              CALL trace_end("copy_from_buffer") 
     1829              call exit_profile(profile_mpi_copies) 
    17991830            ENDIF 
    18001831          ENDDO 
  • codes/icosagcm/trunk/src/time/timeloop_gcm.F90

    r953 r962  
    4545    IF (.NOT. enable_io) itau_out=HUGE(itau_out) 
    4646 
    47     itau_prof=100 
     47    itau_prof=1000 
    4848    CALL getin('itau_profiling',itau_prof) 
    4949 
     
    257257    CALL update_device_field(f_wflux) 
    258258    CALL update_device_field(f_rhodz) 
     259    call reset_profiling()   
    259260 
    260261 
    261262    DO it=itau0+1,itau0+itaumax 
    262        IF (is_master) CALL print_iteration(it, itau0, itaumax, start_clock, rate_clock) 
     263       CALL print_iteration(it, itau0, itaumax, start_clock, rate_clock) 
    263264 
    264265       CALL enter_profile(id_timeloop) 
     
    432433    INTEGER(kind=8) :: start_clock, stop_clock, rate_clock 
    433434    REAL :: per_step,total, elapsed 
    434     WRITE(*,'(A,I7,A,F14.1)') "It No :",it,"   t :",dt*it 
    435     IF(MOD(it,10)==0) THEN 
    436        CALL SYSTEM_CLOCK(stop_clock) 
    437        elapsed = (stop_clock-start_clock)*1./rate_clock 
    438        per_step = elapsed/(it-itau0) 
    439        throughput = INT(dt/per_step) 
    440        total = per_step*itaumax 
    441        WRITE(*,'(A,I5,A,F6.2,A,I6)') 'Time spent (s):',INT(elapsed), & 
    442             '  -- ms/step : ', 1000*per_step, & 
    443             '  -- Throughput :', throughput 
    444        WRITE(*,'(A,I5,A,I5)') 'Whole job (min) :', INT(total/60.), & 
    445             '  -- Completion in (min) : ', INT((total-elapsed)/60.) 
     435     
     436    IF(is_master) THEN 
     437       WRITE(*,'(A,I7,A,F14.1)') "It No :",it,"   t :",dt*it 
     438       IF(MOD(it,10)==0) THEN 
     439          CALL SYSTEM_CLOCK(stop_clock) 
     440          elapsed = (stop_clock-start_clock)*1./rate_clock 
     441          per_step = elapsed/(it-itau0) 
     442          throughput = INT(dt/per_step) 
     443          total = per_step*itaumax 
     444          WRITE(*,'(A,I5,A,F6.2,A,I6)') 'Time spent (s):',INT(elapsed), & 
     445               '  -- ms/step : ', 1000*per_step, & 
     446               '  -- Throughput :', throughput 
     447          WRITE(*,'(A,I5,A,I5)') 'Whole job (min) :', INT(total/60.), & 
     448               '  -- Completion in (min) : ', INT((total-elapsed)/60.) 
     449       END IF 
    446450    END IF 
    447451    IF(MOD(it,itau_prof)==0) CALL print_profile 
Note: See TracChangeset for help on using the changeset viewer.