Caching 一级缓存、二级缓存和三级缓存中的缓存命中数和缓存未命中数

Caching 一级缓存、二级缓存和三级缓存中的缓存命中数和缓存未命中数,caching,cpu-architecture,cpu-cache,Caching,Cpu Architecture,Cpu Cache,以下代码将在具有以下缓存结构的CPU上运行: 一级缓存:1KB 二级缓存: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]; 无符号整数A[65536]; int i,j; 对于(i=0;i假设unsigned int为4字节,数组大小为4*65536=256KB。三级缓存最

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

  • 一级缓存:1KB

  • 二级缓存: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];
    
    无符号整数A[65536];
    int i,j;
    
    对于(i=0;i假设
    unsigned int
    为4字节,数组大小为4*65536=256KB。三级缓存最多只能容纳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]; 
    

    A模式持续到L1填充。

    交叉发布:,。请。每个社区都应该诚实地回答问题,不会浪费任何人的时间。您最近的编辑没有任何意义,除了使标题毫无意义和丢失一些信息外,缩小数组会使代码访问超出范围。请修复还是滚-back@Leeor很抱歉,发生了一些未删除的情况。我将其转换为起始版本。
    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]; 
    
    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]