|
| | MatMulNode (size_t element_id, const DebugInfo &debug_info, const graph::Vertex vertex, data_flow::DataFlowGraph &parent, const TensorLayout &layout_a, const TensorLayout &layout_b, QuantizationType quantization=QUANTIZATION_MATCH_INPUTS, const TensorLayout *layout_y=nullptr, const data_flow::ImplementationType &impl_type=data_flow::ImplementationType_NONE) |
| | Construct a matmul node.
|
| | MatMulNode (size_t element_id, const DebugInfo &debug_info, const graph::Vertex vertex, data_flow::DataFlowGraph &parent, const TensorLayout &layout_a, const TensorLayout &layout_b, const ContractionTypes &types, const TensorLayout *layout_y=nullptr, const data_flow::ImplementationType &impl_type=data_flow::ImplementationType_NONE) |
| | Construct a matmul node with explicit element types.
|
| symbolic::Expression | m () const |
| | Get the M dimension (rows of A, rows of output).
|
| symbolic::Expression | n () const |
| | Get the N dimension (columns of B, columns of output).
|
| const ContractionTypes & | types () const |
| | The configured element types; Void entries are inferred, see input_type(), accumulator_type(), output_type().
|
| void | set_types (const ContractionTypes &types) |
| types::PrimitiveType | input_type () const |
| | Element type of A and B: configured, or inferred from their memlets (Void if they disagree).
|
| types::PrimitiveType | accumulator_type () const |
| | Element type the products are summed in: configured, or the output type.
|
| types::PrimitiveType | output_type () const |
| | Element type of Y: configured, or inferred from its memlet.
|
| std::optional< types::PrimitiveType > | uniform_quantization (const data_flow::DataFlowGraph &dataflow) const |
| | The single type of inputs, accumulator and output, if they all agree.
|
| QuantizationType | quantization () const |
| QuantizationType | quantization (const data_flow::DataFlowGraph &dataflow) const |
| types::PrimitiveType | input_quantization () const |
| types::PrimitiveType | output_quantization () const |
| QuantizationType | fixed_quantization () const |
| | The configured type if inputs and output share one (Void otherwise).
|
| void | set_fixed_quantization (const QuantizationType quant) |
| const TensorLayout & | layout_a () const |
| const TensorLayout & | layout_b () const |
| const TensorLayout & | layout_y () const |
| TensorLayout & | layout_a () |
| TensorLayout & | layout_b () |
| TensorLayout & | layout_y () |
| symbolic::Expression | k () const |
| | Get the K dimension (columns of A, rows of B - contraction dimension).
|
| void | validate (const Function &function) const override |
| | Validate the code node's configuration.
|
| void | verify_data_types (const data_flow::DataFlowGraph &graph) const override |
| | Called as part of validate.
|
| virtual passes::LibNodeExpander::ExpandOutcome | expand (passes::LibNodeExpander::ExpandContext &, structured_control_flow::Block &block) override |
| | Expand matmul into nested maps.
|
| symbolic::SymbolSet | symbols () const override |
| | Get all symbols used in this node.
|
| void | replace (const symbolic::Expression old_expression, const symbolic::Expression new_expression) override |
| void | replace (const symbolic::ExpressionMapping &replacements) override |
| std::unique_ptr< data_flow::DataFlowNode > | clone (size_t element_id, const graph::Vertex vertex, data_flow::DataFlowGraph &parent) const override |
| | Clone this node for graph transformations.
|
| std::string | toStr () const override |
| | Convert node to string representation.
|
| symbolic::Expression | flop () const override |
| | Calculate floating point operations for this node.
|
| data_flow::PointerAccessType | pointer_access_type (int input_idx) const override |
| | Describes what a pointer is used for.
|
| bool | relocalize_operand (int input_idx, const TensorLayout &packed) override |
| | Repoint the operand at input_idx to a locally staged buffer.
|
| bool | can_relocalize_operand (int input_idx, const TensorLayout &packed) const override |
| | Side-effect-free predicate mirroring relocalize_operand: whether the operand at input_idx can be repointed at the buffer view packed.
|
| bool | supports_integer_types () const override |
| | Check if this operation supports integer types.
|
| | TensorNode (size_t element_id, const DebugInfo &debug_info, const graph::Vertex vertex, data_flow::DataFlowGraph &parent, const data_flow::LibraryNodeCode &code, const std::vector< std::string > &outputs, const std::vector< std::string > &inputs, const data_flow::ImplementationType &impl_type) |
| | Construct a tensor node.
|
| void | validate (const Function &function) const override |
| | Validate tensor node constraints.
|
| types::PrimitiveType | primitive_type (const data_flow::DataFlowGraph &graph) const |
| | Get the primitive type of this tensor operation.
|
| | MathNode (size_t element_id, const DebugInfo &debug_info, const graph::Vertex vertex, data_flow::DataFlowGraph &parent, const data_flow::LibraryNodeCode &code, const std::vector< std::string > &outputs, const std::vector< std::string > &inputs, const data_flow::ImplementationType &implementation_type, bool side_effects=false) |
| | Construct a mathematical library node.
|
| | LibraryNode (const LibraryNode &data_node)=delete |
| LibraryNode & | operator= (const LibraryNode &)=delete |
| virtual | ~LibraryNode ()=default |
| ElementType | type_id () const override |
| | Returns the type of the element.
|
| const LibraryNodeCode & | code () const |
| | Get the operation code.
|
| const ImplementationType & | implementation_type () const |
| | Get the implementation type (const).
|
| ImplementationType & | implementation_type () |
| | Get the implementation type (mutable).
|
| void | set_implementation_type (const ImplementationType &impl_type) |
| bool | side_effect () const override |
| | Check if this node has side effects.
|
| PointerAccessType | pointer_access_type (const Memlet &edge) const |
| virtual std::optional< SubgroupAccess > | operand_access (int input_idx, unsigned subgroup_size) const |
| | The elements one subgroup of subgroup_size lanes reads from the operand at input_idx, if the node declares them.
|
| EdgeRemoveOption | can_remove_out_edge (const data_flow::DataFlowGraph &graph, const Memlet *memlet) const override |
| | Is the edge in question removable, or will this make the node its an output on invalid?
|
| EdgeRemoveOption | can_remove_in_edge (const data_flow::DataFlowGraph &graph, const Memlet *memlet) const override |
| bool | pointer_use_creates_side_effects (const DataFlowGraph &dataflow, const Function &func) |
| | CodeNode (const CodeNode &data_node)=delete |
| CodeNode & | operator= (const CodeNode &)=delete |
| const std::vector< std::string > & | outputs () const |
| | Get output connector names (const).
|
| const std::vector< std::string > & | inputs () const |
| | Get input connector names (const).
|
| std::vector< std::string > & | outputs () |
| | Get output connector names (mutable).
|
| std::vector< std::string > & | inputs () |
| | Get input connector names (mutable).
|
| const std::string & | output (size_t index) const |
| | Get output connector name by index.
|
| const std::string & | input (size_t index) const |
| | Get input connector name by index.
|
| bool | has_constant_input (size_t index) const |
| | Check if an input is connected to a constant node.
|
| | DataFlowNode (const DataFlowNode &data_node)=delete |
| DataFlowNode & | operator= (const DataFlowNode &)=delete |
| graph::Vertex | vertex () const |
| | Get the graph vertex for this node.
|
| const DataFlowGraph & | get_parent () const |
| | Get the parent dataflow graph (const).
|
| DataFlowGraph & | get_parent () |
| | Get the parent dataflow graph (mutable).
|
| virtual bool | update_edge_removed (const std::string &out_conn) |
| | Element (size_t element_id, const DebugInfo &debug_info) |
| virtual | ~Element ()=default |
| size_t | element_id () const |
| const DebugInfo & | debug_info () const |
| void | set_debug_info (const DebugInfo &debug_info) |
| void | add_metadata (const std::string &key, const std::string &value) |
| void | remove_metadata (const std::string &key) |
| const std::string & | metadata (const std::string &key) const |
| const std::string * | metadata_if_exists (const std::string &key) const |
| const std::unordered_map< std::string, std::string > & | metadata () const |
| std::string_view | element_type () const |
| | Returns the type of the element as a human-readable string.
|
|
| void | validate_shape_matches (const std::vector< symbolic::Expression > &required_shape, const TensorLayout &layout, const std::string &name) const |
| | LibraryNode (size_t element_id, const DebugInfo &debug_info, const graph::Vertex vertex, DataFlowGraph &parent, const LibraryNodeCode &code, const std::vector< std::string > &outputs, const std::vector< std::string > &inputs, const bool side_effect, const ImplementationType &implementation_type) |
| | Protected constructor for library nodes.
|
| | CodeNode (size_t element_id, const DebugInfo &debug_info, const graph::Vertex vertex, DataFlowGraph &parent, const std::vector< std::string > &outputs, const std::vector< std::string > &inputs) |
| | Protected constructor for code nodes.
|
| | DataFlowNode (size_t element_id, const DebugInfo &debug_info, const graph::Vertex vertex, DataFlowGraph &parent) |
| | Protected constructor for dataflow nodes.
|
| static data_flow::TaskletCode | get_integer_minmax_tasklet (types::PrimitiveType prim_type, bool is_max) |
| | Get the appropriate tasklet code for min/max operations on integers.
|
| LibraryNodeCode | code_ |
| | Operation identifier (e.g., "GEMM", "Add").
|
| bool | side_effect_ |
| | Whether this node has side effects.
|
| ImplementationType | implementation_type_ |
| | How to implement this node.
|
| std::vector< std::string > | outputs_ |
| | Names of output connectors.
|
| std::vector< std::string > | inputs_ |
| | Names of input connectors.
|
| size_t | element_id_ |
| DebugInfo | debug_info_ |
| std::unordered_map< std::string, std::string > | metadata_ |
Tensor matrix multiplication following ONNX MatMul operator specification.
MatMulNode represents a tensor matrix multiplication operation that is compatible with the ONNX MatMul operator. The operation performs matrix multiplication on the last two dimensions and supports broadcasting over batch dimensions.
Input/Output Requirements
- Input connector "A": Input tensor [..., M, K]
- Input connector "B": Input tensor [..., K, N]
- Output connector "Y": Output tensor [..., M, N]
Broadcasting
The batch dimensions are broadcast following numpy broadcasting rules:
- Dimensions are compared from right to left (excluding last two matrix dims)
- Dimensions must be equal, or one of them must be 1
- The output shape takes the maximum of each dimension
Example
For inputs A[B, M, K] and B[B, K, N]:
- Y = A @ B has shape [B, M, N]
- Each (b, m, n) element is computed as: sum_k(A[b, m, k] * B[b, k, n])
Element types
A and B share the input type; the products are summed in the accumulator type and stored in the output type (see ContractionTypes), e.g. Int8 x Int8 accumulated and stored as Int32.