cpu-cache相关内容

如何将结构显式加载到L1d缓存中?在带/不带超线程的隔离内核上使用CR0.CD=1的INVD出现奇怪的结果

我的目标是将静态结构加载到L1D缓存中。之后,使用这些结构成员执行一些操作,并在操作完成后运行invd以丢弃所有修改后的高速缓存线。因此,基本上我希望在缓存中创建一个安全的环境,以便在缓存中执行操作时,数据不会泄漏到RAM中。 为此,我有一个内核模块。在那里我给结构的成员设置了一些固定值。然后禁用抢占,禁用所有其他CPU的缓存(当前CPU除外),禁用中断,然后使用__builtin_pref ..
发布时间:2022-07-21 13:03:27 其他开发

如何查看最后一级缓存中有多少片?

我在一篇论文中读到关于末级缓存的介绍。在引言中,有人说末级缓存有很多片。每个片就像一个传统的集关联缓存。根据集合索引和切片ID找到对应的缓存集合(如下图所示)。 我想检查我的服务器有多少个切片。以及每个片的信息(多少个缓存组、每个缓存组中有多少缓存行)。我在Google上搜索的方法是查看/sys/devices/system/cpu/cpu0/cache/index3文件夹下的缓存信息。 ..
发布时间:2022-07-19 16:02:08 其他开发

为什么英特尔使用VIPT缓存而不是VIVT或PIPT?

我不确定,但如果我没记错的话,我想知道英特尔使用VIPT(虚拟索引物理标记)缓存的原因,为什么它比VIVT或PIPT更好,它有什么优势,可能还有什么劣势。谢谢。 推荐答案 可能没有公布确切的设计决策,但总的来说,VIPT的好处是: 虚拟索引意味着您可以在TLB中查找转换之前(或与之并行)开始从缓存中读取集合。这意味着常见案例的查找将比物理索引缓存快得多,在物理索引缓存中,您只能在 ..
发布时间:2022-05-08 20:06:56 其他开发

由于 cpu 乱序执行或缓存一致性问题,是否需要内存屏障?

我想知道为什么需要内存屏障,我已经阅读了一些关于这个主题的文章. 有人说这是因为 cpu 乱序执行,而 others 说是因为缓存一致性问题导致存储缓冲区和队列失效. 那么,需要内存屏障的真正原因是什么?cpu乱序执行还是缓存一致性问题?或两者?cpu乱序执行和缓存一致性有关系吗?x86和arm有什么区别? 解决方案 当 ISA 的内存排序规则弱于您的算法所需的语义时,您需要屏障来排序 ..
发布时间:2022-01-17 14:10:21 其他开发

是否有任何现代 CPU 缓存字节存储实际上比字存储慢?

这是常见声明 将字节存储到缓存中可能会导致内部读取-修改-写入周期,或者以其他方式损害吞吐量或延迟与存储完整寄存器相比. 但我从未见过任何例子.没有 x86 CPU 是这样的,我认为所有高性能 CPU 也可以直接修改缓存行中的任何字节.一些微控制器或低端 CPU 是否有不同(如果它们有缓存的话)? (我不计算字可寻址机器,或者 Alpha,它是字节可寻址但缺少字节加载/存储指令.我说的 ..
发布时间:2022-01-17 13:23:40 其他开发

多核 Intel CPU 中的高速缓存如何共享?

我有几个关于多核 CPU 或多处理器系统中使用的高速缓存存储器的问题.(虽然与编程没有直接关系,但在为多核处理器/多处理器系统编写软件时会产生很多影响,因此在这里问!) 在多处理器系统或多核处理器(英特尔四核、酷睿二双核等)中,每个 cpu 核心/处理器是否有自己的高速缓存(数据和程序高速缓存)? 李> 一个处理器/核心能否访问彼此的缓存,因为如果允许它们访问彼此的缓存,那么我相信在 ..
发布时间:2022-01-12 12:22:33 其他开发

当线程被调度在不同的 CPU 内核上时,预期的内存语义(例如写入后读取)会发生什么情况?

单线程中的代码具有一定的内存保证,例如先写后读(即,将一些值写入内存位置,然后将其读回应该给出您写入的值). 如果线程被重新调度以在不同的 CPU 内核上执行,这种内存保证会发生什么情况?假设一个线程将 10 写入内存位置 X,然后被重新调度到不同的核心.该内核的 L1 缓存可能具有不同的 X 值(来自之前在该内核上执行的另一个线程),因此现在读取 X 不会像线程预期的那样返回 10.当线程 ..

如何在c中的两个程序之间共享库

我想在 C 中的两个不同程序中使用相同的库函数(即 OpenSSL 库)进行计算.如何确保两个程序都使用一个公共库,这意味着 只有 一个库副本被加载到 共享主内存 并且两个程序都从该内存位置访问该库计算? 例如,当第一个程序访问库进行计算时,它从主内存加载到缓存中,当第二个程序想要稍后访问它时,它将访问缓存中的数据(已经被第一个程序加载),不是再次从主内存中. 我在 Linux 下使用 ..
发布时间:2022-01-11 23:14:47 服务器开发

如何强制cpu核心刷新c中的存储缓冲区?

我有一个应用程序,它有 2 个线程,线程 A 与核心 1 的关联性和线程 B 与核心 2 的关联性,核心 1 和核心 2 在同一个 x86 插槽中. 线程 A 对整数 x 进行忙自旋,线程 B 在某些条件下会增加 x,当线程 B 决定增加 x 时,它会使 x 所在的缓存行无效,并根据 x86 MESI 协议存储新的 x在 core2 接收到 invalidate ack 之前存储缓冲区,然后 ..
发布时间:2022-01-06 13:04:38 其他开发

存储缓冲区和行填充缓冲区如何相互作用?

我正在阅读 MDS 攻击论文RIDL:Rogue In-Flight Data Load.他们讨论了 Line Fill Buffer 如何导致数据泄漏.有 关于 RIDL 漏洞和“重播"加载问题,讨论漏洞利用的微架构细节. 阅读该问题后,我不清楚的一件事是,如果我们已经有存储缓冲区,为什么还需要行填充缓冲区. John McCalpin 在 WC-buffer 如何与 LFB 相关联 ..

什么特别将 x86 缓存行标记为脏 - 任何写入,或者是否需要显式更改?

这个问题专门针对现代 x86-64 缓存一致性架构 - 我很欣赏其他 CPU 上的答案可能会有所不同. 如果我写入内存,MESI 协议要求先将缓存行读入缓存,然后在缓存中修改(将值写入缓存行,然后将其标记为脏).在较旧的 write-though 微架构中,这将触发缓存线被刷新,在回写下,被刷新的缓存线可能会延迟一段时间,并且在两种机制下都可能发生一些写组合(更可能是写回).而且我知道这如何 ..
发布时间:2022-01-06 13:02:43 其他开发

在 L1 和 L2 预取数据

在 Agner Fog 的手册 Optimizing software in C++ 的第 9.10 节“Cahce 争用大数据结构"他描述了当矩阵宽度等于称为临界步幅的东西时转置矩阵的问题.在他的测试中,当宽度等于临界步幅时,L1 中矩阵的成本要高 40%.如果矩阵更大并且只适合 L2,成本是 600%! 这在他的文本中的表 9.1 中得到了很好的总结.这与在为什么要转置512x512 的矩阵比 ..
发布时间:2022-01-06 13:00:58 其他开发

多核 Intel CPU 中如何共享高速缓存?

我有几个关于多核 CPU 或多处理器系统中使用的缓存的问题.(虽然与编程没有直接关系,但在为多核处理器/多处理器系统编写软件时会产生很多影响,因此在这里提问!) 在多处理器系统或多核处理器(Intel Quad Core、Core two Duo 等)中,每个 cpu 内核/处理器是否都有自己的缓存(数据和程序缓存)? 莉> 一个处理器/内核是否可以访问彼此的缓存,因为如果允许它们访 ..
发布时间:2022-01-06 13:00:08 其他开发

英特尔的 CLWB 指令使缓存行无效

我正在尝试为 Intel 的 clwb 指令找到不会使缓存行无效的配置或内存访问模式.我正在使用 NVDIMM 对 Intel Xeon Gold 5218 处理器进行测试.Linux 版本是 5.4.0-3-amd64.我尝试使用 Device-DAX 模式并直接将此字符设备映射到地址空间.我还尝试将此非易失性内存添加为新的 NUMA 节点,并使用 numactl --membind 命令将内存 ..
发布时间:2022-01-06 12:56:14 其他开发

L1 缓存命中与 x86 上注册的周期/成本?

我记得在我的架构类中假设 L1 缓存命中是 1 个周期(即与寄存器访问时间相同),但在现代 x86 处理器上实际上是这样吗? L1 缓存命中需要多少个周期?与注册访问权限相比如何? 解决方案 这里有一篇关于这个主题的精彩文章: http://arstechnica.com/gadgets/reviews/2002/07/caching.ars/1 回答您的问题 - 是的, ..

我可以在多核 x86 CPU 上强制缓存一致性吗?

前一周,我写了一个小线程类和一个单向消息管道来允许线程之间的通信(显然,每个线程两个管道,用于双向通信).在我的 Athlon 64 X2 上一切正常,但我想知道如果两个线程都在查看同一个变量并且每个内核上该变量的本地缓存值不同步,我是否会遇到任何问题. 我知道 volatile 关键字会强制一个变量从内存中刷新,但是在多核 x86 处理器上有没有办法强制所有内核的缓存同步?这是我需要担心的 ..
发布时间:2022-01-06 12:45:44 C/C++开发

如何在 x86 Windows 中执行 CPU 缓存刷新?

我对在 Windows 中强制刷新 CPU 缓存感兴趣(出于基准测试的原因,我想在 CPU 缓存中没有数据的情况下进行模拟),最好是基本的 C 实现或 Win32 调用. 是否有一种已知的方法可以通过系统调用或什至像说一个大的memcpy那样偷偷摸摸地做到这一点? Intel i686 平台(P4 及以上也可以). 解决方案 幸运的是,显式刷新缓存的方法不止一种. 指令“ ..
发布时间:2022-01-06 12:29:09 其他开发

全局不可见加载指令

由于存储加载转发,某些加载指令是否永远不会全局可见?换句话说,如果加载指令从存储缓冲区获取其值,则它永远不必从缓存中读取. 正如通常所说的那样,当从 L1D 缓存读取时,负载是全局可见的,不从 L1D 读取的负载应该使其全局不可见. 解决方案 加载全局可见性的概念很棘手,因为加载不修改内存的全局状态,而其他线程不能直接 观察它. 但是一旦乱序/推测执行后尘埃落定,我们可以知道如果线 ..
发布时间:2022-01-06 12:14:34 其他开发

英特尔酷睿 i7 处理器使用了哪种缓存映射技术?

我了解了不同的缓存映射技术,例如直接映射和完全关联或集合关联映射,以及它们之间的权衡.(维基百科) 但我很好奇现在英特尔酷睿 i7 或 AMD 处理器中使用的是哪一个? 这些技术是如何发展的?还有哪些需要改进的地方? 解决方案 直接映射缓存基本上从未用于现代高性能 CPU.对于相同大小的组关联高速缓存,其命中率的巨大优势超过了节能,而控制逻辑只是稍微复杂了一点.现在晶体管的预算 ..
发布时间:2022-01-06 12:12:26 其他开发