向量与通道

Neon 是一种 SIMD(Single Instruction Multiple Data) 指令集,也就是说,NEON 可以把若干源 (source) 操作数 (operand) 打包放到一个源寄存器中,对他们执行相同的操作,产生若干目的 (dest) 操作数,这种方式也叫向量化 (vectorization)。

NEON 寄存器的内容是具有相同数据类型元素的向量。向量被划分为通道(Lane),每个通道包含一个称为元素的数据值。NEON 向量中的通道数取决于向量的大小及其向量中的数据元素。

通常,每个 NEON 指令有 n 个并行操作,其中 n 就是输入向量被划分的通道数。不能从一个通道进位或者溢出到另一个通道的。向量中元素的顺序是从最低有效位开始的。这意味着元素 0 使用寄存器的低有效位。

Neon 寄存器

在 Armv8 上,一共有 32 个 128bit Neon 寄存器,而在 Armv7 上,一共有 16 个 128bit 寄存器。这些寄存器不仅被 Neon 使用,还被浮点数计算使用。其最大特点是一个 128bit 的寄存器可以被拆成 2 个 64bit 的寄存器,或者 4 个 32bit 的寄存器来使用,这不仅在 SIMD 中可行,在浮点数中也是一样,存在双精度、单精度、半精度等多种情况。

至于如何区分这些寄存器(到底是 Neon 还是浮点计算?使用多少位的寄存器?)是依靠寄存器的名字(并不依靠指令助记符)来进行区分的。