`

cache line对内存访问的影响

阅读更多

        cache line对内存访问的影响很早就看到了,但是没有写过例子跑过,突然兴起就写了下,对这里第一个例子稍微做了改造。要注意jvm参数设置,新生代+老生代分配了2.4xG内存,新生代分了2G,eden区分了1.6g,从实际内存占用看,数组eden区使用了近1.1G的内存,剩下区域基本都是空的。另,demo是在mac上跑的。

/**
 * -Xms2500m -Xmx2500m -Xcomp -Xmn2g -XX:NewRatio=10
 * @author tianmai.fh
 * @date 2014-03-12 16:55
 */
public class CacheLineTest {

    public static final int COUNT = 3;
    public static void main(String[] args) {
        int[] arrs = new int[64 * 1024 * 1024 * 4];  //1g的空间,通过参数设值全放到了eden取,避免gc对测试结果的影响
        equivalentWidth(arrs);
        fullLoop(arrs);
    }

    /**
     * 全循环,看跨cache line和不跨cache line的时候,花费时间对比
     * @param arrs
     */
    public static void fullLoop(int[] arrs){
        int forLen = 256;
        int forAssembly = 0;
        while (forAssembly++ < COUNT) { // 循环三次,避免第一次代码优化前的影响
            for (int i = 1; i <= forLen; i *= 2) {
                long start = System.currentTimeMillis();
                for (int j = 0, size = arrs.length; j < size; j += i) {
                    arrs[j] = j * 3;
                }
                long end = System.currentTimeMillis();
                System.out.println("Full, factor: " + i + " spent " + (end - start) + " ms");
            }
            System.out.println();
        }
    }
    /**
     * 每次循环计算次数相同,比较跨cache line和不跨cache line的时候,花费时间的差异
     * @param arrs
     */
    public static void equivalentWidth(int[] arrs){
        int forLen = 256;
        int breakWidth = arrs.length / 256;
        int forAssembly = 0;
        while (forAssembly++ < COUNT) { // 循环三次,避免第一次代码优化前的影响
            for (int i = 1; i <= forLen; i *= 2) {
                long start = System.currentTimeMillis();
                int cnt = 0;
                for (int j = 0, size = arrs.length; j < size; j += i) {
                    arrs[j] = j;
                    if (++cnt > breakWidth) {     //每次循环就access这么多数据
                        break;
                    }
                }
                long end = System.currentTimeMillis();
                System.out.println("Equivalent Witdh, factor: " + i + " spent " + (end - start) + " ms");
            }
            System.out.println();
        }
    }
}

 结果,等量数据访问的情况:

Equivalent Witdh, factor: 1 spent 3 ms
Equivalent Witdh, factor: 2 spent 7 ms
Equivalent Witdh, factor: 4 spent 2 ms
Equivalent Witdh, factor: 8 spent 3 ms
Equivalent Witdh, factor: 16 spent 7 ms
Equivalent Witdh, factor: 32 spent 10 ms
Equivalent Witdh, factor: 64 spent 10 ms
Equivalent Witdh, factor: 128 spent 8 ms
Equivalent Witdh, factor: 256 spent 9 ms

Equivalent Witdh, factor: 1 spent 1 ms
Equivalent Witdh, factor: 2 spent 1 ms
Equivalent Witdh, factor: 4 spent 2 ms
Equivalent Witdh, factor: 8 spent 4 ms
Equivalent Witdh, factor: 16 spent 7 ms
Equivalent Witdh, factor: 32 spent 10 ms
Equivalent Witdh, factor: 64 spent 10 ms
Equivalent Witdh, factor: 128 spent 9 ms
Equivalent Witdh, factor: 256 spent 8 ms

Equivalent Witdh, factor: 1 spent 2 ms
Equivalent Witdh, factor: 2 spent 1 ms
Equivalent Witdh, factor: 4 spent 1 ms
Equivalent Witdh, factor: 8 spent 4 ms
Equivalent Witdh, factor: 16 spent 7 ms
Equivalent Witdh, factor: 32 spent 9 ms
Equivalent Witdh, factor: 64 spent 10 ms
Equivalent Witdh, factor: 128 spent 9 ms
Equivalent Witdh, factor: 256 spent 8 ms

 观察会发现,第二次和第三次运行,步长在1-8的时候,时间消耗是一个量级,大于等于16的时候,就是更高的量级了。

访问全部可访问数据的情况:

Full, factor: 1 spent 351 ms
Full, factor: 2 spent 178 ms
Full, factor: 4 spent 113 ms
Full, factor: 8 spent 111 ms
Full, factor: 16 spent 113 ms
Full, factor: 32 spent 77 ms
Full, factor: 64 spent 40 ms
Full, factor: 128 spent 17 ms
Full, factor: 256 spent 9 ms

Full, factor: 1 spent 351 ms
Full, factor: 2 spent 180 ms
Full, factor: 4 spent 113 ms
Full, factor: 8 spent 114 ms
Full, factor: 16 spent 111 ms
Full, factor: 32 spent 74 ms
Full, factor: 64 spent 40 ms
Full, factor: 128 spent 16 ms
Full, factor: 256 spent 9 ms

Full, factor: 1 spent 355 ms
Full, factor: 2 spent 178 ms
Full, factor: 4 spent 112 ms
Full, factor: 8 spent 111 ms
Full, factor: 16 spent 113 ms
Full, factor: 32 spent 76 ms
Full, factor: 64 spent 40 ms
Full, factor: 128 spent 17 ms
Full, factor: 256 spent 8 ms

 这个在步长为1的时候耗时比较多,2-8的时候是一个量级的。在大于8的时候,耗时基本上是以50%的比率在递减,随着步长变长,导致的cache line重新加载次数也在递减。

分享到:
评论

相关推荐

    cache from command line

    在IT行业中,缓存是一种优化数据访问速度的技术,它存储频繁访问的数据,以减少对主存储器或远程服务器的依赖,从而提高应用程序的性能。本文将深入探讨如何在命令行下操作缓存,以及涉及到的相关工具和技术。 在...

    blk.zip_C++_cacheline_model

    当处理器访问内存时,会一次性加载整个缓存行,而不是单个字节,这是为了减少内存访问的延迟。 C++ cacheline模型是指通过编程方式模拟CPU缓存行的行为,以优化多线程环境下的数据访问效率。在多核处理器中,不同...

    TIC6678多核编程Cache总结.pdf

    Cache是计算机架构中用于减少处理器访问内存所需平均时间的一个高速数据存储区域。它作为处理器和主存储器之间的临时缓存,能够极大地提高数据存取速率。下面详细地介绍Cache在TI-6678 DSP多核编程中的相关知识点: ...

    介绍L2 cache

    在现代计算机系统架构中,为了提高CPU处理速度与内存访问效率之间的协调性,引入了多级缓存机制,其中L2(Level 2)缓存是介于CPU与主内存之间的重要组成部分。L2缓存的主要作用是缓解CPU与主内存之间的速度差异问题...

    ARM920T的Cache

    写通策略在更新数据时立即写入主内存,而写回策略则是将数据暂存于Cache,只在满足特定条件(如Cache Line替换或数据失效)时才写回内存。 总的来说,ARM920T的Cache设计涉及虚拟地址映射、Tag的使用、数据定位以及...

    计算机中的cache工作原理解析

    Cache是一种高速缓存存储器,它位于中央处理器(CPU)和主内存之间,用于临时存储频繁访问的数据和指令,以减少处理器访问主内存的时间延迟。Cache的关键优势在于其高速存取能力和空间局部性原理,它利用程序运行时...

    stm32F7 _Cache_MPU

    如果没有命中,则为Cache miss,需要从实际的内存单元中取出数据,并更新到某条Cache-line中。写数据时,存在Write-through(写穿)和Write-back(写回)两种策略。Write-through策略下,每次写操作都同时更新Cache-...

    浅谈cache memory 王齐.pdf

    缓存的组成结构一般包括缓存行(Cache Line)或缓存块(Cache Block),这是缓存读取存储单元的基本单位。同时,缓存还包含标签(Tag)信息,用于标识存储的数据属于主存的哪个部分。缓存利用索引(Index)找到数据...

    Armv8/Armv9 cache深度学习

    它在主内存中保存项目的副本,减少缓慢的外部存储器访问时间的影响,提高了系统的潜在性能。下面是 Armv8/Armv9 cache 的深度学习知识点: 为什么要用 cache? Arm 架构刚开始开发时,处理器的时钟速度和内存的...

    支持监听一致性协议的2级Cache 研究及实践

    高速缓存作为主内存与处理器之间的桥梁,通过存储频繁访问的数据和指令来减少访问主内存的次数,从而提升系统性能。在多层次缓存体系中,二级缓存(L2 cache)因其较大的容量和相对较低的成本,扮演着至关重要的角色。...

    STM32F7x6培训_高速缓存 Cache.pdf

    当多个处理器或者处理器与DMA(直接内存访问)共享内存区域时,可能会导致缓存和主内存数据不一致的情况。为了解决这个问题,有多种策略可以采用,例如设置共享内存区域为不可缓存,或者采用一致性协议来确保数据的...

    cache_axi4.rar

    在计算机系统中,Cache是一种高速数据存储部件,用于暂时存储CPU频繁访问的内存数据,以减少主内存与CPU之间的数据传输延迟,提高系统的整体性能。本文将深入探讨基于AXI4(Advanced eXtensible Interface)总线协议...

    Cache相关资料手册

    2. **算法优化**:利用Cache局部性原理,尽量让连续的操作访问连续的内存区域。 3. **预加载技术**:在循环开始前预加载循环体内的数据到Cache,减少循环中的Cache缺失。 4. **实时性考虑**:在对实时性要求高的...

    p21 - p35 存储器金字塔结构

    CPU 访问数据时,会先访问 Cache,如果 Cache 中找不到数据,则会访问内存并将数据加载到 Cache 中。这种机制类似于使用内存作为硬盘的缓存,如果内存中有缓存的数据,则直接返回,否则要访问较慢的硬盘。 CPU ...

    Cachecloud文档

    Cachecloud 使用 Maven 构建,提供了 `local.properties` 和 `online.properties` 两种配置文件,分别适用于测试和线上环境。配置文件中包含了系统的各项设置,例如 SSH 用户名、密码等重要参数。 #### 三、系统...

    内存屏障原理解析

    由于现代计算机系统的CPU处理速度远超过内存访问速度,为了提高性能,CPU会采用缓存(Cache)技术,而这种技术往往会导致内存操作的重新排序,也就是所谓的指令重排。内存屏障的主要作用就是用来避免这种指令重排...

    cache memories

    因为CPU中执行指令和处理数据时,能够通过缓存存储器快速访问到需要的信息,通常可以节省75%到90%的内存访问时间,极大提高了机器的执行速度。 在标题“Cache Memories”以及描述“cache经典之作,对cache的结构...

    Zend Cache:一个实用的缓存php类库

    作为一个开源项目,它被广泛用于存储和检索经常访问的数据,避免了每次请求时对数据库或计算密集型操作的重复执行。本文将深入探讨Zend Cache的工作原理、主要功能、配置选项以及如何在实际开发中应用。 **1. 工作...

    行业分类-设备装置-一种cache中数据写入和读取方法、cache控制器.zip

    为了高效地管理Cache,通常采用分块(Block)的方式,每个块包含多个缓存行(Cache Line)。 数据的写入操作在Cache中有多种策略,其中最常见的是直写法(Write-Through)和回写法(Write-Back)。直写法是当数据...

    计算机组织与结构:版7_04_Cache Memory.ppt

    缓存的设计元素包括访问时间、命中率(Cache hit)、未命中率(Cache miss)、缓存行(cache line)、缓存集合(cache set)等。 缓存的工作机制涉及到映射方式,如直接映射(direct mapping)、关联映射...

Global site tag (gtag.js) - Google Analytics