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

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(使用前将#替换为@)

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

  • 非阻塞方法中的饥饿

    一段时间以来 我一直在阅读有关非阻塞方法的内容 这是一段所谓的无锁计数器的代码 public class CasCounter private SimulatedCAS value public int getValue return va
  • 如何找到 IIS 在负载/性能测试期间模拟的平均并发用户数?

    我正在使用 JMeter 进行负载测试 我正在练习通过简单地增加我的分布式 JMeter 测试用例中的线程数并启动测试来查找我们的网络服务器可以处理的最大并发线程 用户 数量 然后 我突然意识到 虽然 MAX 数字可能有用 但REAL我的网
  • 双线性序列给出奇数结果

    我试图让我的表现技能 不存在 达到标准 但在将公式写入代码时遇到了问题 这是我试图将其引用为 转换 为代码的公式 考虑一个序列 u 其中 u 定义如下 号码u 0 1是第一个u 对于每个x in u then y 2 x 1 and z 3
  • 只读有运行时开销吗?

    出于某种原因 我一直认为readonly字段有与其相关的开销 我认为这是 CLR 跟踪是否存在readonly字段是否已初始化 这里的开销是一些额外的内存使用量 用于跟踪状态以及分配值时的检查 也许我这么认为是因为我不知道readonly字
  • 这个 cProfile 结果告诉我需要修复什么?

    我想提高Python脚本的性能并且一直在使用cProfile生成性能报告 python m cProfile o chrX prof bgchr py args 我打开这个chrX prof使用 Python 的文件pstats并打印出统计
  • 比较运算符性能 <= 与 !=

    让我们首先声明代码可读性胜过微优化 我们应该将其留给编译器 这只是一个奇怪的案例 具体细节似乎与一般建议相比很有趣 因此 我在搞素数生成器函数 并提出了一种奇怪的行为 其中 人们建议效率最高 实际上效率最低 而 C private stat
  • 使用 enum.values() 与字符串数组相比,性能是否会受到影响?

    我正在使用枚举来替换String我的 java 应用程序 JRE 1 5 中的常量 当我在不断调用的方法中将枚举视为名称的静态数组时 例如 在渲染 UI 时 是否会对性能造成影响 我的代码看起来有点像这样 public String get
  • Draggable JS Bootstrap 模式 - 性能问题

    对于工作中的项目 我们在 JavaScript 中使用 Bootstrap Modal 窗口 我们想让一些窗口可移动 但我们遇到了 JQuery 的性能问题 myModal draggable handle modal header Exa
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • MFENCE/SFENCE/etc“序列化内存但不序列化指令执行”?

    英特尔系统编程指南第 8 3 节中有关 MFENCE SFENCE LFENCE 的说明 以下指令是内存排序指令 而不是序列化指令 这些指令会耗尽数据内存子系统 它们不序列化指令执行流 我试图弄清楚为什么这很重要 在多线程代码中 对内存的写
  • Intel 上的 gcc 中的 _mm_pause 用法

    我参考过这个网页 https software intel com en us articles benefitting power and performance sleep loops https software intel com
  • 快速查询最新记录的方法?

    我有一张这样的表 USER PLAN START DATE END DATE 1 A 20110101 NULL 1 B 20100101 20101231 2 A 20100101 20100505 在某种程度上 如果END DATE i
  • 1.2.840.113556.1.4.1941 (LDAP_MATCHING_RULE_IN_CHAIN) 存在性能问题?

    LDAP 搜索有一些内置规则 其中之一是LDAP MATCHING RULE IN CHAIN From MSDN https msdn microsoft com en us library aa746475 v vs 85 aspx 1
  • 如何知道Matlab中系统命令执行过程中经过的时间?

    我有一个运行系统脚本的 Matlab 代码 该脚本可能会因命令运行而停止 我想知道是否有一种方法可以让程序知道它是否花费了很长时间并执行其他操作 这是代码 tic status cmdout system iperfcmd The prog
  • SignalR 似乎正在减慢我的 MVC/Azure 应用程序的启动速度

    我有一个 MVC 应用程序在 Windows Azure 上的 WebRole 上的 NET 4 5 下运行 使用 SignalR 1 0 alpha2 并使用 ServiceBus 底板 在我的 App Start 文件夹中 我有 Reg
  • 3 操作数 imul 指令在 ia-32 汇编中到底起什么作用?

    我正在阅读说明 imul 0xffffffd4 ebp ebx 4 eax 我对它到底在做什么感到困惑 我明白那个imul乘法 但我无法弄清楚语法 我知道并且更喜欢 Intel MASM 语法 所以我将使用它 请注意 操作数的顺序在 AT
  • 了解近调用指令编码

    通过反汇编一些二进制代码 我发现了近调用指令call 0x8ae编码为e8 97 08 00 00 查看指令集参考 我发现这些指令被编码为 call XX XX XX XX lt gt e8 XX XX XX XX being XX XX
  • 问题与 Assembly x86-32 RET n 指令有关

    我知道 Ret n 的含义 但我无法弄清楚它在维护程序运行时堆栈方面的作用 我在那里有点困惑 ret 和栈有关系吗 ret n就好像ret add esp n 您可以将其用于 caller pops 调用约定 Plain ret就好像pop
  • Canvas GetImageData() / PutImageData() 在移动设备上的性能很糟糕

    我正在做一个小型 HTML5 游戏 在地图开头加载精灵时 我使用 GetImageData 循环遍历所有图像 PutImageData 进行一些处理 这在我的电脑上运行得非常好 但是在我的手机上却慢得可怕 PC 5 6 ms iPhone
  • Pandas apply 与 np.vectorize 从现有列创建新列的性能

    我正在使用 Pandas 数据框 并希望创建一个新列作为现有列的函数 我还没有看到关于之间速度差异的很好的讨论df apply and np vectorize 所以我想我会在这里问 熊猫apply 功能很慢 根据我的测量 在一些实验中如下

随机推荐

  • 通过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