1 2 /* 3 PETSc code to log object creation and destruction and PETSc events. 4 5 This provides the public API used by the rest of PETSc and by users. 6 7 These routines use a private API that is not used elsewhere in PETSc and is not 8 accessible to users. The private API is defined in logimpl.h and the utils directory. 9 10 */ 11 #include <petsc/private/logimpl.h> /*I "petscsys.h" I*/ 12 #include <petsctime.h> 13 #include <petscviewer.h> 14 15 PetscErrorCode PetscLogObjectParent(PetscObject p,PetscObject c) 16 { 17 if (!c || !p) return 0; 18 c->parent = p; 19 c->parentid = p->id; 20 return 0; 21 } 22 23 /*@C 24 PetscLogObjectMemory - Adds to an object a count of additional amount of memory that is used by the object. 25 26 Not collective. 27 28 Input Parameters: 29 + obj - the PETSc object 30 - mem - the amount of memory that is being added to the object 31 32 Level: developer 33 34 Developer Notes: Currently we do not always do a good job of associating all memory allocations with an object. 35 36 .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs(), PetscInitializeNoArguments() 37 38 @*/ 39 PetscErrorCode PetscLogObjectMemory(PetscObject p,PetscLogDouble m) 40 { 41 if (!p) return 0; 42 p->mem += m; 43 return 0; 44 } 45 46 PetscLogEvent PETSC_LARGEST_EVENT = PETSC_EVENT; 47 48 #if defined(PETSC_USE_LOG) 49 #include <petscmachineinfo.h> 50 #include <petscconfiginfo.h> 51 52 /* used in the MPI_XXX() count macros in petsclog.h */ 53 54 /* Action and object logging variables */ 55 Action *petsc_actions = NULL; 56 Object *petsc_objects = NULL; 57 PetscBool petsc_logActions = PETSC_FALSE; 58 PetscBool petsc_logObjects = PETSC_FALSE; 59 int petsc_numActions = 0, petsc_maxActions = 100; 60 int petsc_numObjects = 0, petsc_maxObjects = 100; 61 int petsc_numObjectsDestroyed = 0; 62 63 /* Global counters */ 64 PetscLogDouble petsc_BaseTime = 0.0; 65 PetscLogDouble petsc_TotalFlops = 0.0; /* The number of flops */ 66 PetscLogDouble petsc_tmp_flops = 0.0; /* The incremental number of flops */ 67 PetscLogDouble petsc_send_ct = 0.0; /* The number of sends */ 68 PetscLogDouble petsc_recv_ct = 0.0; /* The number of receives */ 69 PetscLogDouble petsc_send_len = 0.0; /* The total length of all sent messages */ 70 PetscLogDouble petsc_recv_len = 0.0; /* The total length of all received messages */ 71 PetscLogDouble petsc_isend_ct = 0.0; /* The number of immediate sends */ 72 PetscLogDouble petsc_irecv_ct = 0.0; /* The number of immediate receives */ 73 PetscLogDouble petsc_isend_len = 0.0; /* The total length of all immediate send messages */ 74 PetscLogDouble petsc_irecv_len = 0.0; /* The total length of all immediate receive messages */ 75 PetscLogDouble petsc_wait_ct = 0.0; /* The number of waits */ 76 PetscLogDouble petsc_wait_any_ct = 0.0; /* The number of anywaits */ 77 PetscLogDouble petsc_wait_all_ct = 0.0; /* The number of waitalls */ 78 PetscLogDouble petsc_sum_of_waits_ct = 0.0; /* The total number of waits */ 79 PetscLogDouble petsc_allreduce_ct = 0.0; /* The number of reductions */ 80 PetscLogDouble petsc_gather_ct = 0.0; /* The number of gathers and gathervs */ 81 PetscLogDouble petsc_scatter_ct = 0.0; /* The number of scatters and scattervs */ 82 83 /* Logging functions */ 84 PetscErrorCode (*PetscLogPHC)(PetscObject) = NULL; 85 PetscErrorCode (*PetscLogPHD)(PetscObject) = NULL; 86 PetscErrorCode (*PetscLogPLB)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject) = NULL; 87 PetscErrorCode (*PetscLogPLE)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject) = NULL; 88 89 /* Tracing event logging variables */ 90 FILE *petsc_tracefile = NULL; 91 int petsc_tracelevel = 0; 92 const char *petsc_traceblanks = " "; 93 char petsc_tracespace[128] = " "; 94 PetscLogDouble petsc_tracetime = 0.0; 95 static PetscBool PetscLogInitializeCalled = PETSC_FALSE; 96 97 /*---------------------------------------------- General Functions --------------------------------------------------*/ 98 /*@C 99 PetscLogDestroy - Destroys the object and event logging data and resets the global counters. 100 101 Not Collective 102 103 Notes: 104 This routine should not usually be used by programmers. Instead employ 105 PetscLogStagePush() and PetscLogStagePop(). 106 107 Level: developer 108 109 .keywords: log, destroy 110 .seealso: PetscLogDump(), PetscLogAllBegin(), PetscLogView(), PetscLogStagePush(), PlogStagePop() 111 @*/ 112 PetscErrorCode PetscLogDestroy(void) 113 { 114 PetscStageLog stageLog; 115 PetscErrorCode ierr; 116 117 PetscFunctionBegin; 118 ierr = PetscFree(petsc_actions);CHKERRQ(ierr); 119 ierr = PetscFree(petsc_objects);CHKERRQ(ierr); 120 ierr = PetscLogSet(NULL, NULL);CHKERRQ(ierr); 121 122 /* Resetting phase */ 123 ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 124 ierr = PetscStageLogDestroy(stageLog);CHKERRQ(ierr); 125 126 petsc_TotalFlops = 0.0; 127 petsc_numActions = 0; 128 petsc_numObjects = 0; 129 petsc_numObjectsDestroyed = 0; 130 petsc_maxActions = 100; 131 petsc_maxObjects = 100; 132 petsc_actions = NULL; 133 petsc_objects = NULL; 134 petsc_logActions = PETSC_FALSE; 135 petsc_logObjects = PETSC_FALSE; 136 petsc_BaseTime = 0.0; 137 petsc_TotalFlops = 0.0; 138 petsc_tmp_flops = 0.0; 139 petsc_send_ct = 0.0; 140 petsc_recv_ct = 0.0; 141 petsc_send_len = 0.0; 142 petsc_recv_len = 0.0; 143 petsc_isend_ct = 0.0; 144 petsc_irecv_ct = 0.0; 145 petsc_isend_len = 0.0; 146 petsc_irecv_len = 0.0; 147 petsc_wait_ct = 0.0; 148 petsc_wait_any_ct = 0.0; 149 petsc_wait_all_ct = 0.0; 150 petsc_sum_of_waits_ct = 0.0; 151 petsc_allreduce_ct = 0.0; 152 petsc_gather_ct = 0.0; 153 petsc_scatter_ct = 0.0; 154 PETSC_LARGEST_EVENT = PETSC_EVENT; 155 PetscLogPHC = NULL; 156 PetscLogPHD = NULL; 157 petsc_tracefile = NULL; 158 petsc_tracelevel = 0; 159 petsc_traceblanks = " "; 160 petsc_tracespace[0] = ' '; petsc_tracespace[1] = 0; 161 petsc_tracetime = 0.0; 162 PETSC_LARGEST_CLASSID = PETSC_SMALLEST_CLASSID; 163 PETSC_OBJECT_CLASSID = 0; 164 petsc_stageLog = 0; 165 PetscLogInitializeCalled = PETSC_FALSE; 166 PetscFunctionReturn(0); 167 } 168 169 /*@C 170 PetscLogSet - Sets the logging functions called at the beginning and ending of every event. 171 172 Not Collective 173 174 Input Parameters: 175 + b - The function called at beginning of event 176 - e - The function called at end of event 177 178 Level: developer 179 180 .seealso: PetscLogDump(), PetscLogDefaultBegin(), PetscLogAllBegin(), PetscLogTraceBegin() 181 @*/ 182 PetscErrorCode PetscLogSet(PetscErrorCode (*b)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject), 183 PetscErrorCode (*e)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject)) 184 { 185 PetscFunctionBegin; 186 PetscLogPLB = b; 187 PetscLogPLE = e; 188 PetscFunctionReturn(0); 189 } 190 191 /*------------------------------------------- Initialization Functions ----------------------------------------------*/ 192 /* 193 The data structures for logging are always created even if no logging is turned on. This is so events etc can 194 be registered in the code before the actually logging is turned on. 195 */ 196 PetscErrorCode PetscLogInitialize(void) 197 { 198 int stage; 199 PetscBool opt; 200 PetscErrorCode ierr; 201 202 PetscFunctionBegin; 203 if (PetscLogInitializeCalled) PetscFunctionReturn(0); 204 PetscLogInitializeCalled = PETSC_TRUE; 205 206 ierr = PetscOptionsHasName(NULL,NULL, "-log_exclude_actions", &opt);CHKERRQ(ierr); 207 if (opt) petsc_logActions = PETSC_FALSE; 208 ierr = PetscOptionsHasName(NULL,NULL, "-log_exclude_objects", &opt);CHKERRQ(ierr); 209 if (opt) petsc_logObjects = PETSC_FALSE; 210 if (petsc_logActions) { 211 ierr = PetscMalloc1(petsc_maxActions, &petsc_actions);CHKERRQ(ierr); 212 } 213 if (petsc_logObjects) { 214 ierr = PetscMalloc1(petsc_maxObjects, &petsc_objects);CHKERRQ(ierr); 215 } 216 PetscLogPHC = PetscLogObjCreateDefault; 217 PetscLogPHD = PetscLogObjDestroyDefault; 218 /* Setup default logging structures */ 219 ierr = PetscStageLogCreate(&petsc_stageLog);CHKERRQ(ierr); 220 ierr = PetscStageLogRegister(petsc_stageLog, "Main Stage", &stage);CHKERRQ(ierr); 221 222 /* All processors sync here for more consistent logging */ 223 ierr = MPI_Barrier(PETSC_COMM_WORLD);CHKERRQ(ierr); 224 PetscTime(&petsc_BaseTime); 225 ierr = PetscLogStagePush(stage);CHKERRQ(ierr); 226 PetscFunctionReturn(0); 227 } 228 229 /*@C 230 PetscLogDefaultBegin - Turns on logging of objects and events. This logs flop 231 rates and object creation and should not slow programs down too much. 232 This routine may be called more than once. 233 234 Logically Collective over PETSC_COMM_WORLD 235 236 Options Database Keys: 237 . -log_view [viewertype:filename:viewerformat] - Prints summary of flop and timing information to the 238 screen (for code configured with --with-log=1 (which is the default)) 239 240 Usage: 241 .vb 242 PetscInitialize(...); 243 PetscLogDefaultBegin(); 244 ... code ... 245 PetscLogView(viewer); or PetscLogDump(); 246 PetscFinalize(); 247 .ve 248 249 Notes: 250 PetscLogView(viewer) or PetscLogDump() actually cause the printing of 251 the logging information. 252 253 Level: advanced 254 255 .keywords: log, begin 256 .seealso: PetscLogDump(), PetscLogAllBegin(), PetscLogView(), PetscLogTraceBegin() 257 @*/ 258 PetscErrorCode PetscLogDefaultBegin(void) 259 { 260 PetscErrorCode ierr; 261 262 PetscFunctionBegin; 263 ierr = PetscLogSet(PetscLogEventBeginDefault, PetscLogEventEndDefault);CHKERRQ(ierr); 264 PetscFunctionReturn(0); 265 } 266 267 /*@C 268 PetscLogAllBegin - Turns on extensive logging of objects and events. Logs 269 all events. This creates large log files and slows the program down. 270 271 Logically Collective on PETSC_COMM_WORLD 272 273 Options Database Keys: 274 . -log_all - Prints extensive log information 275 276 Usage: 277 .vb 278 PetscInitialize(...); 279 PetscLogAllBegin(); 280 ... code ... 281 PetscLogDump(filename); 282 PetscFinalize(); 283 .ve 284 285 Notes: 286 A related routine is PetscLogDefaultBegin() (with the options key -log), which is 287 intended for production runs since it logs only flop rates and object 288 creation (and shouldn't significantly slow the programs). 289 290 Level: advanced 291 292 .keywords: log, all, begin 293 .seealso: PetscLogDump(), PetscLogDefaultBegin(), PetscLogTraceBegin() 294 @*/ 295 PetscErrorCode PetscLogAllBegin(void) 296 { 297 PetscErrorCode ierr; 298 299 PetscFunctionBegin; 300 ierr = PetscLogSet(PetscLogEventBeginComplete, PetscLogEventEndComplete);CHKERRQ(ierr); 301 PetscFunctionReturn(0); 302 } 303 304 /*@ 305 PetscLogTraceBegin - Activates trace logging. Every time a PETSc event 306 begins or ends, the event name is printed. 307 308 Logically Collective on PETSC_COMM_WORLD 309 310 Input Parameter: 311 . file - The file to print trace in (e.g. stdout) 312 313 Options Database Key: 314 . -log_trace [filename] - Activates PetscLogTraceBegin() 315 316 Notes: 317 PetscLogTraceBegin() prints the processor number, the execution time (sec), 318 then "Event begin:" or "Event end:" followed by the event name. 319 320 PetscLogTraceBegin() allows tracing of all PETSc calls, which is useful 321 to determine where a program is hanging without running in the 322 debugger. Can be used in conjunction with the -info option. 323 324 Level: intermediate 325 326 .seealso: PetscLogDump(), PetscLogAllBegin(), PetscLogView(), PetscLogDefaultBegin() 327 @*/ 328 PetscErrorCode PetscLogTraceBegin(FILE *file) 329 { 330 PetscErrorCode ierr; 331 332 PetscFunctionBegin; 333 petsc_tracefile = file; 334 335 ierr = PetscLogSet(PetscLogEventBeginTrace, PetscLogEventEndTrace);CHKERRQ(ierr); 336 PetscFunctionReturn(0); 337 } 338 339 /*@ 340 PetscLogActions - Determines whether actions are logged for the graphical viewer. 341 342 Not Collective 343 344 Input Parameter: 345 . flag - PETSC_TRUE if actions are to be logged 346 347 Level: intermediate 348 349 Note: Logging of actions continues to consume more memory as the program 350 runs. Long running programs should consider turning this feature off. 351 352 Options Database Keys: 353 . -log_exclude_actions - Turns off actions logging 354 355 .keywords: log, stage, register 356 .seealso: PetscLogStagePush(), PetscLogStagePop() 357 @*/ 358 PetscErrorCode PetscLogActions(PetscBool flag) 359 { 360 PetscFunctionBegin; 361 petsc_logActions = flag; 362 PetscFunctionReturn(0); 363 } 364 365 /*@ 366 PetscLogObjects - Determines whether objects are logged for the graphical viewer. 367 368 Not Collective 369 370 Input Parameter: 371 . flag - PETSC_TRUE if objects are to be logged 372 373 Level: intermediate 374 375 Note: Logging of objects continues to consume more memory as the program 376 runs. Long running programs should consider turning this feature off. 377 378 Options Database Keys: 379 . -log_exclude_objects - Turns off objects logging 380 381 .keywords: log, stage, register 382 .seealso: PetscLogStagePush(), PetscLogStagePop() 383 @*/ 384 PetscErrorCode PetscLogObjects(PetscBool flag) 385 { 386 PetscFunctionBegin; 387 petsc_logObjects = flag; 388 PetscFunctionReturn(0); 389 } 390 391 /*------------------------------------------------ Stage Functions --------------------------------------------------*/ 392 /*@C 393 PetscLogStageRegister - Attaches a charactor string name to a logging stage. 394 395 Not Collective 396 397 Input Parameter: 398 . sname - The name to associate with that stage 399 400 Output Parameter: 401 . stage - The stage number 402 403 Level: intermediate 404 405 .keywords: log, stage, register 406 .seealso: PetscLogStagePush(), PetscLogStagePop() 407 @*/ 408 PetscErrorCode PetscLogStageRegister(const char sname[],PetscLogStage *stage) 409 { 410 PetscStageLog stageLog; 411 PetscLogEvent event; 412 PetscErrorCode ierr; 413 414 PetscFunctionBegin; 415 ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 416 ierr = PetscStageLogRegister(stageLog, sname, stage);CHKERRQ(ierr); 417 /* Copy events already changed in the main stage, this sucks */ 418 ierr = PetscEventPerfLogEnsureSize(stageLog->stageInfo[*stage].eventLog, stageLog->eventLog->numEvents);CHKERRQ(ierr); 419 for (event = 0; event < stageLog->eventLog->numEvents; event++) { 420 ierr = PetscEventPerfInfoCopy(&stageLog->stageInfo[0].eventLog->eventInfo[event],&stageLog->stageInfo[*stage].eventLog->eventInfo[event]);CHKERRQ(ierr); 421 } 422 ierr = PetscClassPerfLogEnsureSize(stageLog->stageInfo[*stage].classLog, stageLog->classLog->numClasses);CHKERRQ(ierr); 423 PetscFunctionReturn(0); 424 } 425 426 /*@C 427 PetscLogStagePush - This function pushes a stage on the stack. 428 429 Not Collective 430 431 Input Parameter: 432 . stage - The stage on which to log 433 434 Usage: 435 If the option -log_sumary is used to run the program containing the 436 following code, then 2 sets of summary data will be printed during 437 PetscFinalize(). 438 .vb 439 PetscInitialize(int *argc,char ***args,0,0); 440 [stage 0 of code] 441 PetscLogStagePush(1); 442 [stage 1 of code] 443 PetscLogStagePop(); 444 PetscBarrier(...); 445 [more stage 0 of code] 446 PetscFinalize(); 447 .ve 448 449 Notes: 450 Use PetscLogStageRegister() to register a stage. 451 452 Level: intermediate 453 454 .keywords: log, push, stage 455 .seealso: PetscLogStagePop(), PetscLogStageRegister(), PetscBarrier() 456 @*/ 457 PetscErrorCode PetscLogStagePush(PetscLogStage stage) 458 { 459 PetscStageLog stageLog; 460 PetscErrorCode ierr; 461 462 PetscFunctionBegin; 463 ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 464 ierr = PetscStageLogPush(stageLog, stage);CHKERRQ(ierr); 465 PetscFunctionReturn(0); 466 } 467 468 /*@C 469 PetscLogStagePop - This function pops a stage from the stack. 470 471 Not Collective 472 473 Usage: 474 If the option -log_sumary is used to run the program containing the 475 following code, then 2 sets of summary data will be printed during 476 PetscFinalize(). 477 .vb 478 PetscInitialize(int *argc,char ***args,0,0); 479 [stage 0 of code] 480 PetscLogStagePush(1); 481 [stage 1 of code] 482 PetscLogStagePop(); 483 PetscBarrier(...); 484 [more stage 0 of code] 485 PetscFinalize(); 486 .ve 487 488 Notes: 489 Use PetscLogStageRegister() to register a stage. 490 491 Level: intermediate 492 493 .keywords: log, pop, stage 494 .seealso: PetscLogStagePush(), PetscLogStageRegister(), PetscBarrier() 495 @*/ 496 PetscErrorCode PetscLogStagePop(void) 497 { 498 PetscStageLog stageLog; 499 PetscErrorCode ierr; 500 501 PetscFunctionBegin; 502 ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 503 ierr = PetscStageLogPop(stageLog);CHKERRQ(ierr); 504 PetscFunctionReturn(0); 505 } 506 507 /*@ 508 PetscLogStageSetActive - Determines stage activity for PetscLogEventBegin() and PetscLogEventEnd(). 509 510 Not Collective 511 512 Input Parameters: 513 + stage - The stage 514 - isActive - The activity flag, PETSC_TRUE for logging, else PETSC_FALSE (defaults to PETSC_TRUE) 515 516 Level: intermediate 517 518 .seealso: PetscLogStagePush(), PetscLogStagePop(), PetscLogEventBegin(), PetscLogEventEnd(), PetscPreLoadBegin(), PetscPreLoadEnd(), PetscPreLoadStage() 519 @*/ 520 PetscErrorCode PetscLogStageSetActive(PetscLogStage stage, PetscBool isActive) 521 { 522 PetscStageLog stageLog; 523 PetscErrorCode ierr; 524 525 PetscFunctionBegin; 526 ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 527 ierr = PetscStageLogSetActive(stageLog, stage, isActive);CHKERRQ(ierr); 528 PetscFunctionReturn(0); 529 } 530 531 /*@ 532 PetscLogStageGetActive - Returns stage activity for PetscLogEventBegin() and PetscLogEventEnd(). 533 534 Not Collective 535 536 Input Parameter: 537 . stage - The stage 538 539 Output Parameter: 540 . isActive - The activity flag, PETSC_TRUE for logging, else PETSC_FALSE (defaults to PETSC_TRUE) 541 542 Level: intermediate 543 544 .seealso: PetscLogStagePush(), PetscLogStagePop(), PetscLogEventBegin(), PetscLogEventEnd(), PetscPreLoadBegin(), PetscPreLoadEnd(), PetscPreLoadStage() 545 @*/ 546 PetscErrorCode PetscLogStageGetActive(PetscLogStage stage, PetscBool *isActive) 547 { 548 PetscStageLog stageLog; 549 PetscErrorCode ierr; 550 551 PetscFunctionBegin; 552 ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 553 ierr = PetscStageLogGetActive(stageLog, stage, isActive);CHKERRQ(ierr); 554 PetscFunctionReturn(0); 555 } 556 557 /*@ 558 PetscLogStageSetVisible - Determines stage visibility in PetscLogView() 559 560 Not Collective 561 562 Input Parameters: 563 + stage - The stage 564 - isVisible - The visibility flag, PETSC_TRUE to print, else PETSC_FALSE (defaults to PETSC_TRUE) 565 566 Level: intermediate 567 568 .seealso: PetscLogStagePush(), PetscLogStagePop(), PetscLogView() 569 @*/ 570 PetscErrorCode PetscLogStageSetVisible(PetscLogStage stage, PetscBool isVisible) 571 { 572 PetscStageLog stageLog; 573 PetscErrorCode ierr; 574 575 PetscFunctionBegin; 576 ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 577 ierr = PetscStageLogSetVisible(stageLog, stage, isVisible);CHKERRQ(ierr); 578 PetscFunctionReturn(0); 579 } 580 581 /*@ 582 PetscLogStageGetVisible - Returns stage visibility in PetscLogView() 583 584 Not Collective 585 586 Input Parameter: 587 . stage - The stage 588 589 Output Parameter: 590 . isVisible - The visibility flag, PETSC_TRUE to print, else PETSC_FALSE (defaults to PETSC_TRUE) 591 592 Level: intermediate 593 594 .seealso: PetscLogStagePush(), PetscLogStagePop(), PetscLogView() 595 @*/ 596 PetscErrorCode PetscLogStageGetVisible(PetscLogStage stage, PetscBool *isVisible) 597 { 598 PetscStageLog stageLog; 599 PetscErrorCode ierr; 600 601 PetscFunctionBegin; 602 ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 603 ierr = PetscStageLogGetVisible(stageLog, stage, isVisible);CHKERRQ(ierr); 604 PetscFunctionReturn(0); 605 } 606 607 /*@C 608 PetscLogStageGetId - Returns the stage id when given the stage name. 609 610 Not Collective 611 612 Input Parameter: 613 . name - The stage name 614 615 Output Parameter: 616 . stage - The stage, , or -1 if no stage with that name exists 617 618 Level: intermediate 619 620 .seealso: PetscLogStagePush(), PetscLogStagePop(), PetscPreLoadBegin(), PetscPreLoadEnd(), PetscPreLoadStage() 621 @*/ 622 PetscErrorCode PetscLogStageGetId(const char name[], PetscLogStage *stage) 623 { 624 PetscStageLog stageLog; 625 PetscErrorCode ierr; 626 627 PetscFunctionBegin; 628 ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 629 ierr = PetscStageLogGetStage(stageLog, name, stage);CHKERRQ(ierr); 630 PetscFunctionReturn(0); 631 } 632 633 /*------------------------------------------------ Event Functions --------------------------------------------------*/ 634 /*@C 635 PetscLogEventRegister - Registers an event name for logging operations in an application code. 636 637 Not Collective 638 639 Input Parameter: 640 + name - The name associated with the event 641 - classid - The classid associated to the class for this event, obtain either with 642 PetscClassIdRegister() or use a predefined one such as KSP_CLASSID, SNES_CLASSID, the predefined ones 643 are only available in C code 644 645 Output Parameter: 646 . event - The event id for use with PetscLogEventBegin() and PetscLogEventEnd(). 647 648 Example of Usage: 649 .vb 650 PetscLogEvent USER_EVENT; 651 PetscClassId classid; 652 PetscLogDouble user_event_flops; 653 PetscClassIdRegister("class name",&classid); 654 PetscLogEventRegister("User event name",classid,&USER_EVENT); 655 PetscLogEventBegin(USER_EVENT,0,0,0,0); 656 [code segment to monitor] 657 PetscLogFlops(user_event_flops); 658 PetscLogEventEnd(USER_EVENT,0,0,0,0); 659 .ve 660 661 Notes: 662 PETSc automatically logs library events if the code has been 663 configured with --with-log (which is the default) and 664 -log_view or -log_all is specified. PetscLogEventRegister() is 665 intended for logging user events to supplement this PETSc 666 information. 667 668 PETSc can gather data for use with the utilities Jumpshot 669 (part of the MPICH distribution). If PETSc has been compiled 670 with flag -DPETSC_HAVE_MPE (MPE is an additional utility within 671 MPICH), the user can employ another command line option, -log_mpe, 672 to create a logfile, "mpe.log", which can be visualized 673 Jumpshot. 674 675 The classid is associated with each event so that classes of events 676 can be disabled simultaneously, such as all matrix events. The user 677 can either use an existing classid, such as MAT_CLASSID, or create 678 their own as shown in the example. 679 680 If an existing event with the same name exists, its event handle is 681 returned instead of creating a new event. 682 683 Level: intermediate 684 685 .keywords: log, event, register 686 .seealso: PetscLogEventBegin(), PetscLogEventEnd(), PetscLogFlops(), 687 PetscLogEventMPEActivate(), PetscLogEventMPEDeactivate(), 688 PetscLogEventActivate(), PetscLogEventDeactivate(), PetscClassIdRegister() 689 @*/ 690 PetscErrorCode PetscLogEventRegister(const char name[],PetscClassId classid,PetscLogEvent *event) 691 { 692 PetscStageLog stageLog; 693 int stage; 694 PetscErrorCode ierr; 695 696 PetscFunctionBegin; 697 *event = PETSC_DECIDE; 698 ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 699 ierr = PetscEventRegLogGetEvent(stageLog->eventLog, name, event);CHKERRQ(ierr); 700 if (*event > 0) PetscFunctionReturn(0); 701 ierr = PetscEventRegLogRegister(stageLog->eventLog, name, classid, event);CHKERRQ(ierr); 702 for (stage = 0; stage < stageLog->numStages; stage++) { 703 ierr = PetscEventPerfLogEnsureSize(stageLog->stageInfo[stage].eventLog, stageLog->eventLog->numEvents);CHKERRQ(ierr); 704 ierr = PetscClassPerfLogEnsureSize(stageLog->stageInfo[stage].classLog, stageLog->classLog->numClasses);CHKERRQ(ierr); 705 } 706 PetscFunctionReturn(0); 707 } 708 709 /*@ 710 PetscLogEventActivate - Indicates that a particular event should be logged. 711 712 Not Collective 713 714 Input Parameter: 715 . event - The event id 716 717 Usage: 718 .vb 719 PetscLogEventDeactivate(VEC_SetValues); 720 [code where you do not want to log VecSetValues()] 721 PetscLogEventActivate(VEC_SetValues); 722 [code where you do want to log VecSetValues()] 723 .ve 724 725 Note: 726 The event may be either a pre-defined PETSc event (found in include/petsclog.h) 727 or an event number obtained with PetscLogEventRegister(). 728 729 Level: advanced 730 731 .keywords: log, event, activate 732 .seealso: PetscLogEventMPEDeactivate(),PetscLogEventMPEActivate(),PlogEventDeactivate() 733 @*/ 734 PetscErrorCode PetscLogEventActivate(PetscLogEvent event) 735 { 736 PetscStageLog stageLog; 737 int stage; 738 PetscErrorCode ierr; 739 740 PetscFunctionBegin; 741 ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 742 ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr); 743 ierr = PetscEventPerfLogActivate(stageLog->stageInfo[stage].eventLog, event);CHKERRQ(ierr); 744 PetscFunctionReturn(0); 745 } 746 747 /*@ 748 PetscLogEventDeactivate - Indicates that a particular event should not be logged. 749 750 Not Collective 751 752 Input Parameter: 753 . event - The event id 754 755 Usage: 756 .vb 757 PetscLogEventDeactivate(VEC_SetValues); 758 [code where you do not want to log VecSetValues()] 759 PetscLogEventActivate(VEC_SetValues); 760 [code where you do want to log VecSetValues()] 761 .ve 762 763 Note: 764 The event may be either a pre-defined PETSc event (found in 765 include/petsclog.h) or an event number obtained with PetscLogEventRegister()). 766 767 Level: advanced 768 769 .keywords: log, event, deactivate 770 .seealso: PetscLogEventMPEDeactivate(),PetscLogEventMPEActivate(),PlogEventActivate() 771 @*/ 772 PetscErrorCode PetscLogEventDeactivate(PetscLogEvent event) 773 { 774 PetscStageLog stageLog; 775 int stage; 776 PetscErrorCode ierr; 777 778 PetscFunctionBegin; 779 ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 780 ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr); 781 ierr = PetscEventPerfLogDeactivate(stageLog->stageInfo[stage].eventLog, event);CHKERRQ(ierr); 782 PetscFunctionReturn(0); 783 } 784 785 /*@ 786 PetscLogEventSetActiveAll - Sets the event activity in every stage. 787 788 Not Collective 789 790 Input Parameters: 791 + event - The event id 792 - isActive - The activity flag determining whether the event is logged 793 794 Level: advanced 795 796 .keywords: log, event, activate 797 .seealso: PetscLogEventMPEDeactivate(),PetscLogEventMPEActivate(),PlogEventActivate(),PlogEventDeactivate() 798 @*/ 799 PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent event, PetscBool isActive) 800 { 801 PetscStageLog stageLog; 802 int stage; 803 PetscErrorCode ierr; 804 805 PetscFunctionBegin; 806 ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 807 for (stage = 0; stage < stageLog->numStages; stage++) { 808 if (isActive) { 809 ierr = PetscEventPerfLogActivate(stageLog->stageInfo[stage].eventLog, event);CHKERRQ(ierr); 810 } else { 811 ierr = PetscEventPerfLogDeactivate(stageLog->stageInfo[stage].eventLog, event);CHKERRQ(ierr); 812 } 813 } 814 PetscFunctionReturn(0); 815 } 816 817 /*@ 818 PetscLogEventActivateClass - Activates event logging for a PETSc object class. 819 820 Not Collective 821 822 Input Parameter: 823 . classid - The event class, for example MAT_CLASSID, SNES_CLASSID, etc. 824 825 Level: developer 826 827 .keywords: log, event, activate, class 828 .seealso: PetscInfoActivate(),PetscInfo(),PetscInfoAllow(),PetscLogEventDeactivateClass(), PetscLogEventActivate(),PetscLogEventDeactivate() 829 @*/ 830 PetscErrorCode PetscLogEventActivateClass(PetscClassId classid) 831 { 832 PetscStageLog stageLog; 833 int stage; 834 PetscErrorCode ierr; 835 836 PetscFunctionBegin; 837 ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 838 ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr); 839 ierr = PetscEventPerfLogActivateClass(stageLog->stageInfo[stage].eventLog, stageLog->eventLog, classid);CHKERRQ(ierr); 840 PetscFunctionReturn(0); 841 } 842 843 /*@ 844 PetscLogEventDeactivateClass - Deactivates event logging for a PETSc object class. 845 846 Not Collective 847 848 Input Parameter: 849 . classid - The event class, for example MAT_CLASSID, SNES_CLASSID, etc. 850 851 Level: developer 852 853 .keywords: log, event, deactivate, class 854 .seealso: PetscInfoActivate(),PetscInfo(),PetscInfoAllow(),PetscLogEventActivateClass(), PetscLogEventActivate(),PetscLogEventDeactivate() 855 @*/ 856 PetscErrorCode PetscLogEventDeactivateClass(PetscClassId classid) 857 { 858 PetscStageLog stageLog; 859 int stage; 860 PetscErrorCode ierr; 861 862 PetscFunctionBegin; 863 ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 864 ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr); 865 ierr = PetscEventPerfLogDeactivateClass(stageLog->stageInfo[stage].eventLog, stageLog->eventLog, classid);CHKERRQ(ierr); 866 PetscFunctionReturn(0); 867 } 868 869 /*MC 870 PetscLogEventBegin - Logs the beginning of a user event. 871 872 Synopsis: 873 #include <petsclog.h> 874 PetscErrorCode PetscLogEventBegin(int e,PetscObject o1,PetscObject o2,PetscObject o3,PetscObject o4) 875 876 Not Collective 877 878 Input Parameters: 879 + e - integer associated with the event obtained from PetscLogEventRegister() 880 - o1,o2,o3,o4 - objects associated with the event, or 0 881 882 883 Fortran Synopsis: 884 void PetscLogEventBegin(int e,PetscErrorCode ierr) 885 886 Usage: 887 .vb 888 PetscLogEvent USER_EVENT; 889 PetscLogDouble user_event_flops; 890 PetscLogEventRegister("User event",0,&USER_EVENT); 891 PetscLogEventBegin(USER_EVENT,0,0,0,0); 892 [code segment to monitor] 893 PetscLogFlops(user_event_flops); 894 PetscLogEventEnd(USER_EVENT,0,0,0,0); 895 .ve 896 897 Notes: 898 You need to register each integer event with the command 899 PetscLogEventRegister(). 900 901 Level: intermediate 902 903 .seealso: PetscLogEventRegister(), PetscLogEventEnd(), PetscLogFlops() 904 905 .keywords: log, event, begin 906 M*/ 907 908 /*MC 909 PetscLogEventEnd - Log the end of a user event. 910 911 Synopsis: 912 #include <petsclog.h> 913 PetscErrorCode PetscLogEventEnd(int e,PetscObject o1,PetscObject o2,PetscObject o3,PetscObject o4) 914 915 Not Collective 916 917 Input Parameters: 918 + e - integer associated with the event obtained with PetscLogEventRegister() 919 - o1,o2,o3,o4 - objects associated with the event, or 0 920 921 922 Fortran Synopsis: 923 void PetscLogEventEnd(int e,PetscErrorCode ierr) 924 925 Usage: 926 .vb 927 PetscLogEvent USER_EVENT; 928 PetscLogDouble user_event_flops; 929 PetscLogEventRegister("User event",0,&USER_EVENT,); 930 PetscLogEventBegin(USER_EVENT,0,0,0,0); 931 [code segment to monitor] 932 PetscLogFlops(user_event_flops); 933 PetscLogEventEnd(USER_EVENT,0,0,0,0); 934 .ve 935 936 Notes: 937 You should also register each additional integer event with the command 938 PetscLogEventRegister(). 939 940 Level: intermediate 941 942 .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogFlops() 943 944 .keywords: log, event, end 945 M*/ 946 947 /*MC 948 PetscLogEventBarrierBegin - Logs the time in a barrier before an event. 949 950 Synopsis: 951 #include <petsclog.h> 952 PetscErrorCode PetscLogEventBarrierBegin(int e,PetscObject o1,PetscObject o2,PetscObject o3,PetscObject o4,MPI_Comm comm) 953 954 Not Collective 955 956 Input Parameters: 957 . e - integer associated with the event obtained from PetscLogEventRegister() 958 . o1,o2,o3,o4 - objects associated with the event, or 0 959 . comm - communicator the barrier takes place over 960 961 962 Usage: 963 .vb 964 PetscLogEventBarrierBegin(VEC_NormBarrier,0,0,0,0,comm); 965 MPIU_Allreduce() 966 PetscLogEventBarrierEnd(VEC_NormBarrier,0,0,0,0,comm); 967 .ve 968 969 Notes: 970 This is for logging the amount of time spent in a barrier for an event 971 that requires synchronization. 972 973 Additional Notes: 974 Synchronization events always come in pairs; for example, VEC_NormBarrier and 975 VEC_NormComm = VEC_NormBarrier + 1 976 977 Level: advanced 978 979 .seealso: PetscLogEventRegister(), PetscLogEventEnd(), PetscLogFlops(), PetscLogEventBegin(), 980 PetscLogEventBarrierEnd() 981 982 .keywords: log, event, begin, barrier 983 M*/ 984 985 /*MC 986 PetscLogEventBarrierEnd - Logs the time in a barrier before an event. 987 988 Synopsis: 989 #include <petsclog.h> 990 PetscErrorCode PetscLogEventBarrierEnd(int e,PetscObject o1,PetscObject o2,PetscObject o3,PetscObject o4,MPI_Comm comm) 991 992 Logically Collective on MPI_Comm 993 994 Input Parameters: 995 . e - integer associated with the event obtained from PetscLogEventRegister() 996 . o1,o2,o3,o4 - objects associated with the event, or 0 997 . comm - communicator the barrier takes place over 998 999 1000 Usage: 1001 .vb 1002 PetscLogEventBarrierBegin(VEC_NormBarrier,0,0,0,0,comm); 1003 MPIU_Allreduce() 1004 PetscLogEventBarrierEnd(VEC_NormBarrier,0,0,0,0,comm); 1005 .ve 1006 1007 Notes: 1008 This is for logging the amount of time spent in a barrier for an event 1009 that requires synchronization. 1010 1011 Additional Notes: 1012 Synchronization events always come in pairs; for example, VEC_NormBarrier and 1013 VEC_NormComm = VEC_NormBarrier + 1 1014 1015 Level: advanced 1016 1017 .seealso: PetscLogEventRegister(), PetscLogEventEnd(), PetscLogFlops(), PetscLogEventBegin(), 1018 PetscLogEventBarrierBegin() 1019 1020 .keywords: log, event, begin, barrier 1021 M*/ 1022 1023 /*@C 1024 PetscLogEventGetId - Returns the event id when given the event name. 1025 1026 Not Collective 1027 1028 Input Parameter: 1029 . name - The event name 1030 1031 Output Parameter: 1032 . event - The event, or -1 if no event with that name exists 1033 1034 Level: intermediate 1035 1036 .seealso: PetscLogEventBegin(), PetscLogEventEnd(), PetscLogStageGetId() 1037 @*/ 1038 PetscErrorCode PetscLogEventGetId(const char name[], PetscLogEvent *event) 1039 { 1040 PetscStageLog stageLog; 1041 PetscErrorCode ierr; 1042 1043 PetscFunctionBegin; 1044 ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 1045 ierr = PetscEventRegLogGetEvent(stageLog->eventLog, name, event);CHKERRQ(ierr); 1046 PetscFunctionReturn(0); 1047 } 1048 1049 1050 /*------------------------------------------------ Output Functions -------------------------------------------------*/ 1051 /*@C 1052 PetscLogDump - Dumps logs of objects to a file. This file is intended to 1053 be read by bin/petscview. This program no longer exists. 1054 1055 Collective on PETSC_COMM_WORLD 1056 1057 Input Parameter: 1058 . name - an optional file name 1059 1060 Usage: 1061 .vb 1062 PetscInitialize(...); 1063 PetscLogDefaultBegin(); or PetscLogAllBegin(); 1064 ... code ... 1065 PetscLogDump(filename); 1066 PetscFinalize(); 1067 .ve 1068 1069 Notes: 1070 The default file name is 1071 $ Log.<rank> 1072 where <rank> is the processor number. If no name is specified, 1073 this file will be used. 1074 1075 Level: advanced 1076 1077 .keywords: log, dump 1078 .seealso: PetscLogDefaultBegin(), PetscLogAllBegin(), PetscLogView() 1079 @*/ 1080 PetscErrorCode PetscLogDump(const char sname[]) 1081 { 1082 PetscStageLog stageLog; 1083 PetscEventPerfInfo *eventInfo; 1084 FILE *fd; 1085 char file[PETSC_MAX_PATH_LEN], fname[PETSC_MAX_PATH_LEN]; 1086 PetscLogDouble flops, _TotalTime; 1087 PetscMPIInt rank; 1088 int action, object, curStage; 1089 PetscLogEvent event; 1090 PetscErrorCode ierr; 1091 1092 PetscFunctionBegin; 1093 /* Calculate the total elapsed time */ 1094 PetscTime(&_TotalTime); 1095 _TotalTime -= petsc_BaseTime; 1096 /* Open log file */ 1097 ierr = MPI_Comm_rank(PETSC_COMM_WORLD, &rank);CHKERRQ(ierr); 1098 if (sname) sprintf(file, "%s.%d", sname, rank); 1099 else sprintf(file, "Log.%d", rank); 1100 ierr = PetscFixFilename(file, fname);CHKERRQ(ierr); 1101 ierr = PetscFOpen(PETSC_COMM_WORLD, fname, "w", &fd);CHKERRQ(ierr); 1102 if ((!rank) && (!fd)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN, "Cannot open file: %s", fname); 1103 /* Output totals */ 1104 ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Total Flops %14e %16.8e\n", petsc_TotalFlops, _TotalTime);CHKERRQ(ierr); 1105 ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Clock Resolution %g\n", 0.0);CHKERRQ(ierr); 1106 /* Output actions */ 1107 if (petsc_logActions) { 1108 ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Actions accomplished %d\n", petsc_numActions);CHKERRQ(ierr); 1109 for (action = 0; action < petsc_numActions; action++) { 1110 ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "%g %d %d %d %d %d %d %g %g %g\n", 1111 petsc_actions[action].time, petsc_actions[action].action, (int)petsc_actions[action].event, (int)petsc_actions[action].classid, petsc_actions[action].id1, 1112 petsc_actions[action].id2, petsc_actions[action].id3, petsc_actions[action].flops, petsc_actions[action].mem, petsc_actions[action].maxmem);CHKERRQ(ierr); 1113 } 1114 } 1115 /* Output objects */ 1116 if (petsc_logObjects) { 1117 ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Objects created %d destroyed %d\n", petsc_numObjects, petsc_numObjectsDestroyed);CHKERRQ(ierr); 1118 for (object = 0; object < petsc_numObjects; object++) { 1119 ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Parent ID: %d Memory: %d\n", petsc_objects[object].parent, (int) petsc_objects[object].mem);CHKERRQ(ierr); 1120 if (!petsc_objects[object].name[0]) { 1121 ierr = PetscFPrintf(PETSC_COMM_WORLD, fd,"No Name\n");CHKERRQ(ierr); 1122 } else { 1123 ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Name: %s\n", petsc_objects[object].name);CHKERRQ(ierr); 1124 } 1125 if (petsc_objects[object].info[0] != 0) { 1126 ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "No Info\n");CHKERRQ(ierr); 1127 } else { 1128 ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Info: %s\n", petsc_objects[object].info);CHKERRQ(ierr); 1129 } 1130 } 1131 } 1132 /* Output events */ 1133 ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Event log:\n");CHKERRQ(ierr); 1134 ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 1135 ierr = PetscIntStackTop(stageLog->stack, &curStage);CHKERRQ(ierr); 1136 eventInfo = stageLog->stageInfo[curStage].eventLog->eventInfo; 1137 for (event = 0; event < stageLog->stageInfo[curStage].eventLog->numEvents; event++) { 1138 if (eventInfo[event].time != 0.0) flops = eventInfo[event].flops/eventInfo[event].time; 1139 else flops = 0.0; 1140 ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "%d %16d %16g %16g %16g\n", event, eventInfo[event].count, 1141 eventInfo[event].flops, eventInfo[event].time, flops);CHKERRQ(ierr); 1142 } 1143 ierr = PetscFClose(PETSC_COMM_WORLD, fd);CHKERRQ(ierr); 1144 PetscFunctionReturn(0); 1145 } 1146 1147 /* 1148 PetscLogView_Detailed - Each process prints the times for its own events 1149 1150 */ 1151 PetscErrorCode PetscLogView_Detailed(PetscViewer viewer) 1152 { 1153 MPI_Comm comm = PetscObjectComm((PetscObject) viewer); 1154 PetscEventPerfInfo *eventInfo = NULL; 1155 PetscLogDouble locTotalTime, numRed, maxMem; 1156 PetscStageLog stageLog; 1157 int numStages,numEvents,stage,event; 1158 PetscMPIInt rank,size; 1159 PetscErrorCode ierr; 1160 1161 PetscFunctionBegin; 1162 ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr); 1163 ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 1164 /* Must preserve reduction count before we go on */ 1165 numRed = petsc_allreduce_ct + petsc_gather_ct + petsc_scatter_ct; 1166 /* Get the total elapsed time */ 1167 PetscTime(&locTotalTime); locTotalTime -= petsc_BaseTime; 1168 ierr = PetscViewerASCIIPrintf(viewer,"numProcs = %d\n",size);CHKERRQ(ierr); 1169 ierr = PetscViewerASCIIPrintf(viewer,"LocalTimes = {}\n");CHKERRQ(ierr); 1170 ierr = PetscViewerASCIIPrintf(viewer,"LocalFlops = {}\n");CHKERRQ(ierr); 1171 ierr = PetscViewerASCIIPrintf(viewer,"LocalMessageLens = {}\n");CHKERRQ(ierr); 1172 ierr = PetscViewerASCIIPrintf(viewer,"LocalMessages = {}\n");CHKERRQ(ierr); 1173 ierr = PetscViewerASCIIPrintf(viewer,"LocalReductions = {}\n");CHKERRQ(ierr); 1174 ierr = PetscViewerASCIIPrintf(viewer,"LocalObjects = {}\n");CHKERRQ(ierr); 1175 ierr = PetscViewerASCIIPrintf(viewer,"LocalMemory = {}\n");CHKERRQ(ierr); 1176 ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 1177 ierr = MPIU_Allreduce(&stageLog->numStages, &numStages, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr); 1178 ierr = PetscViewerASCIIPrintf(viewer,"Stages = {}\n");CHKERRQ(ierr); 1179 for (stage=0; stage<numStages; stage++) { 1180 ierr = PetscViewerASCIIPrintf(viewer,"Stages[\"%s\"] = {}\n",stageLog->stageInfo[stage].name);CHKERRQ(ierr); 1181 ierr = PetscViewerASCIIPrintf(viewer,"Stages[\"%s\"][\"summary\"] = {}\n",stageLog->stageInfo[stage].name);CHKERRQ(ierr); 1182 ierr = MPIU_Allreduce(&stageLog->stageInfo[stage].eventLog->numEvents, &numEvents, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr); 1183 for (event = 0; event < numEvents; event++) { 1184 ierr = PetscViewerASCIIPrintf(viewer,"Stages[\"%s\"][\"%s\"] = {}\n",stageLog->stageInfo[stage].name,stageLog->eventLog->eventInfo[event].name);CHKERRQ(ierr); 1185 } 1186 } 1187 ierr = PetscViewerASCIIPushSynchronized(viewer);CHKERRQ(ierr); 1188 ierr = PetscViewerASCIISynchronizedPrintf(viewer,"LocalTimes[%d] = %g\n",rank,locTotalTime);CHKERRQ(ierr); 1189 ierr = PetscViewerASCIISynchronizedPrintf(viewer,"LocalFlops[%d] = %g\n",rank,petsc_TotalFlops);CHKERRQ(ierr); 1190 ierr = PetscViewerASCIISynchronizedPrintf(viewer,"LocalMessageLens[%d] = %g\n",rank,(petsc_irecv_len + petsc_isend_len + petsc_recv_len + petsc_send_len));CHKERRQ(ierr); 1191 ierr = PetscViewerASCIISynchronizedPrintf(viewer,"LocalMessages[%d] = %g\n",rank,(petsc_irecv_ct + petsc_isend_ct + petsc_recv_ct + petsc_send_ct));CHKERRQ(ierr); 1192 ierr = PetscViewerASCIISynchronizedPrintf(viewer,"LocalReductions[%d] = %g\n",rank,numRed);CHKERRQ(ierr); 1193 ierr = PetscViewerASCIISynchronizedPrintf(viewer,"LocalObjects[%d] = %g\n",rank,petsc_numObjects);CHKERRQ(ierr); 1194 ierr = PetscMallocGetMaximumUsage(&maxMem);CHKERRQ(ierr); 1195 ierr = PetscViewerASCIISynchronizedPrintf(viewer,"LocalMemory[%d] = %g\n",rank,maxMem);CHKERRQ(ierr); 1196 ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 1197 for (stage=0; stage<numStages; stage++) { 1198 ierr = PetscViewerASCIISynchronizedPrintf(viewer,"Stages[\"%s\"][\"summary\"][%d] = {\"time\" : %g, \"numMessages\" : %g, \"messageLength\" : %g, \"numReductions\" : %g, \"flops\" : %g}\n", 1199 stageLog->stageInfo[stage].name,rank, 1200 stageLog->stageInfo[stage].perfInfo.time,stageLog->stageInfo[stage].perfInfo.numMessages,stageLog->stageInfo[stage].perfInfo.messageLength, 1201 stageLog->stageInfo[stage].perfInfo.numReductions,stageLog->stageInfo[stage].perfInfo.flops);CHKERRQ(ierr); 1202 ierr = MPIU_Allreduce(&stageLog->stageInfo[stage].eventLog->numEvents, &numEvents, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr); 1203 for (event = 0; event < numEvents; event++) { 1204 eventInfo = stageLog->stageInfo[stage].eventLog->eventInfo; 1205 ierr = PetscViewerASCIISynchronizedPrintf(viewer,"Stages[\"%s\"][\"%s\"][%d] = {\"count\" : %D, \"time\" : %g, \"numMessages\" : %g, \"messageLength\" : %g, \"numReductions\" : %g, \"flops\" : %g}\n",stageLog->stageInfo[stage].name,stageLog->eventLog->eventInfo[event].name,rank, 1206 eventInfo[event].count, eventInfo[event].time,eventInfo[event].numMessages, eventInfo[event].messageLength, 1207 eventInfo[event].numReductions,eventInfo[event].flops);CHKERRQ(ierr); 1208 } 1209 } 1210 ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 1211 ierr = PetscViewerASCIIPopSynchronized(viewer);CHKERRQ(ierr); 1212 PetscFunctionReturn(0); 1213 } 1214 1215 static PetscErrorCode PetscLogViewWarnDebugging(MPI_Comm comm,FILE *fd) 1216 { 1217 #if defined(PETSC_USE_DEBUG) 1218 PetscErrorCode ierr; 1219 1220 PetscFunctionBegin; 1221 ierr = PetscFPrintf(comm, fd, "\n\n");CHKERRQ(ierr); 1222 ierr = PetscFPrintf(comm, fd, " ##########################################################\n");CHKERRQ(ierr); 1223 ierr = PetscFPrintf(comm, fd, " # #\n");CHKERRQ(ierr); 1224 ierr = PetscFPrintf(comm, fd, " # WARNING!!! #\n");CHKERRQ(ierr); 1225 ierr = PetscFPrintf(comm, fd, " # #\n");CHKERRQ(ierr); 1226 ierr = PetscFPrintf(comm, fd, " # This code was compiled with a debugging option, #\n");CHKERRQ(ierr); 1227 ierr = PetscFPrintf(comm, fd, " # To get timing results run ./configure #\n");CHKERRQ(ierr); 1228 ierr = PetscFPrintf(comm, fd, " # using --with-debugging=no, the performance will #\n");CHKERRQ(ierr); 1229 ierr = PetscFPrintf(comm, fd, " # be generally two or three times faster. #\n");CHKERRQ(ierr); 1230 ierr = PetscFPrintf(comm, fd, " # #\n");CHKERRQ(ierr); 1231 ierr = PetscFPrintf(comm, fd, " ##########################################################\n\n\n");CHKERRQ(ierr); 1232 PetscFunctionReturn(0); 1233 #else 1234 return 0; 1235 #endif 1236 } 1237 1238 PetscErrorCode PetscLogView_Default(PetscViewer viewer) 1239 { 1240 FILE *fd; 1241 PetscLogDouble zero = 0.0; 1242 PetscStageLog stageLog; 1243 PetscStageInfo *stageInfo = NULL; 1244 PetscEventPerfInfo *eventInfo = NULL; 1245 PetscClassPerfInfo *classInfo; 1246 char arch[128],hostname[128],username[128],pname[PETSC_MAX_PATH_LEN],date[128]; 1247 const char *name; 1248 PetscLogDouble locTotalTime, TotalTime, TotalFlops; 1249 PetscLogDouble numMessages, messageLength, avgMessLen, numReductions; 1250 PetscLogDouble stageTime, flops, flopr, mem, mess, messLen, red; 1251 PetscLogDouble fracTime, fracFlops, fracMessages, fracLength, fracReductions, fracMess, fracMessLen, fracRed; 1252 PetscLogDouble fracStageTime, fracStageFlops, fracStageMess, fracStageMessLen, fracStageRed; 1253 PetscLogDouble min, max, tot, ratio, avg, x, y; 1254 PetscLogDouble minf, maxf, totf, ratf, mint, maxt, tott, ratt, ratCt, totm, totml, totr; 1255 PetscMPIInt minCt, maxCt; 1256 PetscMPIInt size, rank; 1257 PetscBool *localStageUsed, *stageUsed; 1258 PetscBool *localStageVisible, *stageVisible; 1259 int numStages, localNumEvents, numEvents; 1260 int stage, oclass; 1261 PetscLogEvent event; 1262 PetscErrorCode ierr; 1263 char version[256]; 1264 MPI_Comm comm; 1265 1266 PetscFunctionBegin; 1267 ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 1268 ierr = PetscViewerASCIIGetPointer(viewer,&fd);CHKERRQ(ierr); 1269 ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr); 1270 ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 1271 /* Get the total elapsed time */ 1272 PetscTime(&locTotalTime); locTotalTime -= petsc_BaseTime; 1273 1274 ierr = PetscFPrintf(comm, fd, "************************************************************************************************************************\n");CHKERRQ(ierr); 1275 ierr = PetscFPrintf(comm, fd, "*** WIDEN YOUR WINDOW TO 120 CHARACTERS. Use 'enscript -r -fCourier9' to print this document ***\n");CHKERRQ(ierr); 1276 ierr = PetscFPrintf(comm, fd, "************************************************************************************************************************\n");CHKERRQ(ierr); 1277 ierr = PetscFPrintf(comm, fd, "\n---------------------------------------------- PETSc Performance Summary: ----------------------------------------------\n\n");CHKERRQ(ierr); 1278 ierr = PetscLogViewWarnDebugging(comm,fd);CHKERRQ(ierr); 1279 ierr = PetscGetArchType(arch,sizeof(arch));CHKERRQ(ierr); 1280 ierr = PetscGetHostName(hostname,sizeof(hostname));CHKERRQ(ierr); 1281 ierr = PetscGetUserName(username,sizeof(username));CHKERRQ(ierr); 1282 ierr = PetscGetProgramName(pname,sizeof(pname));CHKERRQ(ierr); 1283 ierr = PetscGetDate(date,sizeof(date));CHKERRQ(ierr); 1284 ierr = PetscGetVersion(version,sizeof(version));CHKERRQ(ierr); 1285 if (size == 1) { 1286 ierr = PetscFPrintf(comm,fd,"%s on a %s named %s with %d processor, by %s %s\n", pname, arch, hostname, size, username, date);CHKERRQ(ierr); 1287 } else { 1288 ierr = PetscFPrintf(comm,fd,"%s on a %s named %s with %d processors, by %s %s\n", pname, arch, hostname, size, username, date);CHKERRQ(ierr); 1289 } 1290 1291 ierr = PetscFPrintf(comm, fd, "Using %s\n", version);CHKERRQ(ierr); 1292 1293 /* Must preserve reduction count before we go on */ 1294 red = petsc_allreduce_ct + petsc_gather_ct + petsc_scatter_ct; 1295 1296 /* Calculate summary information */ 1297 ierr = PetscFPrintf(comm, fd, "\n Max Max/Min Avg Total \n");CHKERRQ(ierr); 1298 /* Time */ 1299 ierr = MPIU_Allreduce(&locTotalTime, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1300 ierr = MPIU_Allreduce(&locTotalTime, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1301 ierr = MPIU_Allreduce(&locTotalTime, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1302 avg = (tot)/((PetscLogDouble) size); 1303 if (min != 0.0) ratio = max/min; 1304 else ratio = 0.0; 1305 ierr = PetscFPrintf(comm, fd, "Time (sec): %5.3e %10.5f %5.3e\n", max, ratio, avg);CHKERRQ(ierr); 1306 TotalTime = tot; 1307 /* Objects */ 1308 avg = (PetscLogDouble) petsc_numObjects; 1309 ierr = MPIU_Allreduce(&avg, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1310 ierr = MPIU_Allreduce(&avg, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1311 ierr = MPIU_Allreduce(&avg, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1312 avg = (tot)/((PetscLogDouble) size); 1313 if (min != 0.0) ratio = max/min; 1314 else ratio = 0.0; 1315 ierr = PetscFPrintf(comm, fd, "Objects: %5.3e %10.5f %5.3e\n", max, ratio, avg);CHKERRQ(ierr); 1316 /* Flops */ 1317 ierr = MPIU_Allreduce(&petsc_TotalFlops, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1318 ierr = MPIU_Allreduce(&petsc_TotalFlops, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1319 ierr = MPIU_Allreduce(&petsc_TotalFlops, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1320 avg = (tot)/((PetscLogDouble) size); 1321 if (min != 0.0) ratio = max/min; 1322 else ratio = 0.0; 1323 ierr = PetscFPrintf(comm, fd, "Flops: %5.3e %10.5f %5.3e %5.3e\n", max, ratio, avg, tot);CHKERRQ(ierr); 1324 TotalFlops = tot; 1325 /* Flops/sec -- Must talk to Barry here */ 1326 if (locTotalTime != 0.0) flops = petsc_TotalFlops/locTotalTime; 1327 else flops = 0.0; 1328 ierr = MPIU_Allreduce(&flops, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1329 ierr = MPIU_Allreduce(&flops, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1330 ierr = MPIU_Allreduce(&flops, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1331 avg = (tot)/((PetscLogDouble) size); 1332 if (min != 0.0) ratio = max/min; 1333 else ratio = 0.0; 1334 ierr = PetscFPrintf(comm, fd, "Flops/sec: %5.3e %10.5f %5.3e %5.3e\n", max, ratio, avg, tot);CHKERRQ(ierr); 1335 /* Memory */ 1336 ierr = PetscMallocGetMaximumUsage(&mem);CHKERRQ(ierr); 1337 if (mem > 0.0) { 1338 ierr = MPIU_Allreduce(&mem, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1339 ierr = MPIU_Allreduce(&mem, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1340 ierr = MPIU_Allreduce(&mem, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1341 avg = (tot)/((PetscLogDouble) size); 1342 if (min != 0.0) ratio = max/min; 1343 else ratio = 0.0; 1344 ierr = PetscFPrintf(comm, fd, "Memory: %5.3e %10.5f %5.3e\n", max, ratio, tot);CHKERRQ(ierr); 1345 } 1346 /* Messages */ 1347 mess = 0.5*(petsc_irecv_ct + petsc_isend_ct + petsc_recv_ct + petsc_send_ct); 1348 ierr = MPIU_Allreduce(&mess, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1349 ierr = MPIU_Allreduce(&mess, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1350 ierr = MPIU_Allreduce(&mess, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1351 avg = (tot)/((PetscLogDouble) size); 1352 if (min != 0.0) ratio = max/min; 1353 else ratio = 0.0; 1354 ierr = PetscFPrintf(comm, fd, "MPI Messages: %5.3e %10.5f %5.3e %5.3e\n", max, ratio, avg, tot);CHKERRQ(ierr); 1355 numMessages = tot; 1356 /* Message Lengths */ 1357 mess = 0.5*(petsc_irecv_len + petsc_isend_len + petsc_recv_len + petsc_send_len); 1358 ierr = MPIU_Allreduce(&mess, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1359 ierr = MPIU_Allreduce(&mess, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1360 ierr = MPIU_Allreduce(&mess, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1361 if (numMessages != 0) avg = (tot)/(numMessages); 1362 else avg = 0.0; 1363 if (min != 0.0) ratio = max/min; 1364 else ratio = 0.0; 1365 ierr = PetscFPrintf(comm, fd, "MPI Message Lengths: %5.3e %10.5f %5.3e %5.3e\n", max, ratio, avg, tot);CHKERRQ(ierr); 1366 messageLength = tot; 1367 /* Reductions */ 1368 ierr = MPIU_Allreduce(&red, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1369 ierr = MPIU_Allreduce(&red, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1370 ierr = MPIU_Allreduce(&red, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1371 if (min != 0.0) ratio = max/min; 1372 else ratio = 0.0; 1373 ierr = PetscFPrintf(comm, fd, "MPI Reductions: %5.3e %10.5f\n", max, ratio);CHKERRQ(ierr); 1374 numReductions = red; /* wrong because uses count from process zero */ 1375 ierr = PetscFPrintf(comm, fd, "\nFlop counting convention: 1 flop = 1 real number operation of type (multiply/divide/add/subtract)\n");CHKERRQ(ierr); 1376 ierr = PetscFPrintf(comm, fd, " e.g., VecAXPY() for real vectors of length N --> 2N flops\n");CHKERRQ(ierr); 1377 ierr = PetscFPrintf(comm, fd, " and VecAXPY() for complex vectors of length N --> 8N flops\n");CHKERRQ(ierr); 1378 1379 /* Get total number of stages -- 1380 Currently, a single processor can register more stages than another, but stages must all be registered in order. 1381 We can removed this requirement if necessary by having a global stage numbering and indirection on the stage ID. 1382 This seems best accomplished by assoicating a communicator with each stage. 1383 */ 1384 ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 1385 ierr = MPIU_Allreduce(&stageLog->numStages, &numStages, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr); 1386 ierr = PetscMalloc1(numStages, &localStageUsed);CHKERRQ(ierr); 1387 ierr = PetscMalloc1(numStages, &stageUsed);CHKERRQ(ierr); 1388 ierr = PetscMalloc1(numStages, &localStageVisible);CHKERRQ(ierr); 1389 ierr = PetscMalloc1(numStages, &stageVisible);CHKERRQ(ierr); 1390 if (numStages > 0) { 1391 stageInfo = stageLog->stageInfo; 1392 for (stage = 0; stage < numStages; stage++) { 1393 if (stage < stageLog->numStages) { 1394 localStageUsed[stage] = stageInfo[stage].used; 1395 localStageVisible[stage] = stageInfo[stage].perfInfo.visible; 1396 } else { 1397 localStageUsed[stage] = PETSC_FALSE; 1398 localStageVisible[stage] = PETSC_TRUE; 1399 } 1400 } 1401 ierr = MPIU_Allreduce(localStageUsed, stageUsed, numStages, MPIU_BOOL, MPI_LOR, comm);CHKERRQ(ierr); 1402 ierr = MPIU_Allreduce(localStageVisible, stageVisible, numStages, MPIU_BOOL, MPI_LAND, comm);CHKERRQ(ierr); 1403 for (stage = 0; stage < numStages; stage++) { 1404 if (stageUsed[stage]) { 1405 ierr = PetscFPrintf(comm, fd, "\nSummary of Stages: ----- Time ------ ----- Flops ----- --- Messages --- -- Message Lengths -- -- Reductions --\n");CHKERRQ(ierr); 1406 ierr = PetscFPrintf(comm, fd, " Avg %%Total Avg %%Total counts %%Total Avg %%Total counts %%Total \n");CHKERRQ(ierr); 1407 break; 1408 } 1409 } 1410 for (stage = 0; stage < numStages; stage++) { 1411 if (!stageUsed[stage]) continue; 1412 /* CANNOT use MPIU_Allreduce() since it might fail the line number check */ 1413 if (localStageUsed[stage]) { 1414 ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.time, &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1415 ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.flops, &flops, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1416 ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numMessages, &mess, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1417 ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.messageLength, &messLen, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1418 ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numReductions, &red, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1419 name = stageInfo[stage].name; 1420 } else { 1421 ierr = MPI_Allreduce(&zero, &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1422 ierr = MPI_Allreduce(&zero, &flops, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1423 ierr = MPI_Allreduce(&zero, &mess, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1424 ierr = MPI_Allreduce(&zero, &messLen, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1425 ierr = MPI_Allreduce(&zero, &red, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1426 name = ""; 1427 } 1428 mess *= 0.5; messLen *= 0.5; red /= size; 1429 if (TotalTime != 0.0) fracTime = stageTime/TotalTime; else fracTime = 0.0; 1430 if (TotalFlops != 0.0) fracFlops = flops/TotalFlops; else fracFlops = 0.0; 1431 /* Talk to Barry if (stageTime != 0.0) flops = (size*flops)/stageTime; else flops = 0.0; */ 1432 if (numMessages != 0.0) fracMessages = mess/numMessages; else fracMessages = 0.0; 1433 if (numMessages != 0.0) avgMessLen = messLen/numMessages; else avgMessLen = 0.0; 1434 if (messageLength != 0.0) fracLength = messLen/messageLength; else fracLength = 0.0; 1435 if (numReductions != 0.0) fracReductions = red/numReductions; else fracReductions = 0.0; 1436 ierr = PetscFPrintf(comm, fd, "%2d: %15s: %6.4e %5.1f%% %6.4e %5.1f%% %5.3e %5.1f%% %5.3e %5.1f%% %5.3e %5.1f%% \n", 1437 stage, name, stageTime/size, 100.0*fracTime, flops, 100.0*fracFlops, 1438 mess, 100.0*fracMessages, avgMessLen, 100.0*fracLength, red, 100.0*fracReductions);CHKERRQ(ierr); 1439 } 1440 } 1441 1442 ierr = PetscFPrintf(comm, fd,"\n------------------------------------------------------------------------------------------------------------------------\n");CHKERRQ(ierr); 1443 ierr = PetscFPrintf(comm, fd, "See the 'Profiling' chapter of the users' manual for details on interpreting output.\n");CHKERRQ(ierr); 1444 ierr = PetscFPrintf(comm, fd, "Phase summary info:\n");CHKERRQ(ierr); 1445 ierr = PetscFPrintf(comm, fd, " Count: number of times phase was executed\n");CHKERRQ(ierr); 1446 ierr = PetscFPrintf(comm, fd, " Time and Flops: Max - maximum over all processors\n");CHKERRQ(ierr); 1447 ierr = PetscFPrintf(comm, fd, " Ratio - ratio of maximum to minimum over all processors\n");CHKERRQ(ierr); 1448 ierr = PetscFPrintf(comm, fd, " Mess: number of messages sent\n");CHKERRQ(ierr); 1449 ierr = PetscFPrintf(comm, fd, " Avg. len: average message length (bytes)\n");CHKERRQ(ierr); 1450 ierr = PetscFPrintf(comm, fd, " Reduct: number of global reductions\n");CHKERRQ(ierr); 1451 ierr = PetscFPrintf(comm, fd, " Global: entire computation\n");CHKERRQ(ierr); 1452 ierr = PetscFPrintf(comm, fd, " Stage: stages of a computation. Set stages with PetscLogStagePush() and PetscLogStagePop().\n");CHKERRQ(ierr); 1453 ierr = PetscFPrintf(comm, fd, " %%T - percent time in this phase %%F - percent flops in this phase\n");CHKERRQ(ierr); 1454 ierr = PetscFPrintf(comm, fd, " %%M - percent messages in this phase %%L - percent message lengths in this phase\n");CHKERRQ(ierr); 1455 ierr = PetscFPrintf(comm, fd, " %%R - percent reductions in this phase\n");CHKERRQ(ierr); 1456 ierr = PetscFPrintf(comm, fd, " Total Mflop/s: 10e-6 * (sum of flops over all processors)/(max time over all processors)\n");CHKERRQ(ierr); 1457 ierr = PetscFPrintf(comm, fd, "------------------------------------------------------------------------------------------------------------------------\n");CHKERRQ(ierr); 1458 1459 ierr = PetscLogViewWarnDebugging(comm,fd);CHKERRQ(ierr); 1460 1461 /* Report events */ 1462 ierr = PetscFPrintf(comm, fd,"Event Count Time (sec) Flops --- Global --- --- Stage --- Total\n");CHKERRQ(ierr); 1463 ierr = PetscFPrintf(comm, fd," Max Ratio Max Ratio Max Ratio Mess Avg len Reduct %%T %%F %%M %%L %%R %%T %%F %%M %%L %%R Mflop/s\n");CHKERRQ(ierr); 1464 ierr = PetscFPrintf(comm,fd,"------------------------------------------------------------------------------------------------------------------------\n");CHKERRQ(ierr); 1465 1466 /* Problem: The stage name will not show up unless the stage executed on proc 1 */ 1467 for (stage = 0; stage < numStages; stage++) { 1468 if (!stageVisible[stage]) continue; 1469 /* CANNOT use MPIU_Allreduce() since it might fail the line number check */ 1470 if (localStageUsed[stage]) { 1471 ierr = PetscFPrintf(comm, fd, "\n--- Event Stage %d: %s\n\n", stage, stageInfo[stage].name);CHKERRQ(ierr); 1472 ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.time, &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1473 ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.flops, &flops, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1474 ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numMessages, &mess, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1475 ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.messageLength, &messLen, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1476 ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numReductions, &red, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1477 } else { 1478 ierr = PetscFPrintf(comm, fd, "\n--- Event Stage %d: Unknown\n\n", stage);CHKERRQ(ierr); 1479 ierr = MPI_Allreduce(&zero, &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1480 ierr = MPI_Allreduce(&zero, &flops, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1481 ierr = MPI_Allreduce(&zero, &mess, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1482 ierr = MPI_Allreduce(&zero, &messLen, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1483 ierr = MPI_Allreduce(&zero, &red, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1484 } 1485 mess *= 0.5; messLen *= 0.5; red /= size; 1486 1487 /* Get total number of events in this stage -- 1488 Currently, a single processor can register more events than another, but events must all be registered in order, 1489 just like stages. We can removed this requirement if necessary by having a global event numbering and indirection 1490 on the event ID. This seems best accomplished by assoicating a communicator with each stage. 1491 1492 Problem: If the event did not happen on proc 1, its name will not be available. 1493 Problem: Event visibility is not implemented 1494 */ 1495 if (localStageUsed[stage]) { 1496 eventInfo = stageLog->stageInfo[stage].eventLog->eventInfo; 1497 localNumEvents = stageLog->stageInfo[stage].eventLog->numEvents; 1498 } else localNumEvents = 0; 1499 ierr = MPIU_Allreduce(&localNumEvents, &numEvents, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr); 1500 for (event = 0; event < numEvents; event++) { 1501 /* CANNOT use MPIU_Allreduce() since it might fail the line number check */ 1502 if (localStageUsed[stage] && (event < stageLog->stageInfo[stage].eventLog->numEvents) && (eventInfo[event].depth == 0)) { 1503 if ((eventInfo[event].count > 0) && (eventInfo[event].time > 0.0)) flopr = eventInfo[event].flops; 1504 else flopr = 0.0; 1505 1506 ierr = MPI_Allreduce(&flopr, &minf, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1507 ierr = MPI_Allreduce(&flopr, &maxf, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1508 ierr = MPI_Allreduce(&eventInfo[event].flops, &totf, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1509 ierr = MPI_Allreduce(&eventInfo[event].time, &mint, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1510 ierr = MPI_Allreduce(&eventInfo[event].time, &maxt, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1511 ierr = MPI_Allreduce(&eventInfo[event].time, &tott, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1512 ierr = MPI_Allreduce(&eventInfo[event].numMessages, &totm, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1513 ierr = MPI_Allreduce(&eventInfo[event].messageLength, &totml, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1514 ierr = MPI_Allreduce(&eventInfo[event].numReductions, &totr, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1515 ierr = MPI_Allreduce(&eventInfo[event].count, &minCt, 1, MPI_INT, MPI_MIN, comm);CHKERRQ(ierr); 1516 ierr = MPI_Allreduce(&eventInfo[event].count, &maxCt, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr); 1517 name = stageLog->eventLog->eventInfo[event].name; 1518 } else { 1519 flopr = 0.0; 1520 ierr = MPI_Allreduce(&flopr, &minf, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1521 ierr = MPI_Allreduce(&flopr, &maxf, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1522 ierr = MPI_Allreduce(&zero, &totf, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1523 ierr = MPI_Allreduce(&zero, &mint, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr); 1524 ierr = MPI_Allreduce(&zero, &maxt, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr); 1525 ierr = MPI_Allreduce(&zero, &tott, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1526 ierr = MPI_Allreduce(&zero, &totm, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1527 ierr = MPI_Allreduce(&zero, &totml, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1528 ierr = MPI_Allreduce(&zero, &totr, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr); 1529 ierr = MPI_Allreduce(&ierr, &minCt, 1, MPI_INT, MPI_MIN, comm);CHKERRQ(ierr); 1530 ierr = MPI_Allreduce(&ierr, &maxCt, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr); 1531 name = ""; 1532 } 1533 if (mint < 0.0) { 1534 ierr = PetscFPrintf(comm, fd, "WARNING!!! Minimum time %g over all processors for %s is negative! This happens\n on some machines whose times cannot handle too rapid calls.!\n artificially changing minimum to zero.\n",mint,name); 1535 mint = 0; 1536 } 1537 if (minf < 0.0) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Minimum flops %g over all processors for %s is negative! Not possible!",minf,name); 1538 totm *= 0.5; totml *= 0.5; totr /= size; 1539 1540 if (maxCt != 0) { 1541 if (minCt != 0) ratCt = ((PetscLogDouble) maxCt)/minCt; else ratCt = 0.0; 1542 if (mint != 0.0) ratt = maxt/mint; else ratt = 0.0; 1543 if (minf != 0.0) ratf = maxf/minf; else ratf = 0.0; 1544 if (TotalTime != 0.0) fracTime = tott/TotalTime; else fracTime = 0.0; 1545 if (TotalFlops != 0.0) fracFlops = totf/TotalFlops; else fracFlops = 0.0; 1546 if (stageTime != 0.0) fracStageTime = tott/stageTime; else fracStageTime = 0.0; 1547 if (flops != 0.0) fracStageFlops = totf/flops; else fracStageFlops = 0.0; 1548 if (numMessages != 0.0) fracMess = totm/numMessages; else fracMess = 0.0; 1549 if (messageLength != 0.0) fracMessLen = totml/messageLength; else fracMessLen = 0.0; 1550 if (numReductions != 0.0) fracRed = totr/numReductions; else fracRed = 0.0; 1551 if (mess != 0.0) fracStageMess = totm/mess; else fracStageMess = 0.0; 1552 if (messLen != 0.0) fracStageMessLen = totml/messLen; else fracStageMessLen = 0.0; 1553 if (red != 0.0) fracStageRed = totr/red; else fracStageRed = 0.0; 1554 if (totm != 0.0) totml /= totm; else totml = 0.0; 1555 if (maxt != 0.0) flopr = totf/maxt; else flopr = 0.0; 1556 if (fracStageTime > 1.00) ierr = PetscFPrintf(comm, fd,"Warning -- total time of event greater than time of entire stage -- something is wrong with the timer\n");CHKERRQ(ierr); 1557 ierr = PetscFPrintf(comm, fd, 1558 "%-16s %7d%4.1f %5.4e%4.1f %3.2e%4.1f %2.1e %2.1e %2.1e%3.0f%3.0f%3.0f%3.0f%3.0f %3.0f%3.0f%3.0f%3.0f%3.0f %5.0f\n", 1559 name, maxCt, ratCt, maxt, ratt, maxf, ratf, totm, totml, totr, 1560 100.0*fracTime, 100.0*fracFlops, 100.0*fracMess, 100.0*fracMessLen, 100.0*fracRed, 1561 100.0*fracStageTime, 100.0*fracStageFlops, 100.0*fracStageMess, 100.0*fracStageMessLen, 100.0*fracStageRed, 1562 PetscAbsReal(flopr/1.0e6));CHKERRQ(ierr); 1563 } 1564 } 1565 } 1566 1567 /* Memory usage and object creation */ 1568 ierr = PetscFPrintf(comm, fd, "------------------------------------------------------------------------------------------------------------------------\n");CHKERRQ(ierr); 1569 ierr = PetscFPrintf(comm, fd, "\n");CHKERRQ(ierr); 1570 ierr = PetscFPrintf(comm, fd, "Memory usage is given in bytes:\n\n");CHKERRQ(ierr); 1571 1572 /* Right now, only stages on the first processor are reported here, meaning only objects associated with 1573 the global communicator, or MPI_COMM_SELF for proc 1. We really should report global stats and then 1574 stats for stages local to processor sets. 1575 */ 1576 /* We should figure out the longest object name here (now 20 characters) */ 1577 ierr = PetscFPrintf(comm, fd, "Object Type Creations Destructions Memory Descendants' Mem.\n");CHKERRQ(ierr); 1578 ierr = PetscFPrintf(comm, fd, "Reports information only for process 0.\n");CHKERRQ(ierr); 1579 for (stage = 0; stage < numStages; stage++) { 1580 if (localStageUsed[stage]) { 1581 classInfo = stageLog->stageInfo[stage].classLog->classInfo; 1582 ierr = PetscFPrintf(comm, fd, "\n--- Event Stage %d: %s\n\n", stage, stageInfo[stage].name);CHKERRQ(ierr); 1583 for (oclass = 0; oclass < stageLog->stageInfo[stage].classLog->numClasses; oclass++) { 1584 if ((classInfo[oclass].creations > 0) || (classInfo[oclass].destructions > 0)) { 1585 ierr = PetscFPrintf(comm, fd, "%20s %5d %5d %11.0f %g\n", stageLog->classLog->classInfo[oclass].name, 1586 classInfo[oclass].creations, classInfo[oclass].destructions, classInfo[oclass].mem, 1587 classInfo[oclass].descMem);CHKERRQ(ierr); 1588 } 1589 } 1590 } else { 1591 ierr = PetscFPrintf(comm, fd, "\n--- Event Stage %d: Unknown\n\n", stage);CHKERRQ(ierr); 1592 } 1593 } 1594 1595 ierr = PetscFree(localStageUsed);CHKERRQ(ierr); 1596 ierr = PetscFree(stageUsed);CHKERRQ(ierr); 1597 ierr = PetscFree(localStageVisible);CHKERRQ(ierr); 1598 ierr = PetscFree(stageVisible);CHKERRQ(ierr); 1599 1600 /* Information unrelated to this particular run */ 1601 ierr = PetscFPrintf(comm, fd, "========================================================================================================================\n");CHKERRQ(ierr); 1602 PetscTime(&y); 1603 PetscTime(&x); 1604 PetscTime(&y); PetscTime(&y); PetscTime(&y); PetscTime(&y); PetscTime(&y); 1605 PetscTime(&y); PetscTime(&y); PetscTime(&y); PetscTime(&y); PetscTime(&y); 1606 ierr = PetscFPrintf(comm,fd,"Average time to get PetscTime(): %g\n", (y-x)/10.0);CHKERRQ(ierr); 1607 /* MPI information */ 1608 if (size > 1) { 1609 MPI_Status status; 1610 PetscMPIInt tag; 1611 MPI_Comm newcomm; 1612 1613 ierr = MPI_Barrier(comm);CHKERRQ(ierr); 1614 PetscTime(&x); 1615 ierr = MPI_Barrier(comm);CHKERRQ(ierr); 1616 ierr = MPI_Barrier(comm);CHKERRQ(ierr); 1617 ierr = MPI_Barrier(comm);CHKERRQ(ierr); 1618 ierr = MPI_Barrier(comm);CHKERRQ(ierr); 1619 ierr = MPI_Barrier(comm);CHKERRQ(ierr); 1620 PetscTime(&y); 1621 ierr = PetscFPrintf(comm, fd, "Average time for MPI_Barrier(): %g\n", (y-x)/5.0);CHKERRQ(ierr); 1622 ierr = PetscCommDuplicate(comm,&newcomm, &tag);CHKERRQ(ierr); 1623 ierr = MPI_Barrier(comm);CHKERRQ(ierr); 1624 if (rank) { 1625 ierr = MPI_Recv(0, 0, MPI_INT, rank-1, tag, newcomm, &status);CHKERRQ(ierr); 1626 ierr = MPI_Send(0, 0, MPI_INT, (rank+1)%size, tag, newcomm);CHKERRQ(ierr); 1627 } else { 1628 PetscTime(&x); 1629 ierr = MPI_Send(0, 0, MPI_INT, 1, tag, newcomm);CHKERRQ(ierr); 1630 ierr = MPI_Recv(0, 0, MPI_INT, size-1, tag, newcomm, &status);CHKERRQ(ierr); 1631 PetscTime(&y); 1632 ierr = PetscFPrintf(comm,fd,"Average time for zero size MPI_Send(): %g\n", (y-x)/size);CHKERRQ(ierr); 1633 } 1634 ierr = PetscCommDestroy(&newcomm);CHKERRQ(ierr); 1635 } 1636 ierr = PetscOptionsView(NULL,viewer);CHKERRQ(ierr); 1637 1638 /* Machine and compile information */ 1639 #if defined(PETSC_USE_FORTRAN_KERNELS) 1640 ierr = PetscFPrintf(comm, fd, "Compiled with FORTRAN kernels\n");CHKERRQ(ierr); 1641 #else 1642 ierr = PetscFPrintf(comm, fd, "Compiled without FORTRAN kernels\n");CHKERRQ(ierr); 1643 #endif 1644 #if defined(PETSC_USE_REAL_SINGLE) 1645 ierr = PetscFPrintf(comm, fd, "Compiled with single precision PetscScalar and PetscReal\n");CHKERRQ(ierr); 1646 #elif defined(PETSC_USE_LONGDOUBLE) 1647 ierr = PetscFPrintf(comm, fd, "Compiled with long double precision PetscScalar and PetscReal\n");CHKERRQ(ierr); 1648 #endif 1649 1650 #if defined(PETSC_USE_REAL_MAT_SINGLE) 1651 ierr = PetscFPrintf(comm, fd, "Compiled with single precision matrices\n");CHKERRQ(ierr); 1652 #else 1653 ierr = PetscFPrintf(comm, fd, "Compiled with full precision matrices (default)\n");CHKERRQ(ierr); 1654 #endif 1655 ierr = PetscFPrintf(comm, fd, "sizeof(short) %d sizeof(int) %d sizeof(long) %d sizeof(void*) %d sizeof(PetscScalar) %d sizeof(PetscInt) %d\n", 1656 (int) sizeof(short), (int) sizeof(int), (int) sizeof(long), (int) sizeof(void*),(int) sizeof(PetscScalar),(int) sizeof(PetscInt));CHKERRQ(ierr); 1657 1658 ierr = PetscFPrintf(comm, fd, "Configure options: %s",petscconfigureoptions);CHKERRQ(ierr); 1659 ierr = PetscFPrintf(comm, fd, "%s", petscmachineinfo);CHKERRQ(ierr); 1660 ierr = PetscFPrintf(comm, fd, "%s", petsccompilerinfo);CHKERRQ(ierr); 1661 ierr = PetscFPrintf(comm, fd, "%s", petsccompilerflagsinfo);CHKERRQ(ierr); 1662 ierr = PetscFPrintf(comm, fd, "%s", petsclinkerinfo);CHKERRQ(ierr); 1663 1664 /* Cleanup */ 1665 ierr = PetscFPrintf(comm, fd, "\n");CHKERRQ(ierr); 1666 ierr = PetscLogViewWarnDebugging(comm,fd);CHKERRQ(ierr); 1667 PetscFunctionReturn(0); 1668 } 1669 1670 PetscErrorCode PetscLogView_Nested(PetscViewer); 1671 1672 /*@C 1673 PetscLogView - Prints a summary of the logging. 1674 1675 Collective over MPI_Comm 1676 1677 Input Parameter: 1678 . viewer - an ASCII viewer 1679 1680 Options Database Keys: 1681 + -log_view [:filename] - Prints summary of log information 1682 . -log_view :filename.py:ascii_info_detail - Saves logging information from each process as a Python file 1683 . -log_view :filename.xml:ascii_xml - Saves a summary of the logging information in a nested format, use a browser to open this file, for example on 1684 Apple MacOS systems use open -a Safari filename.xml 1685 . -log_all - Saves a file Log.rank for each MPI process with details of each step of the computation 1686 - -log_trace [filename] - Displays a trace of what each process is doing 1687 1688 Notes: 1689 It is possible to control the logging programatically but we recommend using the options database approach whenever possible 1690 By default the summary is printed to stdout. 1691 1692 Before calling this routine you must have called either PetscLogDefaultBegin() or PetscLogNestedBegin() 1693 1694 If PETSc is configured with --with-logging=0 then this functionality is not available 1695 1696 The nested XML format was kindly donated by Koos Huijssen and Christiaan M. Klaij MARITIME RESEARCH INSTITUTE NETHERLANDS 1697 1698 Level: beginner 1699 1700 .keywords: log, dump, print 1701 .seealso: PetscLogDefaultBegin(), PetscLogDump() 1702 @*/ 1703 PetscErrorCode PetscLogView(PetscViewer viewer) 1704 { 1705 PetscErrorCode ierr; 1706 PetscBool isascii; 1707 PetscViewerFormat format; 1708 int stage, lastStage; 1709 PetscStageLog stageLog; 1710 1711 PetscFunctionBegin; 1712 if (!PetscLogPLB) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Must use -log_summary or PetscLogDefaultBegin() before calling this routine"); 1713 /* Pop off any stages the user forgot to remove */ 1714 lastStage = 0; 1715 ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 1716 ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr); 1717 while (stage >= 0) { 1718 lastStage = stage; 1719 ierr = PetscStageLogPop(stageLog);CHKERRQ(ierr); 1720 ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr); 1721 } 1722 ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr); 1723 if (!isascii) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Currently can only view logging to ASCII"); 1724 ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1725 if (format == PETSC_VIEWER_DEFAULT || format == PETSC_VIEWER_ASCII_INFO) { 1726 ierr = PetscLogView_Default(viewer);CHKERRQ(ierr); 1727 } else if (format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 1728 ierr = PetscLogView_Detailed(viewer);CHKERRQ(ierr); 1729 } else if (format == PETSC_VIEWER_ASCII_XML) { 1730 ierr = PetscLogView_Nested(viewer);CHKERRQ(ierr); 1731 } 1732 ierr = PetscStageLogPush(stageLog, lastStage);CHKERRQ(ierr); 1733 PetscFunctionReturn(0); 1734 } 1735 1736 /*@C 1737 PetscLogViewFromOptions - Processes command line options to determine if/how a PetscLog is to be viewed. 1738 1739 Collective on PETSC_COMM_WORLD 1740 1741 Not normally called by user 1742 1743 Level: intermediate 1744 1745 @*/ 1746 PetscErrorCode PetscLogViewFromOptions(void) 1747 { 1748 PetscErrorCode ierr; 1749 PetscViewer viewer; 1750 PetscBool flg; 1751 PetscViewerFormat format; 1752 1753 PetscFunctionBegin; 1754 ierr = PetscOptionsGetViewer(PETSC_COMM_WORLD,NULL,"-log_view",&viewer,&format,&flg);CHKERRQ(ierr); 1755 if (flg) { 1756 ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr); 1757 ierr = PetscLogView(viewer);CHKERRQ(ierr); 1758 ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr); 1759 ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 1760 } 1761 PetscFunctionReturn(0); 1762 } 1763 1764 1765 1766 /*----------------------------------------------- Counter Functions -------------------------------------------------*/ 1767 /*@C 1768 PetscGetFlops - Returns the number of flops used on this processor 1769 since the program began. 1770 1771 Not Collective 1772 1773 Output Parameter: 1774 flops - number of floating point operations 1775 1776 Notes: 1777 A global counter logs all PETSc flop counts. The user can use 1778 PetscLogFlops() to increment this counter to include flops for the 1779 application code. 1780 1781 Level: intermediate 1782 1783 .keywords: log, flops, floating point operations 1784 1785 .seealso: PetscTime(), PetscLogFlops() 1786 @*/ 1787 PetscErrorCode PetscGetFlops(PetscLogDouble *flops) 1788 { 1789 PetscFunctionBegin; 1790 *flops = petsc_TotalFlops; 1791 PetscFunctionReturn(0); 1792 } 1793 1794 PetscErrorCode PetscLogObjectState(PetscObject obj, const char format[], ...) 1795 { 1796 PetscErrorCode ierr; 1797 size_t fullLength; 1798 va_list Argp; 1799 1800 PetscFunctionBegin; 1801 if (!petsc_logObjects) PetscFunctionReturn(0); 1802 va_start(Argp, format); 1803 ierr = PetscVSNPrintf(petsc_objects[obj->id].info, 64,format,&fullLength, Argp);CHKERRQ(ierr); 1804 va_end(Argp); 1805 PetscFunctionReturn(0); 1806 } 1807 1808 1809 /*MC 1810 PetscLogFlops - Adds floating point operations to the global counter. 1811 1812 Synopsis: 1813 #include <petsclog.h> 1814 PetscErrorCode PetscLogFlops(PetscLogDouble f) 1815 1816 Not Collective 1817 1818 Input Parameter: 1819 . f - flop counter 1820 1821 1822 Usage: 1823 .vb 1824 PetscLogEvent USER_EVENT; 1825 PetscLogEventRegister("User event",0,&USER_EVENT); 1826 PetscLogEventBegin(USER_EVENT,0,0,0,0); 1827 [code segment to monitor] 1828 PetscLogFlops(user_flops) 1829 PetscLogEventEnd(USER_EVENT,0,0,0,0); 1830 .ve 1831 1832 Notes: 1833 A global counter logs all PETSc flop counts. The user can use 1834 PetscLogFlops() to increment this counter to include flops for the 1835 application code. 1836 1837 Level: intermediate 1838 1839 .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscGetFlops() 1840 1841 .keywords: log, flops, floating point operations 1842 M*/ 1843 1844 /*MC 1845 PetscPreLoadBegin - Begin a segment of code that may be preloaded (run twice) 1846 to get accurate timings 1847 1848 Synopsis: 1849 #include <petsclog.h> 1850 void PetscPreLoadBegin(PetscBool flag,char *name); 1851 1852 Not Collective 1853 1854 Input Parameter: 1855 + flag - PETSC_TRUE to run twice, PETSC_FALSE to run once, may be overridden 1856 with command line option -preload true or -preload false 1857 - name - name of first stage (lines of code timed separately with -log_summary) to 1858 be preloaded 1859 1860 Usage: 1861 .vb 1862 PetscPreLoadBegin(PETSC_TRUE,"first stage); 1863 lines of code 1864 PetscPreLoadStage("second stage"); 1865 lines of code 1866 PetscPreLoadEnd(); 1867 .ve 1868 1869 Notes: Only works in C/C++, not Fortran 1870 1871 Flags available within the macro. 1872 + PetscPreLoadingUsed - true if we are or have done preloading 1873 . PetscPreLoadingOn - true if it is CURRENTLY doing preload 1874 . PetscPreLoadIt - 0 for the first computation (with preloading turned off it is only 0) 1 for the second 1875 - PetscPreLoadMax - number of times it will do the computation, only one when preloading is turned on 1876 The first two variables are available throughout the program, the second two only between the PetscPreLoadBegin() 1877 and PetscPreLoadEnd() 1878 1879 Level: intermediate 1880 1881 .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscPreLoadEnd(), PetscPreLoadStage() 1882 1883 Concepts: preloading 1884 Concepts: timing^accurate 1885 Concepts: paging^eliminating effects of 1886 1887 1888 M*/ 1889 1890 /*MC 1891 PetscPreLoadEnd - End a segment of code that may be preloaded (run twice) 1892 to get accurate timings 1893 1894 Synopsis: 1895 #include <petsclog.h> 1896 void PetscPreLoadEnd(void); 1897 1898 Not Collective 1899 1900 Usage: 1901 .vb 1902 PetscPreLoadBegin(PETSC_TRUE,"first stage); 1903 lines of code 1904 PetscPreLoadStage("second stage"); 1905 lines of code 1906 PetscPreLoadEnd(); 1907 .ve 1908 1909 Notes: only works in C/C++ not fortran 1910 1911 Level: intermediate 1912 1913 .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscPreLoadBegin(), PetscPreLoadStage() 1914 1915 M*/ 1916 1917 /*MC 1918 PetscPreLoadStage - Start a new segment of code to be timed separately. 1919 to get accurate timings 1920 1921 Synopsis: 1922 #include <petsclog.h> 1923 void PetscPreLoadStage(char *name); 1924 1925 Not Collective 1926 1927 Usage: 1928 .vb 1929 PetscPreLoadBegin(PETSC_TRUE,"first stage); 1930 lines of code 1931 PetscPreLoadStage("second stage"); 1932 lines of code 1933 PetscPreLoadEnd(); 1934 .ve 1935 1936 Notes: only works in C/C++ not fortran 1937 1938 Level: intermediate 1939 1940 .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscPreLoadBegin(), PetscPreLoadEnd() 1941 1942 M*/ 1943 1944 1945 #else /* end of -DPETSC_USE_LOG section */ 1946 1947 PetscErrorCode PetscLogObjectState(PetscObject obj, const char format[], ...) 1948 { 1949 PetscFunctionBegin; 1950 PetscFunctionReturn(0); 1951 } 1952 1953 #endif /* PETSC_USE_LOG*/ 1954 1955 1956 PetscClassId PETSC_LARGEST_CLASSID = PETSC_SMALLEST_CLASSID; 1957 PetscClassId PETSC_OBJECT_CLASSID = 0; 1958 1959 /*@C 1960 PetscClassIdRegister - Registers a new class name for objects and logging operations in an application code. 1961 1962 Not Collective 1963 1964 Input Parameter: 1965 . name - The class name 1966 1967 Output Parameter: 1968 . oclass - The class id or classid 1969 1970 Level: developer 1971 1972 .keywords: log, class, register 1973 1974 @*/ 1975 PetscErrorCode PetscClassIdRegister(const char name[],PetscClassId *oclass) 1976 { 1977 #if defined(PETSC_USE_LOG) 1978 PetscStageLog stageLog; 1979 PetscInt stage; 1980 PetscErrorCode ierr; 1981 #endif 1982 1983 PetscFunctionBegin; 1984 *oclass = ++PETSC_LARGEST_CLASSID; 1985 #if defined(PETSC_USE_LOG) 1986 ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr); 1987 ierr = PetscClassRegLogRegister(stageLog->classLog, name, *oclass);CHKERRQ(ierr); 1988 for (stage = 0; stage < stageLog->numStages; stage++) { 1989 ierr = PetscClassPerfLogEnsureSize(stageLog->stageInfo[stage].classLog, stageLog->classLog->numClasses);CHKERRQ(ierr); 1990 } 1991 #endif 1992 PetscFunctionReturn(0); 1993 } 1994 1995 #if defined(PETSC_USE_LOG) && defined(PETSC_HAVE_MPE) 1996 #include <mpe.h> 1997 1998 PetscBool PetscBeganMPE = PETSC_FALSE; 1999 2000 PETSC_INTERN PetscErrorCode PetscLogEventBeginMPE(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject); 2001 PETSC_INTERN PetscErrorCode PetscLogEventEndMPE(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject); 2002 2003 /*@C 2004 PetscLogMPEBegin - Turns on MPE logging of events. This creates large log files 2005 and slows the program down. 2006 2007 Collective over PETSC_COMM_WORLD 2008 2009 Options Database Keys: 2010 . -log_mpe - Prints extensive log information 2011 2012 Notes: 2013 A related routine is PetscLogDefaultBegin() (with the options key -log_summary), which is 2014 intended for production runs since it logs only flop rates and object 2015 creation (and should not significantly slow the programs). 2016 2017 Level: advanced 2018 2019 Concepts: logging^MPE 2020 Concepts: logging^message passing 2021 2022 .seealso: PetscLogDump(), PetscLogDefaultBegin(), PetscLogAllBegin(), PetscLogEventActivate(), 2023 PetscLogEventDeactivate() 2024 @*/ 2025 PetscErrorCode PetscLogMPEBegin(void) 2026 { 2027 PetscErrorCode ierr; 2028 2029 PetscFunctionBegin; 2030 /* Do MPE initialization */ 2031 if (!MPE_Initialized_logging()) { /* This function exists in mpich 1.1.2 and higher */ 2032 ierr = PetscInfo(0,"Initializing MPE.\n");CHKERRQ(ierr); 2033 ierr = MPE_Init_log();CHKERRQ(ierr); 2034 2035 PetscBeganMPE = PETSC_TRUE; 2036 } else { 2037 ierr = PetscInfo(0,"MPE already initialized. Not attempting to reinitialize.\n");CHKERRQ(ierr); 2038 } 2039 ierr = PetscLogSet(PetscLogEventBeginMPE, PetscLogEventEndMPE);CHKERRQ(ierr); 2040 PetscFunctionReturn(0); 2041 } 2042 2043 /*@C 2044 PetscLogMPEDump - Dumps the MPE logging info to file for later use with Jumpshot. 2045 2046 Collective over PETSC_COMM_WORLD 2047 2048 Level: advanced 2049 2050 .seealso: PetscLogDump(), PetscLogAllBegin(), PetscLogMPEBegin() 2051 @*/ 2052 PetscErrorCode PetscLogMPEDump(const char sname[]) 2053 { 2054 char name[PETSC_MAX_PATH_LEN]; 2055 PetscErrorCode ierr; 2056 2057 PetscFunctionBegin; 2058 if (PetscBeganMPE) { 2059 ierr = PetscInfo(0,"Finalizing MPE.\n");CHKERRQ(ierr); 2060 if (sname) { 2061 ierr = PetscStrcpy(name,sname);CHKERRQ(ierr); 2062 } else { 2063 ierr = PetscGetProgramName(name,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); 2064 } 2065 ierr = MPE_Finish_log(name);CHKERRQ(ierr); 2066 } else { 2067 ierr = PetscInfo(0,"Not finalizing MPE (not started by PETSc).\n");CHKERRQ(ierr); 2068 } 2069 PetscFunctionReturn(0); 2070 } 2071 2072 #define PETSC_RGB_COLORS_MAX 39 2073 static const char *PetscLogMPERGBColors[PETSC_RGB_COLORS_MAX] = { 2074 "OliveDrab: ", 2075 "BlueViolet: ", 2076 "CadetBlue: ", 2077 "CornflowerBlue: ", 2078 "DarkGoldenrod: ", 2079 "DarkGreen: ", 2080 "DarkKhaki: ", 2081 "DarkOliveGreen: ", 2082 "DarkOrange: ", 2083 "DarkOrchid: ", 2084 "DarkSeaGreen: ", 2085 "DarkSlateGray: ", 2086 "DarkTurquoise: ", 2087 "DeepPink: ", 2088 "DarkKhaki: ", 2089 "DimGray: ", 2090 "DodgerBlue: ", 2091 "GreenYellow: ", 2092 "HotPink: ", 2093 "IndianRed: ", 2094 "LavenderBlush: ", 2095 "LawnGreen: ", 2096 "LemonChiffon: ", 2097 "LightCoral: ", 2098 "LightCyan: ", 2099 "LightPink: ", 2100 "LightSalmon: ", 2101 "LightSlateGray: ", 2102 "LightYellow: ", 2103 "LimeGreen: ", 2104 "MediumPurple: ", 2105 "MediumSeaGreen: ", 2106 "MediumSlateBlue:", 2107 "MidnightBlue: ", 2108 "MintCream: ", 2109 "MistyRose: ", 2110 "NavajoWhite: ", 2111 "NavyBlue: ", 2112 "OliveDrab: " 2113 }; 2114 2115 /*@C 2116 PetscLogMPEGetRGBColor - This routine returns a rgb color useable with PetscLogEventRegister() 2117 2118 Not collective. Maybe it should be? 2119 2120 Output Parameter 2121 . str - character string representing the color 2122 2123 Level: developer 2124 2125 .keywords: log, mpe , color 2126 .seealso: PetscLogEventRegister 2127 @*/ 2128 PetscErrorCode PetscLogMPEGetRGBColor(const char *str[]) 2129 { 2130 static int idx = 0; 2131 2132 PetscFunctionBegin; 2133 *str = PetscLogMPERGBColors[idx]; 2134 idx = (idx + 1)% PETSC_RGB_COLORS_MAX; 2135 PetscFunctionReturn(0); 2136 } 2137 2138 #endif /* PETSC_USE_LOG && PETSC_HAVE_MPE */ 2139