Cache is a memory which holds the recently utilized data by the processor. A block of memory cannot be placed randomly in the cache and is restricted to a single cache line by the “Placement Policy”. In other words, Placement Policy determines where a particular memory block can be placed when it goes into the cache. There are three different policies available for placement of a memory block in the cache.
In a direct mapped cache structure, the cache is organized into multiple sets[1] with a single cache line per set. Based on the address of the memory block, it can only occupy a single cache line. The cache can be framed as a (n*1) column matrix.[2]
Consider Main memory of 16 Kilobytes, which is organized as 4-byte blocks and Cache of 256 bytes with block size of 4 bytes.
Since each cache block is of size 4 bytes, the total number of sets in the cache is 256/4, which equals 64 sets.
The incoming address to the cache is divided into bits for Offset, Index and Tag.
Offset corresponds to the bits used to determine the byte to be accessed from the cache line.
In the example, the offset bits are 2 which are used to address the 4 bytes of the cache line.
Index corresponds to bits used to determine the set of the Cache.
In the example, the index bits are 6 which are used to address the 64 sets of the cache.
Tag corresponds to the remaining bits.
In the example, the tag bits are 6 (14 – (6+2)), which are stored in tag field to match the address on cache request.
Address 0x0000(tag - 00_0000, index – 00_0000, offset – 00) maps to block 0 of the memory and occupies the set 0 of the cache.
Address 0x0004(tag - 00_0000, index – 00_0001, offset – 00) maps to block 1 of the memory and occupies the set 1 of the cache.
Similarly, address 0x00FF(tag – 00_0000, index – 11_1111, offset – 11) maps to block 63 of the memory and occupies the set 63 of the cache.
Address 0x0100(tag – 00_0001, index – 00_0000, offset – 00) maps to block 64 of the memory and occupies the set 0 of the cache.
In a Fully associative cache, the cache is organized into a single cache set with multiple cache lines. A memory block can occupy any of the cache lines. The cache organization can be framed as (1*m) row matrix.[2]
Consider Main memory of 16 Kilobytes, which is organized as 4-byte blocks and Cache of 256 bytes and block size of 4 bytes.
Since each cache block is of size 4 bytes, the total number of sets in the cache is 256/4, which equals 64 sets or cache lines.
The incoming address to the cache is divided into bits for offset and tag.
Offset corresponds to the bits used to determine the byte to be accessed from the cache line.
In the example, the offset bits are 2 which are used to address the 4 bytes of the cache line and the remaining bits form the tag.
In the example, the tag bits are 12 (14 – 2), which are stored in the tag field of the cache line to match the address on cache request.
Since any block of memory can be mapped to any cache line, the memory block can occupy one of the cache lines based on the replacement policy.
Set associative cache is a trade-off between Direct mapped cache and Fully associative cache.
The Set associative cache can be imagined as a (n*m) matrix. The cache is divided into ‘n’ sets and each set contains ‘m’ cache lines. A memory block is first mapped onto a set and then placed into any cache line of the set.
The range of caches from direct mapped to fully associative is a continuum of levels of set associativity. (Direct mapped is one-way set associative and Fully associative cache with m blocks is m -way set associative.)
Many processor caches in today's’ design are either direct mapped, two-way set associative, or four-way set associative.[2]
Consider Main memory of 16 Kilobytes, which is organized as 4-byte blocks and Cache of 256 bytes with block size of 4 bytes and 2-way set associative.
Since each cache block is of size 4 bytes, the total number of sets in the cache is 256/4, which equals 64 sets or cache lines.
In the example, the offset bits are 2 which are used to address the 4 bytes of the cache line, the index bits are 5 which are used to address the 32 lines of the cache and the tag bits are 7 (14 – (5+2)), which are stored in tag to match the address on cache request.
Address 0x0000(tag – 000_0000, index – 0_0000, offset – 00) maps to block 0 of the memory and occupies the set 0 of the cache. The block occupies one of the cache lines of the set 0 and is determined by the replacement policy for the cache.
Address 0x0004(tag – 000_0000, index – 0_0001, offset – 00) maps to block 1 of the memory and occupies one of the cache lines of the set 1 of the cache.
Similarly, address 0x00FF(tag – 000_0001, index – 1_1111, offset – 11) maps to block 63 of the memory and occupies one of the cache lines of the set 31 of the cache.
Address 0x0100(tag – 000_0010, index – 0_0000, offset – 00) maps to block 64 of the memory and occupies one of the cache lines of the set 0 of the cache.