8

在阅读这个问题时,我遇到了“虚假共享”和“真实共享”这两个术语。我读过什么是虚假分享,但我在真正的分享上找不到任何东西。尽管在提到的问题中,该术语被描述为“建设性干扰”,但我仍然不明白它的含义。

4

3 回答 3

6

这就是我从硬件设计的角度理解的真共享和假共享。如果我错了,请纠正我。

内核在访问变量时会加载一块内存,以减少内存访问时间。在多核系统中,这些“高速缓存行”之间的一致性将被保持。即便如此,由于多种原因,可能会发生缓存未命中,其中两个是两种类型的数据共享的结果。

一个“真正的数据共享”,其中两个内核尝试访问和修改同一个字,导致另一个内核中的缓存线连续失效。假设高速缓存行大小为 2 个字,核心 0 和核心 1 正在尝试修改地址 0x100。假设字节存储,2字缓存线大小意味着0x100~0x108将被加载到核心0和核心1的缓存中。现在当核心0修改0x100处的数据时,缓存线incore 1无效。当核心 1 修改 0x100 处的数据时,它必须使用核心 0 缓存中的数据更新其缓存行,并且核心 0 中的缓存行无效。之后它将写入 0x100。现在如果这发生在一个循环中,大量的带宽被浪费在缓存维护中。这是由于真正共享导致的高速缓存未命中,其中内核之间存在“真正共享”的数据字。

第二种是“虚假数据共享”,两个内核尝试访问和修改同一个缓存行中的两个不同的字,导致另一个内核中的缓存行连续失效。以前面的例子,假设核心 0 想要修改 0x100,核心 2 想要修改 0x104。现在当核心 0 修改 0x100 处的数据时,核心 1 缓存行无效。当核心 1 修改 0x104 处的数据时,它必须使用核心 0 缓存中的数据更新其缓存行,并且核心 0 中的缓存行无效。之后它将写入 0x104。在循环中完成时,这也会导致性能损失。这里的性能损失是由于两个内核之间的数据“错误共享”造成的。

于 2021-05-19T07:50:13.377 回答
0

真正的共享是一个内核访问已加载到单个高速缓存行中的多个附近的内存地址。第一次之后的每次访问都受益于缓存。

于 2019-08-22T10:33:43.580 回答
0

据我理解,真正的共享是指多个核心频繁写入同一个共享变量的问题,而错误共享是指多个核心写入同一缓存行上的不同变量的问题。

在这两种情况下,缓存都必须经常失效才能加载最新版本,但不能通过例如添加填充来修复真正的共享以确保两个变量位于不同的缓存行上。

参考:

于 2022-02-15T13:16:10.990 回答