3.2 双环近似

为了帮助减少每个内核必须支持的 warp 数量以隐藏较长的执行延迟,能够在较早的指令尚未完成时从 warp 发出后续指令是有帮助的。 然而,前面描述的单循环微架构阻止了这一点,因为该设计中的调度逻辑只能访问线程标识符和下一条要发出的指令的地址。 具体来说,它不知道为 warp 发出的下一条指令是否依赖于尚未完成执行的较早指令。 为了提供这样的依赖信息,有必要首先从存储器中取出指令以确定存在什么数据和/或结构危险。 为此,GPU 实现了一个指令缓冲区,指令是在缓存访问之后放置的。 一个单独的调度程序用于决定指令缓冲区中的几条指令中的哪一条应该紧接着流水线的其余部分发出。

指令存储器被实现为由一个或多个二级(通常是统一的)缓存支持的一级指令缓存。 指令缓冲区还可以结合指令未命中状态保持寄存器 (MSHR) [Kroft, 1981] 帮助隐藏指令高速缓存未命中延迟。 在缓存命中或缓存未命中后,指令信息被放入指令缓冲区。 指令缓冲区的组织可以采用多种形式。 一种特别直接的方法是为每个 warp 存储一条或多条指令。

接下来,让我们考虑如何检测同一 warp 中指令之间的数据依赖性。 它们是检测传统 CPU 架构中指令之间依赖关系的两种传统方法:记分板和保留站。 保留站用于消除名称依赖性,并引入对面积和能量方面昂贵的关联逻辑的需求。 记分板可以设计为支持有序执行或乱序执行。 支持乱序执行的记分牌,如 CDC 6600 中使用的记分牌,也相当复杂。 另一方面,单线程有序 CPU 的记分牌非常简单:记分牌中的每个寄存器都用一个位表示,只要发出将写入该寄存器的指令,该位就会被设置。 任何想要读取或写入在记分板中设置了相应位的寄存器的指令都将停止,直到该位被写入寄存器的指令清除为止。 这可以防止先写后读和先写后写的危险。 当结合顺序指令问题时,这个简单的记分板可以防止读后写的危险,前提是寄存器文件的读取被限制为按顺序发生,这在顺序 CPU 设计中通常是这种情况。 鉴于它是最简单的设计,因此会消耗最少的面积和能量,GPU 实现了有序记分板。 然而,如下所述,在支持多个 warp 时使用有序记分板存在挑战。

上述简单有序记分板设计的第一个问题是现代 GPU 中包含的大量寄存器。 每个 warp 最多 128 个寄存器,每个内核最多 64 个 warp,每个内核总共需要 8192 位来实现记分板。 上述简单有序记分板设计的另一个问题是遇到依赖的指令必须在记分板中重复查找其操作数,直到它所依赖的先前指令将其结果写入寄存器文件。 对于单线程设计,这几乎不会带来复杂性。 然而,在有序发布的多线程处理器中,来自多个线程的指令可能正在等待较早的指令完成。 如果所有此类指令都必须探测记分牌,则需要额外的读取端口。 最近的 GPU 支持每个内核最多 64 个 warp,最多 4 个操作数允许所有 warp 在每个周期探测记分板,这将需要 256 个读取端口,这将非常昂贵。 一种替代方法是限制每个周期可以探测记分板的 warp 数量,但这会限制可以考虑用于调度的 warp 数量。 此外,如果所有被检查的指令都不具有依赖性,则即使其他无法检查的指令碰巧不具有依赖性,也不会发出任何指令。

这两个问题都可以使用 Coon 等人提出的设计来解决。 [2008]。 该设计不是在每个 warp 的每个寄存器中保存一个位,而是在每个 warp 中包含少量条目(在最近的一项研究 [Lashgar 等人,2016 年] 中估计约为 3 或 4 个),其中每个条目是 将由已发出但尚未完成执行的指令写入的寄存器。 当指令发出和回写时,都会访问常规的有序记分板。 取而代之的是,当一条指令被放入指令缓冲区以及一条指令将其结果写入寄存器文件时,就会访问 Coon 等人的记分板。

当一条指令从指令缓存中取出并放入指令缓冲区时,相应 warp 的记分板条目将与该指令的源寄存器和目标寄存器进行比较。 这会产生一个短位向量,该扭曲的记分板中的每个条目都有一个位(例如,3 或 4 位)。 如果记分板中的相应条目与指令的任何操作数匹配,则设置一个位。 然后将该位向量与指令缓冲区中的指令一起复制。 在所有位都被清除之前,一条指令没有资格被指令调度程序考虑,这可以通过将向量的每一位输入或非门来确定。 当指令将它们的结果写入寄存器文件时,指令缓冲区中的相关位被清除。 如果给定 warp 的所有条目都用完了,那么要么为所有 warp 获取停顿,要么丢弃该指令并且必须再次获取。 当已执行的指令准备好写入寄存器文件时,它会清除记分板中分配给它的条目,还会清除存储在指令缓冲区中的同一 warp 中任何指令的相应依赖位。

在双循环架构中,第一个循环选择指令缓冲区中有空间的 warp,查找其程序计数器并执行指令缓存访问以获得下一条指令。 第二个循环在指令缓冲区中选择一条没有突出依赖关系的指令并将其发布到执行单元。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值