From 6dbf014773f5f8ac0b0e291392dfde518de94daf Mon Sep 17 00:00:00 2001 From: johannst Date: Tue, 23 Jan 2024 01:39:29 +0000 Subject: deploy: 8c9fd06e839c06717dd2dcb067371a5e1fc71801 --- trace_profile/callgrind.html | 292 ++++++++++++++++++++++++++++++++++ trace_profile/callgrind/Makefile | 14 ++ trace_profile/callgrind/cg_example.cc | 36 +++++ trace_profile/index.html | 9 +- trace_profile/ltrace.html | 2 +- trace_profile/oprofile.html | 6 +- trace_profile/perf.html | 2 +- trace_profile/strace.html | 6 +- trace_profile/time.html | 10 +- 9 files changed, 360 insertions(+), 17 deletions(-) create mode 100644 trace_profile/callgrind.html create mode 100644 trace_profile/callgrind/Makefile create mode 100644 trace_profile/callgrind/cg_example.cc (limited to 'trace_profile') diff --git a/trace_profile/callgrind.html b/trace_profile/callgrind.html new file mode 100644 index 0000000..415a5d5 --- /dev/null +++ b/trace_profile/callgrind.html @@ -0,0 +1,292 @@ + + + + + + callgrind - Notes + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

callgrind

+

Callgrind is a tracing profiler to record the function call history of a target +program. It is part of the valgrind tool suite.

+

Profiling data is collected by instrumentation rather than sampling of the +target program.

+

Callgrind does not capture the actual time spent in a function but computes the +cost of a function based on the instructions fetched (Ir = Instruction read). +Therefore effects like slow IO are not reflected, which should be kept in mind +when analyzing callgrind results.

+

By default the profiler data is dumped when the target process is terminating, +but callgrind_control allows for interactive control of callgrind.

+
# Run a program under callgrind.
+valgrind --tool=callgrind -- <prog>
+
+# Interactive control of callgrind.
+callgrind_control [opts]
+  opts:
+    -b ............. show current backtrace
+    -e ............. show current event counters
+    -s ............. show current stats
+    --dump[=file] .. dump current collection
+    -i=on|off ...... turn instrumentation on|off
+
+

Results can be analyzed by using one of the following tools

+ +

The following is a collection of frequently used callgrind options.

+
valgrind --tool=callgrind [opts] -- <prog>
+  opts:
+    --callgrind-out-file=<file> .... output file, rather than callgrind.out.<pid>
+    --dump-instr=<yes|no> .......... annotation on instrucion level,
+                                     allows for asm annotations
+
+    --instr-atstart=<yes|no> ....... control if instrumentation is enabled from 
+                                     beginning of the program
+
+    --separate-threads=<yes|no> .... create separate output files per thread,
+                                     appends -<thread_id> to the output file
+
+

Profile specific part of the target

+

Programmatically enable/disable instrumentation using the macros defined in +the callgrind header.

+
#include <valgrind/callgrind.h>
+
+int main() {
+    // init ..
+
+    CALLGRIND_START_INSTRUMENTATION;
+    compute();
+    CALLGRIND_STOP_INSTRUMENTATION;
+
+    // shutdown ..
+}
+
+
+

In this case, callgrind should be launched with --instr-atstart=no.

+
+

Alternatively instrumentation can be controlled with callgrind_control -i on/off.

+

The files cg_example.cc and +Makefile provide a full example.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trace_profile/callgrind/Makefile b/trace_profile/callgrind/Makefile new file mode 100644 index 0000000..0da099c --- /dev/null +++ b/trace_profile/callgrind/Makefile @@ -0,0 +1,14 @@ +prof: cg_example + valgrind --tool=callgrind --dump-instr=yes --instr-atstart=no -- ./cg_example + +prof-cache: cg_example + valgrind --tool=callgrind --dump-instr=yes --instr-atstart=no --cache-sim=yes -- ./cg_example + +show: + callgrind_annotate + +cg_example: cg_example.cc + clang++ -o cg_example -Wall -Wextra -O2 -g -fno-inline cg_example.cc -lpthread + +clean: + $(RM) callgrind.* cg_example diff --git a/trace_profile/callgrind/cg_example.cc b/trace_profile/callgrind/cg_example.cc new file mode 100644 index 0000000..d143790 --- /dev/null +++ b/trace_profile/callgrind/cg_example.cc @@ -0,0 +1,36 @@ +#include +#include + +#include + +struct cnt { + volatile int a; + volatile int b; +}; + +void inc_a(cnt &c) { c.a++; } +void inc_b(cnt &c) { c.b++; } + +int main() { + cnt C{0, 0}; + + CALLGRIND_START_INSTRUMENTATION; + + std::thread T1([&C]() { + for (int i = 0; i < 20000000; ++i) { + inc_a(C); + } + }); + std::thread T2([&C]() { + for (int i = 0; i < 10000000; ++i) { + inc_b(C); + } + }); + T1.join(); + T2.join(); + + CALLGRIND_STOP_INSTRUMENTATION; + + printf("%d %d\n", C.a, C.b); + return 0; +} diff --git a/trace_profile/index.html b/trace_profile/index.html index 47c1444..b57a03b 100644 --- a/trace_profile/index.html +++ b/trace_profile/index.html @@ -88,7 +88,7 @@ diff --git a/trace_profile/ltrace.html b/trace_profile/ltrace.html index be09b95..fa540af 100644 --- a/trace_profile/ltrace.html +++ b/trace_profile/ltrace.html @@ -88,7 +88,7 @@