When a cache receives a snoop request, a destination-based snoop filter can sometimes be used to provide an immediate response without requiring a tag array lookup. This can help reduce the energy consumed by the tag array, and it can reduce contention for the tag array. For large multiprocessors, snoop-induced tag lookups can easily out-number demand lookups from the local processor, leading to high contention and a loss of performance so it is important to try to reduce that contention.
One way to reduce this contention is to use a multi-ported tag array, or to use a duplicate tag array dedicated to servicing snoop lookups. While this avoids contention with demand lookups from the local core, it comes at a very high cost in terms of on-chip area and energy consumption. It might also introduce complications associated with keeping the contents of the two tag arrays synchronized.
A number of filters rely on supplier locality, that is, the tendency for specific snoops to be serviced by specific nodes. For example, when node A requests a block it often finds that no other node has that block (supplier is main memory) or that the block is in node B.
The filter proposed by Atoofian and Banisadi works well for some workloads but its speculative nature results in significant performance penalties for many workloads. A number of destination filters have been proposed that take a more conservative approach and only filter snoops that are definitely unnecessary. These approaches can be divided into inclusive filters that track all blocks that might return a positive snoop response, and exlusive filters that track a subset of blocks that will definitely not return a positive response.