问题标签 [mesi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
caching - MESI 协议。写入缓存未命中,但缓存行副本存在于另一个 CPU 上。为什么需要从主存中获取?
根据此图,如果写入缓存未命中并在另一个 CPU 缓存中复制(例如共享/独占状态)。步骤是:
1. Snooping cores (with cache line copy) 将 state 设置为Invalid。
2.当前缓存存储新的主存值。
为什么其中一个监听内核一开始不能将其缓存线值放在总线上?然后进入无效状态。相同的算法用于现有副本的读取未命中。谢谢你。
caching - 将相同值再次写入缓存行的性能
我有时会看到这样的优化代码:
与此代码相反:
我想这段代码是以这种方式编写的,以减少 CPU 中的内存带宽。这是对典型 CPU 的良好优化(当值可能已经为 0 时),为什么?
这对 MESI 状态意味着什么:如果我将相同的值写回高速缓存行(写入但不修改),是否存在从共享到修改的状态转换?或者这对于 CPU 来说是否太复杂而无法检测到?
典型的 CPU(或至少一些)是否针对这种情况进行了优化?
cpu-architecture - 缓存一致性 - MESI 协议
在使用 MESI 协议(使用 l1 和 l2 包容性)的缓存中是否存在这样的情况,其中 l2 可以将无效指令发送到 l1 中已经无效的行。
assembly - 缓存操作是原子的吗?
我正在学习 CPU 缓存,现在我仍然对缓存一致性协议 (MESI) 有误解。想象一下,我们有 2 个内核有一个处于共享状态的缓存线。其中一个执行读取,另一个执行写入:
核心 1 可以观察到一些中间状态吗?我的意思是这样的:
Core 2
将缓存行标记L1D
为已修改并将更改写入其中。core 1
的缓存中的缓存行L1D
仍然处于Shared
状态,因此读取恰好读取了陈旧的值。- 在读取过时值之后,缓存中的行已
core 1
被L1D
标记为无效。
在英特尔的 MESI/MESIF 实施中是否可能出现这种情况?
caching - 英特尔 64 和 IA-32 上的 MESI 有何意义
- MESI 的重点是保留共享内存系统的概念。
- 然而,使用存储缓冲区,事情变得复杂了:
- 一旦数据到达 MESI 实现的缓存,内存就会在下游保持一致。
- 但是,在此之前,每个内核可能不同意内存位置 X 中的内容,具体取决于每个内核的本地存储缓冲区中的内容。
- 因此,从每个核心的角度来看,内存的状态似乎是不同的——它是不连贯的。
- 那么,为什么我们要“部分”地执行与 MESI 的一致性呢?
编辑:在进一步缩小了真正让我困惑的地方之后,进行了实质性的编辑。我试图保持问题的一般概念不变,以保持收到的重要答案的相关性。
cpu - 存储缓冲区是否发送读取无效消息或无效请求消息?
我认为,为了让 CPU 继续执行后续指令,存储缓冲区必须做部分 MESI 处理以获得缓存一致性,因为最新的值存储在存储缓冲区而不是缓存中。因此,存储缓冲区发送读取无效或无效 REQ 消息,并在 ACK 到达后刷新最新值到缓存。
而 Cache 做不到。
我的分析和结果对吗?
还是所有MESI处理都由缓存完成?
caching - MSI、MESI、MOSI、MOESI 和 MESIF 有哪些缓存一致性协议?
我想知道我上面提到的是什么样的协议。更准确地说,我的问题是:它们是写更新还是写无效?还是取决于他们的实施?谢谢
atomic - 当 CPU 将 storebuffer 中的值刷新到 L1 Cache 时?
Core A 将值 x 写入 storebuffer,等待无效的 ack,然后将 x 刷新到缓存。它是只等待一个 ack 还是等待所有 ack ?它如何知道所有 CPU 中有多少 ack?
performance - x86 MESI 无效缓存线延迟问题
我有以下进程,我尝试使 ProcessB 的延迟非常低,所以我一直使用紧密循环并隔离 cpu core 2。
共享内存中的全局变量:
ProcessA(在核心 1 中)
ProcessB(在核心 2 中)
ProcessC(在核心 3 中)
在这些简单的伪代码进程中,当 ProcessesA 将 bDOIT 修改为 1 时,它将使 Core 2 中的缓存行无效,然后在 ProcessB 获得 bDOIT=1 之后,ProcessB 将执行 memcpy(localxyz,glbXYZ) 。
由于 evry 1000 usec ProcessC 将使 Core2 中的 glbXYZ 无效,我想这会影响 ProcessB 尝试执行 memcpy(localxyz,glbXYZ) 时的延迟,因为当 ProcessB 将 bDOIT 扫描到 1 时,glbXYZ 已经被 ProcessC 无效,
glbXYZ 的新值仍在核心 3 L1$ 或 L2$ 中,在 ProcessB 实际得到 bDOIT=1 后,此时 core2 知道它的 glbXYZ 无效,所以此时它询问 glbXYZ 的新值,ProcessB 延迟受等待glbXYZ 的新值。
我的问题 :
如果我有一个 processD(在核心 4 中),它会:
这个 ProcessD 是否会让 glbXYZ 更早地刷新到 L3$,这样当核心 2 中的 ProcessB 知道它的 glbXYZ 无效时,它会询问 glbXYZ 的新值,这个 ProcessD 会帮助 PrcoessB 更早地获得 glbXYZ 吗?!由于 ProcessD 一直帮助将 glbXYZ 变为 L3$。