NEON_3

数据处理方法
在处理大量数据时,主要的性能限制因素是执行数据处理指令所花费的CPU时间。 此CPU时间取决于处理整个数据集所需的指令数。 指令的数量取决于每个指令可以处理多少个数据项。

 

单指令单数据(SISD)
大多数Arm指令都是单指令单数据(SISD)。 每条指令在单个数据源上执行其指定的操作。 因此,处理多个数据项需要多个指令。 例如,要执行四个加法运算,需要四个指令来从四对寄存器中添加值:

ADD w0, w0, w5
ADD w1, w1, w6
ADD w2, w2, w7
ADD w3, w3, w8

此方法相对较慢,可能很难看到不同寄存器之间的关系。 为了提高性能和效率,通常将媒体处理卸载到专用处理器,例如图形处理单元(GPU)或媒体处理单元,这些处理器可以用一条指令处理多个数据值。

如果您要处理的值小于最大位大小,则SISD指令会浪费该额外的潜在带宽。 例如,将8位值加在一起时,需要将每个8位值加载到单独的64位寄存器中。 由于处理器,寄存器和数据路径都是为64位计算而设计的,因此在小数据量上执行大量的单独操作不能有效地利用机器资源。

 

单指令多数据
单指令多数据(SIMD)指令对多个数据项同时执行相同的操作。 这些数据项在较大的寄存器中打包为单独的通道。

 

例如,以下指令将四对单精度(32位)值加在一起。 但是,在这种情况下,将值打包到两对128位寄存器中的单独通道中。 然后,将第一个源寄存器中的每个通道添加到第二个源寄存器中的相应通道,然后再存储在目标寄存器中的同一通道中:

ADD V10.4S, V8.4S, V9.4S
// This operation adds two 128-bit (quadword) registers, V8 and V9,
// and stores the result in V10.
// Each of the four 32-bit lanes in each register is added separately.
// There are no carries between the lanes.

这条指令同时对大寄存器中的所有数据值进行操作:

NEON_3_第1张图片

 

使用单个SIMD指令执行四个操作比使用四个单独的SISD指令执行速度更快。

该图显示了128位寄存器,每个寄存器包含四个32位值,但是Neon寄存器也可以使用其他组合:

可以使用Neon寄存器的所有128位同时操作两个64位,四个32位,八个16位或16个8位整数数据元素。
可以使用Neon寄存器的低64位同时操作两个32位,四个16位或八个8位整数数据元素(在这种情况下,未使用Neon寄存器的高64位)。

注意,图中所示的加法运算对于每个通道来说都是真正独立的。 通道0的任何溢出或进位都不会影响通道1,这是完全独立的计算。

诸如在移动设备中使用的媒体处理器通常将每个完整数据寄存器分成多个子寄存器,并并行地对子寄存器执行计算。 如果对数据集的处理简单且重复很多次,则SIMD可以显着提高性能。 对于数字信号处理或多媒体算法,例如:

音频,视频和图像处理编解码器。
基于矩形像素块的2D图形。
3D图形
色彩空间转换。
物理模拟。

你可能感兴趣的:(NEON)