Tensor Instructions

Compared to JOLT instructions, JOLT Atlas operates on tensors. Most operations on tensors act entry wise, like ADD, while others such as MAX don't.

In particular, each instruction specifies:

  • The program counter (PC) address of this instruction in the bytecode.

  • The operation code (opcode) that defines the instruction’s function.

  • Three input tensor operands, specified as the index of a node in the computation graph. These tensor operands are analogous to registers in RISC-V, as both indicate the source location of an operand.

    • The third input tensor operand, used by special opcodes such as Select.

  • The destination tensor index, i.e. the node index in the computation graph where the result will be stored. It is analogous to rd in RISC-V, indicating the write destination of the operation result.

  • An immediate value, if applicable to the instruction.

  • The number of virtual instructions remaining in a virtual sequence (see Section 6.2 of the Jolt paper).

  • The dimensions of the output tensor.

Note: Currently limited to rank-2 tensors; scaling for higher ranks is a planned improvement.

  • The number of active elements in the output tensor.

List of instructions

Op

Expression / Description

Input

$X(input)$

MatMul

A * B

Relu

$max(0, x)$

Sigmoid

$1 / (1 + e^{(-x)})$

Add

$A + B$

EinSum

$Cᵢⱼ = ∑ₖ Aᵢₖ Bₖⱼ$

Const

$c (const)$

RmAxis

$squeeze(X)$

Reshape

$reshape(X, new\_shape)$

Conv

$(X * K)(i, j) = ∑_{ₘ,ₙ} X(i + m, j + n) K(m, n)$

MaxPool

$Y(i, j) = max_{ₘ,ₙ ∈ window} X(i + m, j + n)$

Gather

$Y(i) = X(g(i))$

Softmax

$yᵢ = e^{(xᵢ)} / ∑ⱼ e^{(xⱼ)}$

Reduce

$y = ∑ᵢ x$ or $y = (1/n) ∑ᵢ xᵢ$

AddAxis

$Y = expand\_dims(X)$

Cast

$Y = cast(X, type)$

TypedBinOp

$C = A ∘ B$

ElementWiseOp

$Y = f(X)$

Last updated