CPU缓存抑制

2024-07-03

假设我有事实上的标准 x86 CPU,具有 3 级高速缓存、L1/L2 专用和 L3 在内核之间共享。有没有一种方法可以分配共享内存,其数据不会缓存在L1/L2私有缓存上,而只会缓存在L3上?我不想从内存中获取数据(这成本太高),但我想尝试一下将共享数据带入私有缓存和不带共享数据的性能。

假设 L3 在核心之间共享(大概是物理索引缓存),因此对于频繁使用的共享数据不会导致任何错误共享或缓存行无效。

任何解决方案(如果存在)都必须以编程方式完成,使用基于 Intel 的 CPU(相对现代的 Xeon 架构(skylake、broadwell))的 C 和/或汇编,运行基于 Linux 的操作系统。

Edit:

我有延迟敏感的代码,它使用某种形式的共享内存进行同步。数据将位于 L3 中,但在读取或写入时将进入 L1/L2,具体取决于缓存包含性策略。 根据问题的含义,数据将不得不失效,从而增加不必要的(我认为)性能损失。我想看看是否可以通过某些页面策略或仅在 L3 中的特殊指令来存储数据。

我知道出于安全原因可以使用特殊内存寄存器来禁止缓存,但这需要 CPL0 特权。

Edit2:

我正在处理有时在高性能系统上运行数月的并行代码。这些系统是高核心数系统(例如 40-160+ 核心),定期执行需要以 usecs 为单位执行的同步。


x86 无法进行绕过或通过 L1D/L2 写入但在 L3 停止的存储。有些 NT 存储会绕过所有缓存。任何东西forces回写到 L3 也会强制回写到内存。 (例如clwb操作说明)。它们专为非易失性 RAM 使用案例或非一致性 DMA 而设计,在这些情况下,将数据提交到实际 RAM 非常重要。

(更新:特里蒙特/蓝宝石急流有cldemote。早期的硬件将其作为 NOP 运行,因此它可以用作提示。)

也没有办法绕过 L1D 进行加载(除了 WC 内存,例如带有 SSE4.1 的视频 RAM)movntdqa,但它在其他内存类型上并不“特殊”)。prefetchNTA根据Intel的优化手册,可以绕过L2。 (并在具有非包容性 L3 缓存的 Xeon 上绕过 L3。)

执行读取操作的核心上的预取应该有助于触发从其他核心写回到 L3,并传输到您自己的 L1D。但只有在加载之前准备好地址时,这才有用。 (数十到数百次循环才能发挥作用。)

Intel CPU 使用共享包括的L3 缓存作为片上缓存一致性的后盾。 2 插槽必须监听另一个插槽,但支持 2P 以上的 Xeon 具有监听过滤器来跟踪移动的缓存行。 (这里描述的是 Broadwell Xeon v4,而不是 Skylake 和后来的 Xeon Scalable 的重新设计。)

当您读取最近由另一个内核写入的一行时,它在您的 L1D 中始终是无效的。 L3 是包含标签的,它的标签有额外的信息来跟踪哪个核心有该线路。 (即使该线路在某个 L1D 中处于 M 状态,这也是如此,这要求它在 L3 中无效,根据正常MESI https://en.wikipedia.org/wiki/MESI_protocol因此,在缓存未命中检查 L3 标签后,它会触发对 L1 的请求,该请求具有将其写回到 L3 缓存的行(并且可能将其直接发送到核心而不是想要它)。

Skylake-X (Skylake-AVX512) 没有包容性 L3(它有一个更大的私有 L2 和一个较小的 L3),但它仍然具有包含标签的结构来跟踪哪个核心有线路。它还使用网状结构而不是环状结构,L3 延迟似乎明显比 Broadwell 差。 (特别是在第一代 Skylake 中;我认为 Ice Lake 和后来的 Xeon 中的情况没那么糟糕。)


可能有用:使用直写式缓存策略映射共享内存区域的延迟关键部分。我不知道这个补丁是否已进入主线 Linux 内核,但请参阅HP 的此补丁:支持 x86 上的直写式映射 https://lwn.net/Articles/646081/。 (正常政策是WB。)

还相关:主内存和缓存性能 英特尔 Sandy Bridge 和 AMD Bulldozer https://tu-dresden.de/zih/forschung/ressourcen/dateien/abgeschlossene-projekte/benchit/2014_MSPC_authors_version.pdf?lang=en,深入研究 2 插槽 SnB 上不同起始状态的缓存行的延迟和带宽。

有关 Intel CPU 上内存带宽的更多信息,请参阅memcpy 的增强型 REP MOVSB https://stackoverflow.com/questions/43343231/enhanced-rep-movsb-for-memcpy,尤其是延迟受限平台部分。 (只有 10 个 LFB 限制了单核带宽)。


有关的:生产者-消费者在超级兄弟与非超级兄弟之间共享内存位置的延迟和吞吐量成本是多少? https://stackoverflow.com/questions/45602699/what-are-the-latency-and-throughput-costs-of-producer-consumer-sharing-of-a-memo有一些实验结果,让一个线程将垃圾邮件写入某个位置,而另一个线程读取该位置。

请注意,缓存未命中本身并不是唯一的影响。你也会得到很多machine_clears.memory_ordering来自执行负载的核心的错误推测。 (x86 的内存模型是强顺序的,但真实的 CPU 会推测性地提前加载,并在极少数情况下中止,即缓存行在加载应该“发生”之前变得无效。


还相关:

  • 有没有办法编写Intel CPU直接核对核通信代码? https://stackoverflow.com/questions/58741806/is-there-any-way-to-write-for-intel-cpu-direct-core-to-core-communication-code(否,IPI 中断除外)
  • 为什么 x86 不实现直接的核心到核心消息传递汇编/CPU 指令? https://stackoverflow.com/questions/72206733/why-didnt-x86-implement-direct-core-to-core-messaging-assembly-cpu-instructions- UIPI 现在存在于 Sapphire Rapids:用户空间处理器间中断。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CPU缓存抑制 的相关文章

  • typedef 和 Define 之间的区别[重复]

    这个问题在这里已经有答案了 可能的重复 c中typedef和 define一样吗 https stackoverflow com questions 1666353 is typedef and define the same in c 对
  • 哪个STL容器具有线程安全的插入过程?

    哪个STL容器具有线程安全的插入过程 我希望多个线程同时插入同一个容器中 欢迎除 STL 即 Boost 之外的任何实现 STL 容器不是线程安全的 如果您愿意的话 您必须通过自己的同步来强加这一点
  • 如何在C#中隐藏文件?

    我想在c 中隐藏一个文件 我知道文件路径并且可以创建 FileInfo 对象 我怎样才能隐藏它 之前接受的答案 File SetAttributes path FileAttributes Hidden 将导致它可能丢失某些其他属性 因此您
  • QTreeView、QFileSystemModel、setRootPath 和 QSortFilterProxyModel 以及用于过滤的 RegExp

    我需要显示特定目录的 QTreeView 并且我想让用户能够使用 RegExp 过滤文件 据我了解 Qt 文档 我可以使用标题中提到的类来实现这一点 如下所示 Create the Models QFileSystemModel fileS
  • 嵌入式Python,导入数学错误

    首先我使用的是 Mac OSX 10 12 6 我想在我的 C 应用程序中嵌入 python 环境 我把 github python 项目放在https github com python cpython https github com
  • Google 的“编码折线算法”的 C# 实现

    有谁有 Google 的简洁而强大的实现吗 编码折线算法 http code google com apis maps documentation utilities polylinealgorithm html in C 我本质上想要实现
  • 如何有效计算灰度图像中像素的平均“方向”?

    所以我发现我可以将图像转换为灰度图像 如下所示 public static Bitmap GrayScale this Image img var bmp new Bitmap img Width img Height using var
  • 如何连接 COM 事件调度程序?

    VBIDE API 揭示了令人惊奇的神秘之处 dispVBComponentsEvents接口 除其他外 其中看起来像我可以用它来捕获 VBE 中各种有趣的事件 因此 我在一个类中实现了该接口 该类旨在捕获事件并引发 正常 net 事件以供
  • 基本镜面着色

    我正在使用一个生成阴影球体的简单代码 我还没有完全理解数学 但我在玩代码时正在弄清楚它 我想知道如何根据这段代码实现镜面反射着色 有什么建议么 for y 0 y
  • chmod:如何仅向已具有执行权限的文件递归添加执行权限[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我注意到 chmod R a x为所有文件添加执行权限 而不仅仅是当前可执行的文件 有没有办法只为那些已经为用户权限设置了执行集的文件添加执行权限 U
  • 使用 QProcessEnvironment 更改 cmd.exe 的 PATH 环境变量

    我想从设置了特定路径的 Qt 应用程序启动 cmd exe 我在 QProcessEnvironment 中插入 Path 并将该环境设置为 QProcess 然后我开始分离 cmd 在命令提示符上 路径与调用应用程序的路径相同 而不是我刚
  • Django 会话竞争条件?

    摘要 Django 会话中是否存在竞争条件 如何防止它 我在 Django 会话方面遇到了一个有趣的问题 我认为该问题涉及由于同一用户同时发出请求而导致的竞争条件 它发生在一个同时上传多个文件的脚本中 正在本地主机上进行测试 我认为这使得同
  • 安全地抛出在另一个线程上创建的异常 C#

    我想在线程A中捕获异常 然后将异常对象传递给线程B 并从线程B中抛出它 这样安全吗 Thread A try Code that throws exceptions catch Exception e sendToOtherThread e
  • Blazor - 重定向到一个解决方案中另一个项目中的页面

    我遇到了这样的情况 在一个解决方案中 想要将用户从一个项目的页面重定向到另一个项目的页面 这很重要 我在 blazor 服务器上做 任何人都可以教我一些东西吗 您始终可以注入 NavigationManager 通过此您可以将用户重定向到另
  • 如何使信号客户端避免表单身份验证?

    我的 MVC 网站在 web config 中有表单授权 现在所有的页面都需要通过授权才能被查看 但是现在我有一个控制台程序 C 控制台程序 这个程序需要发送一些消息到 SignalR 集线器 但是我的 signalR Hub 在我的 MV
  • ncurses 和curses - 编译器未定义的引用

    好吧 我最初一直在尝试使用一些据称仅适用于 Windows 的标头 我的错 但我已经使用curses h 重现了我需要的内容 但是我仍然收到完全相同的错误 usr bin gmake f nbproject Makefile Debug m
  • Qt:如何处理用户按下“X”(关闭)按钮的事件?

    在 Qt 中 与用户单击窗口框架的 X 关闭 按钮 即此按钮 事件相对应的插槽是什么 如果没有这个插槽 在用户按下关闭按钮后是否有其他方法来触发功能 如果你有一个QMainWindow你可以覆盖closeEvent method inclu
  • lldb:无法实现:无法获取变量的值

    我用这个命令行编译了一个cpp文件 g g test cpp 它在第 28 行抛出异常 我想通过检查 lldb 中的变量来调查原因 我在第 28 行设置了一个断点并运行a out在LLDB中 lldb n Process 84233 sto
  • 谷歌模拟 - 我可以在同一个模拟对象上多次调用 EXPECT_CALL 吗?

    如果我打电话EXPECT CALL在同一个模拟对象上两次TEST F 会发生什么 期望是否附加到模拟对象中 或者第二次调用是否消除了第一次调用的效果 I found 后子句 https github com google googletes
  • Windows 窗体应用程序中异常处理的最佳实践?

    我目前正在编写我的第一个 Windows 窗体应用程序 我现在已经阅读了几本 C 书籍 因此对 C 必须处理异常的语言特性有了相对较好的了解 然而 它们都非常理论化 因此我还没有了解如何将基本概念转化为应用程序中良好的异常处理模型 有人愿意

随机推荐

  • Python 检查类型的规范方法是什么?

    如何检查对象是否属于给定类型 或者它是否继承自给定类型 如何检查对象是否o属于类型str Beginners often wrongly expect the string to already be a number either exp
  • System V 和 Posix 信号量之间的差异

    使用 System V 和 Posix 信号量之间有何权衡 From O Reilly http www linuxdevcenter com pub a linux 2007 05 24 semaphores in linux html
  • document.getElementById("xxxxx").innerHTML 根本不起作用?

    我在尝试将字符串变量的值写入 DOM 中特定元素的特定 div 时遇到问题 假设游戏 十 document getElementById game innerHTML game 不写信给 div div 问题是下面的代码我有一个脚本 在该脚
  • 有没有办法从 php 中的沙箱中执行 php 代码

    我想从 php 执行一个 php 脚本 该脚本将使用不同的常量和已定义的类的不同版本 是否有一个沙箱 php module 我可以 sandbox script php run in a new php environment 代替 inc
  • 使用Prometheus读取csv文件

    我有 csv 格式的数据 我想将该数据添加到 prometheus 中 请帮助我 是否存在任何出口商或 API 等 您需要一个导出器 通过 HTTP 以 Prometheus 格式公开 CSV 文件中的数据 以便 Prometheus 可以
  • 这是合法的 C/C++ 吗? `int* p = (int[]) {1,2,3} ;`

    我的这个回答 https stackoverflow com a 8855343 428857生成了一些评论 声称以下构造不是合法的 C C void f int a f int 1 2 3 4 0 see 这个ideone链接 http
  • 我们如何分析损失与历元图?

    我正在训练一个语言模型 每次训练时都会绘制损失与历元的关系 我附上了其中的两个样本 显然 第二个表现出了更好的表现 但是 从这些图表来看 我们什么时候决定停止训练 提前停止 我们可以从这些图表中理解过度拟合和欠拟合还是我需要绘制额外的学习曲
  • 所有子集高效实施

    我需要获取 0 n 1 的所有子集 其中不包含 E 中的任何集合 天真的实现 from itertools import combinations n 4 E 0 1 c for k in range 1 n 1 for c in comb
  • codeigniter 中的自定义路由

    我想将 codeigniter 用于我正在从事的电子商务项目 但我认为我需要一些自定义路由 并且我不确定这是否可行 我希望能够使用这个网址 http myecommsite com store mens http myecommsite c
  • 当应用程序失去焦点时,WINAPI GetKeyboardState 行为由 GetKeyState 修改?

    调用WINAPI命令时GetKeyboardState aByteArray 从 WPF 应用程序 假设还有其他应用程序 按住SHIFT仅当应用程序具有焦点时才能正确检测到键 当应用程序没有焦点时 aByteArray VK SHIFT i
  • BaseGame Util 无法解析为类型

    我的项目需要 BaseGameUtil 库 我有 BaseGameUtil 库下载表格here https github com playgameservices android samples 但是当我将它导入到我的 android 项目
  • 两个结构的猫:不同的字段

    我有多个 csv 文件 a csv field a field b 111 121 112 122 b csv field a field c 211 231 212 232 c csv field a field b field c 31
  • iPhone 导航问题 - 嵌套推送动画可能会导致导航栏损坏

    我不断收到以下错误 2011 04 02 14 55 23 350 AppName 42430 207 nested push animation can result in corrupted navigation bar 2011 04
  • Valgrind 是否存在已知的误报问题?

    Valgrind 是否存在任何已知的误报 我得到 条件跳转或移动取决于未初始化的值 fmemopen函数 用C编写并用GCC编译 我能确定这是真的吗 编辑 是否存在抑制文件中未包含的已知问题 是否有人可以在程序中做一些事情 这些事情并不是真
  • 字符串向量的按元素串联[重复]

    这个问题在这里已经有答案了 假设我有两个字符向量 a lt c a b c b lt c 1 2 3 我如何合并它们以便我得到 ab lt c a1 b2 c3 您可以使用paste or paste0 gt a lt c a b c gt
  • 设置 iOS 设备上本机 html5 日期和时间选择器的宽度

    我正在使用带有 type date 和 type time 的本机日期和时间选择器来处理我正在开发的网站的移动版本 不过 输入字段不尊重我的 CSS Desktop iOS devices 本质上 我需要两个日期和时间输入来填充大约 50
  • 我在哪里可以学习高级 Haskell? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在评论中我的答案之一 https stackoverflow com questions 4633584 algorithm to gen
  • FFMPEG 输出文件 #0 不包含任何流

    我正在尝试为我的 Android 应用程序运行以下命令 ffmpeg i full path video mp4 ignore loop 0 i myGif gif filter complex 0 1 overlay 0 H 100 fu
  • Scala:如何按元组的第二个元素对元组数组进行排序?

    Scala 有没有办法使用任意比较函数对元组数组进行排序 特别是 我需要按元组的第二个元素对元组进行排序和数组 但我想知道对元组数组进行排序的通用技术 Thanks 在scala 2 8中 有一个方法sortBy 这是一个简单的用例 sca
  • CPU缓存抑制

    假设我有事实上的标准 x86 CPU 具有 3 级高速缓存 L1 L2 专用和 L3 在内核之间共享 有没有一种方法可以分配共享内存 其数据不会缓存在L1 L2私有缓存上 而只会缓存在L3上 我不想从内存中获取数据 这成本太高 但我想尝试一