Skip to main content

GPU operation metadata

Overview​

Operation metadata describes logical inputs, outputs, workload, and constraints without prescribing a backend execution strategy.

At a glance

QuestionAnswer
ProblemExpose logical workload and constraints without decoding shaders or bindings.
Reads / writesNames logical inputs and outputs rather than concrete graph buffer uses.
OwnershipMetadata is immutable descriptive state owned by its operation.
Output contractPlanner-readable input, output, workload, and constraint records.
Expected workReports problem size while leaving command counts and dispatch geometry to lowering.
ChunksShape metadata describes logical data; physical chunk handling remains explicit.
Conditions / budgetsConsumed during planning and inspection, with no GPU work of its own.
NeighborhoodGPUOperation metadata → planner decisions → backend lowering report.

Why operations need metadata​

GPUOperation preserves semantic computation above GPUCommandGraph command nodes. Identity and hierarchy are enough to display a program tree, but a planner needs a little more information to reason about the computation without decoding WGSL or bindings.

Operation metadata answers four questions:

inputs what logical data does this operation consume?
outputs what logical data does it produce?
workload how large is the mathematical problem?
constraints what must a legal realization support?

Metadata deliberately does not answer how the operation executes. Workgroup size, subgroup mapping, dispatch count and selected kernels belong to strategy/lowering rather than semantic intent.

Example: sparse matrix-vector multiply​

An adaptive SpMV operation can eventually describe itself as:

metadata: {
inputs: [
{name: 'matrix', kind: 'csr-matrix', format: 'float32', shape: [rows, columns]},
{name: 'vector', kind: 'vector', format: 'float32', shape: [columns]}
],
outputs: [
{name: 'result', kind: 'vector', format: 'float32', shape: [rows]}
],
workload: {
rows,
columns,
nonZeros
},
constraints: {
backend: 'webgpu'
}
}

The same semantic metadata remains valid whether lowering selects scalar-row, subgroup-row, workgroup-row or long-row execution.

Metadata versus graph resources​

Semantic resources and command-graph resource uses are related but intentionally different.

Operation IR Command graph

matrix: CSR<float32> storage buffer reads
vector: float32[N] lower storage buffer read
result: float32[M] ─────→ storage buffer write
rows / nnz dispatch dimensions

The left side is suitable for planners, inspectors and higher-level algorithms. The right side is precise enough for WebGPU hazard tracking and encoding.

Metadata does not replace GraphDataView, GraphBufferHandle, or node resource declarations.

Workload is not strategy​

This distinction is central:

workload: {rows: 1_000_000, nonZeros: 5_000_000}

is semantic information.

strategy: subgroup-row
workgroupSize: 256
dispatchCount: 3907

is an execution decision.

Keeping those separate allows the same operation IR to be replanned for different devices without reconstructing the mathematical program.

Constraints​

Constraints describe requirements rather than preferences. Examples may eventually include:

  • required backend capabilities;
  • supported value formats;
  • numerical requirements;
  • dimensional or layout invariants.

They should remain sparse. Device-specific optimization preferences belong to strategy selection.

Composite metadata​

GPUCompositeOperation may carry metadata for the composite as a whole while preserving child metadata:

PCG
input: A, b
output: x
workload: unknowns=N, nnz=K

├─ SpMV
├─ reduction
├─ vector updates
└─ Jacobi

This gives an inspector both algorithm-level meaning and operation-level detail.

Direction​

The intended layering is:

GPUOperation
semantic identity
semantic metadata
↓
planner / strategy selection
↓
lowering
↓
GPUCommandGraph nodes
↓
WebGPU

This PR intentionally adds no strategy API, cost model, fusion system, or control-flow semantics. Those features should consume the metadata contract rather than expand it preemptively.