首页 文章

缓存,存储缓冲区和BIU / WCB在每个CPU中都有单独的物理缓冲区,或者对于所有缓冲区都有单独的物理缓冲区?

提问于
浏览
2

CPU: Intel Sandy / Ivy Bridge (x86_64)

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

正如_2906686中所知,有几个缓冲区:

  • Cache - 一个众所周知的快速内存缓冲区,由三个缓冲区组成:L1 / L2 / L3每个级别由64字节的缓存行组成 .

  • WB (回写)模式下 - 后台(异步)CPU通过任何序列使用64字节的块将数据从高速缓存写入RAM .

  • WT (直写)模式下 - (同步)使用 MOV [addr], reg 将每个存储到内存中的是将缓存行立即存储到缓存和RAM中 .

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

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

  • BIU (Bus Interface Unit) / WCB (Write Combining Buffers) - 在 WC (写入合并)模式下 . 当存储区域标记为WT时,不使用高速缓存,并使用大小为64字节的BUI / WCB作为高速缓存行 . 当我们以1个字节存储到存储器 MOV [addr], reg 64次时,那么只有当存储了最后一个字节然后整个 BIU / WCB 存储到存储器时 - 这是优化的机制,用于通过64字节的整个块将数据写入存储器区域 . 例如,它是一种非常重要的机制,用于存储数据到设备存储器,通过PCI-Express接口映射到CPU物理地址空间,与记录(发送)相比,记录(发送)64字节增加了实际带宽 . 1个字节 . 但是有一个选项可以使用 SFENCEMFENCE 强制将数据从 BIU / WCB 保存到[远程]内存 .

And some strongly related questions:

1. 缓存,存储缓冲区和BIU / WCB是否都在CPU中使用相同的物理缓冲区,但它的不同部分或所有缓冲区在CPU中都有单独的物理缓冲区?

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

3. 缓存行数等于(65536/64)= L1为1024,(262144/64)= L2为4096,L3为4 MB / 64字节 . 我们不知道Store Buffer的大小 . 但 how many BUIs / WCBs (64 bytes each) we have 在一个CPU-Core或整个CPU上?

4. 正如我们所看到的,命令 SFENCEMFENCE 会影响 Store BufferBIU / WCB . 但这些命令对 Cache (L1/L2/L3) 有什么影响吗?

1 回答

  • 1
    • 高速缓存,存储缓冲区和BIU / WCB都是CPU中的独立物理结构 .

    • 为什么Cache-line和BIU的大小相同,为64字节?为方便和易于设计 . 并且因为各种高速缓存区域之间的边界至少是64字节对齐的 .

    • 单核上的BIU / WCB数量不是架构的一部分,它是一个实现细节,甚至可能从步进变为步进 .

    • SFENCEMFENCE 导致待完成的待处理存储,这可能导致某些可缓存的数据从CPU存储缓冲区写入缓存 .

    (编辑)L1 / L2 / L3高速缓存形成单个高速缓存一致系统,它是外部存储器的快捷方式 .

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

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

    自从P6时代起我就没有使用过英特尔处理器,因此我不知道实现细节,例如当前内核上的WCB数量或存储缓冲区 .

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

相关问题