good selection을 책장에서 가져오면 굳이 책장에 다시 갈 필요 없이 책상위에 내가 원하는 책이 있다. 그럼 시간을 절약해준다.
메모리에 엑세스를 빨리 하려면 principle of locality가 중요
책장 = main memory 책상은 processor
책상위에 있는 책들 = cache. 프로세서 칩 안에 있는 메모리
좋은 selection을 캐시에 갖다놓으면 메인 메모리에 왔다갔다 할 필요 없다
latency가 많이 발생한다 main memory에 접근할때. 프로세서 외부이므로 시간이 오래 걸린다.
Principle of locality
메인 메모리중의 small portion만 있으면 프로그램 실행하는데 아무 문제가 없다
temporal과 spatial locality
temporal은 책을 빌리면 당분간 그 책을 본다. 최근에 본 책을 다시 또 볼 확률이 높다
최근에 엑세스 했으면 다시 엑세스 할 확률이 높다
spatial localtiy는 메모리에 데이터가 유사한것끼리 모여있으므로 공간적으로 유사한것끼리 모아놨다.
최근에 엑세스한거 다시 볼 확률 높다 내가 본 책 주변에 내가 참고할만한 책이 많다
현대 모든 컴퓨터의 메모리가 이 원리를 기반으로 만들어짐
Memory Hierarchy
메모리는 계층구조로 되어있다 이것들을 locality를 쓴다
제일 작은 메모리는 프로세서랑 가장 가깝다
모든 정보는 맨 아래에 다 저장되어있음
필요한 영역을 위로 가져오는것
최근에 접근한것을 nearby것들을 copy해서 dram에 가져온다 spatial locality
dram 메인메모리 램이 크면 컴퓨터의 성능에 직접적인 영향을 준다 HDD에 접근할 필요가 없어진다. 요새는 ssd에 운영체제를 깐다 hdd에 다운받으면 부팅오래걸림
hdd는 레이턴시가 높다 물리적으로 접근하기 때문 액세스하는순간 큰 손해를 봄
sram 더 최근에 접근된 데이터를 sram으로 복사한다 = cache 메모리
d는 dynamic s는 static
캐시 메모리는 사실 프로세서 안에 들어가있다!
아래로 갈수록 비용이 싸다 processor로 갈수록 비용 비싸짐
모바일에서는 flash memory로 hdd를 대체한다
block = 복사의 최소단위 mutliple words
실제 복사할때는 주변의 많은 것들을 들고온다
주변을 갖고온는 이유는 spatial locality때문 주변도 조만간 access할거라고 예상
그래서 같이 갖고오는 단위를 block이라고 한다
한 단위는 1 word size
주변까지 같이 갖고오는 전체 사이즈를 block이라고 한다
blok의 사이즈가 크면 한번에 많이 갖고오는것
upper level에 필요한데이터가 있으면 hit 위의 레벨에서 access가 성공함
hit ratio = hit/access
hit time은 upper level 메모리에 엑세스해서 데이터 받는데 걸리는 시간
miss 데이터가 캐시에 없다. 아래에도 없으면 더 아래로. 모든것은 디스크에 있다
메인메모리에 접근했는데 데이터가 있는경우와 없는경우
있으면 그 데이터만 가져오는게 아니라 블락사이즈만큼을 통째로 복사해온다
복사했으니까 cache에 있으니까 프로세서에 전달함 캐시로 올린다음 해야한다 메인 메모리에서 주는 경우는 없다
hit + miss/access = 1
miss ratio = 1 - hit ratio
miss penalty(time) 프로세서에서 요청하고 캐시에서 찾고 메인메모리 내려가서 찾고 블록을 캐시로 복사해서 캐시에서 프로세서로 주는 총 시간
Memory Technologies
sram = cache
dram 휘발성 전원을 껐을때 데이터 날아간다
플래시메모리와 magnetic 둘다 비휘발성
dram 데이터는 capaciator를 통해 저장이 된다. 시간이 지나면 전하가 떨어진다
데이터가 손실됨. 이걸 막으려면 refresh를 해줘야한다 전하 공급
single transistor가 쓰인다. 반드시 주기적으로 refresh되어야 데이터가 손실되지 않는다. 그래서 이름이 dynamic이다 refresh 해줘야해서
전력이 필요하다 .전원을 끄는순간 refresh안되기 때문에 휘발성 메모리인것이다
refresh는 계속 복사해서 똑같은거 쓰는것
bank라는게 있고 안에 row가 쭉 쌓여있다. bank의 row단위로 복사, activation과 precharge row단위로 복사 붙어넣기한다.
cpu에서는 column단위로 read rwrite
dram의 전체 row를 한번에 refresh한다
시간이 지남에 따라서 ram가격이 떨어지고 있고 access time줄어들고 있다
row buffer
row를 쌓아놓은부분. bank중에 자주사용되는것들을 복사해뒀다가 요청이 오면 보내준다
row buffer의 random bit이 access될 수 있다. 어디든지 random하게 access
그래서 random access memory = RAM
DRAM banking
bank로 구성되어있다. bank가 여러개있어서 multiple dram에 acess할수있어서 bandwidth가 는다
synchronous dram 메모리와 프로세서를 sync
dram에 clock을 넣음. 시작하는 clock에서 데이터 access
연속된 access가 가능하도록 한다 연속적으로 데이터 제공해서 더 속도 빠르다
DDR double data rate = rising이랑 falling edge둘다에서 데이터를 준다
두배로 데이터를 준다 요새는 다 이걸 쓴다. transfer이 rising falling둘다에서 발생
DDR4는 bank가 16개 DDR5가 작년에 나옴
DIMM서버에 많이 쓰이는것 DDR4가 여러개 이어짐
플래시 메모리 magnetic disk대신 쓰일수있다
모바일 기기에 많이 쓰인다. 비휘발성메모리 반도체 스토리지
하드디스크보다 100~1000배 빠르다 양은 적다 비싸고
smaller, lower power, robust
디스크랑 dram사이 가격
nand flash memory 예전에는 2d nand 메모리 cell이라고 된 부분에 데이터 저장되고 peri = peripheral 제어구가 들어있는 기판 평평한 기판
3dnand기술 셀을 위로 쌓기 시작함. 얼마나 높이 쌓느냐가 기술력 속도
puc peripheral under the cell 이러면 4d nand 면적 작아져서 소형화 유리
cell에 있는 데이터 엑세스 하면 wear out된다. flash 하나하나 비트가 1000번이상 엑세스 되면 닳는다. wear leveling기술이 필요하다
덜쓴곳으로 매핑시켜서 수명을 늘리는 기술
디스크 분당 6000회정도 디스크가 회전 arm이 끝에서 물리적인 접촉으로 데이터를 읽어온다. 디스크 조각모음 hdd에서 하는거
5400~15000회 분당 회전.
arm이 반지름이 동일한 원을 그리고 그 원을 track이라고 한다
track을 수직으로 내리면 두번째 있는 플래터에도 트랙이 있고 다 모드염 cylinder
각 플래터의 해당 위치 트랙을 다 모은것
seek 헤더를 해당위치로 가서 찾는데 지연시간 발생
외부로 멀리 가야하고 데이터 찾는데도 시간이 걸리니까 가급적이면 access안하는게 중요 그래서 메모리 계층이 있는것
가장중요한건 cache
static 데이터를 저장하는데 refresh가 필요없다
dram보다 훨씬 빠르다. 얘도 ram이라서 전원끄면 데이터 날라가는건 똑같다
메모리에서 xn을 가져다 캐시에다가 저장
처음에는 캐시에 아무것도 없다가 순서대로 채워지지는 않음
메모리 슬롯중에서 xn을 어디에 배치할것이냐
direct mapped 캐시
각각의 메모리 address는 직접적으로 연결됨 cache의 location에
메모리와 캐시의 사이즈가 차이나므로 적절히 매칭을 시켜줘야하는 문제 발생
매핑하는 방법
블록은 데이터를 복사해오는 단위. 캐시 그림의 네모하나가 하나의 block
block이 총 8개있다면 2의3승 블록의 주소는 3개의 비트만 있으면 엑세스 가능
메모리 block address 00101을 mod 8하면 101된다
각각마다 블록의 주소가 있다 메모리도.
메모리는 2의5승 32개의 블록이있다고 하면 메모리 4개당 캐시 한칸에 매핑하면 되겠다! 4개씩 매칭시키려고 mod연산하는것
00을 버리나? 아니다 가지고 있는다 tag로서. 왜냐면 메모리 어디 블록에서 왔는지 알수없으니까 버리면
캐시 보면 데이터 필드와 태그 필드가 따로 있다. 메모리 어디에서 왔는지 특정하기 위해서
valid bit 0이면 데이터가 없다 가져오면 태그 저장하고 valid 1이된다
valid비트 1비트만 있다
Q) 8개 블록의 캐시가 있다. 2의3승이니까 주소는 3개의 비트만 카운트하면 된다
cache가 empty니까 초기조건은 전부 miss가 난다. 캐시가 비었으니까 그밑으로감
22에 있는 데이터 달라고 요청하면 메모리에서 데이터 복사해오는거니까 load
캐시에 데이터 할당. 프로세서에서 22위치의 데이터 달라고 하는데 처음에는 당연히 없어서 miss뜨고 메인 메모리로 가서 달라고 하면 해당 데이터를 캐시에 복사해서 넣어준다. dram으로부터 데이터 가져와서 캐시에 저장
주소에서 앞에 두개뺀 110에다가 데이터 저장
26에 엑세스 함. miss나서 똑같은 작업 하고..
무조건 데이터 있다고 hit라고 할 수없고 tag까지 비교해야한다
comp는 뺄샘하는 애다 비교하기 위해서
and gate 둘다 1이어야 1이다
comp에서 하나 입력이 오고 다른 하나는 valid에서 온다
hit이려면 valid하고 comp결과도 1이어야 한다
comparator에서 tag 비교한다. 두개 다르면 시그널 0된다 = miss
주소 32비트 주소값 1024 word
1word당 4byte 1024word는 4kibibyte = 캐시의 사이즈
캐시에 들어가는 데이터는 1word사이즈 즉 32비트
이게 1024개 있으니까 인덱스 0-1023
캐시의 사이즈는 데이터필드의 사이즈와 똑같다 1word면 1024까지
address 맨끝에는 byte offset
alignment restriction 4씩 차이나는것
메모리니까 캐시도. 32비트면 바이트로 4니까 byte offset 00들어감
그앞에는 index들어감 비트가 5개라면 00010들어가던거 tag/index
근데 30비트로 늘어난거뿐임. 인덱스 10개 비트 1024가지
태그 비트의 수는 20.
태그가 두자리일때 4대1이었는데 20비트면..?
블록은 최소단위가 single word. multiple word가 될수 있다
캐시의 전체 비트 수 직사각형 넓이 공식 1024 * (valid + tag + data)
11/19
1word는 4바이트 = 2의제곱 바이트 따라서 2의 m+2승
byte offset이 생긴거
캐시사이즈가 16kib라면? 데이터 필드의 사이즈와 똑같은 말이다
16kib를 word로 바꾸면 2의14승바이트 = 2의 12승 word
블록사이즈가 4word로 커졌다 9페이지를 보면 block은 copy의 최소단위라면서 multiple word가 될 수 있다고 했음.
블록사이즈는 한번에 몇개의 word를 복사해올것이냐는 뜻 4word도 8word도 될수있다
cpu가 캐시한테 1word를 요청했다 → 데이터가 없으면 main메모리에서 가져온다. 메인에서 가져올때 데이터의 사이즈는? 4word. 1word만 요청을 했어도 4word만큼 가져온다. cpu한테 줄때는 single word만 주고 나머지는 캐시가 가지고 있는다. 조만간 엑세스할 확률이 높기때문에 가져오는거다
약 1.15배 된다
5-2
m값이 0이면 1word size
캐시 블록이 64개이고 블록사이즈가 16바이트라고 할때, direct mapped일때
byte address 1200은 몇번 블락에 할당되는가?
2의6승 = 64 = n = index비트가 6개
16바이트는 4 word ⇒ m =2
offset은 두개를 동시에 고려 block offset + byte offset = 2+2
그래서 offset이 4비트가 됨
block size 분석 = 블록이 크면 miss rate이 줄어든다 일반적으로
fixed size cache일때 많은 word들이 활용되기 전에 대체되어버린다 다른블록으로
그래서 miss rate이 다시 올라간다
하지만 cache size가 크다면 블록 사이즈 커져도 딱히 miss rate이 올라가지 않는다 많이 보관할 수 있으니까
cache miss가 나는 경우 pc-4를 메모리로 보낸다
cpu pipeline을 stall하고 메인메모리로부터 블록을 갖고온다 만약 main memory에없으면 또 갖고오는거고
캐시에 써준다. index빼고 나머지지를 태그에 넣어주고 data 넣어주고 valid bit를 1로 만든다
7페이지부터는 store하는것을 배울것임 지금부터는 load하는거였음
sw로 데이터 쓰라고 하면 프로세서는 캐시에 쓰는거임 캐시에는 데이터가 업데이트 됨.
메인메모리는 아직 업데이트 안됨. 그럼 하드디스크에는 모든 데이터가 다 있다는 가정이 깨지고 consistency를 보장할 수 없다. 그래서 캐시는 내가 아는걸 아래로 넘겨줘야 consistency를 보장할 수 있다
넘겨주는 방법3가지 write through = 캐시를 업데이트하는순간 동시에 메인메모리도 업데이트한다
문제는 캐시는 프로세서 안에 있으니 엑세스 빠르지만 메인메모리는 떨어져있어서 한참 기다려야한다
sw한번할때마다 100cycle씩 버려야한다
write buffer = cpu는 수행 계속하고 buffer에 저장. write buffer가 full일때만 stall하면 된다
write buffer사이즈가 요새는 커서 stall시간이 거의 없다 무시할만한 정도
write back = write buffer처럼 해당 블록을 캐시만 업데이트하고 cpu는 계쏙 실행하도록 한다. 다른 데이터를 가져와야해서 덮어씌워지는 상황이면 그때 업데이트한다
운영체제가 캐시에 있는 데이터 보면서 메인메모리에 업데이트 안된 블록을 체킹하고있음
write buffer는 사실 write through에 붙을수도 있고 write back에도 붙을수도 있어서 2개라고 하기도 한다
11/21
캐시이즈는 데이터 필드 사이즈와 같다
16 = 2의 4승 4 = m
byte offset은 무조건 디폴트로 00
m=4라서 다음 4가 있고 6개 비트가 offset이 되는것
데이터 비트 8개 나머지 tag
data를 프로세서로 보내고 있다 lw를 실행하고 있다
32비트를 가져온다 single word만큼
한 블록 안에는 word가 16개 있다 다보내는게 아니라 하나만 보내야한다 lw할때
결국에는 16개중에 뭘 선택해서 보내주는가? MUX가 결정함
총 16개를 다 받고 있다 mux는. 어떤걸 보내줄지는 m이 결정한다
block offset = m 값이 mux에 control singal로 들어간다
hit발생시키는 로직 태그값 받아와서 비교하고 and gate통과해서 데이터 있고 tag같으면 hit
read request = lw
캐시가 미스나면 데이터가 없다는 얘기니까 main메모리 가서 cache로 가져온다
cache miss rate은 instruction miss rate, data miss rate
instruction memory와 data memory에서의 missrate을 말하는거임 effectively combine하면 3.2프로정도가 된다
메모리에 stall이 있다 캐시 데이터 없을때 메인 메모리 가서 가져와야하니까
이제 무시할수 없다 그래서 memory-stall clock cycle을 더해준다
read stall, write stall로 나뉜다
프로그램이 write엄청 많이 한다면 대신 써야할 양이 많아지고 꽉차면 기다려야한다. 어느정도 크면 무시할만하다 can be ignored
write buffer stall이 10이라고 하면 넣어서 풀면 되고 없으면 그냥 무시하고 풀면 된다
write miss = 블록을 가져오는걸 필요로 한다 write을 하기 전에 미리 가져와서 값을 쓴다
유사하니까 하나로 바꿀수 있다 read/write 합쳐서 memory access, 전체 miss rate, 전체 miss penalty
instruction memory가 instruction cache이다
data cachce = data memory
miss penalty 한번 miss가 나면 보는 손해 clock cycle
I = instruction수
모든 instruction은 instruction을 거친다 하지만 add같은 것들은 data cache를 거치지 않는다
miss와 함께 miss 안났을때도 더해야 해서 5.44가 된다
AMAT average Memory Access Time
write buffer stall = 0이라고 하는 것 = ignore other write stalls
사이클 구해서 초로 변환
1사이클 당 cylce time이 1ns일때 AMAT는 2ns가 된다
Associative Caches
Fully associative cache
(n-way) set associative cache ⇒ 중요
각 set이 n개의 entry = block을 가진다
블락은 multi-word로 되어있음 각각의 set은 n개의 블락이니까 여러개 묶인거다
그래서 n-way라고 하는것. 2-way 블락 2개를 하나의 set으로 묶었다
direct mapped cache가 1-way인것 block = set
max = 모든 블록을 하나의 set으로 묶었다 = fully associative cache
set associative의 파생이 directly mapped와 fully associative인것
set이 왜 필요하냐? direct mapped는 메인메모리의 위치에서 갈수있는 위치 단 하나밖에 없다.
만약 나머지는 다 비어있다면? 비효율적이다. 있는걸 빼고 데이터를 다시 넣어야할수 있으니까. flexible하게 하기 위해서 direct mapped는 딱 한칸밖에 못쓰니까 저장가능한 위치를 넓혀주는것
fully인 경우 전부 다 들어갈수 있음 아무데나 저장할 수 있다
direct mapped는search가 필요없다 위치로 가서 데이터 있는지 없는지만 체크
set associative는 데이터가 갈 수 있는 영역이 여러갠데, 그래서 search를 두번한다 해당 위치를 특정하기 위해서 n개의 comparator를 필요로 한다
fully는 다 searh해야한다 모든 entry를. 아무 위치에나 저장할 수 있고 모든 엔트리를 다 search해야함. comparator를 블록 당 전부 달아줘야한다
n-way는 n개만 있으면 되므로 덜 expensive하다
LRU least-recently used 방식. 가장 엑세스 된지 오래된 애를 바꾼다
최근에 access된건 다시 acesss될 확률이 높기 때문에
directly mapped는 miss가 날 확률이 높고 fully가 가장 hit날 확률이 높다
근데 fully로 하지 않는 이유는 비싸기 때문에 n-way를 많이 쓴다
시간이 중요하고 캐시가 작은 경우 fully로 구성하기도 한다
캐시가 single word block이면 32비트 m이 0이고 block offset0이된다
index는 2의8승까지 있으니 8비트.
or게이트 ⇒ 4개중에 하나라도 맞으면 hit다 4way
mux는 hit여부에 따라서 분기
set associative는 non-valid 즉 비어있는곳에 쓰는걸 선호한다 근데 비어있지 않으면 entry중에서 골라야한다 하나는 바꿔야하니까. 선택하는 기준 = LRU가장 access된지 오래된것 4-way넘어가면 LRU트래킹하기 어렵다 n값이 너무 커지면 LRU사용이 어렵다. 그때는 random으로 아무거나 바꾸면 된다
associativity가 높으면 random으로 해도 성능이 거의 똑같다 하드웨어도 추가로 필요없고
comparator가 늘어난다 associativity가 늘어날수록
way가 늘어날수록 tag비트에 할당된 양이 점점 늘어난다
Cache
비교를 count하나 tag나 data필드를 카운트하나 상관없다
줄글에서 tag index block offset이 몇개의 비트인지 맞추는 시험
multi-level cache
캐시 밑에 캐시가 또있음 Primary cache, secondary cache
프로세서는 primary cache하고만 주고받는다
요즘에는 third level cache를 사용한다
secondary캐시를 적용하면 얼마나 빨라질까? 그리고 miss rate을 0.5까지 줄이려면 얼마나 커야하나
base cpi = 아무런 stall이 없는 상황
primary cache에서 secondary가는건 5나노초밖에 안걸리는데 secondary에서 main메모리 가는건 100나노초나 걸림 그러니까 second있는게 훨씬 성능이 좋다
secondary가 조금 더 느리지만 더 크다! 그래서 miss가 덜난다
얼마나 빠른가? 분수까지 써서 뭐가 뭐보다 몇배 더 빠르다고 쓰기
사이즈가 작을때는 quick이 유리 사이즈 클때는 radix sort가 유리
메모리 access를 보면 radix는 미스가 많이 나서 소비하는 클락 cycle이 더 많더라
item당 clock cycle이 radix sort가 더 많더라
메모리 접근으로 인한 성능을 고려하지 않으면 더 안좋을수가 있다
dependability
정상적인 상황에는 service accomplishment. spec대로 서비스가 제공된다. 고장나면 status가 interruption으로 바뀐다 서비스 중지된다. interruption되면 고쳐야하는데 그럼 시간이 필요하다. reliability = 실패때까지 걸리는 평균시간 mttf
annual failure rate = 1년안에 실패하는 rate
mttf는 서비스 시작하는 순간부터 interrupion까지 도달하는 시간
mttr mean time between failure
mtbf = mttf + mttr
availability = 실패할때까지 걸리는 시간
mttf가 커지거나 mttr이 작아지면 된다 그럼 고장 회피할수 있다
mttf 증가시키는 법? mttr줄이는 법?
mttf 얼마후에 고장난다
백만시간 mttf인 디스크들도 있다 요즘에는 살면서 고장나지 않음
warehouse scale의 컴퓨터는 50000개의 서버가 있다. 각 서버가 2개의 디스크를 쓴다고 하면? 365*24 = 8760시간 일년당. 디스크를 10만개 쓰니까
일년에 876개가 고장난다. 매일 2개가 고장난다!! 그래서 서버룸에서 관리자들이 디스크 갈아준다
Hamming Distance
프로세서와 메모리가 데이터 주고받다가 전송과정에서 깨질 수 있다
배우는 이유는 데이터 받았는데 문제가 있는 경우를 판단할 필요가 있기 때문에
오류탐지를 위해서
패리티코드. even parity가 가장 많 이쓰인다.
7-bit데이터가 있을때 1의 개수를 세서 몇개 있는지 보고 1의 개수를 보고 패리티 비트를 결정함. 짝수이면 0으로 하고 홀수이면 1로 해서 짝수개로 1을 맞춘다 = even parity
캐시가 0으로 다 보냈는데 프로세서가 값을 받았을때 하나가 1이 되었다? 짝수개의 1이 아니니까 뭔가 깨졌다고 판단할 수 있다. 그럼 프로세서에서 값을 버리고 재요청한다
근데 2개가 에러가 나면 짝수개니까 에러 아니라고 판단한다. 두개이상 틀리는 순간 detect가 안된다.
minimum distance가 3이면 에러 correction할수 있다 하나는!
2-bit에러는 detection은 할 수 있다. 예를들어 000 111일텐데 011오면 틀린거 알 수 있다 010이면 1이 틀린걸 고칠수있다
원래 파형을 유지하지 못하고 4ghz면 엄청 빨라야하니까 곡선형이 되고 거기에 노이즈까지 끼면 더 평평해진다. 그러다보면 에러가 발생하기 쉬워진다.
ECC
패리티비트로 1,2,4,8자리는 지정을 해놓음
p = 패리티 비트 d= data
첫번째 패리티 비트는 1357911의 위치를 트래킹한다.
두번째 패리티비트는236710의 위치를 트래킹한다
이것들은 이진수로 바꿨을때의 패턴때문에 그러는거다
bit1을 이진수로 바꿨을때 1의 위치 ⇒ 첫비트가 1인 친구들
bit2는 두번째 비트가 1인친구들 고려
bit3은 3번째가 1인 애들
패리티 비트의 위치는 2의n승.
8비트짜리 데이터가 있다 1248자리를 만들고 패리티비트를 넣는다
패리티 비트는 따로 고려하기 따라서 패리티 비트 들어가는 순서는 데이터가 없는것으로 간주
1의 개수가 홀수니까 짝수를 만들기 위해서 두번째 비트가 1이 된다. 이렇게 각 패리티비트의 값을 지정하는것!
만약 10번째 비트가 바뀌었다면? 각 패리티 비트 결과가 이상이 잇는지 확인한다
1번패리티에서는 okay 2번에서는 error 8번에서 에러
2+8 = 10이 나와서 10번째가 틀렸다는걸 알수 있다
Virtual Machines
vm은 virtual memory를 연결해서 사용한다
VMM virtual machine monitor 모니터링할 수 있다.
가상의 io device를 emulate해준다