向量由一组有序、具有相同类型和位数的元素组成。
在流水线处理机中,设置了向量数据表示和相应的向量指令的,称为向量处理机。
不具有向量数据表示和相应的向量指令的流水线处理机,称为标量处理机
典型的向量处理机:
//以计算表达式D=A×(B-C)为例
A、B、C、D── 长度为N 的向量
main()
{ // 设A、B、C、D都是长度为n的数组
for(int i=0;i<n;i++)
{
D[i]=A[i]*(B[i]-C[i]);
}
}
向量处理机的结构因具体机器不同而不同。
由所采用的向量处理方式决定。
有两种典型的结构
采用纵向处理方式的向量处理机对处理机结构的要求:存储器-存储器结构
“存储器-存储器”型操作的运算流水线
要充分发挥这种结构的流水线效率,存储器要不断地提供源操作数,并不断地从运算部件接收结果。
提高向量处理机性能的方法
设置多个独立的功能部件。这些部件能并行工作,并各自按流水方式工作,从而形成了多条并行工作的运算操作流水线
处理向量的长度大于向量寄存器的长度的情况
当向量的长度大于向量寄存器的长度时,必须把长向量分成长度固定的段,然后循环分段处理,每一次循环只处理一个向量段。这种技术称为分段开采技术。
由系统硬件和软件控制完成,对程序员是透明的
一条向量指令的处理时间 T v p T_{vp} Tvp
执行一条向量长度为 n 的向量指令所需的时间为:
T
v
p
=
T
s
+
T
e
+
(
n
−
1
)
T
c
T_{v p}=T_{s}+T_{e}+(n-1) T_{c}
Tvp=Ts+Te+(n−1)Tc
$T_{s} $ : 向量处理部件流水线的建立时间为了使处理部件流水线能开始工作(即开始流入数 据)所需要的准备时间。
T
e
T_{e}
Te : 向量流水线的通过时间第一对向量元素通过流水线并产生第一个结果所花的时间。
T
c
T_{c}
Tc : 流水线的时钟周期时间
把上式中的参数都折算成时钟周期个数:
T v p = [ s + e + ( n − 1 ) ] T c T_{v p}=[s+e+(n-1)] T_{c} Tvp=[s+e+(n−1)]Tc
s:
T
s
T_{s}
Ts 所对应的时钟周期数
e: $\mathbf{T}{\mathrm{e}} $ 所对应的时钟周期数不考虑
T
s
T_{s}
Ts,并令 $ T{\text {start }}=e-1 $
T v p = ( T s t a r t + n ) T c T_{v p}=\left(T_{s t a r t}+n\right) T_{c} Tvp=(Tstart+n)Tc
$ \mathrm{T}_{\text {start }} $ :从一条向量指令开始执行到还差一个时钟周期就产生第一个结果所需的时钟周期数。可称之为 该向量指令的启动时间 。此后, 便是每个时钟周期 流出一个结果, 共有 $ \mathrm{n} $个结果。
一组向量指令的处理时间
对于一组向量指令而言,其执行时间主要取决于三个因素:
把能在同一个时钟周期内一起开始执行的几条向量指令称为一个编队。
编队后,这个向量指令序列的总的执行时间为各编队的执行时间的和。
T
a
l
l
=
∑
i
=
1
m
T
v
p
(
i
)
T_{a l l}=\sum_{i=1}^{m} T_{v p}^{(i)}
Tall=i=1∑mTvp(i)
T
(
i
)
v
p
\mathrm{T}^{(\mathrm{i})} \mathrm{vp}
T(i)vp : 第
i
\mathrm{i}
i 个编队的执行时间
m
\mathrm{m}
m :编队的个数
当一个编队是由若干条指令组成时,其执行时间就应该由该编队中各指令的执行时间的 最大值 来确定。
T ( i ) start T(i) { }_{\text {start }} T(i)start :第i编队中各指令的启动时间的最大值
T all = ∑ i = 1 m T v p ( i ) = ∑ i = 1 m ( T start ( i ) + n ) T c = ( ∑ i = 1 m T start ( i ) + m n ) T c = ( T start + m n ) T c T_{\text {all }}=\sum_{i=1}^{m} T_{v p}^{(i)}=\sum_{i=1}^{m}\left(T_{\text {start }}^{(i)}+n\right) T_{c}=\left(\sum_{i=1}^{m} T_{\text {start }}^{(i)}+m n\right) T_{c}=\left(T_{\text {start }}+m n\right) T_{c} Tall =i=1∑mTvp(i)=i=1∑m(Tstart (i)+n)Tc=(i=1∑mTstart (i)+mn)Tc=(Tstart +mn)Tc
$T_{\text {start }}=\sum_{i=1}^{m} T_{\text {start }}^{(i)} $该组指令总的启动时间(时钟周期个数)
表示成时钟周期个数
T
all
=
T
start
+
m
n
\mathrm{T}_{\text {all }}=\mathrm{T}_{\text {start }}+\mathbf{m n}
Tall =Tstart +mn
分段开采时,一组向量指令的总执行时间
当向量长度n大于向量寄存器长度MVL时,需要分段开采。
引入一些客外的处理操作(假设: 这些操作所引入的额外时间为
T
loop
\mathrm{T}_{\text {loop }}
Tloop 个时钟周期) 口 设 $ \left[\frac{n}{M V L}\right\rfloor=p $ $\quad \mathrm{q} $ : 余数
共有 $\mathbf{m} $个编队
对于最后一次循环来说, 所需要的时间为:
T
last
=
T
start
+
T
loop
+
m
×
q
\mathrm{T}_{\text {last }}=\mathrm{T}_{\text {start }}+\mathrm{T}_{\text {loop }}+\mathbf{m} \times \mathbf{q}
Tlast =Tstart +Tloop +m×q
其他的每一次循环所要花费的时间为:
T
step
=
T
start
+
T
loop
+
m
×
M
V
L
T_{\text {step }}=T_{\text {start }}+T_{\text {loop }}+m \times M V L
Tstep =Tstart +Tloop +m×MVL
总的执行时间为:
T
all
=
T
step
×
p
+
T
last
=
(
T
start
+
T
loop
+
m
×
M
V
L
)
×
p
+
(
T
start
+
T
loop
+
m
×
q
)
=
(
p
+
1
)
×
(
T
start
+
T
loop
)
+
m
(
M
V
L
×
p
+
q
)
=
[
n
M
V
L
]
×
(
T
start
+
T
loop
)
+
m
n
向量处理机的峰值性能
R
∞
R_{\infty}
R∞
$R_{\infty} $ 表示当向量长度为无穷大时, 向量处理机的 最高性能, 也称为峰值性能。
R
∞
=
lim
n
→
∞
向量指令序列中浮点运算次数
×
时钟频率
向量指令序列执行所需的时钟周期数
R_{\infty}=\lim _{n \rightarrow \infty} \frac{\text { 向量指令序列中浮点运算次数 } \times \text { 时钟频率 }}{\text { 向量指令序列执行所需的时钟周期数 }}
R∞=n→∞lim 向量指令序列执行所需的时钟周期数 向量指令序列中浮点运算次数 × 时钟频率
半性能向量长度 n 1 / 2 \mathrm{n}_{1/2} n1/2