Since locality can only occur if there is reuse, the first step in locality
analysis is determining the intrinsic data reuse through reuse
analysis. Reuse analysis attempts to discover those instances of array
accesses that refer to the same memory line. There are three
kinds of reuse, which parallel the three kinds of locality described in
Section
: temporal, spatial, and group. The
difference is that while reuse is an inherent property of code, locality
also depends on the ability of the cache to retain data. Therefore if we
had an infinitely large cache, which would retain data perfectly, reuse
would be equivalent to locality.
Our reuse analysis step is nearly identical to that proposed by Wolf and Lam [87][86], which we will briefly summarize in this subsection. Our terminology is slightly different, however, since we tailor our reuse categories to more closely match our prefetching algorithm. What they refer to as self-temporal reuse is the same as what we refer to as temporal reuse, and corresponds to whenever a given array reference accesses the same data location multiple times within a loop nest. However, whereas they define self-spatial reuse to include accesses anywhere within the same cache line, we define spatial reuse only as accesses to different locations within the same line. Therefore their definition of self-spatial reuse includes self-temporal reuse as a subset, while our definition of spatial reuse does not. Finally, what they call group-spatial reuse is the same as what we call group reuse, and occurs whenever different array references access the same cache line. We do not treat their group-temporal reuse (different references accessing exactly the same location) as a special case, since it is a subset of our group reuse. As we will demonstrate later in this chapter, our categories of reuse correspond to different cases for scheduling prefetches.
A key simplification of reuse analysis is that rather than trying to
precisely compute the sets of iterations (i.e. actual loop index values)
that use the same data, which is prohibitively expensive, we instead
succinctly capture the intuitive notion that reuse is carried by a specific
loop with the following mathematical formulation. We represent an
-dimensional loop nest as a polytope in an
-dimensional iteration
space (i.e. a finite convex polyhedron bounded by the loop bounds), with
the outermost loop represented by the first dimension in the space. We
represent the shape of the set of iterations that use the same data by a
reuse vector space [87]. The remainder of this
subsection describes how this mathematical representation is used to
compute temporal, spatial, and group reuse.