Module 14: "Directory-based Cache Coherence"
  Lecture 33: "SCI Protocol"
 

Handling write miss

  • CASE A: requester is in HEAD_DIRTY state already
    • Directory must be in GONE state
    • Only need to invalidate sharers
    • Requester sends an invalidation to the next sharer
    • A sharer upon receiving an invalidation sends a roll-out request to its next sharer (unless TAIL); the receiving node sets its upstream pointer properly and sends a roll-out acknowledgment
    • Eventually roll-out request is acknowledged, the sharer invalidates its RAC line and sends a reply back to head with the id of the next sharer
    • Head moves on to purge the sharer with received id
    • During the entire process requester’s RAC line remains in PENDING state
    • Note that home is not at all involved here
  • CASE B: requester is in ONLY_DIRTY state
    • No transaction needed
  • CASE C: requester is in HEAD_FRESH state
    • Send state change request to home (FRESH to GONE)
    • Once acknowledgment from home is received list purging can be started
    • What if the home is in a state different from FRESH with a different head node?
      • The only case in SCI when a NACK is generated
      • The requester on receiving the NACK changes its state to PENDING and initiates a new write request to home for transitioning to ONLY_DIRTY
  • CASE D: requester in MID_FRESH or TAIL_FRESH state
    • First it must roll out from the list and attach itself to the head in HEAD_FRESH state (recall that only the head node can write)
    • This roll-out may require acknowledgments from upstream and downstream neighbors (if MID) or just the upstream neighbor (if TAIL)
    • Follow CASE C
  • CASE E: requester not a sharer
    • First get the block in HEAD_DIRTY state
    • Follow CASE A