迭代器 - 2022.1 简体中文

AI 引擎内核编码 最佳实践指南 (UG1079)

Document ID
UG1079
Release Date
2022-05-25
Version
2022.1 简体中文

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;
}