1. 下面介绍了微处理器指令处理数据的常用方法:
A. 单指令单数据SISD(Single Instruction Single Data)
B. 单指令多数据SIMD(Single Instruction Multiple Data)向量模式
C. 单指令多数据SIMD(Single Instruction Multiple Data)压缩数据模式
A. 单指令单数据SISD
每个指令指定单个数据源进行处理,处理多个数据项需要多个指令。这种处理方式比较慢,而且数据项分布在不同的寄存器中,很难看出数据项的相关性。为了改善性能和效率,媒体处理经常被加载到诸如GPU(Graphics Processing Unit)或者多媒体处理单元(Media Processing Unit)这样的专用处理器中,他们可以用单指令处理多数据。在ARM 32位处理器上,处理大量8-bit或16-bit数据并没有有效利用处理器资源,因为处理器,寄存器、数据总线这些都是32位的。如下面所示的加法操作,每一操作元都是单个数据:
add r0, r5
add r1, r6
add r2, r7
add r3, r8
B. 单指令多数据SIMD(向量模式)
操作可以指定对多个数据源进行相同的处理。若控制寄存器中LEN长度为4,则单个向量加法指令在4个地址上执行。在ARM术语中,这被称为向量浮点运算。在ARMv5架构中引入了向量浮点(VFP)扩展执行短向量指令以加速浮点运算。源和目标寄存器可以是标量操作的单个寄存器,也可以是两个序列(8个寄存器)的矢量操作。因为SIMD操作比VFP操作更有效地执行向量计算,矢量模式操作在ARMv7上被弃用,取而代之的是NEON技术在宽寄存器上执行多种操作。浮点和NEON的操作使用共通的通用寄存器。
VADD.F32 S24, S8, S16
// four operations occur
// S24 = S8 +S16
// S25 = S9 +S17
// S26 = S10 +S18
// S27 = S11 +S20
图中所示的加法操作是真正独立的,数据的溢出或移位不会对前面数据的末位产生影响,数据之间是独立计算的。
// One operation adds two 64-bit registers,