ARM System Developer's Guide  

- Designing and Optimizaing System Software




#####

The Memory Hierarchy and Cache Memory

Cache Architeture

Cache Policy

Coprocessor 15 and Caches

Flushing and Cleaning Cache Memory

Cache LockDown

Caches and Software Performance




#### 12. Cache


- 프로세서 코어와 주메모리 사이의 작고 빠른 메모리
- 가장 최근에 참조한 주메모리의 일부분을 저장

> write buffer : 프로세서 코어와 주메모리 사이의 매우 작은 FIFO 메모리
 main memory에 쓰는 것과 관련된 느린 쓰기 시간으로부터 플세서 코어와 캐시 메모리를 자유롭게 해줌

> 캐시의 주요 단점 : 프로그램의 실행 시간을 결정하기가 어려워 짐


## 12.1. The Memory Hierarchy and Cache Memory


- 레지스터 파일 : 코어에 위치하여 시스템에서 가장 빠른 메모리 액세스를 제공

- TCM / level-1 캐시 : 기본 레벨에 위차하는 메모리 컴포넌트로 on-chip 인터페이스를 통해 프로세서 코어에 연결

- main memory : SRAM/DRAM같은 휘발성 컴포넌트와 플래시 메모리 같은 비휘발성 컴포넌트가 있음


- 보조기억장치 : 디스크 드라이브나 이동 메모리 장치와 같은 크고 느린, 상대적으로 가격이 저럼한 대량 저장 장치

- 데이터 액세스 시간이 김

- 메인메모리에서 저장할 수 없는 매우 큰 프로그램에서 사용되지 않는 부분과 현재 실행되지 않는 프로그램을 저장

프로세서 코어에 읳 지원되는 데이터 형을 사용하여 프로세서 코어에 의해 직접 액세스 됨


* TCM와 SRAM은 동일한 기술이지만 아키텍처로서는 다른 레벨에 위치

(TCM은 CPU가까이에 위치한 SRAM)


- L1 캐시 : 가장 낮은 레벨에서부터 코드와 데이터를 임시로 저장하는 고속의 on-chip 메모리

- write buffer : 캐시로부터 메인메모리에 쓰기를 지원하는 매우 작은 FIFO 버퍼

- L2 캐시 : L1캐시와 더 느린 메모리 사이에 위치하며 보조캐시라고 함

- cache line : 캐시와 더 느린 메인메모리 사이에 전송하는 데이터의 작은 블럭




## 12.1.1. 캐시와 메모리 관리 장치
- 캐시코어는 코어와 MMU 사이에 위치하거나 MMI와 물리 메모리 사이에 위치하여 가상메모리를 지원 함

- 논리캐시 : logical cache, 프로세서와 MMU 사이에 위차하여 가상 주소 공간에 데이터를 저장하는 것
MMU를 거치지 않고서도 논리캐시에서 직접 데이터를 가져올 수 있음. 가상캐시.
- 물리캐시 : physical cache, MMU와 메인메모리 사이에 위치하여 물리주소를 사용해 메모리에 저장하는 것
MMU는 먼저 가상 주소를 물리 주소로 변경해야 함. 

* ARM7 ~ ARM9, StrongARM, XScale : 논리캐시 
ARM11 : 물리캐시


> 캐시에 의한 성능향상이 가능한 이유 <

: 예측 가능한 프로그램의 실행


"locality" (반복문 등에서)


- temporal locality : 시간적 지역성. 시간과 공간에서의 반복적인 국부적 참조성을 사용

- spatial locality : 공간적 지역성. 주소의 근접성에 의해 참조




### 12.2. Cache Arcitecture


# ARM은 캐시를 가진 코어에서 2가지의 버스 아키텍처를 지원

- 폰노이만 아키텍처 : 명령어와 데이터를 위해 사용하는 하나의 캐시를 통합캐시라고 하며, 통합 캐시는 명령어와 데이터값을 둘 다 포함하고 있음

- 하버드 아키턱처 : 전번적인 시스템 성능의 향상을 위해 분리된 명령어와 데이터 버스를 가짐.

=> 2개의 캐시를 필요로 함. 분할캐시 (명령어 캐시 I, 데이터 캐시 D)


# 캐시의 2가지 주요 요소

- cache memory : "cache line"이라는 장치 안에서 액세스되는 전용 메모리 열

- cache controller : 캐시 메모리의 일부분을 선택하기위해 메모리를 요청하는 동안 프로세서에 의해 이슈되는 주소의 다른 부분을 사용



## 12.2.1. Basic Architecture of a Cache Memory



# 3가지 구성요소

- Directory store : 메인메모리에서 캐시라인으로 복사된 주소를 구분하기 위해 사용. Directory Entry의 "cache-tag"

* cache-tag : 캐시라인이 메인메모리로부터 어디로 로드되는지 가리킼는 디렉토리 엔트리

- Data section : 메인메모리에서 읽어온 데이터를 저장하는 영역

캐시의 크기는 캐시가 메인메모리에서 저장할 수 있는 실제코드나 데이터로 정의되며,

캐시태그나 상태 비트들을 지원하는 데 필요한 캐시 메모리는 캐시 크기 안에 포함

- Status information : 상태 정보를 유지하기위한 상태비트

valid bit : 유효비트. 캐시 라인이 활성화되어 있음. 주 메모리에서 처음 읽어온 데이터를 포함하며 현재 프로세서 코어가 사용 가능하단 것을 의미

dirty bit : 더티비트. 캐시라인이 메인메모리 안에 저장되어 있는 값과 다른 데이터를 포함하고 있는지 아닌지를 결정



## 12.2.2. Basic Operation of a cache Controller


- 메인메모리에서 캐시메모리로 코드나 데이터를 자동으로 복사해주는 하드웨어

- read/write 동작을 위한 메모리 요청을 메모리 컨트롤러로 보내기 전에 가로챔

요청 주소이 구성 : tag + set index + data index


# 기본동작

1. 컨트롤러는 "set index"를 사용하여 요청된 코드나 데이터를 포함하고 있는 캐시 메모리의 캐시라인을 찾음

캐시라인은 캐시태그, 상태비트들을 포함하며, 캐시태그와 상태비트들은 실제 데이터를 평가하기위해 사용됨

2. 컨트롤러가 캐시라인의 활성화를 검사하기위해 유효비트를 확인하고 요청된 주소의 태그영역과 캐시 태그를 비교

성공 : hit, 실패 : miss

3-1. 캐시미스 : 메인메모리에서 모든 캐시 라인을 캐시메모리로 복사. "cache line fill" 캐시라인 채우기

요청된 코드나 데이터를 프로세서에게 전송

3-2. 캐시적중 : 캐시메모리에서 프로세서로 직접코드나 데이터를 공급하기위해 4단계로 이동

4.   캐시라인 안에 있는 실제 코드나 데이터를 선택하기 위해 주소요청의 데이터 인덱스 필드를 사용하여 프로세서에게 공급



## 12.2.3. The Relationship between Cache and Main Memory


# Direct mapped cache

- 가장 간단한 캐시 형태로 주어진 메인메모리 공간에 대해 캐시안에 하나의 공간만 할당

- 메인메모리 안에 각각 상주한 위치가 캐시 메모리 안에 하나의 위치로 바로 매핑

메인메모리의 크기가 훨씬 더 크기때문에 메인메모리에는 캐시메모리의 동일한 위치에 매핑되는 곳이 많음


*0x824로 끝나는 주소체계에 대한 관계


- set index : 0x824로 끝나는 주소를 가진 메모리 안에 모든 값들이 저장되어있는 캐시의 한 위치를 선택

- data index : 캐시라인에서 word, half-word, bytes를 선택

- tag : directory store에서 발견된 캐시 태그값과 비교한주소의 일부분을 저장


# Data Stream : 캐시라인을 채우는 동안 캐시 컨트롤러는 캐시에 복사하며 코어에 데이터를 로딩할 수 있음

캐시 컨트롤러가 캐시 라인 안에 남아있는 워드를 채우는 동안 프로세서가 계속 동작 할 수 있도록 함


# eviction : 캐시 미스가 발행하여 기존의 캐시 라인을 제거하는 과정

캐시 안에 로드외어야 하는 새로운 데이터를 위한 공간을 만들기 위해 캐시에서 메인메모리로 캐시 라인의 내용을 저장


Thrashing : 캐시 메모리 안에 동일한 위치에 대해 소프트웨어 병목 현상이 발생하는 것

Direct mapped cache에서는 메인 메모리로부터 값을 저장하기 위해 사용할 수 있는 공간이 하나이므로 가장 높은 thrashing을 야기할 수 있음

=> thrashing 때문에 캐시 라인을 반복해서 제거하고 로딩하는 작업이 일어남


* loading, eviction : 

프로그램의 일부를 캐시 라인안에 있는 동일한 캐시라인에 매핑되어있는 주소에서 메인메모리로 이동하는 결과를 야기


* cache thrashing : 실행하지 않는 루틴을 연속적으로 제거할 때 캐시미스가 반복되는 현상


=> trashing(스레싱)을 줄이기위해서 캐시는 way라는 더 작은 단위로 쪼개짐   .

하나의 메인메모리 주소에 대해 캐시 안에 여러개의 저장 위치를 제공할 수 있음(세트 연상 캐시, set associativity)



## 12.2.4. Set Associativity

- 목표 : 스레싱의 주기를 줄이기 위함

- way : 캐시메모리를 동일한 크기로 나눠놓은 단위

기존 256라인의 하나의 way  ->  64라인의 4개의 way로 사용

- Set index : 동인한 세트 인덱스를 가지는 4개의 캐시라인을 동일한 세트안에 있다고 말함

- Set Associativity : 세트 인덱스가 가리키는 캐시라인의 세트


- 메인메모리의 특정 위치로부터의 데이터나 코드 블록은 한 세트의 메모리인 어떤 캐시라인 안에 저장됨

- 세트안에 값을 저장하는 것은 동일한 코드나 데이터 블록을 한 세트안에 2개의 캐시 라인을 동시에 위치시키지 못하게 하기 위해 배타적으로 동작


# 4-way 세트연상


* 메인 메모리의 어떤 하나의 위치는 캐시안에 4개의 다른 위치에 매핑


- 태그에 대한 필드가 2비트 더 큼

- 세트 인덱스 비트 필드는 2비트 더 작음

=> 4배의 메인메모리 주소가 한세트의 4개의 캐시라인에 매핑됨을 의미


- 캐시에 매핑되는 메인메모리 영역의 크기는 4KB ->1KB  

- 캐시라인 데이터 블록을 동일한 세트에 네 번 더 매핑해야 함

=> 캐시라인이 1.4배 덜 제거될수 있음  ? ? ? ? ? ? ? ?




## 12.2.4.1. Increasing Set Associativity

- 캐시 컨트롤러의 Associativity가 증가할 때마다 thrashing의 발생은 줄어듬

- 메인메모리 위치가 어떤 캐시 라인에 매핑되도록 캐시의 set associativity를 최대화하여 설계하는 것이 좋을 수 있음

=> "Fully Associative Cache"

- set associativity를 증가하기 위해 하드웨어 설계자는 CAM을 포함할 수 있음


# CAM

- Content Addressable Memory

-  각각의 유효한 캐시 라인 안에 저장되어 있는 캐시태그와 입력 태그 주소를 비교하는 비교기세트를 사용

- RAM이 동작하는 반대 방법으로 동작(RAM은 주소값이 주어지면 데이터를 생성. CAM은 데이터값이 메모리 안에 존재할 때 주소를 생성)

=> CAM을 사용하면 더 많은 캐시태그를 동시에 비교할 수 있으므로 한 세트 안에 포함될 캐시라인의 수를 늘릴 수 있음

- ARM920T, ARM940T : 64-way


- 요청된 주소의 태그부분은 4개의 CAM입력으로 사용되어 64-way 안에 저장되어 있는 모든 캐시 태그와 입력 태그를 동시에 비교

- 일치하는 것이 있으면 메모리로부터 캐시데이터를 받고, 일치하는 것이 없다면 캐시 컨트롤러는 미스 신호를 전송


* 컨트롤러에서 set index bit을 사용해 4개의 CAM을 활성화,

index된 CAM은 캐시메모리안에 있는 캐시라인을 선택,

코어 주소의 데이터 인덱스부분으로 캐시라인안에서 요청된 워드 or 하프워드 or 바이트를 선택



## 12.2.5. Write Buffers

- 프로세서가 메인메모리에 쓸 데이터를 임시로 저장하고있는 작고 빠른 FIFO 메모리

- 작은 블록의 순차적인 데이터를 메인메모리에 write하는 시간을 줄임


eviction 동안에는 캐시의 성능 향상에도 도움을 줌

: 캐시 컨트롤러가 dirty cache line을 제거하면 메인메모리 대신 write buffer에 캐시라인이 쓰여짐

=> 즉, 새로운 캐시라인 데이터는 바로 사용이 가능하며 프로세서는 캐시메모리로 부터 계속해 동작이 가능 함


- write buffer에 쓰여진 데이터는 write buffer의 내용을 메인메모리로 저장 하기전에는 read가 불가능하며 cache line의 제거도 불가능

=> write buffer에 있는 동안은 읽기가 불가능 함

=> write buffer의 FIFO 깊이를 몇 개의 캐시라인정도의 매우 작은 크기로 줄여야 함


> 제한적인 FIFO 구조를 갖는 write buffer의 예외.

- ARM10 제품군은 "Coalescing(합성)" 방식을 지원

- write 연산을 하나의 캐시라인에 통합시킴.

- write buffer는 메인메모리 안의 동일한 데이터블록을 나타내는 경우 새로운 데이터를 기존의 캐시라인에 합성

- 합성방식 : write merging, write collapsing, write combining



## 12.2.6. Measuring Cache Efficiency

- 캐시의 효율성 측정


 hit rate : 주어진 시간 간격 동안 캐시 적중 수를 전체 메모리 요청 수로 나는 것


적중률 = (캐시 적중 수 / 메모리 요청 수) * 100


miss rate : 주어진 시간 간격 동안 전체 캐시 미스를 전체 메모리 요청수로 나눈 값의 백분률


미스률 = (캐시 미스 수 / 메모리 요청수) * 100


- hit time : 캐시에서 어떤 메모리 위치를 액세스 하는데 걸리는 시간

- miss penalty : 메인메모리에서 캐시로 캐시라인을 로드하는데 걸리는 시간




# 12.3. Cache Policy

: 캐시 동작을 결정하는데 사용되는 정책


- write policy : 프로세서가 쓰기 동작을 할 때 데이터를 어디에 저장할지를 결정

- replcement policy : 캐시 미스가 발생하였을 때 다음 라인을 채우는데 사용될 세트 안에 있는 캐시라인을 선택

- allocation policy : 캐시 컨트롤러가 캐시 라인을 언제 할당할 지 결정



## 12.3.1. Write Policy - Writeback or Writethrough

: 프로세서 코어가 메모리에 저장을 할 때, 캐시 컨트롤러가 사용하는 정책


# 12.3.1.1. 연속기입방식(writethrough)

- 저장을 할 때 캐시가 hit이라면 캐시와 메인메모리에 모두 값을 저장

- 캐시와 메인메모리가 항상 일관성을 유지

- 캐시컨트롤러는 캐시메모리에 값을 쓰기 위해 메인메모리에 쓰는 작업을 수행

=> 후기입방식보다 느림


# 12.3.1.2. 후기입방식(writeback)

- 유효한 캐시 데이터 메모리에만 저장하고 메인메모리에는 저장하지 않음

- 유효 캐시 라인과 메인메모리는 다른 데이터를 포함

=> 캐시라인은 가장 최근 데이터를 저장, 메인메모리에는 업데이트가 되지 않아 오래된 데이터를 포함


- 캐시 상태정보 블럭 안에 있는 하나 이상의 dirty bit을 사용

캐시 컨트롤러가 캐시 라인 안에 값을 저장하면 dirty bit을 1로 설정 한 후

코어가 캐시 라인을 액세스하려하면, dirty bit을 통해 캐시라인의 데이터와 메인메모리의 데이터가 다름을 알림

캐시 컨트롤러가 dirty한 캐시라인을 지우면, 내용이 자동으로 메인메모리에 저장 됨

=> 컨트롤러가 캐시라인에만 있는 최신 데이터를 메인메모리에 저장


* 서브루틴에 의해 임시지역변수를 반복적으로 사용할 때 우수한 성능을 보임

=> 임시지역변수는 주 메모리에 저장될 필요가 없기 때문

    (ex. 캐시된 스택이 오버플로우가 발생하는 지역 변수)



## 12.3.2. Cache Line Replacement Policy


- Cache Line : 캐시의 기본 컴포턴트로 Directory Store, Data Section, Status 로 구성


- 캐시미스가 발생하면 컨트롤러는 메인메모리로부터 새로운 정보를 저장하기 위해 캐시 메모리안에서 적절한 캐시라인을 찾아야 함

- victim : 교체를 위해 선택된 캐시라인. 

victim이 유효한 더티데이터를 포함한다면 컨트롤러는 새로운 데이터를 victim 캐시라인에 복사하기 전,

 캐시메모리로부터 메인메모리로 더티데이터를 씀

- eviction : victim 캐시라인을 선택하고 교체하는 과정

- replacement policy : victim을 선택하기 위해 캐시컨트롤러에 구현되어 있는 방법

설정된 정책은 캐시 컨트롤러가 캐시 메모리 안에 가능한 설정으로 부터 캐시라인을 선택하기 위해 사용하는 알고리즘을 정의함


=> set index는 가능한 캐시라인세트를 선택하고, replacement policy는 세트에서 교체할 특정 캐시라인을 선택


> replacement policy

 pseudorandom(의사랜덤방식)

 교체될 세트안에 있는 다음 캐시라인을 랜덤하게 선택

 - 선택 알고리즘을 무조건 증가하는 victim counter를 사용

 - 컨트롤러는 무작위로 증가값을 선택하고 이를 victime counter에 더하여 증가시킴

 - victim counter가 최대값이 되면 정이된 베이스 값으로 reset

 roud-robin(주기적교체)

 단순히 교체될 세트안에 있는 다음 캐시라인을 선택하는 것

 - 캐시 컨트롤러가 캐시라인을 할당 할 때마다 증가하는 victime counter를 사용

 - victime counter가 최대값이 되면 정의된 베이스 값으로 reset


 - 보다 광범위한 예측성을 가지며 이상적이나, 메모리 액세스 측면에서 작은 변경에도 성능면에 큰 변화를 가져옴

 LRU(Leat Reccently Used)

 - 캐시라인의 사용에 대해 조사하여 가장 오랜 시간 동안 사용되지 않은 캐시라인을 victime으로 선택

 (ARM 캐시코어는 LRU 방식은 지원하지 않지만 ARM반도체 파트너들으 캐시가 없는 ARM을 구매하여 그들이 만든 칩에 자신의 캐시를 추가하고 있어 LRU방식을 사용하는 ARM 기반의 제품도 나옴)  




## 12.3.3. Allocation Policy on a Cache Miss

- 캐시미스가 발생했을 때 ARM 캐시가 캐시라인을 할당하기 위한 정책

- 2가지 할당 방법 : read-allocated, read-write-allocate


# read-allocate 

: 메인 메모리에서 읽는 동안 캐시 라인을 할당 (데이터를 읽었을 때 메인메모리에서 캐시라인을 할당)

- victim 캐시 라인이 유효 데이터를 포함하고 있다면 캐시 라인이 새로운 데이터로 채워지기 전에 메인메모리로 쓰여짐

- 캐시라인이 유효데이터를 포함하고 있다면 메인메모리에 쓴 값은 캐시에 없데이트 되고, 

write policy로 write-through을 사용중이면 메인메모리에도 업데이트

- 만약 캐시라인이 이전에 메인메모리에서 읽은 것으로 할당되지 않으면, 메모리에 새로 쓴 데이터는 캐시메모리의 내용에 업데이트 되지 않음

- 데이터가 캐시안에 없다면 컨트롤러는 메인메모리에만 저장


# read-write-allocate

: 메모리를 읽고 쓰기 위해 캐시라인을 할당(데이터를 메인메모리로 슬 때 캐시라인을 할당)

- 캐시안에 없고 메인메모리에서 구현된 load-store 연산은 캐시라인을 할당

- 메모리를 읽을 때 컨트롤러는 read-allocate 정책을 사용


- write 할 때 컨트롤러도 캐시라인을 할당

- victim 캐시라인이 유효 데이터를 포함하면 

캐시 컨트롤러는 메인메모리로부터 새로운 데이터를 가지고 victim 캐시라인을 채우기 전 메인메모리에 먼저 저장

- 캐시라인이 유효하지 않다면 단순히 캐시라인만 채움

- 캐시라인이 메인메모리로부터 채워진 다음, 컨트롤러는 캐시라인 안의 데이터의 위치에 데이터를 저장

- write-through 방식을 사용한다면 캐시된 코어는 메인메모리에도 업데이트


> 각 코어에 의해 지원되는 policies



### 참고. ARM 커뮤니티에서 사용되는 많은 용어들 (요약정리)




'System > Embedded' 카테고리의 다른 글

[ARM] MPU  (0) 2015.11.17
[ARM] 캐시 2  (0) 2015.11.12
[ARM] 펌웨어  (0) 2015.11.12
[ARM] 익셉션과 인터럽트 처리 2  (0) 2015.11.10
[ARM] 익셉션과 인터럽트 처리  (0) 2015.11.10

+ Recent posts