xref: /petsc/src/sys/tests/ex30.c (revision 4d0bca776686f47d3b16e29808a75967a001cdfb)
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