2023. 5. 31. 19:03ㆍ컴퓨터구조
*Temporal locality : 곧 다시 접근할 것 같은 데이터
ex) 루프안의 있는 것들
Spatial locality: 최근에 접근했던 데이터 근처에 있는 데이터
ex) 배열 데이터, 순차적 명령
* disk -> Main memory(DRAM) -> Cache memory(SRAM)
오른쪽으로 갈수록 상위레벨
*용어
Block: 복사하는 단위
Hit: 만약 접근하려는 데이터가 상위 레벨에 존재한다면 상위레벨에서 빠르게 가져옴
Miss: 접근하려는 데이터가 하위레벨에 존재한다면 하위레벨에서 가져옴
-> 시간적 페널티가 생김(miss penalty)
DRAM
row 단위로 데이터 접근
DDR: 클럭이 오를때와 떨어질 때 모두 데이터 전송 가능
QDR: 원래는 input과 output이 공유해서 출력을 하는동안은 입력하지 못함
->QDR은 input과 output을 구분해놓아서 입력하자마자 출력 가능
성능 향상 요인
- Row buffer: 버퍼에 저장해놓으면 동일한 데이터를 읽을 때 버퍼에서 읽으면 됨
- Synchronous DRAM: 연속적인 접근을 가능하게 해줌
- DRAM banking: 여러개의 DRAM으로부터 동시적인 접근을 가능하게 해줌
Flash Storage
- 비휘발성 저장소
- 디스크보다 빠르고 튼튼, 저전력
- 대신 디스크보다 비쌈
- 1000번 정도 접근하면 손상 가능성 있음
type
- NOR flash: 랜덤으로 읽기/쓰기 접근
명령어 메모리로 사용 - NAND flash: 한번에 block 단위로 접근
USB로 사용
Disk
Sector
- 데이터, Error correction code(ECC), 섹터 아이디 저장
- 섹터에 접근해서 데이터 읽는데 걸리는 시간
1. 다른 섹터 접근중이라면 Queuing delay
2. Seek: 디스크 헤드를 움직여 해당 섹터 찾기
3. Rotational latency: 디스크 헤드가 찾은 섹터로 회전하는데 걸리는 시간
4. Data transfer : 데이터 전송시간
5. Controller overhead
예)
512B sector, 15,000rpm, 4ms average seektime, 100MB/s transfer rate,
0.2ms controller overhead, idle disk 일 때 평균 read time?
-> idle: 0ms
Seek: 4ms
Rotational latency : 1/2 / (15,000/60)=2ms // 회전은 양방향으로 가능하므로 거리는 1/2이 됨
Data transfer: 512/(100*1000)=0.005ms
Controller overhead: 0.2ms
Total: 6.2ms
Cache memory
cpu와 가장 가까운 계층의 메모리
Direct Mapped Cache
: 오직 하나의 선택지만 존재
블록 index: 블록 주소 % 캐쉬의 블록 개수
블럭이 2의 n승 꼴이라면 주소의 하위비트를 사용하여 맵핑
-> 예제에서는 하위3비트가 같은 것끼리 맵핑

*특정 블록이 캐쉬 어디에 저장되어있는지 어떻게 알 수 있나?
-> tag: 상위 비트 주소만 필요
Valid bit: 그 위치에 데이터가 저장되있다면 1, 없다면 0
예) 8-blocks, 1 word/block, direct mapped

만약 110인덱스에 다른 값을 저장하려면 원래 있던 값은 없어지고 저장됨.

블록 1개 크기가 1word(32bit=4byte)
-> 메모리 주소의
0,1 비트는 Byte offset : 2bit (1word는 4바이트이므로 몇번째 바이트인지 표시하기 위함)
2~11 비트는 Index : 10bit (Index가 0부터 1023까지 있으므로)
나머지 12~31비트는 tag : 20bit
64 blocks, 16bytes/block
-> 메모리 주소의
0,3 비트는 Byte offset: 4bit(16바이트이므로 16번째 바이트까지 표시해야 하므로 2^4=16)
4~9비트는 Index: 6bit (블록의 개수-> 2^6=64)
나머지 10~31비트는 tag: 22bit
이 때 주소 1200은 어디에 맵핑해야 하나?
-> 16바이트이므로 1200/16의 내림값=75, 75 % 64 =11
-> 75번 블록에 11번째 인덱스
* 큰 블록이면 miss rate를 줄일 수 있다
-> 근처 데이터를 보통 읽기 때문
그러나 캐쉬에 크기는 고정되어있다
-> 큰 블록일수록 들어갈 자리는 줄어들게 되므로 경쟁이 심화된다
-> miss rate가 증가한다.
Write-Through
캐쉬에 업데이트 한 값을 메모리에도 즉시 업데이트
-> 많은 시간이 걸리게 됨
해결법:
write buffer: write 할 데이터들을 모아놓고 한번에 순차적으로 write
CPU는 계속 할 일을 하다가 버퍼가 꽉 차면 stall하고 메모리로 업데이트
Write-Back
- 캐쉬에 값만 업데이트 ->그때 캐쉬 블록을 dirty block이라 함
- dirty block 추적은 하고있음
- 캐쉬값을 다른 곳에 옮겨놓아야 할 때 메모리에 write
* write miss가 날 경우는 ?
- miss 난 데이터 하위계층에서 fetch
- 초기화처럼 데이터를 write 하지 않아도 될 경우는 fetch 해오지 않는다.
* 메인 메모리는 고정된 width의 버스와 연결
* 버스 클락이 일반적으로 씨피유 클락보다 느리다
cache block이 read하는데 걸리는 시간 예
- 주소 전송에 1 버스 사이클
- 메인메모리 접근시간 당 15 버스 사이클
- 데이터 전송에 1 버스 사이클
위의 예일 때 4-word block인 캐쉬를 채우기 위해 1-word-wide DRAM으로 몇 사이클이 필요한가?
miss penalty=1+ 4*15+ 4*1=65 bus cycles
bandwidth= 16bytes(4 word이므로) / 65 cycles =0.25 B/cycle
캐쉬 성능 측정하기
cpu time = 프로그램 실행 사이클 + 메모리 stall 사이클(캐쉬 미스가 일어났을 때 손해보는 사이클 수)
메모리 stall 사이클
= 메모리 접근 횟수/프로그램 * Miss rate * Miss penalty
예)

위의 예일 때 CPI를 계산해보자
1. Miss CPI
I-cache: 0.02*100=2
D-cache: 0.04*100*0.36(명령어에서 load&store 명령이 차지하는 비율)=1.44
2. CPI
= 2+ 2+1.44=5.44
Average memory access time(AMAT)
Hit time( 원하는 것이 cache에 있는지 확인하는 시간) + Miss rate* Miss penalty
예) CPU clock= 1ns
hit time= 1 cylce
miss penalty= 20 cycles
I-cashe miss rate=5%
-> AMAT=1+0.05*20=2ns
-> 2 cycles per instruction
-> 메모리에 접근하면 평소보다 2배가량 느려짐
CPU 성능이 향상되려면?
1. base CPI를 줄여야함
-> 메모리 stall에 많은 시간을 씀
2. clock rate를 늘려야함
--> 캐쉬 miss 부분을 개선해야함
'컴퓨터구조' 카테고리의 다른 글
| chap 5-Memory(3) (0) | 2023.06.08 |
|---|---|
| chap 5- Memory(2) (0) | 2023.06.01 |
| Chap 4. Processor (2) | 2023.05.26 |
| chap3 - Arithmetic for Computers (0) | 2023.04.12 |
| 컴퓨터구조 전공수업 ch02 (1) | 2023.03.26 |