2014-09-12 51 views
2

CPU:英特尔Sandy /常春藤桥(x86_64的)高速缓存,存储缓冲区和BIU/WCB在CPU中各自拥有单独的物理缓冲区还是单个物理缓冲区?

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

作为x86_64的CPU中已知有几个缓冲区:

  1. 缓存 - 公知的快速存储缓冲器,由三个缓冲器: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)存储缓冲器 - ,其中所有的数据被顺序地存储缓冲器(队列)。在相同的序列中,数据在后台懒洋洋地存储在内存中。但是可以通过使用SFENCEMFENCE(例如,用于支持核之间的顺序一致性)来强制将数据从存储缓冲区保存到缓存/ RAM

  • BIU(总线接口单元)/ WCB(写入合并缓冲器) - 在WC(写联合)模式。当内存区域被标记为WT时,不使用缓存,并使用大小为64字节的BUI/WCB作为缓存行。当我们将内存MOV [addr], reg以1个字节存储到内存64次时,只有当最后一个字节被存储时,整个内存才会被存储到内存 - 这是一个优化的机制,用于将数据写入64个整个内存区字节。例如,通过PCI-Express接口映射到CPU物理地址空间的设备存储器的存储数据非常重要,其中通过64字节的记录(发送)增加了与记录(发送)相比的实际带宽1个字节。但有一个选项可以使用SFENCEMFENCE将数据从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)有影响?

    +0

    你的CPU型号是什么? – osgx 2014-09-15 18:55:39

    +0

    @osgx CPU:Intel Sandy/Ivy Bridge(x86_64) – Alex 2014-09-15 18:59:28

    +0

    你确定你的L1是64k吗?也许你数了数据和指令高速缓存 – Leeor 2014-09-17 14:13:57

    回答

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

    2. 为什么Cache-line和BIU具有相同的大小64字节?为了方便和便于设计。并且因为各个cacheabilty区域之间的边界至少有64个字节对齐。

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

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

    (编辑)L1/L2/L3缓存形成一个单一的缓存一致性系统,它是外部存储器的捷径。

    取决于设计中实现的缓存包含属性,fence操作会导致待定存储被写入某个特定级别的缓存(L1/L2或L3)。通常情况下,fence指令会导致可缓存的数据从存储缓冲区移动到L1,但我认为有可能将内存区域标记为仅L2或仅L3中的可缓存区域。在这种情况下,数据将从存储缓冲区移至L2或L3。 (许多MIPS处理器都支持这种操作模式。)

    不可缓存的数据将始终从存储缓冲区/ WCB直接写入内存,并且永远不会写入缓存。

    自从P6开始,我就没有在英特尔处理器上工作过,所以我不知道实现细节,例如当前内核上的WCB或存储缓冲区的数量。

    如果您想了解特定英特尔内核的实现细节,请参阅Microprocessor Report或会议的热点讨论会会议。 (两者应在大学图书馆提供。)

    +0

    非常感谢!但是,您如何看待英特尔Ivy Bridge有多少BIU?(例如,步骤1)?当我们从寄存器 - >(存储缓冲区) - >存储到RAM时,那么这个值立即存储到L3缓存中,或者首先存储到L1(通过使用'SFENCE'冲刷到L3)? – Alex 2014-09-16 20:00:22

    +0

    非常感谢!即当我们使用WCB时,Cache和Store-buffer不用? – Alex 2014-09-17 09:04:43

    +1

    这是正确的。 – markgz 2014-09-17 17:47:17