770 likes | 911 Vues
제 10 장. Cache Memory. 10.0 Cache = Cache Memory Cache 는 Fast Memory 이며 CPU 와 Memory 사이에 위치 Memory 내 일부 정보를 가지고 있다. CPU. CPU. Cache. SRAM. Memory. Memory. DRAM. 왜 , Cache 를 이용하는가 ? 첫 번째 , CPU 의 속도가 Memory 의 속도보다 빠르기 때문에 CPU 가 wait 상태에 있는 비율이 높아지게 되며
E N D
제 10 장 Cache Memory
10.0 Cache = Cache Memory Cache는 Fast Memory이며 CPU와 Memory사이에 위치 Memory내 일부 정보를 가지고 있다 CPU CPU Cache SRAM Memory Memory DRAM
왜, Cache를 이용하는가 ? 첫 번째, CPU의 속도가 Memory의 속도보다 빠르기 때문에 CPU가 wait상태에 있는 비율이 높아지게 되며 따라서 CPU의 사용 효율이 낮아지게 된다. Cache를 두어 CPU의 사용 효율을 높이는 것이 목적 CPU의 사용 효율이 높아지게 되면 프로그램의 수행속도가 빨라진다. CPU CPU Fast Fast Cache Fast Memory Memory Slow Slow
왜, Cache를 이용하는가 ? 두 번째, DMA controller가 Memory를 이용하고 있는 동안에 CPU는 idle상태에 있게 되며 이로 인하여 CPU의 사용 효율이 낮아지게 될 수 있다. 이 경우 Cache를 두면 DMA controller가 Memory를 사용하는 동안 CPU는 Cache를 이용할 수 있기 때문에 CPU의 사용 효율이 높아질 수 있다. CPU Cache bus Memory I/O : DMA
왜, Cache를 이용하는가 ? 세 번째, CPU가 여러 개 있는 병렬처리 컴퓨터에서 하나의 CPU가 Memory를 이용 할 때, 다른 CPU는 idle상태에 있게 되며 이로 인하여 CPU의 사용 효율이 낮아지게 될 수 있다. 이 경우 Cache를 두면 하나의 CPU가 Memory를 사용하는 동안 다른 CPU는 Cache를 이용할 수 있기 때문에 CPU의 사용 효율이 높아질 수 있다. CPU Cache bus Memory Cache CPU
왜, Cache를 사용하면 프로그램의 속도가 빨라 지는가 ? -> 늦어지는 경우도 있다. Memory Access Time = 100 nsec Cache Access Time = 25 nsec라 가정하면, CPU CPU Cache Memory Memory Access Time = 100 nsec Access Time = 100 nsec + 25 nsec = 125 nsec
왜, Cache를 사용하면 프로그램의 속도가 일반적으로 빨라 지는가 ? -> Locality (Temporal Locality, Spatial Locality) -> 대부분의 프로그램은 지역성 (locality)의 특징을 가진다. -> locality의 특징을 가지지 않게 프로그램 하는 것은 비 효율적 일뿐만 아니라, 더 어렵다. -> locality의 특징을 가지는 거의 대부분의 프로그램은 Cache를 이용할 경우, 프로그램의 수행속도가 빨라지게 된다.
10.1 Principle of Locality (1). Temporal Locality (Locality in Time) -> If an item is referenced, it will tend to be referenced again soon -> ex) main(){ int i, sum, mul; sum = 0; mul = 0; for(i=1; i<=10; i++){ sum = sum + i; mul = mul * i; } printf(“sum is %d \n”, sum); printf(“mul is %d \n”, mul); }
Temporal Locality의 경우 average access time이 빨라지는 예 -> 동일한 정보를 10번 읽는 경우 Memory Access Time = 100 nsec Cache Access Time = 25 nsec라 가정하면, CPU CPU Cache Memory Memory Total Access Time = 100 nsec * 10 Average Access Time = 100 nsec Total Access Time = 100 nsec + 25 nsec*10 = 350 nsec Average Access Time = 35 nsec
(2). Spatial Locality (Locality in Space) -> If an item is referenced, nearby items will tend to be referenced soon -> ex) main(){ int i, sum, mul; sum = 0; mul = 0; for(i=1; i<=10; i++){ sum = sum + i; mul = mul * i; } printf(“sum is %d \n”, sum); printf(“mul is %d \n”, mul); }
Spatial Locality의 경우 average access time이 빨라지는 예 -> 이웃 정보를 4개를 읽는 경우 (Memory->Cache: fast page mode) Memory Access Time = 100 nsec Cache Access Time = 25 nsec라 가정하면, CPU CPU Cache Memory Memory Total Access Time = 100 nsec * 4 Average Access Time = 100 nsec Total Access Time = 100 nsec + 50 nsec*3 + 25 nsec*4 = 350 nsec Average Access Time = 87.5 nsec
10.2 Hit Ratio Hit is a memory access in cache, while miss means it is not found in cache. Hit Miss CPU CPU Cache Cache Memory Memory
Hit ratio is the fraction of memory accesses found in the cache. Hit ratio = {(Hit number)/(Try number)}*100 CPU CPU CPU Cache Cache Memory Memory Memory Hit ratio = 0 0 < Hit ratio < 100 Hit ratio = 100
10.3 Block Size in Cache Block : miss가 발생 시 memory에서 cache로 복사하는 정보 단위 Cache Cache Memory Memory Block의 크기가 크면 cache내 block의 개수가 적어지며 block의 크기가 작으면 cache내 block의 개수가 많아진다. ex) cache size = 256byte block size : 16byte -> cache내 block의 수 = 16개 block size : 32byte -> cache내 block의 수 = 8개
Block의 size는 hit ratio를 높이는 방향으로 결정되어야 한다. 매우 어려운 문제 -> block의 size가 작아지면 block의 개수가 많아지게 된다. Temporal Locality : good Spatial Locality : bad -> block의 size가 커지면 block의 개수가 적어지게 된다. Temporal Locality : bad Spatial Locality : good
Cache = Set of Blocks Cache size is 256 byte If block size is 16 byte -> Cache = 16 blocks If block size is 32 byte -> Cache = 8 blocks Block = Set of Entries Block size is 16 byte If 8bit CPU -> Block = 16 entries If 16bit CPU -> Block = 8 entries Entry = Set of Bytes 8bit CPU -> Entry = 1 Byte 16bit CPU -> Entry = 2 Bytes 32bit CPU -> Entry = 4 Bytes
ex) 8 bit CPU, Cache size = 256 bytes, Block size = 16bytes Cache = 16 Blocks, Block = 16 Entries, Entry = 1 Bytes C block F (F0-FF) C block E (E0-EF) C block D (D0-DF) C block C (C0-CF) C block B (B0-BF) C block A (A0-AF) C block 9 (90-9F) C block 8 (80-8F) C block 7 (70-7F) C block 6 (60-6F) C block 5 (50-5F) C block 4 (40-4F) C block 3 (30-3F) C block 2 (20-2F) C block 1 (10-1F) C block 0 (00-0F)
10.4 Block Placement CPU CPU Cache Cache Memory Memory miss가 발생시 memory에서 해당되는 block을 cache로 가지고 와야 하며, 이때, 어디에 둘 것인가 ?
A. Direct Mapped : = One-way set associative Each block has only one place it can appear in the cache Cache Cache Memory Memory
B. Fully Associative : A block can be placed anywhere in the cache Cache Cache Cache Memory Memory Cache Cache Memory Memory Memory
C. Set Associative : A block can be placed in a restricted set of places in the cache Cache Cache Memory Memory Cache Memory
If there are n blocks in a set, the cache placement is called n-way set associative for example) Cache내에 4개의 block가 있는 경우 Cache 2-way set associative Cache 4-way set associative = Fully associative Cache 1-way set associative = Direct mapped
ex) Main Memory => 64 Kbyte (0x0000 - 0xFFFF) M block FFF (FFF0-FFFF) M block FFE (FFE0-FFEF) … … … … … … M block 01F (01F0-01FF) … … … … M block 002 (0020-002F) M block 001 (0010-001F) M block 000 (0000-000F)
Memory Block 01F A. Direct Mapped Method => Cache Block F 만 Placement C block F (F0-FF) M block FFF (FFF0-FFFF) C block E (E0-EF) M block FFE (FFE0-FFEF) C block D (D0-DF) … C block C (C0-CF) … C block B (B0-BF) … C block A (A0-AF) … C block 9 (90-9F) … C block 8 (80-8F) … C block 7 (70-7F) M block 01F (01F0-01FF) C block 6 (60-6F) … C block 5 (50-5F) … C block 4 (40-4F) … C block 3 (30-3F) … C block 2 (20-2F) M block 002 (0020-002F) C block 1 (10-1F) M block 001 (0010-001F) C block 0 (00-0F) M block 000 (0000-000F)
Memory Block 01F 0000 0001 1111 Cache Set의 개수 = Cache Block의 개수 16개 = 4bit로 표현 선택되는 Cache Set = Cache Block -> Memory Block의 하위 4bit에 의하여 선택 0000 0001 1111 -> Memory Block 01F는 Cache Block F로 Placement
CPU가 Memory 01F8번지 정보를 원하는 경우 이 정보가 Cache에 없다면 (Miss) 이 정보가 속해 있는 Memory Block을 해당되는 Cache Block에 복사해야 한다. 01F8번지가 속한 Memory Block 은 01F Direct Mapped Method에 의하여 Cache Block F에 Placement 했다면 -> Memory Block 01F는 Cache Block F에 복사 되었음을 의미
B. Full Associative Method => Cache Block 0 - F 어느 곳이나 Placement C block F (F0-FF) M block FFF (FFF0-FFFF) C block E (E0-EF) M block FFE (FFE0-FFEF) C block D (D0-DF) … C block C (C0-CF) … C block B (B0-BF) … C block A (A0-AF) … C block 9 (90-9F) … C block 8 (80-8F) … C block 7 (70-7F) M block 01F (01F0-01FF) C block 6 (60-6F) … C block 5 (50-5F) … C block 4 (40-4F) … C block 3 (30-3F) … C block 2 (20-2F) M block 002 (0020-002F) C block 1 (10-1F) M block 001 (0010-001F) C block 0 (00-0F) M block 000 (0000-000F)
C. 2-Way Set Associative Method Set 7 C block F (F0-FF) Set 7 C block E (E0-EF) Set 6 C block D (D0-DF) Set 6 C block C (C0-CF) Set 5 C block B (B0-BF) Set 5 C block A (A0-AF) Set 4 C block 9 (90-9F) Set 4 C block 8 (80-8F) Set 3 C block 7 (70-7F) Set 3 C block 6 (60-6F) Set 2 C block 5 (50-5F) Set 2 C block 4 (40-4F) Set 1 C block 3 (30-3F) Set 1 C block 2 (20-2F) Set 0 C block 1 (10-1F) Set 0 C block 0 (00-0F)
2-Way Set Associative Method Set 7 C block F (F0-FF) M block FFF (FFF0-FFFF) Set 7 C block E (E0-EF) M block FFE (FFE0-FFEF) Set 6 C block D (D0-DF) … Set 6 C block C (C0-CF) … Set 5 C block B (B0-BF) … Set 5 C block A (A0-AF) … Set 4 C block 9 (90-9F) … Set 4 C block 8 (80-8F) … Set 3 C block 7 (70-7F) M block 01F (01F0-01FF) Set 3 C block 6 (60-6F) … Set 2 C block 5 (50-5F) … Set 2 C block 4 (40-4F) … Set 1 C block 3 (30-3F) … Set 1 C block 2 (20-2F) M block 002 (0020-002F) Set 0 C block 1 (10-1F) M block 001 (0010-001F) Set 0 C block 0 (00-0F) M block 000 (0000-000F)
Memory Block 01F 0000 0001 1111 Cache Set의 개수 8개 = 3bit로 표현 선택되는 Cache Set -> Memory Block의 하위 3bit에 의하여 선택 0000 0001 1111 -> Memory Block 01F는 Cache Set 7로 Placement
D. 4-Way Set Associative Method Set 3 C block F (F0-FF) Set 3 C block E (E0-EF) Set 3 C block D (D0-DF) Set 3 C block C (C0-CF) Set 2 C block B (B0-BF) Set 2 C block A (A0-AF) Set 2 C block 9 (90-9F) Set 2 C block 8 (80-8F) Set 1 C block 7 (70-7F) Set 1 C block 6 (60-6F) Set 1 C block 5 (50-5F) Set 1 C block 4 (40-4F) Set 0 C block 3 (30-3F) Set 0 C block 2 (20-2F) Set 0 C block 1 (10-1F) Set 0 C block 0 (00-0F)
4-Way Set Associative Method Set 3 C block F (F0-FF) M block FFF (FFF0-FFFF) Set 3 C block E (E0-EF) M block FFE (FFE0-FFEF) Set 3 C block D (D0-DF) … Set 3 C block C (C0-CF) … Set 2 C block B (B0-BF) … Set 2 C block A (A0-AF) … Set 2 C block 9 (90-9F) … Set 2 C block 8 (80-8F) … Set 1 C block 7 (70-7F) M block 01F (01F0-01FF) Set 1 C block 6 (60-6F) … Set 1 C block 5 (50-5F) … Set 1 C block 4 (40-4F) … Set 0 C block 3 (30-3F) … Set 0 C block 2 (20-2F) M block 002 (0020-002F) Set 0 C block 1 (10-1F) M block 001 (0010-001F) Set 0 C block 0 (00-0F) M block 000 (0000-000F)
Memory Block 01F 0000 0001 1111 Cache Set의 개수 4개 = 2bit로 표현 선택되는 Cache Set -> Memory Block의 하위 2bit에 의하여 선택 0000 0001 1111 -> Memory Block 01F는 Cache Set 3으로 Placement
10.5 Block Identification CPU가 원하는 정보가 Cache에 있는지를 어떠한 방법으로 확인할 것인가 ? Miss Hit CPU CPU Cache Cache Memory Memory
Full Associative Method => Cache Block 0 - F 어느 곳이나 Placement C block F (F0-FF) M block FFF (FFF0-FFFF) C block E (E0-EF) M block FFE (FFE0-FFEF) C block D (D0-DF) … C block C (C0-CF) … C block B (B0-BF) … C block A (A0-AF) … C block 9 (90-9F) … C block 8 (80-8F) … C block 7 (70-7F) M block 01F (01F0-01FF) C block 6 (60-6F) … C block 5 (50-5F) … C block 4 (40-4F) … C block 3 (30-3F) … C block 2 (20-2F) M block 002 (0020-002F) C block 1 (10-1F) M block 001 (0010-001F) C block 0 (00-0F) M block 000 (0000-000F)
CPU가 원하는 정보가 Cache에 있는지를 어떠한 방법으로 확인할 것인가 ? Cache내 Tag를 이용 Tag … C block F (F0-FF) M block FFF (FFF0-FFFF) … C block E (E0-EF) M block FFE (FFE0-FFEF) … C block D (D0-DF) … … C block C (C0-CF) … 0x 01F C block B (B0-BF) … … C block A (A0-AF) … … C block 9 (90-9F) … … C block 8 (80-8F) … … C block 7 (70-7F) M block 01F (01F0-01FF) … C block 6 (60-6F) … … C block 5 (50-5F) … … C block 4 (40-4F) … … C block 3 (30-3F) … … C block 2 (20-2F) M block 002 (0020-002F) … C block 1 (10-1F) M block 001 (0010-001F) … C block 0 (00-0F) M block 000 (0000-000F) Cache Tag를 통하여 Cache Block B에 Memory Block 01F가 있음을 알 수 있다.
Full Associative Method => Cache Block 0 - F 어느 곳이나 Placement CPU는 원하는 정보가 Cache에 있는지 확인하기 위하여 최악의 경우 모든 Tag를 확인해야 한다.
Direct Mapped Method => Cache Block F 만 Placement Tag 0x 01F C block F (F0-FF) M block FFF (FFF0-FFFF) … C block E (E0-EF) M block FFE (FFE0-FFEF) … C block D (D0-DF) … … C block C (C0-CF) … … C block B (B0-BF) … … C block A (A0-AF) … … C block 9 (90-9F) … … C block 8 (80-8F) … … C block 7 (70-7F) M block 01F (01F0-01FF) … C block 6 (60-6F) … … C block 5 (50-5F) … … C block 4 (40-4F) … … C block 3 (30-3F) … … C block 2 (20-2F) M block 002 (0020-002F) … C block 1 (10-1F) M block 001 (0010-001F) … C block 0 (00-0F) M block 000 (0000-000F) Cache Tag를 통하여 Cache Block F에 Memory Block 01F가 있음을 알 수 있다.
Direct Mapped Method => Cache Block F 만 Placement CPU는 원하는 정보가 Cache에 있는지 확인하기 위하여 특정 Cache Block의 Tag만 검사하면 된다. ex) CPU가 원하는 정보 0x01F8번지의 정보 -> Memory Block 0x01F이며 Cache Block F에 만 placement가능 따라서 Cache Block F의 Tag만 검사하면 된다. 이 방법의 경우, Tag의 길이는 다음과 같이 줄어 들 수 있다.
0x01 C block F (F0-FF) M block FFF (FFF0-FFFF) … C block E (E0-EF) M block FFE (FFE0-FFEF) … C block D (D0-DF) … … C block C (C0-CF) … … C block B (B0-BF) … … C block A (A0-AF) … … C block 9 (90-9F) … … C block 8 (80-8F) … … C block 7 (70-7F) M block 01F (01F0-01FF) … C block 6 (60-6F) … … C block 5 (50-5F) … … C block 4 (40-4F) … … C block 3 (30-3F) … … C block 2 (20-2F) M block 002 (0020-002F) … C block 1 (10-1F) M block 001 (0010-001F) … C block 0 (00-0F) M block 000 (0000-000F)
Memory Block 0x01F 0000 0001 1111 Cache Set의 개수 = Cache Block의 개수 16개 = 4bit로 표현 선택되는 Cache Set = Cache Block -> Memory Block의 하위 4bit에 의하여 선택 0000 0001 1111 (index field) -> Memory Block 0x01F는 Cache Block F로 Placement 이 경우, 하위 4bit를 제외한 나머지 부분만 Tag로 하면 된다. -> 0000 0001 1111(Tag field)
CPU Address => [ Tag field ][ Index field ][ Block offset field ] = [ Memory block number ][ Block offset field ] ex) CPU Address = 0x01F8 Direct Mapped Method에서 Memory block number = 0x01F 0x01F8 Block offset field = 0x8 0x01F8 Tag field = 0x01 0x01F8 Index field = 0xF 0x01F8 Block offset field = 0x8 0x01F8
[Tag field] => Comparison with the tag in the cache [Index field] => Select the set [Block offset field] => Select the desired data
A. Full Associative Method (m-way set associative) ex) CPU Address = 0x01F8 Tag field = 0x01F 0x01F8 Index field = Block offset field = 0x8 0x01F8 Memory Block Number = 0x01F 0000 0001 1111 Cache Set의 개수 = 1개 = 0bit로 표현 => index field is null 따라서 Tag field = 0000 0001 1111 = 0x01F
B. Direct Mapped Method (1-way set associative) ex) CPU Address = 0x01F8 Tag field = 0x01 0x01F8 Index field = 0xF 0x01F8 Block offset field = 0x8 0x01F8 Memory Block Number = 0x01F 0000 00011111 Cache Set의 개수 = 16개 = 4bit로 표현 => index field is 4 bit => 1111 = 0xF 따라서 Tag field = 0000 0001 = 0x01
C. 2-way set Associative Method ex) CPU Address = 0x01F8 = 0000 0001 1111 1000 Tag field = 0000 0001 1 0000 0001 1111 1000 Index field = 111 0000 0001 1111 1000 Block offset field = 1000 0000 0001 1111 1000 Memory Block Number = 0x01F 0000 0001 1111 Cache Set의 개수 = 8개 = 3bit로 표현 => index field is 3 bit => 111 따라서 Tag field = 0000 0001 1
D. 4-way set Associative Method ex) CPU Address = 0x01F8 = 0000 0001 1111 1000 Tag field = 0000 0001 11 0000 0001 1111 1000 Index field = 11 0000 0001 1111 1000 Block offset field = 1000 0000 0001 1111 1000 Memory Block Number = 0x01F 0000 0001 1111 Cache Set의 개수 = 4개 = 2bit로 표현 => index field is 2 bit => 11 따라서 Tag field = 0000 0001 11
E. 8-way set Associative Method ex) CPU Address = 0x01F8 = 0000 0001 1111 1000 Tag field = 0000 0001 111 0000 0001 1111 1000 Index field = 1 0000 0001 1111 1000 Block offset field = 1000 0000 0001 1111 1000 Memory Block Number = 0x01F 0000 0001 1111 Cache Set의 개수 = 2개 = 1bit로 표현 => index field is 1 bit => 1 따라서 Tag field = 0000 0001 111
- The tag/index boundary moves to the right with increasing associativity. Direct Mapped Method (1-way set associative) 0000 00011111 2-way set Associative Method 0000 0001 1111 4-way set Associative Method 0000 0001 1111 8-way set Associative Method 0000 0001 1111 Full Associative Method (m-way set associative) 0000 0001 1111
- Caches include an address tag on each block - Cache tag address is checked to see if it matches the tag field of CPU address - Because speed is of the essence, all possible tags are searched in parallel - Valid bit in the tag : Notify whether or not this entry contains a valid address