Computing spatial reuse requires a slight variation on how we compute temporal reuse. Assuming the data are stored in row major order (an assumption we make without loss of generality), accesses to the same cache line will only occur when the same row is accessed. In addition, the row index expressions must be different, but still fall within the size of a cache line. We can test for all of these conditions as follows.
Two different iterations access the same row whenever all but the row index are equivalent. This is in contrast with temporal reuse, where all indices, including the row, must be equivalent. To extract this spatial reuse vector space, we simply replace the last row in with zeros to create , and solve for the nullspace of . For example, consider the A[i][j] reference in Figure , where = , and therefore = . The resulting nullspace of is , which indicates that the same row of A[i][j] is accessed along the inner loop.
To check whether different elements are being accessed within the same row, we compare whether the temporal and spatial reuse vector spaces are identical. This can occur since reusing the same data item is a degenerate case of reusing the same cache line (i.e. the nullspace of is a subset of the nullspace of ). If the temporal and spatial reuse vector spaces are identical, then there is strictly temporal reuse-if they differ, then there is spatial reuse along the vectors that are unique to the spatial reuse vector space. For example, the A[i][j] reference in Figure has a temporal reuse vector space of (i.e. there is no temporal reuse), and a spatial reuse vector space of ; therefore unique elements within the row are accessed along (i.e. the inner loop). For the B[j] reference, however, the temporal and spatial reuse vector spaces are both , and therefore there is only temporal reuse.
Once we identify accesses to different elements within the same row, the final step is to check whether the stride is less than the cache line size. If so, then the reference has spatial reuse.