预取是由精确地址流还是由缓存行流触发?

2023-11-21

在现代 x86 CPU 上,硬件预取是一项重要技术,可在用户代码显式请求缓存行之前将其引入缓存层次结构的各个级别。

The basic idea is that when the processor detects a series of accesses to sequential or strided-sequential1 locations, it will go ahead and fetch further memory locations in the sequence, even before executing the instructions that (may) actually access those locations.

My question is if the detection of a prefetch sequence is based on the full addresses (the actual addresses requested by user code) or the cache line addresses which is pretty much the address excluding the bottom 6 bits2 stripped off.

例如,在具有 64 位缓存线的系统上,访问完整地址1, 2, 3, 65, 150将访问缓存行0, 0, 0, 1, 2.

当一系列访问在高速缓存行寻址中比在完整寻址中更规则时,差异可能是相关的。例如,一系列完整地址,例如:

32, 24, 8, 0, 64 + 32, 64 + 24, 64 + 8, 64 + 0, ..., N*64 + 32, N*64 + 24, N*64 + 8, N*64 + 0

在完整地址级别可能看起来不像跨步序列(实际上,它可能会错误地触发向后预取器,因为 4 次访问的每个子序列看起来像 8 字节跨步反向序列),但在缓存行级别,它看起来像是向前推进一次缓存行(就像简单的序列一样0, 8, 16, 24, ...).

现代硬件上采用的是哪个系统(如果有的话)?


Note:人们还可以想象答案不会基于every访问,但仅访问在预取器正在观察的缓存的某个级别中未命中的访问,但同样的问题仍然适用于“未命中访问”的过滤流。


1Strided-sequential just means that accesses that have the same stride (delta) between them, even if that delta isn't 1. For example, a series of accesses to locations 100, 200, 300, ... could be detected as strided access with a stride of 100, and in principle the CPU will fetch based on this pattern (which would mean that some cache lines might be "skipped" in the prefetch pattern).

2 Here assuming a 64-bit cache line.


缓存行偏移量可能很有用,但它们也可能会产生误导,如您的示例所示。我将根据我在 Haswell 上的实验,讨论行偏移如何影响现代 Intel 处理器上的数据预取器。

我遵循的方法很简单。首先,我禁用除我要测试的数据预取器之外的所有数据预取器。其次,我设计了一系列表现出特定兴趣模式的访问序列。目标预取器将看到该序列并从中学习。然后,我通过访问特定行来通过准确测量延迟来确定预取器是否已预取该行。该循环不包含任何其他负载。它包含一个用于在某个缓冲区中存储延迟测量的存储。

有 4 个硬件数据预取器。 DCU 预取器和 L2 相邻行预取器的行为不受行偏移模式的影响,而仅受 64 字节对齐地址模式的影响。

我的实验没有显示任何证据表明 L2 流预取器甚至接收缓存行偏移量。看起来它只获取行对齐的地址。例如,通过多次访问同一行,偏移模式本身似乎不会对预取器的行为产生影响。

DCU IP 预取器表现出有趣的行为。我测试过两种情况:

  • 如果加载的偏移量递减,预取器将向前和向后预取一行或多行。
  • 如果加载的偏移量不断增加,预取器将预取一行或多行,但仅限于正向。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

预取是由精确地址流还是由缓存行流触发? 的相关文章

  • C# 字典循环增强

    我有一本包含大约 100 万个条目的字典 我不断地循环字典 public void DoAllJobs foreach KeyValuePair
  • CALL指令是否总是将EIP指向的地址压入堆栈?

    x86架构中函数调用时是否存在返回地址不入栈的情况 No CALL根据定义 将在跳转到目标地址之前将返回地址压入堆栈 该返回地址是EIP or RIP sizeof call instruction 通常为 5 个字节 英特尔 64 和 I
  • 为什么 Dart 中的原生包装函数与非常轻量级的“DEFINE NATIVE ENTRY”函数相比如此重量级?

    我不明白 为什么要这样保证 这是自定义本机函数的包装器dart runtime vm native entry cc 它适用于想要编写的 Dart 程序员native extensions void NativeEntry NativeCa
  • SQL 与 LINQ 性能 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • LockBits 性能关键代码

    我有一个方法需要尽可能快 它使用不安全的内存指针 这是我第一次尝试这种类型的编码 所以我知道它可能会更快
  • 在 Android 谷歌地图中绘制 4K 折线

    我现在正在开发一个适用于 Android 设备的应用程序 主要功能是在地图上绘制折线以显示城市中每条街道的交通情况 不幸的是 当我绘制大约 3K 折线时 数量会根据屏幕尺寸和缩放级别而减少 我的地图变得非常慢 我没有提及绘制所有线条的时间
  • 如何使用 VBA 将符号/图标格式化为单元格而不使用条件格式

    我使用 VBA 代码放置条件格式以覆盖大型表格中的值 每个单元格使用 2 个公式来确定使用 3 个符号中的哪一个 我需要根据列使用不同的单元格检查每个单元格的值 因此据我了解 我必须将条件格式规则单独放置在每个单元格上 以确保每个单元格中的
  • 什么是样板代码、热点代码和热点?

    我知道这些术语是在性能实现 优化的背景下使用的 最近一直在研究这个问题 并尝试过搜索 但没有得到任何例子 清楚地阐述 描述这些概念以及在现实世界开发场景中实现这些问题 概念 有人可以彻底解释这些术语 示例场景以及可能使用这些概念和术语的地方
  • 数百个空闲线程的影响

    我正在考虑使用可能数百个线程来实现通过网络管理设备的任务 这是一个在带有 Linux 内核的 powerpc 处理器上运行的 C 应用程序 在每个任务进行同步以将数据从设备复制到任务的初始阶段之后 任务变得空闲 并且仅在收到警报或需要更改一
  • Verilog 双向握手示例

    我正在完成一个项目 要求是处理器内部功能单元之间的双向握手 我知道它是什么 但是有没有任何 标准 或一个简单的例子 我唯一能想到的就是两个单元之间 当它们之间有一条数据线并且当 X 发送到 Y 时 会给出一个单独的 发送 信号 当 Y 接收
  • 如何有效地计算 Perl 中覆盖给定范围的范围?

    我有一个大约 30k 范围的数据库 每个范围都作为一对起点和终点给出 12 80 34 60 34 9000 76 743 我想编写一个 Perl 子例程来表示一个范围 不是来自数据库 并返回数据库中完全 包含 给定范围的范围数 例如 如果
  • 为什么比较匹配的字符串比比较不匹配的字符串更快? [复制]

    这个问题在这里已经有答案了 这里有两个测量值 timeit timeit toto 1234 number 100000000 1 8320042459999968 timeit timeit toto toto number 100000
  • 在 Java 中加载和缓存图像的最佳方法是什么?

    我有超过一千个 16 x 16 像素图块图像的大量集合 我在 Java 中制作的游戏需要这些图像 在不耗尽 JVM 可用内存的情况下存储切片的最佳方法是什么 我认为生成 1000 BufferedImages 可能并不明智 保持图像准备就绪
  • 用于预乘 ARGB 的 SSE alpha 混合

    我正在尝试编写一个支持 SSE 的 alpha 合成器 这就是我想出的 首先 混合两个 4 像素向量的代码 alpha blend two 128 bit 16 byte SSE vectors containing 4 pre multi
  • 给定两个(大)点集,我如何有效地找到彼此最接近的点对?

    我需要解决一个计算问题 该问题归结为搜索两个集合之间最接近的点对 问题是这样的 给定欧几里德空间中的一组点 A 和一组点 B 找到所有对 a b 使得 b 是 B 中与 a 最近的点 a 是 A 中与 b 最近的点 集合 A 和 B 的大小
  • Android 在 ROOM 数据库中插入大量数据

    我有大约 10 个模型 每个模型都有超过 120K 行和 90 列的记录 其中包含双数组值 在 Room 中插入任何模型都需要超过 125 130 秒 任何人都可以建议我需要做什么才能使用一些批量插入技术来保存所有这些 120K 该技术大约
  • 如果我将一个大函数声明为内联函数怎么办?

    我搜索了一些相关问题 例如C 中内联函数的好处 https stackoverflow com questions 145838 benefits of inline functions in c 但我还有疑问 如果内联函数只是为了 为编译
  • 为什么 Chrome 审核建议我最小化 Cookie 大小?

    如何最小化请求的 cookie 大小 Chrome 似乎 警告我 我的 cookie 大小为 41B 这根本不是很多 但是它警告我有什么原因吗 这是一个 PHPSESSID cookie 我真的不知道如何最小化它 有任何想法吗 我的请求响应
  • Python:多重分配与单独分配速度

    我一直在寻求从我的代码中挤出更多的性能 最近 在浏览时这个 Python 维基页面 https wiki python org moin PythonSpeed 我发现了这个说法 多重分配比单独分配慢 例如 x y a b 比 x a y
  • PrintStream是有缓冲的,但是flush不会降低性能,而BufferedOutputStream会加速性能

    我预计由于 PrintStream 是缓冲的 通过在每次 print 之后添加刷新操作 速度性能应该会显着降低 但事实并非如此 如下面的代码片段所示 此外 将 PrintStream 包裹在 BufferedOutputStream 周围可

随机推荐

  • 通过AJAX调用提示用户保存文件

    我正在将 DHTMLX 网格导出到 csv 并已成功创建 CSV 文件 我遇到的问题是它没有提示用户保存 打开文件 我使用 javascript 中的 post 调用将 CSV 字符串发送到 PHP 然后将该字符串写入 csv 由于某种原因
  • 如何在 C# 中使用 imageMagick

    您能解释一下如何将 ImageMagick 与 C 一起使用吗 我正在尝试将 PDF 页面转换为图像 我想运行 imageMagick 命令 convert 密度 300 input pdf output png string argume
  • 获取类函数的参数数量

    有没有办法检测类中函数的参数数量 我想做的是以下内容 class foo path path to file if file exists path die require path if class exists class die c
  • 在 Maps V2 上绘制多色折线

    我按照以下方式在地图上绘制纯色折线 效果很好 PolylineOptions polyLine new PolylineOptions polyLine width 5 polyLine color Color RED polyLine g
  • WPF 的语法荧光笔[重复]

    这个问题在这里已经有答案了 我目前正在为 WPF 应用程序寻找语法荧光笔 用户可以在文本框中输入内容 希望能够识别代码并相应地突出显示语法 我想先支持C 稍后再支持其他语言 问题重复394751 如果您不介意没有任何文档 Avalon编辑是
  • 使用@EJB时,每个托管bean是否都有自己的@EJB实例?

    我正在将 JSF 2 2 用于 Web 项目 并且现在正在实现登录页面 我有一个login xhtml作为view 和一个名为的支持 beanUserLoginView 这种豆子有一个EJB属性beanprivate UserService
  • 组合类型别名的协议和空一致协议之间的区别

    Swift 中这两者有区别吗 protocol ABProtocol AProtocol BProtocol typealias ABProtocol AProtocol BProtocol 为了让事情更清楚 我将第二个重命名为 typea
  • 从变量中批量提取路径和文件名

    如何从变量中提取路径和文件名 Setlocal EnableDelayedExpansion set file C Users l72rugschiri Desktop fs cfg 我想在不使用任何函数或任何 GOTO 的情况下做到这一点
  • ruby 的 <=> 运算符和排序方法

    player1 Player new moe player2 Player new larry 60 player3 Player new curly 125 players player1 player2 player3 上面 我创建了一
  • 路由器命名的插座被激活一次

    是否有可能让路由器命名的插座被激活一次 然后永远不会被破坏 无论主插座中导航什么路线 目的是让组件保留在页面上 例如 sidebar 但在初始加载时获得路由的好处 例如防护 解析器 和延迟加载 要求是命名的插座不应以任何负面方式影响用户体验
  • 正则表达式使用字符限制验证密码

    我需要使用以下规则验证密码 6 至 20 个字符 必须包含至少一位数字 必须包含至少一个字母 不区分大小写 可以包含以下字符 以下表达式匹配除最后一个要求之外的所有要求 最后一张我能做什么 d A z 6 20 我不完全确定我有这个权利 但
  • STL容器函数返回值

    当查看 STL 容器的成员函数时 我想到了一个奇怪的想法 为什么没有像这样的功能std vector
  • 将泛型类与 ObjectDataSource 一起使用

    我有一个通用的 Repository 类 我想与 ObjectDataSource 一起使用 Repository 位于一个名为 DataAccess 的单独项目中 根据这篇文章来自 MS 新闻组 相关部分复制如下 在内部 ObjectDa
  • 如何在 javafx 中更改 TextField 的背景颜色而不更改边框?

    我试图将 TextField colorBox0 的背景颜色更改为 value0 但它消除了边框 这是我的代码的简化版本 static Paint value0 Paint valueOf FFFFFF TextField colorBox
  • 如何找到当前单元格上方最近的非空白单元格?

    我有一列数据 我需要找到前一个非空白单元格 例如 如果我有以下数据 foo formula where 表示一个空白单元格 那么我想要 formula 单元格来查找对包含的单元格的引用foo无论它们之间插入多少个空白单元格 测试列中包含空白
  • 如何使用 std::enable_if 根据模板类型启用或禁用构造函数?

    我有以下模板化对象 template lt typename type 1 typename type 2 gt struct result I want to enable these two constructors only if t
  • ASP.NET MVC:我可以在 Controller 类上说 [Authorize Roles="Administrators"],但有一个公共操作吗?

    我开始使用默认项目的AccountController 但我已经将其扩展 更改得面目全非 然而 与原版一样 我有一个LogOn and LogOff行动 显然 LogOn每个人都必须能够采取行动 但是 由于我已向该控制器添加了许多其他操作
  • JavaScript 中的高斯/银行家舍入

    我一直在使用Math Round myNumber MidpointRounding ToEven 在 C 中进行服务器端舍入 但是 用户需要 实时 知道服务器端操作的结果是什么 这意味着 避免Ajax请求 创建一个 JavaScript
  • 如何使用 Excel 将矩阵转换为单列

    我在 Excel 中有以下矩阵 3 栏 A B C Row 1 a b c Row 2 d e f Row 3 ghi 我需要的是包含所有这些值的一列 结果应该是这样的 a b c d e f g h i TRANSPOSE 函数不适用于这
  • 预取是由精确地址流还是由缓存行流触发?

    在现代 x86 CPU 上 硬件预取是一项重要技术 可在用户代码显式请求缓存行之前将其引入缓存层次结构的各个级别 The basic idea is that when the processor detects a series of a