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
ps_tool_initialize(void)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
ps_tool_finalize(void)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
ps_tool_timer_create(const char name[])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
ps_tool_timer_start(void * arg)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
ps_tool_timer_stop(void * arg)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
CallEvents(PetscLogEvent event1,PetscLogEvent event2,PetscLogEvent event3)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
main(int argc,char ** argv)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;
78c8025a54SPierre Jolivet PetscCall(PetscInitialize(&argc, &argv, NULL, 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 {
1172c9b8e7aSToby 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}}
155*3886731fSPierre Jolivet output_file: output/empty.out
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
2014d0bca77SToby 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
23061cc7448SToby Isaac # test -log_nvtx
23161cc7448SToby Isaac test:
23261cc7448SToby Isaac suffix: 10
23361cc7448SToby Isaac requires: cuda defined(PETSC_USE_LOG)
23461cc7448SToby Isaac args: -device_enable eager -log_nvtx -info :loghandler
23561cc7448SToby Isaac
2360bc1c2e8SToby Isaac # test multiple view: default listed first
2370bc1c2e8SToby Isaac test:
2380bc1c2e8SToby Isaac suffix: 11
2390bc1c2e8SToby Isaac requires: defined(PETSC_USE_LOG)
240*3886731fSPierre Jolivet output_file: output/empty.out
2410bc1c2e8SToby Isaac temporaries: default.log flamegraph.log
2420bc1c2e8SToby Isaac args: -log_view :default.log,:flamegraph.log:ascii_flamegraph
2430bc1c2e8SToby Isaac
2440bc1c2e8SToby Isaac # test multiple view: default listed second
2450bc1c2e8SToby Isaac test:
2460bc1c2e8SToby Isaac suffix: 12
2470bc1c2e8SToby Isaac requires: defined(PETSC_USE_LOG)
248*3886731fSPierre Jolivet output_file: output/empty.out
2490bc1c2e8SToby Isaac temporaries: default.log flamegraph.log
2500bc1c2e8SToby Isaac args: -log_view :flamegraph.log:ascii_flamegraph,:default.log
2510bc1c2e8SToby Isaac
25202aabc32SToby Isaac TEST*/
253