学习路线指南:https://zhuanlan.zhihu.com/p/...
原文地址:https://developer.arm.com/arc...
Introducing Neon for Armv8-A
Data processing methodologies 数据处理形式
- Single Instruction Single Data (SISD)
大多数Arm指令都是单指令单数据(SISD)。每条指令在单个数据源上执行其指定的操作。因而,解决多个数据项须要多个指令。例如,要执行四个加法运算,须要四个指令来对四对寄存器的值进行相加:
ADD w0, w0, w5ADD w1, w1, w6ADD w2, w2, w7ADD w3, w3, w8
如果您要解决的值小于最大位大小,则SISD指令会节约该额定的潜在带宽。例如,将8位值相加时,须要将每个8位值加载到独自的64位寄存器中。因为处理器,寄存器和数据门路都是为64位计算而设计的,因而对小数据量执行大量独自操作不会无效地利用机器资源。
- Single Instruction Multiple Data
单指令多数据(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.
Fundamentals of Armv8 Neon technology -> Armv8a Neon技术根底
- Registers, vectors, lanes and elements 寄存器,向量,通道与元素
Neon单元在一个独自的128位寄存器的寄存器文件上运行。Neon单元已齐全集成到处理器中,并共享处理器资源以进行整数运算,循环管制和缓存。与硬件加速器相比,这大大减少了面积并升高了电源老本。因为Neon单元应用与应用程序雷同的地址空间,因而它还应用了更为简略的编程模型。
Neon寄存器蕴含具备雷同数据类型的元素的向量。输出和输入寄存器中雷同的元素地位称为通道
通常,每条Neon指令都会导致n个操作并行产生,其中n是输出向量被划分为的通道数。每个操作都蕴含在通道中。从一个通道到另一个通道不能有进位或溢出。
Neon向量中的通道数量取决于向量的大小以及向量中的数据元素。
128位Neon向量能够蕴含以下元素大小:
16个8位元素(操作数后缀.16B,其中B示意字节)八个16位元素(操作数后缀.8H,其中H示意halfword)四个32位元素(操作数后缀.4S,其中S示意words)两个64位元素(操作数后缀.2D,其中D示意doubleword)
- ADD V0.8H, V1.8H, V2.8H
- MUL V0.4S, V2.4S, V3.S[2]