스킬캠퍼스

오늘 끝나면

멀티코어와 캐시 일관성

  • 멀티코어와 캐시 일관성의 핵심 문제를 한 문장으로 설명한다
  • 오른쪽 실습에서 멀티코어와이 어떻게 움직이는지 관찰한다
  • 다음 강의와 이어지는 한계를 말할 수 있다

실습 미션

두 코어가 같은 줄을 만질 때 — MESI 상태 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.

성공 조건

  • 실습의 기본값을 먼저 관찰
  • 입력값이나 모드를 한 번 이상 바꿔 결과 비교
  • 왜 결과가 바뀌었는지 한 문장으로 설명

반도체 설계 · 38

멀티코어와
캐시 일관성

코어 여러 개가 각자 캐시를 가진다.
한 코어가 값을 바꾸면 다른 캐시는 옛값을 쥐고 있다.
MESI로 상태를 추적해 일관성을 지킨다.

P.01반도체 설계 · 38

코어마다 자기 캐시를 가진다

한 칩 안에 코어가 여럿이다. 35강에서 봤듯 각 코어는 느린 메모리를 가리려고 자기 옆에 빠른 캐시를 둔다.

코어가 메모리 주소를 읽으면 그 줄(cache line)을 자기 캐시로 복사해 둔다. 다음부터는 메모리까지 안 가고 캐시에서 바로 쓴다.
코어가 하나일 땐 이게 그냥 빠른 사본이다. 문제될 게 없다.

그런데 코어가 둘, 넷, 여덟이 되면 같은 주소의 사본이 캐시 여러 군데에 동시에 생긴다.
한 칩에 같은 데이터가 여러 벌 떠다니기 시작한다. 여기서 골치 아픈 문제가 시작된다.

코어 → L1 캐시 → 공유 메모리
코어마다 캐시 · 메모리는 하나
코어 1
L1 캐시
X = 5
코어 2
L1 캐시
X = 5
공유 메모리 (느림)
주소 X = 5
같은 주소 X의 사본이 캐시 여러 군데에 동시에 생긴다. 여기서 문제가 시작된다
P.02반도체 설계 · 38

불일치, 누가 옛값을 쥐고 있다

같은 주소 X를 두 코어가 각자 캐시에 복사한다. 둘 다 X=5로 본다. 아직은 같다.

코어1이 X=9로 쓴다. 코어1 캐시는 9가 된다.
그런데 코어2 캐시엔 여전히 5가 들어있다. 코어2는 갱신된 줄 모르고 옛값 5를 읽는다.

이게 캐시 불일치(incoherence)다. 같은 주소인데 캐시마다 값이 다르다.
코어1의 쓰기가 코어2까지 전해질 길이 없으면, 두 코어는 서로 다른 세상을 본다.
쓰기가 다른 캐시에 보이도록 어떻게든 알려야 한다. 이걸 자동으로 푸는 게 일관성 프로토콜이다.

코어1이 쓰면 코어2 캐시는 옛값
코어1이 쓰면 코어2는 옛값
코어 1
방금 X=9 기록
X = 9
최신값
코어 2
그대로 읽는 중
X = 5
옛값 · 불일치
메모리X = 5 (아직 옛값)
같은 주소인데 캐시마다 값이 다른 게 incoherence. 쓰기를 알려야 한다
P.03반도체 설계 · 38

MESI, 캐시 줄마다 상태를 단다

해법은 캐시 줄 하나하나에 상태 꼬리표를 다는 것이다. 그 네 상태가 MESI다.

M Modified는 이 캐시만 가진 최신값이고 메모리는 옛값이다 (나만 바꿨고 내가 책임진다).
E Exclusive는 이 캐시만 가졌고 메모리와 같다 (나만 가진 깨끗한 사본).
S Shared는 여러 캐시가 같이 가진 읽기 사본이다 (다들 같은 값).
I Invalid는 무효, 쓰레기 줄이다 (이 칸은 못 믿으니 다시 읽어야 한다).

코어들은 공유 버스를 엿듣는다(snoop). 누가 어떤 주소를 읽고 쓰는지 다 들린다.
남이 내가 가진 주소에 쓰면 내 줄은 I로 내려가고, 내가 가진 주소를 남이 읽으려 하면 M·ES로 내려간다.
이 상태 전이 규칙이 곧 일관성이다. 어느 순간에도 한 주소의 최신값은 단 하나로 정해진다.

Modified · Exclusive · Shared · Invalid
MESI, 캐시 줄의 네 가지 상태
M

Modified

나만 가진 최신값 · 메모리는 옛값

사본
나만
E

Exclusive

나만 가졌고 메모리와 같음

사본
나만
S

Shared

여러 캐시가 같이 가진 읽기 사본

사본
여럿
I

Invalid

무효 · 못 믿는 줄, 다시 읽어야 한다

사본
버스를 엿들어(snoop) 상태를 전이한다. 한 주소의 최신값은 늘 하나다
P.04반도체 설계 · 38

두 코어로 MESI를 직접 돌린다

오른쪽에서 두 코어가 같은 캐시 줄 X를 두고 읽고 쓴다. 각 캐시의 상태(M·E·S·I)가 어떻게 바뀌는지 손으로 돌려본다.

명령을 누르기 전에 먼저 예측한다. 코어2가 가진 줄에 코어1이 쓰면, 코어2 줄은 무슨 상태가 될까?
고른 뒤 STEP으로 한 단계 실행해 예측과 결과를 맞춰본다. 무효화(I)나 다운그레이드(S) 같은 사건만 강조된다.

처음 읽기는 E(나만 가짐)로 들어온다. 다른 코어가 같이 읽으면 둘 다 S로 내려간다.
한 코어가 쓰면 자기는 M이 되고 상대 줄엔 무효화가 날아가 I가 된다. 하단 근거 패널이 매 단계 버스에 흐른 신호와 두 캐시 상태를 적어준다.

읽기·쓰기 → M/E/S/I 전이 한 단계씩
MESI · 두 코어가 같은 줄 X를 공유
캐시 줄 X, 코어별 상태step 0
코어 1
I
Invalid
X = ?
코어 2
I
Invalid
X = ?
공유 버스 (snoop)
메모리 X5
명령, 하나 골라 STEP
쓰기 값9
예측 먼저, 실행하면 상대 코어 줄은 무슨 상태가 될까?

먼저 위에서 명령을 하나 고른다. 그러면 상대 코어 줄의 다음 상태를 예측할 수 있다.

근거 패널, 이번 단계에 흐른 버스 신호와 상태
C1 줄
I
C2 줄
I
메모리
5
최신
버스 신호

초기 상태, 두 캐시 모두 Invalid(비어 있음). 명령을 골라 한 단계씩 실행해 본다.

한 주소의 최신값은 늘 한 곳에만, 쓰면 M로 모으고 남의 사본은 무효화(I), 같이 읽으면 S로 나눈다. 이 일관성 선택(coherence)이 최종 MyChip 멀티코어에 들어간다.

P.05반도체 설계 · 38

병렬의 난제, 빨라지자고 만든 일이 도로 발목

코어를 늘리면 일이 나뉘어 빨라질 줄 알았는데, 캐시 일관성이 숨은 세금을 매긴다.

여러 코어가 같은 주소를 번갈아 쓰면 그 줄이 캐시 사이를 계속 오간다. 쓸 때마다 남의 사본을 무효화하고 줄을 끌어온다.
이걸 핑퐁(ping-pong)이라 한다. 코어는 일은 안 하고 줄을 주고받는 데 시간을 쓴다.

더 얄궂은 건 false sharing이다. 두 코어가 서로 다른 변수를 쓰는데 우연히 같은 캐시 줄에 얹혀 있으면, 관계없는 쓰기끼리 서로 무효화한다.
그래서 병렬 코드는 데이터를 코어별로 갈라 같은 줄을 안 다투게 짜야 한다. 일관성은 자동이지만 공짜는 아니다.
코어 수와 일관성 비용을 저울질하는 게 멀티코어 칩 설계의 핵심 트레이드오프다.

Q. 한 코어가 공유(Shared) 데이터를 쓰면 다른 캐시의 그 줄은?정답은 Invalid(무효화)된다.
쓰는 코어는 자기 줄을 M으로 올리고 버스로 무효화 신호를 보낸다. 그 주소를 가진 다른 캐시들의 줄은 모두 I로 내려간다.
이제 옛값을 못 믿으니, 그 코어가 다시 읽으려면 최신값을 가진 캐시나 메모리에서 줄을 새로 가져와야 한다.
코어를 늘릴수록 일관성 비용도 늘어남
코어 ↑ · 일관성 세금도 ↑
2코어90% · 일관성 10%
90
10
4코어78% · 일관성 22%
78
22
8코어60% · 일관성 40%
60
40
16코어42% · 일관성 58%
42
58
실제 일 일관성 오버헤드
핑퐁과 false sharing. 같은 줄을 다툴수록 일관성에 시간을 뺏긴다 (대략적 도식)

3줄 요약

  1. 1두 코어가 같은 줄을 만질 때 — MESI 상태
  2. 2멀티코어와 캐시 일관성은 비트·게이트 → ALU → 시간·메모리 → 나만의 CPU → 메모리·GPU·SoC 흐름 안의 한 칸이다.
  3. 3개념을 외우는 것보다 입력을 바꾸면 무엇이 달라지는지 보는 것이 우선이다.

완료 전 점검

복습 카드

멀티코어와

두 코어가 같은 줄을 만질 때 — MESI 상태

ALU

산술·논리 연산을 하는 회로

ISA

CPU가 이해하는 명령어 집합과 인코딩