From 80da8a4b9c64a778b5ebb6e7d9fb51297db59902 Mon Sep 17 00:00:00 2001 From: George Hotz <72895+geohot@users.noreply.github.com> Date: Thu, 7 May 2026 18:52:49 -0700 Subject: [PATCH] add spec to main tinygrad repo (#16092) --- spec/README.md | 1 + spec/render.sh | 10 ++ spec/tinyspec.pdf | Bin 0 -> 98549 bytes spec/tinyspec.tex | 450 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 461 insertions(+) create mode 100644 spec/README.md create mode 100755 spec/render.sh create mode 100644 spec/tinyspec.pdf create mode 100644 spec/tinyspec.tex diff --git a/spec/README.md b/spec/README.md new file mode 100644 index 0000000000..f316625abb --- /dev/null +++ b/spec/README.md @@ -0,0 +1 @@ +Run `./render.sh` whenever you update tinyspec.tex to regenerate tinyspec.pdf. diff --git a/spec/render.sh b/spec/render.sh new file mode 100755 index 0000000000..23a9a3b1f3 --- /dev/null +++ b/spec/render.sh @@ -0,0 +1,10 @@ +#!/bin/bash +set -e + +if ! command -v tectonic &>/dev/null; then + echo "tectonic not found, installing..." + sudo pacman -S --noconfirm tectonic +fi + +tectonic tinyspec.tex +echo "done: tinyspec.pdf" diff --git a/spec/tinyspec.pdf b/spec/tinyspec.pdf new file mode 100644 index 0000000000000000000000000000000000000000..249befa073e27a8b18088738fd228c0209b8fca1 GIT binary patch literal 98549 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 bD6-<=^P|I_jo0)rVCz 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 b]$ \\ +\op{CmpGe} & \op{CmpNe}(\op{CmpLt}($A$, $B$),\, $1$) & $[a \ge b]$ \\ +\op{CmpLe} & \op{CmpNe}(\op{CmpLt}($B$, $A$),\, $1$) & $[a \le b]$ \\ +\op{CmpEq} & \op{CmpNe}(\op{CmpNe}($A$, $B$),\, $1$) & $[a = b]$ \\ +\op{Not} & \op{CmpNe}($A$, $1$) & $\lnot a$ \\[4pt] +\op{Exp2} & polynomial approx + \op{Mul}, \op{Add} & $2^x$ \\ +\op{Log2} & exponent extract + polynomial approx & $\log_2 x$ \\ +\op{Sin} & argument reduction + polynomial approx & $\sin x$ \\ +\op{Sqrt} & \op{Exp2}($0.5 \cdot$ \op{Log2}($A$)) & $\sqrt{x}$ \\ +\op{Pow} & \op{Exp2}(\op{Log2}($A$) $\cdot\, B$) & $a^b$ \\ +\op{Mulacc} & \op{Add}(\op{Mul}($A$, $B$),\, $C$) & $a \cdot b + c$ \\ +\op{Threefry} & 5 rounds of add-rotate-xor (ARX) & Threefry 2x32 PRNG \\ +\bottomrule +\end{tabular} + +%% ============================================================ +\subsection*{{\color{markerorange}Marker Ops} \normalfont\small--- identity on data} + +\begin{tabular}{@{}l l l l@{}} +\toprule +\textbf{Op} & \textbf{src} & \textbf{arg} & \textbf{Semantics} \\ +\midrule +\op{Contiguous} & $(T,)$ & --- & Force contiguous memory layout. \\ +\op{ContiguousBackward} & $(T,)$ & --- & Force contiguous in backward pass. \\ +\op{Detach} & $(T,)$ & --- & Stops gradient propagation. \\ +\op{Copy} & $(T,)$ & device & Copy to target device. \\ +\bottomrule +\end{tabular} + +%% ============================================================ +\subsection*{Codegen Ops \normalfont\small--- generated code primitives, these do not appear in the main graph} + +\begin{tabular}{@{}l l l l@{}} +\toprule +\textbf{Op} & \textbf{src} & \textbf{arg} & \textbf{Semantics} \\ +\midrule +\op{Load} & (idx,alt?,gate?) & --- & Dereference: read element at index from buffer. \\ + & & & All loads will be replaced by \op{Store}. \\ +\op{Barrier} & (deps\ldots) & --- & Synchronize threads within a workgroup. \\ +\op{Ins} & \ldots & \ldots & A single machine instruction (e.g.\ AMD ISA). \\ +\op{Special} & (bound,) & name & GPU thread/workgroup index (e.g.\ \texttt{gidx0}, \texttt{lidx1}). \\ +\op{If} & (gate,) & --- & Begin conditional execution block. \\ +\op{Endif} & (if,) & --- & End conditional execution block. \\ +\op{Wmma} & (A, B, acc) & config & Warp matrix multiply-accumulate (tensor cores). \\ +\op{Custom} & (args\ldots) & fmt & Inject custom code string into generated source. \\ +\op{AtomicAdd} & (idx, val) & --- & Atomic read-modify-write: \texttt{buf[idx] += val}. \\[4pt] +\op{CustomFunction} & (meta\ldots) & name & Opaque device function (e.g.\ HW decode). Via \op{Call}. \\ +\op{Program} & (linear, source, binary) & --- & Compiled kernel: instructions, source, and machine code. \\ +\op{Source} & () & str & Human-readable rendered source code. \\ +\op{Binary} & () & bytes & Compiled machine code. \\ +\bottomrule +\end{tabular} + +\smallskip +These ops are not part of the core specification and are subject to change. + +%% ============================================================ +\subsection*{Derived Properties} + +Every UOp has a \textbf{dtype}, \textbf{shape}, \textbf{device}, \textbf{min\_max}, and \textbf{axis}, derived from its op, src, and arg: + +\medskip +\begin{tabular}{@{}l l l l l@{}} +\toprule +\textbf{Op} & \textbf{dtype} & \textbf{shape} & \textbf{device} & \textbf{min\_max} \\ +\midrule +\op{Buffer} & from arg & $(\text{size},)$ from arg & from arg & dtype range \\ +\op{Const} & from arg & $()$ & \textsc{null} & $[v, v]$ \\ +\op{Param} & from arg & from $\mathrm{src}[0]$ & from arg & from src or dtype range \\[3pt] +Movement ops & $\mathrm{src}[0].\mathrm{dtype}$ & (see op) & $\mathrm{src}[0].\mathrm{device}$ & $\mathrm{src}[0]$ \\ +\op{Reduce} & $\mathrm{src}[0].\mathrm{dtype}$ & collapse axes to $1$ & $\mathrm{src}[0].\mathrm{device}$ & dtype range \\[3pt] +\op{Cast} & from arg & $\mathrm{src}[0].\mathrm{shape}$ & $\mathrm{src}[0].\mathrm{device}$ & clamped to dtype \\ +\op{Bitcast} & from arg & $\mathrm{src}[0].\mathrm{shape}$ & $\mathrm{src}[0].\mathrm{device}$ & dtype range \\ +\op{Copy} & $\mathrm{src}[0].\mathrm{dtype}$ & $\mathrm{src}[0].\mathrm{shape}$ & from arg & $\mathrm{src}[0]$ \\ +ALU unary & $\mathrm{src}[0].\mathrm{dtype}$ & $\mathrm{src}[0].\mathrm{shape}$ & $\mathrm{src}[0].\mathrm{device}$ & dtype range \\ +\op{Add} & $\mathrm{src}[0].\mathrm{dtype}$ & broadcast & $\mathrm{src}[0].\mathrm{device}$ & $[a+b,\, A+B]$ \\ +\op{Mul} & $\mathrm{src}[0].\mathrm{dtype}$ & broadcast & $\mathrm{src}[0].\mathrm{device}$ & $[\min,\max]$ of products \\ +\op{Max} & $\mathrm{src}[0].\mathrm{dtype}$ & broadcast & $\mathrm{src}[0].\mathrm{device}$ & $[\max(a,b),\, \max(A,B)]$ \\ +Other binary & $\mathrm{src}[0].\mathrm{dtype}$ & broadcast & $\mathrm{src}[0].\mathrm{device}$ & dtype range \\ +\op{CmpLt}, \op{CmpNe} & bool & broadcast & $\mathrm{src}[0].\mathrm{device}$ & from intervals \\ +\op{Where} & $\mathrm{src}[1].\mathrm{dtype}$ & broadcast & $\mathrm{src}[0].\mathrm{device}$ & $[\min(b,c),\, \max(B,C)]$ \\[3pt] +\op{Function}, \op{Call} & $\mathrm{src}[0].\mathrm{dtype}$ & substitute \op{Param} shapes & $\mathrm{src}[1].\mathrm{device}$ & dtype range \\ +\op{Range} & index & $()$ & \textsc{null} & $[0,\, n{-}1]$ \\ +\op{Index} & $\mathrm{src}[0].\mathrm{dtype}$ & remaining dims & $\mathrm{src}[0].\mathrm{device}$ & $\mathrm{src}[0]$ \\ +\op{Store} & void & $()$ & $\mathrm{src}[0].\mathrm{device}$ & --- \\ +\op{After} & $\mathrm{src}[0].\mathrm{dtype}$ & $\mathrm{src}[0].\mathrm{shape}$ & $\mathrm{src}[0].\mathrm{device}$ & $\mathrm{src}[0]$ \\ +\bottomrule +\end{tabular} + +\smallskip +$\mathrm{broadcast}$: right-align shapes, element-wise max; each axis must be equal or $1$. +$[a,A]$, $[b,B]$, $[c,C]$ denote min\_max of $\mathrm{src}[0]$, $\mathrm{src}[1]$, $\mathrm{src}[2]$. +Default \emph{dtype range}: $[\mathrm{dtype\_min},\, \mathrm{dtype\_max}]$. + +\medskip +\textbf{axis} tracks the multi-device sharding dimension. \op{Buffer} with $n$-tuple device: axis $= 0$ (device dim). +\op{Reshape} remaps axis to preserve the shard boundary. \op{Permute} follows the permutation. +\op{Reduce} on the shard axis $\to$ \textsc{null}. \op{Replicated} on the shard axis $\to$ \textsc{null}. \op{Copy} $\to$ \textsc{null}. ALU ops inherit from sources. Default: \textsc{null}. + +%% ============================================================ +\subsection*{Kernel Optimizations (OptOps) \normalfont\small--- schedule-level transforms on kernel ranges} + +Each kernel's iteration space is a set of \op{Range} axes. Every range has an \textbf{AxisType}: + +\medskip +\begin{tabular}{@{}l l l l l@{}} +\toprule +\textbf{AxisType} & \textbf{Letter} & \textbf{Split from} & \textbf{Direction} & \textbf{Semantics} \\ +\midrule +{\color{axblue}\texttt{GLOBAL}} & \texttt{g} & --- & --- & GPU global workgroup dimension. \\ +{\color{axcyan}\texttt{LOCAL}} & \texttt{l} & g, L & inner & Workgroup local dimension (shared memory). \\ +{\color{axbrcyan}\texttt{WARP}} & \texttt{w} & \multicolumn{2}{l}{(created by \op{TC})} & Warp-level lanes for tensor cores. \\ +{\color{axbrblue}\texttt{THREAD}} & \texttt{t} & g & outer & CPU thread parallelism. \\ +{\color{axwhite}\texttt{LOOP}} & \texttt{L} & --- & --- & Generic sequential loop (initial state). \\ +{\color{axred}\texttt{REDUCE}} & \texttt{R} & --- & --- & Reduction axis. \\ +{\color{axbrred}\texttt{GROUP\_REDUCE}} & \texttt{G} & R & inner/outer & Shared-memory group reduction. \\ +{\color{axyellow}\texttt{UPCAST}} & \texttt{u} & g, l, L & inner & Register-level vectorization. \\ +{\color{axmagenta}\texttt{UNROLL}} & \texttt{r} & R, G & inner & Fully unrolled loop. \\ +\bottomrule +\end{tabular} + +\medskip +An optimization is a triple $(\mathrm{op},\;\mathrm{axis},\;\mathrm{arg})$: + +\smallskip +\begin{tabular}{@{}l l l p{6.5cm}@{}} +\toprule +\textbf{OptOp} & \textbf{axis} & \textbf{arg} & \textbf{Semantics} \\ +\midrule +\op{Split} & any & (factor $k$, target, top?) & + Split axis $n$ by $k$ into $(n/k, k)$ or $(k, n/k)$ if top. New sub-axis gets target AxisType (see table above). \\ +\op{Padto} & any & multiple $m$ & + Pad axis to next multiple of $m$ with validity masks. \\[4pt] +\op{Swap} & axis$_i$ & axis$_j$ & + Swap two axes $i \leftrightarrow j$. \\ +\op{Nolocals} & --- & --- & + Disable local memory; no workgroup dims emitted. \\ +\op{TC} & reduce idx & (tc, opt, mode) & + Apply tensor core \op{Wmma}: split reduce/output axes into \texttt{WARP}, \texttt{UPCAST}, and \texttt{UNROLL} dims. \\ +\bottomrule +\end{tabular} + +\smallskip +Optimizations compose left-to-right. \op{TC} must be first. The search space is explored by BEAM search or hand-coded heuristics. + +%% ============================================================ +\subsection*{Common Ops as Compositions} + +All high-level tensor operations decompose into the primitives above. + +\begin{lstlisting} +# gemm: C[M,N] = A[M,K] @ B[K,N] +def gemm(A, B): + M,K = A.shape; _,N = B.shape + return (A.reshape(M,K,1) * B.reshape(1,K,N)).sum(1) + +# prefix_sum: cumulative sum via repeat+reshape sliding window trick +def prefix_sum(T): + n = T.shape[0] + x = T.pad((n-1, 0)) # (2n-1,) + x = x.reshape(1,2*n-1).expand(n+1,2*n-1) # tile + x = x.reshape((n+1)*(2*n-1)).shrink_to(2*n*n) # trim + x = x.reshape(n,2*n).shrink_to(n,n) # windows + return x.sum(-1) # reduce + +# arange: prefix_sum of all 1s gives [1,2,...,n], subtract 1 for [0,1,...,n-1] +def arange(n): + return prefix_sum(Tensor(1).reshape(1).expand(n)) - 1 + +# gather: out[i] = T[idx[i]]. one-hot mask along gather axis, then reduce +def gather(T, idx): + K = T.shape[0] + pos = arange(K).reshape(K, 1) # (K, 1) + mask = (pos == idx.reshape(1, -1)).cast(T.dtype) # (K, D) + return (T.reshape(K, 1) * mask).sum(0) # (D,) + +# scatter_add: T[idx[i]] += val[i] +def scatter_add(T, idx, val): + K, D = T.shape[0], idx.shape[0] + pos = arange(K).reshape(K, 1) # (K, 1) + mask = (pos == idx.reshape(1, D)).cast(T.dtype) # (K, D) + return T + (mask * val.reshape(1, D)).sum(1) # (K,) +\end{lstlisting} + +%% ============================================================ +\subsection*{{\color{multipurple}Multi-Device Collectives} \normalfont\small--- derived from primitives} + +Let $D = (d_0, \ldots, d_{n-1})$ be an $n$-tuple device. +\op{Copy} to an $n$-tuple device reshards with axis $= 0$. \op{Copy} never changes shape. + +\begin{lstlisting} +# T has shape (s,) on a single device. + +# broadcast: replicate T to all n devices +def broadcast(T): + return T.reshape(1, s).expand(n, s).copy(D).replicated(0) # (s,) on D, axis=null + +# scatter: split T into n chunks, one per device +def scatter(T): + return T.copy(D) # (s,) on D, axis=0 + +# T has shape (n*s,) on D with axis=0, so each device holds (s,) elements. + +# gather: collect all shards onto one device +def gather(T): + return T.copy(D[0]) # (n*s,) on D[0], axis=null + +# reduce: gather + sum +def reduce(T): + return gather(T).reshape(n, s).sum(0) # (s,) on D[0], axis=null + +# allgather: collect all shards, replicate to all devices +def allgather(T): + return T.reshape(1, n*s).expand(n, n*s).copy(D).replicated(0) # (n*s,) on D, axis=null + +# reduce_scatter: reduce across devices, scatter result +def reduce_scatter(T): + return T.reshape(n, n, s//n).permute(1, 0, 2).copy(D).sum(1).reshape(s) # (s,) on D, axis=0 + +# allreduce: reduce_scatter + allgather +def allreduce(T): + return allgather(reduce_scatter(T)) # (s,) on D, axis=null +\end{lstlisting} + +%% ============================================================ +\subsection*{{\color{callblue}The \texttt{@function} Decorator} \normalfont\small--- graph capture via tracing} + +The \texttt{@function} decorator transforms a Python function on Tensors into a single \op{Function} node. + +\begin{lstlisting} +@function +def f(a: Tensor, b: Tensor) -> Tensor: + return a + b +\end{lstlisting} + +When \texttt{f(x, y)} is called, the decorator: + +\begin{enumerate}[leftmargin=1.5em, itemsep=2pt] + \item \textbf{Extracts inputs}: walks all arguments to find every Tensor, deduplicates by identity. + \item \textbf{Runs the function} lazily (no device execution), building a UOp graph from the result. + \item \textbf{Parameterizes}: replaces each input UOp with a \op{Param}$(k)$ placeholder. + \item \textbf{Wraps the body} in a \op{Tuple} (even for single returns) and creates\\ + \op{Function}(\op{Tuple}(body), $x$, $y$). + \item \textbf{Returns} the result via \op{GetTuple}$(0)$, or one \op{GetTuple} per element for tuple returns. +\end{enumerate} + +The result is a reusable graph fragment: the body contains only \op{Param} references, not concrete buffers. At schedule time, the \op{Function} is resolved by substituting each \op{Param}$(k)$ back with its corresponding argument $a_k$, or lowered into an opaque \op{Call} if it is to be compiled as a reusable kernel. + +%% ============================================================ +\subsection*{Lowering Pipeline \normalfont\small--- from Tensor graph to machine code} + +\begin{tabular}{@{}l p{9.7cm}@{}} +\toprule +\textbf{Stage} & \textbf{Semantics} \\ +\midrule +\textbf{Callify} & Transform the Tensor graph into a single stateless function. \\ +\textbf{Rangeify} & Determine the kernel split of the function. Break everything down to shape () \\ +\textbf{Optimize} & Insert local buffers. Swap and split ranges, and determine which axes are parallel and which are serial. \\ +\textbf{Expand} & Expand the parallel ranges into shape. \\ +\textbf{Instruction Selection} & Select target instructions, including WMMA and devectorization. \\ +\textbf{Linearize} & Topologically sort the graph and determine execution order. \\ +\textbf{Register/Memory Plan} & Allocate and reuse \texttt{GLOBAL}, \texttt{LOCAL}, and \texttt{REG} storage for values with non-overlapping lifetimes. \\ +\textbf{Render} & Output the machine code. \\ +\bottomrule +\end{tabular} + + +\end{document}