1 /* $Id: petsclog.h,v 1.139 2000/04/09 03:11:53 bsmith Exp bsmith $ */ 2 3 /* 4 Defines profile/logging in PETSc. 5 */ 6 7 #if !defined(__PLOG_H) 8 #define __PLOG_H 9 #include "petsc.h" 10 11 /* 12 Lists all PETSc events that are logged/profiled. 13 14 If you add an event here, make sure you add it to 15 petsc/src/plog/src/plog.c, 16 petsc/src/plog/src/plogmpe.c, and 17 petsc/include/finclude/petsclog.h!!! 18 */ 19 #define MAT_Mult 0 20 #define MAT_MatrixFreeMult 1 21 #define MAT_AssemblyBegin 2 22 #define MAT_AssemblyEnd 3 23 #define MAT_GetOrdering 4 24 #define MAT_MultTranspose 5 25 #define MAT_MultAdd 6 26 #define MAT_MultTransposeAdd 7 27 #define MAT_LUFactor 8 28 #define MAT_CholeskyFactor 9 29 #define MAT_LUFactorSymbolic 10 30 #define MAT_ILUFactorSymbolic 11 31 #define MAT_CholeskyFactorSymbolic 12 32 #define MAT_IncompleteCholeskyFactorSymbolic 13 33 #define MAT_LUFactorNumeric 14 34 #define MAT_CholeskyFactorNumeric 15 35 #define MAT_Relax 16 36 #define MAT_Copy 17 37 #define MAT_Convert 18 38 #define MAT_Scale 19 39 #define MAT_ZeroEntries 20 40 #define MAT_Solve 21 41 #define MAT_SolveAdd 22 42 #define MAT_SolveTranspose 23 43 #define MAT_SolveTransposeAdd 24 44 #define MAT_SetValues 25 45 #define MAT_ForwardSolve 26 46 #define MAT_BackwardSolve 27 47 #define MAT_Load 28 48 #define MAT_View 29 49 #define MAT_ILUFactor 30 50 #define MAT_GetColoring 31 51 #define MAT_GetSubMatrices 32 52 #define MAT_GetValues 33 53 #define MAT_IncreaseOverlap 34 54 #define MAT_GetRow 35 55 #define MAT_Partitioning 36 56 57 #define VEC_ReduceArithmetic 37 58 #define VEC_ReduceCommunication 38 59 #define VEC_ScatterBarrier 39 60 #define VEC_ScatterCommunication 40 61 #define VEC_Norm 41 62 #define VEC_Max 42 63 #define VEC_Min 43 64 #define VEC_TDot 44 65 #define VEC_Scale 45 66 #define VEC_Copy 46 67 #define VEC_Set 47 68 #define VEC_AXPY 48 69 #define VEC_AYPX 49 70 #define VEC_Swap 50 71 #define VEC_WAXPY 51 72 #define VEC_AssemblyBegin 52 73 #define VEC_AssemblyEnd 53 74 #define VEC_MTDot 54 75 #define VEC_MDot 55 76 #define VEC_MAXPY 56 77 #define VEC_PMult 57 78 #define VEC_SetValues 58 79 #define VEC_Load 59 80 #define VEC_View 60 81 #define VEC_ScatterBegin 61 82 #define VEC_ScatterEnd 62 83 #define VEC_SetRandom 63 84 85 #define VEC_NormBarrier 64 86 #define VEC_NormComm 65 87 #define VEC_DotBarrier 66 88 #define VEC_DotComm 67 89 #define VEC_MDotBarrier 68 90 #define VEC_MDotComm 69 91 92 #define SLES_Solve 70 93 #define SLES_SetUp 71 94 95 #define KSP_GMRESOrthogonalization 72 96 97 #define PC_ModifySubMatrices 74 98 #define PC_SetUp 75 99 #define PC_SetUpOnBlocks 76 100 #define PC_Apply 77 101 #define PC_ApplySymmetricLeft 78 102 #define PC_ApplySymmetricRight 79 103 104 #define SNES_Solve 80 105 #define SNES_LineSearch 81 106 #define SNES_FunctionEval 82 107 #define SNES_JacobianEval 83 108 #define SNES_MinimizationFunctionEval 84 109 #define SNES_GradientEval 85 110 #define SNES_HessianEval 86 111 112 #define VEC_ReduceBarrier 87 113 #define VEC_ReduceCommOnly 88 114 #define VEC_Dot 89 115 116 #define TS_Step 90 117 #define TS_PseudoComputeTimeStep 91 118 #define TS_FunctionEval 92 119 #define TS_JacobianEval 93 120 121 #define Petsc_Barrier 100 122 123 #define EC_SetUp 105 124 #define EC_Solve 106 125 126 /* 127 Event numbers PLOG_USER_EVENT_LOW to PLOG_USER_EVENT_HIGH are reserved 128 for applications. Make sure that src/plog/src/plog.c defines enough 129 entries in (*name)[] to go up to PLOG_USER_EVENT_HIGH. 130 */ 131 #define PLOG_USER_EVENT_LOW_STATIC 120 132 #define PLOG_USER_EVENT_HIGH 200 133 134 /* Global flop counter */ 135 extern PLogDouble _TotalFlops; 136 137 /* General logging of information; different from event logging */ 138 extern int PLogInfo(void*,const char[],...); 139 extern int PLogInfoDeactivateClass(int); 140 extern int PLogInfoActivateClass(int); 141 extern int PLogPrintInfo; /* if 1, indicates PLogInfo() is turned on */ 142 143 #if defined(PETSC_USE_LOG) /* --- Logging is turned on --------------------------------*/ 144 145 /* 146 Flop counting: We count each arithmetic operation (e.g., addition, multiplication) separately. 147 148 For the complex numbers version, note that 149 1 complex addition = 2 flops 150 1 complex multiplication = 6 flops, 151 where we define 1 flop as that for a double precision scalar. We roughly approximate 152 flop counting for complex numbers by multiplying the total flops by 4; this corresponds 153 to the assumption that we're counting mostly additions and multiplications -- and 154 roughly the same number of each. More accurate counting could be done by distinguishing 155 among the various arithmetic operations. 156 */ 157 158 #if defined(PETSC_USE_COMPLEX) 159 #define PLogFlops(n) {_TotalFlops += (4*n);} 160 #else 161 #define PLogFlops(n) {_TotalFlops += (n);} 162 #endif 163 164 #if defined (PETSC_HAVE_MPE) 165 #include "mpe.h" 166 #define MPEBEGIN 1000 167 extern int PLogMPEBegin(void); 168 extern int PLogMPEDump(const char[]); 169 extern int UseMPE,PLogEventMPEFlags[]; 170 extern int PLogEventMPEActivate(int); 171 extern int PLogEventMPEDeactivate(int); 172 #else 173 #define PLogEventMPEActivate(a) 0 174 #define PLogEventMPEDeactivate(a) 0 175 #endif 176 177 extern int PLogEventActivate(int); 178 extern int PLogEventDeactivate(int); 179 180 extern int PLogEventActivateClass(int); 181 extern int PLogEventDeactivateClass(int); 182 183 extern PetscTruth PLogEventFlags[]; 184 extern int (*_PLogPLB)(int,int,PetscObject,PetscObject,PetscObject,PetscObject); 185 extern int (*_PLogPLE)(int,int,PetscObject,PetscObject,PetscObject,PetscObject); 186 extern int (*_PLogPHC)(PetscObject); 187 extern int (*_PLogPHD)(PetscObject); 188 189 extern int PLogEventDepth[]; 190 191 #if defined(PETSC_HAVE_MPE) 192 #define PLogEventBarrierBegin(e,o1,o2,o3,o4,cm) \ 193 { \ 194 if (_PLogPLB && PLogEventFlags[e]) { \ 195 PLogEventBegin((e),o1,o2,o3,o4); \ 196 if (UseMPE && PLogEventMPEFlags[(e)]) \ 197 MPE_Log_event(MPEBEGIN+2*(e),0,""); \ 198 MPI_Barrier(cm); \ 199 PLogEventEnd((e),o1,o2,o3,o4); \ 200 if (UseMPE && PLogEventMPEFlags[(e)]) \ 201 MPE_Log_event(MPEBEGIN+2*((e)+1),0,""); \ 202 } \ 203 PLogEventBegin(e+1,o1,o2,o3,o4); \ 204 if (UseMPE && PLogEventMPEFlags[(e)+1])\ 205 MPE_Log_event(MPEBEGIN+2*((e)+1),0,"");\ 206 } 207 #define PLogEventBegin(e,o1,o2,o3,o4) \ 208 { \ 209 if (_PLogPLB && PLogEventFlags[(e)] && !PLogEventDepth[e]++) {\ 210 (*_PLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));}\ 211 if (UseMPE && PLogEventMPEFlags[(e)])\ 212 MPE_Log_event(MPEBEGIN+2*(e),0,"");\ 213 } 214 #else 215 #define PLogEventBarrierBegin(e,o1,o2,o3,o4,cm) \ 216 { \ 217 if (_PLogPLB && PLogEventFlags[(e)]) { \ 218 PLogEventBegin((e),o1,o2,o3,o4); \ 219 MPI_Barrier(cm); \ 220 PLogEventEnd((e),o1,o2,o3,o4); \ 221 } \ 222 PLogEventBegin((e)+1,o1,o2,o3,o4); \ 223 } 224 #define PLogEventBegin(e,o1,o2,o3,o4) \ 225 { \ 226 if (_PLogPLB && PLogEventFlags[(e)] && !PLogEventDepth[e]++) {\ 227 (*_PLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));}\ 228 } 229 #endif 230 231 #if defined(PETSC_HAVE_MPE) 232 #define PLogEventBarrierEnd(e,o1,o2,o3,o4,cm) {\ 233 if (_PLogPLE && PLogEventFlags[(e)+1]) \ 234 (*_PLogPLE)((e)+1,0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 235 if (UseMPE && PLogEventMPEFlags[(e)+1])\ 236 MPE_Log_event(MPEBEGIN+2*((e)+1)+1,0,"");\ 237 } 238 #define PLogEventEnd(e,o1,o2,o3,o4) {\ 239 if (_PLogPLE && PLogEventFlags[(e)] && !--PLogEventDepth[e]) {\ 240 (*_PLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));}\ 241 if (UseMPE && PLogEventMPEFlags[(e)])\ 242 MPE_Log_event(MPEBEGIN+2*(e)+1,0,"");\ 243 } 244 #else 245 #define PLogEventBarrierEnd(e,o1,o2,o3,o4,cm) {\ 246 if (_PLogPLE && PLogEventFlags[(e)+1]) {\ 247 (*_PLogPLE)((e)+1,0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));} \ 248 } 249 #define PLogEventEnd(e,o1,o2,o3,o4) {\ 250 if (_PLogPLE && PLogEventFlags[(e)] && !--PLogEventDepth[e]) {\ 251 (*_PLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));}\ 252 } 253 #endif 254 255 #define PLogObjectParent(p,c) if (c) {PetscValidHeader((PetscObject)(c)); \ 256 PetscValidHeader((PetscObject)(p));\ 257 ((PetscObject)(c))->parent = (PetscObject)(p);\ 258 ((PetscObject)(c))->parentid = ((PetscObject)p)->id;} 259 #define PLogObjectParents(p,n,d) {int _i; for (_i=0; _i<n; _i++) \ 260 PLogObjectParent(p,(d)[_i]);} 261 #define PLogObjectCreate(h) {if (_PLogPHC) (*_PLogPHC)((PetscObject)h);} 262 #define PLogObjectDestroy(h) {if (_PLogPHD) (*_PLogPHD)((PetscObject)h);} 263 #define PLogObjectMemory(p,m) {PetscValidHeader((PetscObject)p);\ 264 ((PetscObject)(p))->mem += (m);} 265 extern int PLogObjectState(PetscObject,const char[],...); 266 extern int PLogDestroy(void); 267 extern int PLogStagePush(int); 268 extern int PLogStagePop(void); 269 extern int PLogStageRegister(int,const char[]); 270 extern int PLogPrintSummary(MPI_Comm,const char[]); 271 extern int PLogBegin(void); 272 extern int PLogTraceBegin(FILE *); 273 extern int PLogAllBegin(void); 274 extern int PLogSet(int (*)(int,int,PetscObject,PetscObject,PetscObject,PetscObject), 275 int (*)(int,int,PetscObject,PetscObject,PetscObject,PetscObject)); 276 extern int PLogDump(const char[]); 277 extern int PLogEventRegister(int*,const char[],const char[]); 278 extern int PetscGetFlops(PLogDouble*); 279 280 extern PLogDouble irecv_ct,isend_ct,wait_ct,wait_any_ct,recv_ct,send_ct; 281 extern PLogDouble irecv_len,isend_len,recv_len,send_len; 282 extern PLogDouble wait_all_ct,allreduce_ct,sum_of_waits_ct; 283 extern int PETSC_DUMMY,PETSC_DUMMY_SIZE; 284 285 /* 286 This does not work for MPI-Uni because our src/mpiuni/mpi.h file 287 uses macros to defined the MPI operations. 288 289 It does not work correctly from HP-UX because it processes the 290 macros in a way that sometimes it double counts, hence 291 PETSC_HAVE_BROKEN_RECURSIVE_MACRO 292 293 It does not work with Windows NT because winmpich lacks MPI_Type_size() 294 */ 295 #if !defined(USING_MPIUNI) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE) 296 /* 297 Logging of MPI activities 298 */ 299 300 #define TypeSize(buff,count,type) \ 301 (\ 302 MPI_Type_size(type,&PETSC_DUMMY_SIZE),buff += ((PLogDouble) ((count)*PETSC_DUMMY_SIZE)) \ 303 ) 304 305 #define MPI_Irecv(buf,count, datatype,source,tag,comm,request) \ 306 (\ 307 PETSC_DUMMY = MPI_Irecv(buf,count, datatype,source,tag,comm,request), \ 308 irecv_ct++,TypeSize(irecv_len,count,datatype),PETSC_DUMMY \ 309 ) 310 311 #define MPI_Isend(buf,count, datatype,dest,tag,comm,request) \ 312 (\ 313 PETSC_DUMMY = MPI_Isend(buf,count, datatype,dest,tag,comm,request), \ 314 isend_ct++, TypeSize(isend_len,count,datatype),PETSC_DUMMY \ 315 ) 316 317 #define MPI_Startall_irecv(count,number,requests) \ 318 (\ 319 PETSC_DUMMY = MPI_Startall(number,requests), \ 320 irecv_ct += (PLogDouble)(number),irecv_len += ((PLogDouble) (count*sizeof(Scalar))),PETSC_DUMMY \ 321 ) 322 323 #define MPI_Startall_isend(count,number,requests) \ 324 (\ 325 PETSC_DUMMY = MPI_Startall(number,requests), \ 326 isend_ct += (PLogDouble)(number),isend_len += ((PLogDouble) (count*sizeof(Scalar))),PETSC_DUMMY \ 327 ) 328 329 #define MPI_Start_isend(count, requests)\ 330 (\ 331 PETSC_DUMMY = MPI_Start(requests),\ 332 isend_ct++,isend_len += ((PLogDouble) (count*sizeof(Scalar))),PETSC_DUMMY\ 333 ) 334 335 #define MPI_Recv(buf,count, datatype,source,tag,comm,status) \ 336 (\ 337 PETSC_DUMMY = MPI_Recv(buf,count, datatype,source,tag,comm,status), \ 338 recv_ct++,TypeSize(recv_len,count,datatype),PETSC_DUMMY \ 339 ) 340 341 #define MPI_Send(buf,count, datatype,dest,tag,comm) \ 342 (\ 343 PETSC_DUMMY = MPI_Send(buf,count, datatype,dest,tag,comm), \ 344 send_ct++, TypeSize(send_len,count,datatype),PETSC_DUMMY \ 345 ) 346 347 #define MPI_Wait(request,status) \ 348 (\ 349 wait_ct++,sum_of_waits_ct++, \ 350 MPI_Wait(request,status) \ 351 ) 352 353 #define MPI_Waitany(a,b,c,d) \ 354 (\ 355 wait_any_ct++,sum_of_waits_ct++,\ 356 MPI_Waitany(a,b,c,d) \ 357 ) 358 359 #define MPI_Waitall(count,array_of_requests,array_of_statuses) \ 360 (\ 361 wait_all_ct++,sum_of_waits_ct += (PLogDouble) (count), \ 362 MPI_Waitall(count,array_of_requests,array_of_statuses) \ 363 ) 364 365 #define MPI_Allreduce(sendbuf, recvbuf,count,datatype,op,comm) \ 366 (\ 367 allreduce_ct++,MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm)\ 368 ) 369 370 #else 371 372 #define MPI_Startall_irecv(count,number,requests) \ 373 (\ 374 MPI_Startall(number,requests) \ 375 ) 376 377 #define MPI_Startall_isend(count,number,requests) \ 378 (\ 379 MPI_Startall(number,requests) \ 380 ) 381 382 #define MPI_Start_isend(count, requests) \ 383 (\ 384 MPI_Start(requests) \ 385 ) 386 387 #endif /* !USING_MPIUNI && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */ 388 389 #else /* ---Logging is turned off --------------------------------------------*/ 390 391 #define PLogFlops(n) 392 393 /* 394 With logging turned off, then MPE has to be turned off 395 */ 396 #define MPEBEGIN 1000 397 #define PLogMPEBegin() 398 #define PLogMPEDump(a) 0 399 #define PLogEventMPEActivate(a) 0 400 #define PLogEventMPEDeactivate(a) 0 401 402 #define PLogEventActivate(a) 0 403 #define PLogEventDeactivate(a) 0 404 405 #define PLogEventActivateClass(a) 0 406 #define PLogEventDeactivateClass(a) 0 407 408 #define _PLogPLB 0 409 #define _PLogPLE 0 410 #define _PLogPHC 0 411 #define _PLogPHD 0 412 #define PetscGetFlops(a) (*(a) = 0.0,0) 413 #define PLogEventBegin(e,o1,o2,o3,o4) 414 #define PLogEventEnd(e,o1,o2,o3,o4) 415 #define PLogEventBarrierBegin(e,o1,o2,o3,o4,cm) 416 #define PLogEventBarrierEnd(e,o1,o2,o3,o4,cm) 417 #define PLogObjectParent(p,c) 418 #define PLogObjectParents(p,n,c) 419 #define PLogObjectCreate(h) 420 #define PLogObjectDestroy(h) 421 #define PLogObjectMemory(p,m) 422 #define PLogDestroy() 0 423 #define PLogStagePush(a) 0 424 #define PLogStagePop() 0 425 #define PLogStageRegister(a,b) 0 426 #define PLogPrintSummary(comm,file) 0 427 #define PLogBegin() 0 428 #define PLogTraceBegin(file) 0 429 #define PLogSet(lb,le) 0 430 #define PLogAllBegin() 0 431 #define PLogDump(c) 0 432 #define PLogEventRegister(a,b,c) 0 433 extern int PLogObjectState(PetscObject,const char[],...); 434 435 /* If PETSC_USE_LOG is NOT defined, these still need to be! */ 436 #define MPI_Startall_irecv(count,number,requests) MPI_Startall(number,requests) 437 438 #define MPI_Startall_isend(count,number,requests) MPI_Startall(number,requests) 439 440 #define MPI_Start_isend(count,requests) MPI_Start(requests) 441 442 #endif /* PETSC_USE_LOG */ 443 444 #define PreLoadBegin(flag,name) {PetscTruth PreLoading = flag; int PreLoadMax,PreLoadIt,__ierr;\ 445 __ierr = OptionsGetLogical(PETSC_NULL,"-preload",&PreLoading,PETSC_NULL);CHKERRQ(__ierr);\ 446 PreLoadMax = (int)(PreLoading);\ 447 for (PreLoadIt=0; PreLoadIt<=PreLoadMax; PreLoadIt++) {\ 448 __ierr = PetscBarrier(PETSC_NULL);CHKERRQ(__ierr);\ 449 __ierr = PLogStagePush(PETSC_DETERMINE);CHKERRQ(__ierr);\ 450 __ierr = PLogStageRegister(PETSC_DETERMINE,name);CHKERRQ(__ierr); 451 #define PreLoadEnd() __ierr = PLogStagePop();CHKERRQ(__ierr);PreLoading = PETSC_FALSE;}} 452 #define PreLoadStage(name) __ierr = PLogStagePop();CHKERRQ(__ierr);\ 453 __ierr = PLogStagePush(PETSC_DETERMINE);CHKERRQ(__ierr);\ 454 __ierr = PLogStageRegister(PETSC_DETERMINE,name);CHKERRQ(__ierr); 455 456 #endif 457 458 459 460 461 462 463