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