In this section of the programming guide, we introduce the Object FIFO high-level communication primitive used to describe the data movement within the AIE array. At the end of this guide you will:
- have a high-level understanding of the communication primitive API,
- have learned how to initialize and access an Object FIFO through meaningful design examples,
- understand the design decisions, which led to current limitations and/or restrictions in the Object FIFO design,
- know where to find more in-depth material of the Object FIFO implementation and lower-level lowering.
To understand the need for a data movement abstraction we must first understand the hardware architecture with which we are working. The AIE array is a spatial compute architecture with explicit data movement requirements. Each compute unit of the array works on data that is stored within its L1 memory module and that data needs to be explicitly moved there as part of the AIE's array global data movement configuration. This configuration involves several specialized hardware resources that handle the data movement over the entire array in such a way that data arrives at its destination without loss. The Object FIFO provides users with a way to specify the data movement in a more human-comprehensible and accessible manner, without sacrificing some of the more advanced control possibilities which the hardware provides.
NOTE: For more in-depth, low-level material on Object FIFO programming in MLIR, please see the MLIR-AIE tutorials.
This guide is split into five sections, where each section builds on top of the previous ones:
NOTE: Section 2e contains several practical code examples with common design patterns using the Object FIFO which can be quickly picked up and tweaked for desired use.
Section 2a - Introduction
- Initializing an Object FIFO
- Accessing the objects of an Object FIFO
- Object FIFOs with same producer / consumer
Section 2b - Key Object FIFO Patterns
- Introduce data movement patterns supported by the Object FIFO
- Reuse
- Broadcast
- Distribute
- Join
Section 2c - Data Layout Transformations
- Introduce data layout transformation capabilities
Section 2d - Programming for multiple cores
- Walkthrough of the process of efficiently upgrading to designs with multiple cores
Section 2e - Practical Examples
- Practical examples using Object FIFOs
- Single / Double buffer
- External memory to core
- External memory to core using L2
- Distribute in L2
- Join in L2
Section 2f - Data Movement Without Object FIFOs
- Walkthrough of the process of programming DMA regions
Section 2g - Runtime Data Movement
- Walkthrough of the process of managing runtime data movement from/to host memory to/from the AIE array