Compiling AI Engine Graph for Independent Partitions - 2024.2 English - UG1076

AI Engine Tools and Flows User Guide (UG1076)

Document ID
UG1076
Release Date
2024-11-28
Version
2024.2 English

The AI Engine supports column-based partitions. This is enabled by creating independent graphs that can be compiled and simulated separately. Each graph is mapped to a specific column or a contiguous set of columns on the AI Engine array. During the v++ link stage, multiple partitions can be integrated together, provided there is no overlap in the resource usage by the graphs in those partitions.

The following picture shows an example of AI Engine with multiple partitions.

Figure 1. AI Engine Partitions

A partition in the AI Engine array can be defined as <START_COLUMN>:<NUM_OF_COLUMN>:<PARTITION_NAME>, and passed to the Vitis command line using v++ -c -mode aie --config <CONFIG_FILE.cfg>.

Example configuration (<CONFIG_FILE.cfg>):

[aie]
enable-partition=6:2:pr0

This configuration restricts the compiled graph to columns 6 and 7, and names the partition pr0.

Each partition is compiled independently. The same AI Engine graph can be used in different partitions. Each partition is compiled independently but with different locations inside the device. Multiple partition compilation outputs (for example, libadf0.a, libadf1.a…) are used at v++ link time.
Note: When multiple partitions overlap inside the device, v++ link will report error about the conflict.
The graphs are differentiated by their partition names and graph names in the host code. Absence of an explicit enable-partition option is interpreted as a single partition comprising the entire AI Engine array, which will overlap (i.e., conflict) with any other partitions at v++ link time.
The v++ link command can link multiple independent compilation results together; for example:
v++ -l --platform ${PLATFORM} -t hw --config system.cfg -o ${XSA} libadf0.a libadf1.a libadf2.a libadf3.a
The graph ports in the graphs are prefixed with the partition name, for example (in the configuration file for v++ linker):
[connectivity]
stream_connect=ai_engine_0.pr0_Dataout0:s2mm_1.s
stream_connect=datagen.out:ai_engine_0.pr0_Datain0
Note: The port name Dataout0 is renamed as pr0_Dataout0. Thus, there will be no conflicts with port names from other partitions.

The v++ package command is called to merge multiple compilation results together, such as:

v++ -p -t hw -f ${PLATFORM} \
		--package.rootfs ${ROOTFS} \
		--package.kernel_image ${IMAGE} \
		--package.boot_mode=sd \
		--package.image_format=ext4 \
		--package.defer_aie_run \
		--package.sd_file ${HOST_EXE} \
		${XSA} \
		libadf0.a libadf1.a libadf2.a libadf3.a

When specifying multiple libadf.a files for v++ link and v++ package, make sure that they are specified with the same order, because the order will affect the metadata generation and might impact the application execution.

For more information about how v++ works, see the Vitis Reference Guide (UG1702).

The graph name used in the PS host code for XRT API is prefixed with the partition name, for example:

auto ghdl=xrt::graph(device,uuid,"pr0_gr");//partition name = "pr0", graph name = "gr"

For more information about how to use XRT API to control partitions in the host code, see Controlling AI Engine Partitions.

Note: The Analysis view of the Vitis Unified IDE can open only one partition compilation result at a time. Event trace result can be analyzed in Vitis Unified IDE with only one partition at a time. The Bare-metal application can be built with one partition result at a time.