A snoop filter saves work by predicting which caches might hold a line. A positive result means 'possibly present', not 'definitely has the latest value'. A negative result can justify skipping a target only when the filter's maintained invariant proves absence. One common hybrid is a limited-pointer directory: each entry stores up to k sharer ids and falls back to broadcast once a line has more than k sharers. Both modes still need a defined completion rule.
Keep the pilot to C0, C1, H and memory. Assume H broadcasts by default and keeps a filter F instead of a full directory; F is the only holder record. F is metadata at H, not a third cache or a new protocol message. X is one location in a 64-byte line and starts uncached with memory = 0. H still serializes conflicts for X, and filtering never bypasses required acknowledgement collection. Larger groups are an architectural extension, not additional participants in this example.
Consider an independent idle snapshot: C0 is S / 0, C1 is I / -, and memory is 0. There is no writer. A safe filter must include every actual holder. The table checks four candidate F values against that rule. It shows no transaction or state transition.
Actual holders of X | Filter F | Classification | Safe discovery decision |
|---|---|---|---|
{C0} | {C0} | Exact | Keep C0 as a possible target; C1 can be omitted |
{C0} | {C0,C1} | Conservative false positive for C1 | May check C1 unnecessarily; retain C0 |
{C0} | {C1} | False negative for C0 | Unsafe to use for pruning: it hides a real reader |
{C0} | Unknown | No proof of absence | Use a safe broader lookup; do not interpret unknown as empty |
Now classify a different legal snapshot: C0 is M / 9, C1 is I / -, and memory is stale at 0. Omitting C0 would hide both write permission and the only newest copy. A filter miss for C0 cannot be repaired by falling back to memory: memory holds stale 0, so a reader would get the wrong value. The authority is F plus the caches: F must list C0 so that the request reaches it, and C0's own M state carries the dirty responsibility. This is a state classification, not a dirty-read sequence.
A conservative set may waste work safely; an omitted real holder breaks correctness. Allocations, permission changes and filter replacement must preserve coverage. An inclusive filter guarantees that every cached copy has an entry. To evict an entry, H first back-invalidates the listed holders: Inv to a clean holder, or Fwd-GetM to a dirty holder so that its data reaches memory. H frees the entry only after every Inv-Ack has arrived, or the dirty data has arrived and H has written it to memory. The alternative is to mark the region unknown and broadcast for it. Simply dropping an entry is not a safe eviction policy.
The Primer, second edition, chapter 8 discusses directory and broadcast combinations and limited directory organisations.
No. The first set overapproximates the real holder set {C0}; checking C1 can waste work safely with defined completion. The second set omits C0, so an operation could fail to discover a real reader. Approximation is safe only in the conservative direction.