오늘 끝나면
멀티코어와 캐시 일관성
- ✓멀티코어와 캐시 일관성의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 멀티코어와이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
두 코어가 같은 줄을 만질 때 — MESI 상태 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
반도체 설계 · 38
멀티코어와
캐시 일관성
코어 여러 개가 각자 캐시를 가진다.
한 코어가 값을 바꾸면 다른 캐시는 옛값을 쥐고 있다.
MESI로 상태를 추적해 일관성을 지킨다.
코어마다 자기 캐시를 가진다
한 칩 안에 코어가 여럿이다. 35강에서 봤듯 각 코어는 느린 메모리를 가리려고 자기 옆에 빠른 캐시를 둔다.
코어가 메모리 주소를 읽으면 그 줄(cache line)을 자기 캐시로 복사해 둔다. 다음부터는 메모리까지 안 가고 캐시에서 바로 쓴다.
코어가 하나일 땐 이게 그냥 빠른 사본이다. 문제될 게 없다.
그런데 코어가 둘, 넷, 여덟이 되면 같은 주소의 사본이 캐시 여러 군데에 동시에 생긴다.
한 칩에 같은 데이터가 여러 벌 떠다니기 시작한다. 여기서 골치 아픈 문제가 시작된다.
불일치, 누가 옛값을 쥐고 있다
같은 주소 X를 두 코어가 각자 캐시에 복사한다. 둘 다 X=5로 본다. 아직은 같다.
코어1이 X=9로 쓴다. 코어1 캐시는 9가 된다.
그런데 코어2 캐시엔 여전히 5가 들어있다. 코어2는 갱신된 줄 모르고 옛값 5를 읽는다.
이게 캐시 불일치(incoherence)다. 같은 주소인데 캐시마다 값이 다르다.
코어1의 쓰기가 코어2까지 전해질 길이 없으면, 두 코어는 서로 다른 세상을 본다.
쓰기가 다른 캐시에 보이도록 어떻게든 알려야 한다. 이걸 자동으로 푸는 게 일관성 프로토콜이다.
MESI, 캐시 줄마다 상태를 단다
해법은 캐시 줄 하나하나에 상태 꼬리표를 다는 것이다. 그 네 상태가 MESI다.
M Modified는 이 캐시만 가진 최신값이고 메모리는 옛값이다 (나만 바꿨고 내가 책임진다).
E Exclusive는 이 캐시만 가졌고 메모리와 같다 (나만 가진 깨끗한 사본).
S Shared는 여러 캐시가 같이 가진 읽기 사본이다 (다들 같은 값).
I Invalid는 무효, 쓰레기 줄이다 (이 칸은 못 믿으니 다시 읽어야 한다).
코어들은 공유 버스를 엿듣는다(snoop). 누가 어떤 주소를 읽고 쓰는지 다 들린다.
남이 내가 가진 주소에 쓰면 내 줄은 I로 내려가고, 내가 가진 주소를 남이 읽으려 하면 M·E는 S로 내려간다.
이 상태 전이 규칙이 곧 일관성이다. 어느 순간에도 한 주소의 최신값은 단 하나로 정해진다.
Modified
나만 가진 최신값 · 메모리는 옛값
Exclusive
나만 가졌고 메모리와 같음
Shared
여러 캐시가 같이 가진 읽기 사본
Invalid
무효 · 못 믿는 줄, 다시 읽어야 한다
두 코어로 MESI를 직접 돌린다
오른쪽에서 두 코어가 같은 캐시 줄 X를 두고 읽고 쓴다. 각 캐시의 상태(M·E·S·I)가 어떻게 바뀌는지 손으로 돌려본다.
명령을 누르기 전에 먼저 예측한다. 코어2가 가진 줄에 코어1이 쓰면, 코어2 줄은 무슨 상태가 될까?
고른 뒤 STEP으로 한 단계 실행해 예측과 결과를 맞춰본다. 무효화(I)나 다운그레이드(S) 같은 사건만 강조된다.
처음 읽기는 E(나만 가짐)로 들어온다. 다른 코어가 같이 읽으면 둘 다 S로 내려간다.
한 코어가 쓰면 자기는 M이 되고 상대 줄엔 무효화가 날아가 I가 된다. 하단 근거 패널이 매 단계 버스에 흐른 신호와 두 캐시 상태를 적어준다.
먼저 위에서 명령을 하나 고른다. 그러면 상대 코어 줄의 다음 상태를 예측할 수 있다.
초기 상태, 두 캐시 모두 Invalid(비어 있음). 명령을 골라 한 단계씩 실행해 본다.
한 주소의 최신값은 늘 한 곳에만, 쓰면 M로 모으고 남의 사본은 무효화(I), 같이 읽으면 S로 나눈다. 이 일관성 선택(coherence)이 최종 MyChip 멀티코어에 들어간다.
병렬의 난제, 빨라지자고 만든 일이 도로 발목
코어를 늘리면 일이 나뉘어 빨라질 줄 알았는데, 캐시 일관성이 숨은 세금을 매긴다.
여러 코어가 같은 주소를 번갈아 쓰면 그 줄이 캐시 사이를 계속 오간다. 쓸 때마다 남의 사본을 무효화하고 줄을 끌어온다.
이걸 핑퐁(ping-pong)이라 한다. 코어는 일은 안 하고 줄을 주고받는 데 시간을 쓴다.
더 얄궂은 건 false sharing이다. 두 코어가 서로 다른 변수를 쓰는데 우연히 같은 캐시 줄에 얹혀 있으면, 관계없는 쓰기끼리 서로 무효화한다.
그래서 병렬 코드는 데이터를 코어별로 갈라 같은 줄을 안 다투게 짜야 한다. 일관성은 자동이지만 공짜는 아니다.
코어 수와 일관성 비용을 저울질하는 게 멀티코어 칩 설계의 핵심 트레이드오프다.
Q. 한 코어가 공유(Shared) 데이터를 쓰면 다른 캐시의 그 줄은?
정답은 Invalid(무효화)된다.쓰는 코어는 자기 줄을 M으로 올리고 버스로 무효화 신호를 보낸다. 그 주소를 가진 다른 캐시들의 줄은 모두 I로 내려간다.
이제 옛값을 못 믿으니, 그 코어가 다시 읽으려면 최신값을 가진 캐시나 메모리에서 줄을 새로 가져와야 한다.