缓存、存储缓冲区和BIU/WCB在CPU中是分别有单独的物理缓冲区,还是共用一个缓冲区?

3

CPU: 英特尔 Sandy / Ivy Bridge (x86_64)

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

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

  1. 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)。

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

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

还有一些相关问题:

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

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

3. L1缓存的缓存行数为(65536/64)= 1024,L2缓存为(262144/64)= 4096,L3缓存为4 MB / 64字节。我们不知道Store Buffer的大小。但是单个CPU核心或整个CPU上有多少个BUIs / WCBs(每个64字节)

4. 如我们所见,命令SFENCEMFENCE会影响存储缓冲区BIU / WCB。但是这些命令是否会对缓存(L1 / L2 / L3)产生任何影响?


你的CPU型号是什么? - osgx
@osgx CPU:英特尔Sandy/Ivy Bridge(x86_64) - Alex
你确定你的L1是64k吗?也许你把数据和指令缓存都算上了。 - Leeor
@Leeor 是的,我计算了两者(L1数据 + L1指令)。 - Alex
1个回答

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

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

  3. 单个核上的BIU/WCB数量不是体系结构的一部分,它是一个实现细节,甚至可能会因为步进而改变。

  4. SFENCEMFENCE会导致待处理的存储被完成,这可能会导致一些可缓存数据从CPU存储缓冲区写入缓存。

(编辑) L1/L2/L3缓存形成一个单一的缓存一致系统,是连接外部内存的快捷方式。

一项栅栏操作会导致待处理的存储被写入到某个特定级别的高速缓存(L1/L2或L3),具体取决于设计中实现的高速缓存包含属性。通常,栅栏指令会导致可缓存数据从存储缓冲区移动到L1,但我认为可能存在将某个内存区域标记为仅在L2或L3中可缓存的情况。在这种情况下,数据将从存储缓冲区移动到L2或L3。(许多MIPS处理器支持此操作模式。)
非可缓存数据将始终直接从存储缓冲区/WCB写入到内存,并且永远不会写入到高速缓存中。
自P6时代以来,我就没有使用过英特尔处理器,因此不了解当前核心上WCB或存储缓冲区的数量等实现细节。
如果您想了解特定英特尔核心的实现细节,请查看《微处理器报告》或“Hot Chips”会议的论文。(两者都应该可以在大学图书馆中找到。)

非常感谢!但是您认为英特尔Ivy Bridge(例如第1步)可能有多少BIU呢?当我们从寄存器->(存储缓冲区)->到RAM进行存储时,这个值会立即存储到缓存L3中,还是首先存储到L1中(然后使用SFENCE将其刷新到L3中)? - Alex
非常感谢!也就是说,当我们使用WCB时,缓存和存储缓冲区不会被使用? - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接