A stationary dataflow names the tensor that stays in the array. Everything else moves, and the reuse contract follows from that choice.
Style | Stays resident | Reuse idea |
|---|---|---|
Weight stationary (WS) | Filter weights in PEs | Weights read once, activations stream past |
Output stationary (OS) | Partial sums in accumulators | Accumulators sized to reduction depth, no spill |
Input stationary (IS) | Activation tile in PEs | Activations read once, weights stream past |
Streaming | Nothing; beats flow through | FIFOs sized so producer never waits |
Take an 8x8x8 toy: 64 weights and 64 activations of 1 B each. Each style pays for what it moves.
Style | Weight bytes | Activation bytes |
|---|---|---|
WS | 64 (read once) | 512 (each of 64 read 8 times) |
OS | 512 (streamed per output) | 512 (streamed per output) |
IS | 512 (streamed per output) | 64 (read once) |
Scale to 32x32x32 INT8 with 32768 MACs. The weight matrix is 1024 B.
WS weight traffic = 1024 B (one read of the 32x32 matrix)
OS weight traffic = 1024 outputs x 32 weights = 32768 B
ratio = 32768 / 1024 = 32x more weight traffic under OS hereStreaming suits producer-consumer chains with no reuse. A hybrid policy switches style per layer shape, but each switch pays retile and reload cost.
Small batches collapse OS efficiency first. Refill dominates when reduction depth is shallow.
Weight stationary. The risk is activation and partial-sum pressure if tiling ignores buffer capacity.
Refill and drain dominate short phases, and accumulators spill when tiles overflow.