深度学习框架-NEON介绍

254 阅读1分钟

1 什么是NEON技术

NEON就是一种基于SIMD思想的ARM技术,相比于ARMv6或之前的架构,NEON结合了64-bit和128-bit的SIMD指令集,提供128-bit宽的向量运算(vector operations)。NEON技术从ARMv7开始被采用,目前可以在ARM Cortex-A和Cortex-R系列处理器中采用。

NEON架构参考:zyddora.github.io/2016/02/28/…

2 NEON支持哪些指令集

运算:和、差、积、商 共享的 NEON 和 VFP 指令:涉及加载、多寄存器间的传送、存储 注:所有的支持NEON指令都有一个助记符V,例如:

VADD.I16 D0, D1, D2   @ 16位加法
VMLAL.S16 Q2, D8, D9  @ 有符号16位乘加

具体指令参考官网:developer.arm.com/documentati…

3 什么是arm_neon.h

NEON intrinsics(NEON内部封装), arm编译工具链提供的比汇编更友好的写Neon code的方式。NEON intrinsics是编译器用适当的NEON指令或NEON指令序列替换的函数调用。NEON intrinsics定义在arm_neon.h。 Intrinsics 可以理解成ARM Compiler toolchain和GCC之间接口。

uint8x8_t vadd_u8(uint8x8_t a, uint8x8_t b);  //  input and output vectors are 64-bit vectors, which use D registers.

uint8x16_t vaddq_u8(uint8x16_t a, uint8x16_t b);  //  input and output vectors are 128-bit vectors, which use Q registers

uint16x8_t vaddl_u8(uint8x8_t a, uint8x8_t b);  //  input vectors are 64-bit and output vector is 128-bit.

demo code:

#include <arm_neon.h>

  uint32x4_t double_elements(uint32x4_t input)
  {
    return(vaddq_u32(input, input));
  }

4 NEON编译器

armcc ARM Compiler toolchain Compiler Reference Guide

GCC

Arm GNU toolchain(用于嵌入式软件)