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