Alignment - Alignment - 2025.2 English - UG1079

AI Engine Kernel and Graph Programming Guide (UG1079)

Document ID
UG1079
Release Date
2025-11-26
Version
2025.2 English

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 that operate on vectors have alignment requirements. Therefore, functions are available for both aligned and unaligned accesses.

The following functions are assumed to operate on pointers that meet the alignment requirements for a vector load or store of the size:

  • aie::load_v
  • aie::store_v
Note: The 128-bit or 256-bit vector load and store operations in the AI Engine require that data aligns on 128 bits. If the aligned vector load and store operations are used on unaligned pointers, the resulting data might be incorrect.

The following functions are assumed to operate on pointers only align to the element of the vector:

  • aie::load_unaligned_v
  • aie::store_unaligned_v

For optimal performance, vector load and store must operate on memory that has met the vector operation alignment requirement. Unaligned accesses can incur additional overhead depending on the amount of misalignment.

Note: Kernel buffer interfaces ensure that internal buffers have the required alignment for vector loads.

You can use the alignas standard C specifier to ensure proper alignment of local memory. In the following example, reals aligns to a 16-byte boundary.

// align to 16 bytes boundary 
// equivalent to "alignas(aie::vector<int16,8>)"
alignas(16) const int16 reals[8] = 
       {32767, 23170, 0, -23170, -32768, -23170, 0, 23170};

The API has another way to specify vector alignment on a specific vector type, for example:

alignas(aie::vector_ldst_align_v<int16, 8>) const int16 reals[8] = 
       {32767, 23170, 0, -23170, -32768, -23170, 0, 23170};

The API provides a global constant value (aie::vector_decl_align) that you can use 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}};
Note: The alignment requirement on AI Engine is 16 bytes. This requirement might change with future architectures; AMD recommends that you use aie::vector_decl_align for portability.