Actual source code: ex3f90.F90

      1: !
      2: !
      3: !   Description: Demonstrates how users can augment the PETSc profiling by
      4: !                inserting their own event logging.
      5: !
      6: #include <petsc/finclude/petscsys.h>
      7: #include <petsc/finclude/petsclog.h>
      8: program SchoolDay
      9:   use petscsys
     10:   implicit none

     12:   ! Settings:
     13:   integer, parameter   :: verbose = 0                  ! 0: silent, >=1 : increasing amount of debugging output
     14:   integer4, parameter  :: msgLen = 30                  ! number of reals which is sent with MPI_Isend
     15:   PetscReal, parameter :: second = 0.1_PETSC_REAL_KIND ! time is sped up by a factor 10

     17:   ! Codes
     18:   integer, parameter     :: BOY = 1, GIRL = 2, TEACHER = 0
     19:   PetscMPIInt, parameter :: tagMsg = 1200

     21:   ! Timers
     22:   PetscLogEvent :: Morning, Afternoon
     23:   PetscLogEvent :: PlayBall, SkipRope
     24:   PetscLogEvent :: TidyClass
     25:   PetscLogEvent :: Lessons, CorrectHomework
     26:   PetscClassId classid

     28:   ! Petsc-stuff
     29:   PetscErrorCode            :: ierr

     31:   ! MPI-stuff
     32:   PetscMPIInt              :: rank, size
     33:   PetscReal, allocatable    :: message(:, :)
     34:   integer                   :: item
     35:   PetscMPIInt :: maxItem
     36: #if defined(PETSC_USE_MPI_F08)
     37:   MPIU_Status                  :: status
     38: #else
     39:   MPIU_Status                  :: status(MPI_STATUS_SIZE)
     40: #endif
     41:   MPIU_Request req

     43:   ! Own stuff
     44:   integer4                  :: role                 ! is this process a BOY, a GIRL or a TEACHER?
     45:   integer4                  :: i, j

     47: !     Initializations
     48:   PetscCallA(PetscInitialize(ierr))
     49:   PetscCallMPIA(MPI_Comm_size(PETSC_COMM_WORLD, size, ierr))
     50:   PetscCallMPIA(MPI_Comm_rank(PETSC_COMM_WORLD, rank, ierr))

     52:   if (rank == 0) then
     53:     role = TEACHER
     54:   else if (rank < 0.4_PETSC_REAL_KIND*size) then
     55:     role = GIRL
     56:   else
     57:     role = BOY
     58:   end if

     60:   allocate (message(msgLen, msglen))
     61:   do i = 1, msgLen
     62:     do j = 1, msgLen
     63:       message(i, j) = 10.0_PETSC_REAL_KIND*j + i*1.0_PETSC_REAL_KIND/(rank + 1_PETSC_MPIINT_KIND)
     64:     end do
     65:   end do
     66: !
     67: !     Create new user-defined events
     68:   classid = 0
     69:   PetscCallA(PetscLogEventRegister('Morning', classid, Morning, ierr))
     70:   PetscCallA(PetscLogEventRegister('Afternoon', classid, Afternoon, ierr))
     71:   PetscCallA(PetscLogEventRegister('Play Ball', classid, PlayBall, ierr))
     72:   PetscCallA(PetscLogEventRegister('Skip Rope', classid, SkipRope, ierr))
     73:   PetscCallA(PetscLogEventRegister('Tidy Classroom', classid, TidyClass, ierr))
     74:   PetscCallA(PetscLogEventRegister('Lessons', classid, Lessons, ierr))
     75:   PetscCallA(PetscLogEventRegister('Correct Homework', classid, CorrectHomework, ierr))
     76:   if (verbose >= 1) then
     77:     print '(a,i0,a)', '[', rank, '] SchoolDay events have been defined'
     78:   end if

     80: !     Go through the school day
     81:   PetscCallA(PetscLogEventBegin(Morning, ierr))

     83:   PetscCallA(PetscLogFlops(190000d0, ierr))
     84:   PetscCallA(PetscSleep(0.5*second, ierr))

     86:   PetscCallA(PetscLogEventBegin(Lessons, ierr))
     87:   PetscCallA(PetscLogFlops(23000d0, ierr))
     88:   PetscCallA(PetscSleep(1*second, ierr))
     89:   if (size > 1) then
     90:     PetscCallMPIA(MPI_Isend(message, msgLen, MPIU_REAL, mod(rank + 1_PETSC_MPIINT_KIND, size), tagMsg + rank, PETSC_COMM_WORLD, req, ierr))
     91:     PetscCallMPIA(MPI_Recv(message, msgLen, MPIU_REAL, mod(rank - 1_PETSC_MPIINT_KIND + size, size), tagMsg + mod(rank - 1_PETSC_MPIINT_KIND + size, size), PETSC_COMM_WORLD, status, ierr))
     92:     PetscCallMPIA(MPI_Wait(req, MPI_STATUS_IGNORE, ierr))
     93:   end if
     94:   PetscCallA(PetscLogEventEnd(Lessons, ierr))

     96:   if (role == TEACHER) then
     97:     PetscCallA(PetscLogEventBegin(TidyClass, ierr))
     98:     PetscCallA(PetscLogFlops(600000d0, ierr))
     99:     PetscCallA(PetscSleep(0.6*second, ierr))
    100:     PetscCallA(PetscLogEventBegin(CorrectHomework, ierr))
    101:     PetscCallA(PetscLogFlops(234700d0, ierr))
    102:     PetscCallA(PetscSleep(0.4*second, ierr))
    103:     PetscCallA(PetscLogEventEnd(CorrectHomework, ierr))
    104:     PetscCallA(PetscLogEventEnd(TidyClass, ierr))
    105:   else if (role == BOY) then
    106:     PetscCallA(PetscLogEventBegin(SkipRope, ierr))
    107:     PetscCallA(PetscSleep(0.8*second, ierr))
    108:     PetscCallA(PetscLogEventEnd(SkipRope, ierr))
    109:   else
    110:     PetscCallA(PetscLogEventBegin(PlayBall, ierr))
    111:     PetscCallA(PetscSleep(0.9*second, ierr))
    112:     PetscCallA(PetscLogEventEnd(PlayBall, ierr))
    113:   end if

    115:   PetscCallA(PetscLogEventBegin(Lessons, ierr))
    116:   PetscCallA(PetscLogFlops(120000d0, ierr))
    117:   PetscCallA(PetscSleep(0.7*second, ierr))
    118:   PetscCallA(PetscLogEventEnd(Lessons, ierr))

    120:   PetscCallA(PetscLogEventEnd(Morning, ierr))

    122:   PetscCallA(PetscLogEventBegin(Afternoon, ierr))

    124:   item = rank*(3 - rank)
    125:   PetscCallMPIA(MPI_Allreduce(item, maxItem, 1_PETSC_MPIINT_KIND, MPI_INTEGER, MPI_MAX, PETSC_COMM_WORLD, ierr))

    127:   item = rank*(10 - rank)
    128:   PetscCallMPIA(MPI_Allreduce(item, maxItem, 1_PETSC_MPIINT_KIND, MPI_INTEGER, MPI_MAX, PETSC_COMM_WORLD, ierr))

    130:   PetscCallA(PetscLogFlops(58988d0, ierr))
    131:   PetscCallA(PetscSleep(0.6*second, ierr))

    133:   PetscCallA(PetscLogEventBegin(Lessons, ierr))
    134:   PetscCallA(PetscLogFlops(123456d0, ierr))
    135:   PetscCallA(PetscSleep(1*second, ierr))
    136:   PetscCallA(PetscLogEventEnd(Lessons, ierr))

    138:   if (role == TEACHER) then
    139:     PetscCallA(PetscLogEventBegin(TidyClass, ierr))
    140:     PetscCallA(PetscLogFlops(17800d0, ierr))
    141:     PetscCallA(PetscSleep(1.1*second, ierr))
    142:     PetscCallA(PetscLogEventBegin(Lessons, ierr))
    143:     PetscCallA(PetscLogFlops(72344d0, ierr))
    144:     PetscCallA(PetscSleep(0.5*second, ierr))
    145:     PetscCallA(PetscLogEventEnd(Lessons, ierr))
    146:     PetscCallA(PetscLogEventEnd(TidyClass, ierr))
    147:   else if (role == GIRL) then
    148:     PetscCallA(PetscLogEventBegin(SkipRope, ierr))
    149:     PetscCallA(PetscSleep(0.7*second, ierr))
    150:     PetscCallA(PetscLogEventEnd(SkipRope, ierr))
    151:   else
    152:     PetscCallA(PetscLogEventBegin(PlayBall, ierr))
    153:     PetscCallA(PetscSleep(0.8*second, ierr))
    154:     PetscCallA(PetscLogEventEnd(PlayBall, ierr))
    155:   end if

    157:   PetscCallA(PetscLogEventBegin(Lessons, ierr))
    158:   PetscCallA(PetscLogFlops(72344d0, ierr))
    159:   PetscCallA(PetscSleep(0.5*second, ierr))
    160:   PetscCallA(PetscLogEventEnd(Lessons, ierr))

    162:   PetscCallA(PetscLogEventEnd(Afternoon, ierr))

    164:   if (.false.) then
    165:     continue
    166:   else if (role == TEACHER) then
    167:     PetscCallA(PetscLogEventBegin(TidyClass, ierr))
    168:     PetscCallA(PetscLogFlops(612300d0, ierr))
    169:     PetscCallA(PetscSleep(1.1*second, ierr))
    170:     PetscCallA(PetscLogEventEnd(TidyClass, ierr))
    171:     PetscCallA(PetscLogEventBegin(CorrectHomework, ierr))
    172:     PetscCallA(PetscLogFlops(234700d0, ierr))
    173:     PetscCallA(PetscSleep(1.1*second, ierr))
    174:     PetscCallA(PetscLogEventEnd(CorrectHomework, ierr))
    175:   else
    176:     PetscCallA(PetscLogEventBegin(SkipRope, ierr))
    177:     PetscCallA(PetscSleep(0.7*second, ierr))
    178:     PetscCallA(PetscLogEventEnd(SkipRope, ierr))
    179:     PetscCallA(PetscLogEventBegin(PlayBall, ierr))
    180:     PetscCallA(PetscSleep(0.8*second, ierr))
    181:     PetscCallA(PetscLogEventEnd(PlayBall, ierr))
    182:   end if

    184:   PetscCallA(PetscLogEventBegin(Lessons, ierr))
    185:   PetscCallA(PetscLogFlops(120000d0, ierr))
    186:   PetscCallA(PetscSleep(0.7*second, ierr))
    187:   PetscCallA(PetscLogEventEnd(Lessons, ierr))

    189:   PetscCallA(PetscSleep(0.25*second, ierr))

    191:   PetscCallA(PetscLogEventBegin(Morning, ierr))

    193:   PetscCallA(PetscLogFlops(190000d0, ierr))
    194:   PetscCallA(PetscSleep(0.5*second, ierr))

    196:   PetscCallA(PetscLogEventBegin(Lessons, ierr))
    197:   PetscCallA(PetscLogFlops(23000d0, ierr))
    198:   PetscCallA(PetscSleep(1*second, ierr))
    199:   if (size > 1) then
    200:     PetscCallMPIA(MPI_Isend(message, msgLen, MPIU_REAL, mod(rank + 1_PETSC_MPIINT_KIND, size), tagMsg + rank, PETSC_COMM_WORLD, req, ierr))
    201:     PetscCallMPIA(MPI_Recv(message, msgLen, MPIU_REAL, mod(rank - 1_PETSC_MPIINT_KIND + size, size), tagMsg + mod(rank - 1_PETSC_MPIINT_KIND + size, size), PETSC_COMM_WORLD, status, ierr))
    202:     PetscCallMPIA(MPI_Wait(req, MPI_STATUS_IGNORE, ierr))
    203:   end if
    204:   PetscCallA(PetscLogEventEnd(Lessons, ierr))

    206:   if (role == TEACHER) then
    207:     PetscCallA(PetscLogEventBegin(TidyClass, ierr))
    208:     PetscCallA(PetscLogFlops(600000d0, ierr))
    209:     PetscCallA(PetscSleep(1.2*second, ierr))
    210:     PetscCallA(PetscLogEventEnd(TidyClass, ierr))
    211:   else if (role == BOY) then
    212:     PetscCallA(PetscLogEventBegin(SkipRope, ierr))
    213:     PetscCallA(PetscSleep(0.8*second, ierr))
    214:     PetscCallA(PetscLogEventEnd(SkipRope, ierr))
    215:   else
    216:     PetscCallA(PetscLogEventBegin(PlayBall, ierr))
    217:     PetscCallA(PetscSleep(0.9*second, ierr))
    218:     PetscCallA(PetscLogEventEnd(PlayBall, ierr))
    219:   end if

    221:   PetscCallA(PetscLogEventBegin(Lessons, ierr))
    222:   PetscCallA(PetscLogFlops(120000d0, ierr))
    223:   PetscCallA(PetscSleep(0.7*second, ierr))
    224:   PetscCallA(PetscLogEventEnd(Lessons, ierr))

    226:   PetscCallA(PetscLogEventEnd(Morning, ierr))

    228:   deallocate (message)

    230:   PetscCallA(PetscFinalize(ierr))
    231: end program SchoolDay

    233: !/*TEST
    234: !
    235: ! testset:
    236: !   suffix: no_log
    237: !   requires: !defined(PETSC_USE_LOG)
    238: !   test:
    239: !     suffix: ascii
    240: !     args: -log_view ascii:filename.txt -log_all
    241: !   test:
    242: !     suffix: detail
    243: !     args: -log_view ascii:filename.txt:ascii_info_detail
    244: !   test:
    245: !     suffix: xml
    246: !     args: -log_view ascii:filename.xml:ascii_xml
    247: !
    248: ! testset:
    249: !   args: -log_view ascii:filename.txt
    250: !   output_file: output/empty.out
    251: !   requires: defined(PETSC_USE_LOG)
    252: !   test:
    253: !     suffix: 1
    254: !     nsize: 1
    255: !   test:
    256: !     suffix: 2
    257: !     nsize: 2
    258: !   test:
    259: !     suffix: 3
    260: !     nsize: 3
    261: !
    262: ! testset:
    263: !   suffix: detail
    264: !   args: -log_view ascii:filename.txt:ascii_info_detail
    265: !   output_file: output/empty.out
    266: !   requires: defined(PETSC_USE_LOG)
    267: !   test:
    268: !     suffix: 1
    269: !     nsize: 1
    270: !   test:
    271: !     suffix: 2
    272: !     nsize: 2
    273: !   test:
    274: !     suffix: 3
    275: !     nsize: 3
    276: !
    277: ! testset:
    278: !   suffix: xml
    279: !   args: -log_view ascii:filename.xml:ascii_xml
    280: !   output_file: output/empty.out
    281: !   requires: defined(PETSC_USE_LOG)
    282: !   test:
    283: !     suffix: 1
    284: !     nsize: 1
    285: !   test:
    286: !     suffix: 2
    287: !     nsize: 2
    288: !   test:
    289: !     suffix: 3
    290: !     nsize: 3
    291: !
    292: !TEST*/