gpt4 book ai didi

caching - Cache、Store Buffer 和 BIU/WCB 在 CPU 中是各自有单独的物理缓冲区,还是只有一个?

转载 作者:行者123 更新时间:2023-12-04 18:06:19 30 4
gpt4 key购买 nike

CPU:Intel Sandy/Ivy Bridge (x86_64)

我需要编写一个通过 PCI Express 连接到 CPU 的设备驱动程序,并且需要使用最大带宽。为此,我使用映射的设备内存到处理器的物理地址空间。然后使用ioremap_wc()将这 block 内存映射到标记为WC(Write Combined)的内核虚拟地址空间。

众所周知,在 x86_64 CPU 中有几个缓冲区:

  1. 缓存 - 一种众所周知的快速内存缓冲区,由三个缓冲区组成:L1/L2/L3 每个级别由一个 64 字节的缓存行组成。
    • WB(回写)模式下 - (异步)在后台 CPU 通过使用 64 字节 block 以任意顺序将数据从缓存写入 RAM。
    • WT(直写)模式下 - (同步)使用 MOV [addr], reg 将缓存行存储到缓存中和 RAM 立即。

关于缓存级别的详细信息:每个内核都有 L1(64 KB,1 ns)和 L2(256 KB,3 ns),整个 CPU 有一个用于所有内核的缓冲区 L3(4 - 40 MB,10 ns)。

  1. (SB) Store Buffer - 一个缓冲区(队列),所有数据都按顺序存储在其中。并且在相同的序列中,后台的数据懒惰地存储在内存中。但是有一个选项可以使用 SFENCEMFENCE 强制将数据从存储缓冲区保存到 Cache/RAM(例如支持顺序核心之间的一致性)。

  2. BIU(总线接口(interface)单元)/WCB(写组合缓冲区) - 在 WC(写组合)模式下。当内存区域标记为WT时,不使用缓存,使用大小为64字节的BUI/WCB作为缓存行。当我们将 MOV [addr], reg 存储到内存中 1 个字节 64 次时,只有当最后一个字节被存储时,整个 BIU/WCB 存储到内存中- 这是优化的机制,用于将数据以整 block 64 字节的 block 写入内存区域。例如,通过PCI-Express接口(interface)将数据存储到映射到CPU物理地址空间的设备内存是一个非常重要的机制,其中记录(发送)64字节比记录(发送)增加实际带宽数倍。 1个字节。但是有一个选项可以使用 SFENCEMFENCE 将数据从 BIU/WCB 强制保存到 [远程] 内存。

以及一些密切相关的问题:

1.Cache、Store Buffer 和 BIU/WCB 是否都在 CPU 中使用相同的物理缓冲区,但它的不同部分,或者它们在 CPU 中都有单独的物理缓冲区?

2. 如果 Cache 和 BIU 使用相同的物理缓冲区,例如都使用 Cache-L1 的一部分,那么为什么 SFENCE/MFENCE 对第二个有影响,但是没有第一。如果它们有单独的物理缓冲区,那么为什么 Cache-line 和 BIU 具有相同的 64 字节大小?

3. L1 的缓存行数等于 (65536/64) = 1024,L2 的 (262144/64) = 4096,L3 的缓存行数为 4 MB/64 字节。我们不知道存储缓冲区的大小。但是我们在单个 CPU 核心或整个 CPU 上有多少 BUI/WCB(每个 64 字节)

4. 正如我们所见,SFENCEMFENCE 命令对 Store Buffer 和 < strong>BIU/WCB。但是这些命令对缓存(L1/L2/L3)有什么影响吗?

最佳答案

  1. 缓存、存储缓冲区和 BIU/WCB 都是 CPU 中独立的物理结构。

  2. 为什么Cache-line和BIU的大小一样,都是64字节?为了设计方便。并且因为各种可缓存区域之间的边界至少是 64 字节对齐的。

  3. 单个内核上的 BIU/WCB 数量不是架构的一部分,它是一个实现细节,甚至可能会随着步进而变化。

  4. SFENCEMFENCE 导致挂起的存储完成,这可能导致一些可缓存的数据从 CPU 存储缓冲区写入缓存。

(edit) L1/L2/L3 高速缓存形成一个单一的高速缓存一致性系统,这是外部存储器的捷径。

根据设计中实现的缓存包含属性,栅栏操作会导致将待处理的存储写入缓存的某个特定级别(L1/L2 或 L3)。最典型的栅栏指令会导致可缓存的数据从存储缓冲区移动到 L1,但我相信有可能将内存区域标记为仅在 L2 或 L3 中可缓存。在那种情况下,数据将从存储缓冲区移动到 L2 或 L3。 (许多 MIPS 处理器支持这种操作模式。)

不可缓存的数据总是从存储缓冲区/WCB 直接写入内存,永远不会写入缓存。

我从 P6 时代起就没有研究过 Intel 处理器,所以我不知道实现细节,例如 WCB 的数量或当前内核上的存储缓冲区。

如果您想了解特定英特尔内核的实现细节,请查看 Microprocessor Report ,或 Hot Chips session 记录。 (两者都应在大学图书馆中提供。)

关于caching - Cache、Store Buffer 和 BIU/WCB 在 CPU 中是各自有单独的物理缓冲区,还是只有一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25809677/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com