Applications can load from data memory (DM) into vector registers and store the contents of vector registers into DM. Memory instructions in the AI Engine-ML that operate on vectors have alignment requirements. Therefore, functions are provided for both aligned and unaligned accesses.
The following functions are assumed to operate on pointers that have met the alignment requirements for a vector load or store of the size.
-
aie::load_v
-
aie::store_v
The following functions are assumed to operate on pointers that have only aligned to the element of the vector.
-
aie::load_unaligned_v
-
aie::store_unaligned_v
Vector load and store that operate on memory that has met the vector operation alignment requirement use fewer cycles relative to unaligned accesses. Unaligned accesses can incur additional overhead depending on the amount of misalignment.
alignas(aie::vector_decl_align) int32 buffer[8];
int32* pv=buffer;
aie::vector<int32,8> v1=aie::load_v<8>(pv);
aie::vector<int32,8> v2=aie::load_unaligned_v<8>(pv+1);
The alignas
standard C specifier can
be used to ensure proper alignment of local memory. In the following example,
reals
is aligned to a 16-byte boundary.
alignas(16) const int32 reals[8] =
{32767, 23170, 0, -23170, -32768, -23170, 0, 23170};
The API provides a global constant value (aie::vector_decl_align
) that can be used to align the buffer to a
boundary that works for any vector size.
alignas(aie::vector_decl_align) static cint16 my_buffer[8]={{0,0},{1,-1},{2,-2},{3,-3},{4,-4},{5,-5},{6,-6},{7,-7}};
aie::vector_decl_align
for portability.