CPU:英特尔Sandy /常春藤桥(x86_64的)高速缓存,存储缓冲区和BIU/WCB在CPU中各自拥有单独的物理缓冲区还是单个物理缓冲区?
我需要编写该连接通过PCI Express CPU和需要使用的最大带宽的设备驱动器。为此,我将映射的设备内存用于处理器的物理地址空间。然后使用ioremap_wc()
将此内存映射到标记为WC(写入组合)的内核的虚拟地址空间。
作为x86_64的CPU中已知有几个缓冲区:
- 缓存 - 公知的快速存储缓冲器,由三个缓冲器:L1/L2/L3每个级别包括一个64字节的缓存行。
- 在WB(回写)模式 - 在后台CPU中(异步)通过使用任意序列的64字节块将数据从高速缓存写入RAM。
- 在WT(通过写入)模式 - (同步)每个存储到内存使用
MOV [addr], reg
正在存储缓存行到缓存和RAM立即。
详细约高速缓存级:每个核心具有L1(64 KB,1毫微秒)和L2(256 KB,3纳秒),并整体CPU有一个用于所有内核缓冲器L3(4 - 40 MB ,10ns)。
(SB)存储缓冲器 - ,其中所有的数据被顺序地存储缓冲器(队列)。在相同的序列中,数据在后台懒洋洋地存储在内存中。但是可以通过使用
SFENCE
或MFENCE
(例如,用于支持核之间的顺序一致性)来强制将数据从存储缓冲区保存到缓存/ RAM。BIU(总线接口单元)/ WCB(写入合并缓冲器) - 在WC(写联合)模式。当内存区域被标记为WT时,不使用缓存,并使用大小为64字节的BUI/WCB作为缓存行。当我们将内存
MOV [addr], reg
以1个字节存储到内存64次时,只有当最后一个字节被存储时,整个内存才会被存储到内存 - 这是一个优化的机制,用于将数据写入64个整个内存区字节。例如,通过PCI-Express接口映射到CPU物理地址空间的设备存储器的存储数据非常重要,其中通过64字节的记录(发送)增加了与记录(发送)相比的实际带宽1个字节。但有一个选项可以使用SFENCE
或MFENCE
将数据从BIU/WCB强制保存到[remote]内存。
而一些密切相关的问题:
1。高速缓存,存储缓冲区和BIU/WCB是否都在CPU中使用相同的物理缓冲区,但是其中的不同部分,或者它们全部在CPU中具有单独的物理缓冲区?
2.如果高速缓存和BIU使用相同的物理缓冲器,例如高速缓存-L1的两端使用的部分,那么为什么SFENCE/MFENCE
对第二imapct,但还没有对第一。如果它们具有单独的物理缓冲区,那么为什么Cache-line和BIU具有相同的64字节大小?
3.对于L1,高速缓存行的数量等于(65536/64)= 1024,对于L2等于(262144/64)= 4096,对于L3等于4MB/64字节。存储缓冲区的大小我们不知道。但是单个CPU-Core或整个CPU上有多少个BUI/WCB(每个64字节)?
正如我们所看到的,命令SFENCE
或存储缓冲区和BIU/WCBMFENCE
影响。但是这些命令是否对缓存(L1/L2/L3)有影响?
你的CPU型号是什么? – osgx 2014-09-15 18:55:39
@osgx CPU:Intel Sandy/Ivy Bridge(x86_64) – Alex 2014-09-15 18:59:28
你确定你的L1是64k吗?也许你数了数据和指令高速缓存 – Leeor 2014-09-17 14:13:57