当ARM架构最初被开发时,处理的时钟速率和内存的访问速率基本相当。现在处理器core更加复杂且是内存时钟的指数级倍。但外部总线和内存设备的频率却没有达到这个范围。实现小块的速率可以达到core的片上SARM是可能的,但是这种RAM与标准DRAM块相比昂贵很多,标准DRAM比这种RAM容量大得多。在很多ARM处理器系统中,访问外部内存需要10倍甚至100倍的core周期。

Cache就是小块的,快速的内存,它位于core和主内存之间。它保存着主内存的拷贝。访问cache明显快于访问主内存。当core访问(读或写)某个特殊地址,它首先在cache中查找。如果在cache中找到这个地址,它使用cache中的数据,而不是发起主内存的访问。这能通过减少缓慢的外部内存访问次数来明显提升系统潜在的性能。它也通过避免驱动外部信号来减少系统功耗。

实现了ARMv8-A架构的处理器通常实现了二级或更多级的cache。这通常意味着处理器对每个core有小的L1指令和数据cache。Cortex-A53和Cortex-A57处理器正常来说实现了两级或更多级的cache,即小的L1指令和数据cache,和大的统一的L2 cache(它被一个cluster中的多个core共享)。另外,也可以有外部L3 cache作为外部硬件块被多个cluster共享。

初次访问会将数据提供给cache,并不会比正常访问快。后续对已缓存的数据的访问将快于正常访问,从此时性能会增加。core的硬件会检查cache中的所有获取的指令和读写的数据,虽然你需要标记部分内存,比如包含外设的作为non-cacheable。因为cache仅存储主内存的一个子集,你需要一种方式来决定是否这个地址是你在cache中想要查找的。

有时cache中的指令和数据和外部内存中的数据可能不一样,这是因为处理器可以更新cache中的内容,但并没有写回到主内存中。与此相对,agent可能在core获取到自己的拷贝后更新主内存。这个问题就是一致性问题,将在后续章节中描述。当你有多个core或内存agent(如外部的DMA控制器)时这将成一个特殊的问题。

1 Cache术语

在冯诺依曼架构中,单个cache用于指令和数据(统一cache)。修改的哈佛架构有分开的指令和数据总线,因此有两个cache:指令cache(I-cache)和数据cache(D-cache)。在ARMv8处理器中,有不同的指令和数据L1 cache,但有统一的L2 cache。

Cache要求能够缓存地址,数据和一些状态信息。

下面为使用的一些术语的简单介绍,以及说明缓存基本结构的图表:

(1)tag为存储在cache中的内存地址的一部分,它来区分与数据线相关的主内存地址。

64bit地址的高位说明了来自主内存中的信息的cache的位置,它是tag位。总共的cache大小为它能够保存数据的大小,虽然RAM用于保存tag值。但是,tag占用了cache的空间。

(2)对每个tag地址保存一个字是没有效率的,因此通常多个位置为一组使用相同的tag。这里逻辑块为cache line,它为最小的cache可加载单元,内存中连续的一块字。当它包含可缓存的数据或指令时cache line被认为valid,否则被认为invalid。

与每个数据线相关的是一个或多个状态位。通常,你有一个有效位,它标识数据线包含着可以使用的数据。这意味着地址tag表示一些真实的值。在数据cache中,你可以也有一个或多个dirty位来标识是否cache line包含数据,但数据和主存中的数据不一样。

(3)index为内存地址的一部分,它决定地址可以在哪个cache line中被找到。

地址的中间位或index区分cache line。index被用来作为cache RAM的地址且不需要作为tag一部分。这将在本章节的后面详细介绍。

(4)way为cache的细分,每中方式的大小相等,并以相同的方式索引。Set由共享某个index的所有way的cache line组成。

(5)这意味着地址的最后几位,称为offset,并不要求被存储在tag。你要求整个line的地址,而不是在line中的每个byte,因此5或6个最低位通常为0。

1.1 组相连cache和路

ARM核的cache通常使用一组相连的cache实现。这明显减少直接映射缓存出现cache thrashing的可能性,提高了程序执行速度,赋予更多的确定性执行。它是以增加硬件的复杂度和轻微的功耗为代价,因为多个tag在一个周期被比较。

在这种cache组织中,cache被分为很多相同大小的片,称为way。一个内存位置可以映射到way而不是cache line。地址的index域继续用于选择特定的line,但是现在它只想每个way中的单个line。通常,每个L1 数据cache有二个或四个way。Cortex-A57有3路L1指令cache。通常对于L2 cache,它有16路。

一个外部L3 cache的实现,如ARM CCN-504 Cache Coherent Network,可以有大量的way,它们高度相关,由于它们更大的size。有相同的index值的cache line属于同一个组。为了判断是否命中,你必须检查set中每个tag。

如下图为2路cache。来自地址0x00,0x40或0x80的数据可能在line0中被找到,但并不是在两个cache路中同时被找到。

增加cache的相连减少了thrashing的可能性。最理想的为全相连cache,任何主存的位置可以映射到cache中,但是,构建这种cache只在非常小的cache时实用,比如MMU TLB。在实际情况中,对于8路以上的性能改进最小,16路关联对较大的L2缓存更有用。

ARMv8-A编程指导之Caches(1)相关推荐

  1. ARMv8-A编程指导之Caches(2)

    1.2 Cache tags和物理地址 每个cache line都有一个tag与之相关,该tag记录了与cache line相关的外部内存的物理地址.Cache line的大小是由实现定义的.但是,由 ...

  2. arm汇编和c语言混合编程实验报告,实验三C语言和ARM汇编混合编程指导书.doc

    实验三C语言和ARM汇编混合编程指导书 实验三 1. 实验目的 掌握C语言和ARM汇编混合编程方法. 2. 实验设备 硬件:PC 机 一台 软件:Windows98/XP/2000 系统,ADS 1. ...

  3. 增量式编码器c语言,关于增量式编码器编程指导及使用方法的介绍

    关于增量式编码器编程指导及使用方法的介绍 文章来源:http://www.kindele.com/  发布时间:2016/05/13    点击数: 在目前的编码器市场,增量式编码器主要被分为三种类型 ...

  4. CUDA C 编程指导(一):CUDA介绍

    虽然高清实时的3D图像/视频要求日益不能满足市场需求,但是可编程的图像处理单元(GPU)已经演变成具有巨大计算能力和超高存储带宽的高度并行.多线程的多核处理器,如下图, CPU和GPU之间的浮点性能差 ...

  5. c语言程序设计 李俊,深入浅出C语言程序设计(第2版)习题集和编程指导

    本书是与清华大学出版社出版的<深入浅出C语言程序设计(第2版)>(书号: 9787302391791)一书相配套的辅助教材.书中对主教材各章的重点和难点进行总结,并对各章课后习题进行精讲, ...

  6. ARMv8 Cortex-a 编程向导手册学习_2.ARMv8-A 寄存器

    /* TODO 本系列文章是对 ARMv8 Cortex-a 系列编程向导手册拙劣的翻译和注解,若有出入,以官方文档为准 */ Chapter 4 ARMv8 寄存器 AArch64 执行状态提供了 ...

  7. ARMv8 Cortex-a 编程向导手册学习_6.aarch64 应用移植注意事项与 AArch64 ABI

    /* TODO 本系列文章是对 ARMv8 Cortex-a 系列编程向导手册拙劣的翻译和注解,若有出入,以官方文档为准 */ Chapter 8 移植到 A64 这一章节不打算对如何编写可移植代码做 ...

  8. c语言错误指导,c语言编程指导.pdf

    高质量C++/C 编程指南 文件状态 文件标识: [ ] 草稿文件 当前版本: 1.0 [ √] 正式文件 作 者: 林锐 博士 [ ] 更改正式文件 完成日期: 2001 年7 月24 日 高质量C ...

  9. matlab与vc混合编程指导书.doc,vc与matlab混合编程—基于com.doc

    vc与matlab混合编程-基于com.doc VC与MATLAB混合编程基于COM2010年03月21日星期日1118注意旨在提供一份VC调用MATLAB的快速试验参考和一些实际经验,不保证所有内容 ...

  10. 【MapReduce】编程指导思想

    MapReduce编程思想共分为8步: map阶段:2步 shuffle阶段:4步 reduce阶段:2步 Map阶段 第一步: 设置inputFormat类,将数据切分为k-v对,输入到第二步: 第 ...

最新文章

  1. 崛起的超级智能:是否会是下一个“麦克卢汉式”预言?
  2. 使用visual studio code调试php代码
  3. [Python人工智能] 五.theano实现神经网络正规化Regularization处理
  4. linux操作系统adsl 上网设置,Linux操作系统下ADSL拨号上网详细步骤
  5. MySQL count()函数
  6. Java--File文件操作
  7. c语言讲输入退回缓冲区_开始之前的结束-如何不退回输入错误的用户电子邮件...
  8. 基于RANSAC的激光点云分割
  9. 在QML应用中实现threading多任务
  10. php 字母数字混合排序,JavaScript_基于JS实现数字+字母+中文的混合排序方法,在上篇文章给大家介绍了JavaScr - phpStudy...
  11. BZOJ4199 NOI2015品酒大会(后缀树)
  12. android 免root自动滑动,无需root自动点击屏幕软件
  13. 常见网络安全威胁及防范
  14. 谷歌地图地名显示繁体字_谷歌地图卫星地图怎么取消地名还有路线
  15. centos8安装ss发生错误failed to install pthon
  16. spark入门demo
  17. 程序员不得不了解的硬核知识大全
  18. 初中英语和计算机融合的教学案例,初中英语与信息技术整合教学案例
  19. linuxprobe
  20. 第 9 章 Part / Chapter / Section

热门文章

  1. 关于分辨率,你该知道这些!
  2. Java之HashMap系列--保证线程安全的方法
  3. 分享WPS office 2019 卸载方法:
  4. C/C++ C语言定义结构体的几种方法
  5. uint32 t java_数据类型 -- uint32_t 类型
  6. 终止代码:DRIVER_IRQL_NOT_LESS_OR_EQUAL 失败的操作:CH341S64.SYS
  7. Java 拾遗补阙 ----- Switch case语句
  8. 3dmax测试软件自动关闭,打开3dmax出现软件问题导致3dmax意外关闭的两种解决方法...
  9. 代码审查工具rietveld的安装与使用(一)
  10. java金额元与万元转换_java中金额元转万元工具类代码实例