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