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.
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_...
Great tool for optimizing C/C++ code.
If you're using multiple threads, then you might have issues with false sharing, which is a bitch. Valgrind can help you there.