The effectiveness of caches and data prefetch buffers in large-scale shared memory multiprocessors