AI 引擎 API 可提供迭代器以连续访问存储器,并逐步增加访问数量。有一个圆形迭代器,可通过在到达缓冲器末尾时返回至缓冲器开头来进行卷绕。
-
aie::begin_circular
- 返回标量圆形迭代器。其中会指定标量缓冲器的大小。
-
aie::cbegin_circular
-
aie::begin_circular
的常量版本。 -
aie::begin_random_circular
- 含随机访问的
aie::begin_circular
。 -
aie::begin_vector
- 返回矢量迭代器。其中会指定基本矢量的大小。
-
aie::cbegin_vector
-
aie::begin_vector
的常量版本。 -
aie::begin_restrict_vector
- 与
aie::begin_vector
相同,但返回指针被视为限制指针。 -
aie::begin_vector_circular
- 返回矢量迭代器。其中会指定基本矢量大小和圆形缓冲器总大小。
-
aie::cbegin_vector_circular
-
aie::begin_vector_circular
的常量版本。
这些迭代器也支持:
- 反引用
*
- 运算符
++
- 运算符
==
- 运算符
!=
某些迭代器支持更多运算符。例如,aie::begin_vector
支持:
- 运算符
--
- 运算符
+
- 运算符
-
- 运算符
+=
- 运算符
-=
aie::begin_random_circular
支持:
- 运算符
--
- 运算符
+=
- 运算符
-=
圆形缓冲器的优势之一是它能避免界外存储器访问。以下提供了使用迭代器访问存储器的一些示例。
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 pv=aie::begin_vector<4>(init_value); //create vector iterator, first value is [1,2,3,4]
auto pv_c=aie::cbegin_vector_circular<4,16>(init_value); //create const circular vector iterator, first value is [1,2,3,4], total 16 elements
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;
}