Tenstorrent’s accelerators take a different structural bet from GPUs and TPUs: instead of one big matmul engine or many SIMT lanes, they use a 2D grid of small, self-contained Tensix cores tied together by an on-chip network, with data movement expressed explicitly in software. The same mesh abstraction extends over Ethernet to many chips, so a single-chip program and a multi-chip program look structurally similar.
Core idea
Every Tensix core has its own compute engines, its own local SRAM (used as a managed scratchpad, not a cache), and its own network routers. Tensors are streamed from core to core (and to DRAM) as packets over a Network-on-Chip (NoC), and the programmer decides where each tile lives and when it moves.
The Tensix core
A Tensix core is not a single processor but a small cluster of specialized blocks coordinated by five “baby” RISC-V cores:
- Two data-movement RISC-V cores drive the two NoC interfaces: one typically acts as a reader (pulling tiles into local SRAM) and one as a writer (pushing results out). They issue NoC transactions and manage the circular buffers.
- Three compute RISC-V cores run a three-stage pipeline over the math engines:
- T0 (Unpack): drives the unpacker, reading tiles from SRAM into the source registers.
- T1 (Math): issues instructions to the matrix and vector engines.
- T2 (Pack): drives the packer, moving results back to SRAM.
The math blocks themselves are not processors and cannot branch; the RISC-V cores issue commands and synchronize them.
- Matrix engine (FPU): the workhorse for matmul, convolution, and elementwise/pooling ops. It reads operands from two source registers (
SrcA,SrcB) and accumulates into a destination register set (Dst). Maximum internal accuracy is TF32-class (about 19 bits), with bf16 the common path. - Vector engine (SFPU): a SIMD unit for activations, normalization, transcendentals, and other pointwise work. It operates through the
Dstset and its ownLRegvector registers (for example 32 elements wide on Wormhole/Blackhole), and supports up to fp32. - Packer / unpacker: hardware format converters between SRAM storage and compute registers. Because they convert in hardware, tiles can sit in SRAM in a compact form (for example block floating-point) while the engines compute on bf16/fp32, saving bandwidth and power with no software decompression.
Registers are historical
SrcA/SrcB/Dstare named from the matrix engine, which predates the vector engine.Dstis the only register set exposed by the high-level compute API; the vector engine also reads and writes it.fp32_dest_acc_enselects 16-bit vs 32-bitDststorage, trading register capacity for accumulation width.
Local SRAM and circular buffers
Each core has roughly 1 to 1.5 MB of local SRAM (“L1”). It is an explicitly managed scratchpad: nothing is fetched or evicted automatically, so the kernel author owns placement and lifetime.
Producer/consumer dataflow inside and between cores is coordinated through circular buffers (CBs): statically allocated FIFO queues in SRAM that pipeline tiles between the data-movement cores and the compute pipeline. The synchronization primitives are explicit:
cb_reserve_back/cb_push_back: a producer reserves space, fills it, then publishes.cb_wait_front/cb_pop_front: a consumer waits for data, uses it, then frees the slot.
This lets the unpacker, math engine, and packer run concurrently on different tiles (double-buffering the Dst set), overlapping compute with NoC transfers so no stage idles waiting on another.
Tiles and the dataflow model
- The native unit of work is a 32x32 tile (1024 elements), internally split into 16x16 “faces”. Tiling to 32x32 keeps the engines and registers fully utilized.
- Data movement is first class: a kernel is written as explicit reads, compute, and writes, not as loads against a transparent cache.
- Compute and communication are scheduled together, which matches the dataflow shape of neural networks and keeps the Roofline Analysis question front-and-center: performance is about keeping every engine fed across the NoC.
Network-on-Chip (NoC)
- The on-chip fabric is a 2D torus mesh connecting all Tensix cores, with packet-based routing and wraparound links.
- Tensors are streamed core to core as NoC packets; the two NoC interfaces per core let reads and writes proceed in parallel.
- DRAM is accessed as banks hanging off the same NoC (GDDR6 on Wormhole and Blackhole), so a core reaches memory and its neighbors through one uniform mechanism. There is no monolithic memory controller funneling all traffic.
Ethernet scale-out
Selected cores on the die are Ethernet cores that carry the NoC protocol off-chip. Chip-to-chip links connect dies directly into a larger mesh with effectively zero software overhead: a remote core is addressed much like a local one, so the programming model extends off-chip into multi-chip and multi-host (“Galaxy”) systems.
- Wormhole added on-chip Ethernet (multiple 100 Gb lanes) specifically to make scale-out native.
- Blackhole widened this to 400 Gb-class links with roughly a terabyte per second of aggregate off-chip bandwidth.
This is the key contrast with switched GPU fabrics and with the TPU torus: scale-out is the same mesh, just larger.
Software stack
- TT-Metalium: the low-level C++ kernel and dataflow layer. You write data-movement kernels (for the NoC RISC-V cores: NoC transactions, CB management) and compute kernels (the unpack/math/pack pipeline over the FPU/SFPU), and you place kernels onto specific cores in the grid.
- TT-NN: a higher-level, PyTorch-like op library (tensors, common NN ops) built on Metalium, so most models do not require hand-written kernels.
- tt-forge / front-end compilers: an MLIR-based path that ingests models from PyTorch and other frameworks and lowers them onto the core grid and NoC, partitioning work across Tensix cores, assigning DRAM/L1 buffers, and generating the data-movement schedule.
Tenstorrent Neural Network Stack
Tensor Layout Types:
- row major
- Tile layout