From b3e062f13149569a479d55d6028174c8d62b6cb1 Mon Sep 17 00:00:00 2001 From: David Papp Date: Tue, 28 Nov 2017 12:21:57 -0500 Subject: [PATCH 1/6] Submitting updated proposal --- Proposal.pdf | Bin 0 -> 80468 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Proposal.pdf diff --git a/Proposal.pdf b/Proposal.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dc36fdbe38b8f0173c207b8b293a1b6c863eef8d GIT binary patch literal 80468 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 F{{=o*2$BE* literal 0 HcmV?d00001 From 38ca3ed2d722dd31311f5d22f1b21eebac46f635 Mon Sep 17 00:00:00 2001 From: David Papp Date: Mon, 11 Dec 2017 18:32:55 -0500 Subject: [PATCH 2/6] Leetcode LRU Implementation --- LRUCache.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 LRUCache.cpp diff --git a/LRUCache.cpp b/LRUCache.cpp new file mode 100644 index 0000000..fc30a22 --- /dev/null +++ b/LRUCache.cpp @@ -0,0 +1,44 @@ + +class LRUCache { +public: + unordered_map val; + unordered_map freq; + queue q; + int cap; + + + LRUCache(int capacity) { + cap = capacity; + } + + int get(int key) { + if (!val.count(key)) { + return -1; + } + + q.push(key); + freq[key]++; + return val[key]; + } + + void put(int key, int value) { + val[key] = value; + q.push(key); + freq[key]++; + if (freq[key] == 1) { + cap--; + } + while (cap < 0) { + int last = q.front(); + q.pop(); + if (freq[last] == 1) { + freq.erase(last); + val.erase(last); + cap++; + } + else { + freq[last]--; + } + } + } +}; From 7c7bfef9c99bf697bcf843ed5273e62983444eb7 Mon Sep 17 00:00:00 2001 From: David Papp Date: Mon, 11 Dec 2017 18:44:47 -0500 Subject: [PATCH 3/6] Create ChampSim Repo --- ChampSim Repo | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 ChampSim Repo diff --git a/ChampSim Repo b/ChampSim Repo new file mode 100644 index 0000000..ef74fd5 --- /dev/null +++ b/ChampSim Repo @@ -0,0 +1,2 @@ +Link to our ChampSim repo: +https://github.com/davpapp/ChampSim From 6ff2220c5a64dab2201bb152a8e557b60f8b2d07 Mon Sep 17 00:00:00 2001 From: David Papp Date: Mon, 11 Dec 2017 18:46:29 -0500 Subject: [PATCH 4/6] Add files via upload --- CompArc-Final-Caches.md | 99 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 CompArc-Final-Caches.md diff --git a/CompArc-Final-Caches.md b/CompArc-Final-Caches.md new file mode 100644 index 0000000..5d1da39 --- /dev/null +++ b/CompArc-Final-Caches.md @@ -0,0 +1,99 @@ +# CompArc Final: Caches +by David Papp and Robbie Siegel + + +# Introduction + +In this project, we explored multiple cache replacement policies to evaluate their effectiveness for specific purposes. Caching is the process by which data is stored in a cache so that the data can be served faster in the future. It is an integral part of modern computation and CPU specs often include the size of each level of cache. Cache replacement policies decide which entries are stored in the cache. We also designed our own custom cache replacement policy and attempted to use the cache simulation suite from the Cache Replacement Competition with limited success. + + +# Cache Policies + +We decided to study three common caching policies and their underlying algorithms. We focused not just on how they work, but the types of applications each one is suitable for and also the limitations of each one. The three replacement policies we explored were as follows: + +- Least recently used (LRU) +- Adaptive Cache Replacement (ARC) +- LIRS/MQ + + +## Least Recently Used (LRU) + +This caching policy is based on temporal locality — what you have touched recently, you are more likely to touch again. It is one of the most widely used replacement policies and is the preferred page replacement policy. We chose to study it due to its popularity and use in ARC. + +LRU is best suited for smaller caches. As the cache size expands, the additional data becomes less useful since it was accessed longer ago. This is in contrast with a random eviction policy, where the size of the cache increase should be proportional to the hit rate. However, since LRU requires greater overhead, at sufficiently large cache sizes, it loses its advantage. + +The main limitation of an LRU is its high processing overhead. Unlike in a FIFO, which can be implemented with a single queue, we need additional data structures to update time stamps. In our implementation, we needed a queue as well as two maps to allow for O(1) retrieval and updates. + +We found a challenging problem on Leetcode that required us to write our own implementations for an LRU. We completed this to ensure that we have an algorithmic understanding of the policy. We hoped we could later modify this to implement our own caching policy. Unfortunately, we later found this code to have almost no crossover to the CRC2 simulation suite. Our code can be found on our GitHub: https://github.com/davpapp/FinalProject/blob/master/LRUCache.cpp. + + +## Adaptive Cache Replacement (ARC) + +This cache replacement policy is an improvement upon LRU. It is a hybrid design that consists of four parts: + + - T1: LRU + - T2: LFU (least frequently used) + - B1: Ghost LRU: history of recently evicted LRU entries + - B2: Ghost LFU: history of recently evicted LFU entries + + +The policy dynamically changes the sizes of the LRU and the LFU based on which one is returning more hits. This is achieved by using the ghost lists act as scorecards by tracking the history of items evicted from each cache. Items enter T1 and T2 just as they would enter an LRU and LFU, respectively. Evicted items are put into the respective ghost list. Hits in these ghost lists will change the size of T1 and T2. +A hit in B1 will increase the size of T1 and decrease the size of T2. The last item in T2 will be evicted into B2. Conversely, a hit in B2 will increase the size of T2 and decrease the size of T1. The last item in T1 will be evicted into B1. + +![Visualisation of ARC](https://image.slidesharecdn.com/class17-inked-140401130043-phpapp02/95/flash-modern-file-systems-27-638.jpg?cb=1396357346) + + +ARC policies are extremely versatile and efficient. They generally outperform LRU alone and are a great general purpose policy, similar to LRU. + +Since this algorithm is patented to IBM, there exist many slight variations with worse performance. We used this policy as inspiration to develop our own caching policy in theory. The dynamic sizes of the two components of the cache is extremely promising compared to having two caches of the same size. + + +## Low Inter-reference Recency Set (LIRS) +[ ] Write up of how it works, with images + +Similar to ARC, LIRS is an improvement upon LRU in several ways. This caching policy centers around a data block’s reuse-distance, or inter-reference recency (IRR). Inter-reference recency measures the number of other unique blocks accessed between two consecutive references to the same block. So, a block that is accessed consecutively with nothing in between would have an IRR of zero. + +(Insert image here of data blocks being referenced) + +# Our Own Cache Replacement Policy + +We will design a variation of an ARC policy. ARC uses the hybrid of an LRU and an LFU. We will keep the LRU segment, but we will replace the LFU with our own segment that we will call 2-random LFU. + +The 2-random LFU policy will work as follows. We will keep track of the frequencies of each item in cache and increment the frequency each time we encounter that item. To evict an item, we will choose two random values and evict the one with a lower frequency. This approach is based on a paper we read: https://danluu.com/2choices-eviction/. + +This paper proposed the idea of a 2-random policy where two random values were chosen and the one that was less recently used was evicted. We were curious to learn how evicting the less frequently used item instead of the less recently used item would affect performance. +Below is a figure from this paper. Note that both LRU and 2-random are consistently better than random replacement. LRU outperforms 2-random for cache sizes under 256k, but 2-random takes the edge for sizes above 256k. + +![Cache miss ratios for cache sizes between 64K and 16M](https://danluu.com/images/2choices-eviction/sweep-sizes-mean-ratios.png) + + +Our intention with the 2-random policy in place of an LFU was to balance the performance for different cache sizes. A typical ARC approach uses both an LRU and an LFU, which are are both ideal for smaller cache sizes. In contrast, random replacement improves in performance as our cache gets bigger. By swapping the LFU with a 2-random policy, were essentially hoping to diversify the strengths of our cache replacement policy. + +It is extremely hard to qualitatively predict cache performance for our hybrid design. We thus turned to an existing cache simulation software to produce quantitative results. + + +# Implementation + +We turned to resources from the 2nd Cache Replacement Competition (CRC2). This competition provides a suite for implementing custom cache policies and evaluating their performances. The full description for the competition can be found at http://crc2.ece.tamu.edu/, and the repository can be found at [https://github.com/ChampSim.](https://github.com/ChampSim/ChampSim) + +This simulation suite ran a trace file of 10 million commands against different caching policies. Using command line arguments, the simulation could be run with a variety of parameters including specific branch prediction algorithms, cache sizes, and number of cores. All of this was outside the scope of our project. + +To get a measurement for baseline performance, we ran trials without a cache policy and another one with LRU. The metric of performance was instructions per cycle (IPC). All of our tests were run on a single core with the cache replacement policy being the only different parameter. The results are shown below: + +| | Instructions per Clock (IPC) | Instsructions | Cycles | +| ------------ | ---------------------------- | ------------- | -------- | +| No Cache | 0.681835 | 10000001 | 14666312 | +| LRU | 0.807452 | 10000001 | 12384644 | +| 2-random LRU | 0.786255 | 10000001 | 12718527 | +| Random | 0.771452 | 10000001 | 12962575 | + + +With no cache policy in place, the IPC was 0.681835, or about a 15.56% decrease in performance compared to an LRU. +As our MVP, we first implemented a random policy. The IPC for this was 0.771452, or about a 4.46% decrease in performance compared to an LRU. +Next, we implemented the 2-random LRU we read about earlier. This was considerably easier than implementing our custom policy. It also helped that an LRU was already implemented and thus we did not need to write our own. The IPC for this was 0.771452, or about a 2.63% decrease in performance compared to an LRU. +It was especially surprising to see how effective a simple random cache was. Of course, 4.46% likely has a huge impact on actual performance. This also assumes that the traces we tested with were representative of real CPU usage. + +Unfortunately, we were unable to implement our proposed solution. Considering the complexity of our custom design, this shouldn’t be too surprising. We began to write an LFU, but struggled to understand the code architecture well enough that we could write an efficient LRU algorithm. The code base was sparsely documented. We wrote an LRU that compiled successfully but consistently seg-faulted during simulation so we were unable to obtain results. Due to time limitations, we accepted our fate and decided that knowledge we gained from designing our custom policy was more relevant to computer architecture than the software implementation aspect. If we had more time, we would have worked more on getting this part working. + +Our code can be found on a GitHub repo (separate from our Final Project repo): https://github.com/davpapp/ChampSim. + From a7ea24bd2f7fce34a142013c65fbcfcf23141743 Mon Sep 17 00:00:00 2001 From: Robert Siegel Date: Mon, 11 Dec 2017 22:45:54 -0500 Subject: [PATCH 5/6] Deleting old report, uploading one with new name --- CompArc-Final-Caches.md | 99 ----------------------------------------- 1 file changed, 99 deletions(-) delete mode 100644 CompArc-Final-Caches.md diff --git a/CompArc-Final-Caches.md b/CompArc-Final-Caches.md deleted file mode 100644 index 5d1da39..0000000 --- a/CompArc-Final-Caches.md +++ /dev/null @@ -1,99 +0,0 @@ -# CompArc Final: Caches -by David Papp and Robbie Siegel - - -# Introduction - -In this project, we explored multiple cache replacement policies to evaluate their effectiveness for specific purposes. Caching is the process by which data is stored in a cache so that the data can be served faster in the future. It is an integral part of modern computation and CPU specs often include the size of each level of cache. Cache replacement policies decide which entries are stored in the cache. We also designed our own custom cache replacement policy and attempted to use the cache simulation suite from the Cache Replacement Competition with limited success. - - -# Cache Policies - -We decided to study three common caching policies and their underlying algorithms. We focused not just on how they work, but the types of applications each one is suitable for and also the limitations of each one. The three replacement policies we explored were as follows: - -- Least recently used (LRU) -- Adaptive Cache Replacement (ARC) -- LIRS/MQ - - -## Least Recently Used (LRU) - -This caching policy is based on temporal locality — what you have touched recently, you are more likely to touch again. It is one of the most widely used replacement policies and is the preferred page replacement policy. We chose to study it due to its popularity and use in ARC. - -LRU is best suited for smaller caches. As the cache size expands, the additional data becomes less useful since it was accessed longer ago. This is in contrast with a random eviction policy, where the size of the cache increase should be proportional to the hit rate. However, since LRU requires greater overhead, at sufficiently large cache sizes, it loses its advantage. - -The main limitation of an LRU is its high processing overhead. Unlike in a FIFO, which can be implemented with a single queue, we need additional data structures to update time stamps. In our implementation, we needed a queue as well as two maps to allow for O(1) retrieval and updates. - -We found a challenging problem on Leetcode that required us to write our own implementations for an LRU. We completed this to ensure that we have an algorithmic understanding of the policy. We hoped we could later modify this to implement our own caching policy. Unfortunately, we later found this code to have almost no crossover to the CRC2 simulation suite. Our code can be found on our GitHub: https://github.com/davpapp/FinalProject/blob/master/LRUCache.cpp. - - -## Adaptive Cache Replacement (ARC) - -This cache replacement policy is an improvement upon LRU. It is a hybrid design that consists of four parts: - - - T1: LRU - - T2: LFU (least frequently used) - - B1: Ghost LRU: history of recently evicted LRU entries - - B2: Ghost LFU: history of recently evicted LFU entries - - -The policy dynamically changes the sizes of the LRU and the LFU based on which one is returning more hits. This is achieved by using the ghost lists act as scorecards by tracking the history of items evicted from each cache. Items enter T1 and T2 just as they would enter an LRU and LFU, respectively. Evicted items are put into the respective ghost list. Hits in these ghost lists will change the size of T1 and T2. -A hit in B1 will increase the size of T1 and decrease the size of T2. The last item in T2 will be evicted into B2. Conversely, a hit in B2 will increase the size of T2 and decrease the size of T1. The last item in T1 will be evicted into B1. - -![Visualisation of ARC](https://image.slidesharecdn.com/class17-inked-140401130043-phpapp02/95/flash-modern-file-systems-27-638.jpg?cb=1396357346) - - -ARC policies are extremely versatile and efficient. They generally outperform LRU alone and are a great general purpose policy, similar to LRU. - -Since this algorithm is patented to IBM, there exist many slight variations with worse performance. We used this policy as inspiration to develop our own caching policy in theory. The dynamic sizes of the two components of the cache is extremely promising compared to having two caches of the same size. - - -## Low Inter-reference Recency Set (LIRS) -[ ] Write up of how it works, with images - -Similar to ARC, LIRS is an improvement upon LRU in several ways. This caching policy centers around a data block’s reuse-distance, or inter-reference recency (IRR). Inter-reference recency measures the number of other unique blocks accessed between two consecutive references to the same block. So, a block that is accessed consecutively with nothing in between would have an IRR of zero. - -(Insert image here of data blocks being referenced) - -# Our Own Cache Replacement Policy - -We will design a variation of an ARC policy. ARC uses the hybrid of an LRU and an LFU. We will keep the LRU segment, but we will replace the LFU with our own segment that we will call 2-random LFU. - -The 2-random LFU policy will work as follows. We will keep track of the frequencies of each item in cache and increment the frequency each time we encounter that item. To evict an item, we will choose two random values and evict the one with a lower frequency. This approach is based on a paper we read: https://danluu.com/2choices-eviction/. - -This paper proposed the idea of a 2-random policy where two random values were chosen and the one that was less recently used was evicted. We were curious to learn how evicting the less frequently used item instead of the less recently used item would affect performance. -Below is a figure from this paper. Note that both LRU and 2-random are consistently better than random replacement. LRU outperforms 2-random for cache sizes under 256k, but 2-random takes the edge for sizes above 256k. - -![Cache miss ratios for cache sizes between 64K and 16M](https://danluu.com/images/2choices-eviction/sweep-sizes-mean-ratios.png) - - -Our intention with the 2-random policy in place of an LFU was to balance the performance for different cache sizes. A typical ARC approach uses both an LRU and an LFU, which are are both ideal for smaller cache sizes. In contrast, random replacement improves in performance as our cache gets bigger. By swapping the LFU with a 2-random policy, were essentially hoping to diversify the strengths of our cache replacement policy. - -It is extremely hard to qualitatively predict cache performance for our hybrid design. We thus turned to an existing cache simulation software to produce quantitative results. - - -# Implementation - -We turned to resources from the 2nd Cache Replacement Competition (CRC2). This competition provides a suite for implementing custom cache policies and evaluating their performances. The full description for the competition can be found at http://crc2.ece.tamu.edu/, and the repository can be found at [https://github.com/ChampSim.](https://github.com/ChampSim/ChampSim) - -This simulation suite ran a trace file of 10 million commands against different caching policies. Using command line arguments, the simulation could be run with a variety of parameters including specific branch prediction algorithms, cache sizes, and number of cores. All of this was outside the scope of our project. - -To get a measurement for baseline performance, we ran trials without a cache policy and another one with LRU. The metric of performance was instructions per cycle (IPC). All of our tests were run on a single core with the cache replacement policy being the only different parameter. The results are shown below: - -| | Instructions per Clock (IPC) | Instsructions | Cycles | -| ------------ | ---------------------------- | ------------- | -------- | -| No Cache | 0.681835 | 10000001 | 14666312 | -| LRU | 0.807452 | 10000001 | 12384644 | -| 2-random LRU | 0.786255 | 10000001 | 12718527 | -| Random | 0.771452 | 10000001 | 12962575 | - - -With no cache policy in place, the IPC was 0.681835, or about a 15.56% decrease in performance compared to an LRU. -As our MVP, we first implemented a random policy. The IPC for this was 0.771452, or about a 4.46% decrease in performance compared to an LRU. -Next, we implemented the 2-random LRU we read about earlier. This was considerably easier than implementing our custom policy. It also helped that an LRU was already implemented and thus we did not need to write our own. The IPC for this was 0.771452, or about a 2.63% decrease in performance compared to an LRU. -It was especially surprising to see how effective a simple random cache was. Of course, 4.46% likely has a huge impact on actual performance. This also assumes that the traces we tested with were representative of real CPU usage. - -Unfortunately, we were unable to implement our proposed solution. Considering the complexity of our custom design, this shouldn’t be too surprising. We began to write an LFU, but struggled to understand the code architecture well enough that we could write an efficient LRU algorithm. The code base was sparsely documented. We wrote an LRU that compiled successfully but consistently seg-faulted during simulation so we were unable to obtain results. Due to time limitations, we accepted our fate and decided that knowledge we gained from designing our custom policy was more relevant to computer architecture than the software implementation aspect. If we had more time, we would have worked more on getting this part working. - -Our code can be found on a GitHub repo (separate from our Final Project repo): https://github.com/davpapp/ChampSim. - From d68a37643f7eb15c00877073ee471232655c0945 Mon Sep 17 00:00:00 2001 From: Robert Siegel Date: Mon, 11 Dec 2017 22:46:47 -0500 Subject: [PATCH 6/6] Updated Report --- Cache-Replacement-Policies.md | 131 ++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 Cache-Replacement-Policies.md diff --git a/Cache-Replacement-Policies.md b/Cache-Replacement-Policies.md new file mode 100644 index 0000000..25449ba --- /dev/null +++ b/Cache-Replacement-Policies.md @@ -0,0 +1,131 @@ +# Cache Replacement Policies +by David Papp and Robbie Siegel + + +# Introduction + +In this project, we explored multiple cache replacement policies to evaluate their effectiveness for specific purposes. Caching is the process by which data is stored in a cache so that the data can be served faster in the future. It is an integral part of modern computation and CPU specs often include the size of each level of cache. Cache replacement policies decide which entries are stored in the cache. We also designed our own custom cache replacement policy and attempted to implement it using the cache simulation suite from the Cache Replacement Competition with limited success. + + +# Cache Policies + +We decided to study three common caching policies and their underlying algorithms. We focused not just on how they work, but the types of applications each one is suitable for and also the limitations of each one. The three replacement policies we explored were as follows: + +- Least recently used (LRU) +- Adaptive Cache Replacement (ARC) +- LIRS/MQ + + +## Least Recently Used (LRU) + +This caching policy is based on temporal locality — what you have touched recently, you are more likely to touch again. It is one of the most widely used replacement policies and is the preferred page replacement policy. We chose to study it due to its popularity and use in ARC. + +LRU is best suited for smaller caches. As the cache size expands, the additional data becomes less useful since it was accessed longer ago. This is in contrast with a random eviction policy, where the size of the cache increase should be proportional to the hit rate. However, since LRU requires greater overhead, at sufficiently large cache sizes, it loses its advantage. + +The main limitation of an LRU is its high processing overhead. Unlike in a FIFO, which can be implemented with a single queue, we need additional data structures to update time stamps. In our implementation, we needed a queue as well as two maps to allow for O(1) retrieval and updates. + +We found a challenging problem on Leetcode that required us to write our own implementations for an LRU. We completed this to ensure that we have an algorithmic understanding of the policy. We hoped we could later modify this to implement our own caching policy. Unfortunately, we later found this code to have almost no crossover to the CRC2 simulation suite. Our code can be found on our GitHub: https://github.com/davpapp/FinalProject/blob/master/LRUCache.cpp. + + +## Adaptive Cache Replacement (ARC) + +This cache replacement policy is an improvement upon LRU. It is a hybrid design that consists of four parts: + + - T1: LRU + - T2: LFU (least frequently used) + - B1: Ghost LRU: history of recently evicted LRU entries + - B2: Ghost LFU: history of recently evicted LFU entries + + +The policy dynamically changes the sizes of the LRU and the LFU based on which one is returning more hits. This is achieved by using the ghost lists act as scorecards by tracking the history of items evicted from each cache. Items enter T1 and T2 just as they would enter an LRU and LFU, respectively. Evicted items are put into the respective ghost list. Hits in these ghost lists will change the size of T1 and T2. +A hit in B1 will increase the size of T1 and decrease the size of T2. The last item in T2 will be evicted into B2. Conversely, a hit in B2 will increase the size of T2 and decrease the size of T1. The last item in T1 will be evicted into B1. + +![Visualisation of ARC](https://image.slidesharecdn.com/class17-inked-140401130043-phpapp02/95/flash-modern-file-systems-27-638.jpg?cb=1396357346) + + +ARC policies are extremely versatile and efficient. They generally outperform LRU alone and are a great general purpose policy, similar to LRU. + +Since this algorithm is patented to IBM, there exist many slight variations with worse performance. We used this policy as inspiration to develop our own caching policy in theory. The dynamic sizes of the two components of the cache is extremely promising compared to having two caches of the same size. + + +## Low Inter-reference Recency Set (LIRS) + +Similar to ARC, LIRS is an improvement upon LRU in several ways. This caching policy centers around a data block’s reuse-distance, or inter-reference recency (IRR). Inter-reference recency measures the number of other unique blocks accessed between the two most recent references to a given block. So, a block that is accessed for the first time will have an infinite IRR. Once this block is referenced a second time, it will be given a real number IRR that is the number of unique blocks in between its first and second reference. + +![IRR and Recency of Accessed Blocks ](https://d2mxuefqeaa7sj.cloudfront.net/s_221BACEBB6F70560258E251C084525A6B643DADBF3756E049BE14C16AD544E88_1513046670562_IRR_Examples.PNG) + + +The above image details the IRR and recency values of 5 example blocks being accessed over ten units of time. Each ‘X’ represents a block being accessed. So for example, Block 1 has an IRR of 1 because it was most recently accessed at times 3 and 6, which have two unique blocks referenced between them. Block 5 has an infinite IRR because it is only accessed once. + +LIRS also classifies each block in the cache by its recency, which is a measure of how many unique blocks have been accessed since its last access. In the table above, Block 1 has a recency of 4 because there are four blocks accessed since its last reference. + +Each block in the cache is classified as either Low IRR (LIR) or High IRR (HIR). There is a designated number of space in the cache for each type of block. Note that all LIR blocks are in the cache, but not all HIR blocks are in the cache. HIR blocks that are in the cache are referred to as resident HIR blocks. + +This policy assumes that LIR blocks are more likely to be accessed in the near future, so it prioritizes keeping these in the cache. In the case that there are no resident HIR blocks, it will remove the block from the bottom of the LIR stack. This block will always have the highest recency value of any in the cache. + +The LIRS policy does have some overhead because it requires having two stacks. The first of these is designated S and contains all LIR and HIR blocks. The second is designated Q and contains the resident HIR blocks. When an HIR block in S is referenced again, it will become an LIR block. + +When referencing a new block, there are four possibilities: + + 1. It is an LIR block + 2. It is a resident HIR block in S + 3. It is a resident HIR block not in S + 4. It is a non-resident HIR block in S + 5. It is a non-resident HIR block not in S + +Note that cases a, b, and c will result in hits, while cases d, e, and f will result in misses. Each case will begin by placing the newly accessed block at the top of stack S and adding it to the cache. They begin to differ after this action. + +In case a, we must remove all HIR blocks from the bottom of S until an LIR block is at the bottom. + +In case b, the referenced block will become an LIR block because it was already in S. It is removed from Q. + +In case c, the referenced block will not become an LIR because it was not originally in S. The LIR at the bottom of S is moved to the top of Q. + +In case d, the referenced block will become an LIR block because it was already in S. The LIR at the bottom of S is moved to the top of Q. + +In case e, the referenced block will not become an LIR because it was not originally in S. Therefore, we move it to the top of Q. + +These steps allow the implementation of an LIRS policy. + +# Our Own Cache Replacement Policy + +We will design a variation of an ARC policy. ARC uses the hybrid of an LRU and an LFU. We will keep the LRU segment, but we will replace the LFU with our own segment that we will call 2-random LFU. + +The 2-random LFU policy will work as follows. We will keep track of the frequencies of each item in cache and increment the frequency each time we encounter that item. To evict an item, we will choose two random values and evict the one with a lower frequency. This approach is based on a paper we read: https://danluu.com/2choices-eviction/. + +This paper proposed the idea of a 2-random policy where two random values were chosen and the one that was less recently used was evicted. We were curious to learn how evicting the less frequently used item instead of the less recently used item would affect performance. +Below is a figure from this paper. Note that both LRU and 2-random are consistently better than random replacement. LRU outperforms 2-random for cache sizes under 256k, but 2-random takes the edge for sizes above 256k. + +![Cache miss ratios for cache sizes between 64K and 16M](https://danluu.com/images/2choices-eviction/sweep-sizes-mean-ratios.png) + + +Our intention with the 2-random policy in place of an LFU was to balance the performance for different cache sizes. A typical ARC approach uses both an LRU and an LFU, which are are both ideal for smaller cache sizes. In contrast, random replacement improves in performance as our cache gets bigger. By swapping the LFU with a 2-random policy, were essentially hoping to diversify the strengths of our cache replacement policy. + +It is extremely hard to qualitatively predict cache performance for our hybrid design. We thus turned to an existing cache simulation software to produce quantitative results. + + +# Implementation + +We turned to resources from the 2nd Cache Replacement Competition (CRC2). This competition provides a suite for implementing custom cache policies and evaluating their performances. The full description for the competition can be found at http://crc2.ece.tamu.edu/, and the repository can be found at [https://github.com/ChampSim.](https://github.com/ChampSim/ChampSim) + +This simulation suite ran a trace file of 10 million commands against different caching policies. Using command line arguments, the simulation could be run with a variety of parameters including specific branch prediction algorithms, cache sizes, and number of cores. All of this was outside the scope of our project. + +To get a measurement for baseline performance, we ran trials without a cache policy and another one with LRU. The metric of performance was instructions per cycle (IPC). All of our tests were run on a single core with the cache replacement policy being the only different parameter. The results are shown below: + +| | Instructions per Clock (IPC) | Instsructions | Cycles | +| ------------ | ---------------------------- | ------------- | -------- | +| No Cache | 0.681835 | 10000001 | 14666312 | +| LRU | 0.807452 | 10000001 | 12384644 | +| 2-random LRU | 0.786255 | 10000001 | 12718527 | +| Random | 0.771452 | 10000001 | 12962575 | + + +With no cache policy in place, the IPC was 0.681835, or about a 15.56% decrease in performance compared to an LRU. +As our MVP, we first implemented a random policy. The IPC for this was 0.771452, or about a 4.46% decrease in performance compared to an LRU. +Next, we implemented the 2-random LRU we read about earlier. This was considerably easier than implementing our custom policy. It also helped that an LRU was already implemented and thus we did not need to write our own. The IPC for this was 0.771452, or about a 2.63% decrease in performance compared to an LRU. +It was especially surprising to see how effective a simple random cache was. Of course, 4.46% likely has a huge impact on actual performance. This also assumes that the traces we tested with were representative of real CPU usage. + +Unfortunately, we were unable to implement our proposed solution. Considering the complexity of our custom design, this shouldn’t be too surprising. We began to write an LFU, but struggled to understand the code architecture well enough that we could write an efficient LRU algorithm. The code base was sparsely documented. We wrote an LRU that compiled successfully but consistently seg-faulted during simulation so we were unable to obtain results. Due to time limitations, we accepted our fate and decided that knowledge we gained from designing our custom policy was more relevant to computer architecture than the software implementation aspect. If we had more time, we would have worked more on getting this part working. + +Our code for the simulation can be found on a GitHub repo (separate from our Final Project repo): https://github.com/davpapp/ChampSim. +