3.2 NEON ユニット

NEON ユニットは、同時に操作できる 32 個の 64 ビットベクタレジスタから構成されるレジスタバンクを備えています。

NEON ユニットは、レジスタバンクを以下のどちらかとして識別できます。
  • 16 個の 128 ビットクワッドワードレジスタ Q0Q15
  • 32 個の 64 ビットダブルワードレジスタ D0D31
これらのレジスタは、NEON ユニット内で同時に操作できます。たとえば、1 つのベクタ加算命令で 8 個の 16 ビット整数を他の 8 個の 16 ビット整数に加算して、8 個の 16 ビットの結果を得ることができます。この操作は、ベクトル化(NEON では SIMD(Single Instruction Multiple Data、単一命令複数データ処理)ベクトル化)と呼ばれます。
NEON ユニットでは、8 ビット、16 ビット、および 32 ビットの整数演算と一部の 64 ビット演算をサポートし、単精度(32 ビット)の浮動小数点演算もサポートしています。NEON ユニットは、2、4、8、16 のグループの要素に対して演算を実行できます。Cortex-A9 プロセッサでは、--fp16_format が指定されたときにコンパイラでサポートされる 16 ビット浮動小数点演算との間の変換もサポートされています(RVCT 4.0 以降および ARM コンパイラ 4.1 以降)。

浮動小数点コードは常に自動的にベクトル化されるとは限りません。例えば、再関連付けが必要なループは、--fpmode fast を使用したコンパイル時にのみベクトル化されます。--fpmode fast を使用してコンパイルすると、結果に影響を及ぼすことのある変換を実行できます。
NEON ユニットは、1 つの命令でベクタレジスタの複数の要素を処理するベクタ SIMD(Single Instruction Multiple Data、単一命令複数データ処理)ユニットとして分類されます。
たとえば、配列 A は 16 ビット整数の配列で 8 つの要素からなります。

表 3-1 配列 A

1 2 3 4 5 6 7 8
配列 B には次の 8 つの要素があります。

表 3-2 配列 B

80 70 60 50 40 30 20 10
これらの配列どうしを加算するには、各ベクタをベクタレジスタにフェッチし、1 つのベクタ SIMD 命令を使用して結果を算出します。

表 3-3 結果

81 72 63 54 45 36 27 18
NEON ユニットで処理できるのはメモリ内に連続して格納されるベクタだけなので、間接アドレス指定はベクトル化できません。
構造体を記述する場合は、NEON 構造体をロードするときに構造体のメンバがすべて同じサイズである必要がある点に注意して下さい。
関連する概念
3.3 NEON のコードの記述方法
関連する作業
3.4 C または C++ コードからの NEON 命令の生成
関連する参考文書
8.85 --fp16_format=format
8.86 --fpmode=model
8.192 --vectorize、--no_vectorize
関連情報
『Introducing NEON Development Article』
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.