NEON进阶之一-Introducing Neon for Armv8-A(翻译向)

学习路线指南:https://zhuanlan.zhihu.com/p/...
原文地址:https://developer.arm.com/doc...

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.

NEON进阶之一-Introducing Neon for Armv8-A(翻译向)_第1张图片

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)
    

NEON进阶之一-Introducing Neon for Armv8-A(翻译向)_第2张图片

  • ADD V0.8H, V1.8H, V2.8H
    NEON进阶之一-Introducing Neon for Armv8-A(翻译向)_第3张图片
  • MUL V0.4S, V2.4S, V3.S[2]
    NEON进阶之一-Introducing Neon for Armv8-A(翻译向)_第4张图片

你可能感兴趣的:(simd)