繁体   English   中英

L1,L2和L3高速缓存的高速缓存命中和高速缓存未命中数

[英]The number of cache hits and cache misses in terms of L1, L2 and L3 caches

以下代码将在具有以下缓存结构的CPU上运行:

  • L1快取:1KB

  • L2快取:8KB

  • 三级缓存:64KB

  • 块大小:16B

      unsigned int A[65536]; int i,j; for (i=0 ; i<65536-256 ; i++) for (j=1 ; j<128; j++) A[i]=A[i]+A[i+j]; 

我正在为期中考试而学习,这是一个问题。 修改此代码以最大程度地减少罚款。 根据L1,L2和L3高速缓存计算高速缓存命中和高速缓存未命中的数量。

我尝试通过循环交换解决它。 如果我将代码更改为如下所示,那么将有一个顺序访问,而不是每16364个字跨越内存。

     unsigned int A[65536];
     int i,j;
     for (j=1 ; j<128; j++)
     for (i=0 ; i<65536-256 ; i++)
     A[i]=A[i]+A[i+j]; 

但我坚持使用缓存的命中率和未命中率。 有人可以向我解释吗?

假设unsigned int为4个字节,则数组的大小为4 * 65536 = 256KB。 您的L3缓存最多只能容纳64KB。

为了最大程度地减少处罚,您应该做的第一件事是将循环分成4个子组,这样,一旦将条目加载到L3中,就应该在被逐出之前完全使用它。

unsigned int A[65536];
int i,j,k;
for (k=0 ; k<65536-256; k+=16384)
    for (j=1 ; j<128; j++)
        for (i=k ; i<MIN(k+16384,65536-256) ; i++) //define a MIN function to return minimum
            A[i]=A[i]+A[i+j]; 

现在要计算缓存命中和未命中,一条缓存行可以容纳该数组的4个条目。 首次访问A [0]时,L1,L2和L3会丢失。 从内存中获取数据时,不仅要获取A [0],还需要获取A [1],A [2]和A [3],因为高速缓存行可以容纳所有这4个。

在同一指令中,您还访问A [i + j],在这种情况下将是A [1],这将是一个命中。 就像这样

First iteration
    A[i]   - A[0] - Miss
    A[i+j] - A[1] - Hit
Second Iteration
    A[i]   - A[1] - Hit
    A[i+j] - A[2] - Hit
Third Iteration
    A[i]   - A[2] - Hit
    A[i+j] - A[3] - Hit
Forth Iteration
    A[i]   - A[3] - Hit
    A[i+j] - A[4] - Miss // This will cause to fetch A[4], A[5], A[6], A[7]

图案会一直持续到L1被填充为止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM