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             ! 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*/