RISC-V SiFive U64内核——L2 Prefetcher预取器

简介: RISC-V SiFive U64内核——L2 Prefetcher预取器

L2 prefetcher是U64内核新增的功能,U54内核没有这个功能。打开L2 prefetcher功能后,当访问大片内存,同时dcache中没有缓存时,可以提高访问速率。经验证,访问内存的速率可以提高大概一倍。

L2 Prefetcher简介

SiFive L2 预取器是一个 per-hart 设备,它允许 L2 根据内核中的 harts 进行的数据访问模式来执行对内存的访问。

例如,如果一个 hart 正在读取一个大数组的每 100 个字节并且L1-dcache中没有缓存,预取器就会将适当的内存地址分配给 L2 缓存,使得后续对数组的访问产生L2 缓存命中。这样就减少了整体访问数组的时间并提高应用程序的性能。

U64内核包含四个 L2 预取器实例。它们的地址如表141所示

操作

L2 Prefetcher 可以监控每个 hart 八个不同的数据流,其中一个流由一个基地址和内存地址之间的跨度组成。在可能的情况下,预取会自动发布到内存系统,并且 10 个条目的预取队列会在访问发布之前保存这些访问。就缓存行而言,预取(或最大跨步长度)的范围由 additionalCtrl.window 寄存器设置。例如,如果将其设置为 0x4,则 步长为 256 字节或更大的流将被忽略(假设每个缓存行为 64 字节)

每个流的初始预取数(或预取距离)由 basicCtrl.initialDist 设置。预取距离将根据预取的成功和预取的整体范围进行调整。如果 hart 继续进行与流的步幅匹配的直接访问(幅度和符号),则将进行额外的预取,并且预取距离会增加。有可能 hart 进行的直接访问对于预取器来说太快了,hart 将不得不等待 L2 填充。发生这种情况时,L2 预取器将增加预取距离(即发出更多预取)以尽量减少发生这种情况的机会。增加预取距离的阈值由 additionalCtrl.hitMSHRThrd 设置。

为流发出的最大预取次数受 basicCtrl.maxAllowedDist 限制。预取距离会逐渐增加,但有时可能不够快。从初始距离加速到最大距离的速度由预取器自动管理。basicCtrl.linToExpThrd 设置可用于微调此自适应加速。该字段的值越小,预取器达到最大预取距离的速度就越快。

仅当存在空闲的 L2 未命中状态保持寄存器 (MSHR) 时才会发出预取。additionalCtrl.qFullnessThrd 值用于控制预取器何时停止向内存系统发出提示。这个 4 位字段允许 L2 缓存中的 MSHR 总数以 1/16 的分数表示。例如,阈值 0xC 表示如果 75% 的 MSHR 已分配,预取将停止,直到正在使用的 MSHR 数量降至可用的 75% 以下。此设置允许调整预取器,以便预取器不会停止由 Core Complex(来自 harts 和 Front Port master)进行的直接访问。

预取器监视对内存的读取和写入,并且步幅可以是递增或递减地址。复位时禁用预取;可以使用 basicCtrl.scalarLoadSupportEnadditionalCtrl.scalarStoreSupportEn 位启用标量支持,可以使用 additionalCtrl.vectorLoadSupportEnadditionalCtrl.vectorStoreSupportEn 位启用矢量支持。

流退出

预取流不太可能在应用程序的生命周期内无限期地持续下去,因此 L2 预取器提供了一种方法来淘汰旧流。这允许跟踪新流。

流可以通过成功命中 L2 缓存而无需预取来退出。如果足够多的连续访问命中 L2 缓存,但没有预取,则预取器无需继续监视流。additionalCtrl.hitCacheThrd 字段设置了该流退出的阈值。

页边界

L2 预取器可以编程为跨越内存的 4 KB 页边界。这在没有 OS 页面保护或可以忽略 OS 页面保护的应用程序环境中很有用。

当设置 basicCtrl.crossPageEn 时,预取可以跨越 4 KB 边界

如果 hart 继续进行与新的 4 KB 内存页中的步幅匹配的访问,预取将恢复。

Memory Map

L2 预取器控制寄存器的存储器映射如表 142 所示

控制寄存器

L2 预取器控制寄存器 basicCtrladditionalCtrl 如下表所述。

L2 Prefetcher 初始化

L2 预取器需要在使用前在引导软件中进行初始化。初始化后,L2 预取器可以根据需要在每个配置的基础上进行调整。具体需要参考提供的SDK中L2预取器的软件示例。

end

猜你喜欢:

RISC-V SiFive U54内核——PMP物理内存保护

RISC-V SiFive U54内核——CLINT中断控制器

RISC-V SiFive U54内核——中断和异常详解

系统明明有很多内存,却无法分配出一片大块内存?

实战 | RISC-V Linux入口地址2M预留内存优化

RISC-V Linux启动之页表创建分析

RISC-V Linux汇编启动过程分析

写给新手的MMU工作原理

OpenSBI三种固件的区别

RISC-V 入门笔记(新手必看!)

内核调试之devmem直接读写寄存器

教你在QEMU上运行RISC-V Linux

相关文章
|
算法 异构计算 索引
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的MSK调制解调系统系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于FPGA实现MSK调制解调系统,采用Verilog开发,包含同步模块、高斯信道模拟、误码率统计等功能。相比仿真版本,新增ILA数据采集与VIO在线SNR设置模块。通过硬件测试验证,展示不同SNR(如10dB和16dB)下的性能表现。研究聚焦软件无线电领域,优化算法复杂度以适应硬件限制,利用MSK恒定包络、相位连续等特性提升频谱效率。核心代码实现信号生成、调制解调、滤波及误码统计,提供完整的硬件设计与分析方案。
600 19
|
人工智能 Cloud Native 安全
AI 网关代理 LLMs 最佳实践
云原生 AI 网关其实并不是一个新的独立的产品,而是属于云原生 API 网关产品内的一部分功能,基于 AI 的场景,设计了更贴合 AI 业务的 AI API 及各个功能。同时也具备云原生 API 网关本身提供的各个通用能力。
964 15
|
存储 边缘计算 运维
移动LTE背后:核心网络详解
移动LTE背后:核心网络详解
1680 4
|
网络协议 算法 数据格式
【TCP/IP】UDP协议数据格式和报文格式
【TCP/IP】UDP协议数据格式和报文格式
2348 3
|
机器学习/深度学习 存储 数据采集
强化学习系列:A3C算法解析
【7月更文挑战第13天】A3C算法作为一种高效且广泛应用的强化学习算法,通过结合Actor-Critic结构和异步训练的思想,实现了在复杂环境下的高效学习和优化策略的能力。其并行化的训练方式和优势函数的引入,使得A3C算法在解决大规模连续动作空间和高维状态空间的问题上表现优异。未来,随着技术的不断发展,A3C算法有望在更多领域发挥重要作用,推动强化学习技术的进一步发展。
1277 9
|
测试技术 网络架构
静态路由如何配置?
【8月更文挑战第17天】静态路由如何配置?
1245 5
|
Linux 网络安全 开发工具
内核实验(二):自定义一个迷你Linux ARM系统,基于Kernel v5.15.102, Busybox,Qemu
本文介绍了如何基于Linux Kernel 5.15.102版本和BusyBox创建一个自定义的迷你Linux ARM系统,并使用QEMU进行启动和调试,包括内核和BusyBox的编译配置、根文件系统的制作以及运行QEMU时的命令和参数设置。
1813 0
内核实验(二):自定义一个迷你Linux ARM系统,基于Kernel v5.15.102, Busybox,Qemu
|
Linux Go C语言
用 Cython 包装静态库和动态库
用 Cython 包装静态库和动态库
429 0
|
存储 安全 机器人
MemoryScope:为LLM聊天机器人配备的长期记忆系统
如何选择合适的方法构建自己的智能体助理呢?这里向您介绍强大、低延迟、安全可控的MemoryScope开源项目。

热门文章

最新文章