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