An alternative approach to moving data close to the processor is to place it outside the normal cache hierarchy in a separate prefetch target buffer. We will discuss this approach qualitatively in this subsection. The motivation presented in previous proposals for a prefetch target buffer is that by keeping the prefetched data separate, it cannot interfere with data in the normal cache (which is referred to as the cache ``pollution'' problem) [42][13]. While this may be true, this approach has a number of drawbacks.
First, a prefetch target buffer only addresses the problem of conflicts
between prefetches and references-it does nothing to help the cases
when references conflict with other references, or when prefetches conflict
with other prefetches; these latter cases are just as important. As
evidence of how important reference-to-reference conflicts are, they were
so bad in the original versions of four of the uniprocessor applications
that we manually changed the alignment of some matrices to help alleviate
these conflicts (as described earlier in Section ).
Therefore a more general solution that can address all different types of
conflicts would be preferable to a prefetch target buffer, which only
addresses a subset of the conflicts. We will discuss general solutions to
cache conflicts later in Section
.
Second, building a large prefetch target buffer will require sacrificing a
significant amount of cache area, thereby reducing the hit rate of normal
references. This will be particularly undesirable for applications that do
not contain prefetches (either because they have not been recompiled or
because they do not benefit from prefetching). Finally, prefetching into a
special target buffer makes it difficult for prefetches to be non-binding in a multiprocessor environment, since the target buffer must
also be kept coherent. In general, treating prefetch accesses as special
cases will be more complicated than handling them through the normal cache
miss mechanism.
For the types of applications considered in this study, the compiler rarely prefetches data that is not needed in the immediate future, and therefore the problem is not accurately characterized as cache pollution. Cache conflicts, on the other hand, can be a problem between any types of references. Therefore the best approach is to prefetch directly into the primary cache and find other general techniques for coping with cache conflicts.