티스토리 뷰

Study/Architecture

[Computer Architecture] Motivation for Caches

생각많은 소심남 2013. 11. 17. 14:47

Cache를 왜 쓸까? 그 질문에 대한 답이 아마 이 포스트에 담길 듯 하다. 그래 왜 쓸까? 그걸 알려면 일단 CPU와 Memory간의 관계를 알아야 될거 같다.



 이런 CPU와 Memory와 같이 데이터가 내부적으로 이동하는 구조에서 성능을 좌우하는 요소는 물론 여러가지가 있겠지만 일단 가장 핵심적인 요인으로 다뤄지는 것이 바로 Latency가 될것이다. Latency란 그냥 있는 그대로 표현하면 데이터가 저장되어 있는 영역에 한번 접근하는데 걸리는 시간을 의미한다. 사실 어차피 Memory에 저장되어 있는 Instruction을 CPU가 읽어야 비로소 정상적인 Operation이 가능할텐데 통념상 그런 instruction을 읽고 처리하는 시간보다 Memory로부터 그 instruction을 읽어오는 시간이 훨씬 많이 걸린다. 앞에서 말한 단어로 표현하자면 Memory latency가 Process Time보다 크다는 것이고 이는 곧 Performance에 영향을 미친다는 의미이다.

 또다른 요인으로는 Bandwidth도 들 수 있다. 한 Unit Time동안 앞에서 말한것처럼 정해진 영역에 접근하는 횟수를 Bandwidth라고 하는데 만약 현재 수행되고 있는 Instruction이 LD/ST와 관련된 거라면 필연적으로 memory access가 발생할 것인데 잘 보면 Memory로부터 Instruction을 읽어오는데 한번, 그리고 그 영역에서 m개의 데이터를 불러오는데 m번, 총 m+1의 memory Access가 발생한다. 다르게 표현하면 가장 이상적인 동작이라고 할 수 있는 CPI(Clock Per Instruction)이 1인 시스템에서는 적어도 m+1의 Bandwidth를 가진다는 것이다. 그런데 당연히 지금 쓰는게 CPI가 1이 아니므로 m+1보다는 큰 값의 bandwidth를 요구한다. 문제는 이게 CPU를 설계하면 bandwidth가 고정되기 때문에 만약 데이터 이동이 많이 일어나는 작업을 수행할 경우에는 한 instruction을 수행하기 위해 다음 instruction 이 늦게 읽히는 현상이 발생하는 것이다. 이게 곧 Bottleneck 현상이라고 할 수 있다. 뭐 다르게는 Rush Hour Effect라고도 하는데 말그대로 중간에 막히는 구간에 있어서 정체를 유발하는 것이다. 보통 데이터 분석시간에 잠깐 다루는 Little`s Law에 의하면 우리가 한 작업동안 다뤄야 할 데이터의 총량은 앞에서 언급한 Bandwidth와 Bottleneck으로 인해 발생하는 delay를 곱한 값으로 도출한다.


지금까지 한말을 뒤집어보면 Memory로부터 직접 데이터를 읽어오는 건 Latency와 Bandwidth로 인해서 많은 제약이 발생한다는 것을 알 수 있다. 그걸 해결하기 위해서 Cache가 나온 것이다. 잠깐 지난시간에 봤던 Memory 들을 한번 나열해보겠다.



지난 포스트에서도 다룬 내용이지만 Capacity가 DRAM이 나머지 것들에 비해서 훨씬 크다 즉, 한 Cell이 가지는 Capacitance가 크기 때문에 그만큼 작은 크기로도 집적을 시킬 수 있다는 의미가 된다. 하지만 당연히 Spatial Locality를 고려하면 Size가 DRAM에서 데이터를 읽어오는 시간은 나머지 것들에 비해서 Latency가 무척 클 것이다. 보통 중간에 있는 Memory를 On-Chip Memory라고 하고 뒤에 있는 것들을 Off-chip이라고 한다. 그런데 잘 보자. Onchip에 있는 것들은 말그대로 Processor가 있는 die위에 놓여있기 때문에 정해진 시간동안 Access하기 쉬울 것이다. 반면 Off-chip은 die가 아닌 Board에 있기 때문에 CPU상에 있는 물리적인 Pin으로만 데이터 전달이 이뤄지고 당연히 그렇게 전달할 수 있는 양이 한정적일 것이다. 앞에서 소개한 표현을 따라가자면 onchip Memory는 bandwidth가 큰 것이고, offchip Memory는 상대적으로 bandwidth가 작다고 표현할 수 있겠다. 여담으로 offchip의 bandwidth가 physical한 wire에 의해서 발생하는 것이기 때문에 이를 해결하기 위한 방법 중 하나가 wire on chip이라는 게 있다. 사실 이건 연구분야라서 검색해도 별 자료가 나오지 않는 거 같다. 그냥 강의에 소개되서 한번 언급해본다. 아 그리고 한가지 더 언급할 게 있다. 앞에서 말한 것처럼 Physical Wire로 인한 bandwidth문제를 해결하기 위한 방법중에 최근에 나오는 게 바로 Land Grid Array 라는 방식이다. 



아마 컴퓨터 조립을 해본 사람이라면 Intel 소켓중에 LGA 라고 표현되어 있는게 있을 것이다. 그게 바로 Land Grid Array의 약자인데 기존에 die에서 pin을 직접 뽑아서 쓰는게 아니라 die상에서는 pin을 없애고 보드 상에 접촉시켜서 bandwidth문제를 어느 정도 해결하기 위한 방법이다. 뭐 그냥 참고하면 좋을거 같고, 다른 방식으로는 Ball Grid Array방식도 있다.아무튼 이렇게 connection technology도 성능에 큰 영향을 끼친다는 걸 소개하고자 했다.


자 그럼 Cache를 이야기하는데 있어서 빠질수 없는 내용인 Locality를 다시보고자 한다. 이전 포스트중에서도 한번 언급한 적이 있었는데 Locality는 Time에 의한 Temporal Locality와 Space에 의한 Spatial Locality로 구분된다. Temporal Locality는 Time에 대한 내용이 들어있는 대로 현재 있는 데이터를 가까운 미래에 또 읽을 수 있다는 개념이고 Spatial Locality는 가까운 미래에 또 읽으려는 데이터는 현재 저장되어 있는 위치와 가깝게 있을거라는 내용이다. 사실 이부분은 이전에 Locality그림을 다룰 때 언급했었기에 자세한 설명은 생략하려고 한다. 그래서 아무튼 이런 Locality를 고려하면서 Cache를 설계하면 Performance에도 영향을 미친다는 개념이 적용되기 때문에 중요하다. 예를 들어서 Cache를 무작정 크게 만들수 없는 요인 중 하나가 이전 포스트에서 소개한 Price 측면도 있긴 하지만 또다른 요소중 하나가 사이즈를 늘려 놓으면 먼 주소에서 데이터를 읽어오는데 overhead가 발생하기 때문이다. 즉 Spatial Locality를 위반하기 때문에 어느정도 수준에서 size를 정해놓은 것이다.

 그래서 Cache는 Temporal Locality를 유지하기 위해서 항상 현재 접근하는 영역의 내용을 기억하는 특성을 가지고 있고, spatial Locality를 유지하기 위해서 현재 fetch하는 영역 주변 내용도 같이 fetch하는 특성을 가진다. 


 한마디로 요약하면 cache를 쓰는 이유는  main memory까지 access하는데 발생하는 bottleneck을 피하기 위해서이며, 이 cache을 장점을 살리기 위해서 Locality라는 개념이 존재한다. Locality는 time에 의한 temporal Locality가 있는데 이를 위해서 현재 fetch하고 있는 내용을 담고 있는 특성을 가지고 있으며, Space에 의한 spatial Locality를 유지하기 위해서 fetch 영역의 주변도 같이 fetch하는 특성을 지닌다.

댓글