FZGPUModules 2.0
GPU-accelerated modular compression pipelines
Loading...
Searching...
No Matches
fz::FusedOpDecl Struct Reference

A stage's contribution to a generated fused kernel — the device-op it maps to, where its source lives, and its runtime parameter bytes. More...

#include <fusion.h>

Public Attributes

std::string op_name
 device-op type name, e.g. "DiffNegabinary"
 
std::string include_header
 header used by the generated source
 
std::vector< uint8_t > params
 POD Params bytes; empty for stateless ops.
 
uint32_t elems_per_lane = 0
 
std::string ti_op_name
 

Detailed Description

A stage's contribution to a generated fused kernel — the device-op it maps to, where its source lives, and its runtime parameter bytes.

The generic runner collects one FusedOpDecl per stage in a fused group (after priming), packs the params blobs in group order, and hands the ordered op-name list to the codegen. This is how a stage declares its fused identity without the runner hard-coding any pipeline shape. Default-constructed (empty op_name) means "not a fused op" — the stage does not participate.

params is the raw bytes of the op's POD Params struct; the generated kernel reinterpret_casts the packed blob to that type, so the host-packed layout MUST match the device struct exactly (share the POD definition — see modules/fused/chunk_fusion/chunk_op_params.h). Stateless ops leave it empty.

Member Data Documentation

◆ elems_per_lane

uint32_t fz::FusedOpDecl::elems_per_lane = 0

Warp-register predictors only (0/unused otherwise): the shape a generic warp runner needs so it does not have to downcast the predictor stage. The kernel is templated on elems_per_lane (= block_size/32), and the blocks cover n_ab padded elements. The predictor packs its config into params with a leading float inv2eb slot (offset 0) the runner fills from the resolved bound.

◆ ti_op_name

std::string fz::FusedOpDecl::ti_op_name

Thread-independent (TI) device-policy type name for this SAME op, if the stage has one registered; empty means "no TI variant" — the launcher's TI eligibility check is exactly "both predictor and coder declared a non-empty ti_op_name", nothing else. This replaces a launcher-side name whitelist (nvrtc_warp_fusion.cu's old tiSupportedChain) with the stage declaring its own capability directly: adding a TI variant for a new predictor/coder means writing the ThreadX policy in warp_ti_fusion.cuh and setting this field here — no separate list to keep in sync, and a mismatch (TI class exists but this field wasn't set, or vice versa) is a straightforward NVRTC-compile-time or eligibility-mismatch to find rather than a silent throughput regression.

For a PREDICTOR: the exact, non-templated TI class name ("ThreadLorenzo1DPredictor", "ThreadTiledLorenzo3DPredictor", ...). For a CODER: the TI class's TEMPLATE BASE name without the <N> block-size argument ("ThreadFixedRateCoderN", "ThreadPlainRateCoderN") — the launcher supplies N (= 32 * elems_per_lane) since only it knows the paired predictor's block size.