Let’s grab a quick coffee and look at what’s happening on your desk. You’ve probably spent the last three days staring at a profiler, wondering why a model that flies on paper is crawling on silicon, choking on memory bandwidth, or burning through your power budget before it even hits inference scale. You’re spinning up matrix multiplications—the lifeblood of transformer blocks and convolutional layers—and realizing that standard von Neumann setups are quietly sabotaging your hardware utilization. It feels like you’re pouring high-octane fuel into an engine with a clogged fuel line.
Direct Practical Verdict:

Systolic arrays eliminate von Neumann memory bottlenecks by pumping data rhythmically through an interconnected grid of processing elements. By reusing weights, inputs, or partial sums locally without constantly fetching from a central register file, modern TPUs and NPUs slash energy consumption below 0.5 pJ per MAC operation at 3nm nodes.

## Why Does Traditional Von Neumann Architecture Fail at Deep Learning Workloads? If you trace where energy goes in a standard CPU or traditional GPU during a heavy deep learning workload, the results are sobering. Roughly 90% of your power budget isn’t spent doing actual math. It’s spent dragging data across wires, reading and writing to massive central register files, and bottlenecking memory buses. Think about a standard arithmetic logic unit (ALU). Every single time it performs a Multiply-Accumulate (MAC) operation, it has to fetch operands from memory or a central register file, push them through the execution pipeline, and write the result back. When you scale this up to billions of parameters across multi-head attention layers, your SRAM and HBM bandwidth become a brick wall. The physical distance data travels from the cache to the ALU creates massive capacitive loads. In modern sub-micron processes, moving a 32-bit floating-point or 16-bit bfloat number across a chip consumes orders of magnitude more energy than the actual mathematical operation itself. You aren’t limited by how fast your transistors can multiply numbers; you’re limited by how fast you can feed them. This is the memory wall, and standard architectures are permanently pinned against it. ## How Do 2D Systolic Arrays Actually Pump Data Without Bottlenecks? To break this wall, hardware designers took inspiration from the cardiovascular system—hence the name “systolic,” mimicking how a heart pumps blood rhythmically through tissue. Instead of a central controller fetching data for isolated ALUs, a systolic array arranges hundreds or thousands of Processing Elements (PEs) into a tightly coupled 2D grid. Each PE is remarkably simple. It typically contains a localized multiplier, an accumulator, and a tiny set of local registers. Data doesn’t sit passively in a central bank waiting to be requested; it flows continuously across the array in orthogonal directions. Inputs enter from the top or left, step through one PE to the next on every clock cycle, and perform calculations on the fly. “` Inputs (x) —> [ PE ] —> [ PE ] —> [ PE ] | | | Weights (w) v v v [ PE ] [ PE ] [ PE ] | | | v v v “` As the data “pumps” through the grid, intermediate results (partial sums) are accumulated locally and passed to neighboring PEs. By the time a data wave propagates out of the array, the final mathematical result is complete. Crucially, this design eliminates the need to write intermediate values back to a central register file after every single cycle. The wire length is strictly localized between adjacent neighbors, which drops parasitic capacitance and keeps energy costs down to fractions of a pJ per MAC. ## What Are the Differences Between Weight-Stationary, Output-Stationary, and Input-Stationary Dataflows? Not all systolic arrays handle data movement the same way. When you are architecting or profiling an NPU—whether it’s inside an Apple Silicon chip or a Google TPU v5e—the underlying dataflow dictates your software compilation strategy, cache utilization, and thermal envelope.
Dataflow Architecture Primary Resident Data Prominent Hardware Example Energy Efficiency Profile Optimal Workload Match
Weight-Stationary (WS) Model weights stay locked inside local PE registers. Google TPU (v2 through v4) Exceptional for static inference; minimizes weight read overhead. Large LLM inference where weights rarely change between batches.
Output-Stationary (OS) Accumulators hold partial sums locally within the PE grid. Apple Neural Engine (ANE), various edge NPUs High efficiency during deep convolutions and dense layers. Computer vision, CNNs, and deep residual networks.
Input-Stationary (IS) Input feature maps are held static while weights/outputs stream. Custom research NPUs, FPGA overlays Moderate; heavily dependent on input reuse factor. Streaming sensor data with static sliding-window inputs.
Choosing a dataflow isn’t just an academic exercise. If you compile a model requiring heavy dynamic weight updates onto a pure weight-stationary TPU array designed for static inference, your compiler will waste cycles swapping weights in and out of local storage, destroying your throughput. ## How Do Google TPUs and Apple Neural Engines Implement Systolic Arrays in Silicon? Let’s look at how this manifests in production silicon. Google’s TPU v4 and v5e architectures rely on massive, high-throughput matrix multiplication units (MXUs). Inside a TPU v4, you’ll find a 128×128 systolic array capable of executing 16,384 MAC operations per cycle in bfloat16 precision. When Google compiles a model through XLA (Accelerated Linear Algebra), it groups large tensor operations into blocks that map directly onto these 128×128 dimensions. If your layer dimensions aren’t multiples of 128, you end up with padding—effectively dead PEs sitting idle during clock cycles, dragging down your operational arithmetic intensity. On the edge side, the Apple Neural Engine (found in M-series chips and iPhone processors) takes a different approach tailored for low-power mobile workloads. The ANE uses smaller, highly distributed systolic blocks optimized for Output-Stationary execution. This allows Apple’s silicon to run transformer-based Siri features and real-time object segmentation locally on device without melting the chassis, keeping power draws down to mere milliwatts per inference pass. ## How Can You Optimize Software Workloads for Hardware Systolic Arrays? If you are writing custom kernels, optimizing model graph compilers, or trying to squeeze every last drop of TOPS out of an edge NPU by 4:00 PM today, you need a pragmatic strategy. Here is the operational playbook to align your software with systolic hardware realities: 1. Align Tensor Dimensions with Array Granularity: Inspect your target NPU’s hardware specification. If your systolic grid is 64×64 or 128×128, reshape, pad, or tile your matrices so your batch sizes and channel dimensions are exact multiples. Avoid irregular tensor shapes that force partial array utilization. 2. Maximize Arithmetic Intensity (Operational Reuse): Ensure your layers pass data through the array as many times as possible before fetching new weights. Group operations to increase reuse ratios, keeping the PE grid saturated and preventing pipeline stalls. 3. Audit Precision and Quantization Pathways: Leverage native data types like INT8, FP8, or BF16 depending on what your systolic multipliers support in hardware. Mixing floating-point formats on fixed-point or mixed-precision arrays forces runtime emulation traps that tank performance. 4. Profile Memory Stalls Versus Compute Bound States: Use vendor profiling tools to check if your array is waiting on memory or if it’s truly compute-bound. If your execution is memory-bound, increase weight compression or prune sparse connections to lighten the memory bus load before it hits the systolic engine. ### Frequently Asked Questions Why must matrix dimensions match the systolic array size? Systolic arrays operate as fixed-grid hardware structures. If you feed an activation matrix smaller than your array dimensions (e.g., a 32×32 slice on a 128×128 TPU MXU), the remaining processing elements sit idle during that clock cycle, resulting in wasted silicon area and lower effective FLOPS. What happens when a model requires dynamic weights that change per iteration? In weight-stationary architectures, dynamic weights disrupt the data pipeline because the array is optimized for static weights that remain loaded in local PE registers. Compilers must stream new weights into the grid, which introduces latency cycles and reduces overall throughput efficiency. How does sub-micron scaling (3nm/4nm) impact systolic array performance? Shrinking process nodes reduces the physical distance between adjacent Processing Elements, lowering wire resistance and capacitive load. This allows modern 3nm NPUs to achieve sub-0.5 pJ energy consumption per MAC operation, enabling heavy AI workloads within tight thermal design power (TDP) envelopes.
Hardware Acceleration, Systolic Architectures & TPU Silicon

Understanding low-level hardware matrix execution engines is essential for maximizing NPU throughput. Examine our architectural guide on Rockchip RK3588 NPU Architecture: 6 TOPS Tri-Core.