1c4762a1bSJed Brown 202aabc32SToby Isaac static char help[] = "Tests several PetscLogHandler implementations.\n\n"; 3c4762a1bSJed Brown 4c4762a1bSJed Brown #include <petscsys.h> 5c4762a1bSJed Brown 602aabc32SToby Isaac /* Create a phony perfstubs implementation for testing. 702aabc32SToby Isaac 802aabc32SToby Isaac The dynamic loading in perfstubs is only enabled with the following flags, 902aabc32SToby Isaac so we only try to export these functions if they are present */ 1002aabc32SToby Isaac #if defined(__linux__) && PetscDefined(HAVE_DLFCN_H) 1102aabc32SToby Isaac 1202aabc32SToby Isaac PETSC_EXTERN void ps_tool_initialize(void) 1302aabc32SToby Isaac { 1402aabc32SToby Isaac PetscFunctionBegin; 1502aabc32SToby Isaac PetscCallContinue(PetscPrintf(PETSC_COMM_SELF, "ps_tool_initialize()\n")); 1602aabc32SToby Isaac PetscFunctionReturnVoid(); 1702aabc32SToby Isaac } 1802aabc32SToby Isaac 1902aabc32SToby Isaac PETSC_EXTERN void ps_tool_finalize(void) 2002aabc32SToby Isaac { 2102aabc32SToby Isaac PetscFunctionBegin; 2202aabc32SToby Isaac PetscCallContinue(PetscPrintf(PETSC_COMM_SELF, "ps_tool_finalize()\n")); 2302aabc32SToby Isaac PetscFunctionReturnVoid(); 2402aabc32SToby Isaac } 2502aabc32SToby Isaac 2602aabc32SToby Isaac PETSC_EXTERN void *ps_tool_timer_create(const char name[]) 2702aabc32SToby Isaac { 2802aabc32SToby Isaac PetscFunctionBegin; 2902aabc32SToby Isaac PetscCallContinue(PetscPrintf(PETSC_COMM_SELF, "ps_tool_timer_create(\"%s\")\n", name)); 3002aabc32SToby Isaac PetscFunctionReturn((void *)name); 3102aabc32SToby Isaac } 3202aabc32SToby Isaac 3302aabc32SToby Isaac PETSC_EXTERN void *ps_tool_timer_start(void *arg) 3402aabc32SToby Isaac { 3502aabc32SToby Isaac const char *name = (const char *)arg; 3602aabc32SToby Isaac 3702aabc32SToby Isaac PetscFunctionBegin; 3802aabc32SToby Isaac PetscCallContinue(PetscPrintf(PETSC_COMM_SELF, "ps_tool_timer_start() [%s]\n", name)); 3902aabc32SToby Isaac PetscFunctionReturn(NULL); 4002aabc32SToby Isaac } 4102aabc32SToby Isaac 4202aabc32SToby Isaac PETSC_EXTERN void *ps_tool_timer_stop(void *arg) 4302aabc32SToby Isaac { 4402aabc32SToby Isaac const char *name = (const char *)arg; 4502aabc32SToby Isaac 4602aabc32SToby Isaac PetscFunctionBegin; 4702aabc32SToby Isaac PetscCallContinue(PetscPrintf(PETSC_COMM_SELF, "ps_tool_timer_stop() [%s]\n", name)); 4802aabc32SToby Isaac PetscFunctionReturn(NULL); 4902aabc32SToby Isaac } 5002aabc32SToby Isaac #endif 5102aabc32SToby Isaac 5202aabc32SToby Isaac static PetscErrorCode CallEvents(PetscLogEvent event1, PetscLogEvent event2, PetscLogEvent event3) 5302aabc32SToby Isaac { 5402aabc32SToby Isaac char *data; 5502aabc32SToby Isaac 5602aabc32SToby Isaac PetscFunctionBegin; 5702aabc32SToby Isaac PetscCall(PetscLogEventBegin(event1, NULL, NULL, NULL, NULL)); 5802aabc32SToby Isaac PetscCall(PetscSleep(0.05)); 5902aabc32SToby Isaac PetscCall(PetscLogEventBegin(event2, NULL, NULL, NULL, NULL)); 6002aabc32SToby Isaac PetscCall(PetscSleep(0.1)); 6102aabc32SToby Isaac PetscCall(PetscLogEventBegin(event3, NULL, NULL, NULL, NULL)); 6202aabc32SToby Isaac PetscCall(PetscCalloc1(1048576, &data)); 6302aabc32SToby Isaac PetscCall(PetscFree(data)); 6402aabc32SToby Isaac PetscCall(PetscSleep(0.15)); 6502aabc32SToby Isaac PetscCall(PetscLogEventEnd(event3, NULL, NULL, NULL, NULL)); 6602aabc32SToby Isaac PetscCall(PetscLogEventEnd(event2, NULL, NULL, NULL, NULL)); 6702aabc32SToby Isaac PetscCall(PetscLogEventEnd(event1, NULL, NULL, NULL, NULL)); 6802aabc32SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 6902aabc32SToby Isaac } 7002aabc32SToby Isaac 71d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv) 72d71ae5a4SJacob Faibussowitsch { 7302aabc32SToby Isaac PetscLogStage stage1, stage2, stage3 = -1; 7402aabc32SToby Isaac PetscLogEvent event1, event2, event3; 7502aabc32SToby Isaac PetscMPIInt rank; 7602aabc32SToby Isaac PetscContainer container1, container2; 77c4762a1bSJed Brown 78327415f7SBarry Smith PetscFunctionBeginUser; 799566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, (char *)0, help)); 8002aabc32SToby Isaac PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 8102aabc32SToby Isaac if (rank) { 829566063dSJacob Faibussowitsch PetscCall(PetscLogEventRegister("Event3", 0, &event3)); 8302aabc32SToby Isaac PetscCall(PetscLogEventRegister("Event2", 0, &event2)); 8402aabc32SToby Isaac PetscCall(PetscLogEventRegister("Event1", PETSC_CONTAINER_CLASSID, &event1)); 8502aabc32SToby Isaac PetscCall(PetscLogStageRegister("Stage2", &stage2)); 8602aabc32SToby Isaac PetscCall(PetscLogStageRegister("Stage1", &stage1)); 8702aabc32SToby Isaac PetscCall(PetscLogStageRegister("Stage3", &stage3)); 8802aabc32SToby Isaac (void)stage3; // stage3 intentionally not used 8902aabc32SToby Isaac } else { 9002aabc32SToby Isaac PetscCall(PetscLogEventRegister("Event2", 0, &event2)); 9102aabc32SToby Isaac PetscCall(PetscLogEventRegister("Event1", PETSC_CONTAINER_CLASSID, &event1)); 9202aabc32SToby Isaac PetscCall(PetscLogEventRegister("Event3", 0, &event3)); 9302aabc32SToby Isaac PetscCall(PetscLogStageRegister("Stage1", &stage1)); 9402aabc32SToby Isaac PetscCall(PetscLogStageRegister("Stage2", &stage2)); 9502aabc32SToby Isaac } 96c4762a1bSJed Brown 9702aabc32SToby Isaac for (PetscInt i = 0; i < 8; i++) { 9802aabc32SToby Isaac PetscCall(PetscLogEventSetDof(event3, i, (PetscLogDouble)i)); 9902aabc32SToby Isaac PetscCall(PetscLogEventSetError(event3, i, (PetscLogDouble)i + 8)); 10002aabc32SToby Isaac } 10102aabc32SToby Isaac 10202aabc32SToby Isaac PetscCall(CallEvents(event1, event2, event3)); 10302aabc32SToby Isaac 10402aabc32SToby Isaac PetscCall(PetscLogStagePush(stage1)); 10502aabc32SToby Isaac { 10602aabc32SToby Isaac PetscCall(PetscSleep(0.1)); 10702aabc32SToby Isaac PetscCall(CallEvents(event1, event2, event3)); 10802aabc32SToby Isaac } 10902aabc32SToby Isaac PetscCall(PetscLogStagePop()); 11002aabc32SToby Isaac 11102aabc32SToby Isaac PetscCall(PetscContainerCreate(PETSC_COMM_WORLD, &container1)); 11202aabc32SToby Isaac PetscCall(PetscContainerCreate(PETSC_COMM_WORLD, &container2)); 11302aabc32SToby Isaac PetscCall(PetscObjectSetName((PetscObject)container2, "Container 2")); 11402aabc32SToby Isaac PetscCall(PetscLogObjectState((PetscObject)container1, "Setting object state for testing purposes with %d self-referential format argument", 1)); 11502aabc32SToby Isaac 11602aabc32SToby Isaac PetscCall(PetscLogStagePush(stage2)); 11702aabc32SToby Isaac { 11802aabc32SToby Isaac PetscCall(PetscSleep(0.1)); 11902aabc32SToby Isaac PetscCall(CallEvents(event1, event2, event3)); 12002aabc32SToby Isaac 12102aabc32SToby Isaac PetscCall(PetscLogStagePush(stage1)); 12202aabc32SToby Isaac { 12302aabc32SToby Isaac PetscCall(PetscSleep(0.1)); 12402aabc32SToby Isaac PetscCall(CallEvents(event1, event2, event3)); 12502aabc32SToby Isaac } 12602aabc32SToby Isaac PetscCall(PetscLogStagePop()); 12702aabc32SToby Isaac 12802aabc32SToby Isaac PetscCall(PetscLogEventSync(event1, PETSC_COMM_WORLD)); 12902aabc32SToby Isaac PetscCall(PetscLogEventBegin(event1, container1, container2, NULL, NULL)); 13002aabc32SToby Isaac { 13102aabc32SToby Isaac PetscCall(PetscSleep(0.1)); 13202aabc32SToby Isaac PetscCall(PetscLogStagePush(stage1)); 13302aabc32SToby Isaac { 13402aabc32SToby Isaac PetscCall(PetscSleep(0.1)); 13502aabc32SToby Isaac PetscCall(CallEvents(event1, event2, event3)); 13602aabc32SToby Isaac } 13702aabc32SToby Isaac PetscCall(PetscLogStagePop()); 13802aabc32SToby Isaac } 13902aabc32SToby Isaac PetscCall(PetscLogEventEnd(event1, container1, container2, NULL, NULL)); 14002aabc32SToby Isaac } 14102aabc32SToby Isaac PetscCall(PetscLogStagePop()); 14202aabc32SToby Isaac 14302aabc32SToby Isaac PetscCall(PetscContainerDestroy(&container2)); 14402aabc32SToby Isaac PetscCall(PetscContainerDestroy(&container1)); 14502aabc32SToby Isaac 1469566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 147b122ec5aSJacob Faibussowitsch return 0; 148c4762a1bSJed Brown } 14902aabc32SToby Isaac 15002aabc32SToby Isaac /*TEST 15102aabc32SToby Isaac 15202aabc32SToby Isaac # smoke test: does this program run with / without PETSC_USE_LOG? 15302aabc32SToby Isaac test: 15402aabc32SToby Isaac suffix: 0 15502aabc32SToby Isaac nsize: {{1 2}} 15602aabc32SToby Isaac 15702aabc32SToby Isaac # flamegraph: times of PetscSleep() are designed so the flamegraph should have reproducible entries 15802aabc32SToby Isaac test: 15902aabc32SToby Isaac suffix: 1 16002aabc32SToby Isaac nsize: {{1 2}} 16102aabc32SToby Isaac requires: defined(PETSC_USE_LOG) 16202aabc32SToby Isaac args: -log_view ::ascii_flamegraph 16302aabc32SToby Isaac filter: sed -E "s/ [0-9]+/ time_removed/g" 16402aabc32SToby Isaac 16502aabc32SToby Isaac test: 16602aabc32SToby Isaac suffix: 2 16702aabc32SToby Isaac requires: defined(PETSC_USE_LOG) 16802aabc32SToby Isaac nsize: 1 16902aabc32SToby Isaac args: -log_trace 17002aabc32SToby Isaac 17102aabc32SToby Isaac # test PetscLogDump() with action and object logging 17202aabc32SToby Isaac test: 17302aabc32SToby Isaac suffix: 3 17402aabc32SToby Isaac nsize: 1 17502aabc32SToby Isaac requires: defined(PETSC_USE_LOG) 17602aabc32SToby Isaac args: -log_include_actions -log_include_objects -log_all 17702aabc32SToby Isaac temporaries: Log.0 17802aabc32SToby Isaac filter: cat Log.0 | grep "\\(Actions accomplished\\|Objects created\\|Name\\|Info\\)" 17902aabc32SToby Isaac 18002aabc32SToby Isaac # -log_sync is not necessary for csv output, this is just a convenient test to add sync testing to 18102aabc32SToby Isaac test: 18202aabc32SToby Isaac suffix: 4 18302aabc32SToby Isaac nsize: 2 18402aabc32SToby Isaac requires: defined(PETSC_USE_LOG) 18502aabc32SToby Isaac args: -log_view ::ascii_csv -log_sync 18602aabc32SToby Isaac filter: grep "Event[123]" | grep -v "PCMPI" 18702aabc32SToby Isaac 18802aabc32SToby Isaac # we don't guarantee clog2print is available, so we just verify that our events are in the output file 18902aabc32SToby Isaac test: 19002aabc32SToby Isaac suffix: 5 19102aabc32SToby Isaac nsize: 1 19202aabc32SToby Isaac requires: defined(PETSC_USE_LOG) defined(PETSC_HAVE_MPE) 19302aabc32SToby Isaac args: -log_mpe ex30_mpe 19402aabc32SToby Isaac temporaries: ex30_mpe.clog2 19502aabc32SToby Isaac filter: strings ex30_mpe.clog2 | grep "Event[123]" 19602aabc32SToby Isaac 19702aabc32SToby Isaac # we don't have tau as a dependency, so we test a dummy perfstubs tool 19802aabc32SToby Isaac test: 19902aabc32SToby Isaac suffix: 6 20002aabc32SToby Isaac nsize: 1 201*4d0bca77SToby Isaac requires: tau_perfstubs linux dlfcn_h defined(PETSC_USE_LOG) defined(PETSC_USE_SHARED_LIBRARIES) 20202aabc32SToby Isaac args: -log_perfstubs 20302aabc32SToby Isaac filter: grep "\\(Main Stage\\|Event1\\|Event2\\|Event3\\|Stage1\\|Stage2\\)" 20402aabc32SToby Isaac 20502aabc32SToby Isaac test: 20602aabc32SToby Isaac suffix: 7 20702aabc32SToby Isaac nsize: 1 20802aabc32SToby Isaac requires: defined(PETSC_USE_LOG) 209461318ebSToby Isaac args: -log_view ::ascii_info_detail -log_handler_default_use_threadsafe_events 21002aabc32SToby Isaac filter: grep "Event[123]" | grep "\\(Main Stage\\|Stage[123]\\)" 21102aabc32SToby Isaac 21202aabc32SToby Isaac # test the sync warning 21302aabc32SToby Isaac test: 21402aabc32SToby Isaac suffix: 8 21502aabc32SToby Isaac nsize: 2 21602aabc32SToby Isaac requires: defined(PETSC_USE_LOG) 21702aabc32SToby Isaac args: -log_view -log_sync 21802aabc32SToby Isaac filter: grep "This program was run with logging synchronization" 21902aabc32SToby Isaac 22002aabc32SToby Isaac # test -log_trace with an output file 22102aabc32SToby Isaac test: 22202aabc32SToby Isaac suffix: 9 22302aabc32SToby Isaac requires: defined(PETSC_USE_LOG) 22402aabc32SToby Isaac nsize: 1 22502aabc32SToby Isaac output_file: output/ex30_2.out 22602aabc32SToby Isaac args: -log_trace trace.log 22702aabc32SToby Isaac temporaries: trace.log 22802aabc32SToby Isaac filter: cat trace.log.0 22902aabc32SToby Isaac 23002aabc32SToby Isaac TEST*/ 231