精华内容
下载资源
问答
  • Cache line

    千次阅读 2013-05-23 21:35:44
    一个L1 DATA CACHE相当于一块小的内存,我们假设它为16K大,它会与一般物理内存交互。  它和内存交互一般一次传输16个字节(32个字节),...这些一次被传输的字节被称为cache line。  ------------------------------
    一个L1 DATA CACHE相当于一块小的内存,我们假设它为16K大,它会与一般物理内存交互。 
    
    它和内存交互一般一次传输16个字节(32个字节),也就是: 
    CACHE 字节0-15一次写到/读取物理内存 ,字节16-31一次写到/读取物理内存.32-47 ... ... 
    这些一次被传输的字节被称为cache line。 
    -------------------------------------------------------------- 
    另外,cache写到物理内存的位置不是任意的, 
    我们假定内存为64K,那么cache地址0的数值只能和物理内存的地址0, 16K, 32K交互;cache地址1的数值只能和物理内存的地址1, 16K+1, 32K+1交互 
    。。。 。。。cache地址16K-1的数值只能和物理内存的地址6K-1, 16K+16K-1, 32K+16K -1交互 
    这说明了两点: 
    (1)假设对象A的一个字段长为16个字节,如果它放在物理地址 0-15,那么它将和cache的第一个cache line 交互,如果放在物理地址 8-23,那么 
    如果CPU要访问这个字段,必须将第一个和第二个cache line 都读入,才能获得这个字段的信息,显然这样速度慢,所以一般字段需要cache line对齐, 
    在这里就是16个字节对齐。 
    (2)关于colour 
    一般一个对象某些字段访问频繁些。 
    假定一个cache(这个cache指slab的cache,不是上面提到CPU的L1 DATA CACHE)占用5个页面也就是20K. 
    假定其中对象大小为32个字节,前16个字节访问频繁许多。 
    假定对象A起始于物理地址0,对象C起始于31,对象B起始于物理地址16K,那么对象A,对象B的前16个字节都和第一个cache line 交互,后16个字节都和第二个cache line 交互 
    对象C前16个字节与第3个cache交互。 
    我们假定内核访问A后就访问B,再访问A,交错进行,并且前16个字节次数都是50次,后16个为10次。C也是。 
    这样第一个cache line 要交互100次,第二个20次,一共120次。 
    如果让对象B向后移动16个字节,也就是对象B的前16个字节与第二个cache line 交互,后16个与第3个交互。 
    那么第一个为2次,因为只有开头结尾2次要与内存交互,其它每次都在L1 DATACACHE 中写就可以了。第2个cache line为20次左右(后面的只须在CACHE中读写),第3个cache line为20次, 
    3个line一共才41次,你不妨仔细模拟一下。 
    所以进行错位能降低CACHE的交互次数,从而提高CPU处理速度能力。 
    这个错位(也就是上面的16个字节)就是colour.
    展开全文
  • cache line

    2011-11-24 17:28:09
    view plain 一个L1 DATA CACHE相当于一块小的内存,我们假设它为16K...CACHE 字节0-15一次写到/读取物理内存 ,字节16-31一次写到/读取物理内存.32-47 ... ...    这些一次被传输的字节被称为cache
     
    
    1. 一个L1 DATA CACHE相当于一块小的内存,我们假设它为16K大,它会与一般物理内存交互。   
    2. 它和内存交互一般一次传输16个字节(32个字节),也就是:   
    3.   
    4.   
    5. CACHE 字节0-15一次写到/读取物理内存 ,字节16-31一次写到/读取物理内存.32-47 ... ...   
    6.   
    7. 这些一次被传输的字节被称为cache line。   
    8. --------------------------------------------------------------   
    9.   
    10. 另外,cache写到物理内存的位置不是任意的,   
    11. 我们假定内存为64K,那么cache地址0的数值只能和物理内存的地址0, 16K, 32K交互;cache地址1的数值只能和物理内存的地址1, 16K+1, 32K+1交互   
    12. 。。。 。。。cache地址16K-1的数值只能和物理内存的地址6K-1, 16K+16K-1, 32K+16K -1交互   
    13.   
    14. 这说明了两点:   
    15.   
    16. (1)假设对象A的一个字段长为16个字节,如果它放在物理地址 0-15,那么它将和cache的第一个cache line 交互,如果放在物理地址 8-23,那么   
    17. 如果CPU要访问这个字段,必须将第一个和第二个cache line 都读入,才能获得这个字段的信息,显然这样速度慢,所以一般字段需要cache line对齐,   
    18. 在这里就是16个字节对齐。   
    19.   
    20.   
    21. (2)关于colour   
    22.   
    23.   
    24. 一般一个对象某些字段访问频繁些。   
    25. 假定一个cache(这个cache指slab的cache,不是上面提到CPU的L1 DATA CACHE)占用5个页面也就是20K.   
    26. 假定其中对象大小为32个字节,前16个字节访问频繁许多。   
    27.   
    28. 假定对象A起始于物理地址0,对象C起始于31,对象B起始于物理地址16K,那么对象A,对象B的前16个字节都和第一个cache line 交互,后16个字节都和第二个cache line 交互   
    29. 对象C前16个字节与第3个cache交互。   
    30.   
    31. 我们假定内核访问A后就访问B,再访问A,交错进行,并且前16个字节次数都是50次,后16个为10次。C也是。   
    32.   
    33. 这样第一个cache line 要交互100次,第二个20次,一共120次。   
    34.   
    35. 如果让对象B向后移动16个字节,也就是对象B的前16个字节与第二个cache line 交互,后16个与第3个交互。   
    36. 那么第一个为2次,因为只有开头结尾2次要与内存交互,其它每次都在L1 DATACACHE 中写就可以了。第2个cache line为20次左右(后面的只须在CACHE中读写),第3个cache line为20次,   
    37. 3个line一共才41次,你不妨仔细模拟一下。   
    38.   
    39. 所以进行错位能降低CACHE的交互次数,从而提高CPU处理速度能力。   
    40.   
    41. 这个错位(也就是上面的16个字节)就是colour.  

    随着计算机的飞速发展,虽然内存变得越来越大,但是在速度上面却跟不上cpu的发展。为了保证系统整体性能,cache的地位变得越来越重要。

    Cache的原理很简单,就是根据程序访问的局部性,把最近访问过的数据或者程序缓存在一块速度更快的内存中。
    现在的cache命中率一般都会超过90%,这样就解决了 越来越快的cpu和 越来越大却相对慢的内存之间的配合问题。

    为了完成这个任务,简单的方法就是把cache分成许多行(line),每一行分为两部分,一部分是Data,保存缓存的数据,另一部分是Tag,保存这这些数据在内存中的地址信息。每行之间没有关系,这样每次cpu访问的时候,把地址给每一行的tag进行比较,如果有相同即为命中。这就是“全相联Cache ”。
    这种方式的缺点是,每次内存访问都要跟每一行的tag进行比较,造成结构上的复杂。
    假设cache大小为64KB,每一行的data是32B,那么就有2048 line, 一次内存访问要跟每一个line的tag进行比较,才能确定是否命中,显然太复杂了。

    为了解决这个问题,就对其进行改进,改进的结果就是直接映像Cache。 这种方式把访问内存的地址分为3个部分。高位地址,低位地址,和行内部地址。比如,地址为32位,cache大小为64KB, 每行的data大小为32B。
    那么地址位如下分配:
    高位地址范围为:[31-16], 低位地址范围为[15-5], 行内部地址范围为[4-0]
    比如:对于地址 0x12345678, 0x1234为高位地址, 0x567 >> 1 为低位地址, 0x18为行内地址
    在访问该内存的时候,首先用低位地址作为行号来检索 0x567 >> 1 = 0x293 就是第659行cache,找到这行cache用0x1234与其tag内的地址比较,相等则命中。

    很显然这种结构,非常简单,只需要跟一行进行比较就可以了。不过,它的缺点是每一行对应内存中很多不同的地址,而且这些地址只能缓存在这一行中。
    比如,当上面那个地址缓存了之后,我们又要访问地址0x43215678, 这时候还是找到第659行cache,但是只能将0x12345678的数据作废,重新读入新地址的数据。如果,这种情况频繁发生,会大大降低系统效率。

    为了解决这个问题就出现了改进的“组相联Cache“,组相联Cache 把cache分成几个独立的组。这样,虽然一个line可以对应内存中的很多地址,但是内存的这些地址可以存在不同的组中,这样碰到上述那种情形的概率就非常低了。

    举个例子:64K cache分为4组,每组16K,每行32B,每组就有512行。
    那么地址分配方式就变为:
    高位地址范围为:[31-14], 低位地址范围为[13-5], 行内部地址范围为[4-0]
    0x12345678 地址就对应到一组中的第147行,虽然地址0x43215678也对应在147行,但是他们可以分别存放在4组中的任意两组而互不影响。从效果上,和全相联Cache基本相当,却在结构上简单很多。所以,是当前常用的方式。

    最近,需要用到cache看了一些介绍,做个简单的笔记。
    这是一个基本的工作原理,实际上的cache要复杂的多,比如 write-through和write-back问题,cache aliases问题等等,而且不同的cpu cache的配置方式也各不相同,以后有机会再详细记录。
    展开全文
  • cache line大小

    千次阅读 2019-07-12 16:53:43
    我们都知道cache的作用是把主存储器的数据到寄存器的一个缓冲区,被称为高速缓存,其能够大大提高程序的性能,那么cache的性能受cache line size的影响很大。cache line大小到底有多大,其实它和和内存的一个参数...

    我们都知道cache的作用是把主存储器的数据到寄存器的一个缓冲区,被称为高速缓存,其能够大大提高程序的性能,那么cache的性能受cache line size的影响很大。cache line大小到底有多大,其实它和和内存的一个参数关系比较大,就是ddr2,ddr3,ddr4:

    1. ddr2内存的cache line带宽是4位,cache line大小是16Byte;
    2. ddr3之后内存的cache line带宽是8位,cache line大小是256Byte;

     

    展开全文
  • CacheLine对齐

    千次阅读 2020-02-27 13:38:00
    CacheLine 总所周知,计算机将数据从主存读入Cache时,是把要读取数据附近的一部分数据都读取进来 这样一次读取的一组数据就叫做CacheLine,每一级缓存中都能放很多的CacheLine 多核CUP L1、L2、L3指一级缓存,二...

    CacheLine

    总所周知,计算机将数据从主存读入Cache时,是把要读取数据附近的一部分数据都读取进来
    这样一次读取的一组数据就叫做CacheLine,每一级缓存中都能放很多的CacheLine
    在这里插入图片描述

    多核CUP

    在这里插入图片描述

    • L1、L2、L3指一级缓存,二级缓存,三级缓存
    • CUP中的每个核均可单独处理一个线程
    • 每个核公用L3

    超线程

    一个核中有多套PC和Register,他们公用一个ALU,这样一个核可以处理多个线程
    如四核八线程就由此而来

    Volatile的可见性

    在这里插入图片描述

    1. x被标记了volatile
    2. 两个线程运算时是将缓存中要被运算数所在的整条CacheLine复制到线程自己的存储,并进行运算,运算之后写回缓存
    3. 假设线程1修改了x并写回,但是线程2中的x还是未修改的x
    4. 由于x被标记了volatile,在线程1写回x缓存时,线程1会通知线程2重新读取缓存中的x

    伪共享

    在这里插入图片描述

    1. 线程1、2公共使用同一个CacheLine
    2. x、y同一个CacheLine
    3. x、y都是volatile
    4. 如果线程1不断修改x线程2不断修改y,那么修改的时候线程1就要不断通知线程2更新x线程2就要不断通知线程1更新y
    5. 这样的不断通知不断重新读取很浪费性能
    6. 这就叫伪共享

    CacheLine对齐

    多线程会有上面的伪共享的问题,如果在缓存读取数据到CacheLine,两个volatile的数被读取到不同的CacheLine中的话,就不需要一直通知另一个线程更新数据了,因为另一个线程根本没有这个数据
    在这里插入图片描述
    那么如何让两个数据一定在不同的CacheLine呢,方法就是Cache Line对齐

    一般一个CacheLine64位,也就是8long,我们可以把x定义为long,并同时定义7个没有用的long变量,这样这8个数就在同一个CacheLine
    之后再定义yy自然也就在下一个CacheLine中了
    在这里插入图片描述这就叫CacheLine对齐,这样两线程就不会出现伪共享的现象了

    展开全文
  • adjacent cache line prefetch

    2021-07-08 06:55:13
    adjacent cache line prefetch预读取邻近的缓存数据. 计算机在读取数据时,会智能的认为要读取的数据旁边或邻近的数据也是需要的, 那么其在处理的时候就会将这些邻近的数据预先读取出来, 这样会大大加快读取速度.BIOS...
  • 计算机缓存Cache以及Cache Line详解

    万次阅读 多人点赞 2018-06-06 10:56:36
    一个cache被分为S个组,每个组有E个cacheline,而一个cacheline中,有B个存储单元,现代处理器中,这个存储单元一般是以字节(通常8个位)为单位的,也是最小的寻址单元。因此,在一个内存地址中,中间的s位决定了该...
  • ____cacheline_aligned instructs the compiler to instantiate a struct or variable at an address corresponding to the beginning of an L1 cache line, for the specific architecture, i.e
  • Cacheline技术浅析

    万次阅读 2015-09-29 11:23:42
    最近组内有个同事在做cacheline相关的特性,向其学习了一下,对原来的cacheline的理解更近了一步。这里总结一下。请彭超大侠有空的话帮忙在斧正一下 Cache就是对内存的内容进行缓存的一个硬件。cache和内存的...
  • cache line技术浅析

    千次阅读 2017-08-24 17:20:11
    最近组内有个同事在做cacheline相关的特性,向其学习了一下,对原来的cacheline的理解更近了一步。这里总结一下。请彭超大侠有空的话帮忙在斧正一下 Cache就是对内存的内容进行缓存的一个硬件。cache和内存的...
  • cpu cache line 原理

    2016-09-10 16:09:48
    cpu的cache通常较大, 比如 128KB, 被划分为多个有固定大小的cache line, cache line通常是32Byte或64Byte. CPU内部的cache种类, 至少有三种 1) 指令cache 2) 数据cache 通常有多级 multi-level 3) TLB 加速虚拟地址...
  • 存储器 理想的存储器:速度与CPU的速度一样,这样CPU执行命名就不会受到存储器速度的限制....cache分成多个组,每个组分成多个cache line,linesize是cache的基本单位,从主存向cache迁移数据都是按照linesiz
  • cache line 优化

    2013-08-27 13:33:05
    多线程编程时,为了避免锁,有时会采用数据多份copy的方式,但是如果把这些数据放在了同一个cache line里面,性能得不到提高,是因为cache line的false sharing问题,可以看下这篇文章...
  • CPU的cache line原理

    2017-08-24 17:18:32
    cpu的cache通常较大, 比如 128KB, 被划分为多个有固定大小的cache line, cache line通常是32Byte或64Byte. CPU内部的cache种类, 至少有三种 1) 指令cache 2) 数据cache 通常有多级 multi-level 3) TLB 加速...
  • CPU Cache line

    千次阅读 2012-07-25 20:45:17
    一个L1 DATA CACHE相当于一块小的内存,我们假设它为16K大,它会与一般物理内存交互。 它和内存交互一般一次传输16个字节(32个字节),也就是: ...这些一次被传输的字节被称为cache line。 ------------------------
  • 文章目录多级缓存-填补内存读写速度与CPU计算速度的鸿沟局部性原理与Cache Line伪共享对齐填充@Contended备注尾巴 对于一个程序来说,几乎所有的计算任务都不可能仅通过CPU的计算就可以完成,它至少要和内存打交道:...
  • dpdk学习之cache line设计

    千次阅读 2017-07-27 23:25:24
    此文章主要是整理的网上的资料,转载 ... ... 最近公司框架需要优化,接触到了false sharing。  一、基础概念介绍 ...缓存系统中是以缓存行(cache line)为单位存储的,当多线程修改互相独立的变量时
  • 为了上cache机制在程序运行时失效,因此将数据大小设置为cacheline的大小,避免cache命中,但是有关cacheline大小的信息,一直不知道怎么获取,于是在linux中查找,发现实验室路径下的一些关键信息。 在/sys/...
  • 一、cacheline概念 cpu利用cache和内存之间交换数据的最小粒度不是字节,而是称为cacheline的一块固定大小的区域,详细信息参见wiki文档: http://en.wikipedia.org/wiki/CPU_cache#Cache_entry_structure ...
  • Cache line的解释

    千次阅读 2014-01-13 15:16:21
    转自:... The block of memory that is transferred to a memory cache. The cacheline is generally fixed in size, typically ranging from 16 to 256
  • 地址:CPU Cache Line伪共享问题的总结和分析 Table of Contents 1. 关于本文 2. 背景知识 2.1 存储器层次结构 2.2 多核架构 2.3 NUMA 架构 Cache DRAM Device 2.4 Cache Line 2.5 Cache 的结构 2.6 ...
  • 缓存局部性   由深入理解计算机操作系统一书中,我们可以知道,计算机读取数据的时候并不是直接访问内存。而是先访问缓存,如果缓存不中,再去访问TLB,然后如果不...CacheLine是Cpu Cache的最小缓存单位,x86结...
  • bios 通过pptt table将cache信息告诉os因此可以通过查询sys文件系统来查询cacheline的大小. linux-28ef:~ # cat /sys/devices/system/cpu/cpu1/cache/index0/type Data linux-28ef:~ # cat /sys/devices/system/cpu...
  • linux系统中缓存行 [ cacheline ] 默认值: 64byte 为了解决计算机系统中主内存与 CPU 之间运行速度差问题,会在 CPU 与主内存之间 添加一级或者多级高速缓冲存储器( Cache)。这个 Cache 一般是被集成到 CPU ...
  • 问题:如何统计缓存的set和cache line的写命中情况?解决方法: 1.缓存set访问写命中,计数一次,cache line写命中,计数一次;2.在gem5中的src/mem/cache/base.hh中有incHitCount()函数,它是统计缓存命中情况的,...
  • 跨平台获取CPU cache line大小的方法

    千次阅读 2013-09-09 21:26:02
    Reprint:... 注意获得的cache line大小单位为字节。 #ifndef GET_CACHE_LINE_SIZE_H_INCLUDED #define GET_CACHE_LINE_SIZE_H_INC
  • 查看cache line

    千次阅读 2017-03-11 14:28:01
    cat /sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 171,696
精华内容 68,678
关键字:

cacheline