If C1 requests X while only C0 may hold it, a peer broadcast and an exact holder lookup both target C0. In this two-core case there is no saving for that request. The value of filtering appears when the peer is known absent, or in a larger system.
Use independent stable snapshots derived from the course's X = 0 start, not successive transactions. A row describes what a later request would need to investigate. The ordinary H directory still determines legal permission and data handling; a filter does not invent a new grant rule.
Independent snapshot | C0 state / value | C1 state / value | H directory | Memory | Newest data | Targets to investigate for C1 |
|---|---|---|---|---|---|---|
No private copy | I / - | I / - | U | 0 | memory: 0 | None if absence is trustworthy |
One clean reader | S / 0 | I / - | S{C0} | 0 | C0 and memory: 0 | C0 for a GetM |
Dirty exclusive copy after C0 stored 1 | M / 1 | I / - | exclusive(C0) | 0 | C0: 1 | C0 for data and permission recovery |
Each probe needs a response (Inv-Ack, or Data from the holder), so count both. With N private caches, a broadcast sends N-1 probes and collects N-1 responses. A filter with k candidates, 0 <= k <= N-1, sends k and collects k, plus one filter lookup at H. Why N-1 tag checks per miss scale badly is covered in Choosing Snoop or Directory. These are message counts, not bytes or router-link traversals: a multicast tree may share links, and a slow required response can still dominate latency even when k is small.
Illustrative case | Broadcast | Filter |
|---|---|---|
N = 8, k = 2 | 7 probes + 7 responses = 14 messages | 4 messages, plus one filter lookup at H |
def counts(n, requester, candidates):
peers = set(range(n)) - {requester}
assert n >= 2 and requester in range(n)
assert candidates <= peers
return 2 * len(peers), 2 * len(candidates)
assert counts(2, 1, {0}) == (2, 2)
assert counts(2, 1, set()) == (2, 0)
assert counts(8, 0, {2, 5}) == (14, 4)
assert counts(8, 0, set(range(1, 8))) == (14, 14)
broadcast, filtered = counts(8, 0, {2, 5})
assert broadcast - filtered == 10
print("PASS: probes plus responses, 14 for broadcast and 4 for k = 2 at N = 8")That destination may hold the only current value or be backpressured. Fewer probes do not remove its data or permission obligation, or guarantee a bounded service time.