Currently I am learning about profiling parallel programs. All the profilers heavily use all kinds of instrumentations but this topic is not well explained. Do you know any good sources from which I could learn about instrumentation (static, binary, dynamic)?
Before jumping straight to interesting articles and sources I'll start by defining the key words, just in case.
Static analysis : consists in analyzing the target binary file without executing it. Hence the
static. Such analysis can be used in order to build a first draft of the application's Control Flow Graph, Call Graph, ... For example, building the CFG consists of cutting the code into basic blocks and then linking them using the branch targets (if they're not indirect branches).
Dynamic analysis : consists in inserting probes (function calls) around key areas of the binary, running the binary and dumping the probes' results. Such probes can be rdtsc instructions on x86, or any other hardware counter. For example, dynamic analysis is used by Gprof to assess the amount of time spent in each function. Many other profilers such as VTune, MAQAO, DynInst, ... use dynamic analysis to locate hotspots.
Both of these analyses can be applied to a binary file (meaning an executable program), and that's what we call binary analysis. On the other hand, static analysis can be applied on source code as well as binary. Lint, for example, performs static analysis in order to find buggy code constructs.
There aren't many detailed references I can cite, rather a set of scientific publications which span the use and benefits of those techniques, along with some interesting algorithms.
For static analysis I would recommend this collection of articles : Static Analysis 20th International Symposium, SAS 2013, Seattle, WA, USA, June 20-22, 2012, Proceedings.