Pages

Monday, January 3, 2011

向量处理器(4)

2.3 向量处理器 Load-Store 单元及内存系统
向量处理器中 Load-Store 单元的行为远比算术功能部件复杂得多。Load 的启动时间(start-up)指的是把第一个 word 从内存中取到寄存器里花的时间。如果向量中剩下的部分可以没有停顿地从内存中给出,那么其触发率(initiation rate)就等于新的 word 被取出或者存进去的速率。不同于较为简单的功能部件,LS 单元的触发率不一定是 1 个时钟周期,因为 memory bank 的停顿会降低有效吞吐率。

通常来讲,LS  单元的启动时间带来的性能惩罚比算术功能部件要高--在某些处理器上超过 100 个时钟周期。对于 VMIPS 而言,我们假定启动时间是 12 个时钟周期,和 Cray-1 一样。图 F.6 总结了 VMIPS 向量操作的启动延迟。

为了维持触发率为每个周期取出或者存储 1 word,内存系统必须有能力给出或者接受那么多的数据。这通常可以由把访存操作分散到独立的 memory bank 中实现。就像我们将在下一小节中会看到的,拥有很多的 bank 对于存取或者储存一行或者一列数据这样的向量访存操作很有效。

大多数的向量处理器基于以下三个原因采用 memory bank 而不是简单的 interleaving [1]
1.  大多数的向量处理器支持一个周期内进行多个 load 或者 store 操作,并且 memory bank 的时钟周期通常是 CPU 时钟周期的几倍长。为了支持多个同时的访存操作,内存系统需要多个 memory bank,并且要有能力独立地控制访问每个 bank 的地址。
2.  就像我们在下一小节会看到的那样,很多向量处理器需要支持地址不连续的访存操作。在这样的情况下,需要独立的 bank 寻址,而不是简单的 interleaving
3.  很多向量计算机支持多个处理器共享一个内存系统,所以每个处理器会产生自己各自的独立的地址流。

总而言之,以上特性导致了向量处理器中大量的独立的 memory bank,就像下面的例子所示。
_____________________________________________________
例题Cray T90 CPU 时钟周期是 2.167 ns,在最大的配置情况下 Cray T932)有 32 个处理器,每个处理器可以在一个时钟周期产生 4 load 操作和 2 store 操作。CPU 的时钟周期是 2.167 ns,但是内存系统使用的 SRAM 的时钟周期是 15 ns。计算最少需要的 memory bank 数目以使得所有的 CPU 能够获得满内存带宽。

解答:每个时钟周期最大可能的访存数目是 192 32 CPU,每个产生 6 个访存请求)。每个 SRAM bank 相当于 15 / 2.167 = 6.92 CPU 时钟周期,进位到 7。所与我们最最少需要 192 × 7 = 1344 memory bank

Cray T932 实际上有 1024 memory bank,所以它不能满足所有 CPU 同时的带宽要求。后继的 内存系统升级使用了 15 ns 的异步 SRAM 以及流水化的可以减半内存时钟周期的同步 SRAM ,从而提供足够的带宽。
_____________________________________________________

所需的访存速率和每个 bank 的访存时间决定了需要多少个 memory bank 以避免 stall。下一个例子展示了这些时序的东西在向量处理器里是如何相互联系的。
_____________________________________________________
例题:假定我们想取出从地址 136 开始的 64 个向量元素,每一次访存操作耗时 6 个时钟周期。需要多少个 memory bank 以支持平均每一个时钟周期一次 fetch 操作?访问 bank 的地址分别是什么?各向量元素分别是在什么时刻到达 CPU

解答:每次访存 6 个时钟周期意味着至少需要 6 bank,因为我们希望 bank 数是 2 的幂,因为选择 8 bank。图 F.7 展示了对于一个 8 bank,访存延迟为 6 个周期的内存系统进行开始几次访存的情形 [2]
_____________________________________________________

F.7 内存地址以bank 编号以及每个访存开始的时间。 每个 memory bank 在每个访存开始的时候锁存访存地址,然后用 6 个周期给出一个数据返回 CPU。注意 CPU 没法保持所有 8 bank 都处于忙碌状态,因为它在一个周期只能给出一个地址或者接受一个数据。

实际的 memory bank 的时序被分离成两个不同的部分:访存延迟(access latency)和 bank 周期时间(bank cycle time)或者 bank 忙碌时间(bank busy time)。访存延迟是指从地址到达 bank 开始直到 bank 给出一个数据的时间。忙碌时间指的是一个 bank 被一个访存请求占据而忙碌的时间。Access latency 是算在从内存中取出一个向量的启动开销里面的(总共的 memory latency 还包括穿越流水化的互联网络以从 CPU 传输地址和数据到 memory bank)。Bank 忙碌时间决定了一个内存系统的有效带宽因为处理器直到 bank 忙碌时间过去了才能发射到相同的 bank的第二个访存请求。

对于前例中使用的简单的非流水化的 SRAM bank而言,访存延迟和忙碌时间几乎是一样的。对于流水化的 SRAM 而言,访存延迟则大于忙碌时间因为一个元素的访存只会占据 memory bank 流水线的一级。对于 DRAM bank 而言,访存延迟通常比忙碌时间短,因为 DRAM 在一次破坏性读取之后需要额外的时间来恢复被读出的值。对于一个支持多个向量访存同时进行或者非顺序访问的内存系统而言,所需的 memory bank 的数目应该比最低的要求来得多;否则则会发生 memory bank 冲突 memory bank conflict)。我们会在下一节中详细讨论这个问题。

---------------大家好,我是分割线---------------
[1] 简单的 interleaving 可能指的是在同一个 memory bank 内部多个 memory chip 之间地址的 interleaving
[2] 注意每个向量元素都是 64 位,也即 8 byte

No comments:

Post a Comment