1! 2! 3! Description: Demonstrates how users can augment the PETSc profiling by 4! inserting their own event logging. 5! 6 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 13 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 18 19 ! Codes 20 integer, parameter :: BOY=1, GIRL=2, TEACHER=0 21 PetscMPIInt, parameter :: tagMsg = 1200; 22 23 ! Timers 24 PetscLogEvent :: Morning, Afternoon 25 PetscLogEvent :: PlayBall, SkipRope 26 PetscLogEvent :: TidyClass 27 PetscLogEvent :: Lessons, CorrectHomework 28 PetscClassId classid 29 30 ! Petsc-stuff 31 PetscErrorCode :: ierr 32 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 40 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 45 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)) 50 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 58 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 endif 78 79! Go through the school day 80 PetscCallA(PetscLogEventBegin(Morning,ierr)) 81 82 PetscCallA(PetscLogFlops(190000d0,ierr)) 83 PetscCallA(PetscSleep(0.5*second,ierr)) 84 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)) 97 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 116 117 PetscCallA(PetscLogEventBegin(Lessons,ierr)) 118 PetscCallA(PetscLogFlops(120000d0,ierr)) 119 PetscCallA(PetscSleep(0.7*second, ierr)) 120 PetscCallA(PetscLogEventEnd(Lessons,ierr)) 121 122 PetscCallA(PetscLogEventEnd(Morning,ierr)) 123 124 PetscCallA(PetscLogEventBegin(Afternoon,ierr)) 125 126 item = rank*(3-rank) 127 PetscCallMPIA(MPI_Allreduce(item, maxItem, 1, MPI_INTEGER, MPI_MAX,PETSC_COMM_WORLD, ierr)) 128 ierr = PetscAReduce() 129 130 item = rank*(10-rank) 131 PetscCallMPIA(MPI_Allreduce(item, maxItem, 1, MPI_INTEGER, MPI_MAX,PETSC_COMM_WORLD, ierr)) 132 ierr = PetscAReduce() 133 134 PetscCallA(PetscLogFlops(58988d0,ierr)) 135 PetscCallA(PetscSleep(0.6*second,ierr)) 136 137 PetscCallA(PetscLogEventBegin(Lessons,ierr)) 138 PetscCallA(PetscLogFlops(123456d0,ierr)) 139 PetscCallA(PetscSleep(1*second, ierr)) 140 PetscCallA(PetscLogEventEnd(Lessons,ierr)) 141 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 160 161 PetscCallA(PetscLogEventBegin(Lessons,ierr)) 162 PetscCallA(PetscLogFlops(72344d0,ierr)) 163 PetscCallA(PetscSleep(0.5*second, ierr)) 164 PetscCallA(PetscLogEventEnd(Lessons,ierr)) 165 166 PetscCallA(PetscLogEventEnd(Afternoon,ierr)) 167 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 187 188 PetscCallA(PetscLogEventBegin(Lessons,ierr)) 189 PetscCallA(PetscLogFlops(120000d0,ierr)) 190 PetscCallA(PetscSleep(0.7*second, ierr)) 191 PetscCallA(PetscLogEventEnd(Lessons,ierr)) 192 193 PetscCallA(PetscSleep(0.25*second,ierr)) 194 195 PetscCallA(PetscLogEventBegin(Morning,ierr)) 196 197 PetscCallA(PetscLogFlops(190000d0,ierr)) 198 PetscCallA(PetscSleep(0.5*second,ierr)) 199 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)) 212 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 227 228 PetscCallA(PetscLogEventBegin(Lessons,ierr)) 229 PetscCallA(PetscLogFlops(120000d0,ierr)) 230 PetscCallA(PetscSleep(0.7*second, ierr)) 231 PetscCallA(PetscLogEventEnd(Lessons,ierr)) 232 233 PetscCallA(PetscLogEventEnd(Morning,ierr)) 234 235 deallocate(message) 236 237 PetscCallA(PetscFinalize(ierr)) 238 end program SchoolDay 239 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/ex3f90.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/ex3f90.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/ex3f90.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*/ 300