Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (16) - L1数据缓存/存储转发&访存消歧&存储体冲突

版权声明:转载必须保留原出处,没有书面许可不可用于商用目的, https://blog.csdn.net/qq_43401808/article/details/85998175

Store Forwarding

如果读存操作紧跟着写存操作,且要读取的数据包含在要写入的数据中,则数据可能可以从写操作直接转发给读操作。这个过程叫做“存储-读取转发”,简称为“存储转发”。这种技术可以节省读操作的时延周期数,因为读操作无需等待写操作完成后在从存储器中读取数据,而是直接从写操作中获取数据(注:从写存缓冲区中把数据转发给读操作)。利用存储转发机制,程序员可以快速的移动复杂的结构体,但是不会损失转发某些子域的能力。与前端微架构相比,访存控制单元可以处理的存储转发条件具有更少的限制。

做进行存储转发操作,必须满足如下的条件:

  • 写存操作必须是对该地址的最后一条写操作,位于读存操作之前。
  • 写存操作的数据必须完全包含读存操作想要读取的数据
  • 读存操作访问的必须是回写式类型的存储器区域,且读存操作与写存操作都不能是非时效访问操作。

在下列情形下,不能做存储转发操作(注:可参看下面的几张表):

  • 如果相对于前面的16或32字节的写存操作,4或8字节读存操作 跨越了8字节边界
  • 如果相对于32字节的写存操作,任何的跨越16字节边界的读存操作

下面4张表详细的记述了存储转发的行为。给定一个写存长度,所有的可以转发的读存操作被标记为“F”。从32字节存储操作的转发 类似于从两个半幅16字节存储操作的转发行为。不能转发的情况标记为“N”。

Memory Disambiguation

一个读存操作有可能会依赖前面的某个写存操作。在前面所有的写存操作的目标地址未明确之前,许多微架构只能阻塞读存操作。访存消歧器可以预测哪些读存操作不依赖前面的写存指令。当消歧器预测到没有依赖关系的读存操作时,即便前面的写存地址尚未明确,也可以投机式地让读存指令执行,从L1缓存中读取数据。这样可以隐藏读存时延。最终,预测结果会被校验。如果真的发生冲突,即实际有依赖,则读存指令以及以后的指令会被重新执行。如果没有依赖,“投机读”成功,获得性能提升。

以下的读存操作不会做投机消歧读。这些读操作会一直等待直到前面所有的写存操作地址明确。

  • 跨越16字节边界的读存操作。
  • Intel AVX 32字节读操作,但是读取地址没有按照32字节对齐

如果读存操作地址与写存操作地址具有相同的低12比特位[0:11],则访存消歧器会假设这两个操作具有依赖性。

Bank Conflict

由于16字节的读存操作可以跨越三个存储体,每周期可以进行两个读操作,所有可能导致在单周期内同时访问8个存储体中的6个。当两个读操作同时需要不同组(set)中同一个存储体时就会发生存储体冲突(两个操作地址具有相同的2-4比特位)。当发生冲突时,其中的读操作在内部会被“回收(recycled)”。

注:load reg128, 0x000 与 load reg128, 0x200具有相同的[2-4]比特位,会产生存储体冲突。

在许多情况下,两个读存操作会访问同一个缓存行中的同一个存储体,例如当从栈中弹出操作数时,或者按任何顺序访问。在这些情况下,不会发生冲突,读操作会被同时服务(即同时进行)。

猜你喜欢

转载自blog.csdn.net/qq_43401808/article/details/85998175
今日推荐