Performance And Debugging Tools: Niagara
Memory Profiling
Valgrind
Valgrind http://valgrind.org/ is a suite of tools for debugging and profiling programs especially useful for finding memory problems, such as memory leaks and segfaults. To use it on the GPC you must first load the module valgrind.
module load valgrind
In serial valgrind can simply by run as follows, with no need to recompile your binary
valgrind --tool=memcheck ./a.out
there are many useful flags such as --leak-check=yes and --show-reachable=yes that can be found by running valgrind --help on consulting the man pages.
For use with mpi on Niagara use the following modules
module load NiaEnv/2018a intel/2018.2 intelmpi/2018.2 valgrind/3.13.0
Valgrind can also be used in parallel with MPI as well, http://valgrind.org/docs/manual/mc-manual.html#mc-manual.mpiwrap in a similar fashion, however a library needs to preloaded first.
LD_PRELOAD=${SCINET_VALGRIND_ROOT}/lib/valgrind/libmpiwrap-amd64-linux.so mpirun -np 2 valgrind --tool=memcheck ./a.out
Besides being a extremely good at finding memory problems, valgrind comes with a tool called cachegrind which can find cache use problems in your code; its use is described in our Intro To Performance.
Debugging
gdb
GDB is solid source-language level serial debugger. This SNUG TechTalk from Nov 2010 introduces debugging with gdb. gdb will debug code compiled with both intel and gcc compilers. Use module load gdb to ensure you are using the most recent version of gdb.
gdb -tui launches a text-based interface that functions a bit like a gui for debugging code, and can be handy.
ddt
ddt is ARM's graphical parallel debugger, in the ddt module. Highly recommended! Use module load ddt to load ddt into your environment. More information on the Parallel Debugging with DDT page.
Performance Profiling
gprof
gprof is a very useful tool for finding out where a program is spending its time; its use is described in our Intro To Performance.