飞腾CPU体系结构(十一)

1. 预取机制

飞腾CPU为了提升性能,支持从外部内存中预取数据到L1或L2缓存中。如果某个缓存块内容不在L1/L2缓存中,当该缓存块的某个地址单元被第一访问时,就会遇到内存墙,即飞腾CPU会从内存中将整个缓存块内容传输到缓存中。软件不能直接感知这种预取机制,但内存墙会导致第一次访问该缓存块的访存指令延迟比较大。

飞腾CPU还提供专门的预取指令PRFM,用于第一次访问新数据之前就提前通知缓存去内存预取相关缓存块内容,来避免内存墙延迟。

需要注意的是,这种预取指令PRFM只能用于系统主存类型,不能用于外设内存类型

2. 预取指令

除了数据地址之外,预取指令PRFM还指定了类型,目标和策略三种基本参数。

参数 说明
类型 pid 为了load预期
pst 为了store预期
目标 l1 L1级缓存
l2 L2级缓存
策略 keep 常规缓存策略
strm 流数据缓存策略

举个列子

指令 说明
prfm pldl1keep [x0] 将缓存块从内存预读到L1缓存中,并会在读访问完成后,还会保存一段时间
prfm pldl2strm [x0] 将缓存块从内存预读到L1缓存中,并会在读访问完成后,不久就失效了

3. 尤其要注意

不能想当然地认为,预取就是一定会优化,预期有时候不一定会有优化效果,使用不当还会造成性能损失。

4. copy_page汇编函数分析

4.1 输入参数描述

X0 目标虚拟地址
X1 源虚拟地址

默认参数为页长度参数,PAGE_SIZE

4.2 函数基本流程

  1. 先处理从源的第一个128字节的读
  2. 写上一个128字节/读下一个128字节的交替
  3. 最后处理到目标的最后128字节写

4.3 最原始的代码分析

ENTRY(copy_page)
第一部分:先处理从源的第一个128字节的读

函数一开始就预取第二个、第三个和第四个128字节,如果CPU硬件不支持预取指令,就用nop指令取代。
alternative_if ARM64_HAS_NO_HW_PREFETCH
prfm pldl1strm, [x1, #128]
prfm pldl1strm, [x1, #256]
prfm pldl1strm, [x1, #384]
alternative_else_nop_endif

第一个128字节的读取,这128字节没有必要预取,如果预取第一个128字节,性能不升反而下降
ldp x2, x3, [x1]
ldp x4, x5, [x1, #16]
ldp x6, x7, [x1, #32]
ldp x8, x9, [x1, #48]
ldp x10, x11, [x1, #64]
ldp x12, x13, [x1, #80]
ldp x14, x15, [x1, #96]
ldp x16, x17, [x1, #112]
/*x18用于记录还剩的字节数量*/
mov x18, #(PAGE_SIZE - 128)
add x1, x1, #128

下面属于第二部分了:写上一个128字节/读下一个128字节的交替

这部分是循环的主体部分
1:
subs x18, x18, #128
alternative_if ARM64_HAS_NO_HW_PREFETCH
prfm pldl1strm, [x1, #384] /此处的预取数据为3个128字节之后的数据了/
alternative_else_nop_endif
stnp x2, x3, [x0] /先写,这属于上一个128字节内的范围/
ldp x2, x3, [x1] /后读,这属于下一个128字节内的范围/
stnp x4, x5, [x0, #16]
ldp x4, x5, [x1, #16]
stnp x6, x7, [x0, #32]
ldp x6, x7, [x1, #32]
stnp x8, x9, [x0, #48]
ldp x8, x9, [x1, #48]
stnp x10, x11, [x0, #64]
ldp x10, x11, [x1, #64]
stnp x12, x13, [x0, #80]
ldp x12, x13, [x1, #80]
stnp x14, x15, [x0, #96]
ldp x14, x15, [x1, #96]
stnp x16, x17, [x0, #112]
ldp x16, x17, [x1, #112]
add x0, x0, #128
add x1, x1, #128
b.gt 1b /跳转到标签1处/

最后第三部分:处理到目标的最后128字节写

完成后函数返回
stnp x2, x3, [x0]
stnp x4, x5, [x0, #16]
stnp x6, x7, [x0, #32]
stnp x8, x9, [x0, #48]
stnp x10, x11, [x0, #64]
stnp x12, x13, [x0, #80]
stnp x14, x15, [x0, #96]
stnp x16, x17, [x0, #112]
ret

ENDPROC(copy_page)

飞腾CPU体系结构(十一)相关推荐

  1. 飞腾CPU体系结构(九)

    飞腾CPU体系结构(九) 向量访存指令主要包括LD1/ST1. LD2/ST2.LD3/ST3和LD4/ST4四种. LD1/ST1一般针对一个向量寄存器,也有两个.三个或四个向量寄存器的模式. LD ...

  2. 飞腾CPU体系结构(八)

    飞腾CPU体系结构(八)--标量访存指令 在阅读之前,请先查看<飞腾CPU体系结构(五)>的SIMD和浮点寄存器.飞腾CPU还提供了32个128 位SIMD和浮点寄存器,这32个128位寄 ...

  3. 飞腾CPU体系结构之虚拟地址

    飞腾CPU体系结构之虚拟地址 1. 基本概念 虚拟地址:程序运行时指令和数据对应的地址. 虚拟地址空间:一个进程运行时指令和数据能访问到的虚拟地址范围. 注意事项: 每个进程拥有自己的虚拟地址空间,进 ...

  4. 飞腾CPU体系结构简单介绍(一)

    第一章 飞腾CPU体系结构简介 ARM体系结构是一种精简指令集体系结构RISC,具有以下基本特点:通用寄存器数量较多:采用统一寻址模式,系统主存和外设分布在CPU物理地址空间的不同范围:采用load/ ...

  5. 飞腾CPU体系结构(十)

    飞腾CPU体系结构(十) 1.高速缓存模型 为了优化整体性能,飞腾CPU芯片内部提供L1高速缓存和L2高速缓存,有些飞腾CPU也提供芯片内部的L3高速缓存,本节不对这个情况进行赘述. 靠近流水线的高速 ...

  6. 飞腾CPU体系结构之低功耗指令

    飞腾CPU体系结构之低功耗指令 WFE和WFI指令 当飞腾CPU核执行两类指令:WFE或WFI之后,CPU核会进入低功耗状态: 一旦CPU核进入低功耗状态,就要一直保持低功耗状态直到相应的唤醒事件发生 ...

  7. 飞腾CPU体系结构(十二)

    飞腾CPU体系结构(十二) 1. CPU物理地址空间 飞腾CPU支持的物理地址宽度为44位,物理地址空间实际上只有16TB.系统主存(芯片外部内存)和IO外设(例如SoC设备.PCIe设备)都在这个物 ...

  8. 飞腾CPU体系结构(十四)

    飞腾CPU体系结构(十四) 1. MMU原理 MMU的大致工作原理是: 64位虚拟地址首先分成虚拟页帧号和页内偏移量两部分,虚拟页帧号即页表项索引:根据页表项索引,在进程的页表里查找到对应页表项,然后 ...

  9. 飞腾CPU体系结构(五)

    飞腾CPU体系结构(五)-- 通用寄存器 1. 64位通用寄存器 在AArch64执行状态下,飞腾CPU提供31个64位通用寄存器Xn(n=0/1/-/30),其中X30用作跳转链接寄存器. 某些指令 ...

最新文章

  1. python事件处理函数_事件驱动的简明讲解(python实现)
  2. ​语义分割损失函数​
  3. 【HTML学习】——HTML常见标签属性和方法介绍
  4. 360安全浏览器兼容模式怎么设置_360浏览器及安全卫士怎么减少广告弹出?
  5. 【备忘录】c++ 整形浮点=字符串 类型转换
  6. 10个前端开发人员必须知道的CSS框架
  7. 7 个令人兴奋的 JavaScript 新特性
  8. SQLPROFILER计算机用户操作数据SQL记录跟踪
  9. 智慧零售怎么做客流统计和客流分析?|图普客流统计系统
  10. Ubuntu(debian) 程序 dep 打包
  11. 星际迷航7:未来之城
  12. AR和VR是什么,浅看一下吧
  13. 一些常用意大利语 1000个单词
  14. 如何理解移动数据和移动计算
  15. vmware虚拟机网络配置详解
  16. android音频降噪webrtc
  17. php删除头尾空,分享php中去除头尾空格的2种方法
  18. Java---设计【运动会成绩管理系统】
  19. epub 免费转换网站
  20. 基于EGE的双人象棋

热门文章

  1. 修复 Outlook 数据文件
  2. 背包问题全解 <y总AcWing>
  3. 区区几行代码,就能全面实现 Python 自动探索性数据分析
  4. [C语言] 利用阶乘公式编程计算e的近似值,直到最后一项的绝对值小于10-5时为止,输出e的值并统计累加的项数。输出e值要求小数点后必须保留6位有效数字(四舍五入),不足补零。
  5. 搜索引擎的三个时代及第三代搜索引擎的商业前景
  6. WDA基础 弹窗 弹视图 报消息
  7. 实训四#4.1霍格沃茨找零
  8. 对DirectX/COM接口的挂钩
  9. 我们是如何实现边缘计算与网络动态加速的?
  10. 英语学习 介词短语做定语