运算符重载 - 2022.1 简体中文

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

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

AI 引擎 API 为众多运算提供运算符重载。只需包含头文件 aie_api/operators.hpp 并使用 aie::operators 名称空间,即可使用此功能特性。

包含的运算符如下所示。

运算符 +
加法运算符。它等同于 aie::add
运算符 +=
加法赋值运算符。
运算符 -
负运算符。它等同于 aie::neg
运算符 -
减法运算符。它等同于 aie::sub
运算符 -=
减法赋值运算符。
运算符 !=
不等于比较运算符。它等同于 aie::neq
运算符 <
小于比较运算符。它等同于 aie::lt
运算符 <=
小于或等于比较运算符。它等同于 aie::le
运算符 ==
等于比较运算符。它等同于 aie::eq
运算符 >
大于比较运算符。它等同于 aie::gt
运算符 >=
大于或等于比较运算符。它等同于 aie::ge
运算符 <<
按位左移运算符。它等同于 aie::upshift
运算符 >>
按位右移运算符。它等同于 aie::downshift
运算符 &
按位 AND 运算。它等同于 aie::bit_and
运算符 ^
按位 XOR 运算。它等同于 aie::bit_xor
运算符 |
按位 OR 运算。它等同于 aie::bit_or
运算符 ~
按位 NEG 运算。它等同于 aie::bit_not

使用运算符的代码示例如下所示。

#include <aie_api/aie.hpp>
#include <aie_api/aie_adf.hpp>
#include <aie_api/utils.hpp>
#include <aie_api/operators.hpp>
using namespace aie::operators;

void operator_overload_test(input_window<int32>* __restrict data,output_window<int32>* __restrict out){
  aie::vector<int32,8> va=window_readincr_v<8>(data);
  aie::vector<int32,8> vb=window_readincr_v<8>(data);
  aie::vector<int32,8> vadd=va+vb;
  aie::vector<int32,8> vsub=va-vb;
  aie::vector vneg=-vb;//negation of each element
  vadd+=vneg;
  aie::print(va,true,"va=");
  aie::print(vadd,true,"vadd=");
  //compare each element of the vector correspondingly
  auto msk_neq=(vadd!=va);
  //mask bit equals 1 if vector element not equal
  aie::print(msk_neq,true,"msk_neq=");

  aie::vector vnot_va=~va;//bit not
  aie::vector vones=va ^ vnot_va;//bit xor
  aie::print(vones,true,"vones=");
  //choose vadd if mask bit equals 0
  auto vout=aie::select(vadd,vones,msk_neq);
  aie::print(vout,true,"vout=");
  window_writeincr(out,vadd);
}

前述代码的可能的 C 语言输出之一如下所示。

va=9 10 11 12 13 14 15 16 
vadd=9 10 11 12 13 14 15 16 
msk_neq=0 0 0 0 0 0 0 0 
vones=-1 -1 -1 -1 -1 -1 -1 -1 
vout=9 10 11 12 13 14 15 16