Computer processing technique to boost memory performance
Cache prefetching is a technique used bycentral processing units (CPUs) to boost execution performance by fetching instructions or data from their primary or main storage in slower memory to a faster local memory before it is actually needed.[1][2] Most modern CPUs have fast and localcache memory in which prefetched data is held until it is required. The source for the prefetch operation is usuallymain memory. Because of their design, accessing cache memories is typically much faster than accessing main memory. Prefetching can be done with non-blockingcache control instructions. Prefetching is based on the principle ofdata locality.
Cache prefetching can either fetch data or instructions into cache.
Data prefetching fetches data before it is needed. Because data access patterns show less regularity than instruction patterns, accurate data prefetching is generally more challenging than instruction prefetching.
Instruction prefetching fetches instructions before they need to be executed. The first mainstream microprocessors to use some form of instruction prefetch were theIntel8086 (six bytes) and theMotorola68000 (four bytes). In recent years,[when?] all high-performance processors use prefetching techniques.
Cache prefetching can be accomplished either by hardware or by software.[3]
Hardware-based prefetching is typically accomplished by having a dedicated hardware mechanism in the processor that watches the stream of instructions or data being requested by the executing program, recognizes the next few elements that the program might need based on this stream, and prefetches into the processor's cache.[4]
Software-based prefetching is typically accomplished by having the compiler analyze the code and insert additional "prefetch" instructions in the program during compilation itself.[5]
Stream buffers were developed based on the concept of "one block lookahead (OBL) scheme" proposed byAlan Jay Smith.[1]
Streambuffers are one of the most common hardware based prefetching techniques in use. This technique was originally proposed byNorman Jouppi in 1990,[6] and many variations of this method have been developed since.[7][8][9] The basic idea is that thecache miss address (andk subsequent addresses) are fetched into a separate buffer of depthk. This buffer is called a stream buffer and is separate from the cache. The processor then consumes data/instructions from the stream buffer if the address associated with the prefetched blocks matches the requested address generated by the program executing on the processor. The figure below illustrates this setup:
A typical stream buffer setup as originally proposed by Norman Jouppi in 1990[6]
Whenever the prefetch mechanism detects a miss on a memory block, sayA, it allocates a stream to begin prefetching successive blocks from the missed block onward. If the stream buffer can hold 4 blocks, then the processor would prefetchA+1,A+2,A+3,A+4 and hold those in the allocated stream buffer. If the processor consumesA+1 next, then it shall be moved "up" from the stream buffer to the processor's cache. The first entry of the stream buffer would now beA+2 and so on. This pattern of prefetching successive blocks is calledSequential Prefetching. It is mainly used when contiguous locations are to be prefetched. For example, it is used when prefetching instructions.
This mechanism can be scaled up by adding multiple such stream buffers, each of which would maintain a separate prefetch stream.[10] For each new miss, there would be a new stream buffer allocated, and it would operate in a similar way as described above.
The ideal depth of the stream buffer is subject to experimentation against various benchmarks[6] and depends on the rest of themicroarchitecture involved.[11]
In this pattern, consecutive memory accesses are made to blocks that ares addresses apart.[3][12] In this case, the prefetcher calculates thes and uses it to compute the memory address for prefetching. For example, ifs = 4, the address to be prefetched wouldA+4.
In this case, the delta between the addresses of consecutive memory accesses is variable but still follows a pattern. Some prefetcher designs[9][13][14] exploit this property to predict and prefetch for future accesses.
This class of prefetchers looks for memory access streams that repeat over time.[15][16] For example, in the stream of memory accesses N, A, B, C, E, G, H, A, B, C, I, J, K, A, B, C, L, M, N, O, A, B, C, ...; the stream A, B, C is repeating over time. Other design variations have tried to provide more efficient implementations.[17][18]
Computer applications generate a variety of access patterns. The processor and memory subsystem architectures used to execute these applications further disambiguate the memory access patterns they generate. Hence, the effectiveness and efficiency of prefetching schemes often depends on the application and the architectures used to execute them.[19] Recent research[20][21] has focused on building collaborative mechanisms to synergistically use multiple prefetching schemes for better prefetching coverage and accuracy.
Compiler-directed prefetching is widely used within loops with a large number of iterations. In this technique, the compiler predicts future cache misses and inserts a prefetch instruction based on themiss penalty and execution time of the instructions.
These prefetches are non-blocking memory operations; that is, these memory accesses do not interfere with actual memory accesses. They do not change the state of the processor or cause page faults.
One main advantage of software prefetching is that it reduces the number of compulsory cache misses.[3]
The following example shows the addition of a prefetch instruction into code to improvecache performance.
In the following iteration,
for(size_ti=0;i<1024;++i){array1[i]*=2;}
theith element of the arrayarray1 is accessed. The system can prefetch the elements that are presumably accessed in future iterations by inserting a prefetch instruction as shown below:
Here, the prefetch stride,k depends on two factors, the cache miss penalty and the time it takes to execute a single iteration of the for-loop. For instance, if one iteration of the loop takes 7 cycles to execute, and the cache miss penalty is 49 cycles, then there should be k = 49/7 = 7 – which means that the system should prefetch 7 elements ahead. With the first iteration,i will be 0, so the system prefetches the 7th element. Now, with this arrangement, the first 7 accesses (i = 0 → 6) will still be misses (under the simplifying assumption that each element ofarray1 is in a separate cache line of its own).
While software prefetching requires programmer orcompiler intervention, hardware prefetching requires special hardware mechanisms.[3]
Software prefetching works well only with loops where there is regular array access, as the programmer has to hand-code the prefetch instructions, whereas hardware prefetchers work dynamically based on the program's behavior atruntime.[3]
Hardware prefetching also has less CPU overhead when compared to software prefetching.[22] However, software prefetching can mitigate certain constraints of hardware prefetching, leading to improvements in performance.[23]
Accuracy is the fraction of total prefetches that were useful – that is, the ratio of the number of memory addresses prefetched that were actually referenced by the program to the total prefetches done.
Prefetch Accuracy =Cache Misses eliminated by prefetching/(Useless Cache Prefetches) + (Cache Misses eliminated by prefetching)
While it appears that having perfect accuracy might imply that there are no misses, this is not the case. The prefetches themselves might result in new misses if the prefetched blocks are placed directly into the cache. Although these may be a small fraction of the total number of misses observed without any prefetching, this is a non-zero number of misses.
The qualitative definition of timeliness is the amount of time elapsed from prefetch to the actual reference. For example: for prefetching to be useful in afor loop where each iteration takes three cycles to execute and the prefetch operation takes twelve cycles, the system must start the prefetch 12/3 = 4 iterations prior to its usage to maintain timeliness.
^abcdefSolihin, Yan (2016).Fundamentals of parallel multicore architecture. Boca Raton, Florida: CRC Press, Taylor & Francis Group. p. 163.ISBN978-1482211184.
^Baer, Jean-Loup; Chen, Tien-Fu (1991-01-01).An Effective On-chip Preloading Scheme to Reduce Data Access Penalty. 1991 ACM/IEEE Conference on Supercomputing. Albuquerque, New Mexico, USA: Association for Computing Machinery. pp. 176–186.CiteSeerX10.1.1.642.703.doi:10.1145/125826.125932.ISBN978-0897914598.
^Kennedy, Porterfield, Allan (1989-01-01).Software methods for improvement of cache performance on supercomputer applications (Thesis). Rice University.hdl:1911/19069.{{cite thesis}}: CS1 maint: multiple names: authors list (link)
^abcJouppi, Norman P. (1990). "Improving direct-mapped cache performance by the addition of a small fully-associative cache and prefetch buffers".Proceedings of the 17th annual international symposium on Computer Architecture – ISCA 1990. 17th annual international symposium on Computer Architecture – ISCA 1990. New York, New York, USA: Association for Computing Machinery Press. pp. 364–373.CiteSeerX10.1.1.37.6114.doi:10.1145/325164.325162.ISBN0-89791-366-3.
^Palacharla, S.; Kessler, R. E. (1994-01-01).Evaluating Stream Buffers As a Secondary Cache Replacement. 21st Annual International Symposium on Computer Architecture. Chicago, Illinois, USA: IEEE Computer Society Press. pp. 24–33.CiteSeerX10.1.1.92.3031.doi:10.1109/ISCA.1994.288164.ISBN978-0818655104.
^abGrannaes, Marius; Jahre, Magnus; Natvig, Lasse (2011). "Storage Efficient Hardware Prefetching using Delta-Correlating Prediction Tables".Journal of Instruction-Level Parallelism (13):1–16.CiteSeerX10.1.1.229.3483.
^Kondguli, Sushant; Huang, Michael (November 2017).T2: A Highly Accurate and Energy Efficient Stride Prefetcher. 2017 IEEE International Conference on Computer Design (ICCD). pp. 373–376.doi:10.1109/ICCD.2017.64.ISBN978-1-5386-2254-4.S2CID11055312.
^Kim, Jinchun; Pugsley, Seth H.; Gratz, Paul V.; Reddy, A.L. Narasimha; Wilkerson, Chris; Chishti, Zeshan (October 2016).Path confidence based lookahead prefetching. 2016 49th Annual IEEE/ACM International Symposium on Microarchitecture (MICRO). pp. 1–12.doi:10.1109/MICRO.2016.7783763.ISBN978-1-5090-3508-3.S2CID1097472.
^Joseph, Doug; Grunwald, Dirk (1997-05-01). "Prefetching using Markov predictors".Proceedings of the 24th Annual International Symposium on Computer Architecture. ISCA 1997. ISCA 1997. New York, New York, USA: Association for Computing Machinery. pp. 252–263.doi:10.1145/264107.264207.ISBN978-0-89791-901-2.S2CID434419.
^Collins, J.; Sair, S.; Calder, B.; Tullsen, D.M. (November 2002).Pointer cache assisted prefetching. 35th Annual IEEE/ACM International Symposium on Microarchitecture, 2002. (MICRO-35). Proceedings. pp. 62–73.doi:10.1109/MICRO.2002.1176239.ISBN0-7695-1859-1.S2CID5608519.
^Pakalapati, Samuel; Panda, Biswabandan (May 2020).Bouquet of Instruction Pointers: Instruction Pointer Classifier-based Spatial Hardware Prefetching. 2020 ACM/IEEE 47th Annual International Symposium on Computer Architecture (ISCA). pp. 118–131.doi:10.1109/ISCA45697.2020.00021.ISBN978-1-7281-4661-4.S2CID218683672.
^Callahan, David; Kennedy, Ken; Porterfield, Allan (1991-01-01).Software Prefetching. Fourth International Conference on Architectural Support for Programming Languages and Operating Systems. Santa Clara, California, USA: Association for Computing Machinery. pp. 40–52.doi:10.1145/106972.106979.ISBN978-0897913805.