[{"data":1,"prerenderedAt":32},["ShallowReactive",2],{"chapter:kernels\u002Freference\u002Ftranslation-table.json":3},{"project":4,"route":5,"title":6,"titleHtml":6,"navTitle":6,"part":7,"sourcePath":8,"editUrl":9,"html":10,"toc":11,"hasMermaid":25,"prev":26,"next":29},"kernels","\u002Fkernels\u002Freference\u002Ftranslation-table","Python Triton to Rust","Reference","reference\u002Ftranslation-table.md","https:\u002F\u002Fgithub.com\u002Fteenygrad\u002Fteenygrad\u002Fedit\u002Fmain\u002Fbooks\u002Fkernels\u002Fsrc\u002Freference\u002Ftranslation-table.md","\u003Cp>Every method on the \u003Ccode>Triton\u003C\u002Fcode> trait, alphabetically, with its nearest Python\nTriton spelling.\u003C\u002Fp>\n\u003Cp>Two things to know before using this table.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>The Rust column is authoritative; the Python column is a signpost.\u003C\u002Fstrong> The Rust\nsignatures come from \u003Ccode>kernels\u002Fteeny-triton\u002Fsrc\u002Ftriton\u002Fmod.rs\u003C\u002Fcode> and are checked\nagainst it. The Python names are for orientation when porting — Triton moves\nthings between \u003Ccode>tl\u003C\u002Fcode> and \u003Ccode>tl.math\u003C\u002Fcode> between releases, so check against the version\nyou are porting from.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Optional arguments are spelled out in Rust.\u003C\u002Fstrong> Python has keyword arguments\nwith defaults; Rust does not. Where Python writes \u003Ccode>tl.load(p + o, mask=m)\u003C\u002Fcode>, Rust\nwrites the full parameter list with \u003Ccode>None\u003C\u002Fcode>s. The “Rust” column below gives the\nname and the arguments that carry meaning, not the full signature.\u003C\u002Fp>\n\u003Cp>\u003Ccode>D\u003C\u002Fcode> is a dtype type parameter throughout. \u003Ccode>T\u003C\u002Fcode> is the \u003Ccode>Triton\u003C\u002Fcode> implementation.\u003C\u002Fp>\n\u003Ch2 id=\"the-table\">The table\u003C\u002Fh2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Rust\u003C\u002Fth>\n\u003Cth>Python Triton\u003C\u002Fth>\n\u003Cth>Notes\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::abs(x)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.abs(x)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::advance(ptr, offsets)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.advance\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Block pointers only\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::arange(start, end)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.arange(start, end)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Half-open. Returns \u003Ccode>I32Tensor\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::arange_f32(start, end)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.arange(...).to(tl.float32)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Avoids an intermediate some backends reject\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::argmax(x, axis, tie_break_left, keep_dims)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.argmax\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::argmin(x, axis, tie_break_left, keep_dims)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.argmin\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::associative_scan(x, axis, f, reverse)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.associative_scan\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>f\u003C\u002Fcode> is a \u003Ccode>fn\u003C\u002Fcode> pointer, not a closure\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::assume(cond)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.assume\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Compiler hint\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::atan(x)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.math.atan\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::atomic_add(ptr, val, mask, sem, scope)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.atomic_add\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Returns the previous value\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::atomic_and(...)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.atomic_and\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Integers\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::atomic_cas(ptr, cmp, val, sem, scope)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.atomic_cas\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>No mask argument\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::atomic_max(...)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.atomic_max\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::atomic_min(...)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.atomic_min\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::atomic_or(...)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.atomic_or\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Integers\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::atomic_xchg(...)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.atomic_xchg\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::atomic_xor(...)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.atomic_xor\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Integers\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::broadcast(a, b)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.broadcast\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Returns both, broadcast together\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::broadcast_to(x, shape)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.broadcast_to\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::cast::&lt;Src, Dst&gt;(x, rounding, bitcast)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>x.to(dtype)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>bitcast: true\u003C\u002Fcode> reinterprets bits\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::cat(a, b, can_reorder)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.cat\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::cdiv(x, div)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.cdiv\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Scalar, not tensor\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::ceil(x)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.math.ceil\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Floats\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::clamp(x, lo, hi)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.clamp\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::cos(x)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.cos\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::cumprod(x, axis, reverse)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.cumprod\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::cumsum(x, axis, reverse)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.cumsum\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::debug_barrier()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.debug_barrier\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::device_assert(cond, msg, mask)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.device_assert\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Runs on the device\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::device_print(prefix, val, hex)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.device_print\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::div_rn(x, y)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.math.div_rn\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Round to nearest\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::dot::&lt;D, O&gt;(a, b, acc, precision, max_imprecise)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.dot\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>D\u003C\u002Fcode> inputs, \u003Ccode>O\u003C\u002Fcode> accumulator. Chapter 11\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::dot_scaled(...)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.dot_scaled\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>FP8 and narrower\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::eq(x, y)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>x == y\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Returns \u003Ccode>BoolTensor\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::eq_scalar(x, y)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>x == scalar\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::erf(x)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.math.erf\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::exp(x)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.exp\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::exp2(x)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.exp2\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::expand_dims(x, axis)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.expand_dims\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::fdiv(x, y, ieee_rounding)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.fdiv\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::flip(x, dim)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.flip\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>None\u003C\u002Fcode> flips all dimensions\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::floor(x)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.math.floor\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::fma(x, y, z)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.math.fma\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>x * y + z\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::full(shape, value)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.full\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::gather(src, index, axis)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.gather\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::ge(x, y)\u003C\u002Fcode> \u002F \u003Ccode>T::ge_scalar(x, y)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>x &gt;= y\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::gt(x, y)\u003C\u002Fcode> \u002F \u003Ccode>T::gt_scalar(x, y)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>x &gt; y\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::histogram(x, num_bins, mask)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.histogram\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Bins of width 1 from 0\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::inline_asm_elementwise(asm, constraints, is_pure, pack)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.inline_asm_elementwise\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Ends portability. Chapter 24\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::interleave(a, b)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.interleave\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::join(a, b)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.join\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>New minor dimension\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::le(x, y)\u003C\u002Fcode> \u002F \u003Ccode>T::le_scalar(x, y)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>x &lt;= y\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::load(ptr, mask, other, ...)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.load(ptr, mask=, other=)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Eight arguments. Chapter 7\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::load_scalar_f32_as_i32(ptr, offset)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>—\u003C\u002Ftd>\n\u003Ctd>No Python equivalent. Reads an \u003Ccode>f32\u003C\u002Fcode> index and truncates\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::load_tensor_descriptor(desc, offsets)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>desc.load(offsets)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>TMA. Chapter 11\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::log(x)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.log\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::log2(x)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.log2\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::lt(x, y)\u003C\u002Fcode> \u002F \u003Ccode>T::lt_scalar(x, y)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>x &lt; y\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The bounds-check idiom. Chapter 7\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::make_block_ptr(base, shape, strides, offsets, block_shape, order)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.make_block_ptr\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::make_tensor_descriptor(base, shape, strides, block_shape, padding)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.make_tensor_descriptor\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Chapter 11\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::max(x, axis, keep_dims)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.max\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::max_constancy(x, values)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.max_constancy\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Compiler hint\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::max_contiguous(x, values)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.max_contiguous\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Compiler hint\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::max_with_indices(x, axis, tie_break_left, keep_dims)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.max(..., return_indices=True)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::maximum(x, y)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.maximum\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Element-wise, not a reduction\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::min(x, axis, keep_dims)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.min\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::min_with_indices(...)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.min(..., return_indices=True)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::minimum(x, y)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.minimum\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Element-wise\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::multiple_of(x, values)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.multiple_of\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Compiler hint\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::ne(x, y)\u003C\u002Fcode> \u002F \u003Ccode>T::ne_scalar(x, y)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>x != y\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::num_programs(axis)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.num_programs\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::permute(x, dims)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.permute\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::program_id(axis)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.program_id\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Chapter 6\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::rand(seed, offsets, n_rounds)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.rand\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Philox\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::randint(seed, offsets, n_rounds)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.randint\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::randint4x(seed, offsets, n_rounds)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.randint4x\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Four streams\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::randn(seed, offsets, n_rounds)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.randn\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::ravel(x, can_reorder)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.ravel\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Flatten to 1-D\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::reduce(x, axis, f, keep_dims)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.reduce\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>f\u003C\u002Fcode> is a \u003Ccode>fn\u003C\u002Fcode> pointer. Chapter 13\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::reshape(x, shape, can_reorder)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.reshape\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::rsqrt(x)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.rsqrt\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::sigmoid(x)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.sigmoid\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::sin(x)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.sin\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::softmax(x, dim, keep_dims, ieee_rounding)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.softmax\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Numerically stable. Chapter 10\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::sort(x, dim, descending)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.sort\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::split(x)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.split\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Last dimension must be 2\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::sqrt(x)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.sqrt\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::sqrt_rn(x)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.math.sqrt_rn\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Round to nearest\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::static_assert(cond, msg)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.static_assert\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Compile time\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::static_print(msg)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.static_print\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Compile time\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::store(dest, src, mask, ...)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.store(ptr, val, mask=)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Six arguments. Chapter 7\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::store_tensor_descriptor(desc, offsets, value)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>desc.store(offsets, value)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>TMA\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::sum(x, axis, keep_dims)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.sum\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Chapter 10\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::swizzle2d(i, j, size_i, size_j, size_g)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.swizzle2d\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Bank-conflict avoidance\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::trans(x, dims)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.trans\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Alias for \u003Ccode>permute\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::umulhi(x, y)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.umulhi\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>High 32 bits of a \u003Ccode>u32\u003C\u002Fcode> product\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::view(x, shape)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.view\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Order not preserved\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::where_(cond, x, y)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.where\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Trailing underscore: \u003Ccode>where\u003C\u002Fcode> is a Rust keyword\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::xor_sum(x, axis, keep_dims)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.xor_sum\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Integers\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::zeros::&lt;D&gt;(shape)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.zeros\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>T::zeros_like(x)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>tl.zeros_like\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch2 id=\"pointer-arithmetic\">Pointer arithmetic\u003C\u002Fh2>\n\u003Cp>Not trait methods, but you need them in every kernel:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Rust\u003C\u002Fth>\n\u003Cth>Python Triton\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>ptr.add_offsets(offsets)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>ptr + offsets\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>x.lt(y)\u003C\u002Fcode>, \u003Ccode>x.ge(y)\u003C\u002Fcode>, …\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>x &lt; y\u003C\u002Fcode>, \u003Ccode>x &gt;= y\u003C\u002Fcode>, …\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>a + b\u003C\u002Fcode>, \u003Ccode>a * b\u003C\u002Fcode>, \u003Ccode>-a\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Same operators\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>mask_a &amp; mask_b\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>mask_a &amp; mask_b\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Ccode>add_offsets\u003C\u002Fcode> comes from the \u003Ccode>AddOffsets\u003C\u002Fcode> trait and the comparison methods from\n\u003Ccode>Comparison\u003C\u002Fcode> — the two \u003Ccode>where\u003C\u002Fcode> clauses every kernel carries. Chapter 7.\u003C\u002Fp>\n\u003Ch2 id=\"things-with-no-rust-equivalent\">Things with no Rust equivalent\u003C\u002Fh2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Python Triton\u003C\u002Fth>\n\u003Cth>Status\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>@triton.autotune\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Does not exist. Block sizes are chosen by hand. Chapter 15\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>@triton.heuristics\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Does not exist\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>num_warps=\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Not settable. Only readable from compiled PTX metadata\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>num_stages=\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Not settable\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>tl.constexpr\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Const generics instead. Chapter 6\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>@triton.jit\u003C\u002Fcode> on a helper\u003C\u002Ftd>\n\u003Ctd>A plain \u003Ccode>fn\u003C\u002Fcode> pointer. Chapter 13\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The first four are recorded in\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fteenygrad\u002Fteenygrad\u002Fblob\u002Fmain\u002Fbooks\u002Fkernels\u002FKNOWN-GAPS.md\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Ccode>KNOWN-GAPS.md\u003C\u002Fcode>\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"things-rust-catches-that-python-does-not\">Things Rust catches that Python does not\u003C\u002Fh2>\n\u003Cp>The reason for the type parameters and the \u003Ccode>where\u003C\u002Fcode> clauses:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Mistake\u003C\u002Fth>\n\u003Cth>Python Triton\u003C\u002Fth>\n\u003Cth>Rust\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Loading \u003Ccode>f32\u003C\u002Fcode>, storing to an \u003Ccode>f16\u003C\u002Fcode> buffer\u003C\u002Ftd>\n\u003Ctd>Runtime, or silent\u003C\u002Ftd>\n\u003Ctd>Type error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Using an \u003Ccode>i32\u003C\u002Fcode> tensor as a mask\u003C\u002Ftd>\n\u003Ctd>Runtime error\u003C\u002Ftd>\n\u003Ctd>Type error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Mismatched tensor ranks\u003C\u002Ftd>\n\u003Ctd>Runtime error\u003C\u002Ftd>\n\u003Ctd>Type error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>A closure as a combine function\u003C\u002Ftd>\n\u003Ctd>Runtime error\u003C\u002Ftd>\n\u003Ctd>Type error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>An unsupported dtype\u003C\u002Ftd>\n\u003Ctd>Runtime error\u003C\u002Ftd>\n\u003Ctd>Compile error, listing what is supported\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Wrong argument order at the launch site\u003C\u002Ftd>\n\u003Ctd>Runtime, wrong numbers\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>Also silent.\u003C\u002Fstrong> Chapter 21\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The last row is the exception, and it is the one place this SDK gives up an\nadvantage it could have. It is the third item in\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fteenygrad\u002Fteenygrad\u002Fblob\u002Fmain\u002Fbooks\u002Fkernels\u002FAPI-FRICTION.md\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Ccode>API-FRICTION.md\u003C\u002Fcode>\u003C\u002Fa>.\u003C\u002Fp>\n",[12,16,19,22],{"id":13,"text":14,"level":15},"the-table","The table",2,{"id":17,"text":18,"level":15},"pointer-arithmetic","Pointer arithmetic",{"id":20,"text":21,"level":15},"things-with-no-rust-equivalent","Things with no Rust equivalent",{"id":23,"text":24,"level":15},"things-rust-catches-that-python-does-not","Things Rust catches that Python does not",false,{"title":27,"titleHtml":27,"route":28},"What Is Portable","\u002Fkernels\u002Fin-a-model\u002Fportability",{"title":30,"titleHtml":30,"route":31},"Common Compile Errors","\u002Fkernels\u002Freference\u002Fcompile-errors",1786271830125]