The store path: how a write becomes visible to another core 1 2 3 4 4 5 6 // at the start: data = 0, ready = false // core 0 (writer) data = 42; ready = true; // core 1 (reader) while (!ready) {} use(data); // expects 42 Core 0 · writer runs data = 42; ready = true; invalidate queue store buffer not used here data = 42 1 waiting for ACKs before L1D all ACKs in, written to L1D L1D (private) data 0 S data 42 M ready 0 E ready 1 M ready 1 S 4 L2 (private) Core 1 · reader runs while (!ready); use(data); invalidate queue store buffer invalidate data 3 ACK sent, not processed not used here L1D (private) data 0 S data 0 S stale ready none I ready 1 S L2 (private) 5 ready's line moves to core 1 2 3 6 core 1 reads the old 0 here On-chip interconnect (ring or mesh): Read, RFO, invalidate, ACK and cache-to-cache lines all go here L3 (shared by all cores) + snoop filter The snoop filter records which cores hold each line, so invalidations go only to cores with a copy (②). It never pushes new values into another core: core 1 fetches ready itself (⑤).

MmodifiedEexclusiveSsharedIinvalid