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) . 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.