study

The Basics of Caches

Liam Lim 2023. 3. 12. 18:46
728x90

 


1. Definition


 

 

Cache Block

 The basic unit for cache storage. May contain multiple bytes/words of data.

 

Cache Line

 Same as cache block. Note that this is not the same thing as a "row" of cache

 

Cache Set

 A "row" in the cache. The number of blocks per set is determined by the layout of the cache (e.g.,  direct mapped, set-associative, or fully associative)

 

Tag

 A unique identifier for a group of data. Because different regions of memory amy be mapped into a block, the tag is used to differentiate between them.

 

Valid Bit

 A bit of information that indicates whether the data in a block is valid (1) of not (0).

 

 

 


2. Locating data in the cache


 

 특정 주소가 주어졌을 때, 해당 메모리 위치에 저장된 데이터가 cache에 있는지 여부를 확인할 수 있다. 이를 위해, 다음과 같은 절차를 사용한다.

  1. address가 어떤 cache set에 있어야 하는지를 결정하기 위해 set index를 사용한다.
  2. 해당 cache set 내의 각 cache block에 대해, 해당 block에 연관된 tag와 memory address에서 가져온 tag를 비교한다. 일치하는 경우, 다음 단계로 진행한다. 일치하지 않으면, data는 cache에 없는 것이다.
  3. data를 찾은 block에서 valid bit를 확인한다. valid bit이 1이면 data가 cache 안에 있고, 아니면 없다.

  만약, 그 주소에 있는 data가 cache에 있다면, 해당 cache block에서 data를 찾기 위해, 그 주소의 block offset을 사용한다.

 

 

Figure 1: Divisions of the address for cache use.

 

 

  cache에서 data를 찾는 데 필요한 모든 정보는 주소에 포함되어 있다. Fig. 1은 cache에서 data를 찾는데 사용되는 주소의 일부를 보여준다. 가장 끝 bits는 block offset을 결정하는 데 사용된다. block size가 B 이면 b = log2 B  bit가 주소에서 필요하다. 다음으로 높은 bit group은 set index이며, 어느 cache set을 찾아볼지 결정하는 데 사용된다. cache 내 set 수가 S이면 set index에는 s = log2 S   bit가 필요하다. fully-associative cache의 경우, set가 하나뿐이므로 set index가 없다. 나머지 bit는 tag로 사용된다. ℓ 이 주소의 길이 (in bits)이면, tag bit는 t = ℓ - b - s 이다.


Loading data into the cache

 

  Cache에서 요청한 주소를 찾을 수 없으면, memory에서 가져와 cache에 넣는다. 요청된 주소와 함께, 공간적 지역성을 활용하기 위해 그 주변에 있는 다른 주소들도 함께 가져온다. 어떤 주소들이 가져와질지 결정하기 위해서는, 가져올 범위의 시작 주소와 끝 주소를 찾아야 한다. (+참고 1) 시작 주소는 주소의 block offset 부분을 0으로 만들면 찾을 수 있다. 끝 주소는 block offset을 모두 1로 바꾸면 된다. 이 범위의 크기는 항상 cache block의 크기와 같다. 그 범위의 데이터는 cache의 하나의 block에 저장된다.

  Cache organization에 따라, data를 저장할 수 있는 위치가 여러 개일 수 있다. Direct mapped cache에서는 data를 넣을 수 있는 cache block이 하나뿐이다. 반면에 set-associative cache와 fully-associative cache에서는 n개의 다른 block 중에서 선택해야 한다. n-way set-associative cache의 경우, 각 set마다 n개의 location이 있으며, fully-associative cache에서는 들어오는 data block을 cache 내의 어떤 위치에나 넣을 수 있다.

 

 

 


+ 참고 설명


 

 

(+참고 1) 시작 주소는 주소의 block offset 부분을 0으로 만들면 찾을 수 있다. 

  예를 들어, block size B = 64 bytes 와 set S = 8 인 cache가 있다고 가정하고 computer system은 32bit architecture로 가정하면 address space는 2^32 byte이다.

  이제 memory address 0x12345678 의 data에 access하려고 한다. (+참고 2) 이 주소의 block offset은 가장 낮은 6bit (64 = 2^6 라서)이고, 0x18의 값을 제공한다.

  요청된 주소와 함께 cache로 가져올 범위의 시작 주소를 찾으려면 block offset bit를 모두 0으로 만들어야 한다. (+참고 3)  따라서, 시작 주소는 0x12345678 & 0xFFFFFFC0 를 하면 찾을 수 있으며, 이는 0x12345640이다. 이것은 요청된 주소가 포함된 cache block의 시작 부분의 memory address이다.

  마찬가지로, 범위의 끝 주소를 찾으려면 block offset bit를 모두 1로 바꿔야 한다. (+참고 4) 따라서 끝 주소는 0x12345678 | 0x3F로 찾을 수 있으며, 이는 0x1234567F이다. 이것은 요청된 주소를 포함하는 cache block의 끝 부분의 memory address이다.

  이 memory address 범위를 cache에 가져올 때, 요청된 주소를 포함한 시작 주소와 끝 주소 사이의 모든 데이터를 가져온다. 이 경우 64 bytes의 cache block과 바로 뒤에 있는 64 cache block이 포함된다.

+

 

(+참고 2) 이 주소의 block offset은 가장 낮은 6bit (64 = 2^6 라서)이고, 0x18의 값을 제공한다.

  0x12345678은 16진수 표기법으로 된 32bit address이다. 이를 2진수로 변환하면 다음과 같다 :

  0001 0010 0011 0100 0101 0110 0111 1000

  가장 낮은 6 bits를 가져오기 위해서는 2진수에서 가장 오른쪽 6 bits를 가져오면 된다. 그러면 

  11 1000

  이 나온다. 이것을 16진수로 변환하면

  0x38

  따라서 0x12345678의 가장 낮은 6 bits는 0x38이다.

+

 

(+참고 3)  따라서, 시작 주소는 0x12345678 & 0xFFFFFFC0 를 하면 찾을 수 있으며, 이는 0x12345640이다.

  block size가 64 bytes인 경우, 가장 낮은 6 bits가 해당 주소의 block offset이다. 따라서, 0x12345678의 가장 낮은 6 bit는 11 1000 또는 0x38이다.

  시작 주소를 찾기 위해서는 해당 block offset bit를 0으로 만들어야 한다. 그러므로 하위 6 bits를 0으로 만들기 위해 0xFFFFFFC0를 비트 AND 연산을 하면, 가장 낮은 bit가 모두 0이 되기에 block offset 부분이 0으로 바뀌게 된다. 따라서 0x12345640이 시작 주소이다.

+

 

(+참고 4) 따라서 끝 주소는 0x12345678 | 0x3F로 찾을 수 있으며, 이는 0x1234567F이다.

  참고 3과 같은 방식이지만 이번에는 범위의 끝 주소를 찾으려면 block offset인 6 bits를 1로 바꿔야한다. 0x3F 를 비트 OR 연산을 하면, 가장 낮은 bit가 모두 1이 된다. 따라서 끝 주소는 0x1234567F가 된다.

+

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90