共计 1370 个字符,预计需要花费 4 分钟才能阅读完成。
学习路线指南: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, w5
ADD w1, w1, w6
ADD w2, w2, w7
ADD 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]