Lec13 - Coherence

한국어판 강의자료 · 52쪽
1쪽
p.1CSED503 고급 컴퓨터 구조 – 강의 13
2쪽
p.2다중프로세서(MP)의 memory hierarchy(메모리 계층 구조)
  • P
  • P
  • P
  • 캐시
  • 메모리
  • shared cache(공유 캐시)
  • P
  • P
  • P
  • $
  • 중앙 집중형 공유 메모리 (대칭 다중프로세서 또는 SMP)
  • $
  • $
  • 메모리
  • P
  • P
  • P
  • $
  • 메모리
  • fully-connected shared memory(완전 연결형 공유 메모리)
  • $
  • $
  • 메모리
  • interconnection network(상호연결 네트워크)
  • P
  • $
  • 메모리
  • interconnection network(상호연결 네트워크)
  • P
  • $
  • 메모리
  • 분산 공유 메모리 (비균일 메모리 접근 또는 NUMA)
  • bus(버스)
  • bus(버스)
3쪽
p.3bus(버스) 관리
  • "bus(버스)"는 공유된 와이어의 집합이다 (최신 "버스"는 포인트투포인트 링크를 사용함)
  • 한 번에 하나의 "master(마스터)"만 트랜잭션을 시작할 수 있다 (와이어를 드라이브함)
  • 여러 "slave(슬레이브)"가 와이어의 트랜잭션을 관찰하고 조건부로 응답할 수 있다
  • slave(슬레이브)는 bus(버스)의 주소를 디코딩하여 자신이 응답해야 하는지 확인한다 (메모리가 가장 일반적인 슬레이브)
  • 일부 master(마스터)는 slave(슬레이브) 역할도 할 수 있다
  • master(마스터)들은 bus(버스) "컨트롤러"에 요청을 통해 접근을 arbitrate(경쟁 조정)한다
  • 일부 bus(버스)는 하나의 master(마스터)만 허용한다 (이 경우 마스터는 컨트롤러이기도 함)
  • master(마스터) 0
  • master(마스터) 1
  • slave(슬레이브) 0
  • slave(슬레이브) 1
  • bus controller(버스 컨트롤러)
  • 클록/컨트롤
  • 주소
  • 데이터
  • 요청
  • 허가
4쪽
p.4공유 메모리 multiprocessor (MP)(다중프로세서)
  • 모든 프로세서의 메모리 시각을 일관성 있게 유지하기 위해 snoopy mechanism(스누피 메커니즘)을 사용한다
  • CPU1
  • 메모리
  • bus(버스)
  • 메인 메모리 (DRAM)
  • DMA
  • snoopy cache(스누피 캐시)
  • CPU2
  • snoopy cache(스누피 캐시)
  • CPU3
  • snoopy cache(스누피 캐시)
  • 디스크
  • DMA
  • 네트워크
  • bus(버스) 컨트롤
5쪽
p.5일관성 정의
  • 일관성은 불변성으로 정의한다:
  • 단일 쓰기자, 다중 읽기자 불변성 (SWMR): 어떤 메모리 위치 A에 대해, 주어진 시점에 A에 쓸 수 있는 코어는 단 하나뿐이거나, A를 읽을 수 있는 여러 코어가 존재한다
  • Data-Value invariant(데이터 값 불변성): 어떤 에포크의 시작 시점에서 메모리 위치의 값은 그 위치의 마지막 읽기-쓰기 에포크의 끝 시점에서의 값과 동일하다
  • cache coherence(캐시 일관성)의 요구 사항:
  • write propagation(쓰기 전파)
  • • 쓰기 내용이 다른 프로세스에 보여져야 한다
  • write serialization(쓰기 순서화)
  • • 동일한 위치에 대한 모든 쓰기는 모든 프로세스에 동일한 순서로 보여져야 한다 (모든 위치에 대해 적용되면 write atomicity(쓰기 원자성)이라 부름)
  • • 예: P1에서 읽기 전에 w1이 w2보다 먼저 발생하면, 다른 프로세서 Pi의 모든 읽기에서도 동일한 순서로 보여져야 한다
6쪽
p.6snoopy cache(스누피 캐시), Goodman 1983
  • 아이디어: 캐시가 다른 메모리 트랜잭션을 감시(스누핑)하고, "올바른 일"을 수행하도록 한다
  • snoopy cache(스누피 캐시) 태그는 dual-ported(이중 포트)를 가진다
  • 프로세서
  • 캐시
  • 스누피 읽기 포트
  • 메모리 bus(버스)에 연결됨
  • 데이터
  • (라인)
  • 태그와 상태
  • A
  • D
  • R/W
  • 캐시가 bus(버스) master(마스터)일 때 메모리 버스를 드라이브하는 데 사용됨
  • A
  • R/W
7쪽
p.7수정-공유-무효(MSI) 프로토콜
  • 각 캐시에서 블록당 3가지 상태를 추적한다.
  • 무효(I): 캐시에 복사본이 없음
  • 공유(S): 캐시에 읽기 전용 복사본이 있음; 깨끗함 (즉, 메모리와 최신 상태 동일)
  • • 다른 캐시들 중 일부가 이 복사본을 가질 수 있음
  • 수정(M): 캐시에 쓰기 가능한, dirty(더티) 상태의 복사본이 있음
  • • dirty(더티) = 메모리와 최신 상태 불일치
  • • 다른 캐시는 이 복사본을 가질 수 없음
  • 프로세서에서 발생하는 3가지 동작:
  • load(로드), store(스토어), evict(제거)
  • bus(버스)에서 발생하는 5가지 메시지:
  • BusRd, BusRdX, BusInv, BusWB, BusReply
  • M: 수정
  • S: 공유
  • I: 무효
  • 각 캐시 라인은 state bits(상태 비트)를 가짐
  • 주소 태그
  • state bits(상태 비트)
8쪽
p.8intervention(개입)
  • 캐시-2에서 A에 대한 read-miss(읽기 미스)가 발생하면, A에 대한 읽기 요청이 bus(버스)에 전달됨
  • 캐시-1은 데이터를 공급하고 자신의 상태를 공유로 변경해야 함
  • 메모리도 요청에 응답할 수 있음!
  • 메모리는 오래된 데이터를 알고 있는가?
  • 캐시-1은 memory controller(메모리 컨트롤러)를 통해 intervention(개입)하여 캐시-2에 올바른 데이터를 제공해야 함
9쪽
p.9수정-공유-무효(MSI) 프로토콜
  • 무효
  • load(로드) / BusRd(버스 읽기)
  • 공유
  • bus(버스)
  • A [I]
  • A: 0
  • P2
  • A [I]
  • P1
  • 1: A load(로드)
  • 2: BusRd(버스 읽기) A
  • 3: BusReply(버스 응답) A
  • A [I S]: 0
10쪽
p.10수정-공유-무효(MSI) 프로토콜
  • load(로드) / BusRd(버스 읽기)
  • load(로드) / --
  • bus(버스)
  • A [I]
  • A: 0
  • P2
  • A [S]: 0
  • P1
  • 1: A load(로드)
  • 무효
  • 공유
11쪽
p.11수정-공유-무효(MSI) 프로토콜
  • load(로드) / BusRd(버스 읽기)
  • load(로드) / --
  • BusRd(버스 읽기) / [BusReply(버스 응답)]
  • bus(버스)
  • A [I]
  • A: 0
  • P2
  • A [S]: 0
  • P1
  • 1: A load(로드)
  • 2: BusRd(버스 읽기) A
  • 3: BusReply(버스 응답) A
  • A [I S]: 0
  • 무효
  • 공유
12쪽
p.12수정-공유-무효(MSI) 프로토콜
  • load(로드) / BusRd(버스 읽기)
  • load(로드) / --
  • BusRd(버스 읽기) / [BusReply(버스 응답)]
  • evict(제거) / --
  • bus(버스)
  • A [I]
  • A: 0
  • P2
  • A [S]: 0
  • P1
  • A [S]: 0
  • A [S I]
  • A evict(제거)
  • 무효
  • 공유
13쪽
p.13수정-공유-무효 프로토콜(MSI)
  • Store / BusRdX
  • Load / BusRd
  • Load / --
  • BusRd / [BusReply]
  • Modified
  • Evict / --
  • BusRdX / [BusReply]
  • Bus
  • A [I]: 0
  • P1
  • A [S I]: 0
  • P2
  • 1: Store A
  • 2: BusRdX A
  • 3: BusReply A
  • A [I M]: 0 1
  • Invalid
  • Shared
14쪽
p.14수정-공유-무효 프로토콜(MSI)
  • Store / BusRdX
  • Load / BusRd
  • Load / --
  • BusRd / [BusReply]
  • Evict / --
  • Load, Store / --
  • BusRdX / [BusReply]
  • Bus
  • A [M]: 1
  • A: 0
  • P2
  • A [I]
  • P1
  • 1: Load A
  • 2: BusRd A
  • 3: BusReply A
  • A [I S]: 1
  • A [M S]: 1
  • A: 0 1
  • 4: Update A
  • Invalid
  • Shared
  • Modified
15쪽
p.15수정-공유-무효 프로토콜(MSI)
  • Store / BusRdX
  • Load / BusRd
  • Load / --
  • BusRd / [BusReply]
  • Evict / --
  • Load, Store / --
  • Bus
  • A [S]: 1
  • A: 1
  • P2
  • A [S]: 1
  • P1
  • 1: Store A
  • aka “Upgrade”
  • 2: BusInv A
  • A [S M]: 2
  • A [S I]
  • BusRdX / [BusReply]
  • BusRdX, BusInv / [BusReply]
  • Invalid
  • Shared
  • Modified
16쪽
p.16수정-공유-무효 프로토콜(MSI)
  • Store / BusRdX
  • Load / BusRd
  • Load / --
  • BusRd / [BusReply]
  • BusRdX / BusReply
  • Evict / --
  • Load, Store / --
  • BusRdX, BusInv / [BusReply]
  • Bus
  • A [I]
  • A: 1
  • P2
  • A [M]: 2
  • P1
  • 1: Store A
  • 2: BusRdX A
  • 3: BusReply A
  • A [M I]: 2
  • A [I M]: 3
  • Invalid
  • Shared
  • Modified
17쪽
p.17수정-공유-무효 프로토콜(MSI)
  • Store / BusRdX
  • Load / BusRd
  • Load / --
  • BusRd / [BusReply]
  • BusRdX / BusReply
  • Evict / --
  • Evict / BusWB
  • Load, Store / --
  • BusRdX, BusInv / [BusReply]
  • Bus
  • A [M]: 3
  • A: 1
  • P2
  • A [I]
  • P1
  • 1: Evict A
  • 2: BusWB A
  • A [M I]: 3
  • A: 1 3
  • Invalid
  • Shared
  • Modified
18쪽
p.18MSI 프로토콜 요약
  • Store / BusRdX
  • Load / BusRd
  • Load / --
  • BusRd / [BusReply]
  • Cache Actions:
  • • Load, Store, Evict
  • Bus Actions:
  • • BusRd, BusRdX
  • • BusInv, BusWB,
  • • BusReply
  • BusRdX / BusReply
  • Evict / --
  • Evict / BusWB
  • Load, Store / --
  • BusRdX, BusInv / [BusReply]
  • Invalid
  • Shared
  • Modified
19쪽
p.19MSI 상태 전이 다이어그램
  • 무효
  • 공유
  • 수정
  • 읽기(미스)/BusRd(버스 읽기)
  • 읽기(히트)
  • 쓰기(히트)/BusInv(버스 무효화)
  • 읽기(히트), 쓰기(히트)
  • evict(제거)
  • evict(제거)/쓰기-백
  • 쓰기(미스)/BusRdX(버스 읽기-확보)
  • 시작
  • 무효
  • 공유
  • 수정
  • BusRd(버스 읽기)/[BusReply(버스 응답)]
  • BusRd(버스 읽기)/BusReply(버스 응답)
  • BusRdX(버스 읽기-확보), BusInv(버스 무효화)/[BusReply(버스 응답)]
  • BusRdX(버스 읽기-확보)/BusReply(버스 응답)
  • BusRd(버스 읽기), BusRdX(버스 읽기-확보), BusInv(버스 무효화), 쓰기-백
  • bus(버스) 응답(데이터)
  • 표시되지 않음
  • a. CPU로부터의 신호를 사용한 상태 전이
  • b. bus(버스)로부터의 신호를 사용한 상태 전이
20쪽
p.20L2 cache(L2 캐시)를 활용한 최적화된 snooping(스누핑)
  • 프로세서는 종종 두 개 이상의 캐시 레벨을 가짐
  • 작은 L1, 큰 L2 (현재는 일반적으로 모두 칩 내부에 있음)
  • inclusion property(포함성 성질): L1에 있는 항목은 반드시 L2에 존재해야 함
  • L2에서 미스 발생 ⇒ L1에 존재하지 않음
  • 무효화가 L2에 영향을 미치는 경우에만 L1에서 snooping(스누핑) 및 무효화 수행
  • L2에서의 snooping(스누핑)은 CPU-L1 대역폭에 영향을 주지 않음
  • 스누퍼
  • 스누퍼
  • 스누퍼
  • 스누퍼
  • CPU
  • L1 $
  • L2 $
  • CPU
  • L1 $
  • L2 $
  • CPU
  • L1 $
  • L2 $
  • CPU
  • L1 $
  • L2 $
21쪽
p.21MESI 프로토콜 (Illinois 프로토콜이라고도 함)
  • MSI는 자주 발생하는 읽기-upgrade(업그레이드) 시퀀스로 인해 문제가 있음
  • 개인 블록(=한 명의 공유자)에 대해서도 두 번의 bus(버스) 트랜잭션이 발생함
  • • BusRd(버스 읽기): 블록을 공유 상태(S)로 가져옴
  • • BusInv(버스 무효화)(또는 BusRdX(버스 읽기-확보), 또는 BusUpgr(버스 업그레이드)): 공유 상태를 수정 상태로 전환
  • • 무의미한 무효화 메시지를 방송해야 함
  • 단일 프로세서에서는 이 문제가 없음
  • 해결책: "독점" 상태 추가
  • exclusive state(독점 상태) – 하나의 복사본만 존재; 쓰기 가능; 깨끗함
  • • 읽기 요청에 대해 메모리가 응답을 제공할 때 독점성을 감지할 수 있음
  • • exclusive state(독점 상태)에서는 버스 쓰기-백(BusWB)이 필요 없음
  • 쓰기 시, 조용히 "수정" 상태로 전이하여 데이터가 dirty(더티) 상태임을 나타냄
22쪽
p.22수정-독점-공유-무효 (MESI) 프로토콜
  • 무효
  • 공유
  • 수정
  • 읽기(미스)/bus(버스) 읽기(캐시로부터 데이터)
  • 읽기(히트)
  • 쓰기(히트)/BusInv(버스 무효화)
  • 읽기(히트), 쓰기(히트)
  • evict(제거)
  • evict(제거)/쓰기-백
  • 쓰기(미스)/BusRdX(버스 읽기-확보)
  • 시작
  • 무효
  • 공유
  • 수정
  • BusRd(버스 읽기)/[BusReply(버스 응답)]
  • BusRd(버스 읽기)/BusReply(버스 응답)
  • BusRdX(버스 읽기-확보)/BusReply(버스 응답)
  • BusRd(버스 읽기), BusRdX(버스 읽기-확보), BusInv(버스 무효화), 쓰기-백
  • a. CPU로부터의 신호를 사용한 상태 전이
  • b. bus(버스)로부터의 신호를 사용한 상태 전이
  • BusRdX(버스 읽기-확보), BusInv(버스 무효화)/[BusReply(버스 응답)]
  • 독점
  • 읽기(미스)/bus(버스) 읽기(메모리로부터 데이터)
  • 쓰기(히트)
  • 읽기(히트)
  • 독점
  • BusRdX(버스 읽기-확보)/BusReply(버스 응답)
  • evict(제거)/--
  • BusRd(버스 읽기)/BusReply(버스 응답)
23쪽
p.23MESI 문제: 수정된 상태를 공유하는 것은 비용이 큼
  • MSI 및 MESI에서 수정 상태의 블록을 공유하려면:
  • • 수정된 데이터를 메모리에 다시 쓰기
  • • 수정된 블록 → 공유 상태
  • • 데이터를 원하는 블록 → 공유 상태
  • 메모리에 쓰는 것은 비용이 큼! 이를 피할 수는 없을까?
24쪽
p.24성능 향상: owned state(소유 상태)
  • 소유자: 최신 데이터, 읽기 전용 (공유 상태와 유사하나, 먼저 공유 복사본을 무효화하고 상태를 수정 상태로 변경하면 쓰기 가능)
  • 다른 캐시는 공유 복사본을 가짐 (공유 상태)
  • 메모리의 데이터는 최신 상태가 아님
  • BusRd(버스 읽기) 요청 시 메모리가 아닌 소유자가 데이터를 제공함
  • 공유: 최신 데이터, 쓰기 불가능
  • 다른 캐시는 반드시 복사본을 가짐
  • 메모리의 복사본은 최신일 수 있음
  • • 즉, 다른 캐시가 owned state(소유 상태)를 가질 수 있음
25쪽
p.25공통 cache coherence(캐시 일관성) 프로토콜: MOESI (스누피 프로토콜)
  • 각 캐시의 각 블록은 다음 상태 중 하나에 있다:
  • • 수정 (캐시 내)
  • • 소유 (캐시 내)
  • • 독점 (캐시 내)
  • • 공유 (캐시 내)
  • • 무효 (캐시에 없음)
  • 상태 호환성 매트릭스: 주어진 캐시 블록에 대해, 어떤 쌍의 캐시에서도 허용되는 상태
  • M
  • O
  • E
  • S
  • I
  • M
  • O
  • E
  • S
  • I
26쪽
p.26독점
  • 무효
  • 공유
  • 소유
  • 수정
  • read-miss(읽기 미스) - 독점
  • read-miss(읽기 미스) - 공유
  • MOESI protocol(MOESI 프로토콜): 현재 프로세서
  • 읽기 히트
  • 쓰기 히트
  • 읽기 히트
  • 읽기 히트
  • 읽기 히트
27쪽
p.27MOESI protocol(MOESI 프로토콜): 다른 프로세서에 대한 응답
  • 무효
  • 공유
  • 소유
  • 수정
  • 프로브 쓰기 히트
  • 프로브 쓰기 히트
  • 프로브 읽기 히트
  • 프로브 읽기 히트
28쪽
p.28블록 상태 추적
  • truth table(진리표)에 새로운 항목: 소유
  • X = 중요하지 않음
  • valid bit(유효 비트)
  • dirty bit(더티 비트)
  • shared bit(공유 비트)
  • 수정
  • 1
  • 1
  • 0
  • 소유
  • 1
  • 1
  • 1
  • 독점
  • 1
  • 0
  • 0
  • 공유
  • 1
  • 0
  • 1
  • 무효
  • 0
  • X
  • X
29쪽
p.29SMP의 성능
  • 캐시 성능은 다음의 조합이다:
  • • 단일 프로세서 cache miss traffic(캐시 미스 트래픽)
  • • coherence misses(일관성 미스)
  • • 때때로 communication miss(통신 미스)라고도 함
  • • 3C(필수, 용량, 충돌) 외의 캐시 미스의 4번째 C
30쪽
p.30false sharing(거짓 공유)
  • 캐시 라인은 하나 이상의 워드를 포함할 수 있다
  • cache coherence(캐시 일관성)은 line-level(라인 수준)에서 수행되며, word-level(워드 수준)이 아님
  • P1이 wordi를 쓰고, P2가 wordk를 쓰며, i ≠ k이지만 두 워드가 동일한 라인 주소를 가진다고 가정
  • 무엇이 발생할 수 있는가?
  • 상태 라인 주소 데이터0
  • 데이터1 ... 데이터N
31쪽
p.31coherence misses(일관성 미스)
  • false sharing(거짓 공유) 미스는 라인 내에서 읽고자 하는 워드가 아닌 다른 워드가 쓰여짐으로써 라인이 무효화될 때 발생한다.
  • 무효화는 새로운 값의 전달을 유도하지 않지만, 추가적인 캐시 미스를 유도한다.
  • 라인은 공유되지만, 라인 내 워드 중 실제로 공유되는 것은 없다.
  • ⇒ 라인 크기가 1 워드라면 미스가 발생하지 않았을 것이다.
  • true sharing misses(진짜 공유 미스)는 cache coherence(캐시 일관성) 메커니즘을 통해 데이터가 전달될 때 발생한다.
  • 공유 라인에 대한 1차 쓰기로 인한 무효화.
  • 다른 CPU가 다른 캐시에 있는 수정된 라인을 읽을 때.
  • ⇒ 라인 크기가 1 워드여도 여전히 미스가 발생한다.
32쪽
p.32예: 진짜 공유 vs. false sharing(거짓 공유) vs. 히트?
  • 가정:
  • MSI 프로토콜
  • x1과 x2는 같은 캐시 라인에 존재
  • P1과 P2는 모두 x1과 x2를 읽은 후
  • 시간
  • P1
  • P2
  • 진짜, 거짓, 히트? 왜?
  • 1
  • x1 쓰기
  • 2
  • x2 읽기
  • 3
  • x1 쓰기
  • 4
  • x2 쓰기
  • 5
  • x2 읽기
  • 진짜 미스; P2의 x1 무효화
  • 거짓 미스; x1은 P2와 무관
  • 거짓 미스; x1은 P2와 무관
  • 진짜 미스; x2는 쓰기 불가능
  • 진짜 미스; x2는 P1에서 무효
33쪽
p.33multiprocessor (MP)(다중프로세서) 성능 4프로세서 상용 워크로드: OLTP, 의사결정 지원(데이터베이스), 검색 엔진
  • 유니프로세서 캐시 미스는 캐시 크기 증가에 따라 개선된다.
  • (명령어, 용량/충돌, 필수 미스)
  • 진짜 공유 및 false sharing(거짓 공유)는 1 MiB에서 8 MiB(L3 캐시)로 가는 과정에서 거의 변하지 않는다.
34쪽
p.34multiprocessor (MP)(다중프로세서) 성능 2MiB 캐시 상용 워크로드: OLTP, 의사결정 지원(데이터베이스), 검색 엔진
  • 진짜 공유 및 false sharing(거짓 공유)는 1에서 8 CPU로 가는 과정에서 증가한다.
35쪽
p.35스누피/방송 일관성의 scalability(확장성)
  • 어떤 프로세서가 미스를 발생시키면, 모든 다른 캐시를 조사해야 한다.
  • 프로세서 수를 늘릴 때 제한되는 요소:
  • bus(버스)를 통한 통신 대역폭
  • 태그로의 snoop bandwidth(스누핑 대역폭)
  • interleaved buses(인터리브 버스)와 interleaved tag banks(인터리브 태그 뱅크)를 사용하여 대역폭을 개선할 수 있다.
  • 예: 주소의 2비트가 4개의 bus(버스)/tag bank(태그 뱅크) 쌍 중 하나를 선택 – (예: 주소의 비트 7:6이 버스/태그 뱅크를 선택, 비트 5:0이 64바이트 라인 내 바이트를 선택)
  • bus(버스)는 많은 연결에 확장되지 않으므로, 더 많은 노드에서는 point-to-point network(포인트투포인트 네트워크)를 사용할 수 있지만, 이 경우 브로드캐스트 snooping(스누핑) 요청 시 태그 대역폭이 제한된다.
  • 통찰: 대부분의 snooping(스누핑)은 일치를 찾지 못한다!
36쪽
p.36확장 가능한 접근: 디렉터리
  • 모든 메모리 라인은 관련 디렉터리 정보를 가진다.
  • 캐시된 라인의 복사본과 그 상태를 추적한다.
  • 미스 발생 시 디렉터리 항목을 찾아 lookup하고, 필요한 경우 복사본이 있는 노드들만과 통신한다.
  • 확장 가능한 네트워크에서는 디렉터리 및 복사본과의 통신이 네트워크 트랜잭션을 통해 이루어진다.
  • 디렉터리 정보를 조직하는 방법은 여러 가지가 있다.
37쪽
p.37디렉터리 캐시 프로토콜
  • 가정: 신뢰할 수 있는 네트워크, 주어진 소스-대상 쌍 간에 FIFO 메시지 전달
  • CPU → 캐시 → interconnection network(상호연결 네트워크) → 디렉터리 컨트롤러 → DRAM bank(뱅크)
  • 각 캐시 라인에는 상태 필드와 태그가 있음
  • 각 메모리 라인에는 상태 필드와 각 프로세서당 하나의 비트를 가진 비트 벡터 디렉터리가 있음
38쪽
p.38추가 개념들
  • 로컬 노드는 메모리 참조를 생성함
  • 원격 노드는 블록의 복사본을 보유함
  • 홈 노드는 메모리 참조의 물리적 메모리 위치임
  • 요청 생성
  • 네트워크
  • 메시지는 보낸 순서대로 수신됨
  • 디렉터리 항목은 캐시된 블록의 상태와 공유 집합의 구성원을 나타냄
39쪽
p.39캐시 상태
  • 각 캐시 라인에 대해 4가지 가능한 상태 존재:
  • C-invalid (= Nothing): 접근된 데이터는 캐시에 존재하지 않음.
  • C-shared (= Sh): 접근된 데이터는 캐시에 존재하며, 다른 사이트에도 캐시되어 있을 수 있음. 메모리의 데이터는 유효함.
  • C-modified (= Ex): 접근된 데이터는 이 캐시에서 독점적으로 존재하며, 수정됨. 메모리는 최신 데이터를 보유하지 않음.
  • C-transient (= Pending): 접근된 데이터가 일시적인 상태에 있음 (예: 프로토콜 요청을 보냈지만, 해당 프로토콜 응답을 받지 못함)
40쪽
p.40홈 디렉터리 상태
  • 각 메모리 라인에 대해 4가지 가능한 상태 존재:
  • R(dir): 메모리 라인이 dir에 지정된 사이트들에 의해 공유됨 (dir은 사이트 집합). 이 상태에서 메모리의 데이터는 유효함. dir이 비어 있으면 (즉, dir = ε), 메모리 라인은 어느 사이트에서도 캐시되지 않음.
  • W(id): 메모리 라인이 사이트 id에서 독점적으로 캐시되어 있으며, 해당 사이트에서 수정됨. 메모리는 최신 데이터를 보유하지 않음.
  • TR(dir): 메모리 라인이 홈 사이트가 발행한 무효화 요청에 대한 확인을 기다리는 일시적인 상태임.
  • TW(id): 메모리 라인이 사이트 id에서 독점적으로 캐시된 라인(즉, C-modified 상태)이 홈 사이트의 메모리 라인을 최신 상태로 만들기를 기다리는 일시적인 상태임.
41쪽
p.41read-miss(읽기 미스), 캐시되지 않거나 공유된 라인에 대한
  • CPU → 캐시 큐의 머리에 load(로드) 요청이 있음.
  • 캐시에서 read-miss(읽기 미스) 발생.
  • 디렉터리로 ShReq 메시지 전송.
  • 메시지가 디렉터리 컨트롤러에 도착.
  • 라인의 상태와 디렉터리에 접근. 라인 상태는 R이며, 0개 이상의 공유자가 있음.
  • 새로운 프로세서 공유자에 대한 비트를 설정하여 디렉터리 업데이트.
  • 캐시 라인의 내용을 포함한 ShRep 메시지 전송.
  • ShRep 메시지가 캐시에 도착.
  • 캐시 태그와 데이터 업데이트 후 CPU에 load(로드) 데이터 반환.
42쪽
p.42쓰기 미스, 공유된 라인에 대한
  • CPU → 캐시 큐의 머리에 store(스토어) 요청이 있음.
  • 캐시에서 쓰기 미스 발생.
  • 디렉터리로 ExReq 메시지 전송.
  • ExReq 메시지가 디렉터리 컨트롤러에 도착.
  • 라인의 상태와 디렉터리에 접근. 라인 상태는 R이며, 일부 공유자가 있음.
  • 각 공유자에게 InvReq 메시지 전송.
  • InvReq 메시지가 캐시에 도착.
  • 캐시 라인 무효화. 디렉터리로 InvRep 메시지 전송.
  • InvRep 수신. 공유자 비트 해제.
  • 공유자가 더 이상 없으면, 캐시로 ExRep 메시지 전송.
  • ExRep 메시지가 캐시에 도착.
  • 캐시 태그와 데이터 업데이트 후 CPU에서 데이터 store(스토어).
43쪽
p.43디렉터리 프로토콜
  • 개별 캐시 블록에 대해
  • 디렉터리에 대해
  • 자세한 내용은 교과서를 참조하라
44쪽
p.44디렉터리 프로토콜
  • 미캐시 블록에 대해:
  • read-miss(읽기 미스)
  • • 요청 노드에게 요청된 데이터가 전달되며, 요청 노드가 유일한 공유 노드가 된다. 블록은 이제 공유 상태가 된다.
  • 쓰기 미스
  • • 요청 노드에게 요청된 데이터가 전달되며, 요청 노드가 유일한 공유 노드가 된다. 블록은 이제 exclusive state(독점 상태)가 된다.
  • 공유 블록에 대해:
  • read-miss(읽기 미스)
  • • 요청 노드에게 메모리에서 요청된 데이터가 전달되며, 노드가 공유 세트에 추가된다.
  • 쓰기 미스
  • • 요청 노드에게 값이 전달되며, 공유 세트에 있는 모든 노드에게 무효화 메시지가 전송된다. 공유 세트에는 요청 노드만 포함되며, 블록은 이제 exclusive state(독점 상태)가 된다.
45쪽
p.45디렉터리 프로토콜
  • 독점 블록에 대해:
  • read-miss(읽기 미스)
  • • 소유자에게 데이터 가져오기 메시지가 전송되며, 블록은 공유 상태가 된다. 소유자가 데이터를 디렉터리에 전달하고, 데이터는 메모리로 다시 쓰여진다. 공유 세트에는 이전 소유자와 요청자가 포함된다.
  • 데이터 쓰기 백
  • • 블록은 미캐시 상태가 되며, 공유 세트는 비어 있다.
  • 쓰기 미스
  • • 이전 소유자에게 무효화 및 값 전송 메시지가 전송되며, 요청 노드가 새로운 소유자가 된다. 블록은 여전히 exclusive state(독점 상태)로 유지된다.
46쪽
p.46개별 캐시 vs. shared cache(공유 캐시)
  • 개별 캐시: 캐시는 하나의 코어에 속함 (공유 블록은 여러 캐시에 있을 수 있음)
  • shared cache(공유 캐시): 캐시가 여러 코어에 의해 공유됨
47쪽
p.47비균일 캐시 접근 (NUCA)
  • 문제: 큰 캐시는 접근하는 데 오랜 시간이 걸림
  • 가까운 블록은 더 빠르게 접근할 수 있지만, 가장 멀리 떨어진 블록이 최악의 접근 시간을 결정함 (선로 지연)
  • 캐시 내 모든 위치에 동일한 접근 시간을 가지게 하는 것은 비쌈
  • 아이디어: 단일 캐시 내에서 변수 지연 접근 시간
  • 캐시를 조각으로 나누기
  • 각 조각은 서로 다른 지연 시간을 가짐
  • 어떤 조각에 주소가 매핑되는가?
  • • 정적: 주소의 비트에 기반
  • • 동적: 어떤 주소도 어떤 조각에 매핑될 수 있음
  • • 주소를 어떻게 찾는가?
  • • 교체 및 배치 정책은 어떻게 하는가?
  • • Kim 등, “An adaptive, non-uniform cache structure for wire-delay dominated on-chip caches,” ASPLOS 2002
48쪽
p.48NUCA 예시 (Intel Skylake)
49쪽
p.49코어 간 shared cache(공유 캐시)
  • 장점:
  • 높은 효과적 용량
  • 사용 가능한 캐시 공간의 동적 분할
  • 정적 분할로 인한 블록 분할 없음
  • 일관성 유지가 더 쉬움 (캐시 블록은 단일 위치에 있음)
  • 공유 데이터와 락이 캐시 간에 왔다 갔다 하지 않음
  • 단점:
  • 접근 속도가 느림
  • 다른 코어의 접근으로 인해 코어 간 conflict miss(충돌 미스) 발생
  • 코어 간 간섭으로 인한 미스
  • 일부 코어가 다른 코어의 히트율을 저하시킬 수 있음
  • 각 코어에 최소 수준의 서비스(또는 공정성)를 보장하는 것이 더 어렵다 (얼마나 많은 공간, 얼마나 많은 대역폭?)
50쪽
p.50shared cache(공유 캐시): 어떻게 공유할까?
  • 자유로운 공유:
  • 배치/치환 정책은 단일 코어 시스템과 동일함 (일반적으로 LRU 또는 의사-LRU)
  • 스레드/애플리케이션을 인지하지 않음
  • 입력 블록은 어떤 스레드에 속해 있는지에 관계없이 블록을 evict(제거)함
  • 문제:
  • 캐시의 비효율적 이용: LRU는 최적의 정책이 아님
  • 캐시 친화적이지 않은 애플리케이션이 캐시 친화적인 애플리케이션의 성능을 저하시킬 수 있음
  • 모든 애플리케이션이 동일한 양의 캐시에서 동일한 이점을 얻는 것은 아님: 자유로운 공유는 이점을 얻지 못하는 것을 우선시할 수 있음
  • 성능 저하, 공정성 저하
51쪽
p.51shared cache(공유 캐시)의 문제
  • t2의 처리량은 공정하지 않은 캐시 공유로 인해 크게 감소할 수 있음
  • L1 $
  • L2 $
  • ……
  • 프로세서 코어 1
  • 프로세서 코어 2
  • ←t1
  • L1 $
  • t2→
52쪽
p.52질문?
  • 추천 독서:
  • 교재의 5.1-5.4 장
단축키
Ctrl K · s자료 검색
[ ]이전·다음 강의
Space영상 재생·정지
j k다음·이전 section
n p다음·이전 slide
b강의 목록 접기·펴기
t맨 위
/강의 검색
Esc닫기