AI Engine API is a portable programming interface for AI Engine accelerators. It is implemented as a C++ header-only library that provides types and operations that get translated into efficient low-level intrinsics. The API also provides higher-level abstractions such as iterators.
Usually, two header files are needed in kernel source code:
-
aie_api/aie.hpp
- AI Engine main entry point.
-
aie_api/aie_adf.hpp
- Graph buffer and stream interfaces.
AI Engine API provides a helper
file to print aie::vector
and aie::mask
values in simulation when profiling is
enabled:
-
aie_api/utils.hpp
:aie::print
andaie::print_matrix
functions are provided.
To support operator overloading on some operations, include header
file aie_api/operators.hpp
and use namespace
aie::operators
. For additional information, see
Operator Overloading.
An example code for AI Engine kernel is as follows.
#include <aie_api/aie.hpp>
#include <aie_api/aie_adf.hpp>
#include <aie_api/utils.hpp>
using namespace adf;
void vec_incr(input_buffer<int32>& data,output_buffer<int32>& out){
aie::vector<int32,16> vec1=aie::broadcast(1);//set all elements to 1
auto inIter=aie::begin_vector<16>(data);
auto outIter=aie::begin_vector<16>(out);
for(int i=0;i<16;i++) chess_prepare_for_pipelining {
aie::vector<int32,16> vdata=*inIter++;
aie::print(vdata,true,"vdata=");//print vector in a line
aie::print_matrix(vdata,/*col=*/8,"vdata matrix=");//print vdata as a 2x8 matrix
aie::vector<int32,16> vresult=aie::add(vdata,vec1);//increment each element in vdata by 1
*outIter++=vresult;
}
}
Vector data type and operations are covered in following sections.