오늘 끝나면
쓰기 정책과 메모리 컨트롤러
- ✓쓰기 정책과 메모리 컨트롤러의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 쓰기이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
write-through/back·dirty·DRAM row/bank 스케줄링 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
반도체 설계 · 26
쓰기 정책과
메모리 컨트롤러
읽기는 캐시가 빨라도 쓰기는 다른 문제다.
바뀐 값을 언제 메모리에 내리느냐가 정책이다.
그 한 줄 결정이 속도와 정합성을 가른다.
write-through vs write-back
CPU가 값을 쓰면 캐시는 바뀐다. 문제는 메모리도 같이 바꿀지다.
write-through는 쓸 때마다 캐시와 메모리를 동시에 바꾼다. 둘이 항상 똑같으니 일관성이 단순하다.
대신 쓰기마다 느린 메모리를 건드린다. 같은 줄에 100번 쓰면 메모리 쓰기도 100번이다.
write-back은 캐시만 바꾸고 메모리는 그대로 둔다. 그 줄에 ‘바뀜’ 표시(dirty)만 켜둔다.
메모리 반영은 그 줄이 쫓겨날 때 딱 한 번 몰아서 한다. 100번 써도 메모리 쓰기는 한 번이다.
여기서 고른 정책이 그대로 최종 MyChip 캐시의 쓰기 동작이 된다.
둘이 항상 같다 · 쓰기마다 느린 메모리
dirty만 켜둔다 · 쫓겨날 때 한 번
dirty 비트와 eviction
write-back의 핵심은 줄마다 붙은 한 비트, dirty다.
그 줄을 캐시에서 한 번이라도 고쳤으면 dirty=1이다. 캐시 값이 메모리보다 새것이라는 표시다.
dirty=0이면 메모리와 같다는 뜻이라, 쫓아내도 잃을 게 없다.
새 줄이 들어와 자리가 없으면 기존 줄을 내보낸다. 이게 eviction이다.
나갈 줄이 clean이면 그냥 버린다. dirty면 먼저 메모리에 write-back한 뒤 버린다.
그래서 read miss인데도 느릴 때가 있다. 쫓겨나는 줄이 dirty라 메모리 쓰기가 끼어들기 때문이다.
clean 줄은 그냥 버린다 · dirty 줄만 메모리에 먼저 쓴다
DRAM은 row·bank, 순서가 곧 속도
캐시 너머 메인 메모리는 DRAM이다. DRAM은 평평한 칸이 아니라 격자다.
DRAM은 bank로 나뉘고, 각 bank는 row(행) × column(열)이다. 어떤 칸을 읽으려면 그 칸의 행을 통째로 감지증폭기(row buffer)에 먼저 열어야 한다.
이미 열린 행 안의 칸이면 바로 읽는다. 이게 row hit이고 빠르다.
다른 행을 건드리면 열린 행을 닫고(precharge) 새 행을 여는 데 시간이 든다. row miss이고 느리다.
그래서 같은 주소 양이라도 접근 순서에 따라 속도가 몇 배 갈린다.
메모리 컨트롤러가 요청 순서를 같은 행끼리 묶어 재배열하는 이유다.
열린 행 안의 칸이라 바로 읽는다. 빠르다.
행 닫고(precharge) 새 행을 연다. 느리다.
직접 정책을 골라 써본다
write-through와 write-back을 토글하며 같은 주소열에 한 접근씩 써본다.
write-back에서 같은 줄을 여러 번 쓰면 메모리 쓰기 카운트가 안 늘어난다. 미뤘기 때문이다.
꽉 찬 줄에 새 주소를 쓰면 eviction이 뜨고, 쫓겨나는 줄이 dirty면 DRAM에 write-back이 끼어든다.
여기서 정한 정책이 MyChip에 들어간다.
캐시만 바꾸고 dirty 표시 · 쫓겨날 때만 메모리
D = dirty(캐시가 새것) · write buffer = 메모리로 갈 대기 쓰기 · 열린 row만 빠름
| 정책 | CPU 쓰기 | 메모리 쓰기 | 큐 대기 |
|---|---|---|---|
| WB | 0 | 0 | 0 |
slot0: 비움 slot1: 비움
열린 row = 없음
예측을 고르고 STEP을 눌러 한 접근씩 실행해 본다.
쓰기는 공짜가 아니다
읽기는 캐시가 가려준다. 쓰기는 결국 누군가 느린 메모리에 값을 내려야 한다.
그 비용을 숨기는 장치가 write buffer다. CPU는 버퍼에 던지고 바로 다음 일을 한다. 버퍼가 한가할 때 메모리에 조용히 흘려보낸다.
버퍼가 차면 그때서야 CPU가 기다린다. 쓰기 폭주를 평탄하게 펴주는 완충이다.
그리고 write allocate는 write miss(캐시에 없는 주소에 쓰기)일 때 그 줄을 캐시로 끌어와 두는 정책이다.
한 번 쓴 데 또 쓰는 경우가 많으니, 끌어와 두면 다음 쓰기들이 캐시에서 끝난다.
write-back, write allocate, write buffer. 이 세 선택이 MyChip의 쓰기 경로를 완성한다.
Q. write-back이 미루는 일은 무엇인가?
정답은 캐시에서 메모리로 쓰는 일이다.쓸 때는 캐시만 바꾸고 dirty 깃발만 켜둔다. 메모리 반영은 그 dirty 줄이 eviction으로 쫓겨날 때 딱 한 번 몰아서 한다.
그래서 같은 줄에 여러 번 써도 메모리 쓰기는 한 번으로 줄어든다.