NEON コンパイラ組み込み関数の使用

NEON コンパイラ組み込み関数を使用する例をビルドするには、以下の手順に従います。

  1. 以下に示す C プログラムソースコード例を作成します。

    Example 22.  NEON コンパイラ組み込み関数

    /* neon_example.c - NEON コンパイラ組み込み関数のプログラム例 */
    
    #include <stdint.h>
    #include <stdio.h>
    #include <assert.h>
    #include <arm_neon.h>
    
    /* 配列に 0 から始まる整数を格納する */
    
    void fill_array(int16_t *array, int size)
    {   
        int i;
    
        for (i = 0; i < size; i++)
        {
             array[i] = i;
        }
    }
    
    /* 配列内のすべての要素の合計を返す。具体的には、4 つの合計(レーンごとに 1 つ)を計算し、最後にこれらを加算して総合計を取得する */
    
    int sum_array(int16_t *array, int size)
    {
         /* アキュムレータベクタをゼロに初期化する */
         int16x4_t acc = vdup_n_s16(0);
         int32x2_t acc1;
         int64x1_t acc2;
     
        /* この実装では、配列のサイズが 4 の倍数であると想定する */
         assert((size % 4) == 0);
    
         /* 後方にカウントする方が適切 */
         for (; size != 0; size -= 4)
         {
              int16x4_t vec;
              /* 配列から 4 つの値を並列にロードする */
              vec = vld1_s16(array);
              /* 配列ポインタを次の要素にインクリメントする */
              array += 4;
              /* ベクタをアキュムレータベクタに追加する */
              acc = vadd_s16(acc, vec);
          }
    
          /* 合計を計算する */
          acc1 = vpaddl_s16(acc);
          acc2 = vpaddl_s32(acc1);
    
          /* 合計を整数として返す */
          return (int)vget_lane_s64(acc2, 0);
    }
    
    /* main 関数 */
    int main()
    {
          int16_t my_array[100];
          fill_array(my_array, 100);
          printf("Sum was %d\n", sum_array(my_array, 100));
          return 0;
    }
    

  2. 以下のオプションを指定して、ソースコード例をコンパイルします。

    armcc -c --debug --cpu=Cortex-A8 neon_example.c
    
  3. 以下のコマンドを使用して、結果のオブジェクトファイルをリンクします。

    armlink neon_example.o -o neon_example.axf
    
  4. 互換性のあるデバッガを使用して、結果のイメージ neon_example.axf をロードして実行します。

Show/hide関連項目

Copyright © 2010-2011 ARM. All rights reserved.ARM DUI 0472EJ
Non-ConfidentialID081711