Pages

Sunday, December 19, 2010

向量处理器(2)

2. 向量处理器基本体系结构

一个向量处理器通常由一个普通的流水化的标量单元加上一个向量单元组成。在这个向量单元里的所有功能部件都有几个时钟周期的延迟。这使得能够使用较短的时钟周期,并且与复杂的需要深度流水化来避免数据 hazard 的向量运算兼容。大多数的向量处理器所允许的向量运算包括浮点运算,整型运算或者逻辑运算。这里我们重点关注浮点运算。标量单元基本上和我们在第二章和第三章里面讨论过的高级的流水线化的 CPU 里面的没区别。并且实际上商用的向量处理器里面都同时包含了乱序的标量单元(NEC SX/5)和 VLIW 的标量单元 Fujitsu VPP5000)。

向量处理器主要有两种类型:向量-寄存器(vector-register)处理器和内存-内存(memory-memory)处理器。在 vector-register 类的处理器中,所有的向量操作--除了 load store--都是在向量寄存器(vector register)里面进行的。这类的处理器就和我们在标量处理器里面谈过的 load-store 体系结构相对应。在 80 年代后期发布的几乎所有向量计算机都采用了这个结构,这其中包括 Cray Research 的处理器 Cray-1Cray-2X-MPYMPC90T90SV1 X1),日本的超级计算机(从NEC SX/2 SX/8Fujitsu VP200 VPP5000,以及Hitachi S820 S-8300)以及迷你超级计算机(从 Convex C-1 C-4)。在 memory-memory 类的向量处理器中,所有的向量运算都是从内存到内存的。第一个向量处理器就是这种类型,CDC 系列的亦是如此。从现在开始让我们把注意力放在 vector-register 类的处理器上我们会。在这个附录的最后(第10小节),我们会简单地讨论一下为什么 memory-memory 类的处理器没有 vector-register 类的处理器那么成功。

我们讨论的 vector-register 类的处理器主要由图 F.1 中的部件组成。这个基本上类似 Cray-1 的处理器是我们整章的讨论基础。我们把它叫 VMIPS--它的标量单元就是 MIPS,而向量单元则是 MIPS 的扩展。本小节余下部分将讨论 VMIPS 和其他处理器有何相关。


 F.1 VMIPS 的基本结构。这个处理器有一个类似 MIPS 的标量单元。另外还有 8 个包含 64 个元素的向量寄存器,并且所有的功能部件都是向量运算单元。定义了包括算术运算和访存在内的特别的向量指令。在这张图里面我们包括了逻辑运算和整型运算的部件,这些部件在标准的向量处理器里面其实也是存在的。但是除了后面的练习题之外我们不会讨论这两个部件。标量寄存器及和向量寄存器都有大量的读写端口以支持同时多个向量操作。这些端口通过一组 crossbar (图中灰色所示)和向量功能部件的输入输出相连。在第四小节中,我们会再加上 chaining 的部分,它需要更强的互联能力。

VMIPS的主要组成部分是:
  • 向量寄存器(Vector registers):每个向量寄存器都是一个定长的 bank,能够容纳一个向量。VMIPS 8 个向量寄存器,每个寄存器能够容纳 64 个向量元素。每个寄存器至少有两个读端口和一个写端口。这能够保证需要不同向量寄存器的多个向量运算能够互相同步进行[1](我们并不考虑由于寄存器端口短缺而引起的问题。在实际的机器中,这会导致 structural hazard)。总共 16 个读端口和 8 个写端口通过一对 crossbar 和功能部件的输入输出相连(我们在这里简化了对于 vector-register 类的处理器的寄存器文件的描述。真实的机器里会利用在一条向量指令里规则的访问模式来简化寄存器文件的电路设计[Asanovic 1998]。比如 Cray-1 就能够设计使得每个寄存器只需要一个端口)。
  • 向量功能部件(Vector functional units):每个部件都是完全流水化的,并且每一个新的时钟周期可以开始对于一个新向量元素的操作。另外还需要一个控制部件来检测 hazard,包括功能部件的冲突(structural hazards)和寄存器访问的冲突(data hazards[2]。如图 F.1 所示,VMIPS 有五个功能部件。为了简化讨论,我们将只讨论浮点运算单元。取决于不同的设计,标量运算可能使用向量功能部件,或者有单独的一组功能部件。我们这里假设功能部件是共享的,并且,再一次忽略任何可能的冲突。
  • 向量访存单元(Vector load-store unit):这是一个能够 load store 一个向量到主存的单元。VMIPS 中的 load store 操作是完全流水化的,因此在一开始的延迟之后,寄存器和内存之间的带宽可以达到每一个时钟周期一个 word。这个单元通常也处理标量访存工作。
  • 一组标量寄存器(scalar registers):标量寄存器能为标量功能部件提供输入数据[3],并且也能为内存访问单元提供地址。这些其实就是MIPS中常见的 32 个通用寄存器和 32 个浮点寄存器。标量数据从标量寄存器中读出,然后锁存到向量单元的一个输入之中。
F.2 展示了一些典型的向量处理器的特征,包括寄存器的大小和个数,功能单元的数目和类型,访存单元的数目。最后一栏展示的是一个机器中 lane 的数目,也即可以同时执行一个向量中各个元素操作的并行流水线的数目。第四小节会详细描述 Lane 的概念。这里我们假设 VMIPS 中每个功能部件只有一个流水线(也即一个 lane)。


F.2 几个 vector-register 类型的体系结构的特征。如果某个机器是多处理器(multiprocessor),上面只列出一个处理器的数据。有几个机器采用了不同频率的标量和向量单元,上面的频率数据是向量单元的。Fujitsu的机器的向量寄存器是可配置的:8K 64-bit entry [4]是可以变化的(比如在 VP200 里面,可以从 8 个寄存器,每个包含 1K 和元素到 256 个寄存器,每个包含 32 个元素)。NEC 的机器有 8 个前段的向量寄存器和算术运算单元相连,还有 32-64 个后端寄存器连接内存和前段寄存器。Add 流水线进行加法和减法操作。Hitachi S810/820 里面的 multiply/divide-add 单元先进行一个浮点的乘法或者除法运算紧跟着一个加法或者减法操作(multiply-add 单元先进行一个浮点的乘法运算紧跟着一个加法或者减法操作)。注意大多数的处理器使用向量浮点单元来进行向量整型运算,还有一些处理器使用相同的功能单元来进行向量和标量操作。每个 vector load-store 单元能够执行一个独立的,可以相互重叠的 load 或者 store 操作。Lane 的数目,就像第四小节中提到的,是每个功能部件中并行流水线的数目。比如,NEC SX/5 的乘法部件可以在一个时钟周期之中完成 16 个乘法运算[5]。有些机器可以把一个 64-bit lane 分离成 2 32-bit lane以提高那些对精度要求不高的程序的性能。Cray SV1 Cray X1 可以把有 2 lane 4 CPU 组合成好像一个有 8 lane CPUCray把它叫做 Multi-Streaming Processor MSP)。

VMIPS 中,向量指令采用和 MIPS 指令相同的名字,只是多了加了“V”。这样的话,ADDV.D 就是一个把两个双精度的向量相加的操作。向量指令的输入或者是一对向量寄存器(ADDV.D)或者是一个向量寄存器和一个标量及存取(ADDVS.D)。后者的标量输入被所有的向量元素视为输入--ADDVS.D 会把标量寄存器的内容加到向量寄存器的每一个元素上。标量值在指令发射时被拷贝多份到功能部件。大多数的向量操作都有一个向量目标寄存器(vector destination register),也有一些操作的结果是被存储到标量寄存器里的。LV SV 代表向量 load 和向量 store操作。他们 load 或者 store 一整个双精度的向量。一个操作数是一个要被 load 或者 store 的向量寄存器里,另一个是一个 MIPS 的通用寄存器,保存该向量在内存中的起始地址。图 F.3 列出了 VMIPS 的向量指令。除了向量寄存器之外,我们还需要两个特殊用途的寄存器:向量长度寄存器(vector-length register)和向量掩码寄存器(vector-mask register)。我们分别在第三和第四小节会谈到这两个寄存器和他们的用途。


F.3 VMIPS 的向量指令。这里只列出了双精度的指令。除了向量寄存器之外,还有两个特殊寄存器,VLR(在第三节谈到)和 VM(在第四节谈到)。假定这些特殊寄存器都在 MIPS coprocessor 1 中,也即和 FPU 寄存器在同一空间中。有 stride 的操作会在第三小节提到。新建索引和索引化的访存操作会在第四节里提到。

---------------大家好,我是分割线---------------

[1] 在后面我们会看到 convoy 这个概念。一个 convoy 表示一组可以同时执行的向量指令。他们可能访问不同的寄存器,我们必须提供足够多的端口以保证不会发生端口短缺。
[2] 这里的寄存器访问的冲突不是指端口短缺引起的冲突。而是由于对于数据依赖不正当的处理而引起的对寄存器错误访问。
[3] 想一下什么情况下向量运算需要标量数据?什么情况下向量运算的结果需要写到标量寄存器里面?
[4] 这里的 entry 指的是一个向量寄存器里面的一个元素。64-bit 是指每个元素是 64-bit 长。
[5] 更精确地说,是完成16个来自不同向量的操作。

No comments:

Post a Comment