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: !
7: program SchoolDay
8: #include <petsc/finclude/petscsys.h>
9: #include <petsc/finclude/petsclog.h>
10: use petscmpi ! or mpi or mpi_f08
11: use petscsys
12: implicit none
14: ! Settings:
15: integer, parameter :: verbose = 0 ! 0: silent, >=1 : increasing amount of debugging output
16: integer, parameter :: msgLen = 30 ! number of reals which is sent with MPI_Isend
17: PetscReal, parameter :: second = 0.1 ! time is sped up by a factor 10
19: ! Codes
20: integer, parameter :: BOY = 1, GIRL = 2, TEACHER = 0
21: PetscMPIInt, parameter :: tagMsg = 1200
23: ! Timers
24: PetscLogEvent :: Morning, Afternoon
25: PetscLogEvent :: PlayBall, SkipRope
26: PetscLogEvent :: TidyClass
27: PetscLogEvent :: Lessons, CorrectHomework
28: PetscClassId classid
30: ! Petsc-stuff
31: PetscErrorCode :: ierr
33: ! MPI-stuff
34: PetscMPIInt :: rank, size
35: PetscReal, allocatable :: message(:, :)
36: integer :: item, maxItem
37: integer4 :: status(MPI_STATUS_SIZE)
38: PetscMPIInt req
39: integer(c_int) msgLen_c_int
41: ! Own stuff
42: integer4 :: role ! is this process a BOY, a GIRL or a TEACHER?
43: integer4 :: i, j
44: integer4, parameter :: one = 1
46: ! Initializations
47: PetscCallA(PetscInitialize(ierr))
48: PetscCallMPIA(MPI_Comm_size(PETSC_COMM_WORLD, size, ierr))
49: PetscCallMPIA(MPI_Comm_rank(PETSC_COMM_WORLD, rank, ierr))
51: if (rank == 0) then
52: role = TEACHER
53: else if (rank < 0.4*size) then
54: role = GIRL
55: else
56: role = BOY
57: end if
59: allocate (message(msgLen, msglen))
60: do i = 1, msgLen
61: do j = 1, msgLen
62: message(i, j) = 10.0*j + i*1.0/(rank + one)
63: end do
64: end do
65: !
66: ! Create new user-defined events
67: classid = 0
68: PetscCallA(PetscLogEventRegister('Morning', classid, Morning, ierr))
69: PetscCallA(PetscLogEventRegister('Afternoon', classid, Afternoon, ierr))
70: PetscCallA(PetscLogEventRegister('Play Ball', classid, PlayBall, ierr))
71: PetscCallA(PetscLogEventRegister('Skip Rope', classid, SkipRope, ierr))
72: PetscCallA(PetscLogEventRegister('Tidy Classroom', classid, TidyClass, ierr))
73: PetscCallA(PetscLogEventRegister('Lessons', classid, Lessons, ierr))
74: PetscCallA(PetscLogEventRegister('Correct Homework', classid, CorrectHomework, ierr))
75: if (verbose >= 1) then
76: print '(a,i0,a)', '[', rank, '] SchoolDay events have been defined'
77: end if
79: ! Go through the school day
80: PetscCallA(PetscLogEventBegin(Morning, ierr))
82: PetscCallA(PetscLogFlops(190000d0, ierr))
83: PetscCallA(PetscSleep(0.5*second, ierr))
85: PetscCallA(PetscLogEventBegin(Lessons, ierr))
86: PetscCallA(PetscLogFlops(23000d0, ierr))
87: PetscCallA(PetscSleep(1*second, ierr))
88: if (size > 1) then
89: PetscCallMPIA(MPI_Isend(message, msgLen, MPI_DOUBLE_PRECISION, mod(rank + 1, size), tagMsg + rank, PETSC_COMM_WORLD, req, ierr))
90: PetscCallMPIA(MPI_Recv(message, msgLen, MPI_DOUBLE_PRECISION, mod(rank - 1 + size, size), tagMsg + mod(rank - 1 + size, size), PETSC_COMM_WORLD, status, ierr))
91: PetscCallMPIA(MPI_Wait(req, MPI_STATUS_IGNORE, ierr))
92: msgLen_c_int = msgLen
93: ierr = PetscASend(msgLen_c_int, MPI_DOUBLE_PRECISION)
94: ierr = PetscARecv(msgLen_c_int, MPI_DOUBLE_PRECISION)
95: end if
96: PetscCallA(PetscLogEventEnd(Lessons, ierr))
98: if (role == TEACHER) then
99: PetscCallA(PetscLogEventBegin(TidyClass, ierr))
100: PetscCallA(PetscLogFlops(600000d0, ierr))
101: PetscCallA(PetscSleep(0.6*second, ierr))
102: PetscCallA(PetscLogEventBegin(CorrectHomework, ierr))
103: PetscCallA(PetscLogFlops(234700d0, ierr))
104: PetscCallA(PetscSleep(0.4*second, ierr))
105: PetscCallA(PetscLogEventEnd(CorrectHomework, ierr))
106: PetscCallA(PetscLogEventEnd(TidyClass, ierr))
107: else if (role == BOY) then
108: PetscCallA(PetscLogEventBegin(SkipRope, ierr))
109: PetscCallA(PetscSleep(0.8*second, ierr))
110: PetscCallA(PetscLogEventEnd(SkipRope, ierr))
111: else
112: PetscCallA(PetscLogEventBegin(PlayBall, ierr))
113: PetscCallA(PetscSleep(0.9*second, ierr))
114: PetscCallA(PetscLogEventEnd(PlayBall, ierr))
115: end if
117: PetscCallA(PetscLogEventBegin(Lessons, ierr))
118: PetscCallA(PetscLogFlops(120000d0, ierr))
119: PetscCallA(PetscSleep(0.7*second, ierr))
120: PetscCallA(PetscLogEventEnd(Lessons, ierr))
122: PetscCallA(PetscLogEventEnd(Morning, ierr))
124: PetscCallA(PetscLogEventBegin(Afternoon, ierr))
126: item = rank*(3 - rank)
127: PetscCallMPIA(MPI_Allreduce(item, maxItem, 1, MPI_INTEGER, MPI_MAX, PETSC_COMM_WORLD, ierr))
128: ierr = PetscAReduce()
130: item = rank*(10 - rank)
131: PetscCallMPIA(MPI_Allreduce(item, maxItem, 1, MPI_INTEGER, MPI_MAX, PETSC_COMM_WORLD, ierr))
132: ierr = PetscAReduce()
134: PetscCallA(PetscLogFlops(58988d0, ierr))
135: PetscCallA(PetscSleep(0.6*second, ierr))
137: PetscCallA(PetscLogEventBegin(Lessons, ierr))
138: PetscCallA(PetscLogFlops(123456d0, ierr))
139: PetscCallA(PetscSleep(1*second, ierr))
140: PetscCallA(PetscLogEventEnd(Lessons, ierr))
142: if (role == TEACHER) then
143: PetscCallA(PetscLogEventBegin(TidyClass, ierr))
144: PetscCallA(PetscLogFlops(17800d0, ierr))
145: PetscCallA(PetscSleep(1.1*second, ierr))
146: PetscCallA(PetscLogEventBegin(Lessons, ierr))
147: PetscCallA(PetscLogFlops(72344d0, ierr))
148: PetscCallA(PetscSleep(0.5*second, ierr))
149: PetscCallA(PetscLogEventEnd(Lessons, ierr))
150: PetscCallA(PetscLogEventEnd(TidyClass, ierr))
151: else if (role == GIRL) then
152: PetscCallA(PetscLogEventBegin(SkipRope, ierr))
153: PetscCallA(PetscSleep(0.7*second, ierr))
154: PetscCallA(PetscLogEventEnd(SkipRope, ierr))
155: else
156: PetscCallA(PetscLogEventBegin(PlayBall, ierr))
157: PetscCallA(PetscSleep(0.8*second, ierr))
158: PetscCallA(PetscLogEventEnd(PlayBall, ierr))
159: end if
161: PetscCallA(PetscLogEventBegin(Lessons, ierr))
162: PetscCallA(PetscLogFlops(72344d0, ierr))
163: PetscCallA(PetscSleep(0.5*second, ierr))
164: PetscCallA(PetscLogEventEnd(Lessons, ierr))
166: PetscCallA(PetscLogEventEnd(Afternoon, ierr))
168: if (.false.) then
169: continue
170: else if (role == TEACHER) then
171: PetscCallA(PetscLogEventBegin(TidyClass, ierr))
172: PetscCallA(PetscLogFlops(612300d0, ierr))
173: PetscCallA(PetscSleep(1.1*second, ierr))
174: PetscCallA(PetscLogEventEnd(TidyClass, ierr))
175: PetscCallA(PetscLogEventBegin(CorrectHomework, ierr))
176: PetscCallA(PetscLogFlops(234700d0, ierr))
177: PetscCallA(PetscSleep(1.1*second, ierr))
178: PetscCallA(PetscLogEventEnd(CorrectHomework, ierr))
179: else
180: PetscCallA(PetscLogEventBegin(SkipRope, ierr))
181: PetscCallA(PetscSleep(0.7*second, ierr))
182: PetscCallA(PetscLogEventEnd(SkipRope, ierr))
183: PetscCallA(PetscLogEventBegin(PlayBall, ierr))
184: PetscCallA(PetscSleep(0.8*second, ierr))
185: PetscCallA(PetscLogEventEnd(PlayBall, ierr))
186: end if
188: PetscCallA(PetscLogEventBegin(Lessons, ierr))
189: PetscCallA(PetscLogFlops(120000d0, ierr))
190: PetscCallA(PetscSleep(0.7*second, ierr))
191: PetscCallA(PetscLogEventEnd(Lessons, ierr))
193: PetscCallA(PetscSleep(0.25*second, ierr))
195: PetscCallA(PetscLogEventBegin(Morning, ierr))
197: PetscCallA(PetscLogFlops(190000d0, ierr))
198: PetscCallA(PetscSleep(0.5*second, ierr))
200: PetscCallA(PetscLogEventBegin(Lessons, ierr))
201: PetscCallA(PetscLogFlops(23000d0, ierr))
202: PetscCallA(PetscSleep(1*second, ierr))
203: if (size > 1) then
204: PetscCallMPIA(MPI_Isend(message, msgLen, MPI_DOUBLE_PRECISION, mod(rank + 1, size), tagMsg + rank, PETSC_COMM_WORLD, req, ierr))
205: PetscCallMPIA(MPI_Recv(message, msgLen, MPI_DOUBLE_PRECISION, mod(rank - 1 + size, size), tagMsg + mod(rank - 1 + size, size), PETSC_COMM_WORLD, status, ierr))
206: PetscCallMPIA(MPI_Wait(req, MPI_STATUS_IGNORE, ierr))
207: msgLen_c_int = msgLen
208: ierr = PetscASend(msgLen_c_int, MPI_DOUBLE_PRECISION)
209: ierr = PetscARecv(msgLen_c_int, MPI_DOUBLE_PRECISION)
210: end if
211: PetscCallA(PetscLogEventEnd(Lessons, ierr))
213: if (role == TEACHER) then
214: PetscCallA(PetscLogEventBegin(TidyClass, ierr))
215: PetscCallA(PetscLogFlops(600000d0, ierr))
216: PetscCallA(PetscSleep(1.2*second, ierr))
217: PetscCallA(PetscLogEventEnd(TidyClass, ierr))
218: else if (role == BOY) then
219: PetscCallA(PetscLogEventBegin(SkipRope, ierr))
220: PetscCallA(PetscSleep(0.8*second, ierr))
221: PetscCallA(PetscLogEventEnd(SkipRope, ierr))
222: else
223: PetscCallA(PetscLogEventBegin(PlayBall, ierr))
224: PetscCallA(PetscSleep(0.9*second, ierr))
225: PetscCallA(PetscLogEventEnd(PlayBall, ierr))
226: end if
228: PetscCallA(PetscLogEventBegin(Lessons, ierr))
229: PetscCallA(PetscLogFlops(120000d0, ierr))
230: PetscCallA(PetscSleep(0.7*second, ierr))
231: PetscCallA(PetscLogEventEnd(Lessons, ierr))
233: PetscCallA(PetscLogEventEnd(Morning, ierr))
235: deallocate (message)
237: PetscCallA(PetscFinalize(ierr))
238: end program SchoolDay
240: !/*TEST
241: !
242: ! testset:
243: ! suffix: no_log
244: ! requires: !defined(PETSC_USE_LOG)
245: ! test:
246: ! suffix: ascii
247: ! args: -log_view ascii:filename.txt -log_all
248: ! test:
249: ! suffix: detail
250: ! args: -log_view ascii:filename.txt:ascii_info_detail
251: ! test:
252: ! suffix: xml
253: ! args: -log_view ascii:filename.xml:ascii_xml
254: !
255: ! testset:
256: ! args: -log_view ascii:filename.txt
257: ! output_file: output/empty.out
258: ! requires: defined(PETSC_USE_LOG)
259: ! test:
260: ! suffix: 1
261: ! nsize: 1
262: ! test:
263: ! suffix: 2
264: ! nsize: 2
265: ! test:
266: ! suffix: 3
267: ! nsize: 3
268: !
269: ! testset:
270: ! suffix: detail
271: ! args: -log_view ascii:filename.txt:ascii_info_detail
272: ! output_file: output/empty.out
273: ! requires: defined(PETSC_USE_LOG)
274: ! test:
275: ! suffix: 1
276: ! nsize: 1
277: ! test:
278: ! suffix: 2
279: ! nsize: 2
280: ! test:
281: ! suffix: 3
282: ! nsize: 3
283: !
284: ! testset:
285: ! suffix: xml
286: ! args: -log_view ascii:filename.xml:ascii_xml
287: ! output_file: output/empty.out
288: ! requires: defined(PETSC_USE_LOG)
289: ! test:
290: ! suffix: 1
291: ! nsize: 1
292: ! test:
293: ! suffix: 2
294: ! nsize: 2
295: ! test:
296: ! suffix: 3
297: ! nsize: 3
298: !
299: !TEST*/