反復子 - 2023.2 日本語

AI エンジン カーネルおよびグラフ プログラミング ガイド (UG1079)

Document ID
UG1079
Release Date
2023-12-04
Version
2023.2 日本語

AI エンジン API によって、AI エンジン メモリにアクセスするための反復子が提供されます。この AI エンジン API は、スカラーとベクターの両方のデータ型に対して反復処理をする反復子を使用できます。その他に、循環反復子も使用します。次の表に、AI エンジン API で使用される異なるタイプの反復子を示します。

表 1. 反復子
反復子 説明
aie::begin スカラー反復子を返します。
aie::cbegin 読み出し専用のスカラー反復子を返します。
aie::begin_circular スカラー循環反復子を返します。循環バッファーのサイズを指定できます。
aie::cbegin_circular 読み出し専用のスカラー反復子を返します。
aie::begin_random_circular ランダム アクセスのスカラー循環反復子を返します。
aie::cbegin_random_circular ランダム アクセス、読み出し専用のスカラー循環反復子を返します。
aie::begin_vector ベクター反復子を返します。ベクターのサイズを指摘できます。
aie::begin_restrict_vector aie::begin_vector と同じですが、戻り反復子は restrict と見なされます。
aie::cbegin_vector 読み出し専用のベクター反復子を返します。
aie::cbegin_restrict_vector aie::cbegin_vector と同じですが、戻り反復子は restrict と見なされます。
aie::begin_restrict_vector restrict タイプのベクター反復子を返します。
aie::cbegin_restrict_vector restrict タイプの読み出し専用ベクター反復子を返します。
aie::begin_vector_circular ベクター循環反復子を返します。基本ベクターのサイズと循環バッファーの合計サイズを指定できます。
aie::cbegin_vector_circular 読み出し専用のベクター循環反復子を返します。
aie::begin_vector_random_circular

割り当てられたアドレスおよびサイズで指定された配列の循環反復子を返します。

aie::cbegin_vector_random_circular 割り当てられたアドレスおよびサイズで指定された配列の、読み出し専用の循環反復子を返します。

これらの反復子は、前方反復子とランダム アクセス反復子の 2 つのカテゴリに分けられます。いずれも次をサポートします。

  • 逆参照 *
  • 演算子 ++
  • 演算子 ==
  • 演算子 !=

ランダム アクセス反復子は、より多くの演算子をサポートします。たとえば、aie::begin_vector および aie::begin_vector_random_circular は次の演算子もサポートします。

  • 演算子 --
  • 演算子 +
  • 演算子 -
  • 演算子 +=
  • 演算子 -=

各反復子のタイプの詳細は、 『AI エンジン API ユーザー ガイド』 (UG1529)メモリを参照してください。

循環バッファーの 1 つの利点は、範囲外のメモリ アクセスが回避されることです。次に、反復子を使用してメモリにアクセスする例をいくつか示します。
alignas(aie::vector_decl_align) int32 init_value[16]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
auto iIter = aie::begin(init_value);
for(int i=0;i<16;i++, iIter++){
  *iIter=*iIter+1;
}
alignas(aie::vector_decl_align) int32 init_value[16]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

// create vector iterator
// first value is [1,2,3,4]
auto pv=aie::begin_vector<4>(init_value); 

// create const circular vector iterator
// first value is [1,2,3,4]
// total 16 elements
auto pv_c=aie::cbegin_vector_circular<4,16>(init_value);  
for(;pv!=init_value+16;pv++){
  aie::vector<int32,4> buff=*pv;
  aie::print(*pv,true,"pv:");
}
for(int i=0;i<5;i++){

  // go back to start 
  // if reach the end of the circular buffer
  aie::vector<int32,4> buff=*pv_c++;
}

// point to circular buffer size 16.
auto p=aie::begin_circular<16>(init_value); 

for(int i=0;i<N;i++){ 

  // return back to init_value+0
  // if reaches init_value+16
  *p++=i;
}
__attribute__ ((noinline)) void pass_through(input_buffer<int> & __restrict in,
    output_buffer<int> & __restrict out
    ){
  auto inIter1=aie::cbegin_restrict_vector<8>(in);
  auto outIter=aie::begin_restrict_vector<8>(out);
  for(int i=0;i<32;i++) {
    *outIter++=*inIter++;
  }
}