Programming the PS Host Application - 2023.1 English

AI Engine Tools and Flows User Guide (UG1076)

Document ID
UG1076
Release Date
2023-06-23
Version
2023.1 English

In Creating a Data Flow Graph (Including Kernels) in AI Engine Kernel and Graph Programming Guide (UG1079), the discussion is centered around a very simple AI Engine graph application. The top-level application initialized the graph, ran the graph, and ended the graph. However, for actual AI Engine graph applications the host code must do much more than those simple tasks. The top-level PS application running on the Cortex®-A72, controls the graph and PL kernels: manage data inputs to the graph, handle data outputs from the graph, and control any PL kernels working with the graph.

In addition, AI Engine graph applications can be run on Linux operating systems or on bare-metal systems. The requirements for programming in these two systems are significantly different as outlined in the following topics. AMD provides drivers used by the API calls in the host program to control the graph and PL kernels based on the operating system. In Linux this is provided by the XRT API, in bare metal the AI Engine kernels are controlled using the graph APIs, and PL kernels are controlled using libUIO driver calls.

Preventing Multiple Graph Executions

In cases where your graph is implemented in a PS-based host application, you must define a conditional pragma (#ifdef) for your graph.cpp code to ensure the graph is only initialized once, or run only once. The following example code is the simple application defined in Creating a Data Flow Graph (Including Kernels) in AI Engine Kernel and Graph Programming Guide (UG1079) with the additional guard macro __AIESIM__ and __X86SIM__.

#include "project.h"

simpleGraph mygraph;

#if defined(__AIESIM__) || defined(__X86SIM__)

int main(void) {
  mygraph.init();
  mygraph.run(<number_of_iterations>);
  mygraph.end();
  return 0;
}
#endif

This conditional directive compiles the application only for use with the AI Engine simulator. It prevents the graph from being initialized or run multiple times, from both the graph and PS host application. The directive lets the graph.cpp run in the AI Engine simulator and the x86 simulator. However when running in hardware and hardware emulation, the graph is initialized and run from the PS application, rather than from the graph.cpp.