Skip to content

'design_spaces' Submodule

Introduction

from streamtensor import design_spaces

Design spaces for the StreamTensor compiler.

This module provides classes for representing design spaces for the StreamTensor compiler. A design space is a directed graph where each node represents a an operation of the IR at a certain level of abstraction.

BaseDesignSpace(module=None, entry='forward')

Bases: MultiDiGraph

Base class for design spaces.

This class provides a base implementation for design spaces. It is a directed graph where each node represents an operation of the IR at a certain level of abstraction.

Attributes:

Name Type Description
top FuncOp

The top function in the module.

Parameters:

Name Type Description Default
module Optional[Module]

The MLIR module.

None
entry str

The name of the top function in the module.

'forward'

Raises:

Type Description
ValueError

If the top function is not found.

_format_dot_edge_label(prev, next, key, params_to_print=None)

Formats the label of an edge for DOT.

This method can be overridden by subclasses to customize the label of an edge.

Parameters:

Name Type Description Default
prev OpView

The previous node.

required
next OpView

The next node.

required
key int

The key of the edge.

required
params_to_print Optional[List[str]]

The parameters to print.

None

Returns:

Type Description
str

The formatted label of the edge.

_format_dot_edge_style(prev, next, key)

Formats the style of an edge for DOT.

This method can be overridden by subclasses to customize the style of an edge.

Parameters:

Name Type Description Default
prev OpView

The previous node.

required
next OpView

The next node.

required
key int

The key of the edge.

required

Returns:

Type Description
Dict[str, str]

A dictionary of style attributes.

_format_dot_node_label(node, params_to_print=None)

Formats the label of a node for DOT.

This method can be overridden by subclasses to customize the label of a node.

Parameters:

Name Type Description Default
node OpView

The node.

required
params_to_print Optional[List[str]]

The parameters to print.

None

Returns:

Type Description
str

The formatted label of the node.

_format_dot_node_style(node)

Formats the style of a node for DOT.

This method can be overridden by subclasses to customize the style of a node.

Parameters:

Name Type Description Default
node OpView

The node.

required

Returns:

Type Description
Dict[str, str]

A dictionary of style attributes.

_get_attr(node, attr_name)

Gets an attribute of a node.

Parameters:

Name Type Description Default
node OpView

The node.

required
attr_name str

The name of the attribute.

required

Returns:

Type Description
Any

The attribute of the node.

Raises:

Type Description
ValueError

If the attribute is not found.

_set_attr(node, attr_name, attr)

Sets an attribute of a node.

Parameters:

Name Type Description Default
node OpView

The node.

required
attr_name str

The name of the attribute.

required
attr Any

The attribute of the node.

required

add_node(node, name, id=None, parent=None, children=None, **attr)

Adds a node to the design space.

Parameters:

Name Type Description Default
node OpView

The node to add.

required
name str

The name of the node.

required
id Optional[int]

The ID of the node.

None
parent Optional[OpView]

The parent of the node.

None
children Optional[List[OpView]]

The children of the node.

None
attr Dict[str, Any]

Additional attributes of the node.

{}

append_child(parent, child)

Appends a child to a node.

Parameters:

Name Type Description Default
parent OpView

The parent node.

required
child OpView

The child node.

required

get_children(node)

Gets the children of a node.

Parameters:

Name Type Description Default
node OpView

The node.

required

Returns:

Type Description
Optional[List[OpView]]

The children of the node.

get_id(node)

Gets the ID of a node.

Parameters:

Name Type Description Default
node OpView

The node.

required

Returns:

Type Description
int

The ID of the node.

get_name(node)

Gets the name of a node.

Parameters:

Name Type Description Default
node OpView

The node.

required

Returns:

Type Description
str

The name of the node.

get_parent(node)

Gets the parent of a node.

Parameters:

Name Type Description Default
node OpView

The node.

required

Returns:

Type Description
Optional[OpView]

The parent of the node.

get_subgraph(node)

Gets the children of a node as a subgraph.

Parameters:

Name Type Description Default
node OpView

The parent node.

required

Returns:

Type Description
MultiDiGraph

The children of the node as a subgraph.

print_dot(file_name, filter=lambda op: True)

Prints the design space as a DOT file.

Parameters:

Name Type Description Default
file_name str

The name of the DOT file.

required
filter Callable[[OpView], bool]

A filter function to select nodes to print.

lambda op: True

set_children(node, children)

Sets the children of a node.

Parameters:

Name Type Description Default
node OpView

The node.

required
children Optional[List[OpView]]

The children of the node.

required

set_id(node, id)

Sets the ID of a node.

Parameters:

Name Type Description Default
node OpView

The node.

required
id int

The ID of the node.

required

set_name(node, name)

Sets the name of a node.

Parameters:

Name Type Description Default
node OpView

The node.

required
name str

The name of the node.

required

set_parent(node, parent)

Sets the parent of a node.

Parameters:

Name Type Description Default
node OpView

The node.

required
parent Optional[OpView]

The parent of the node.

required

verify()

Verifies the design space.

Raises:

Type Description
ValueError

If the parent-child relationship is incorrect.

GraphPartitionDesignSpace(module=None, entry='forward')

Bases: BaseDesignSpace

Design space for graph partitioning.

This class provides a design space for graph partitioning. It is a directed graph where each node represents a task op.

Attributes:

Name Type Description
colors

The list of colors for dot visualization.

Parameters:

Name Type Description Default
module Optional[Module]

The MLIR module.

None
entry str

The name of the top function in the module.

'forward'

Raises:

Type Description
AssertionError

Non-task ops are found in the task graph.

solve_graph_partition(partition, num_dsp, num_uram, num_bram, size_lutram_in_bit, platform_num_bram)

Solves graph partitioning.

Parameters:

Name Type Description Default
partition int

The number of partitions.

required
num_dsp int

The number of DSPs.

required
num_uram int

The number of URAMs.

required
num_bram int

The number of BRAMs.

required
size_lutram_in_bit int

The size of LUTRAM in bits.

required
platform_num_bram int

The number of BRAMs on the platform.

required

Raises:

Type Description
Exception

No optimal solution found.

GraphPath(nodes, keys)

A path in a graph.

This class represents a path in a graph. It is a sequence of nodes and keys of the edges between the nodes.

Attributes:

Name Type Description
nodes List[OpView]

The nodes in the path.

internal_nodes_set set

The set of internal nodes in the path.

keys List[int]

The keys of the edges in the path.

Parameters:

Name Type Description Default
nodes List[OpView]

The nodes in the path.

required
keys List[int]

The keys of the edges in the path.

required

__getitem__(index)

Gets the edge at the specified index.

Parameters:

Name Type Description Default
index int

The index of the edge.

required

Returns:

Type Description
Tuple[OpView, OpView, int]

A tuple of the source node, target node, and key.

__iter__()

Iterates over the path.

Returns:

Type Description
Iterator[Tuple[OpView, OpView, int]]

An iterator of tuples of the source node, target node, and key.

__len__()

Gets the length of the path.

Returns:

Type Description
int

The length of the path.

__reversed__()

Iterates over the path in reverse.

Returns:

Type Description
Iterator[Tuple[OpView, OpView, int]]

An iterator of tuples of the target node, source node, and key in reverse order.

isdisjoint(other)

Checks if the path is disjoint with another path.

Parameters:

Name Type Description Default
other GraphPath

The other path.

required

Returns:

Type Description
bool

Whether the path is disjoint with the other path.

KernelFusionDesignSpace(module=None, entry='forward')

Bases: BaseDesignSpace

Design space for kernel fusion.

This class provides a design space for kernel fusion. It is a directed graph where each node represents a kernel op. The exploration results are held in the fused_set_list attribute of this class.

Attributes:

Name Type Description
fused_set_list List[set]

The list of sets of fused nodes.

Parameters:

Name Type Description Default
module Optional[Module]

The MLIR module.

None
entry str

The name of the top function in the module.

'forward'

Raises:

Type Description
ValueError

If the top function is not found.

ValueError

If the tensor type is not supported.

greedy_fuse_kernels(max_cost=4000)

Performs greedy kernel fusion.

Parameters:

Name Type Description Default
max_cost int

The maximum fusion cost.

4000

print_dot(file_name)

Prints the design space as a DOT file.

Parameters:

Name Type Description Default
file_name str

The name of the DOT file.

required

LinalgTilingDesignSpace(module=None, entry='forward', op_ii_map=None)

Bases: BaseDesignSpace

Design space for linalg tiling.

This class provides a design space for linalg tiling. It is a directed graph where each node represents a linalg op.

Attributes:

Name Type Description
op_ii_map Dict[str, int]

A map from operation names to initiation intervals.

Parameters:

Name Type Description Default
module Optional[Module]

The MLIR module.

None
entry str

The name of the top function in the module.

'forward'
op_ii_map Optional[Dict[str, int]]

A map from operation names to initiation intervals.

None

Raises:

Type Description
ValueError

If the top function is not found.

get_linalg_op_intensity_aware_unroll_sizes(node, overall_unroll_size, parallel_tile_sizes) staticmethod

Gets the unroll sizes for a linalg operation using an intensity-aware strategy.

Parameters:

Name Type Description Default
node GenericOp

The linalg operation.

required
overall_unroll_size int

The overall unroll size.

required
parallel_tile_sizes List[int]

The parallel tile sizes.

required

Returns:

Type Description
List[int]

The unroll sizes.

get_linalg_op_naive_permutation(node) staticmethod

Gets the permutation for a linalg operation using a naive strategy.

Parameters:

Name Type Description Default
node GenericOp

The linalg operation.

required

Returns:

Type Description
List[int]

The permutation.

get_linalg_op_naive_tile_sizes(node, default_tile_size=16) staticmethod

Gets the tile sizes for a linalg operation using a naive strategy.

Parameters:

Name Type Description Default
node GenericOp

The linalg operation.

required
default_tile_size int

The default tile size.

16

Returns:

Type Description
Tuple[List[int], List[int]]

A tuple of the parallel and reduction tile sizes.

get_linalg_op_naive_unroll_sizes(node, default_unroll_size=2) staticmethod

Gets the unroll sizes for a linalg operation using a naive strategy.

Parameters:

Name Type Description Default
node GenericOp

The linalg operation.

required
default_unroll_size int

The default unroll size.

2

Returns:

Type Description
List[int]

The unroll sizes.

get_linalg_op_naive_vec_sizes(node, unroll_sizes) staticmethod

Gets the vector sizes for a linalg operation using a naive strategy.

Parameters:

Name Type Description Default
node GenericOp

The linalg operation.

required
unroll_sizes List[int]

The unroll sizes.

required

Returns:

Type Description
Tuple[List[List[int]], List[List[int]]]

A tuple of the input and output vector sizes.

intensity_aware_exploration(default_tile_size=16, overall_unroll_size=16)

Performs intensity-aware exploration of the design space.

The following parameters will be explored
  • parallel_tile_sizes: The tile sizes for parallel loops.
  • reduction_tile_sizes: The tile sizes for reduction loops.
  • unroll_sizes: The unroll sizes for loops.
  • inputs_vec_sizes: The vector sizes for input tensors.
  • outputs_vec_sizes: The vector sizes for output tensors.
  • permutation: The permutation of loops.

Parameters:

Name Type Description Default
default_tile_size int

The default tile size for linalg tiling.

16
overall_unroll_size int

The overall unroll size for linalg tiling.

16

naive_exploration(default_tile_size=16, default_unroll_size=2)

Performs naive exploration of the design space.

The following parameters will be explored
  • parallel_tile_sizes: The tile sizes for parallel loops.
  • reduction_tile_sizes: The tile sizes for reduction loops.
  • unroll_sizes: The unroll sizes for loops.
  • inputs_vec_sizes: The vector sizes for input tensors.
  • outputs_vec_sizes: The vector sizes for output tensors.
  • permutation: The permutation of loops.

Parameters:

Name Type Description Default
default_tile_size int

The default tile size for linalg tiling.

16
default_unroll_size int

The default unroll size for linalg tiling.

2

print_dot(file_name)

Prints the design space as a DOT file.

Parameters:

Name Type Description Default
file_name str

The name of the DOT file.

required

StreamSizingDesignSpace(module=None, entry='forward', resolve_producer_consumer=False)

Bases: BaseDesignSpace

Design space for stream sizing.

This class provides a design space for stream sizing. It is a directed graph where each node represents a task op. To explore the design space, the resolve_producer_consumer attribute should be set to False, which means that the producer and consumer are the top-level tasks in the task graph instead of the actual leaf producer and consumer tasks.

Attributes:

Name Type Description
resolve_producer_consumer bool

Whether to resolve producer-consumer relationships.

Parameters:

Name Type Description Default
module Optional[Module]

The MLIR module.

None
entry str

The name of the top function in the module.

'forward'
resolve_producer_consumer bool

Whether to resolve producer-consumer relationships for printing DOT.

False

Raises:

Type Description
AssertionError

Non-task ops are found in the task graph.

apply_edge_stream_depths()

Applies edge stream depths to the design space.

infer_edge_stream_patterns()

Infers edge stream patterns for the design space.

The edge stream pattern is a tuple of (token, source_slope, target_slope, source_delay). The token is the number of tokens that are transferred in the stream channel. The source slope is producing rate of the stream producer. The target slope is consuming rate of the stream consumer. The source delay is the delay from the first input token to the first output token of the stream producer.

Raises:

Type Description
AssertionError

The producer-consumer relationship is resolved.

solve_edge_stream_depths(pipeline_rewinding=True, stream_size_map=None)

Solves edge stream depths for the design space.

The edge stream depth is the max number of tokens that can be stored in the stream channel. Essentially, this method first solve the delay of each edge through linear programming, and then calculates the depth of each edge based on the delay.

Parameters:

Name Type Description Default
pipeline_rewinding bool

Whether to enable pipeline rewinding.

True
stream_size_map Optional[Dict[Tuple[str, str], int]]

The overriding map from edge to stream size.

None

Raises:

Type Description
Exception

The solver did not find an optimal solution.