4 ms·
How do you reliably assess the cache behavior of your software? Thinking in terms of cache behavior is certainly very useful for making software that runs fast,
by joelthelion 14y ago
How do you reliably assess the cache behavior of your software? Thinking in terms of cache behavior is certainly very useful for making software that runs fast, but if you have no reliable to check what is actually happening, you're pretty much walking in the dark.
- mkilling 14y agoCheck out PAPI[1], it lets you examine CPU performance counters such as data- and instruction cache misses. [1] http://icl.cs.utk.edu/projects/papi/wiki/Main_Page http://icl.cs.utk.edu/projects/papi/wiki/Main_Page
- scaramanga 14y agoindeed, or perf record -e cache-misses using the hardware performance counters
- cwzwarich 14y agoMost CPUs have performance counters that let you determine when performance impacting events occur (e.g. pipeline flushes, reduced dispatch width, cache misses, etc.). In their simplest form they are a simple count, but there is usually some way to trigger an interrupt every N events rather than simply incrementing a counter, so that you can store the offending program counter somewhere for later aggregation. This functionality isn't always exposed very well by the OS, though. If you're using Linux then perf and oprofile are the standard ways to access performance counters. Alternatively you can execute your code in a simulator with a cache model. Of course, this model won't actually match your hardware (unless you're using a serious cycle-accurate simulator), but it might be more insightful than performance counters alone. I don't know if any of the standard x86 emulators include a good cache model.
- duaneb 14y agoThere are a bunch of existing tools that use the underlying architecture's performance measuring capabilities to give you things like cache hits/misses and branch prediction performance; I really like oprofile (but it only runs on linux). If you're using multiple threads, then you might have issues with false sharing, which is a bitch. Valgrind can help you there.
- ajuc 14y agokcachegrind on linux is great for that. It shows you your code annotated with number of cache misses per line of code, it also can show you callgraph with aggregated running time, etc. Internaly it uses callgrind. Great tool for optimizing C/C++ code.
- forrestthewoods 14y agoIntel VTune would be one option. Not a cheap but very high quality results. http://software.intel.com/en-us/intel-vtune-amplifier-xe http://software.intel.com/en-us/intel-vtune-amplifier-xe
- zokier 14y agoAMD has CodeAnalyst software which helps you analyze many aspects of your software performance, including cache behavior. http://developer.amd.com/tools/heterogeneous-computing/amd-codeanalyst-performance-analyzer/ http://developer.amd.com/tools/heterogeneous-computing/amd-c... Just from the front page I see a presentation "Cache Line Utilization with AMD CodeAnalyst Software" which touches the subject http://developer.amd.com/wordpress/media/2012/10/2011_12_14_CA_CLU.pdf http://developer.amd.com/wordpress/media/2012/10/2011_12_14_...
- moconnor 14y agoIf you've got C/C++ (or Fortran!) code it's pretty straightforward - I work on a profiling tool that tracks things like CPU utilization and memory contention for HPC codes (http://www.allinea.com/products/map/ http://www.allinea.com/products/map/). For single-machine programs you could just hack something together with the perf counters fairly easily.
- vonmoltke 14y agoA clustered signal processing application I previously worked on used custom middleware with perfmon2[1] built into it for collecting performance counter data across all MPI nodes the application was running on. The framework for multiple nodes is not all that difficult. [1] http://perfmon2.sourceforge.net/ http://perfmon2.sourceforge.net/
- npsimons 14y agoCachegrind (part of Valgrind) will do this for you: http://valgrind.org/docs/manual/cg-manual.html http://valgrind.org/docs/manual/cg-manual.html