SIMD技术:内存延迟、架构与操作优化
1. 长内存延迟与短向量长度
在带有缓存的系统中,从大容量内存中获取数据所产生的延迟是最为关键的。通常情况下,内存延迟可能是相对简单计算(如saxpy)的10倍,甚至可能超过循环内部部分的执行时间。
为了应对这种情况,可以利用向量硬件展开循环来计算 B = f(A)
,主要有两种方式,如图所示:
- 无预取方式 :
for i = 0, n - 1 by 4 {
V0 <- Ai, ..., Ai+3
wait memory
f(V0)
V0 <- A0, ..., A3
}
在这种方式中,向量寄存器 V0
(这里大小为4)加载 Ai, Ai+1, Ai+2, Ai+3
,等待数据到达后,对这四个元素计算 f(A)
,然后将结果存储在 B
的一个段 (Bi, Bi+1, Bi+2, Bi+3)
中。
- 预取方式 :
for i = 0, n - 5 by 4 {
V1 <- V0
(wait memory) - Tf - TJ
V2 <- f(V0)
Bi+4, ..., Bi+7 <