对 x86 上 L1 缓存行的独占访问?

2023-11-25

如果有一个 64 字节的缓冲区被大量读/写,那么它很可能会保留在 L1 中;但有什么办法可以强制这种行为吗?

例如,给予一个核心对这 64 字节的独占访问权限,并告诉它不要与其他核心或内存控制器同步数据,以便这 64 字节始终存在于一个核心的 L1 中,无论 CPU 是否认为它使用得足够频繁。


不,x86 不允许你这样做。您可以强制驱逐clfushopt,或(在即将推出的 CPU 上)仅写回而不逐出clwb,但您无法在缓存中固定一行或禁用一致性。


您可以将整个 CPU(或单个核心?)置于缓存即 RAM(又名无填充)模式,以禁用与内存控制器的同步,并禁用写回数据。Cache-as-Ram(无填充模式)可执行代码。它通常由 BIOS/固件在配置内存控制器之前的早期启动中使用。它不能按行使用,并且几乎可以肯定在这里没有实际用处。有趣的事实:离开此模式是的用例之一invd,它会删除缓存数据而不写回,而不是wbinvd.

我不确定 no-fill 模式是否会阻止从 L1d 驱逐到 L3 或其他什么;或者如果数据在驱逐时被丢弃。因此,您只需避免访问 7 个以上的其他缓存行,这些缓存行是您在 L1d 中关心的缓存行的别名,或者是 L2/L3 的等效项。


如果能够强制一个核心无限期地挂在 L1d 行上,并且不响应将其写回/共享的 MESI 请求,那么如果其他核心触及该行,则它们很容易锁定。显然,如果存在这样的功能,则需要内核模式。 (对于硬件虚拟化,需要虚拟机管理程序特权。)它还可能阻止硬件 DMA(因为现代 x86 具有缓存一致性 DMA)。

因此,支持这样的功能需要 CPU 的很多部分来处理无限期的延迟,目前可能存在一些上限,如果存在这样的情况,该上限可能比 PCIe 超时短。 (我不编写驱动程序或构建真正的硬件,只是猜测这一点)。

正如@fuz 指出的,违反一致性的指令(xdcbt) was 在 PowerPC 上尝试过(在 Xbox 360 CPU 中),由于错误推测指令的执行而导致灾难性的结果。所以就是hard来实施。


你通常不需要这个。

如果线路使用频繁,LRU 替换将使其保持热状态。如果它以足够频繁的间隔从 L1d 丢失,那么它可能会在 L2 中保持热度,L2 也是核心和私有的,并且在最近的设计中速度非常快(Intel 自 Nehalem 以来)。英特尔在 Skylake-AVX512 以外的 CPU 上的包容性 L3 意味着留在 L1d 也意味着留在 L3。

所有这些意味着对于一个核心大量使用的线路来说,在任何频率下,一直到 DRAM 的完整高速缓存未命中都不太可能发生。所以吞吐量应该不成问题。我想您可能需要这种实时延迟,其中函数的一次调用的最坏情况运行时间很重要。从代码的其他部分中的缓存行进行虚拟读取可能有助于保持热状态。

然而,如果来自 L3 高速缓存中其他核心的压力导致该行从 L3 中逐出,则具有包容性 L3 的 Intel CPU 也必须强制从仍处于热状态的内部高速缓存中逐出。 IDK 是否有任何机制可以让 L3 知道某条线路在核心的 L1d 中大量使用,因为这不会生成任何 L3 流量。

我不知道这在实际代码中是一个很大的问题。 L3 是高度关联的(如 16 路或 24 路),因此在发生驱逐之前需要发生很多冲突。 L3 还使用更复杂的索引函数(就像真正的哈希函数,而不仅仅是通过取连续的位范围进行取模)。在 IvyBridge 及更高版本中,它还使用自适应替换策略来减轻由于接触大量不会经常重用的数据而导致的驱逐。http://blog.stuffedcow.net/2013/01/ivb-cache-replacement/.

也可以看看intel core i7 处理器使用哪种缓存映射技术?


@AlexisWilke 指出对于某些用例,您可以使用向量寄存器而不是缓存行。 使用 ymm 寄存器作为“类似内存”的存储位置。您可以在全球范围内将一些向量规则专用于此目的。要在 gcc 生成的代码中得到这个,也许可以使用-ffixed-ymm8,或将其声明为易失性全局寄存器变量。 (如何通知 GCC 不要使用特定寄存器)

使用 ALU 指令或存储转发从向量寄存器获取数据将为您提供有保证的延迟,并且不会出现数据缓存缺失。但对于极低延迟来说,代码缓存未命中仍然是一个问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对 x86 上 L1 缓存行的独占访问? 的相关文章

随机推荐

  • 如何在git中查看旧版本的文件夹

    我需要从原点提取更改 问题是其中一个库已更新到最新版本 它使我的应用程序部分崩溃 我想提取最近的更改 然后返回到仅一个文件夹的先前 或特定 版本 其中包含导致该问题的 lib txt 文件 有什么办法可以做到这一点吗 git checkou
  • setMethod("$<-") 和 set setReplaceMethod("$") 有什么区别?

    Question 当编程时r与s4面向对象系统 当一个人必须使用setReplaceMethod 我不明白与setMethod添加时 lt 到函数的名称 做setMethod lt and setReplaceMethod 是平等的吗 文档
  • C# 中“get”和“set”属性的用途是什么

    我看到一些 get set 方法来设置值 谁能告诉我这样做的目的吗 public string HTTP USER NAME get return UserName set UserName value public string HTTP
  • TensorFlow 2.0 [条件 x == y 不按元素成立:]

    我正在使用 TensorFlow 2 和 Keras 训练国际象棋程序 以前 如果我在与模型训练相同的脚本中加载数据 我就可以完成这项工作 但随着数据集变得更大 腌制数据然后重新加载它会更快 当我这样做时 即使将模型修剪到一层以简化问题 我
  • 在 Node.js 中使用串口进行异步/等待

    使用 Node js 致力于 PC 和基于 Arduino 的硬件之间的通信 最后一个设备是用 G 代码实现的 所以如果我发送 G0 我将收到两行 一个用于确认已收到指令 第二个用于确认数据 我想使用 async await 但出了点问题
  • CORS:为什么我成功获得了预检选项,但发布后仍然出现 CORS 错误? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 我有一个使用 axios 发出 http 请求的 Vue 前端 以及一个使用express 的 Node 后端 它们位于不同的域 本地运行时 BE端口是3080 FE端口是3
  • 为什么Java中的private static field = new Singleton不懒呢?

    我读了很多关于 Singleton 的文章 其中大多数作者都说 Java 中 Singleton 的这种变体 public class Singleton private static Singleton instance new Sing
  • 在某个元素之前添加元素

    我有这个代码 td div class imagebutton abc div td 我想在这段代码中添加另一个元素 如下所示 p blablablalblablab p td div class imagebutton abc div t
  • 如何判断 Perl 脚本是否在 CGI 上下文中执行?

    我有一个 Perl 脚本 它将从命令行作为 CGI 运行 从 Perl 脚本中 我如何知道它是如何运行的 最好的选择是检查GATEWAY INTERFACE环境变量 它将包含服务器正在使用的 CGI 协议的版本 这几乎总是CGI 1 1 T
  • 使用 VB 6 代码从任务管理器结束进程

    我需要粗略地终止一个应用程序 以便我可以在我的数据库中获得该应用程序的幻像订阅者 这不能通过关闭应用程序来产生 手动地 如果我们从任务管理器终止应用程序 幻影订阅者将存在 现在我需要在 VB 6 代码中自动完成它 帮助 谢谢 有两种方法 S
  • 使用 download.file() 从 HTTPS 下载文件

    我想使用 R 读取在线数据download file 如下所示 URL lt https d396qusza40orc cloudfront net getdata 2Fdata 2Fss06hid csv download file UR
  • C(非 C++)有限域(伽罗瓦域)线性代数库

    我正在寻找一个有限域 伽罗瓦域C 的精确线性代数库 C 是不可接受的 因为我需要能够编写一个 Haskell 绑定到它 这显然是C 很难 我找到了类似的图书馆FFLAS FFPACK and Givaro但这些是 C 模板库 In part
  • 地址清理程序不适用于 Windows 上的 bash

    目前在 Windows 上的 Ubuntu Bash 上运行 llvm clang clang format 和 clang modernize 我想使用谷歌发布的一套清理工具 包括地址 内存和线程清理 fsanitize 选项似乎都不起作
  • 将字符串转换为 long long

    我正在使用 VS 2008 创建一个 C DLL 非托管 项目 我需要将 char 转换为 long long 类型 有简单的方法吗 提前致谢 最简单的方法是使用 std stringstream 它也是最类型安全的 std strings
  • 兼容类型和参数类型限定符

    这两个声明的类型是否兼容 void f char char void f char restrict char restrict 或类似 void g char void g char const 我很难在标准中找到涵盖该问题的任何内容 我
  • Dropwizard HK2注射液

    我对使用 dropwizard 还很陌生 目前我正在尝试实现 HK2 依赖注入 这在资源内部工作得很好 但在资源外部却不起作用 这是我正在做的事情 Client client new JerseyClientBuilder environm
  • 输入特征以获得默认参数提升

    免责声明 我知道这个问题的答案 我认为这可能会引起一些普遍的兴趣 问题 我们怎样才能拥有一种类型特征 能够产生由执行而产生的类型默认参数促销 动机 我希望能够可移植地使用变量参数 例如 void foo char const fmt Ple
  • ASP MVC C#:是否可以将动态值传递到属性中?

    好吧 我对 C 很陌生 我正在尝试使用 ASP MVC2 创建一个小网站 我想创建我自己的授权属性 但如果可能的话 我需要传递一些值 例如 CustomAuthorize GroupID Method Parameter public Ac
  • 如何改进该 Java 代码以查找字符串中的子字符串?

    最近 我被要求提交一份工作问题的解决方案 Problem 在字符串中查找子字符串 Input Little star s deep dish pizza sure is fantastic Search deep dish pizza Ou
  • 对 x86 上 L1 缓存行的独占访问?

    如果有一个 64 字节的缓冲区被大量读 写 那么它很可能会保留在 L1 中 但有什么办法可以强制这种行为吗 例如 给予一个核心对这 64 字节的独占访问权限 并告诉它不要与其他核心或内存控制器同步数据 以便这 64 字节始终存在于一个核心的