Cache #1

charrrming·2022년 5월 30일

Computer Architecture

목록 보기
15/17
cpu - dram 사이의 성능 간극이 커지고 있음
memory wall: 컴퓨터의 전체적인 성능이 메모리에 의해 결정됨

속도 sram > dram > magnetic disk (가격은 반대)

cpu는 1ns마다 하나의 클락 사이클이 생성됨
IF 스테이지에서 비교적 많은 시간이 소요됨 (100 사이클) -> 메모리 접근할 때 오래 걸림
IF에서 100 사이클 걸리므로 CPI는 100임
CPU가 더 빨라질수록 성능 저하는 더 심해짐
ex) cpu가 2GHz로 운영되면 -> CPI=200

Cache

cpu-dram 사이 간극을 줄이기 위해 캐시를 사용한다
캐시는 프로세서 내부에 있는 아주 빠르고 작은 메모리로 보통 sram 베이스
자주 쓰는 명령어와 데이터는 캐시에 저장됨 (by 하드웨어, 하드웨어가 알아서 운용)
L1 캐시는 보통 1사이클 안에 접근 가능
* Core 2 Duo
구조적 해저드 피하려고 명령어, 데이터 캐시 따로 존재함
L1 캐시는 코어마다 따로 존재 (private cache)
L2 캐시는 공유 (shared cache)

* Core i7
L1, L2는 private
L3는 shared
레지스터 - 메인 메모리 (by 컴파일러 / 프로그래머)
캐시 - 메인 메모리 (by 하드웨어가 직접 함)

Basic Cache Operation

* Cache Line(Block): 캐시 - 메인 메모리에서 주고 받는 데이터 크기 단위
ex) 한번에 4word씩 가져옴

1) lw 0x0000_0004
   캐시 비어있으니까 우선 메인 메모리에서 캐시로 데이터를 가져온다
   0x0000_0004 값만 요청했지만 cache line이 4word이므로 4개 가져옴
   
2) lw 0x0000_000c
   아까 0004번지 가져오면서 4개 같이 가져옴, 이때 000c도 가져왔다
   캐시에 값이 이미 있으므로 바로 전달
   
   
* the principle of locality (작고 빠른 메모리 쓴다고 착각을 일으킴)
- 비용 측면에서 우수한 기술 -> 용량 큰 메모리
- 속도 측면에서 우수한 기술 -> 용량 작은 메모리


* Temporal Locality (시간 측면에서 locality)
  : 특정 메모리 주소에 접근할 경우, 해당 주소는 미래에 또 쓰일 확률 높음
    가장 최근에 접근했던 데이터는 계속 캐시에 저장
    
* Spatial Locality (공간 측면에서 Locality)
  : 특정 메모리 주소에 접근할 경우, 이웃 주소들은 미래에 또 쓰일 확률 높음
    캐시 블럭 가져올 때 주변의 여러 워드들도 함께 가져옴

Direct Mapped Cache

메인 메모리의 특정 블록이 저장될 캐시의 위치가 정확히 정해져있음
여러 메모리 블록은 캐시를 공유한다 -> tag로 어떤 메모리에서 왔는지 표시해야함

메모리 블록 주소 = tag + index
캐시 주소(index) = (메모리 블럭 주소 / 캐시의 블럭 개수)의 나머지
어떤 메모리에서 왔는지(tag)  = 메모리 블럭 주소의 상위 비트들 ex) 색깔 정보

* 캐시 구조
- Data: 실제 데이터
- Tag: 하나의 캐시에 저장되어 있는 여러 데이터를 구분하기 위한 정보
       메모리의 어느 주소와 mapping되어 있는지?
- Valid: 실제 캐시와 메모리 사이의 상호작용을 통해 저장된 정보냐?
4KB 캐시 with 1word(4byte) block -> 1024개의 블록 존재함

word 단위로 접근하니까 뒤에 2비트 버림
블록이 1024개니까 index는 10비트
tag는 32 -2 -10 = 20비트

주소의 태그랑 해당 인덱스에서 가져온 태그가 같고 valid가 1이면 HIT!
이건 temporal locality 이용한거임, block 크기가 작아서 spatial locality는 아니다

Handling Writes

read miss 발생: 메인 메모리에서 cache 블록을 가져와서 캐시에 저장하고 cpu에 데이터 전달

write miss 발생: 
- write miss
	1) write-allocate: 캐시에서 블록을 가져간 후 쓴다
    2) write no-allocate: 메인 메모리에 바로 쓴다
    
- writing
	1) write-back: 우선 캐시에만 쓰고, 캐시에 쓴 값이 대체될 때 
    메인 메모리에 업데이트(for 성능 낭비 막으려고)
    2) write-through: 캐시랑 메인 메모리 동시에 업데이트
    
write-allocate + write-back
write no-allocate + wirte-through

hit vs miss

- Read hit: cpu가 원하는 값이 이미 캐시에 존재
- Read miss: cpu가 원하는 값이 캐시에 없음
			 메인 메모리에서 데이터를 읽어오기 위해 cpu를 잠시 멈춤
             cpu가 원하는 값을 우선 캐시에 저장한 다음 cpu로 전달
             
- Write hit: cpu가 쓰고자 하는 값이 이미 캐시에 있음
	1) write-through
    2) write-back
- Write miss: cpu가 쓰고자 하는 값이 캐시에 없음
	1) write-allocate
    2) write no-allocate

0개의 댓글