ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [컴퓨터구조] 시스템 캐시란? (feat. L1, L2, L3)
    General/🖥 Computer Architecture 2021. 9. 25. 00:59

    1차 수정: 21.09.28

     

    안녕하세요🐶

    이번 시간에는 캐시에 대해서 알아보려고 합니다.

    컴퓨터공학에서 빼놓을 수 없은 개념이 바로 캐시인데요.

    그 중 CPU 에 가까이 붙어있는 시스템 캐시에 대해서 다루어보려고 합니다.

     

    그럼 시작하겠습니다🔥


     

     

    개요

     

     

    캐시는 메모리 계층 구조 상 최상단 티어에 위치한 메모리입니다.

    메인 메모리보다 훨씬 작고 가격이 매우 비싸며, 그만큼 속도가 빠른 것이 특징입니다.

    위 피라미드는 메모리 계층을 표현한 그래프입니다.

    10 클럭 사이클 미만의 접근 시간이 걸리는

    캐쉬(Caches) 가 두번째인  등급에 위치한 것을 확인할 수 있습니다.

     

     

    레지스터 다음으로 캐시는 CPU 코어 가까이에 위치해있기 떄문입니다.

    캐시는 프로그램에서 직접 읽거나 쓸수 없고, 하드웨어 메모리 관리 시스템에서 내부적으로 제어합니다.

    따라서 프로그래머가 코드상에서 접근할 수 있는 방법이 없습니다.

     

    캐시를 관통하는 중요한 개념은 데이터 지역성입니다.

    데이터 지역성을 활용하여 메인 메모리에 있는 데이터를 캐시 메모리에 불러와두고,

    CPU 가 상대적으로 접근 시간이 느린 메인 메모리 대신

    캐시 메모리에 우선적으로 접근하게 하면 성능의 향상을 기대할 수 있습니다.


     

    배경

     

    컴퓨터는 꾸준히 발전해왔습니다. 그런데 프로세서의 발전속도를 메인메모리가 따라가지 못했습니다.

    프로세서가 아무리 빨라도 계산에 필요한 데이터를 얻기 위해서는

    상대적으로 느린 메인메모리에 접근해야 하기 때문에 전체적인 시스템 성능 향상에 한계가 생겼습니다.

     

    그래서 CPU 와 메인메모리 사이에 캐시를 두게 되었습니다.

    CPU -> 캐시-> 메인 메모리

    캐시는 CPU 와 메인 메모리 사이의 속도 간극을 줄여주는 완충재이며, 따라서 버퍼라고 불리기도 합니다.

    (이 속도 간극 때문에 병목현상이 발생합니다. 추가적으로 버퍼는 완충재라는 의미를 가지고 있음)

     

    캐시에는 보통 가격이 비싸고 속도가 빠르지만 용량 대비 크기가 큰 SRAM 을 사용하고,

    메인 메모리에는 가격이 싸고 속도가 느린 DRAM 을 사용합니다.

    특정 환경에서 SRAM 은 접근 속도가 초당 수 백 GB/s를 가뿐히 넘긴다고 하니 정말 어마무시하네요;;;;;;;

    또한 SRAM은 DRAM의 100배 이상으로 접근 속도가 빠르지만 구조가 복잡하여 공간을 많이 차지하므로 집적도를 높이기 어려워 가격이 비싸고 대용량으로 제작하기가 어렵다고 합니다.


     

    작동원리:  데이터 지역성

     

    위의 내용은 상식 수준 정도이고, 이제부터가 컴퓨터 공학적으로 중요한 내용이라고 볼 수 있습니다.

    캐시 메모리를 관통하는 핵심 개념은 데이터 지역성 (Locality) 입니다. 캐시 메모리는 이 원리로 작동합니다.

    "미리 쓸만한 데이터를 메인 메모리에서 캐시에 옮겨놓자"

    데이터 지역성은 시간 지역성( Temporal Locality), 공간 지역성 ( Spatial Locality), 순차적 지역성( Sequential Locality) 로 분류됩니다.

    시간 지역성은 한번 참조된 데이터는 잠시 후에 또 참조될 가능성이 높다는 것입니다.

    공간 지역성은 A[0], A[1] 로 구성되는 배열과 같이 참조된 데이터 근처의 데이터가 잠시후에 사용될 가능성이 높다는 것입니다. 해당 배열이 위치한 메모리 공간의 내용은 for-in 순회가 끝나기 전까지 계속 쓰일 확률이 높습니다.

    순차적 지역성은 비순차적 실행이 아닌 이상 명령어들이 메모리에 저장된 순서대로 실행되는 특성을 고려하여 다음 순서의 데이터가 곧 사용될 가능성이 높다는 것입니다.


     

     

    L1 캐시는 Level-1 캐시?

     

     

     

    https://mblogthumb-phinf.pstatic.net/20120820_259/rmflqhd_13454427767370VDpR_JPEG/3.jpg?type=w2

     

    시스템에 장착된 캐시의 용량과 성능이 점점 증가하면서 캐시의 캐시로 사용되는 메모리가 추가되었습니다.

    이것을 적용된 순서대로 L(Level) 1, L2, L3 ... 라고 호칭합니다.

     

    우리 말로 하면 '1차 캐시', '2차 캐시', '3차 캐시 메모리'가 됩니다.

    L1에 가장 고성능이자 고가인 작은 용량의 집적회로가 사용되고, L1캐시에서 데이터를 퍼가기 위한 캐시로 사용하기 위해 그보다는 용량이 크지만 그 대신 약간 더 느린 저장공간 L2가 추가되었습니다.

     

    보통 L1 캐시 메모리에는 명령어 캐시와 데이터 캐시가 따로 있습니다.

    그 중 데이터 캐시는 CPU 가 직전에 사용한 데이터를 저장하거나, 바로 실행되어야 하는 중요한 파일을 저장해 놓는데에 사용합니다.

    " It is used to store data that was accessed by the processor recently, critical files that need to be executed immediately and it is the first cache to be accessed and processed when the processor itself performs a computer instruction. "

     

    L1 캐시 메모리는 CPU에 직접 데이터를 공급해 주기 때문에 빠른 접근 지연 시간(Access latency)이 매우 중요한데,

    명령어는 보통 공간 지역성이 높고 데이터는 보통 시간 지역성이 높습니다.

     

    그러므로 이 둘을 나누어 서로 다른 지역성을 이용할 수 있습니다.

    또한 명령어와 데이터를 동시에 읽어올 수 있게 함으로써 CPU의 파이프라이닝 성능을 향상시킬 수 있게 됩니다.

     

    L2 캐시 메모리는 딱히 둘의 구분 없이 하나의 캐시 메모리로 구성되어있습니다.

    L1 캐시는 보통 8~64KB 정도의 용량으로 CPU가 가장 빠르게 접근하게 되며, 여기서 데이터를 찾지 못하면 이제 L2 캐시 메모리로 넘어가서 찾습니다.

     

    https://cdn57.androidauthority.net/wp-content/uploads/2016/03/Cortex-A72-cache-l1l2-16x9-720p.jpg

     

    ARM Cortext -A72 CPU 의 예 입니다. 프로세서가 단독으로 사용하는 L1 캐쉬와, 모든 프로세서가 공유하는 L2 캐시를 엿볼수 있는 그래픽입니다.또한, I-Cache, D-Cache 로 1차 캐시가 나뉘어 있네요!


     

    캐시의 내부구조는?

     

     

    캐시 메모리는 S 개의 집합으로 이루어져 있고, 각 집합은 E 개의 캐시 라인을 저장하고 있습니다.

    하나의 캐시라인은 메인 메모리에서 가져오는 블록 하나와,  그것이 유효한지 나타내는 유효 비트(Valid bit),

    그리고 동일한 집합에 들어올 수 있는 다른 블록들과 구별하기 위한 태그(Tag)를 저장합니다.

    따라서 메인 메모리의 각 블록이 B 바이트라고 할 때, 캐시 메모리의 총 사이즈는 (S x B x E) 바이트가 됩니다.

    이 때, 세트 당 캐시라인 수 (E) = 1 이면 Direct-Mapped Cache, E > 1 이면 E-way Set Associative Cache 라고 합니다.


     

    캐시 정책 ( 알고리즘 )

    캐시 메모리 성능 향상을 위해 적절한 캐시 정책을 취해야 레이턴시를 줄이면서 대역폭을 끌어올릴 수 있습니다.

    레이턴시는 입출력에 걸리는 시간이며, 대역폭은 단위 시간당 처리할 수 있는 데이터의 양입니다.

    메인 메모리의 각 블록은 캐시 메모리의 특정 집합에만 들어갈 수 있도록 되어 있습니다.

    Direct-mapped Cache

    예를 들면 메인 메모리의 2번째 블록 (00001) 은 캐시의 2번째 집합(001) 에만 들어갈 수 있다는 식입니다.

    왜? CPU 가 참조할 메모리 주소를 캐시에 전달할 때, 캐시는 해당 메모리 블럭이 캐시에 있는지 탐색해야 합니다.

    이 때 메모리 블럭이 마구잡이로 저장되어 있다면 선형으로 탐색해야 할 것입니다. = O(N x E)

    그런데 위와 같이 해시 방식으로 저장되어있으면 O(E) 로 존재 여부를 확인할 수 있습니다.

    이때 E는 한정된 숫자이므로 O(1)에 수렴합니다.

     

    CPU 가 캐시에 전달하는 참조하고 싶은 메모리 주소는 다음과 같은 형태입니다.

    메모리 주소 m = (t + s + b) 으로  구성되어 있습니다.

    이 때 메모리의 총 사이즈는 M = ( 2^m ) 바이트입니다.

    메모리는 바이트 어드레싱으로 1 바이트당 하나의 주소를 가지는데,

    주소의 개수가  2^m 개 이기 때문입니다. 

     

    여기서 2^s 는 Set 의 개수, 2^b 는 B(블록)의 크기가 되겠습니다.

    이때 메모리의 각 블록의 크기가 B 이므로 메인 메모리는 총 M / B 개의 블록 개수를 가지고 있습니다.

    2^m / 2^b 이므로 2^(m-b), 즉 상위 m-b 개의 비트가 블록의 위치를 지정한다고 볼 수 있습니다. ( t 와 s 영역에 해당)

    하위 b 비트는 해당 블록 내 바이트 오프셋을 나타냅니다.

    그리고 상위 (m-b) 비트 중 하위 s비트가 동일한 블록들은 동일한 집합에 들어가게 됩니다.

    그럼 나머지 t 비트 영역은 동일한 집합에 들어갈 수 있는 여러 개의 블록들을 구별해주는 비트가 됩니다.

    이것이 캐시라인에 저장되는 태그(Tag) 입니다.

    Set index = 행,  Tag Index = 열 로 생각하면 편할려나요?

    Block offset 은 해당 블록의 첫번째 부터 얼마나 떨어져있는지를 나타내는 값이구요.


     

    캐시 읽기 동작

     

     

    캐시의 구조
    CPU 가 전달하는 메모리 주소

    CPU 가 참조하고 싶은 메모리 주소 ( m = t + s = b ) 를 전달하면, 캐시는 우선 s 비트 영역를 통해 캐시의 해당 세트로 이동 합니다.

    이후 t 비트 영역 과 캐시라인의 tag 를 비교하고, 마지막으로 valid bit 를 통해 유효성 체크를 하고 통과한다면 캐시 히트 ( HIT ) 입니다!

    반대로 위 과정 중 탐색을 실패한다면 캐시 미스 ( miss ) 입니다.

    캐시 히트일 경우 찾은 데이터 블록에서 하위 b비트와 읽을 바이트의 개수를 나타내는 컨트롤 신호 정보를 바탕으로 요청된 바이트 배열을 반환합니다.

    캐시 미스인 경우 메인 메모리에서 필요한 블록를 캐시로 가져온 다음, 캐시 히트일 때와 동일하게 반환합니다.

    데이터 단위가 아닌, 필요한 데이터가 들어있는 블록을 통째로 가져온다는 것을 유념하자!

    1 블록 = 1 캐시 라인

    가져온 데이터를 해당 세트에 추가하는데, 이 때 세트에 더이상 공간이 없을 때 기존의 블록을 비워야합니다.

    이때 필요한 것이 Replacement Policy 이고,

    Random 정책, FIFO(First-In-First-Out) 정책, LRU(Least Recently Used) 정책 ,LFU(Least Frequently Used) 정책 이 있습니다.


     

    캐시 쓰기 정책

    수정하려고 하는 블록이 캐시 히트인 경우

    Write-through 정책 : 캐시의 내용도 수정하고 곧바로 메인 메모리의 내용도 수정합니다. 캐시와 메인 메모리간의 일관성이 보장되지만 버스 병목현상이 존재합니다.

     

    Write-back (Write-behind) 정책 : 캐시의 내용만 수정하고, 해당 캐시라인이 Replacement 될 때 메인 메모리의 내용도 수정합니다. 메인 메모리에 쓰기 동작이 최소화 되기 때문에 속도 측면에서 이득이 있습니다. 캐시라인에서 내려올 때 메인 메모리의 수정이 필요하다는 것을 알려주기 위해 추가적인 비트 (VI bit) 가 필요합니다.

    캐시와 메인 메모리간 일관성 (Cache Coherency) 이슈가 있기 때문에 캐시 일관성 프로토콜이 사용됩니다.

    캐시 일관성 프로토콜은 따로 글을 작성해야 할 것 같습니다...^^

     

    수정하려고 하는 블록이 캐시 미스인 경우

    Write allocate (Fetch on write) 정책 메인 메모리의 블록을 수정해준 다음 캐시로 Fetch 해주는 방식.

    해당 데이터가 자주 수정된다면 이 정책을 사용하여 캐시에 올려두는 것이 성능에서 이득일 것입니다.

     

    No-write allocate (Write-no-allocate 또는 Write around) 정책 : 메인 메모리의 블록만 수정만 하는 정책. 캐시에 따로 올리지 않습니다.

     


     

    캐시 성능의 요소

    Cache Hit Ratio =  '(캐시 적중 횟수) / [ (캐시 적중 횟수) + (캐시 적중 실패 횟수) ]× 100' 

    Cache Miss Ratio = 1 - (Cahe Hit Ratio)

    Hit Time = 캐시 라인의 데이터를 CPU로 전달하는 데까지 걸리는 시간

    Miss Penalty = 캐시 미스로 메인메모리에서 블록을 캐시라인에 가져오는 시간. 캐시 미스시 Hit Time + Miss Penalty 가 캐시 레이턴시가 된다.


     

    Cache Size 와 블록의 크기, E 와의 관계 (E - Associative)

     

    Cache Size 가 커지면 Miss Ratio 는 감소한다.

    사이즈가 크기 때문에 더 많은 블록을 넣을 수 있을 것이고, 시간적 지역성을 더 확보할 수 있다.

    방금 전 참조된 데이터는 다시 참조될 확률이 높다는 것이 시간적 지역성이었다.

     

    Cache Size 가 고정일 때, 블록 사이즈가 커지면 공간적 지역성을 더 확보할 수 있다.

    블록 사이즈가 작아지면 시간적 지역성을 더 확보할 수 있다. 중간 지점에서 Miss Ratio 가 최적화된다.

     

    N-Asscociative Set 의 배치방식에서 N의 크기가 커질수록 Full-Associative 에 가까워진다.

    이 때 공간의 낭비 없이 블록을 넣을 수 있게 되므로 Confilct Miss 가 줄어든다.

    하지만 캐시 전체를 순회해야 하므로 Hit Time 이 증가할 것이다.

     

    N의 크기가 작아질수록 Direct-Mapped Cache 에 가까워진다.

    캐시에 낭비하는 공간이 늘어나게 되고 Conflict Miss 가 증가하지만 Hit Time 은 감소할 것이다.

     

    Hit Time 이 중요한 곳에는 N 의 크기를 줄이고, Miss Rate 이 중요한 곳에는 N의 크기를 늘리면 최적화 된다.


     

    A14 Bionic 에서의 캐시는?

     

    고매한 갓플🍎님 께서는 자신들이 설계한 칩에 대한 정보를 최소한만 노출합니다.

    다른 곳에 판매할 칩이 아니라, 자신의 기기에서만 사용하기 때문입니다.

    따라서 정확한 설계 구조는 알 수 없고, 각 파트의 스펙 정도만 알 수 있는데, 스펙은 다음과 같습니다.

     

    스펙

    Apple Firestorm MP2 2.99GHz + Apple Icestorm MP4 1.82GHz
    192KB + 128KB L1 Cache(Firestorm) / 128KB + 64KB L1 Cache(Icestorm)
    8MB L2 Cache(Firestorm) / 4MB L2 Cache(Icestorm) 
    16MB System Cache

    CPU 는 ARM 사의 big.Little 구조를 채용하여 2코어 Apple Firestorm 과 4코어 Apple IceStorm 으로 구성되어있습니다.

    192KB 는 L1 명령어 캐시에 해당하는데, 레이턴시가 3사이클에 불과하다고합니다....

    " 이는 경쟁 ARM 코어 대비 3배나 되는 크기이며 현대의 x86 아키텍처 대비 6배나 되는 크기이다. 게다가 거대한 용량에도 불구하고 캐시 액세스 시간이 3 사이클에 불과하다. AMD의 32KB 캐시는 액세스 시간이 4 사이클이며 인텔 서니코브의 48KB 캐시는 5 사이클의 액세스 시간이 걸린다. 또한 리틀 코어의 명령어 캐시도 128KB로 경쟁사 빅 코어보다도 훨씬 큰 크기를 가진다. " - 아난드텍  -

    애플에 혁신 없다고 하는 사람들은 애플을 잘 모르는 사람들... 🤔

    뭐 아무튼 배운바에 따르면 128KB 는 데이터 캐시가 되겠습니다.

    Apple Silicon 은 더 자세한 정보가 나오면 추가하도록 하겠습니다!

     

    오늘도 나는 성장했다!!! ✊🏻


    🤖🟢[우짱의 iOS 블로그]🔵💻

    iOS를 공부하면서 배운 내용을 기록하고 있습니다.

     

    참고 자료

    https://namu.wiki/w/캐시%20메모리?from=Cache 

    https://www.techopedia.com/definition/8048/level-1-cache-l1-cache

    https://it-eldorado.tistory.com/50?category=761782 

    댓글 2

어제보다 발전한 나