Papers
Topics
Authors
Recent
Search
2000 character limit reached

Dato: Task-Based Dataflow Accelerator Model

Updated 10 July 2026
  • Dato is a task-based programming model that defines tasks, streams, and tensor layouts as first-class types to clearly manage communication in dataflow accelerators.
  • It employs a static type system that enforces safe, deterministic execution and efficiently maps virtual task graphs onto various hardware platforms such as AMD NPUs and FPGAs.
  • The compiler optimizes data movement and on-chip streaming through techniques like virtual mapping, kernel injection, and layout optimization, yielding near-peak performance and reduced code complexity.

Searching arXiv for the Dato programming-model paper and closely related accelerator-programming work to ground the article. Dato denotes a Python-embedded, task-based programming model and compiler for dataflow accelerators in which data communication and data sharding are elevated to first-class, statically checked types. Programs are written as graphs of tasks connected by explicit stream types, with tensor operands refined by layout types that encode sharding or replication across device axes. Tasks are first mapped virtually onto a spatial fabric, after which the compiler derives a legal physical mapping that satisfies hardware resource, buffering, and bandwidth constraints. The system targets commercial accelerators including AMD Ryzen AI NPU devices and AMD Alveo FPGAs, and is presented as a way to obtain concise code, on-chip streaming, and automated layout and mapping decisions without forcing the compiler to reconstruct an implicit dataflow from tile-oriented tensor code (Fang et al., 8 Sep 2025).

1. Problem setting and design premise

Dato is motivated by the claim that recent deep learning workloads increasingly stall on data movement rather than computation. The paper situates this in the broader “memory wall”: peak FLOPs continue to scale, but effective throughput is often limited by the movement and staging of tensors across memory hierarchies, especially when intermediate results are repeatedly written to and read from off-chip DRAM. Dataflow accelerators mitigate this by streaming data on-chip between modules so that intermediates avoid detours through DRAM; the cited examples include TPU, Trainium, Ryzen AI NPU, and GPUs with TMA that stream tensors asynchronously to overlap transfer and compute (Fang et al., 8 Sep 2025).

The central design premise is that existing programming models do not expose this communication structure at the right level. Low-level interfaces such as IRON for AMD NPUs or CUDA-level control expose FIFOs and DMAs directly and therefore permit aggressive optimization, but they impose substantial development burden and brittle synchronization logic; the paper states that even a simple GEMM can require hundreds of lines and manual synchronization. High-level tile-based languages, including Triton-like models and ARIES on AIE/NPU, hide communication behind per-tile array code. According to the paper, this abstraction boundary forces the compiler to reconstruct intended dataflow, adds complexity, risks correctness, and often causes intermediates to return to off-chip memory (Fang et al., 8 Sep 2025).

This suggests that Dato is best understood not as a conventional tensor DSL, but as a programming model in which compute and communication are co-specified. Its novelty lies less in introducing a new accelerator primitive than in making streams and sharding layouts explicit, typed objects in the source language.

2. Task graphs, stream types, and layout types

The top-level Dato abstraction is a Python function whose internal parallel tasks are declared with @task. These tasks communicate only through first-class Stream types, while tensor parameters are annotated with first-class Layout refinement types. The compiler type-checks stream usage and layout compatibility, lowers the annotated AST to MLIR, generates a virtual computation graph, and maps that graph to hardware (Fang et al., 8 Sep 2025).

The stream abstraction is precise enough to model hardware FIFOs directly. A stream has type Stream[T, N, P], where T is the element type, N is logical capacity in elements, and P is the number of elements transferred per operation. Streams support put() and get(), may be composed into arrays, and are treated as point-to-point channels between tasks. Dato’s linear typing discipline associates each stream with capability tokens Free(S) and Used(S). A put consumes Free(S) and yields Used(S); a get consumes Used(S), returns a ready linear future, and yields Free(S) immediately; await consumes that future and unwraps the value. The paper emphasizes three consequences of these rules: overflow and underflow are untypeable, each future must be consumed exactly once, and backpressure is relieved at get time rather than await time, permitting latency hiding without violating FIFO semantics (Fang et al., 8 Sep 2025).

Layout types encode the distribution of tensor axes across processing elements. The type form is D[\vec n] @ L, where each component of L is S for sharded or R for replicated. By default, a tensor uses R^d, but users may annotate layouts such as "S1S2" to specify sharding over device axes. The type system then tracks how operations transform layouts. Elementwise operations compute a labelwise join; reductions over replicated axes are purely local, whereas reductions over sharded axes produce partial results and leave a pending collective effect in the type; matmul propagates the outer layouts and records a pending + effect if the contraction dimension is sharded. allreduce discharges these pending effects. In this way, collective communication is not inferred heuristically after the fact; it is entailed by the type derivation (Fang et al., 8 Sep 2025).

The paper illustrates these abstractions with three canonical examples. A producer–consumer program uses arrays of streams and a sharded one-dimensional layout to move partitioned tensors between replicated tasks. A tiled GEMM uses shard-aware layouts for A, B, and C, performs dato.matmul, and then explicitly discharges the pending accumulation effect with dato.allreduce(op="+"). A FlashAttention implementation expresses the Q \to QK^\top \to \text{softmax} \to WV \to \text{accumulate} pipeline as tasks connected by streams, with online softmax state propagated through auxiliary streams such as exp_scale and exp_sum (Fang et al., 8 Sep 2025).

3. Static safety, determinism, and execution semantics

Dato’s type system is designed to enforce safety and determinism before lowering to hardware. The paper states that compile-time checking uses forward abstraction over the control-flow graph to ensure that all futures are consumed and capability tokens are not leaked. Programs with mismatched put/get counts, unconsumed futures, or deadlocking cycles are therefore rejected early as untypeable (Fang et al., 8 Sep 2025).

The execution model is SPMD-like. Each task has a statically typed interface, and a virtual mapping index obtained through dato.get_tid() selects the shard or tile instance being processed. Because streams are deterministic FIFOs and every dequeued item is linearly tracked, the ordering of communication is fixed by the task graph and the mapping, not by dynamic race resolution. The paper treats this as a major contrast with array-based languages that must infer communication and synchronization from imperative tensor manipulations (Fang et al., 8 Sep 2025).

A noteworthy semantic choice is the treatment of backpressure. The slot in a FIFO is freed as soon as the consumer executes get, even if the actual use of the value is delayed until a later await. This means the compiler may move await to a latency-hiding point without stalling the producer, while still preserving single-consumption semantics. For accelerators whose performance depends on sustained on-chip streaming rather than bursty synchronization, this is a consequential design detail rather than a minor typing convenience (Fang et al., 8 Sep 2025).

The layout discipline provides a second axis of static correctness. Because sharding annotations and pending collective effects are represented in types, the compiler can diagnose unsound reshaping or re-sharding directly. The paper’s position is that this prevents a large class of latent communication bugs and eliminates the need for whole-program dataflow reconstruction.

4. Compiler architecture and virtual-to-physical mapping

Dato’s compiler constructs a virtual mapping graph by instantiating the task lattice implied by @task(mapping=[...]) and wiring it with stream and collective edges. This virtual graph is device-agnostic: layouts such as "S1S2" indicate which tensor dimensions are sharded and which device axes they correspond to, but the graph is not yet committed to a finite number of physical processing elements (Fang et al., 8 Sep 2025).

To collapse the virtual graph onto the available hardware, the compiler applies two semantics-preserving mapping primitives. bundle() merges isomorphic nodes into a single multi-shot node that sequentially handles the inputs and outputs of the merged instances; this reduces external ports and converts fan-in or fan-out into time-multiplexed joins and splits. chain() fuses connected producer–consumer nodes into a single sequential node, eliminating their intermediate stream and its buffering requirements. The paper describes these transformations as essential for fitting computations to fabrics with strict port budgets, limited local memories, and routing pressure (Fang et al., 8 Sep 2025).

When the virtual graph is large, Dato uses a legality-constrained branch-and-reduce search that repeatedly applies bundle() and chain() until the number of virtual nodes fits the physical PE budget. Legality conditions include top-level I/O limits, per-tile ingress and egress limits, BRAM access limits on FPGA, type and shape compatibility, and dependency soundness. Only independent or directly connected nodes may be collocated, and collapsing across transitive paths that would create cycles is disallowed. Candidate mappings are lowered and optimized, and the best measured implementation is selected (Fang et al., 8 Sep 2025).

Several compiler passes are specialized to accelerator execution. Kernel injection matches computation subgraphs to hand-tuned vector kernels on NPUs or HLS IPs on FPGAs, adds tiling wrappers, and overlaps stream or DMA traffic with compute. Fine-grained layout optimization models layouts as tuples of offsets, sizes, and strides, simplifies layout compositions through a layout algebra, and fuses them into a single pack or unpack loop or DMA descriptor. DMA-aware hoisting offloads eligible layout work to NPU DMA engines when stride, burst, and bank constraints allow. DMA scheduling then groups transfers into epochs using token-based reasoning over coarse liveness, with multicast merging, spatial coalescing, and port-aware splitting to respect per-PE port budgets (Fang et al., 8 Sep 2025).

5. Hardware targets, runtime behavior, and empirical results

Dato targets two distinct accelerator classes. On AMD Ryzen AI NPU (XDNA1), the relevant substrate is an array of AI Engine tiles, each with VLIW cores, vector units, local scratchpads, and a programmable NoC, typically with 2 input and 2 output ports per tile. On AMD Alveo U280 FPGA, the substrate is LUT-based reconfigurable fabric capable of hosting custom systolic arrays and multi-level cache hierarchies. In both cases, tasks are placed through the virtual-to-physical mapping, streams become on-chip FIFOs, and collectives are inserted where layout types require them (Fang et al., 8 Sep 2025).

The reported evaluation covers single-kernel GEMM, fused multi-kernel pipelines, scalability, portability to FPGA, and ablation of compiler passes. On the NPU, GEMM experiments use matrix dimensions M,N,K{256,512,1024,2048}M,N,K \in \{256,512,1024,2048\}, fixed tile sizes by precision, and 4×4 active tiles on a 4×5 array. The reported utilization values are 75.01% of peak for i16, 47.56% for bf16, and 61.58% for i8; mixed-precision settings with lower bitwidth tensors such as i4/i8 achieve up to 84% hardware utilization. For fused multi-kernel designs, Dato implements Multi-Head Attention with FlashAttention and reports speedups over IRON of up to 2.81× across sequence lengths L[128,2048]L \in [128,2048], while a fused LLaMA-style SwiGLU FFN yields a 1.64× speedup by reducing off-chip traffic and improving occupancy (Fang et al., 8 Sep 2025).

On FPGA, Dato generates a 16×16 i8 output-stationary systolic array at 300 MHz. At the largest GEMM size, the design reaches 150 GOP/s against a theoretical peak of 153.6 GOP/s, which the paper summarizes as approximately 98% of peak. The comparison point is Allo, which is reported to fail timing at 132 MHz because of excessive fan-out, whereas Dato reduces output fan-out sufficiently to meet timing (Fang et al., 8 Sep 2025).

The paper also reports an ablation on NPU GEMM in which baseline execution time is 13.65 ms, falling to 6.42 ms with virtual mapping, to 3.13 ms after kernel injection, and to 2.83 ms after layout optimization. The authors identify virtual mapping as the largest end-to-end gain and state that data and instruction copy costs remain negligible throughout (Fang et al., 8 Sep 2025).

Workload or comparison Platform Reported result
GEMM (i16) Ryzen AI NPU 75.01% of peak
GEMM (bf16) Ryzen AI NPU 47.56% of peak
GEMM (i8) Ryzen AI NPU 61.58% of peak
Mixed precision Ryzen AI NPU up to 84% hardware utilization
MHA with FlashAttention Ryzen AI NPU up to 2.81× over IRON
FFN (SwiGLU) Ryzen AI NPU 1.64× over IRON
GEMM scaling Ryzen AI NPU 2×4 gives 1.97× over 1×4; 4×4 gives 3.67×
16×16 i8 systolic GEMM Alveo U280 FPGA 150 GOP/s vs 153.6 GOP/s theoretical peak
Productivity Dato vs IRON GEMM 8 vs 101 LoC; MHA 44 vs 239; FFN 14 vs 101

The productivity comparison is part of the system’s argument. Relative to IRON, Dato is reported to require 8 lines of code rather than 101 for GEMM, 44 rather than 239 for MHA, and 14 rather than 101 for FFN. This suggests that the language-level exposure of streams and layouts does not merely preserve performance; it also compresses the control logic that would otherwise be handwritten in a close-to-metal framework (Fang et al., 8 Sep 2025).

6. Trade-offs, practical use, ecosystem, and terminological distinctions

Dato’s design has explicit limitations. Its type system is untimed: it guarantees safety and backpressure semantics, but it does not predict minimal FIFO depths or precise timing, which remain dependent on hardware scheduling. Hardware fabric constraints such as limited ports, routing pressure, and SRAM bank availability can cap parallelism and may force aggressive application of bundle() and chain(), thereby reducing inter-node parallelism. The paper also notes that utilization can dip as scaling introduces more collectives and reductions (Fang et al., 8 Sep 2025).

The practical guidance in the paper follows directly from these constraints. On-chip communication should be expressed directly through Stream types rather than through array-to-stream indirection. Arrays of streams are recommended for multi-instance pipelines. Tensor parameters should carry Layout refinements so that sharding and collective obligations are statically known. Reductions over sharded dimensions should compute local partials and then explicitly discharge them with dato.allreduce. Tiling should be aligned with vector widths so that kernel injection and layout optimization can avoid pack or transpose overheads. For FPGA designs, Dato composes processing elements and caches as tasks and overlaps off-chip DMA, on-chip distribution, and local accumulation through streams and multi-buffering (Fang et al., 8 Sep 2025).

The implementation ecosystem is anchored in existing compiler infrastructure. Dato is built atop the open-source Allo framework and MLIR, using MLIR-AIE for AMD NPUs and C++ HLS through AMD Vitis for FPGA backends. The repository identified in the paper is https://github.com/cornell-zhang/allo (Fang et al., 8 Sep 2025).

The term “Dato” has other meanings in adjacent literature and should be disambiguated. “DaTo” in diffusion-model acceleration denotes “Dynamics-Aware Token Pruning,” a training-free Stable Diffusion acceleration method that couples feature caching with token pruning (Zhang et al., 2024). “DATO” in operator-based data assimilation denotes “Data Assimilation with Transfer Operators,” which is compared with QMDA in a distinct operator-theoretic context (Donno et al., 6 May 2026). In systems benchmarking, “Turi (formerly Dato, GraphLab)” refers to a distributed analytics framework used as a comparison point for knor, a NUMA-optimized k-means library (Mhembere et al., 2016). Within accelerator programming, however, Dato specifically refers to the task-based, stream- and layout-typed model for dataflow accelerators described above (Fang et al., 8 Sep 2025).

Topic to Video (Beta)

No one has generated a video about this topic yet.

Whiteboard

No one has generated a whiteboard explanation for this topic yet.

Follow Topic

Get notified by email when new papers are published related to Dato.