본문 바로가기

CS/컴퓨터구조

[컴퓨터구조] 캐시(3)

현재 글은 이 글에서 이어진다.


Line Size

 캐시의 각 라인에는 데이터가 저장된다. 캐시의 용량이 일정할 때 라인의 크기를 키우면 라인의 개수는 감소하기 때문에 각 라인을 식별하기 위한 태그의 비중이 감소한다. 라인의 크기가 커지기 때문에 사용하는 데이터와 가까운 데이터를 한번에 많이 가질 수 있어 spatial locality 도 증가한다. 라인 크기를 키울 때 발생하는 장단점을 정리하면 다음과 같다.

  • 장점
    • 라인의 크기가 커져 주변 데이터를 좀 더 많이 가져오면서 spatial locality가 증가한다.
    • 캐시 내 라인의 개수가 감소하므로 태그로 인한 오버헤드가 감소한다.
  • 단점
    • Cache Pollution : 한번에 많은 데이터를 가져오다 보니 거의 사용되지 않는 데이터를 가져올 수도 있다. 
    • 라인의 개수가 적어저셔 새로운 데이터가 필요할 때 캐시를 더 자주 바꾸게 되므로 temporal locality가 감소한다.
    • Miss Panalty: 라인의 크기가 크므로 miss로 인해 한 블럭을 읽어올 때 걸리는 시간이 길어진다.
    • False Sharing Problem in SMP : 서로 다른 프로그램의 여러 변수가 하나의 라인에 공유되고 있는 경우 각 프로세서는 다른 프로그램의 변수를 사용하더라도 둘 중 하나가 변경되면 전체 캐시의 내용을 바꿔야한다. 즉 프로그램 실행 과정에서 변수가 공유되지는 않으나 동일 라인에서 관리됨으로써 내용 변동에 영향을 받는 현상이다.

 라인의 크기를 무작정 크게 키우는 것은 장점이 되지 않을 수 있다. 시스템에 맞게 조율하는 것이 좋다.


Multilevel Caches

 캐시가 프로세서 내부에 존재하는 경우 외부 버스 통신이 필요하지 않으므로 시스템의 성능 향상에 큰 도움이 된다. 이때 캐시는 계층 형태로 사용되며, CPU에 가까워질수록 속도가 빠른 대신 용량이 작다. 

 캐시를 계층 형태로 사용하는 이유는 캐시 메모리의 빠른 접근 시간과 메인 메모리의 넓은 저장 용량의 장점을 섞어 CPU가 넓은 범위의 데이터에 보다 빠르게 접근할 수 있도록 돕는데 있다. 컴퓨터 프로그램의 locality에 의해 대부분의 데이터는 하위 계층 수준에서 처리될 수 있으며, 현재 계층에서 찾을 수 없는 데이터는 보다 상위 계층에서 찾는다.

 하위 계층의 캐시 수준에서 locality에 의해 많은 데이터를 커버하기 때문에 상위 계층의 용량이 더 크더라도 hit ratio도 크기에 맞게 커지지는 않는다. 예를 들어 2 level cache을 이용하는 프로세서가 0.95의 hit ratio을 가지는 경우 상위 레벨에서 0.8의 hit ratio을 가지고, 하위 레벨에서 0.75의  hit ratio을 가져서 0.8  + 0.2 * 0.75 = 0.95가 된다.

L2 캐시 크기에 따른 Hit ratio 크기 증가 비율

 위 그래프에서는 L1 캐시가 각각 8k, 16k의 크기를 가질때 L2 캐시의 크기 증가에 따른 hit ratio 증가율을 보여주고 있다. 두 그래프 모두 캐시의 크기가 L1 < L2 인 시점부터 의미 있는 hit ratio 증가율을 보이며, 해당 값은 0.96 수준으로 수렴하는 모습을 볼 수 있다. 캐시의 크기를 일정 이상 증가시키는 것은 컴퓨터 성능 향상에 도움되지 않는다는 의미다. 


Unified vs Split

 캐시는 데이터와 명령을 분리하여 가질 수도 있고, 이 둘을 구분해서 관리하는 경우도 있다. 일반적으로 한쪽의 장점은 반대쪽의 단점으로 작용한다. 이러한 기법은 L1, L2 레벨 수준에서 구현된다.

Unified cache은 캐시가 다루는 내용의 종류와 관계 없이 하나의 캐시를 통해 관리하는 방식을 뜻한다. 

  • 데이터와 명령의 구분이 없으므로 캐시 공간을 활용할 수 있으며, 덕분에 hit rate가 높다.
  • 하나의 캐시만 있기 때문에 디자인과 구현이 쉽다.

 Split cache는 캐시를 데이터, 명령 영역으로 나누어 자신이 맡은 영역만을 관리하도록 한다. 

  • 각 캐시를 동시에 접근할 수 있어 파이프라이닝(병렬 처리)에 좋다.
  • 명령과 데이터 관련 동작을 동시에 수행할 수 있어 전반적인 실행 시간이 줄어든다.

Sectored Cache

 캐시의 각 라인 자체를 섹터별로 쪼개서 관리하는 방식. 라인의 각 섹터에 대한 유효성을 1비트의 valid/invalid bit로 관리함으로써 각 섹터 단위로 데이터를 쓰거나 읽을 수 있게 한다. 최근 캐시 용량이 커짐에 따라 라인의 개수를 늘려 태그의 오버헤드를 키우는 대신  라인의 크기를 키우는 방법을 선택했는데, 한 라인도 다수의 섹터 단위로 다루면서 한번에 처리하는 데이터 블럭의 크기를 줄여 miss penalty을 감소시키는데 큰 도움이 된다.


Virtual Address Cache(Virtually Indexed Virtually Tagged)

 캐시를 virtual address 영역에 둬서 MMU(TLB 포함)을 통해 실제 주소로 매핑할 필요 없이 바로 검색하는 방식. 캐시 검색에 사용되는 인덱스 및 태그 모두 가상 주소에 기반하며, 주소 매핑이 없어 데이터를 빠르게 얻을 수 있다.

  I/O 에 의해 메모리 내용이 바뀌는 경우 메모리는 바뀐 내용에 대응되는 캐시 위치를 변경해야 한다는 신호를 보내야 한다. 이때 VIVT 체계에서는 주소 전체가 가상 메모리에 기반하기 때문에 각 프로세스의 상대적 주소 형태로 나타난다. 따라서 대응되는 캐시 라인을 찾기 위해서는 실제 주소로부터 가상 주소를 역으로 계산하는 ITB(Inverse Translation Table)이 필수적이다. ITB는 최소한 캐시 전체 영역을 커버할 수 있어야 하므로 오버헤드가 존재한다.

  VIVT는 각 프로세스의 상대적 주소 형태로 나타나는 가상 주소에 기반하기 때문에 서로 다른 프로세스에서 동일 가상 주소를 참조하는데 다른 대상이거나, 다른 가상 주소로 참조하는데 같은 실제 주소의 대상을 가리키는 문제로 인해 캐시 및 메모리 일관성에 큰 문제가 발생할 수 있다.

  • Synonyms(aliasing)
    : 서로 다른 프로세스에서 다른 가상 주소로 참조하는 실제 주소가 같은 경우를 의미한다.
    • 해결책: miss가 발생하는 경우 TLB로 실제 주소를 찾아 ITB로 역계산해서 다른 프로세스가 가리키는 해당 값이 있는지 찾아본다(캐시 사이 일관성 유지 목적). 과정이 오래 걸리기 때문에 concurrency가 요구될 수 있다.
  • Homonym
    : 서로 다른 프로세스에서 같은 가상 주소로 참조하는 실제 주소가 다른 경우를 의미한다. 
    • 해결책: context switch가 발생하는 경우 새로 실행될 프로세스가 전혀 다른 캐시 내용을 참조하지 않도록 캐시를 전부 날려 주소 공간이 겹치지 않게 한다. 각 프로세스의 가상 주소에 일종의 태그를 붙여 식별하거나, physical tag을 이용하기도 한다.

VIPT(Virtual Indexed Physical Tagged)

https://www.geeksforgeeks.org/virtually-indexed-physically-tagged-vipt-cache/

 VIVT와 PIPT, 즉 virtual address cache와 physical address cache을 절충하는 방식이다.

(좌) virtual cache 와 (우) physical cache

 VIVT는 MMU(TLB)을 통한 주소 변환 과정을 거치지 않더라도 캐시 메모리에 접근할 수 있다는 장점이 있으나, 프로세스마다 가상 주소를 사용하기 때문에 이를 식별하기 어려운 문제가 있다. PIPT는 실제 메모리 주소를 기반으로 계산하기 때문에 반드시 MMU(TLB) 변환 과정을 거쳐야 캐시에 접근할 수 있어서 속도가 느리지만, 태그가 물리적 주소에 대응되므로 명확하게 식별될 수 있다.

 VIPT는 두 방식을 절충한 것으로 인덱스 영역은 virtual address, 태그 영역은 Physical 영역을 사용한다. 좌측의 그림 상 MMU와 virtual address cache는 병렬적으로 동시에 접근할 수 있으므로 PIPT을 사용할 때 발생하는 지연 시간을 줄일 수 있고, 태그는 항상 실제 주소에 대응되므로 VIVT에서 발생하는 가상 주소의 모호함을 줄일 수 있다. 이 경우 homonym 문제는 발생하지 않는다고 한다.


캐시 성능 최적화를 위한 추가적인 방법들

 캐시는 기본적으로 기기의 설계에 따라 매우 다양하게 사용될 수 있으며, 실제로 캐시 최적화에 대한 수많은 논문들이 우리를 기다리고 있다고 한다. 이중 일부만 소개한다.

Average Memory Access Time = Hit Time + Miss Rate * Miss penalty

캐시 성능 공식을 위와 같이 나타낼 때, 성능 최적화를 위한 방향성은 크게 5가지가 있다고 한다.

  1. Hit Time 줄이기: 캐시를 hit할때까지 걸리는 시간을 줄인다. 파워 소모를 줄일 수 있다고 한다.
    1. first level cache을 작고 간단하게 구성한다.
    2. way-prediction: associativity을 가지는 캐시에서 이전에 사용된 라인 번호를 기억하여 나중에 먼저 사용.
  2. cache bandwidth 증가: pipelined cache, multibanked cache, nonblocking cache ...
  3. miss penalty 감소: L1 캐시에서 miss가 발생했을 때 하위 계층에서의 접근 속도를 높인다.
    1. Critical word first: 필요한 정보 먼저 가져오기
    2. Merging Write Buffer: write through 방식에서 메모리를 바로 업데이트하는 대신 write buffer에 적어두고 버스에 여유가 될 때 write하는 경우가 있는데, 이 버퍼에 쓴 내용 중 합쳐질 수 있는 내용을 합쳐서 처리한다
  4. miss rate 감소: 컴파일러 최적화 등을 통해 hit ratio을 높인다. 
  5. miss panelty 및 miss rate 병렬성을 통해 감소: hardware prefetching, compiler prefetching 방식을 통해 데이터를 예측하여 미리 가져온다.

 

'CS > 컴퓨터구조' 카테고리의 다른 글

[컴퓨터구조] Internal Memory(2)  (1) 2022.10.18
[컴퓨터구조] Internal Memory(1)  (0) 2022.10.12
[컴퓨터구조] 캐시(2)  (1) 2022.10.05
[컴퓨터구조] 캐시(1)  (1) 2022.10.03
[컴퓨터구조] 메모리 계층  (0) 2022.09.28