问题标签 [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.

0 投票
1 回答
897 浏览

x86 - 现代 Intel x86 CPU 如何实现对商店的总订单

由于其 TSO 内存模型,x86 保证了所有存储的总顺序。我的问题是,是否有人知道这是如何实际实施的。

我对所有 4 个栅栏是如何实现的印象很好,所以我可以解释一下如何保持本地秩序。但是 4 个栅栏只会给出程序顺序;它不会给你 TSO(我知道 TSO 允许旧商店在新负载之前跳转,因此隐式需要 4 个栅栏中的 3 个)。

单个地址上所有内存操作的总顺序是一致性的责任。但我想知道英特尔(尤其是 Skylake)如何在多个地址的商店中实现总订单。

0 投票
0 回答
34 浏览

caching - 缓存一致系统上的所有处理器内核是否需要在任何时间点查看共享数据的相同值

据我所知,缓存一致性由以下 3 个要求定义:

  1. 从核心 C 上的地址 X 读取 R,如果在 W 和 R 之间没有其他核心写入 X,则返回最近一次写入 W 写入 C 上的 X 的值。

  2. 如果核心 C1 写入 X 并且核心 C2在足够的时间后读取,并且两者之间没有其他写入,则 C2 的读取返回 C1 写入的值。

  3. 对同一位置的写入是序列化的:必须看到对 X 的任何两次写入在所有内核上都以相同的顺序发生。

据我了解这些规则,它们基本上要求所有线程在某个合理的时间内以相同的顺序查看其他线程所做的更新,但似乎没有要求在任何时间点查看相同的数据。例如,假设线程 A 向共享内存位置 X 写入一个值,然后线程 B 向 X 写入另一个值。从 X 读取的线程 C 和 D 必须看到相同的更新顺序:A,B。假设线程 C 已经看到更新 A 和 B,而线程 D 只观察到 A(事件 B 尚未看到)。假设写入 X 和读取 X 之间的时间间隔足够小(小于我们认为的足够时间),这种情况不会违反任何一致性规则,不是吗?

另一方面,一致性协议(例如 MSI)使用写入无效来保证所有内核都具有共享变量的最新值。Wiki说:“目的是两个客户端决不能看到相同共享数据的不同值”。如果我写的关于连贯性规则的内容是真的,我不明白这一点从何而来。我的意思是,我意识到它很有用,但看不到它是在哪里定义的。

0 投票
0 回答
69 浏览

caching - 多级缓存中的一致性如何实现?

我已经了解缓存一致性 FSM 如何适用于单个私有 L1 缓存和公共 LLC/内存。但是当有 2 个私有缓存 - L1 和 L2 以及一个公共内存时,他们无法找到讨论缓存一致性的好资源。我不明白互连网络在整个模型中的位置,L1缓存snoop及其FSM是什么。

0 投票
1 回答
347 浏览

caching - 不同级别缓存(即 L1、L2 和 L3)之间的缓存一致性(MESI 协议)

这是关于跨不同层的缓存一致性协议cache。我的理解(X86_64)L1是,它由一个核心专有,L2位于两个核心之间,L3适用于 CPU 插槽中的所有核心。我已经阅读了MESI关于存储缓冲区、无效队列、无效消息等的协议功能。我的疑问是它仅MESI适用于L1或者它也适用于L2L3。或者在 forL2L3.

0 投票
0 回答
70 浏览

c++ - 理解记忆障碍

目前正在阅读一篇关于内存屏障的文章(在 MESI 中),对此我几乎没有任何疑问。内存屏障有 4 种类型 LoadLoad、StoreStore、LoadStore 和 StoreLoad。我了解 LoadLoad 和 StoreStore 的作用。

例如 LoadLoad 它是一个读取屏障(在 Linux smp_rmb 上),它使核心处理来自无效队列的所有无效请求。StoreStore 也是一样,它使核心等待所有存储请求。

但是 LoadStore 和 StoreLoad 是做什么的呢?是不是跟LoadLoad和StoreStore一样?如果 LoadStore 使核心在存储之前完成所有加载操作,那么核心是否以另一种方式而不是处理失效队列?

0 投票
1 回答
55 浏览

multithreading - 在同一个物理 CPU 内核上同步是否更快?

我有个问题。如果一个线程修改了一个变量,同一个物理内核(不同的超线程内核)上的线程会比其他内核更早地看到修改吗?还是必须等到所有其他核心都看到它?

我一直在尝试将两个线程固定在同一个物理内核上,但性能会下降。我知道这是因为两个核心共享大量资源。但在同步方面。将线程放在同一个物理核心上会有帮助吗?

谢谢!

0 投票
1 回答
113 浏览

c++ - MESI 协议可以在 cpu 内核之间自动同步变量值吗?

据我所知,对变量的并发访问需要某种同步(互斥、原子、内存屏障......),否则无论尝试多少次,一个线程中的读取都可能永远不会获得更新的值。

但是,我的同事说 MESI 协议(不考虑没有 MESI 或类似东西的 cpu)能够在 cpu 缓存之间自动同步,如果读取由其他线程更新的变量而在读写中没有任何同步(只是普通读取,例如“if(a != 0)”),经过一段时间后,如果继续尝试,read 将最终获得更新的值。我认为这里不能保证。

所以我写了一个代码来测试这个:

但是,运行会受到许多因素的影响,有时会阻塞,有时会打印“检测”。不能作为有力的证据。

我已经搜索过了,但文档对此并不清楚。看起来 MESI 确实可以做“自动同步”(程序员不需要做任何事情),'PrRd' 和 'PrWr' 似乎只是正常的读写请求,没有 LOCK 或 CMPXCHG 或类似的东西。但是为了加快速度,它引入了一个存储缓冲区,这会使cpu混乱,并使“自动同步”的效果失效。为了解决这个问题,程序员需要使用工具(内存屏障)来控制它。这意味着程序员必须手动进行同步才能使事情正确。

我理解这个正确吗?如果是,假设程序员不手动执行,是否可以保证获取更新值的时间延迟?我认为读取可能永远不会获得更新的值,但是我找不到证据。

0 投票
1 回答
109 浏览

caching - MSI:当共享状态和无效状态可以同时出现时

那么,正如标题所说,处理器 0 的行 A 是否有可能处于共享 (S) 状态,而处理器 1 的行 B 是否有可能处于无效 (I) 状态?


想象以下情况:

  • P0:A线| 修改的
  • P1:A线| 无效的
  • P2:A线| 无效的

如果 P2 向 A 行发出读取请求,那么 P1 的最终状态是什么?共享还是保持无效?

0 投票
0 回答
31 浏览

caching - 在 OS 中禁用缓存一致性协议(需要模拟缓存不一致性)

我正在研究一个与研究相关的项目,我一直在尝试编写一个程序来显示没有缓存一致性协议的问题。本质上,我想编写两个程序(或单程序多线程),其中一个更新共享变量,而另一个虽然在更新后读取变量,但由于其 CPU 缓存未更新而得到错误的值。

为此,我必须在我假设的操作系统中禁用缓存一致性。可能吗?(我在 Ubuntu 上)

如果这是不可能的,是否有其他方法可以证明缓存不连贯性?

0 投票
0 回答
21 浏览

java - Java中没有volatile的变量

在上面的程序中,loop是一个没有volatile的普通变量,如果loop是空的

主线程不能停止,但是如果有body的循环

,然后它能够​​停止。在我看来,主要的tad不知道变量已经改变,所以它不应该停止。但是为什么第二个循环结束了?