在计算机体系中,数据并行有两种实现路径:MIMD(Multiple Instruction Multiple Data,多指令流多数据流)和SIMD(Single Instruction Multiple Data,单指令流多数据流)。其中MIMD的表现形式主要有多发射、多线程、多核心,在当代设计的以处理能力为目标驱动的处理器中,均能看到它们的身影。同时,随着多媒体、大数据、人工智能等应用的兴起,为处理器赋予SIMD处理能力变得愈发重要,因为这些应用存在大量细粒度、同质、独立的数据操作,而SIMD天生就适合处理这些操作。
SIMD结构有三种变体:向量体系结构、多媒体SIMD指令集扩展和图形处理单元。本文集中围绕向量体系结构进行描述。
向量体系结构的基本组成
1.简介
向量体系结构使用一条向量指令开启一组数据操作,其中数据的加载、存储以及数据计算以流水线的形式进行。它最大的特点就是:其仅在一组数据操作的第一个元素存在存储器延迟和由冒险引起的停顿,后续元素会沿着流水线顺畅流动。
我们通过一个以cray-1为基础的向量处理器来分析。它同时包含标量体系结构和向量体系结构,其标量指令集为MIPS,向量指令集则称为VMIPS。
2.架构组成
VMIPS指令集体系结构的主要组件如下图所示:
图1 向量体系结构VMIPS的基本结构
-
向量寄存器:N个向量寄存器,每个向量寄存器都是一个固定长度的寄存器组,用于保存一个向量。向量长度通常为32、64等,这也是单条向量指令所能执行元素的最大值。
-
标量寄存器:用于给向量功能单元提供标量输入数据、给载入/存储单元提供地址,或是作为向量长度寄存器、向量遮罩寄存器等功能。
-
向量功能单元:每个单元都完全实现流水化,可以在每个时钟周期开启一个新的操作。每个功能单元可能只有单条流水线(单车道),也可以有多个并行的流水线(多车道)。
-
向量载入/存储单元:向量载入与存储操作也是完全流水化的,在初始延迟后,可以以每个时钟周期一个只的带宽移动字。该单元通常还会处理标量载入和存储。
3.向量长度寄存器
向量处理器有一个自然向量长度,由向量寄存器的长度决定。然而在实际程序中,特定向量运算的长度在编译时通常是未知的。例如以下代码:
for (i=0; i<n; i++)
{
y[i] = a * x[i] + y[i];
}
向量运算的长度取决于n,而n是个变量,它可能在执行时随应用情况而变化。
向量长度寄存器(VLR)就是为了解决实际数据向量长度变化这一问题,它控制一条向量指令执行元素的长度,但这一长度不能超过自然向量长度。
4.向量遮罩寄存器
考虑如下循环:
for (i=0; i<64; i++)
{
if (y[i] != 0)
{
y[i] = x[i] - y[i];
}
}
由于循环体需要条件执行,因此不可能对一组数据向量的元素执行相同操作,也就不便于对循环进行向量化。
通过启用向量遮罩寄存器可以解决这一问题。它可以通过布尔向量来控制一条向量指令中每个元素运算的条件执行,如向量中某元素对应的向量遮罩寄存器中的布尔值为1,则执行指令操作,否则执行空操作。
需要注意的一点是,即使遮罩为0的元素,它仍会占用与遮罩为1元素相同的执行时间。
较标量处理器的优势