We now focus on how each of these techniques, particularly
prefetching, fits into the ``big picture'' of coping with memory
latency. As a quick summary, Table presents the benefits and
requirements of each technique. Given these techniques, we would
like to apply them in the following order. First, the latency
should be reduced as much as possible, through caching and
locality optimizations. Reducing latency is preferable over
tolerating latency since it actually reduces the demand for main
memory bandwidth, which can be crucial. Caches provide the
foundation for all of these latency-hiding techniques, and
locality optimizations are also attractive since they require no
additional hardware support. After reducing latency, we then
want to tolerate any remaining latency, starting with the least
expensive techniques before resorting to more costly techniques.
The first step is buffering and pipelining accesses, which is an
effective means of hiding write latency and requires only a
lockup-free cache-a requiremen