From c4b6f067d4869ee7299b148239c680b5fc0045cc Mon Sep 17 00:00:00 2001 From: Liam Semeria Date: Tue, 4 Aug 2026 11:26:35 +0200 Subject: [PATCH 1/3] scheduler: added fuse_consumer_at --- src/xtc/backends/jir/JIRScheduler.py | 7 +++++++ src/xtc/backends/mlir/MlirScheduler.py | 7 +++++++ src/xtc/backends/tvm/TVMScheduler.py | 7 +++++++ src/xtc/itf/schd/scheduler.py | 18 ++++++++++++++++++ 4 files changed, 39 insertions(+) diff --git a/src/xtc/backends/jir/JIRScheduler.py b/src/xtc/backends/jir/JIRScheduler.py index dde8312c5..bd97d258b 100644 --- a/src/xtc/backends/jir/JIRScheduler.py +++ b/src/xtc/backends/jir/JIRScheduler.py @@ -318,6 +318,13 @@ def fuse_producer_at( # TODO: not implemented for now pass + @override + def fuse_consumer_at( + self, axis: str, consumer_name: str, root: str = DEFAULT_ROOT + ) -> None: + # TODO: not implemented for now + pass + @override def define_memory_mesh(self, axes: dict[str, int]) -> None: # TODO: not implemented for now diff --git a/src/xtc/backends/mlir/MlirScheduler.py b/src/xtc/backends/mlir/MlirScheduler.py index c47a49535..e8cfd99e3 100644 --- a/src/xtc/backends/mlir/MlirScheduler.py +++ b/src/xtc/backends/mlir/MlirScheduler.py @@ -174,6 +174,13 @@ def fuse_producer_at( ) -> None: self._current_scheduler.fuse_producer_at(axis, input_idx, root=root) + @override + def fuse_consumer_at( + self, axis: str, consumer_name: str, root: str = DEFAULT_ROOT + ) -> None: + # TODO: not implemented for now + pass + @override def define_memory_mesh(self, axes: dict[str, int]) -> None: self._require_extension("sdist") diff --git a/src/xtc/backends/tvm/TVMScheduler.py b/src/xtc/backends/tvm/TVMScheduler.py index 165525708..233ec6bab 100644 --- a/src/xtc/backends/tvm/TVMScheduler.py +++ b/src/xtc/backends/tvm/TVMScheduler.py @@ -467,6 +467,13 @@ def fuse_producer_at( assert input_idx >= 0 and input_idx < len(self._op.np_inputs_spec()) self.fused.append((axis, input_idx)) + @override + def fuse_consumer_at( + self, axis: str, consumer_name: str, root: str = DEFAULT_ROOT + ) -> None: + # TODO: not implemented for now + pass + @override def define_memory_mesh(self, axes: dict[str, int]) -> None: # TODO: not implemented for now diff --git a/src/xtc/itf/schd/scheduler.py b/src/xtc/itf/schd/scheduler.py index 0f6c51d98..961f9fa70 100644 --- a/src/xtc/itf/schd/scheduler.py +++ b/src/xtc/itf/schd/scheduler.py @@ -232,6 +232,24 @@ def fuse_producer_at( """ ... + @abstractmethod + def fuse_consumer_at( + self, axis: str, consumer_name: str, root: str = DEFAULT_ROOT + ) -> None: + """Fuse consumer computation at the given producer location. + + Given the name of a direct consumer of the operation, + Fuse the computation at the given scheduled consumer axis. + The necessary output slices and computations will be inserted + for computing the output tile at the given axis location. + + Args: + axis: localisation of the fusion in the producer + consumer_name: the name of the consumer operation to be fused + root: the parent split (or the operator's absolute root) + """ + ... + @abstractmethod def define_memory_mesh(self, axes: dict[str, int]) -> None: """Define a memory mesh. From 48b8b9bbb10ac2a24d2db6a3927cfe9af05709e4 Mon Sep 17 00:00:00 2001 From: Liam Semeria Date: Tue, 4 Aug 2026 11:43:45 +0200 Subject: [PATCH 2/3] mlir-backend: implemented fuse_consumer_at --- src/xtc/backends/mlir/MlirCompilerPasses.py | 69 ++- src/xtc/backends/mlir/MlirNodeScheduler.py | 18 +- src/xtc/backends/mlir/MlirScheduler.py | 3 +- .../test_conv2d_relu_tensor_fused.py | 377 +++++++++++++ .../test_matmul_relu_mlir_tensor.py | 518 +++++++++--------- .../test_matmul_relu_mlir_tensor_fused.py | 243 ++++++++ tests/filecheck/search/test_conv_oo.py | 176 +++--- tests/filecheck/search/test_conv_pprprp.py | 10 +- tests/filecheck/search/test_conv_pprprpv.py | 10 +- tests/filecheck/search/test_conv_pprprpvr.py | 10 +- .../search/test_conv_pprprpvr_rnd.py | 2 +- tests/filecheck/search/test_conv_prp.py | 114 ++-- tests/filecheck/search/test_conv_prp_rnd.py | 2 +- tests/filecheck/search/test_matmul_goto.py | 220 ++++---- tests/filecheck/search/test_matmul_goto_r.py | 220 ++++---- tests/filecheck/search/test_matmul_oo.py | 110 ++-- tests/filecheck/search/test_matmul_p1.py | 220 ++++---- tests/filecheck/search/test_matmul_p1v.py | 72 +-- tests/filecheck/search/test_matmul_pprprp.py | 10 +- tests/filecheck/search/test_matmul_pprprpv.py | 10 +- .../filecheck/search/test_matmul_pprprpvr.py | 10 +- .../search/test_matmul_pprprpvr_rnd.py | 2 +- tests/filecheck/search/test_matmul_prp.py | 54 +- tests/filecheck/search/test_matmul_prp_rnd.py | 2 +- 24 files changed, 1574 insertions(+), 908 deletions(-) create mode 100644 tests/filecheck/backends/tensor_dialect/test_conv2d_relu_tensor_fused.py create mode 100644 tests/filecheck/backends/tensor_dialect/test_matmul_relu_mlir_tensor_fused.py diff --git a/src/xtc/backends/mlir/MlirCompilerPasses.py b/src/xtc/backends/mlir/MlirCompilerPasses.py index aef0bf600..1b2019bba 100644 --- a/src/xtc/backends/mlir/MlirCompilerPasses.py +++ b/src/xtc/backends/mlir/MlirCompilerPasses.py @@ -33,7 +33,8 @@ ) from mlir.passmanager import PassManager from mlir.ir import Module -import mlir.xtc_transform + +from mlir.xtc_transform import FuseConsumerOp # Import SDist if available try: @@ -231,12 +232,17 @@ def _generate_scheduling(self) -> OpResult: schedule=schedule, root=list(schedule.permutation)[0], handle=handle, - fuse_axes=fused_producers.get(schedule.node_ident), + producer_fuse_axes=fused_producers.get(schedule.node_ident), ) if schedule.vectorization or self._always_vectorize: self._post_vectorize(scheduling_state, schedule) handle = scheduling_state.handle + if schedule.fused_consumers: + self._fuse_consumers_into_loops( + schedule, scheduling_state, unscheduled_handles + ) + assert handle, "At least 1 operation should have been processed" return handle @@ -308,7 +314,7 @@ def _generate_node_scheduling( schedule: MlirNodeSchedule, root: str, handle: OpResult, - fuse_axes: dict[str, list[str]] | None, + producer_fuse_axes: dict[str, list[str]] | None, ) -> SchedulingState: sched_state = SchedulingState({}, handle, None) split_state = SplitState(schedule.splits, root) @@ -361,9 +367,9 @@ def _generate_node_scheduling( if loop_name in schedule.distribution: self._distribute_loop(loop_name, schedule, sched_state) # Fuse the producers - if fuse_axes and loop_name in fuse_axes: + if producer_fuse_axes and loop_name in producer_fuse_axes: self._fuse_producers_into_loop( - loop_name, fuse_axes, schedule, sched_state + loop_name, producer_fuse_axes, schedule, sched_state ) # For now on, the focus is on the outermost loop @@ -376,6 +382,37 @@ def _generate_node_scheduling( return sched_state + def _fuse_consumers_into_loops( + self, + schedule: MlirNodeSchedule, + sched_state: SchedulingState, + unscheduled_handles: set[str | None], + ): + assert self._named_sequence is not None + fuse_root = parent_name(schedule.fused_consumers[0][0]) + for fuse_axis, op_name in schedule.fused_consumers: + # derive handle of consumer + consumer_id = f"__xtc_id_{op_name}_" + unscheduled_handles.add(consumer_id) + # fuse consumer into all loops until the fuse_axis + fuse_loops = [] + for loop_dim in schedule.permutation[fuse_root]: + transform_result = sched_state.all_loops[loop_dim] + fuse_loops.append(transform_result) + if loop_dim == fuse_axis: + break + consumer_handle = structured_match( + results_=transform.AnyOpType.get(), + target=self._named_sequence.bodyTarget, + op_attrs={consumer_id: UnitAttr.get()}, + ) + op = FuseConsumerOp(consumer_handle, fuse_loops) + # re-annotate the loops that were touched by the fusion + for i, loop_dim in enumerate(schedule.permutation[fuse_root]): + transform.AnnotateOp(op.new_loops[i], loop_dim) + if loop_dim == fuse_axis: + break + def _fuse_producers_into_loop( self, loop_name: str, @@ -484,7 +521,10 @@ def _recursive_scheduling( self, schedule: MlirNodeSchedule, root: str, sched_state: SchedulingState ): inner_sched_state = self._generate_node_scheduling( - schedule=schedule, root=root, handle=sched_state.handle, fuse_axes=None + schedule=schedule, + root=root, + handle=sched_state.handle, + producer_fuse_axes=None, ) sched_state.all_loops.update(inner_sched_state.all_loops) sched_state.handle = inner_sched_state.handle @@ -645,18 +685,18 @@ def _pack_buffer( ) def _collect_fused_producers(self, unscheduled_handles: set[str | None]): - # maps each fused consumer op to the producer handles that must be + # maps each fused containing op to the producer handles that must be # fused through each loop dimension to reach their target fusion depth. - fused_producers = {} + fused_producer_handles = {} for schedule in self._nodes_schedules: - if schedule.fused: + if schedule.fused_producers: prods = find_producer_handles( self._mlir_program.mlir_module, schedule.node_ident ) - fuse_root = parent_name(schedule.fused[0][0]) + fuse_root = parent_name(schedule.fused_producers[0][0]) unscheduled_handles.update(set(prods)) - op_axes = {idx: ax for ax, idx in schedule.fused} + op_axes = {idx: ax for ax, idx in schedule.fused_producers} fuse_destinations = {} for idx, prod_handle in enumerate(prods): @@ -664,16 +704,16 @@ def _collect_fused_producers(self, unscheduled_handles: set[str | None]): continue if idx in op_axes: fuse_destinations[prod_handle] = op_axes[idx] - # get outer dims to fuse, assumes fuse no splitting avove loop dim + # get outer dims to fuse, assumes fuse no splitting above loop dim dim_fuse_handles: dict[str, list[str]] = {} for fuse_handle, fuse_dest in fuse_destinations.items(): for dim in schedule.permutation[fuse_root]: dim_fuse_handles.setdefault(dim, []).append(fuse_handle) if dim == fuse_dest: break - fused_producers[schedule.node_ident] = dim_fuse_handles + fused_producer_handles[schedule.node_ident] = dim_fuse_handles - return fused_producers + return fused_producer_handles def find_producer_handles(module: Module, root_handle: str) -> list[str | None]: @@ -751,7 +791,6 @@ def run(self, pass_names: list[str]) -> None: def apply_bufferization_passes(mlir_program: RawMlirProgram, mlir_install_dir: str): - assert mlir.xtc_transform bufferize_options = [ "bufferize-function-boundaries", "function-boundary-type-conversion=identity-layout-map", diff --git a/src/xtc/backends/mlir/MlirNodeScheduler.py b/src/xtc/backends/mlir/MlirNodeScheduler.py index 932038013..6c9c48577 100644 --- a/src/xtc/backends/mlir/MlirNodeScheduler.py +++ b/src/xtc/backends/mlir/MlirNodeScheduler.py @@ -31,7 +31,8 @@ class MlirNodeSchedule: processor_mesh: dict[str, int] distribution: dict[str, str] distributed_buffers: dict[str, dict] - fused: list[tuple[str, int]] + fused_producers: list[tuple[str, int]] + fused_consumers: list[tuple[str, str]] def index_of_dim(self, dim: str) -> int: return list(self.dims).index(dim) @@ -92,13 +93,14 @@ def __init__( self.processor_mesh: dict[str, int] = {} self.distribution: dict[str, str] = {} self.distributed_buffers: dict[str, dict] = {} - self.fused: list[tuple[str, int]] = [] + self.fused_producers: list[tuple[str, int]] = [] + self.fused_consumers: list[tuple[str, str]] = [] def mlir_node_schedule(self) -> MlirNodeSchedule: if not self.permutation: self.permutation[DEFAULT_ROOT] = self.get_default_interchange(DEFAULT_ROOT) - for fuse_axis in self.fused: + for fuse_axis in self.fused_producers: assert fuse_axis[0] in self.permutation[next(iter(self.permutation))], ( "Fusion must be to an axis in the base root not the result of a split." ) @@ -119,7 +121,8 @@ def mlir_node_schedule(self) -> MlirNodeSchedule: processor_mesh=self.processor_mesh, distribution=self.distribution, distributed_buffers=self.distributed_buffers, - fused=self.fused, + fused_producers=self.fused_producers, + fused_consumers=self.fused_consumers, ) @override @@ -229,4 +232,9 @@ def distributed_buffer_at( def fuse_producer_at( self, axis: str, input_idx: int, root: str = DEFAULT_ROOT ) -> None: - self.fused.append((make_loop_name(root, axis), input_idx)) + self.fused_producers.append((make_loop_name(root, axis), input_idx)) + + def fuse_consumer_at( + self, axis: str, consumer_name: str, root: str = DEFAULT_ROOT + ) -> None: + self.fused_consumers.append((make_loop_name(root, axis), consumer_name)) diff --git a/src/xtc/backends/mlir/MlirScheduler.py b/src/xtc/backends/mlir/MlirScheduler.py index e8cfd99e3..4a6c3c619 100644 --- a/src/xtc/backends/mlir/MlirScheduler.py +++ b/src/xtc/backends/mlir/MlirScheduler.py @@ -178,8 +178,7 @@ def fuse_producer_at( def fuse_consumer_at( self, axis: str, consumer_name: str, root: str = DEFAULT_ROOT ) -> None: - # TODO: not implemented for now - pass + self._current_scheduler.fuse_consumer_at(axis, consumer_name, root=root) @override def define_memory_mesh(self, axes: dict[str, int]) -> None: diff --git a/tests/filecheck/backends/tensor_dialect/test_conv2d_relu_tensor_fused.py b/tests/filecheck/backends/tensor_dialect/test_conv2d_relu_tensor_fused.py new file mode 100644 index 000000000..99bb973c6 --- /dev/null +++ b/tests/filecheck/backends/tensor_dialect/test_conv2d_relu_tensor_fused.py @@ -0,0 +1,377 @@ +# RUN: python %s 2>&1 | filecheck %s +# UNSUPPORTED: mlir-target=nvgpu + +import xtc.graphs.xtc.op as O +from xtc.backends.mlir import Backend + +N, H, W, F, R, S, C, SH, SW, dtype = 1, 8, 8, 16, 3, 3, 3, 1, 1, "float32" +a = O.tensor((N, H + R - 1, W + S - 1, C), dtype, name="I") +b = O.tensor((R, S, C, F), dtype, name="W") + +with O.graph(name="conv2d_nhwc_mini") as gb: + c = O.conv2d(a, b, stride=(SH, SW), name="O") + O.relu(c, name="relu") + +graph = gb.graph +print(graph) + +impl = Backend(graph, use_tensor_dialect=True) + +sch = impl.get_scheduler(default_node="O") +sch.fuse_consumer_at("f","relu") +sched = sch.schedule() + +comp = impl.get_compiler( + shared_lib=True, + dump_file="conv2d_relu_mlir_tensor", + print_source_ir=True, + print_transformed_ir=True, + print_bufferization_ir=True, +) +module = comp.compile(sched) +executor = module.get_executor(validate=True) +res = executor.execute() +print(f"CODE: {res}") + +# CHECK: // -----// IR Dump Before transform //----- // +# CHECK-NEXT: #map = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d0, d1 + d4, d2 + d5, d6)> +# CHECK-NEXT: #map1 = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d4, d5, d6, d3)> +# CHECK-NEXT: #map2 = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d0, d1, d2, d3)> +# CHECK-NEXT: #map3 = affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)> +# CHECK-NEXT: #map4 = affine_map<(d0, d1, d2, d3) -> ()> +# CHECK-NEXT: module attributes {transform.with_named_sequence} { +# CHECK-NEXT: func.func @conv2d_nhwc_mini(%arg0: tensor<1x10x10x3xf32> {llvm.noalias}, %arg1: tensor<3x3x3x16xf32> {llvm.noalias}, %arg2: memref<1x8x8x16xf32> {llvm.noalias}) { +# CHECK-NEXT: %0 = tensor.empty() : tensor<1x8x8x16xf32> +# CHECK-NEXT: %cst = arith.constant 0.000000e+00 : f32 +# CHECK-NEXT: %1 = linalg.fill {__xtc_id_O_0_} ins(%cst : f32) outs(%0 : tensor<1x8x8x16xf32>) -> tensor<1x8x8x16xf32> +# CHECK-NEXT: %2 = linalg.generic {indexing_maps = [#map, #map1, #map2], iterator_types = ["parallel", "parallel", "parallel", "parallel", "reduction", "reduction", "reduction"]} ins(%arg0, %arg1 : tensor<1x10x10x3xf32>, tensor<3x3x3x16xf32>) outs(%1 : tensor<1x8x8x16xf32>) attrs = {__xtc_id_O_} { +# CHECK-NEXT: ^bb0(%in: f32, %in_1: f32, %out: f32): +# CHECK-NEXT: %5 = arith.mulf %in, %in_1 fastmath : f32 +# CHECK-NEXT: %6 = arith.addf %out, %5 fastmath : f32 +# CHECK-NEXT: linalg.yield %6 : f32 +# CHECK-NEXT: } -> tensor<1x8x8x16xf32> +# CHECK-NEXT: %3 = tensor.empty() : tensor<1x8x8x16xf32> +# CHECK-NEXT: %cst_0 = arith.constant 0.000000e+00 : f32 +# CHECK-NEXT: %4 = linalg.generic {indexing_maps = [#map3, #map4, #map3], iterator_types = ["parallel", "parallel", "parallel", "parallel"]} ins(%2, %cst_0 : tensor<1x8x8x16xf32>, f32) outs(%3 : tensor<1x8x8x16xf32>) attrs = {__xtc_id_relu_} { +# CHECK-NEXT: ^bb0(%in: f32, %in_1: f32, %out: f32): +# CHECK-NEXT: %5 = arith.maximumf %in, %in_1 : f32 +# CHECK-NEXT: linalg.yield %5 : f32 +# CHECK-NEXT: } -> tensor<1x8x8x16xf32> +# CHECK-NEXT: bufferization.materialize_in_destination %4 in restrict writable %arg2 : (tensor<1x8x8x16xf32>, memref<1x8x8x16xf32>) -> () +# CHECK-NEXT: return +# CHECK-NEXT: } +# CHECK-NEXT: transform.named_sequence @_vecto(%arg0: !transform.any_op {transform.consumed}) { +# CHECK-NEXT: transform.structured.vectorize %arg0 : !transform.any_op +# CHECK-NEXT: transform.yield +# CHECK-NEXT: } +# CHECK-NEXT: transform.named_sequence @_post_bufferize(%arg0: !transform.any_op {transform.readonly}) { +# CHECK-NEXT: transform.yield +# CHECK-NEXT: } +# CHECK-NEXT: transform.named_sequence @__transform_main(%arg0: !transform.any_op {transform.readonly}) { +# CHECK-NEXT: %0 = transform.structured.match attributes {__xtc_id_O_0_} in %arg0 : (!transform.any_op) -> !transform.any_op +# CHECK-NEXT: %tiled_linalg_op, %loops = transform.structured.tile_using_for %0 tile_sizes [1, 0, 0, 0] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %loops "./b" : !transform.any_op +# CHECK-NEXT: %tiled_linalg_op_0, %loops_1 = transform.structured.tile_using_for %tiled_linalg_op tile_sizes [0, 1, 0, 0] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %loops_1 "./h" : !transform.any_op +# CHECK-NEXT: %tiled_linalg_op_2, %loops_3 = transform.structured.tile_using_for %tiled_linalg_op_0 tile_sizes [0, 0, 1, 0] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %loops_3 "./w" : !transform.any_op +# CHECK-NEXT: %tiled_linalg_op_4, %loops_5 = transform.structured.tile_using_for %tiled_linalg_op_2 tile_sizes [0, 0, 0, 1] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %loops_5 "./f" : !transform.any_op +# CHECK-NEXT: %1 = transform.structured.match attributes {__xtc_id_O_} in %arg0 : (!transform.any_op) -> !transform.any_op +# CHECK-NEXT: %tiled_linalg_op_6, %loops_7 = transform.structured.tile_using_for %1 tile_sizes [1, 0, 0, 0, 0, 0, 0] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %loops_7 "./b" : !transform.any_op +# CHECK-NEXT: %tiled_linalg_op_8, %loops_9 = transform.structured.tile_using_for %tiled_linalg_op_6 tile_sizes [0, 1, 0, 0, 0, 0, 0] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %loops_9 "./h" : !transform.any_op +# CHECK-NEXT: %tiled_linalg_op_10, %loops_11 = transform.structured.tile_using_for %tiled_linalg_op_8 tile_sizes [0, 0, 1, 0, 0, 0, 0] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %loops_11 "./w" : !transform.any_op +# CHECK-NEXT: %tiled_linalg_op_12, %loops_13 = transform.structured.tile_using_for %tiled_linalg_op_10 tile_sizes [0, 0, 0, 1, 0, 0, 0] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %loops_13 "./f" : !transform.any_op +# CHECK-NEXT: %tiled_linalg_op_14, %loops_15 = transform.structured.tile_using_for %tiled_linalg_op_12 tile_sizes [0, 0, 0, 0, 1, 0, 0] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %loops_15 "./r" : !transform.any_op +# CHECK-NEXT: %tiled_linalg_op_16, %loops_17 = transform.structured.tile_using_for %tiled_linalg_op_14 tile_sizes [0, 0, 0, 0, 0, 1, 0] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %loops_17 "./s" : !transform.any_op +# CHECK-NEXT: %tiled_linalg_op_18, %loops_19 = transform.structured.tile_using_for %tiled_linalg_op_16 tile_sizes [0, 0, 0, 0, 0, 0, 1] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %loops_19 "./c" : !transform.any_op +# CHECK-NEXT: %2 = transform.structured.match attributes {__xtc_id_relu_} in %arg0 : (!transform.any_op) -> !transform.any_op +# CHECK-NEXT: %tiled_consumer, %new_loops:4 = transform.xtc.fuse_consumer %2 into %loops_7, %loops_9, %loops_11, %loops_13 : (!transform.any_op, !transform.any_op, !transform.any_op, !transform.any_op, !transform.any_op) -> (!transform.any_op, !transform.any_op, !transform.any_op, !transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %new_loops#0 "./b" : !transform.any_op +# CHECK-NEXT: transform.annotate %new_loops#1 "./h" : !transform.any_op +# CHECK-NEXT: transform.annotate %new_loops#2 "./w" : !transform.any_op +# CHECK-NEXT: transform.annotate %new_loops#3 "./f" : !transform.any_op +# CHECK-NEXT: transform.yield +# CHECK-NEXT: } +# CHECK-NEXT: } +# CHECK-NEXT: +# CHECK-NEXT: // -----// IR Dump After transform //----- // +# CHECK-NEXT: #map = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d0, d1 + d4, d2 + d5, d6)> +# CHECK-NEXT: #map1 = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d4, d5, d6, d3)> +# CHECK-NEXT: #map2 = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d0, d1, d2, d3)> +# CHECK-NEXT: #map3 = affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)> +# CHECK-NEXT: #map4 = affine_map<(d0, d1, d2, d3) -> ()> +# CHECK-NEXT: module attributes {transform.with_named_sequence} { +# CHECK-NEXT: func.func @conv2d_nhwc_mini(%arg0: tensor<1x10x10x3xf32> {llvm.noalias}, %arg1: tensor<3x3x3x16xf32> {llvm.noalias}, %arg2: memref<1x8x8x16xf32> {llvm.noalias}) { +# CHECK-NEXT: %0 = tensor.empty() : tensor<1x8x8x16xf32> +# CHECK-NEXT: %cst = arith.constant 0.000000e+00 : f32 +# CHECK-NEXT: %c0 = arith.constant 0 : index +# CHECK-NEXT: %c1 = arith.constant 1 : index +# CHECK-NEXT: %c1_0 = arith.constant 1 : index +# CHECK-NEXT: %1 = scf.for %arg3 = %c0 to %c1 step %c1_0 iter_args(%arg4 = %0) -> (tensor<1x8x8x16xf32>) { +# CHECK-NEXT: %extracted_slice = tensor.extract_slice %arg4[%arg3, 0, 0, 0] [1, 8, 8, 16] [1, 1, 1, 1] : tensor<1x8x8x16xf32> to tensor<1x8x8x16xf32> +# CHECK-NEXT: %c0_5 = arith.constant 0 : index +# CHECK-NEXT: %c8 = arith.constant 8 : index +# CHECK-NEXT: %c1_6 = arith.constant 1 : index +# CHECK-NEXT: %5 = scf.for %arg5 = %c0_5 to %c8 step %c1_6 iter_args(%arg6 = %extracted_slice) -> (tensor<1x8x8x16xf32>) { +# CHECK-NEXT: %extracted_slice_7 = tensor.extract_slice %arg6[0, %arg5, 0, 0] [1, 1, 8, 16] [1, 1, 1, 1] : tensor<1x8x8x16xf32> to tensor<1x1x8x16xf32> +# CHECK-NEXT: %c0_8 = arith.constant 0 : index +# CHECK-NEXT: %c8_9 = arith.constant 8 : index +# CHECK-NEXT: %c1_10 = arith.constant 1 : index +# CHECK-NEXT: %6 = scf.for %arg7 = %c0_8 to %c8_9 step %c1_10 iter_args(%arg8 = %extracted_slice_7) -> (tensor<1x1x8x16xf32>) { +# CHECK-NEXT: %extracted_slice_12 = tensor.extract_slice %arg8[0, 0, %arg7, 0] [1, 1, 1, 16] [1, 1, 1, 1] : tensor<1x1x8x16xf32> to tensor<1x1x1x16xf32> +# CHECK-NEXT: %c0_13 = arith.constant 0 : index +# CHECK-NEXT: %c16 = arith.constant 16 : index +# CHECK-NEXT: %c1_14 = arith.constant 1 : index +# CHECK-NEXT: %7 = scf.for %arg9 = %c0_13 to %c16 step %c1_14 iter_args(%arg10 = %extracted_slice_12) -> (tensor<1x1x1x16xf32>) { +# CHECK-NEXT: %extracted_slice_16 = tensor.extract_slice %arg10[0, 0, 0, %arg9] [1, 1, 1, 1] [1, 1, 1, 1] : tensor<1x1x1x16xf32> to tensor<1x1x1x1xf32> +# CHECK-NEXT: %8 = linalg.fill {__xtc_id_O_0_} ins(%cst : f32) outs(%extracted_slice_16 : tensor<1x1x1x1xf32>) -> tensor<1x1x1x1xf32> +# CHECK-NEXT: %inserted_slice_17 = tensor.insert_slice %8 into %arg10[0, 0, 0, %arg9] [1, 1, 1, 1] [1, 1, 1, 1] : tensor<1x1x1x1xf32> into tensor<1x1x1x16xf32> +# CHECK-NEXT: scf.yield %inserted_slice_17 : tensor<1x1x1x16xf32> +# CHECK-NEXT: } {"./f"} +# CHECK-NEXT: %inserted_slice_15 = tensor.insert_slice %7 into %arg8[0, 0, %arg7, 0] [1, 1, 1, 16] [1, 1, 1, 1] : tensor<1x1x1x16xf32> into tensor<1x1x8x16xf32> +# CHECK-NEXT: scf.yield %inserted_slice_15 : tensor<1x1x8x16xf32> +# CHECK-NEXT: } {"./w"} +# CHECK-NEXT: %inserted_slice_11 = tensor.insert_slice %6 into %arg6[0, %arg5, 0, 0] [1, 1, 8, 16] [1, 1, 1, 1] : tensor<1x1x8x16xf32> into tensor<1x8x8x16xf32> +# CHECK-NEXT: scf.yield %inserted_slice_11 : tensor<1x8x8x16xf32> +# CHECK-NEXT: } {"./h"} +# CHECK-NEXT: %inserted_slice = tensor.insert_slice %5 into %arg4[%arg3, 0, 0, 0] [1, 8, 8, 16] [1, 1, 1, 1] : tensor<1x8x8x16xf32> into tensor<1x8x8x16xf32> +# CHECK-NEXT: scf.yield %inserted_slice : tensor<1x8x8x16xf32> +# CHECK-NEXT: } {"./b"} +# CHECK-NEXT: %c0_1 = arith.constant 0 : index +# CHECK-NEXT: %c1_2 = arith.constant 1 : index +# CHECK-NEXT: %c1_3 = arith.constant 1 : index +# CHECK-NEXT: %2 = tensor.empty() : tensor<1x8x8x16xf32> +# CHECK-NEXT: %cst_4 = arith.constant 0.000000e+00 : f32 +# CHECK-NEXT: %3:2 = scf.for %arg3 = %c0_1 to %c1_2 step %c1_3 iter_args(%arg4 = %1, %arg5 = %2) -> (tensor<1x8x8x16xf32>, tensor<1x8x8x16xf32>) { +# CHECK-NEXT: %extracted_slice = tensor.extract_slice %arg0[%arg3, 0, 0, 0] [1, 10, 10, 3] [1, 1, 1, 1] : tensor<1x10x10x3xf32> to tensor<1x10x10x3xf32> +# CHECK-NEXT: %extracted_slice_5 = tensor.extract_slice %arg1[0, 0, 0, 0] [3, 3, 3, 16] [1, 1, 1, 1] : tensor<3x3x3x16xf32> to tensor<3x3x3x16xf32> +# CHECK-NEXT: %extracted_slice_6 = tensor.extract_slice %arg4[%arg3, 0, 0, 0] [1, 8, 8, 16] [1, 1, 1, 1] : tensor<1x8x8x16xf32> to tensor<1x8x8x16xf32> +# CHECK-NEXT: %c0_7 = arith.constant 0 : index +# CHECK-NEXT: %c8 = arith.constant 8 : index +# CHECK-NEXT: %c1_8 = arith.constant 1 : index +# CHECK-NEXT: %extracted_slice_9 = tensor.extract_slice %arg5[%arg3, 0, 0, 0] [1, 8, 8, 16] [1, 1, 1, 1] : tensor<1x8x8x16xf32> to tensor<1x8x8x16xf32> +# CHECK-NEXT: %5:2 = scf.for %arg6 = %c0_7 to %c8 step %c1_8 iter_args(%arg7 = %extracted_slice_6, %arg8 = %extracted_slice_9) -> (tensor<1x8x8x16xf32>, tensor<1x8x8x16xf32>) { +# CHECK-NEXT: %extracted_slice_11 = tensor.extract_slice %extracted_slice[0, %arg6, 0, 0] [1, 3, 10, 3] [1, 1, 1, 1] : tensor<1x10x10x3xf32> to tensor<1x3x10x3xf32> +# CHECK-NEXT: %extracted_slice_12 = tensor.extract_slice %extracted_slice_5[0, 0, 0, 0] [3, 3, 3, 16] [1, 1, 1, 1] : tensor<3x3x3x16xf32> to tensor<3x3x3x16xf32> +# CHECK-NEXT: %extracted_slice_13 = tensor.extract_slice %arg7[0, %arg6, 0, 0] [1, 1, 8, 16] [1, 1, 1, 1] : tensor<1x8x8x16xf32> to tensor<1x1x8x16xf32> +# CHECK-NEXT: %c0_14 = arith.constant 0 : index +# CHECK-NEXT: %c8_15 = arith.constant 8 : index +# CHECK-NEXT: %c1_16 = arith.constant 1 : index +# CHECK-NEXT: %extracted_slice_17 = tensor.extract_slice %arg8[0, %arg6, 0, 0] [1, 1, 8, 16] [1, 1, 1, 1] : tensor<1x8x8x16xf32> to tensor<1x1x8x16xf32> +# CHECK-NEXT: %7:2 = scf.for %arg9 = %c0_14 to %c8_15 step %c1_16 iter_args(%arg10 = %extracted_slice_13, %arg11 = %extracted_slice_17) -> (tensor<1x1x8x16xf32>, tensor<1x1x8x16xf32>) { +# CHECK-NEXT: %extracted_slice_20 = tensor.extract_slice %extracted_slice_11[0, 0, %arg9, 0] [1, 3, 3, 3] [1, 1, 1, 1] : tensor<1x3x10x3xf32> to tensor<1x3x3x3xf32> +# CHECK-NEXT: %extracted_slice_21 = tensor.extract_slice %extracted_slice_12[0, 0, 0, 0] [3, 3, 3, 16] [1, 1, 1, 1] : tensor<3x3x3x16xf32> to tensor<3x3x3x16xf32> +# CHECK-NEXT: %extracted_slice_22 = tensor.extract_slice %arg10[0, 0, %arg9, 0] [1, 1, 1, 16] [1, 1, 1, 1] : tensor<1x1x8x16xf32> to tensor<1x1x1x16xf32> +# CHECK-NEXT: %c0_23 = arith.constant 0 : index +# CHECK-NEXT: %c16 = arith.constant 16 : index +# CHECK-NEXT: %c1_24 = arith.constant 1 : index +# CHECK-NEXT: %extracted_slice_25 = tensor.extract_slice %arg11[0, 0, %arg9, 0] [1, 1, 1, 16] [1, 1, 1, 1] : tensor<1x1x8x16xf32> to tensor<1x1x1x16xf32> +# CHECK-NEXT: %9:2 = scf.for %arg12 = %c0_23 to %c16 step %c1_24 iter_args(%arg13 = %extracted_slice_22, %arg14 = %extracted_slice_25) -> (tensor<1x1x1x16xf32>, tensor<1x1x1x16xf32>) { +# CHECK-NEXT: %extracted_slice_28 = tensor.extract_slice %extracted_slice_20[0, 0, 0, 0] [1, 3, 3, 3] [1, 1, 1, 1] : tensor<1x3x3x3xf32> to tensor<1x3x3x3xf32> +# CHECK-NEXT: %extracted_slice_29 = tensor.extract_slice %extracted_slice_21[0, 0, 0, %arg12] [3, 3, 3, 1] [1, 1, 1, 1] : tensor<3x3x3x16xf32> to tensor<3x3x3x1xf32> +# CHECK-NEXT: %extracted_slice_30 = tensor.extract_slice %arg13[0, 0, 0, %arg12] [1, 1, 1, 1] [1, 1, 1, 1] : tensor<1x1x1x16xf32> to tensor<1x1x1x1xf32> +# CHECK-NEXT: %c0_31 = arith.constant 0 : index +# CHECK-NEXT: %c3 = arith.constant 3 : index +# CHECK-NEXT: %c1_32 = arith.constant 1 : index +# CHECK-NEXT: %11 = scf.for %arg15 = %c0_31 to %c3 step %c1_32 iter_args(%arg16 = %extracted_slice_30) -> (tensor<1x1x1x1xf32>) { +# CHECK-NEXT: %extracted_slice_36 = tensor.extract_slice %extracted_slice_28[0, %arg15, 0, 0] [1, 1, 3, 3] [1, 1, 1, 1] : tensor<1x3x3x3xf32> to tensor<1x1x3x3xf32> +# CHECK-NEXT: %extracted_slice_37 = tensor.extract_slice %extracted_slice_29[%arg15, 0, 0, 0] [1, 3, 3, 1] [1, 1, 1, 1] : tensor<3x3x3x1xf32> to tensor<1x3x3x1xf32> +# CHECK-NEXT: %extracted_slice_38 = tensor.extract_slice %arg16[0, 0, 0, 0] [1, 1, 1, 1] [1, 1, 1, 1] : tensor<1x1x1x1xf32> to tensor<1x1x1x1xf32> +# CHECK-NEXT: %c0_39 = arith.constant 0 : index +# CHECK-NEXT: %c3_40 = arith.constant 3 : index +# CHECK-NEXT: %c1_41 = arith.constant 1 : index +# CHECK-NEXT: %13 = scf.for %arg17 = %c0_39 to %c3_40 step %c1_41 iter_args(%arg18 = %extracted_slice_38) -> (tensor<1x1x1x1xf32>) { +# CHECK-NEXT: %extracted_slice_43 = tensor.extract_slice %extracted_slice_36[0, 0, %arg17, 0] [1, 1, 1, 3] [1, 1, 1, 1] : tensor<1x1x3x3xf32> to tensor<1x1x1x3xf32> +# CHECK-NEXT: %extracted_slice_44 = tensor.extract_slice %extracted_slice_37[0, %arg17, 0, 0] [1, 1, 3, 1] [1, 1, 1, 1] : tensor<1x3x3x1xf32> to tensor<1x1x3x1xf32> +# CHECK-NEXT: %extracted_slice_45 = tensor.extract_slice %arg18[0, 0, 0, 0] [1, 1, 1, 1] [1, 1, 1, 1] : tensor<1x1x1x1xf32> to tensor<1x1x1x1xf32> +# CHECK-NEXT: %c0_46 = arith.constant 0 : index +# CHECK-NEXT: %c3_47 = arith.constant 3 : index +# CHECK-NEXT: %c1_48 = arith.constant 1 : index +# CHECK-NEXT: %14 = scf.for %arg19 = %c0_46 to %c3_47 step %c1_48 iter_args(%arg20 = %extracted_slice_45) -> (tensor<1x1x1x1xf32>) { +# CHECK-NEXT: %extracted_slice_50 = tensor.extract_slice %extracted_slice_43[0, 0, 0, %arg19] [1, 1, 1, 1] [1, 1, 1, 1] : tensor<1x1x1x3xf32> to tensor<1x1x1x1xf32> +# CHECK-NEXT: %extracted_slice_51 = tensor.extract_slice %extracted_slice_44[0, 0, %arg19, 0] [1, 1, 1, 1] [1, 1, 1, 1] : tensor<1x1x3x1xf32> to tensor<1x1x1x1xf32> +# CHECK-NEXT: %extracted_slice_52 = tensor.extract_slice %arg20[0, 0, 0, 0] [1, 1, 1, 1] [1, 1, 1, 1] : tensor<1x1x1x1xf32> to tensor<1x1x1x1xf32> +# CHECK-NEXT: %15 = linalg.generic {indexing_maps = [#map, #map1, #map2], iterator_types = ["parallel", "parallel", "parallel", "parallel", "reduction", "reduction", "reduction"]} ins(%extracted_slice_50, %extracted_slice_51 : tensor<1x1x1x1xf32>, tensor<1x1x1x1xf32>) outs(%extracted_slice_52 : tensor<1x1x1x1xf32>) attrs = {__xtc_id_O_} { +# CHECK-NEXT: ^bb0(%in: f32, %in_54: f32, %out: f32): +# CHECK-NEXT: %16 = arith.mulf %in, %in_54 fastmath : f32 +# CHECK-NEXT: %17 = arith.addf %out, %16 fastmath : f32 +# CHECK-NEXT: linalg.yield %17 : f32 +# CHECK-NEXT: } -> tensor<1x1x1x1xf32> +# CHECK-NEXT: %inserted_slice_53 = tensor.insert_slice %15 into %arg20[0, 0, 0, 0] [1, 1, 1, 1] [1, 1, 1, 1] : tensor<1x1x1x1xf32> into tensor<1x1x1x1xf32> +# CHECK-NEXT: scf.yield %inserted_slice_53 : tensor<1x1x1x1xf32> +# CHECK-NEXT: } {"./c"} +# CHECK-NEXT: %inserted_slice_49 = tensor.insert_slice %14 into %arg18[0, 0, 0, 0] [1, 1, 1, 1] [1, 1, 1, 1] : tensor<1x1x1x1xf32> into tensor<1x1x1x1xf32> +# CHECK-NEXT: scf.yield %inserted_slice_49 : tensor<1x1x1x1xf32> +# CHECK-NEXT: } {"./s"} +# CHECK-NEXT: %inserted_slice_42 = tensor.insert_slice %13 into %arg16[0, 0, 0, 0] [1, 1, 1, 1] [1, 1, 1, 1] : tensor<1x1x1x1xf32> into tensor<1x1x1x1xf32> +# CHECK-NEXT: scf.yield %inserted_slice_42 : tensor<1x1x1x1xf32> +# CHECK-NEXT: } {"./r"} +# CHECK-NEXT: %extracted_slice_33 = tensor.extract_slice %arg14[0, 0, 0, %arg12] [1, 1, 1, 1] [1, 1, 1, 1] : tensor<1x1x1x16xf32> to tensor<1x1x1x1xf32> +# CHECK-NEXT: %12 = linalg.generic {indexing_maps = [#map3, #map4, #map3], iterator_types = ["parallel", "parallel", "parallel", "parallel"]} ins(%11, %cst_4 : tensor<1x1x1x1xf32>, f32) outs(%extracted_slice_33 : tensor<1x1x1x1xf32>) attrs = {__xtc_id_relu_} { +# CHECK-NEXT: ^bb0(%in: f32, %in_36: f32, %out: f32): +# CHECK-NEXT: %13 = arith.maximumf %in, %in_36 : f32 +# CHECK-NEXT: linalg.yield %13 : f32 +# CHECK-NEXT: } -> tensor<1x1x1x1xf32> +# CHECK-NEXT: %inserted_slice_34 = tensor.insert_slice %11 into %arg13[0, 0, 0, %arg12] [1, 1, 1, 1] [1, 1, 1, 1] : tensor<1x1x1x1xf32> into tensor<1x1x1x16xf32> +# CHECK-NEXT: %inserted_slice_35 = tensor.insert_slice %12 into %arg14[0, 0, 0, %arg12] [1, 1, 1, 1] [1, 1, 1, 1] : tensor<1x1x1x1xf32> into tensor<1x1x1x16xf32> +# CHECK-NEXT: scf.yield %inserted_slice_34, %inserted_slice_35 : tensor<1x1x1x16xf32>, tensor<1x1x1x16xf32> +# CHECK-NEXT: } {"./f"} +# CHECK-NEXT: %10 = linalg.generic {indexing_maps = [#map3, #map4, #map3], iterator_types = ["parallel", "parallel", "parallel", "parallel"]} ins(%9#0, %cst_4 : tensor<1x1x1x16xf32>, f32) outs(%extracted_slice_25 : tensor<1x1x1x16xf32>) attrs = {__xtc_id_relu_} { +# CHECK-NEXT: ^bb0(%in: f32, %in_28: f32, %out: f32): +# CHECK-NEXT: %11 = arith.maximumf %in, %in_28 : f32 +# CHECK-NEXT: linalg.yield %11 : f32 +# CHECK-NEXT: } -> tensor<1x1x1x16xf32> +# CHECK-NEXT: %inserted_slice_26 = tensor.insert_slice %9#0 into %arg10[0, 0, %arg9, 0] [1, 1, 1, 16] [1, 1, 1, 1] : tensor<1x1x1x16xf32> into tensor<1x1x8x16xf32> +# CHECK-NEXT: %inserted_slice_27 = tensor.insert_slice %9#1 into %arg11[0, 0, %arg9, 0] [1, 1, 1, 16] [1, 1, 1, 1] : tensor<1x1x1x16xf32> into tensor<1x1x8x16xf32> +# CHECK-NEXT: scf.yield %inserted_slice_26, %inserted_slice_27 : tensor<1x1x8x16xf32>, tensor<1x1x8x16xf32> +# CHECK-NEXT: } {"./w"} +# CHECK-NEXT: %8 = linalg.generic {indexing_maps = [#map3, #map4, #map3], iterator_types = ["parallel", "parallel", "parallel", "parallel"]} ins(%7#0, %cst_4 : tensor<1x1x8x16xf32>, f32) outs(%extracted_slice_17 : tensor<1x1x8x16xf32>) attrs = {__xtc_id_relu_} { +# CHECK-NEXT: ^bb0(%in: f32, %in_20: f32, %out: f32): +# CHECK-NEXT: %9 = arith.maximumf %in, %in_20 : f32 +# CHECK-NEXT: linalg.yield %9 : f32 +# CHECK-NEXT: } -> tensor<1x1x8x16xf32> +# CHECK-NEXT: %inserted_slice_18 = tensor.insert_slice %7#0 into %arg7[0, %arg6, 0, 0] [1, 1, 8, 16] [1, 1, 1, 1] : tensor<1x1x8x16xf32> into tensor<1x8x8x16xf32> +# CHECK-NEXT: %inserted_slice_19 = tensor.insert_slice %7#1 into %arg8[0, %arg6, 0, 0] [1, 1, 8, 16] [1, 1, 1, 1] : tensor<1x1x8x16xf32> into tensor<1x8x8x16xf32> +# CHECK-NEXT: scf.yield %inserted_slice_18, %inserted_slice_19 : tensor<1x8x8x16xf32>, tensor<1x8x8x16xf32> +# CHECK-NEXT: } {"./h"} +# CHECK-NEXT: %6 = linalg.generic {indexing_maps = [#map3, #map4, #map3], iterator_types = ["parallel", "parallel", "parallel", "parallel"]} ins(%5#0, %cst_4 : tensor<1x8x8x16xf32>, f32) outs(%extracted_slice_9 : tensor<1x8x8x16xf32>) attrs = {__xtc_id_relu_} { +# CHECK-NEXT: ^bb0(%in: f32, %in_11: f32, %out: f32): +# CHECK-NEXT: %7 = arith.maximumf %in, %in_11 : f32 +# CHECK-NEXT: linalg.yield %7 : f32 +# CHECK-NEXT: } -> tensor<1x8x8x16xf32> +# CHECK-NEXT: %inserted_slice = tensor.insert_slice %5#0 into %arg4[%arg3, 0, 0, 0] [1, 8, 8, 16] [1, 1, 1, 1] : tensor<1x8x8x16xf32> into tensor<1x8x8x16xf32> +# CHECK-NEXT: %inserted_slice_10 = tensor.insert_slice %5#1 into %arg5[%arg3, 0, 0, 0] [1, 8, 8, 16] [1, 1, 1, 1] : tensor<1x8x8x16xf32> into tensor<1x8x8x16xf32> +# CHECK-NEXT: scf.yield %inserted_slice, %inserted_slice_10 : tensor<1x8x8x16xf32>, tensor<1x8x8x16xf32> +# CHECK-NEXT: } {"./b"} +# CHECK-NEXT: %4 = linalg.generic {indexing_maps = [#map3, #map4, #map3], iterator_types = ["parallel", "parallel", "parallel", "parallel"]} ins(%3#0, %cst_4 : tensor<1x8x8x16xf32>, f32) outs(%2 : tensor<1x8x8x16xf32>) attrs = {__xtc_id_relu_} { +# CHECK-NEXT: ^bb0(%in: f32, %in_5: f32, %out: f32): +# CHECK-NEXT: %5 = arith.maximumf %in, %in_5 : f32 +# CHECK-NEXT: linalg.yield %5 : f32 +# CHECK-NEXT: } -> tensor<1x8x8x16xf32> +# CHECK-NEXT: bufferization.materialize_in_destination %3#1 in restrict writable %arg2 : (tensor<1x8x8x16xf32>, memref<1x8x8x16xf32>) -> () +# CHECK-NEXT: return +# CHECK-NEXT: } +# CHECK-NEXT: transform.named_sequence @_vecto(%arg0: !transform.any_op {transform.consumed}) { +# CHECK-NEXT: transform.structured.vectorize %arg0 : !transform.any_op +# CHECK-NEXT: transform.yield +# CHECK-NEXT: } +# CHECK-NEXT: transform.named_sequence @_post_bufferize(%arg0: !transform.any_op {transform.readonly}) { +# CHECK-NEXT: transform.yield +# CHECK-NEXT: } +# CHECK-NEXT: } +# CHECK-NEXT: +# CHECK-NEXT: // -----// IR Dump After Tensor Lowering //----- // +# CHECK-NEXT: #map = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d0, d1 + d4, d2 + d5, d6)> +# CHECK-NEXT: #map1 = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d4, d5, d6, d3)> +# CHECK-NEXT: #map2 = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d0, d1, d2, d3)> +# CHECK-NEXT: #map3 = affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)> +# CHECK-NEXT: #map4 = affine_map<(d0, d1, d2, d3) -> ()> +# CHECK-NEXT: module attributes {transform.with_named_sequence} { +# CHECK-NEXT: func.func @conv2d_nhwc_mini(%arg0: memref<1x10x10x3xf32> {llvm.noalias}, %arg1: memref<3x3x3x16xf32> {llvm.noalias}, %arg2: memref<1x8x8x16xf32> {llvm.noalias}) { +# CHECK-NEXT: %c3 = arith.constant 3 : index +# CHECK-NEXT: %c16 = arith.constant 16 : index +# CHECK-NEXT: %c8 = arith.constant 8 : index +# CHECK-NEXT: %c1 = arith.constant 1 : index +# CHECK-NEXT: %c0 = arith.constant 0 : index +# CHECK-NEXT: %cst = arith.constant 0.000000e+00 : f32 +# CHECK-NEXT: %alloc = memref.alloc() {alignment = 256 : i64} : memref<1x8x8x16xf32> +# CHECK-NEXT: %0 = scf.for %arg3 = %c0 to %c8 step %c1 iter_args(%arg4 = %alloc) -> (memref<1x8x8x16xf32>) { +# CHECK-NEXT: %subview = memref.subview %arg4[0, %arg3, 0, 0] [1, 1, 8, 16] [1, 1, 1, 1] : memref<1x8x8x16xf32> to memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: %2 = scf.for %arg5 = %c0 to %c8 step %c1 iter_args(%arg6 = %subview) -> (memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>>) { +# CHECK-NEXT: %subview_1 = memref.subview %arg6[0, 0, %arg5, 0] [1, 1, 1, 16] [1, 1, 1, 1] : memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>> to memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: %3 = scf.for %arg7 = %c0 to %c16 step %c1 iter_args(%arg8 = %subview_1) -> (memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>>) { +# CHECK-NEXT: %subview_3 = memref.subview %arg8[0, 0, 0, %arg7] [1, 1, 1, 1] [1, 1, 1, 1] : memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>> to memref<1x1x1x1xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: linalg.fill {__xtc_id_O_0_} ins(%cst : f32) outs(%subview_3 : memref<1x1x1x1xf32, strided<[1024, 128, 16, 1], offset: ?>>) +# CHECK-NEXT: %subview_4 = memref.subview %arg8[0, 0, 0, %arg7] [1, 1, 1, 1] [1, 1, 1, 1] : memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>> to memref<1x1x1x1xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: memref.copy %subview_3, %subview_4 : memref<1x1x1x1xf32, strided<[1024, 128, 16, 1], offset: ?>> to memref<1x1x1x1xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: scf.yield %arg8 : memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: } {"./f"} +# CHECK-NEXT: %subview_2 = memref.subview %arg6[0, 0, %arg5, 0] [1, 1, 1, 16] [1, 1, 1, 1] : memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>> to memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: memref.copy %3, %subview_2 : memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>> to memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: scf.yield %arg6 : memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: } {"./w"} +# CHECK-NEXT: %subview_0 = memref.subview %arg4[0, %arg3, 0, 0] [1, 1, 8, 16] [1, 1, 1, 1] : memref<1x8x8x16xf32> to memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: memref.copy %2, %subview_0 : memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>> to memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: scf.yield %arg4 : memref<1x8x8x16xf32> +# CHECK-NEXT: } {"./h"} +# CHECK-NEXT: %1:2 = scf.for %arg3 = %c0 to %c8 step %c1 iter_args(%arg4 = %0, %arg5 = %arg2) -> (memref<1x8x8x16xf32>, memref<1x8x8x16xf32>) { +# CHECK-NEXT: %subview = memref.subview %arg0[0, %arg3, 0, 0] [1, 3, 10, 3] [1, 1, 1, 1] : memref<1x10x10x3xf32> to memref<1x3x10x3xf32, strided<[300, 30, 3, 1], offset: ?>> +# CHECK-NEXT: %subview_0 = memref.subview %arg4[0, %arg3, 0, 0] [1, 1, 8, 16] [1, 1, 1, 1] : memref<1x8x8x16xf32> to memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: %subview_1 = memref.subview %arg5[0, %arg3, 0, 0] [1, 1, 8, 16] [1, 1, 1, 1] : memref<1x8x8x16xf32> to memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: %2:2 = scf.for %arg6 = %c0 to %c8 step %c1 iter_args(%arg7 = %subview_0, %arg8 = %subview_1) -> (memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>>, memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>>) { +# CHECK-NEXT: %subview_4 = memref.subview %subview[0, 0, %arg6, 0] [1, 3, 3, 3] [1, 1, 1, 1] : memref<1x3x10x3xf32, strided<[300, 30, 3, 1], offset: ?>> to memref<1x3x3x3xf32, strided<[300, 30, 3, 1], offset: ?>> +# CHECK-NEXT: %subview_5 = memref.subview %arg7[0, 0, %arg6, 0] [1, 1, 1, 16] [1, 1, 1, 1] : memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>> to memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: %subview_6 = memref.subview %arg8[0, 0, %arg6, 0] [1, 1, 1, 16] [1, 1, 1, 1] : memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>> to memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: %3:2 = scf.for %arg9 = %c0 to %c16 step %c1 iter_args(%arg10 = %subview_5, %arg11 = %subview_6) -> (memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>>, memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>>) { +# CHECK-NEXT: %subview_9 = memref.subview %arg1[0, 0, 0, %arg9] [3, 3, 3, 1] [1, 1, 1, 1] : memref<3x3x3x16xf32> to memref<3x3x3x1xf32, strided<[144, 48, 16, 1], offset: ?>> +# CHECK-NEXT: %subview_10 = memref.subview %arg10[0, 0, 0, %arg9] [1, 1, 1, 1] [1, 1, 1, 1] : memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>> to memref<1x1x1x1xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: %4 = scf.for %arg12 = %c0 to %c3 step %c1 iter_args(%arg13 = %subview_10) -> (memref<1x1x1x1xf32, strided<[1024, 128, 16, 1], offset: ?>>) { +# CHECK-NEXT: %subview_14 = memref.subview %subview_4[0, %arg12, 0, 0] [1, 1, 3, 3] [1, 1, 1, 1] : memref<1x3x3x3xf32, strided<[300, 30, 3, 1], offset: ?>> to memref<1x1x3x3xf32, strided<[300, 30, 3, 1], offset: ?>> +# CHECK-NEXT: %subview_15 = memref.subview %subview_9[%arg12, 0, 0, 0] [1, 3, 3, 1] [1, 1, 1, 1] : memref<3x3x3x1xf32, strided<[144, 48, 16, 1], offset: ?>> to memref<1x3x3x1xf32, strided<[144, 48, 16, 1], offset: ?>> +# CHECK-NEXT: %5 = scf.for %arg14 = %c0 to %c3 step %c1 iter_args(%arg15 = %arg13) -> (memref<1x1x1x1xf32, strided<[1024, 128, 16, 1], offset: ?>>) { +# CHECK-NEXT: %subview_16 = memref.subview %subview_14[0, 0, %arg14, 0] [1, 1, 1, 3] [1, 1, 1, 1] : memref<1x1x3x3xf32, strided<[300, 30, 3, 1], offset: ?>> to memref<1x1x1x3xf32, strided<[300, 30, 3, 1], offset: ?>> +# CHECK-NEXT: %subview_17 = memref.subview %subview_15[0, %arg14, 0, 0] [1, 1, 3, 1] [1, 1, 1, 1] : memref<1x3x3x1xf32, strided<[144, 48, 16, 1], offset: ?>> to memref<1x1x3x1xf32, strided<[144, 48, 16, 1], offset: ?>> +# CHECK-NEXT: %6 = scf.for %arg16 = %c0 to %c3 step %c1 iter_args(%arg17 = %arg15) -> (memref<1x1x1x1xf32, strided<[1024, 128, 16, 1], offset: ?>>) { +# CHECK-NEXT: %subview_18 = memref.subview %subview_16[0, 0, 0, %arg16] [1, 1, 1, 1] [1, 1, 1, 1] : memref<1x1x1x3xf32, strided<[300, 30, 3, 1], offset: ?>> to memref<1x1x1x1xf32, strided<[300, 30, 3, 1], offset: ?>> +# CHECK-NEXT: %subview_19 = memref.subview %subview_17[0, 0, %arg16, 0] [1, 1, 1, 1] [1, 1, 1, 1] : memref<1x1x3x1xf32, strided<[144, 48, 16, 1], offset: ?>> to memref<1x1x1x1xf32, strided<[144, 48, 16, 1], offset: ?>> +# CHECK-NEXT: linalg.generic {indexing_maps = [#map, #map1, #map2], iterator_types = ["parallel", "parallel", "parallel", "parallel", "reduction", "reduction", "reduction"]} ins(%subview_18, %subview_19 : memref<1x1x1x1xf32, strided<[300, 30, 3, 1], offset: ?>>, memref<1x1x1x1xf32, strided<[144, 48, 16, 1], offset: ?>>) outs(%arg17 : memref<1x1x1x1xf32, strided<[1024, 128, 16, 1], offset: ?>>) attrs = {__xtc_id_O_} { +# CHECK-NEXT: ^bb0(%in: f32, %in_20: f32, %out: f32): +# CHECK-NEXT: %7 = arith.mulf %in, %in_20 fastmath : f32 +# CHECK-NEXT: %8 = arith.addf %out, %7 fastmath : f32 +# CHECK-NEXT: linalg.yield %8 : f32 +# CHECK-NEXT: } +# CHECK-NEXT: scf.yield %arg17 : memref<1x1x1x1xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: } {"./c"} +# CHECK-NEXT: scf.yield %6 : memref<1x1x1x1xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: } {"./s"} +# CHECK-NEXT: scf.yield %5 : memref<1x1x1x1xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: } {"./r"} +# CHECK-NEXT: %subview_11 = memref.subview %arg11[0, 0, 0, %arg9] [1, 1, 1, 1] [1, 1, 1, 1] : memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>> to memref<1x1x1x1xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: linalg.generic {indexing_maps = [#map3, #map4, #map3], iterator_types = ["parallel", "parallel", "parallel", "parallel"]} ins(%4, %cst : memref<1x1x1x1xf32, strided<[1024, 128, 16, 1], offset: ?>>, f32) outs(%subview_11 : memref<1x1x1x1xf32, strided<[1024, 128, 16, 1], offset: ?>>) attrs = {__xtc_id_relu_} { +# CHECK-NEXT: ^bb0(%in: f32, %in_14: f32, %out: f32): +# CHECK-NEXT: %5 = arith.maximumf %in, %in_14 : f32 +# CHECK-NEXT: linalg.yield %5 : f32 +# CHECK-NEXT: } +# CHECK-NEXT: %subview_12 = memref.subview %arg10[0, 0, 0, %arg9] [1, 1, 1, 1] [1, 1, 1, 1] : memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>> to memref<1x1x1x1xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: memref.copy %4, %subview_12 : memref<1x1x1x1xf32, strided<[1024, 128, 16, 1], offset: ?>> to memref<1x1x1x1xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: %subview_13 = memref.subview %arg11[0, 0, 0, %arg9] [1, 1, 1, 1] [1, 1, 1, 1] : memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>> to memref<1x1x1x1xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: memref.copy %subview_11, %subview_13 : memref<1x1x1x1xf32, strided<[1024, 128, 16, 1], offset: ?>> to memref<1x1x1x1xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: scf.yield %arg10, %arg11 : memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>>, memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: } {"./f"} +# CHECK-NEXT: %subview_7 = memref.subview %arg7[0, 0, %arg6, 0] [1, 1, 1, 16] [1, 1, 1, 1] : memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>> to memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: memref.copy %3#0, %subview_7 : memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>> to memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: %subview_8 = memref.subview %arg8[0, 0, %arg6, 0] [1, 1, 1, 16] [1, 1, 1, 1] : memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>> to memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: memref.copy %3#1, %subview_8 : memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>> to memref<1x1x1x16xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: scf.yield %arg7, %arg8 : memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>>, memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: } {"./w"} +# CHECK-NEXT: %subview_2 = memref.subview %arg4[0, %arg3, 0, 0] [1, 1, 8, 16] [1, 1, 1, 1] : memref<1x8x8x16xf32> to memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: memref.copy %2#0, %subview_2 : memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>> to memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: %subview_3 = memref.subview %arg5[0, %arg3, 0, 0] [1, 1, 8, 16] [1, 1, 1, 1] : memref<1x8x8x16xf32> to memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: memref.copy %2#1, %subview_3 : memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>> to memref<1x1x8x16xf32, strided<[1024, 128, 16, 1], offset: ?>> +# CHECK-NEXT: scf.yield %arg4, %arg5 : memref<1x8x8x16xf32>, memref<1x8x8x16xf32> +# CHECK-NEXT: } {"./h"} +# CHECK-NEXT: memref.copy %1#1, %arg2 : memref<1x8x8x16xf32> to memref<1x8x8x16xf32> +# CHECK-NEXT: return +# CHECK-NEXT: } +# CHECK-NEXT: } +# CHECK-NEXT: +# CHECK-NEXT: graph: +# CHECK-NEXT: name: conv2d_nhwc_mini +# CHECK-NEXT: inputs: +# CHECK-NEXT: - %0 : 1x10x10x3xfloat32 +# CHECK-NEXT: - %1 : 3x3x3x16xfloat32 +# CHECK-NEXT: outputs: +# CHECK-NEXT: - %3 : 1x8x8x16xfloat32 +# CHECK-NEXT: nodes: +# CHECK-NEXT: - %2: conv2d(%0, %1, stride=(1, 1)) {name = 'O'} : [1x10x10x3xfloat32, 3x3x3x16xfloat32] -> [1x8x8x16xfloat32] +# CHECK-NEXT: - %3: relu(%2) {name = 'relu'} : [1x8x8x16xfloat32] -> [1x8x8x16xfloat32] +# CHECK-NEXT: +# CHECK-NEXT: CODE: 0 diff --git a/tests/filecheck/backends/tensor_dialect/test_matmul_relu_mlir_tensor.py b/tests/filecheck/backends/tensor_dialect/test_matmul_relu_mlir_tensor.py index 70c34c9b7..08703f3cf 100644 --- a/tests/filecheck/backends/tensor_dialect/test_matmul_relu_mlir_tensor.py +++ b/tests/filecheck/backends/tensor_dialect/test_matmul_relu_mlir_tensor.py @@ -37,266 +37,266 @@ res = executor.execute() print(f"CODE: {res}") -# CHECK: // -----// IR Dump Before transform //----- // -# CHECK-NEXT: #map = affine_map<(d0, d1) -> (d0, d1)> -# CHECK-NEXT: #map1 = affine_map<(d0, d1) -> ()> -# CHECK-NEXT: module attributes {transform.with_named_sequence} { -# CHECK-NEXT: func.func @matmul_relu(%arg0: tensor<4x512xf32> {llvm.noalias}, %arg1: tensor<512x32xf32> {llvm.noalias}, %arg2: memref<4x32xf32> {llvm.noalias}) { -# CHECK-NEXT: %0 = tensor.empty() : tensor<4x32xf32> -# CHECK-NEXT: %cst = arith.constant 0.000000e+00 : f32 -# CHECK-NEXT: %1 = linalg.fill {__xtc_id_matmul_0_} ins(%cst : f32) outs(%0 : tensor<4x32xf32>) -> tensor<4x32xf32> -# CHECK-NEXT: %2 = linalg.matmul {__xtc_id_matmul_} ins(%arg0, %arg1 : tensor<4x512xf32>, tensor<512x32xf32>) outs(%1 : tensor<4x32xf32>) -> tensor<4x32xf32> -# CHECK-NEXT: %3 = tensor.empty() : tensor<4x32xf32> -# CHECK-NEXT: %cst_0 = arith.constant 0.000000e+00 : f32 -# CHECK-NEXT: %4 = linalg.generic {indexing_maps = [#map, #map1, #map], iterator_types = ["parallel", "parallel"]} ins(%2, %cst_0 : tensor<4x32xf32>, f32) outs(%3 : tensor<4x32xf32>) attrs = {__xtc_id_relu_} { -# CHECK-NEXT: ^bb0(%in: f32, %in_1: f32, %out: f32): -# CHECK-NEXT: %5 = arith.maximumf %in, %in_1 : f32 -# CHECK-NEXT: linalg.yield %5 : f32 -# CHECK-NEXT: } -> tensor<4x32xf32> -# CHECK-NEXT: bufferization.materialize_in_destination %4 in restrict writable %arg2 : (tensor<4x32xf32>, memref<4x32xf32>) -> () -# CHECK-NEXT: return -# CHECK-NEXT: } -# CHECK-NEXT: transform.named_sequence @_vecto(%arg0: !transform.any_op {transform.consumed}) { -# CHECK-NEXT: transform.structured.vectorize %arg0 : !transform.any_op -# CHECK-NEXT: transform.yield -# CHECK-NEXT: } -# CHECK-NEXT: transform.named_sequence @_post_bufferize(%arg0: !transform.any_op {transform.readonly}) { -# CHECK-NEXT: %0 = transform.structured.match attributes {sym_name = "matmul_relu"} in %arg0 : (!transform.any_op) -> !transform.any_op -# CHECK-NEXT: transform.apply_patterns to %0 { -# CHECK-NEXT: transform.apply_patterns.vector.lower_outerproduct -# CHECK-NEXT: transform.apply_patterns.vector.lower_contraction -# CHECK-NEXT: } : !transform.any_op -# CHECK-NEXT: transform.yield -# CHECK-NEXT: } -# CHECK-NEXT: transform.named_sequence @__transform_main(%arg0: !transform.any_op {transform.readonly}) { -# CHECK-NEXT: %0 = transform.structured.match attributes {__xtc_id_matmul_0_} in %arg0 : (!transform.any_op) -> !transform.any_op -# CHECK-NEXT: %tiled_linalg_op, %loops = transform.structured.tile_using_for %0 tile_sizes [1, 0] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) -# CHECK-NEXT: transform.annotate %loops "./i" : !transform.any_op -# CHECK-NEXT: %tiled_linalg_op_0, %loops_1 = transform.structured.tile_using_for %tiled_linalg_op tile_sizes [0, 1] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) -# CHECK-NEXT: transform.annotate %loops_1 "./j" : !transform.any_op -# CHECK-NEXT: %1 = transform.structured.match attributes {__xtc_id_matmul_} in %arg0 : (!transform.any_op) -> !transform.any_op -# CHECK-NEXT: %tiled_linalg_op_2, %loops_3 = transform.structured.tile_using_for %1 tile_sizes [0, 0, 1] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) -# CHECK-NEXT: transform.annotate %loops_3 "./k" : !transform.any_op -# CHECK-NEXT: %tiled_linalg_op_4, %loops_5 = transform.structured.tile_using_for %tiled_linalg_op_2 tile_sizes [2, 0, 0] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) -# CHECK-NEXT: transform.annotate %loops_5 "./i" : !transform.any_op -# CHECK-NEXT: %tiled_linalg_op_6, %loops_7 = transform.structured.tile_using_for %tiled_linalg_op_4 tile_sizes [0, 16, 0] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) -# CHECK-NEXT: transform.annotate %loops_7 "./j" : !transform.any_op -# CHECK-NEXT: %tiled_linalg_op_8, %loops_9 = transform.structured.tile_using_for %tiled_linalg_op_6 tile_sizes [1, 0, 0] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) -# CHECK-NEXT: transform.annotate %loops_9 "./i1" : !transform.any_op -# CHECK-NEXT: %2 = transform.get_parent_op %tiled_linalg_op_8 : (!transform.any_op) -> !transform.any_op -# CHECK-NEXT: transform.apply_patterns to %2 { -# CHECK-NEXT: transform.apply_patterns.linalg.fold_unit_extent_dims_via_slices -# CHECK-NEXT: } : !transform.any_op -# CHECK-NEXT: %3 = transform.structured.match interface{LinalgOp} in %2 : (!transform.any_op) -> !transform.any_op -# CHECK-NEXT: transform.include @_vecto failures(suppress) (%3) : (!transform.any_op) -> () -# CHECK-NEXT: transform.loop.unroll %loops_9 {factor = 2 : i64} : !transform.any_op -# CHECK-NEXT: %4 = transform.get_parent_op %loops_3 {isolated_from_above} : (!transform.any_op) -> !transform.any_op -# CHECK-NEXT: transform.apply_patterns to %4 { -# CHECK-NEXT: transform.apply_patterns.vector.reduction_to_contract -# CHECK-NEXT: transform.apply_patterns.vector.transfer_permutation_patterns -# CHECK-NEXT: } : !transform.any_op -# CHECK-NEXT: %5 = transform.structured.match attributes {__xtc_id_relu_} in %arg0 : (!transform.any_op) -> !transform.any_op -# CHECK-NEXT: %tiled_linalg_op_10, %loops_11 = transform.structured.tile_using_for %5 tile_sizes [1] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) -# CHECK-NEXT: transform.annotate %loops_11 "./i" : !transform.any_op -# CHECK-NEXT: transform.yield -# CHECK-NEXT: } -# CHECK-NEXT: } +# CHECK: // -----// IR Dump Before transform //----- // +# CHECK-NEXT: #map = affine_map<(d0, d1) -> (d0, d1)> +# CHECK-NEXT: #map1 = affine_map<(d0, d1) -> ()> +# CHECK-NEXT: module attributes {transform.with_named_sequence} { +# CHECK-NEXT: func.func @matmul_relu(%arg0: tensor<4x512xf32> {llvm.noalias}, %arg1: tensor<512x32xf32> {llvm.noalias}, %arg2: memref<4x32xf32> {llvm.noalias}) { +# CHECK-NEXT: %0 = tensor.empty() : tensor<4x32xf32> +# CHECK-NEXT: %cst = arith.constant 0.000000e+00 : f32 +# CHECK-NEXT: %1 = linalg.fill {__xtc_id_matmul_0_} ins(%cst : f32) outs(%0 : tensor<4x32xf32>) -> tensor<4x32xf32> +# CHECK-NEXT: %2 = linalg.matmul {__xtc_id_matmul_} ins(%arg0, %arg1 : tensor<4x512xf32>, tensor<512x32xf32>) outs(%1 : tensor<4x32xf32>) -> tensor<4x32xf32> +# CHECK-NEXT: %3 = tensor.empty() : tensor<4x32xf32> +# CHECK-NEXT: %cst_0 = arith.constant 0.000000e+00 : f32 +# CHECK-NEXT: %4 = linalg.generic {indexing_maps = [#map, #map1, #map], iterator_types = ["parallel", "parallel"]} ins(%2, %cst_0 : tensor<4x32xf32>, f32) outs(%3 : tensor<4x32xf32>) attrs = {__xtc_id_relu_} { +# CHECK-NEXT: ^bb0(%in: f32, %in_1: f32, %out: f32): +# CHECK-NEXT: %5 = arith.maximumf %in, %in_1 : f32 +# CHECK-NEXT: linalg.yield %5 : f32 +# CHECK-NEXT: } -> tensor<4x32xf32> +# CHECK-NEXT: bufferization.materialize_in_destination %4 in restrict writable %arg2 : (tensor<4x32xf32>, memref<4x32xf32>) -> () +# CHECK-NEXT: return +# CHECK-NEXT: } +# CHECK-NEXT: transform.named_sequence @_vecto(%arg0: !transform.any_op {transform.consumed}) { +# CHECK-NEXT: transform.structured.vectorize %arg0 : !transform.any_op +# CHECK-NEXT: transform.yield +# CHECK-NEXT: } +# CHECK-NEXT: transform.named_sequence @_post_bufferize(%arg0: !transform.any_op {transform.readonly}) { +# CHECK-NEXT: %0 = transform.structured.match attributes {sym_name = "matmul_relu"} in %arg0 : (!transform.any_op) -> !transform.any_op +# CHECK-NEXT: transform.apply_patterns to %0 { +# CHECK-NEXT: transform.apply_patterns.vector.lower_outerproduct +# CHECK-NEXT: transform.apply_patterns.vector.lower_contraction +# CHECK-NEXT: } : !transform.any_op +# CHECK-NEXT: transform.yield +# CHECK-NEXT: } +# CHECK-NEXT: transform.named_sequence @__transform_main(%arg0: !transform.any_op {transform.readonly}) { +# CHECK-NEXT: %0 = transform.structured.match attributes {__xtc_id_matmul_0_} in %arg0 : (!transform.any_op) -> !transform.any_op +# CHECK-NEXT: %tiled_linalg_op, %loops = transform.structured.tile_using_for %0 tile_sizes [1, 0] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %loops "./i" : !transform.any_op +# CHECK-NEXT: %tiled_linalg_op_0, %loops_1 = transform.structured.tile_using_for %tiled_linalg_op tile_sizes [0, 1] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %loops_1 "./j" : !transform.any_op +# CHECK-NEXT: %1 = transform.structured.match attributes {__xtc_id_matmul_} in %arg0 : (!transform.any_op) -> !transform.any_op +# CHECK-NEXT: %tiled_linalg_op_2, %loops_3 = transform.structured.tile_using_for %1 tile_sizes [0, 0, 1] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %loops_3 "./k" : !transform.any_op +# CHECK-NEXT: %tiled_linalg_op_4, %loops_5 = transform.structured.tile_using_for %tiled_linalg_op_2 tile_sizes [2, 0, 0] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %loops_5 "./i" : !transform.any_op +# CHECK-NEXT: %tiled_linalg_op_6, %loops_7 = transform.structured.tile_using_for %tiled_linalg_op_4 tile_sizes [0, 16, 0] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %loops_7 "./j" : !transform.any_op +# CHECK-NEXT: %tiled_linalg_op_8, %loops_9 = transform.structured.tile_using_for %tiled_linalg_op_6 tile_sizes [1, 0, 0] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %loops_9 "./i1" : !transform.any_op +# CHECK-NEXT: %2 = transform.get_parent_op %tiled_linalg_op_8 : (!transform.any_op) -> !transform.any_op +# CHECK-NEXT: transform.apply_patterns to %2 { +# CHECK-NEXT: transform.apply_patterns.linalg.fold_unit_extent_dims_via_slices +# CHECK-NEXT: } : !transform.any_op +# CHECK-NEXT: %3 = transform.structured.match interface{LinalgOp} in %2 : (!transform.any_op) -> !transform.any_op +# CHECK-NEXT: transform.include @_vecto failures(suppress) (%3) : (!transform.any_op) -> () +# CHECK-NEXT: transform.loop.unroll %loops_9 {factor = 2 : i64} : !transform.any_op +# CHECK-NEXT: %4 = transform.get_parent_op %loops_3 {isolated_from_above} : (!transform.any_op) -> !transform.any_op +# CHECK-NEXT: transform.apply_patterns to %4 { +# CHECK-NEXT: transform.apply_patterns.vector.reduction_to_contract +# CHECK-NEXT: transform.apply_patterns.vector.transfer_permutation_patterns +# CHECK-NEXT: } : !transform.any_op +# CHECK-NEXT: %5 = transform.structured.match attributes {__xtc_id_relu_} in %arg0 : (!transform.any_op) -> !transform.any_op +# CHECK-NEXT: %tiled_linalg_op_10, %loops_11 = transform.structured.tile_using_for %5 tile_sizes [1] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %loops_11 "./i" : !transform.any_op +# CHECK-NEXT: transform.yield +# CHECK-NEXT: } +# CHECK-NEXT: } # CHECK-NEXT: -# CHECK-NEXT: // -----// IR Dump After transform //----- // -# CHECK-NEXT: #map = affine_map<(d0, d1, d2) -> (d0, d2)> -# CHECK-NEXT: #map1 = affine_map<(d0, d1, d2) -> (d2, d1)> -# CHECK-NEXT: #map2 = affine_map<(d0, d1, d2) -> (d0, d1)> -# CHECK-NEXT: #map3 = affine_map<(d0, d1) -> (d0, d1)> -# CHECK-NEXT: #map4 = affine_map<(d0, d1) -> ()> -# CHECK-NEXT: module attributes {transform.with_named_sequence} { -# CHECK-NEXT: func.func @matmul_relu(%arg0: tensor<4x512xf32> {llvm.noalias}, %arg1: tensor<512x32xf32> {llvm.noalias}, %arg2: memref<4x32xf32> {llvm.noalias}) { -# CHECK-NEXT: %0 = ub.poison : f32 -# CHECK-NEXT: %c16 = arith.constant 16 : index -# CHECK-NEXT: %c2 = arith.constant 2 : index -# CHECK-NEXT: %c512 = arith.constant 512 : index -# CHECK-NEXT: %c32 = arith.constant 32 : index -# CHECK-NEXT: %c1 = arith.constant 1 : index -# CHECK-NEXT: %c4 = arith.constant 4 : index -# CHECK-NEXT: %c0 = arith.constant 0 : index -# CHECK-NEXT: %cst = arith.constant 0.000000e+00 : f32 -# CHECK-NEXT: %1 = tensor.empty() : tensor<4x32xf32> -# CHECK-NEXT: %2 = scf.for %arg3 = %c0 to %c4 step %c1 iter_args(%arg4 = %1) -> (tensor<4x32xf32>) { -# CHECK-NEXT: %extracted_slice = tensor.extract_slice %arg4[%arg3, 0] [1, 32] [1, 1] : tensor<4x32xf32> to tensor<1x32xf32> -# CHECK-NEXT: %6 = scf.for %arg5 = %c0 to %c32 step %c1 iter_args(%arg6 = %extracted_slice) -> (tensor<1x32xf32>) { -# CHECK-NEXT: %extracted_slice_3 = tensor.extract_slice %arg6[0, %arg5] [1, 1] [1, 1] : tensor<1x32xf32> to tensor<1x1xf32> -# CHECK-NEXT: %7 = linalg.fill {__xtc_id_matmul_0_} ins(%cst : f32) outs(%extracted_slice_3 : tensor<1x1xf32>) -> tensor<1x1xf32> -# CHECK-NEXT: %inserted_slice_4 = tensor.insert_slice %7 into %arg6[0, %arg5] [1, 1] [1, 1] : tensor<1x1xf32> into tensor<1x32xf32> -# CHECK-NEXT: scf.yield %inserted_slice_4 : tensor<1x32xf32> -# CHECK-NEXT: } {"./j"} -# CHECK-NEXT: %inserted_slice = tensor.insert_slice %6 into %arg4[%arg3, 0] [1, 32] [1, 1] : tensor<1x32xf32> into tensor<4x32xf32> -# CHECK-NEXT: scf.yield %inserted_slice : tensor<4x32xf32> -# CHECK-NEXT: } {"./i"} -# CHECK-NEXT: %3 = scf.for %arg3 = %c0 to %c512 step %c1 iter_args(%arg4 = %2) -> (tensor<4x32xf32>) { -# CHECK-NEXT: %extracted_slice = tensor.extract_slice %arg0[0, %arg3] [4, 1] [1, 1] : tensor<4x512xf32> to tensor<4x1xf32> -# CHECK-NEXT: %extracted_slice_3 = tensor.extract_slice %arg1[%arg3, 0] [1, 32] [1, 1] : tensor<512x32xf32> to tensor<1x32xf32> -# CHECK-NEXT: %6 = scf.for %arg5 = %c0 to %c4 step %c2 iter_args(%arg6 = %arg4) -> (tensor<4x32xf32>) { -# CHECK-NEXT: %extracted_slice_4 = tensor.extract_slice %extracted_slice[%arg5, 0] [2, 1] [1, 1] : tensor<4x1xf32> to tensor<2x1xf32> -# CHECK-NEXT: %extracted_slice_5 = tensor.extract_slice %arg6[%arg5, 0] [2, 32] [1, 1] : tensor<4x32xf32> to tensor<2x32xf32> -# CHECK-NEXT: %7 = scf.for %arg7 = %c0 to %c32 step %c16 iter_args(%arg8 = %extracted_slice_5) -> (tensor<2x32xf32>) { -# CHECK-NEXT: %extracted_slice_6 = tensor.extract_slice %extracted_slice_3[0, %arg7] [1, 16] [1, 1] : tensor<1x32xf32> to tensor<1x16xf32> -# CHECK-NEXT: %extracted_slice_7 = tensor.extract_slice %arg8[0, %arg7] [2, 16] [1, 1] : tensor<2x32xf32> to tensor<2x16xf32> -# CHECK-NEXT: %extracted_slice_8 = tensor.extract_slice %extracted_slice_4[%c0, 0] [1, 1] [1, 1] : tensor<2x1xf32> to tensor<1x1xf32> -# CHECK-NEXT: %extracted_slice_9 = tensor.extract_slice %extracted_slice_7[%c0, 0] [1, 16] [1, 1] : tensor<2x16xf32> to tensor<1x16xf32> -# CHECK-NEXT: %8 = vector.transfer_read %extracted_slice_8[%c0, %c0], %0 {in_bounds = [true, true]} : tensor<1x1xf32>, vector<1x1xf32> -# CHECK-NEXT: %9 = vector.transfer_read %extracted_slice_6[%c0, %c0], %0 {in_bounds = [true, true]} : tensor<1x16xf32>, vector<1x16xf32> -# CHECK-NEXT: %10 = vector.transfer_read %extracted_slice_9[%c0, %c0], %0 {in_bounds = [true, true]} : tensor<1x16xf32>, vector<1x16xf32> -# CHECK-NEXT: %11 = vector.contract {indexing_maps = [#map, #map1, #map2], iterator_types = ["parallel", "parallel", "reduction"], kind = #vector.kind} %8, %9, %10 : vector<1x1xf32>, vector<1x16xf32> into vector<1x16xf32> -# CHECK-NEXT: %12 = vector.transfer_write %11, %extracted_slice_9[%c0, %c0] {in_bounds = [true, true]} : vector<1x16xf32>, tensor<1x16xf32> -# CHECK-NEXT: %inserted_slice_10 = tensor.insert_slice %12 into %extracted_slice_7[%c0, 0] [1, 16] [1, 1] : tensor<1x16xf32> into tensor<2x16xf32> -# CHECK-NEXT: %extracted_slice_11 = tensor.extract_slice %extracted_slice_4[%c1, 0] [1, 1] [1, 1] : tensor<2x1xf32> to tensor<1x1xf32> -# CHECK-NEXT: %extracted_slice_12 = tensor.extract_slice %inserted_slice_10[%c1, 0] [1, 16] [1, 1] : tensor<2x16xf32> to tensor<1x16xf32> -# CHECK-NEXT: %13 = vector.transfer_read %extracted_slice_11[%c0, %c0], %0 {in_bounds = [true, true]} : tensor<1x1xf32>, vector<1x1xf32> -# CHECK-NEXT: %14 = vector.transfer_read %extracted_slice_6[%c0, %c0], %0 {in_bounds = [true, true]} : tensor<1x16xf32>, vector<1x16xf32> -# CHECK-NEXT: %15 = vector.transfer_read %extracted_slice_12[%c0, %c0], %0 {in_bounds = [true, true]} : tensor<1x16xf32>, vector<1x16xf32> -# CHECK-NEXT: %16 = vector.contract {indexing_maps = [#map, #map1, #map2], iterator_types = ["parallel", "parallel", "reduction"], kind = #vector.kind} %13, %14, %15 : vector<1x1xf32>, vector<1x16xf32> into vector<1x16xf32> -# CHECK-NEXT: %17 = vector.transfer_write %16, %extracted_slice_12[%c0, %c0] {in_bounds = [true, true]} : vector<1x16xf32>, tensor<1x16xf32> -# CHECK-NEXT: %inserted_slice_13 = tensor.insert_slice %17 into %inserted_slice_10[%c1, 0] [1, 16] [1, 1] : tensor<1x16xf32> into tensor<2x16xf32> -# CHECK-NEXT: %inserted_slice_14 = tensor.insert_slice %inserted_slice_13 into %arg8[0, %arg7] [2, 16] [1, 1] : tensor<2x16xf32> into tensor<2x32xf32> -# CHECK-NEXT: scf.yield %inserted_slice_14 : tensor<2x32xf32> -# CHECK-NEXT: } {"./j"} -# CHECK-NEXT: %inserted_slice = tensor.insert_slice %7 into %arg6[%arg5, 0] [2, 32] [1, 1] : tensor<2x32xf32> into tensor<4x32xf32> -# CHECK-NEXT: scf.yield %inserted_slice : tensor<4x32xf32> -# CHECK-NEXT: } {"./i"} -# CHECK-NEXT: scf.yield %6 : tensor<4x32xf32> -# CHECK-NEXT: } {"./k"} -# CHECK-NEXT: %4 = tensor.empty() : tensor<4x32xf32> -# CHECK-NEXT: %c0_0 = arith.constant 0 : index -# CHECK-NEXT: %c4_1 = arith.constant 4 : index -# CHECK-NEXT: %c1_2 = arith.constant 1 : index -# CHECK-NEXT: %5 = scf.for %arg3 = %c0_0 to %c4_1 step %c1_2 iter_args(%arg4 = %4) -> (tensor<4x32xf32>) { -# CHECK-NEXT: %extracted_slice = tensor.extract_slice %3[%arg3, 0] [1, 32] [1, 1] : tensor<4x32xf32> to tensor<1x32xf32> -# CHECK-NEXT: %extracted_slice_3 = tensor.extract_slice %arg4[%arg3, 0] [1, 32] [1, 1] : tensor<4x32xf32> to tensor<1x32xf32> -# CHECK-NEXT: %6 = linalg.generic {indexing_maps = [#map3, #map4, #map3], iterator_types = ["parallel", "parallel"]} ins(%extracted_slice, %cst : tensor<1x32xf32>, f32) outs(%extracted_slice_3 : tensor<1x32xf32>) attrs = {__xtc_id_relu_} { -# CHECK-NEXT: ^bb0(%in: f32, %in_4: f32, %out: f32): -# CHECK-NEXT: %7 = arith.maximumf %in, %in_4 : f32 -# CHECK-NEXT: linalg.yield %7 : f32 -# CHECK-NEXT: } -> tensor<1x32xf32> -# CHECK-NEXT: %inserted_slice = tensor.insert_slice %6 into %arg4[%arg3, 0] [1, 32] [1, 1] : tensor<1x32xf32> into tensor<4x32xf32> -# CHECK-NEXT: scf.yield %inserted_slice : tensor<4x32xf32> -# CHECK-NEXT: } {"./i"} -# CHECK-NEXT: bufferization.materialize_in_destination %5 in restrict writable %arg2 : (tensor<4x32xf32>, memref<4x32xf32>) -> () -# CHECK-NEXT: return -# CHECK-NEXT: } -# CHECK-NEXT: transform.named_sequence @_vecto(%arg0: !transform.any_op {transform.consumed}) { -# CHECK-NEXT: transform.structured.vectorize %arg0 : !transform.any_op -# CHECK-NEXT: transform.yield -# CHECK-NEXT: } -# CHECK-NEXT: transform.named_sequence @_post_bufferize(%arg0: !transform.any_op {transform.readonly}) { -# CHECK-NEXT: %0 = transform.structured.match attributes {sym_name = "matmul_relu"} in %arg0 : (!transform.any_op) -> !transform.any_op -# CHECK-NEXT: transform.apply_patterns to %0 { -# CHECK-NEXT: transform.apply_patterns.vector.lower_outerproduct -# CHECK-NEXT: transform.apply_patterns.vector.lower_contraction -# CHECK-NEXT: } : !transform.any_op -# CHECK-NEXT: transform.yield -# CHECK-NEXT: } -# CHECK-NEXT: } +# CHECK-NEXT: // -----// IR Dump After transform //----- // +# CHECK-NEXT: #map = affine_map<(d0, d1, d2) -> (d0, d2)> +# CHECK-NEXT: #map1 = affine_map<(d0, d1, d2) -> (d2, d1)> +# CHECK-NEXT: #map2 = affine_map<(d0, d1, d2) -> (d0, d1)> +# CHECK-NEXT: #map3 = affine_map<(d0, d1) -> (d0, d1)> +# CHECK-NEXT: #map4 = affine_map<(d0, d1) -> ()> +# CHECK-NEXT: module attributes {transform.with_named_sequence} { +# CHECK-NEXT: func.func @matmul_relu(%arg0: tensor<4x512xf32> {llvm.noalias}, %arg1: tensor<512x32xf32> {llvm.noalias}, %arg2: memref<4x32xf32> {llvm.noalias}) { +# CHECK-NEXT: %0 = ub.poison : f32 +# CHECK-NEXT: %c16 = arith.constant 16 : index +# CHECK-NEXT: %c2 = arith.constant 2 : index +# CHECK-NEXT: %c512 = arith.constant 512 : index +# CHECK-NEXT: %c32 = arith.constant 32 : index +# CHECK-NEXT: %c1 = arith.constant 1 : index +# CHECK-NEXT: %c4 = arith.constant 4 : index +# CHECK-NEXT: %c0 = arith.constant 0 : index +# CHECK-NEXT: %cst = arith.constant 0.000000e+00 : f32 +# CHECK-NEXT: %1 = tensor.empty() : tensor<4x32xf32> +# CHECK-NEXT: %2 = scf.for %arg3 = %c0 to %c4 step %c1 iter_args(%arg4 = %1) -> (tensor<4x32xf32>) { +# CHECK-NEXT: %extracted_slice = tensor.extract_slice %arg4[%arg3, 0] [1, 32] [1, 1] : tensor<4x32xf32> to tensor<1x32xf32> +# CHECK-NEXT: %6 = scf.for %arg5 = %c0 to %c32 step %c1 iter_args(%arg6 = %extracted_slice) -> (tensor<1x32xf32>) { +# CHECK-NEXT: %extracted_slice_3 = tensor.extract_slice %arg6[0, %arg5] [1, 1] [1, 1] : tensor<1x32xf32> to tensor<1x1xf32> +# CHECK-NEXT: %7 = linalg.fill {__xtc_id_matmul_0_} ins(%cst : f32) outs(%extracted_slice_3 : tensor<1x1xf32>) -> tensor<1x1xf32> +# CHECK-NEXT: %inserted_slice_4 = tensor.insert_slice %7 into %arg6[0, %arg5] [1, 1] [1, 1] : tensor<1x1xf32> into tensor<1x32xf32> +# CHECK-NEXT: scf.yield %inserted_slice_4 : tensor<1x32xf32> +# CHECK-NEXT: } {"./j"} +# CHECK-NEXT: %inserted_slice = tensor.insert_slice %6 into %arg4[%arg3, 0] [1, 32] [1, 1] : tensor<1x32xf32> into tensor<4x32xf32> +# CHECK-NEXT: scf.yield %inserted_slice : tensor<4x32xf32> +# CHECK-NEXT: } {"./i"} +# CHECK-NEXT: %3 = scf.for %arg3 = %c0 to %c512 step %c1 iter_args(%arg4 = %2) -> (tensor<4x32xf32>) { +# CHECK-NEXT: %extracted_slice = tensor.extract_slice %arg0[0, %arg3] [4, 1] [1, 1] : tensor<4x512xf32> to tensor<4x1xf32> +# CHECK-NEXT: %extracted_slice_3 = tensor.extract_slice %arg1[%arg3, 0] [1, 32] [1, 1] : tensor<512x32xf32> to tensor<1x32xf32> +# CHECK-NEXT: %6 = scf.for %arg5 = %c0 to %c4 step %c2 iter_args(%arg6 = %arg4) -> (tensor<4x32xf32>) { +# CHECK-NEXT: %extracted_slice_4 = tensor.extract_slice %extracted_slice[%arg5, 0] [2, 1] [1, 1] : tensor<4x1xf32> to tensor<2x1xf32> +# CHECK-NEXT: %extracted_slice_5 = tensor.extract_slice %arg6[%arg5, 0] [2, 32] [1, 1] : tensor<4x32xf32> to tensor<2x32xf32> +# CHECK-NEXT: %7 = scf.for %arg7 = %c0 to %c32 step %c16 iter_args(%arg8 = %extracted_slice_5) -> (tensor<2x32xf32>) { +# CHECK-NEXT: %extracted_slice_6 = tensor.extract_slice %extracted_slice_3[0, %arg7] [1, 16] [1, 1] : tensor<1x32xf32> to tensor<1x16xf32> +# CHECK-NEXT: %extracted_slice_7 = tensor.extract_slice %arg8[0, %arg7] [2, 16] [1, 1] : tensor<2x32xf32> to tensor<2x16xf32> +# CHECK-NEXT: %extracted_slice_8 = tensor.extract_slice %extracted_slice_4[%c0, 0] [1, 1] [1, 1] : tensor<2x1xf32> to tensor<1x1xf32> +# CHECK-NEXT: %extracted_slice_9 = tensor.extract_slice %extracted_slice_7[%c0, 0] [1, 16] [1, 1] : tensor<2x16xf32> to tensor<1x16xf32> +# CHECK-NEXT: %8 = vector.transfer_read %extracted_slice_8[%c0, %c0], %0 {in_bounds = [true, true]} : tensor<1x1xf32>, vector<1x1xf32> +# CHECK-NEXT: %9 = vector.transfer_read %extracted_slice_6[%c0, %c0], %0 {in_bounds = [true, true]} : tensor<1x16xf32>, vector<1x16xf32> +# CHECK-NEXT: %10 = vector.transfer_read %extracted_slice_9[%c0, %c0], %0 {in_bounds = [true, true]} : tensor<1x16xf32>, vector<1x16xf32> +# CHECK-NEXT: %11 = vector.contract {indexing_maps = [#map, #map1, #map2], iterator_types = ["parallel", "parallel", "reduction"], kind = #vector.kind} %8, %9, %10 : vector<1x1xf32>, vector<1x16xf32> into vector<1x16xf32> +# CHECK-NEXT: %12 = vector.transfer_write %11, %extracted_slice_9[%c0, %c0] {in_bounds = [true, true]} : vector<1x16xf32>, tensor<1x16xf32> +# CHECK-NEXT: %inserted_slice_10 = tensor.insert_slice %12 into %extracted_slice_7[%c0, 0] [1, 16] [1, 1] : tensor<1x16xf32> into tensor<2x16xf32> +# CHECK-NEXT: %extracted_slice_11 = tensor.extract_slice %extracted_slice_4[%c1, 0] [1, 1] [1, 1] : tensor<2x1xf32> to tensor<1x1xf32> +# CHECK-NEXT: %extracted_slice_12 = tensor.extract_slice %inserted_slice_10[%c1, 0] [1, 16] [1, 1] : tensor<2x16xf32> to tensor<1x16xf32> +# CHECK-NEXT: %13 = vector.transfer_read %extracted_slice_11[%c0, %c0], %0 {in_bounds = [true, true]} : tensor<1x1xf32>, vector<1x1xf32> +# CHECK-NEXT: %14 = vector.transfer_read %extracted_slice_6[%c0, %c0], %0 {in_bounds = [true, true]} : tensor<1x16xf32>, vector<1x16xf32> +# CHECK-NEXT: %15 = vector.transfer_read %extracted_slice_12[%c0, %c0], %0 {in_bounds = [true, true]} : tensor<1x16xf32>, vector<1x16xf32> +# CHECK-NEXT: %16 = vector.contract {indexing_maps = [#map, #map1, #map2], iterator_types = ["parallel", "parallel", "reduction"], kind = #vector.kind} %13, %14, %15 : vector<1x1xf32>, vector<1x16xf32> into vector<1x16xf32> +# CHECK-NEXT: %17 = vector.transfer_write %16, %extracted_slice_12[%c0, %c0] {in_bounds = [true, true]} : vector<1x16xf32>, tensor<1x16xf32> +# CHECK-NEXT: %inserted_slice_13 = tensor.insert_slice %17 into %inserted_slice_10[%c1, 0] [1, 16] [1, 1] : tensor<1x16xf32> into tensor<2x16xf32> +# CHECK-NEXT: %inserted_slice_14 = tensor.insert_slice %inserted_slice_13 into %arg8[0, %arg7] [2, 16] [1, 1] : tensor<2x16xf32> into tensor<2x32xf32> +# CHECK-NEXT: scf.yield %inserted_slice_14 : tensor<2x32xf32> +# CHECK-NEXT: } {"./j"} +# CHECK-NEXT: %inserted_slice = tensor.insert_slice %7 into %arg6[%arg5, 0] [2, 32] [1, 1] : tensor<2x32xf32> into tensor<4x32xf32> +# CHECK-NEXT: scf.yield %inserted_slice : tensor<4x32xf32> +# CHECK-NEXT: } {"./i"} +# CHECK-NEXT: scf.yield %6 : tensor<4x32xf32> +# CHECK-NEXT: } {"./k"} +# CHECK-NEXT: %4 = tensor.empty() : tensor<4x32xf32> +# CHECK-NEXT: %c0_0 = arith.constant 0 : index +# CHECK-NEXT: %c4_1 = arith.constant 4 : index +# CHECK-NEXT: %c1_2 = arith.constant 1 : index +# CHECK-NEXT: %5 = scf.for %arg3 = %c0_0 to %c4_1 step %c1_2 iter_args(%arg4 = %4) -> (tensor<4x32xf32>) { +# CHECK-NEXT: %extracted_slice = tensor.extract_slice %3[%arg3, 0] [1, 32] [1, 1] : tensor<4x32xf32> to tensor<1x32xf32> +# CHECK-NEXT: %extracted_slice_3 = tensor.extract_slice %arg4[%arg3, 0] [1, 32] [1, 1] : tensor<4x32xf32> to tensor<1x32xf32> +# CHECK-NEXT: %6 = linalg.generic {indexing_maps = [#map3, #map4, #map3], iterator_types = ["parallel", "parallel"]} ins(%extracted_slice, %cst : tensor<1x32xf32>, f32) outs(%extracted_slice_3 : tensor<1x32xf32>) attrs = {__xtc_id_relu_} { +# CHECK-NEXT: ^bb0(%in: f32, %in_4: f32, %out: f32): +# CHECK-NEXT: %7 = arith.maximumf %in, %in_4 : f32 +# CHECK-NEXT: linalg.yield %7 : f32 +# CHECK-NEXT: } -> tensor<1x32xf32> +# CHECK-NEXT: %inserted_slice = tensor.insert_slice %6 into %arg4[%arg3, 0] [1, 32] [1, 1] : tensor<1x32xf32> into tensor<4x32xf32> +# CHECK-NEXT: scf.yield %inserted_slice : tensor<4x32xf32> +# CHECK-NEXT: } {"./i"} +# CHECK-NEXT: bufferization.materialize_in_destination %5 in restrict writable %arg2 : (tensor<4x32xf32>, memref<4x32xf32>) -> () +# CHECK-NEXT: return +# CHECK-NEXT: } +# CHECK-NEXT: transform.named_sequence @_vecto(%arg0: !transform.any_op {transform.consumed}) { +# CHECK-NEXT: transform.structured.vectorize %arg0 : !transform.any_op +# CHECK-NEXT: transform.yield +# CHECK-NEXT: } +# CHECK-NEXT: transform.named_sequence @_post_bufferize(%arg0: !transform.any_op {transform.readonly}) { +# CHECK-NEXT: %0 = transform.structured.match attributes {sym_name = "matmul_relu"} in %arg0 : (!transform.any_op) -> !transform.any_op +# CHECK-NEXT: transform.apply_patterns to %0 { +# CHECK-NEXT: transform.apply_patterns.vector.lower_outerproduct +# CHECK-NEXT: transform.apply_patterns.vector.lower_contraction +# CHECK-NEXT: } : !transform.any_op +# CHECK-NEXT: transform.yield +# CHECK-NEXT: } +# CHECK-NEXT: } # CHECK-NEXT: -# CHECK-NEXT: // -----// IR Dump After Tensor Lowering //----- // -# CHECK-NEXT: #map = affine_map<(d0, d1) -> (d0, d1)> -# CHECK-NEXT: #map1 = affine_map<(d0, d1) -> ()> -# CHECK-NEXT: module attributes {transform.with_named_sequence} { -# CHECK-NEXT: func.func @matmul_relu(%arg0: memref<4x512xf32> {llvm.noalias}, %arg1: memref<512x32xf32> {llvm.noalias}, %arg2: memref<4x32xf32> {llvm.noalias}) { -# CHECK-NEXT: %cst = arith.constant dense<0.000000e+00> : vector<1x16xf32> -# CHECK-NEXT: %0 = ub.poison : f32 -# CHECK-NEXT: %c16 = arith.constant 16 : index -# CHECK-NEXT: %c2 = arith.constant 2 : index -# CHECK-NEXT: %c512 = arith.constant 512 : index -# CHECK-NEXT: %c32 = arith.constant 32 : index -# CHECK-NEXT: %c1 = arith.constant 1 : index -# CHECK-NEXT: %c4 = arith.constant 4 : index -# CHECK-NEXT: %c0 = arith.constant 0 : index -# CHECK-NEXT: %cst_0 = arith.constant 0.000000e+00 : f32 -# CHECK-NEXT: %alloca = memref.alloca() {alignment = 256 : i64} : memref<4x32xf32> -# CHECK-NEXT: %1 = scf.for %arg3 = %c0 to %c4 step %c1 iter_args(%arg4 = %alloca) -> (memref<4x32xf32>) { -# CHECK-NEXT: %subview = memref.subview %arg4[%arg3, 0] [1, 32] [1, 1] : memref<4x32xf32> to memref<1x32xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: %4 = scf.for %arg5 = %c0 to %c32 step %c1 iter_args(%arg6 = %subview) -> (memref<1x32xf32, strided<[32, 1], offset: ?>>) { -# CHECK-NEXT: %subview_2 = memref.subview %arg6[0, %arg5] [1, 1] [1, 1] : memref<1x32xf32, strided<[32, 1], offset: ?>> to memref<1x1xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: linalg.fill {__xtc_id_matmul_0_} ins(%cst_0 : f32) outs(%subview_2 : memref<1x1xf32, strided<[32, 1], offset: ?>>) -# CHECK-NEXT: %subview_3 = memref.subview %arg6[0, %arg5] [1, 1] [1, 1] : memref<1x32xf32, strided<[32, 1], offset: ?>> to memref<1x1xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: memref.copy %subview_2, %subview_3 : memref<1x1xf32, strided<[32, 1], offset: ?>> to memref<1x1xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: scf.yield %arg6 : memref<1x32xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: } {"./j"} -# CHECK-NEXT: %subview_1 = memref.subview %arg4[%arg3, 0] [1, 32] [1, 1] : memref<4x32xf32> to memref<1x32xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: memref.copy %4, %subview_1 : memref<1x32xf32, strided<[32, 1], offset: ?>> to memref<1x32xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: scf.yield %arg4 : memref<4x32xf32> -# CHECK-NEXT: } {"./i"} -# CHECK-NEXT: %2 = scf.for %arg3 = %c0 to %c512 step %c1 iter_args(%arg4 = %1) -> (memref<4x32xf32>) { -# CHECK-NEXT: %subview = memref.subview %arg0[0, %arg3] [4, 1] [1, 1] : memref<4x512xf32> to memref<4x1xf32, strided<[512, 1], offset: ?>> -# CHECK-NEXT: %subview_1 = memref.subview %arg1[%arg3, 0] [1, 32] [1, 1] : memref<512x32xf32> to memref<1x32xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: %4 = scf.for %arg5 = %c0 to %c4 step %c2 iter_args(%arg6 = %arg4) -> (memref<4x32xf32>) { -# CHECK-NEXT: %subview_2 = memref.subview %subview[%arg5, 0] [2, 1] [1, 1] : memref<4x1xf32, strided<[512, 1], offset: ?>> to memref<2x1xf32, strided<[512, 1], offset: ?>> -# CHECK-NEXT: %subview_3 = memref.subview %arg6[%arg5, 0] [2, 32] [1, 1] : memref<4x32xf32> to memref<2x32xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: %5 = scf.for %arg7 = %c0 to %c32 step %c16 iter_args(%arg8 = %subview_3) -> (memref<2x32xf32, strided<[32, 1], offset: ?>>) { -# CHECK-NEXT: %subview_5 = memref.subview %subview_1[0, %arg7] [1, 16] [1, 1] : memref<1x32xf32, strided<[32, 1], offset: ?>> to memref<1x16xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: %subview_6 = memref.subview %arg8[0, %arg7] [2, 16] [1, 1] : memref<2x32xf32, strided<[32, 1], offset: ?>> to memref<2x16xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: %subview_7 = memref.subview %subview_2[0, 0] [1, 1] [1, 1] : memref<2x1xf32, strided<[512, 1], offset: ?>> to memref<1x1xf32, strided<[512, 1], offset: ?>> -# CHECK-NEXT: %subview_8 = memref.subview %subview_6[0, 0] [1, 16] [1, 1] : memref<2x16xf32, strided<[32, 1], offset: ?>> to memref<1x16xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: %6 = vector.transfer_read %subview_7[%c0, %c0], %0 {in_bounds = [true, true]} : memref<1x1xf32, strided<[512, 1], offset: ?>>, vector<1x1xf32> -# CHECK-NEXT: %7 = vector.transfer_read %subview_5[%c0, %c0], %0 {in_bounds = [true, true]} : memref<1x16xf32, strided<[32, 1], offset: ?>>, vector<1x16xf32> -# CHECK-NEXT: %8 = vector.transfer_read %subview_8[%c0, %c0], %0 {in_bounds = [true, true]} : memref<1x16xf32, strided<[32, 1], offset: ?>>, vector<1x16xf32> -# CHECK-NEXT: %9 = vector.extract %7[0] : vector<16xf32> from vector<1x16xf32> -# CHECK-NEXT: %10 = vector.extract %6[0, 0] : f32 from vector<1x1xf32> -# CHECK-NEXT: %11 = vector.broadcast %10 : f32 to vector<16xf32> -# CHECK-NEXT: %12 = vector.extract %8[0] : vector<16xf32> from vector<1x16xf32> -# CHECK-NEXT: %13 = vector.fma %11, %9, %12 : vector<16xf32> -# CHECK-NEXT: %14 = vector.insert %13, %cst [0] : vector<16xf32> into vector<1x16xf32> -# CHECK-NEXT: vector.transfer_write %14, %subview_8[%c0, %c0] {in_bounds = [true, true]} : vector<1x16xf32>, memref<1x16xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: %subview_9 = memref.subview %subview_6[0, 0] [1, 16] [1, 1] : memref<2x16xf32, strided<[32, 1], offset: ?>> to memref<1x16xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: memref.copy %subview_8, %subview_9 : memref<1x16xf32, strided<[32, 1], offset: ?>> to memref<1x16xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: %subview_10 = memref.subview %subview_2[1, 0] [1, 1] [1, 1] : memref<2x1xf32, strided<[512, 1], offset: ?>> to memref<1x1xf32, strided<[512, 1], offset: ?>> -# CHECK-NEXT: %subview_11 = memref.subview %subview_6[1, 0] [1, 16] [1, 1] : memref<2x16xf32, strided<[32, 1], offset: ?>> to memref<1x16xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: %15 = vector.transfer_read %subview_10[%c0, %c0], %0 {in_bounds = [true, true]} : memref<1x1xf32, strided<[512, 1], offset: ?>>, vector<1x1xf32> -# CHECK-NEXT: %16 = vector.transfer_read %subview_11[%c0, %c0], %0 {in_bounds = [true, true]} : memref<1x16xf32, strided<[32, 1], offset: ?>>, vector<1x16xf32> -# CHECK-NEXT: %17 = vector.extract %7[0] : vector<16xf32> from vector<1x16xf32> -# CHECK-NEXT: %18 = vector.extract %15[0, 0] : f32 from vector<1x1xf32> -# CHECK-NEXT: %19 = vector.broadcast %18 : f32 to vector<16xf32> -# CHECK-NEXT: %20 = vector.extract %16[0] : vector<16xf32> from vector<1x16xf32> -# CHECK-NEXT: %21 = vector.fma %19, %17, %20 : vector<16xf32> -# CHECK-NEXT: %22 = vector.insert %21, %cst [0] : vector<16xf32> into vector<1x16xf32> -# CHECK-NEXT: vector.transfer_write %22, %subview_11[%c0, %c0] {in_bounds = [true, true]} : vector<1x16xf32>, memref<1x16xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: %subview_12 = memref.subview %subview_6[1, 0] [1, 16] [1, 1] : memref<2x16xf32, strided<[32, 1], offset: ?>> to memref<1x16xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: memref.copy %subview_11, %subview_12 : memref<1x16xf32, strided<[32, 1], offset: ?>> to memref<1x16xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: %subview_13 = memref.subview %arg8[0, %arg7] [2, 16] [1, 1] : memref<2x32xf32, strided<[32, 1], offset: ?>> to memref<2x16xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: memref.copy %subview_6, %subview_13 : memref<2x16xf32, strided<[32, 1], offset: ?>> to memref<2x16xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: scf.yield %arg8 : memref<2x32xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: } {"./j"} -# CHECK-NEXT: %subview_4 = memref.subview %arg6[%arg5, 0] [2, 32] [1, 1] : memref<4x32xf32> to memref<2x32xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: memref.copy %5, %subview_4 : memref<2x32xf32, strided<[32, 1], offset: ?>> to memref<2x32xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: scf.yield %arg6 : memref<4x32xf32> -# CHECK-NEXT: } {"./i"} -# CHECK-NEXT: scf.yield %4 : memref<4x32xf32> -# CHECK-NEXT: } {"./k"} -# CHECK-NEXT: %3 = scf.for %arg3 = %c0 to %c4 step %c1 iter_args(%arg4 = %arg2) -> (memref<4x32xf32>) { -# CHECK-NEXT: %subview = memref.subview %2[%arg3, 0] [1, 32] [1, 1] : memref<4x32xf32> to memref<1x32xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: %subview_1 = memref.subview %arg4[%arg3, 0] [1, 32] [1, 1] : memref<4x32xf32> to memref<1x32xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: linalg.generic {indexing_maps = [#map, #map1, #map], iterator_types = ["parallel", "parallel"]} ins(%subview, %cst_0 : memref<1x32xf32, strided<[32, 1], offset: ?>>, f32) outs(%subview_1 : memref<1x32xf32, strided<[32, 1], offset: ?>>) attrs = {__xtc_id_relu_} { -# CHECK-NEXT: ^bb0(%in: f32, %in_3: f32, %out: f32): -# CHECK-NEXT: %4 = arith.maximumf %in, %in_3 : f32 -# CHECK-NEXT: linalg.yield %4 : f32 -# CHECK-NEXT: } -# CHECK-NEXT: %subview_2 = memref.subview %arg4[%arg3, 0] [1, 32] [1, 1] : memref<4x32xf32> to memref<1x32xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: memref.copy %subview_1, %subview_2 : memref<1x32xf32, strided<[32, 1], offset: ?>> to memref<1x32xf32, strided<[32, 1], offset: ?>> -# CHECK-NEXT: scf.yield %arg4 : memref<4x32xf32> -# CHECK-NEXT: } {"./i"} -# CHECK-NEXT: memref.copy %3, %arg2 : memref<4x32xf32> to memref<4x32xf32> -# CHECK-NEXT: return -# CHECK-NEXT: } -# CHECK-NEXT: } +# CHECK-NEXT: // -----// IR Dump After Tensor Lowering //----- // +# CHECK-NEXT: #map = affine_map<(d0, d1) -> (d0, d1)> +# CHECK-NEXT: #map1 = affine_map<(d0, d1) -> ()> +# CHECK-NEXT: module attributes {transform.with_named_sequence} { +# CHECK-NEXT: func.func @matmul_relu(%arg0: memref<4x512xf32> {llvm.noalias}, %arg1: memref<512x32xf32> {llvm.noalias}, %arg2: memref<4x32xf32> {llvm.noalias}) { +# CHECK-NEXT: %cst = arith.constant dense<0.000000e+00> : vector<1x16xf32> +# CHECK-NEXT: %0 = ub.poison : f32 +# CHECK-NEXT: %c16 = arith.constant 16 : index +# CHECK-NEXT: %c2 = arith.constant 2 : index +# CHECK-NEXT: %c512 = arith.constant 512 : index +# CHECK-NEXT: %c32 = arith.constant 32 : index +# CHECK-NEXT: %c1 = arith.constant 1 : index +# CHECK-NEXT: %c4 = arith.constant 4 : index +# CHECK-NEXT: %c0 = arith.constant 0 : index +# CHECK-NEXT: %cst_0 = arith.constant 0.000000e+00 : f32 +# CHECK-NEXT: %alloca = memref.alloca() {alignment = 256 : i64} : memref<4x32xf32> +# CHECK-NEXT: %1 = scf.for %arg3 = %c0 to %c4 step %c1 iter_args(%arg4 = %alloca) -> (memref<4x32xf32>) { +# CHECK-NEXT: %subview = memref.subview %arg4[%arg3, 0] [1, 32] [1, 1] : memref<4x32xf32> to memref<1x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: %4 = scf.for %arg5 = %c0 to %c32 step %c1 iter_args(%arg6 = %subview) -> (memref<1x32xf32, strided<[32, 1], offset: ?>>) { +# CHECK-NEXT: %subview_2 = memref.subview %arg6[0, %arg5] [1, 1] [1, 1] : memref<1x32xf32, strided<[32, 1], offset: ?>> to memref<1x1xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: linalg.fill {__xtc_id_matmul_0_} ins(%cst_0 : f32) outs(%subview_2 : memref<1x1xf32, strided<[32, 1], offset: ?>>) +# CHECK-NEXT: %subview_3 = memref.subview %arg6[0, %arg5] [1, 1] [1, 1] : memref<1x32xf32, strided<[32, 1], offset: ?>> to memref<1x1xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: memref.copy %subview_2, %subview_3 : memref<1x1xf32, strided<[32, 1], offset: ?>> to memref<1x1xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: scf.yield %arg6 : memref<1x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: } {"./j"} +# CHECK-NEXT: %subview_1 = memref.subview %arg4[%arg3, 0] [1, 32] [1, 1] : memref<4x32xf32> to memref<1x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: memref.copy %4, %subview_1 : memref<1x32xf32, strided<[32, 1], offset: ?>> to memref<1x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: scf.yield %arg4 : memref<4x32xf32> +# CHECK-NEXT: } {"./i"} +# CHECK-NEXT: %2 = scf.for %arg3 = %c0 to %c512 step %c1 iter_args(%arg4 = %1) -> (memref<4x32xf32>) { +# CHECK-NEXT: %subview = memref.subview %arg0[0, %arg3] [4, 1] [1, 1] : memref<4x512xf32> to memref<4x1xf32, strided<[512, 1], offset: ?>> +# CHECK-NEXT: %subview_1 = memref.subview %arg1[%arg3, 0] [1, 32] [1, 1] : memref<512x32xf32> to memref<1x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: %4 = scf.for %arg5 = %c0 to %c4 step %c2 iter_args(%arg6 = %arg4) -> (memref<4x32xf32>) { +# CHECK-NEXT: %subview_2 = memref.subview %subview[%arg5, 0] [2, 1] [1, 1] : memref<4x1xf32, strided<[512, 1], offset: ?>> to memref<2x1xf32, strided<[512, 1], offset: ?>> +# CHECK-NEXT: %subview_3 = memref.subview %arg6[%arg5, 0] [2, 32] [1, 1] : memref<4x32xf32> to memref<2x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: %5 = scf.for %arg7 = %c0 to %c32 step %c16 iter_args(%arg8 = %subview_3) -> (memref<2x32xf32, strided<[32, 1], offset: ?>>) { +# CHECK-NEXT: %subview_5 = memref.subview %subview_1[0, %arg7] [1, 16] [1, 1] : memref<1x32xf32, strided<[32, 1], offset: ?>> to memref<1x16xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: %subview_6 = memref.subview %arg8[0, %arg7] [2, 16] [1, 1] : memref<2x32xf32, strided<[32, 1], offset: ?>> to memref<2x16xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: %subview_7 = memref.subview %subview_2[0, 0] [1, 1] [1, 1] : memref<2x1xf32, strided<[512, 1], offset: ?>> to memref<1x1xf32, strided<[512, 1], offset: ?>> +# CHECK-NEXT: %subview_8 = memref.subview %subview_6[0, 0] [1, 16] [1, 1] : memref<2x16xf32, strided<[32, 1], offset: ?>> to memref<1x16xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: %6 = vector.transfer_read %subview_7[%c0, %c0], %0 {in_bounds = [true, true]} : memref<1x1xf32, strided<[512, 1], offset: ?>>, vector<1x1xf32> +# CHECK-NEXT: %7 = vector.transfer_read %subview_5[%c0, %c0], %0 {in_bounds = [true, true]} : memref<1x16xf32, strided<[32, 1], offset: ?>>, vector<1x16xf32> +# CHECK-NEXT: %8 = vector.transfer_read %subview_8[%c0, %c0], %0 {in_bounds = [true, true]} : memref<1x16xf32, strided<[32, 1], offset: ?>>, vector<1x16xf32> +# CHECK-NEXT: %9 = vector.extract %7[0] : vector<16xf32> from vector<1x16xf32> +# CHECK-NEXT: %10 = vector.extract %6[0, 0] : f32 from vector<1x1xf32> +# CHECK-NEXT: %11 = vector.broadcast %10 : f32 to vector<16xf32> +# CHECK-NEXT: %12 = vector.extract %8[0] : vector<16xf32> from vector<1x16xf32> +# CHECK-NEXT: %13 = vector.fma %11, %9, %12 : vector<16xf32> +# CHECK-NEXT: %14 = vector.insert %13, %cst [0] : vector<16xf32> into vector<1x16xf32> +# CHECK-NEXT: vector.transfer_write %14, %subview_8[%c0, %c0] {in_bounds = [true, true]} : vector<1x16xf32>, memref<1x16xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: %subview_9 = memref.subview %subview_6[0, 0] [1, 16] [1, 1] : memref<2x16xf32, strided<[32, 1], offset: ?>> to memref<1x16xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: memref.copy %subview_8, %subview_9 : memref<1x16xf32, strided<[32, 1], offset: ?>> to memref<1x16xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: %subview_10 = memref.subview %subview_2[1, 0] [1, 1] [1, 1] : memref<2x1xf32, strided<[512, 1], offset: ?>> to memref<1x1xf32, strided<[512, 1], offset: ?>> +# CHECK-NEXT: %subview_11 = memref.subview %subview_6[1, 0] [1, 16] [1, 1] : memref<2x16xf32, strided<[32, 1], offset: ?>> to memref<1x16xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: %15 = vector.transfer_read %subview_10[%c0, %c0], %0 {in_bounds = [true, true]} : memref<1x1xf32, strided<[512, 1], offset: ?>>, vector<1x1xf32> +# CHECK-NEXT: %16 = vector.transfer_read %subview_11[%c0, %c0], %0 {in_bounds = [true, true]} : memref<1x16xf32, strided<[32, 1], offset: ?>>, vector<1x16xf32> +# CHECK-NEXT: %17 = vector.extract %7[0] : vector<16xf32> from vector<1x16xf32> +# CHECK-NEXT: %18 = vector.extract %15[0, 0] : f32 from vector<1x1xf32> +# CHECK-NEXT: %19 = vector.broadcast %18 : f32 to vector<16xf32> +# CHECK-NEXT: %20 = vector.extract %16[0] : vector<16xf32> from vector<1x16xf32> +# CHECK-NEXT: %21 = vector.fma %19, %17, %20 : vector<16xf32> +# CHECK-NEXT: %22 = vector.insert %21, %cst [0] : vector<16xf32> into vector<1x16xf32> +# CHECK-NEXT: vector.transfer_write %22, %subview_11[%c0, %c0] {in_bounds = [true, true]} : vector<1x16xf32>, memref<1x16xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: %subview_12 = memref.subview %subview_6[1, 0] [1, 16] [1, 1] : memref<2x16xf32, strided<[32, 1], offset: ?>> to memref<1x16xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: memref.copy %subview_11, %subview_12 : memref<1x16xf32, strided<[32, 1], offset: ?>> to memref<1x16xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: %subview_13 = memref.subview %arg8[0, %arg7] [2, 16] [1, 1] : memref<2x32xf32, strided<[32, 1], offset: ?>> to memref<2x16xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: memref.copy %subview_6, %subview_13 : memref<2x16xf32, strided<[32, 1], offset: ?>> to memref<2x16xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: scf.yield %arg8 : memref<2x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: } {"./j"} +# CHECK-NEXT: %subview_4 = memref.subview %arg6[%arg5, 0] [2, 32] [1, 1] : memref<4x32xf32> to memref<2x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: memref.copy %5, %subview_4 : memref<2x32xf32, strided<[32, 1], offset: ?>> to memref<2x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: scf.yield %arg6 : memref<4x32xf32> +# CHECK-NEXT: } {"./i"} +# CHECK-NEXT: scf.yield %4 : memref<4x32xf32> +# CHECK-NEXT: } {"./k"} +# CHECK-NEXT: %3 = scf.for %arg3 = %c0 to %c4 step %c1 iter_args(%arg4 = %arg2) -> (memref<4x32xf32>) { +# CHECK-NEXT: %subview = memref.subview %2[%arg3, 0] [1, 32] [1, 1] : memref<4x32xf32> to memref<1x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: %subview_1 = memref.subview %arg4[%arg3, 0] [1, 32] [1, 1] : memref<4x32xf32> to memref<1x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: linalg.generic {indexing_maps = [#map, #map1, #map], iterator_types = ["parallel", "parallel"]} ins(%subview, %cst_0 : memref<1x32xf32, strided<[32, 1], offset: ?>>, f32) outs(%subview_1 : memref<1x32xf32, strided<[32, 1], offset: ?>>) attrs = {__xtc_id_relu_} { +# CHECK-NEXT: ^bb0(%in: f32, %in_3: f32, %out: f32): +# CHECK-NEXT: %4 = arith.maximumf %in, %in_3 : f32 +# CHECK-NEXT: linalg.yield %4 : f32 +# CHECK-NEXT: } +# CHECK-NEXT: %subview_2 = memref.subview %arg4[%arg3, 0] [1, 32] [1, 1] : memref<4x32xf32> to memref<1x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: memref.copy %subview_1, %subview_2 : memref<1x32xf32, strided<[32, 1], offset: ?>> to memref<1x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: scf.yield %arg4 : memref<4x32xf32> +# CHECK-NEXT: } {"./i"} +# CHECK-NEXT: memref.copy %3, %arg2 : memref<4x32xf32> to memref<4x32xf32> +# CHECK-NEXT: return +# CHECK-NEXT: } +# CHECK-NEXT: } # CHECK-NEXT: -# CHECK-NEXT: graph: -# CHECK-NEXT: name: matmul_relu -# CHECK-NEXT: inputs: -# CHECK-NEXT: - %0 : 4x512xfloat32 -# CHECK-NEXT: - %1 : 512x32xfloat32 -# CHECK-NEXT: outputs: -# CHECK-NEXT: - %3 : 4x32xfloat32 -# CHECK-NEXT: nodes: -# CHECK-NEXT: - %2: matmul(%0, %1) {name = 'matmul'} : [4x512xfloat32, 512x32xfloat32] -> [4x32xfloat32] -# CHECK-NEXT: - %3: relu(%2) {name = 'relu'} : [4x32xfloat32] -> [4x32xfloat32] +# CHECK-NEXT: graph: +# CHECK-NEXT: name: matmul_relu +# CHECK-NEXT: inputs: +# CHECK-NEXT: - %0 : 4x512xfloat32 +# CHECK-NEXT: - %1 : 512x32xfloat32 +# CHECK-NEXT: outputs: +# CHECK-NEXT: - %3 : 4x32xfloat32 +# CHECK-NEXT: nodes: +# CHECK-NEXT: - %2: matmul(%0, %1) {name = 'matmul'} : [4x512xfloat32, 512x32xfloat32] -> [4x32xfloat32] +# CHECK-NEXT: - %3: relu(%2) {name = 'relu'} : [4x32xfloat32] -> [4x32xfloat32] # CHECK-NEXT: -# CHECK-NEXT: CODE: 0 +# CHECK-NEXT: CODE: 0 diff --git a/tests/filecheck/backends/tensor_dialect/test_matmul_relu_mlir_tensor_fused.py b/tests/filecheck/backends/tensor_dialect/test_matmul_relu_mlir_tensor_fused.py new file mode 100644 index 000000000..6e7d99662 --- /dev/null +++ b/tests/filecheck/backends/tensor_dialect/test_matmul_relu_mlir_tensor_fused.py @@ -0,0 +1,243 @@ +# RUN: python %s 2>&1 | filecheck %s +# UNSUPPORTED: mlir-target=nvgpu + +import xtc.graphs.xtc.op as O +from xtc.backends.mlir import Backend + +I, J, K, dtype = 4, 32, 512, "float32" +a = O.tensor((I, K), dtype, name="A") +b = O.tensor((K, J), dtype, name="B") + +with O.graph(name="matmul_relu") as gb: + m = O.matmul(a, b, name="matmul") + O.relu(m, name="relu") + +graph = gb.graph +print(graph) + +impl = Backend(graph, use_tensor_dialect=True) + +sch = impl.get_scheduler(default_node="matmul") +sch.fuse_consumer_at("j","relu") +sched = sch.schedule() + +comp = impl.get_compiler( + shared_lib=True, + dump_file="matmul_relu_mlir_tensor", + print_source_ir=True, + print_transformed_ir=True, + print_bufferization_ir=True, +) +module = comp.compile(sched) +executor = module.get_executor(validate=True) +res = executor.execute() +print(f"CODE: {res}") + +# CHECK: // -----// IR Dump Before transform //----- // +# CHECK-NEXT: #map = affine_map<(d0, d1) -> (d0, d1)> +# CHECK-NEXT: #map1 = affine_map<(d0, d1) -> ()> +# CHECK-NEXT: module attributes {transform.with_named_sequence} { +# CHECK-NEXT: func.func @matmul_relu(%arg0: tensor<4x512xf32> {llvm.noalias}, %arg1: tensor<512x32xf32> {llvm.noalias}, %arg2: memref<4x32xf32> {llvm.noalias}) { +# CHECK-NEXT: %0 = tensor.empty() : tensor<4x32xf32> +# CHECK-NEXT: %cst = arith.constant 0.000000e+00 : f32 +# CHECK-NEXT: %1 = linalg.fill {__xtc_id_matmul_0_} ins(%cst : f32) outs(%0 : tensor<4x32xf32>) -> tensor<4x32xf32> +# CHECK-NEXT: %2 = linalg.matmul {__xtc_id_matmul_} ins(%arg0, %arg1 : tensor<4x512xf32>, tensor<512x32xf32>) outs(%1 : tensor<4x32xf32>) -> tensor<4x32xf32> +# CHECK-NEXT: %3 = tensor.empty() : tensor<4x32xf32> +# CHECK-NEXT: %cst_0 = arith.constant 0.000000e+00 : f32 +# CHECK-NEXT: %4 = linalg.generic {indexing_maps = [#map, #map1, #map], iterator_types = ["parallel", "parallel"]} ins(%2, %cst_0 : tensor<4x32xf32>, f32) outs(%3 : tensor<4x32xf32>) attrs = {__xtc_id_relu_} { +# CHECK-NEXT: ^bb0(%in: f32, %in_1: f32, %out: f32): +# CHECK-NEXT: %5 = arith.maximumf %in, %in_1 : f32 +# CHECK-NEXT: linalg.yield %5 : f32 +# CHECK-NEXT: } -> tensor<4x32xf32> +# CHECK-NEXT: bufferization.materialize_in_destination %4 in restrict writable %arg2 : (tensor<4x32xf32>, memref<4x32xf32>) -> () +# CHECK-NEXT: return +# CHECK-NEXT: } +# CHECK-NEXT: transform.named_sequence @_vecto(%arg0: !transform.any_op {transform.consumed}) { +# CHECK-NEXT: transform.structured.vectorize %arg0 : !transform.any_op +# CHECK-NEXT: transform.yield +# CHECK-NEXT: } +# CHECK-NEXT: transform.named_sequence @_post_bufferize(%arg0: !transform.any_op {transform.readonly}) { +# CHECK-NEXT: transform.yield +# CHECK-NEXT: } +# CHECK-NEXT: transform.named_sequence @__transform_main(%arg0: !transform.any_op {transform.readonly}) { +# CHECK-NEXT: %0 = transform.structured.match attributes {__xtc_id_matmul_0_} in %arg0 : (!transform.any_op) -> !transform.any_op +# CHECK-NEXT: %tiled_linalg_op, %loops = transform.structured.tile_using_for %0 tile_sizes [1, 0] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %loops "./i" : !transform.any_op +# CHECK-NEXT: %tiled_linalg_op_0, %loops_1 = transform.structured.tile_using_for %tiled_linalg_op tile_sizes [0, 1] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %loops_1 "./j" : !transform.any_op +# CHECK-NEXT: %1 = transform.structured.match attributes {__xtc_id_matmul_} in %arg0 : (!transform.any_op) -> !transform.any_op +# CHECK-NEXT: %tiled_linalg_op_2, %loops_3 = transform.structured.tile_using_for %1 tile_sizes [1, 0, 0] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %loops_3 "./i" : !transform.any_op +# CHECK-NEXT: %tiled_linalg_op_4, %loops_5 = transform.structured.tile_using_for %tiled_linalg_op_2 tile_sizes [0, 1, 0] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %loops_5 "./j" : !transform.any_op +# CHECK-NEXT: %tiled_linalg_op_6, %loops_7 = transform.structured.tile_using_for %tiled_linalg_op_4 tile_sizes [0, 0, 1] : (!transform.any_op) -> (!transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %loops_7 "./k" : !transform.any_op +# CHECK-NEXT: %2 = transform.structured.match attributes {__xtc_id_relu_} in %arg0 : (!transform.any_op) -> !transform.any_op +# CHECK-NEXT: %tiled_consumer, %new_loops:2 = transform.xtc.fuse_consumer %2 into %loops_3, %loops_5 : (!transform.any_op, !transform.any_op, !transform.any_op) -> (!transform.any_op, !transform.any_op, !transform.any_op) +# CHECK-NEXT: transform.annotate %new_loops#0 "./i" : !transform.any_op +# CHECK-NEXT: transform.annotate %new_loops#1 "./j" : !transform.any_op +# CHECK-NEXT: transform.yield +# CHECK-NEXT: } +# CHECK-NEXT: } +# CHECK-NEXT: +# CHECK-NEXT: // -----// IR Dump After transform //----- // +# CHECK-NEXT: #map = affine_map<(d0, d1) -> (d0, d1)> +# CHECK-NEXT: #map1 = affine_map<(d0, d1) -> ()> +# CHECK-NEXT: module attributes {transform.with_named_sequence} { +# CHECK-NEXT: func.func @matmul_relu(%arg0: tensor<4x512xf32> {llvm.noalias}, %arg1: tensor<512x32xf32> {llvm.noalias}, %arg2: memref<4x32xf32> {llvm.noalias}) { +# CHECK-NEXT: %0 = tensor.empty() : tensor<4x32xf32> +# CHECK-NEXT: %cst = arith.constant 0.000000e+00 : f32 +# CHECK-NEXT: %c0 = arith.constant 0 : index +# CHECK-NEXT: %c4 = arith.constant 4 : index +# CHECK-NEXT: %c1 = arith.constant 1 : index +# CHECK-NEXT: %1 = scf.for %arg3 = %c0 to %c4 step %c1 iter_args(%arg4 = %0) -> (tensor<4x32xf32>) { +# CHECK-NEXT: %extracted_slice = tensor.extract_slice %arg4[%arg3, 0] [1, 32] [1, 1] : tensor<4x32xf32> to tensor<1x32xf32> +# CHECK-NEXT: %c0_4 = arith.constant 0 : index +# CHECK-NEXT: %c32 = arith.constant 32 : index +# CHECK-NEXT: %c1_5 = arith.constant 1 : index +# CHECK-NEXT: %5 = scf.for %arg5 = %c0_4 to %c32 step %c1_5 iter_args(%arg6 = %extracted_slice) -> (tensor<1x32xf32>) { +# CHECK-NEXT: %extracted_slice_6 = tensor.extract_slice %arg6[0, %arg5] [1, 1] [1, 1] : tensor<1x32xf32> to tensor<1x1xf32> +# CHECK-NEXT: %6 = linalg.fill {__xtc_id_matmul_0_} ins(%cst : f32) outs(%extracted_slice_6 : tensor<1x1xf32>) -> tensor<1x1xf32> +# CHECK-NEXT: %inserted_slice_7 = tensor.insert_slice %6 into %arg6[0, %arg5] [1, 1] [1, 1] : tensor<1x1xf32> into tensor<1x32xf32> +# CHECK-NEXT: scf.yield %inserted_slice_7 : tensor<1x32xf32> +# CHECK-NEXT: } {"./j"} +# CHECK-NEXT: %inserted_slice = tensor.insert_slice %5 into %arg4[%arg3, 0] [1, 32] [1, 1] : tensor<1x32xf32> into tensor<4x32xf32> +# CHECK-NEXT: scf.yield %inserted_slice : tensor<4x32xf32> +# CHECK-NEXT: } {"./i"} +# CHECK-NEXT: %c0_0 = arith.constant 0 : index +# CHECK-NEXT: %c4_1 = arith.constant 4 : index +# CHECK-NEXT: %c1_2 = arith.constant 1 : index +# CHECK-NEXT: %2 = tensor.empty() : tensor<4x32xf32> +# CHECK-NEXT: %cst_3 = arith.constant 0.000000e+00 : f32 +# CHECK-NEXT: %3:2 = scf.for %arg3 = %c0_0 to %c4_1 step %c1_2 iter_args(%arg4 = %1, %arg5 = %2) -> (tensor<4x32xf32>, tensor<4x32xf32>) { +# CHECK-NEXT: %extracted_slice = tensor.extract_slice %arg0[%arg3, 0] [1, 512] [1, 1] : tensor<4x512xf32> to tensor<1x512xf32> +# CHECK-NEXT: %extracted_slice_4 = tensor.extract_slice %arg1[0, 0] [512, 32] [1, 1] : tensor<512x32xf32> to tensor<512x32xf32> +# CHECK-NEXT: %extracted_slice_5 = tensor.extract_slice %arg4[%arg3, 0] [1, 32] [1, 1] : tensor<4x32xf32> to tensor<1x32xf32> +# CHECK-NEXT: %c0_6 = arith.constant 0 : index +# CHECK-NEXT: %c32 = arith.constant 32 : index +# CHECK-NEXT: %c1_7 = arith.constant 1 : index +# CHECK-NEXT: %extracted_slice_8 = tensor.extract_slice %arg5[%arg3, 0] [1, 32] [1, 1] : tensor<4x32xf32> to tensor<1x32xf32> +# CHECK-NEXT: %5:2 = scf.for %arg6 = %c0_6 to %c32 step %c1_7 iter_args(%arg7 = %extracted_slice_5, %arg8 = %extracted_slice_8) -> (tensor<1x32xf32>, tensor<1x32xf32>) { +# CHECK-NEXT: %extracted_slice_10 = tensor.extract_slice %extracted_slice[0, 0] [1, 512] [1, 1] : tensor<1x512xf32> to tensor<1x512xf32> +# CHECK-NEXT: %extracted_slice_11 = tensor.extract_slice %extracted_slice_4[0, %arg6] [512, 1] [1, 1] : tensor<512x32xf32> to tensor<512x1xf32> +# CHECK-NEXT: %extracted_slice_12 = tensor.extract_slice %arg7[0, %arg6] [1, 1] [1, 1] : tensor<1x32xf32> to tensor<1x1xf32> +# CHECK-NEXT: %c0_13 = arith.constant 0 : index +# CHECK-NEXT: %c512 = arith.constant 512 : index +# CHECK-NEXT: %c1_14 = arith.constant 1 : index +# CHECK-NEXT: %7 = scf.for %arg9 = %c0_13 to %c512 step %c1_14 iter_args(%arg10 = %extracted_slice_12) -> (tensor<1x1xf32>) { +# CHECK-NEXT: %extracted_slice_18 = tensor.extract_slice %extracted_slice_10[0, %arg9] [1, 1] [1, 1] : tensor<1x512xf32> to tensor<1x1xf32> +# CHECK-NEXT: %extracted_slice_19 = tensor.extract_slice %extracted_slice_11[%arg9, 0] [1, 1] [1, 1] : tensor<512x1xf32> to tensor<1x1xf32> +# CHECK-NEXT: %extracted_slice_20 = tensor.extract_slice %arg10[0, 0] [1, 1] [1, 1] : tensor<1x1xf32> to tensor<1x1xf32> +# CHECK-NEXT: %9 = linalg.matmul {__xtc_id_matmul_} ins(%extracted_slice_18, %extracted_slice_19 : tensor<1x1xf32>, tensor<1x1xf32>) outs(%extracted_slice_20 : tensor<1x1xf32>) -> tensor<1x1xf32> +# CHECK-NEXT: %inserted_slice_21 = tensor.insert_slice %9 into %arg10[0, 0] [1, 1] [1, 1] : tensor<1x1xf32> into tensor<1x1xf32> +# CHECK-NEXT: scf.yield %inserted_slice_21 : tensor<1x1xf32> +# CHECK-NEXT: } {"./k"} +# CHECK-NEXT: %extracted_slice_15 = tensor.extract_slice %arg8[0, %arg6] [1, 1] [1, 1] : tensor<1x32xf32> to tensor<1x1xf32> +# CHECK-NEXT: %8 = linalg.generic {indexing_maps = [#map, #map1, #map], iterator_types = ["parallel", "parallel"]} ins(%7, %cst_3 : tensor<1x1xf32>, f32) outs(%extracted_slice_15 : tensor<1x1xf32>) attrs = {__xtc_id_relu_} { +# CHECK-NEXT: ^bb0(%in: f32, %in_18: f32, %out: f32): +# CHECK-NEXT: %9 = arith.maximumf %in, %in_18 : f32 +# CHECK-NEXT: linalg.yield %9 : f32 +# CHECK-NEXT: } -> tensor<1x1xf32> +# CHECK-NEXT: %inserted_slice_16 = tensor.insert_slice %7 into %arg7[0, %arg6] [1, 1] [1, 1] : tensor<1x1xf32> into tensor<1x32xf32> +# CHECK-NEXT: %inserted_slice_17 = tensor.insert_slice %8 into %arg8[0, %arg6] [1, 1] [1, 1] : tensor<1x1xf32> into tensor<1x32xf32> +# CHECK-NEXT: scf.yield %inserted_slice_16, %inserted_slice_17 : tensor<1x32xf32>, tensor<1x32xf32> +# CHECK-NEXT: } {"./j"} +# CHECK-NEXT: %6 = linalg.generic {indexing_maps = [#map, #map1, #map], iterator_types = ["parallel", "parallel"]} ins(%5#0, %cst_3 : tensor<1x32xf32>, f32) outs(%extracted_slice_8 : tensor<1x32xf32>) attrs = {__xtc_id_relu_} { +# CHECK-NEXT: ^bb0(%in: f32, %in_10: f32, %out: f32): +# CHECK-NEXT: %7 = arith.maximumf %in, %in_10 : f32 +# CHECK-NEXT: linalg.yield %7 : f32 +# CHECK-NEXT: } -> tensor<1x32xf32> +# CHECK-NEXT: %inserted_slice = tensor.insert_slice %5#0 into %arg4[%arg3, 0] [1, 32] [1, 1] : tensor<1x32xf32> into tensor<4x32xf32> +# CHECK-NEXT: %inserted_slice_9 = tensor.insert_slice %5#1 into %arg5[%arg3, 0] [1, 32] [1, 1] : tensor<1x32xf32> into tensor<4x32xf32> +# CHECK-NEXT: scf.yield %inserted_slice, %inserted_slice_9 : tensor<4x32xf32>, tensor<4x32xf32> +# CHECK-NEXT: } {"./i"} +# CHECK-NEXT: %4 = linalg.generic {indexing_maps = [#map, #map1, #map], iterator_types = ["parallel", "parallel"]} ins(%3#0, %cst_3 : tensor<4x32xf32>, f32) outs(%2 : tensor<4x32xf32>) attrs = {__xtc_id_relu_} { +# CHECK-NEXT: ^bb0(%in: f32, %in_4: f32, %out: f32): +# CHECK-NEXT: %5 = arith.maximumf %in, %in_4 : f32 +# CHECK-NEXT: linalg.yield %5 : f32 +# CHECK-NEXT: } -> tensor<4x32xf32> +# CHECK-NEXT: bufferization.materialize_in_destination %3#1 in restrict writable %arg2 : (tensor<4x32xf32>, memref<4x32xf32>) -> () +# CHECK-NEXT: return +# CHECK-NEXT: } +# CHECK-NEXT: transform.named_sequence @_vecto(%arg0: !transform.any_op {transform.consumed}) { +# CHECK-NEXT: transform.structured.vectorize %arg0 : !transform.any_op +# CHECK-NEXT: transform.yield +# CHECK-NEXT: } +# CHECK-NEXT: transform.named_sequence @_post_bufferize(%arg0: !transform.any_op {transform.readonly}) { +# CHECK-NEXT: transform.yield +# CHECK-NEXT: } +# CHECK-NEXT: } +# CHECK-NEXT: +# CHECK-NEXT: // -----// IR Dump After Tensor Lowering //----- // +# CHECK-NEXT: #map = affine_map<(d0, d1) -> (d0, d1)> +# CHECK-NEXT: #map1 = affine_map<(d0, d1) -> ()> +# CHECK-NEXT: module attributes {transform.with_named_sequence} { +# CHECK-NEXT: func.func @matmul_relu(%arg0: memref<4x512xf32> {llvm.noalias}, %arg1: memref<512x32xf32> {llvm.noalias}, %arg2: memref<4x32xf32> {llvm.noalias}) { +# CHECK-NEXT: %c512 = arith.constant 512 : index +# CHECK-NEXT: %c32 = arith.constant 32 : index +# CHECK-NEXT: %c1 = arith.constant 1 : index +# CHECK-NEXT: %c4 = arith.constant 4 : index +# CHECK-NEXT: %c0 = arith.constant 0 : index +# CHECK-NEXT: %cst = arith.constant 0.000000e+00 : f32 +# CHECK-NEXT: %alloca = memref.alloca() {alignment = 256 : i64} : memref<4x32xf32> +# CHECK-NEXT: %0 = scf.for %arg3 = %c0 to %c4 step %c1 iter_args(%arg4 = %alloca) -> (memref<4x32xf32>) { +# CHECK-NEXT: %subview = memref.subview %arg4[%arg3, 0] [1, 32] [1, 1] : memref<4x32xf32> to memref<1x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: %2 = scf.for %arg5 = %c0 to %c32 step %c1 iter_args(%arg6 = %subview) -> (memref<1x32xf32, strided<[32, 1], offset: ?>>) { +# CHECK-NEXT: %subview_1 = memref.subview %arg6[0, %arg5] [1, 1] [1, 1] : memref<1x32xf32, strided<[32, 1], offset: ?>> to memref<1x1xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: linalg.fill {__xtc_id_matmul_0_} ins(%cst : f32) outs(%subview_1 : memref<1x1xf32, strided<[32, 1], offset: ?>>) +# CHECK-NEXT: %subview_2 = memref.subview %arg6[0, %arg5] [1, 1] [1, 1] : memref<1x32xf32, strided<[32, 1], offset: ?>> to memref<1x1xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: memref.copy %subview_1, %subview_2 : memref<1x1xf32, strided<[32, 1], offset: ?>> to memref<1x1xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: scf.yield %arg6 : memref<1x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: } {"./j"} +# CHECK-NEXT: %subview_0 = memref.subview %arg4[%arg3, 0] [1, 32] [1, 1] : memref<4x32xf32> to memref<1x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: memref.copy %2, %subview_0 : memref<1x32xf32, strided<[32, 1], offset: ?>> to memref<1x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: scf.yield %arg4 : memref<4x32xf32> +# CHECK-NEXT: } {"./i"} +# CHECK-NEXT: %1:2 = scf.for %arg3 = %c0 to %c4 step %c1 iter_args(%arg4 = %0, %arg5 = %arg2) -> (memref<4x32xf32>, memref<4x32xf32>) { +# CHECK-NEXT: %subview = memref.subview %arg0[%arg3, 0] [1, 512] [1, 1] : memref<4x512xf32> to memref<1x512xf32, strided<[512, 1], offset: ?>> +# CHECK-NEXT: %subview_0 = memref.subview %arg4[%arg3, 0] [1, 32] [1, 1] : memref<4x32xf32> to memref<1x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: %subview_1 = memref.subview %arg5[%arg3, 0] [1, 32] [1, 1] : memref<4x32xf32> to memref<1x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: %2:2 = scf.for %arg6 = %c0 to %c32 step %c1 iter_args(%arg7 = %subview_0, %arg8 = %subview_1) -> (memref<1x32xf32, strided<[32, 1], offset: ?>>, memref<1x32xf32, strided<[32, 1], offset: ?>>) { +# CHECK-NEXT: %subview_4 = memref.subview %arg1[0, %arg6] [512, 1] [1, 1] : memref<512x32xf32> to memref<512x1xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: %subview_5 = memref.subview %arg7[0, %arg6] [1, 1] [1, 1] : memref<1x32xf32, strided<[32, 1], offset: ?>> to memref<1x1xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: %3 = scf.for %arg9 = %c0 to %c512 step %c1 iter_args(%arg10 = %subview_5) -> (memref<1x1xf32, strided<[32, 1], offset: ?>>) { +# CHECK-NEXT: %subview_9 = memref.subview %subview[0, %arg9] [1, 1] [1, 1] : memref<1x512xf32, strided<[512, 1], offset: ?>> to memref<1x1xf32, strided<[512, 1], offset: ?>> +# CHECK-NEXT: %subview_10 = memref.subview %subview_4[%arg9, 0] [1, 1] [1, 1] : memref<512x1xf32, strided<[32, 1], offset: ?>> to memref<1x1xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: linalg.matmul {__xtc_id_matmul_} ins(%subview_9, %subview_10 : memref<1x1xf32, strided<[512, 1], offset: ?>>, memref<1x1xf32, strided<[32, 1], offset: ?>>) outs(%arg10 : memref<1x1xf32, strided<[32, 1], offset: ?>>) +# CHECK-NEXT: scf.yield %arg10 : memref<1x1xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: } {"./k"} +# CHECK-NEXT: %subview_6 = memref.subview %arg8[0, %arg6] [1, 1] [1, 1] : memref<1x32xf32, strided<[32, 1], offset: ?>> to memref<1x1xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: linalg.generic {indexing_maps = [#map, #map1, #map], iterator_types = ["parallel", "parallel"]} ins(%3, %cst : memref<1x1xf32, strided<[32, 1], offset: ?>>, f32) outs(%subview_6 : memref<1x1xf32, strided<[32, 1], offset: ?>>) attrs = {__xtc_id_relu_} { +# CHECK-NEXT: ^bb0(%in: f32, %in_9: f32, %out: f32): +# CHECK-NEXT: %4 = arith.maximumf %in, %in_9 : f32 +# CHECK-NEXT: linalg.yield %4 : f32 +# CHECK-NEXT: } +# CHECK-NEXT: %subview_7 = memref.subview %arg7[0, %arg6] [1, 1] [1, 1] : memref<1x32xf32, strided<[32, 1], offset: ?>> to memref<1x1xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: memref.copy %3, %subview_7 : memref<1x1xf32, strided<[32, 1], offset: ?>> to memref<1x1xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: %subview_8 = memref.subview %arg8[0, %arg6] [1, 1] [1, 1] : memref<1x32xf32, strided<[32, 1], offset: ?>> to memref<1x1xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: memref.copy %subview_6, %subview_8 : memref<1x1xf32, strided<[32, 1], offset: ?>> to memref<1x1xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: scf.yield %arg7, %arg8 : memref<1x32xf32, strided<[32, 1], offset: ?>>, memref<1x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: } {"./j"} +# CHECK-NEXT: %subview_2 = memref.subview %arg4[%arg3, 0] [1, 32] [1, 1] : memref<4x32xf32> to memref<1x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: memref.copy %2#0, %subview_2 : memref<1x32xf32, strided<[32, 1], offset: ?>> to memref<1x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: %subview_3 = memref.subview %arg5[%arg3, 0] [1, 32] [1, 1] : memref<4x32xf32> to memref<1x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: memref.copy %2#1, %subview_3 : memref<1x32xf32, strided<[32, 1], offset: ?>> to memref<1x32xf32, strided<[32, 1], offset: ?>> +# CHECK-NEXT: scf.yield %arg4, %arg5 : memref<4x32xf32>, memref<4x32xf32> +# CHECK-NEXT: } {"./i"} +# CHECK-NEXT: memref.copy %1#1, %arg2 : memref<4x32xf32> to memref<4x32xf32> +# CHECK-NEXT: return +# CHECK-NEXT: } +# CHECK-NEXT: } +# CHECK-NEXT: +# CHECK-NEXT: graph: +# CHECK-NEXT: name: matmul_relu +# CHECK-NEXT: inputs: +# CHECK-NEXT: - %0 : 4x512xfloat32 +# CHECK-NEXT: - %1 : 512x32xfloat32 +# CHECK-NEXT: outputs: +# CHECK-NEXT: - %3 : 4x32xfloat32 +# CHECK-NEXT: nodes: +# CHECK-NEXT: - %2: matmul(%0, %1) {name = 'matmul'} : [4x512xfloat32, 512x32xfloat32] -> [4x32xfloat32] +# CHECK-NEXT: - %3: relu(%2) {name = 'relu'} : [4x32xfloat32] -> [4x32xfloat32] +# CHECK-NEXT: +# CHECK-NEXT: CODE: 0 diff --git a/tests/filecheck/search/test_conv_oo.py b/tests/filecheck/search/test_conv_oo.py index ff036f81f..705ae8814 100644 --- a/tests/filecheck/search/test_conv_oo.py +++ b/tests/filecheck/search/test_conv_oo.py @@ -12,91 +12,91 @@ utils.print_all_opt_schedules(backend, strategy) utils.print_exhaustive_samples(backend, strategy, 100) -# CHECK: schedule O0: [1, 1, 1, 1, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1}, 'h': {'./h1': 1}, 'w': {'./w1': 1}, 'f': {'./f1': 1}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './r', './s', './c', './h', './w', './f', './b1', './r1', './s1', './c1', './h1', './w1', './f1']}, vectorization=['./f1'], parallelization=[], unrolling={'./f1': 1, './w1': 1, './h1': 1, './c1': 1, './s1': 1, './r1': 1, './b1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O1: [1, 1, 1, 1, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1}, 'h': {'./h1': 1}, 'w': {'./w1': 1}, 'f': {'./f1': 1}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './r', './s', './c', './h', './w', './f', './b1', './r1', './s1', './c1', './h1', './w1', './f1']}, vectorization=['./f1'], parallelization=[], unrolling={'./f1': 1, './w1': 1, './h1': 1, './c1': 1, './s1': 1, './r1': 1, './b1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O2: [1, 1, 2, 16, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1}, 'h': {'./h1': 1}, 'w': {'./w1': 2}, 'f': {'./f1': 16}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './r', './s', './c', './h', './w', './f', './b1', './r1', './s1', './c1', './h1', './w1', './f1']}, vectorization=['./f1'], parallelization=[], unrolling={'./f1': 16, './w1': 2, './h1': 1, './c1': 1, './s1': 1, './r1': 1, './b1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O3: [1, 1, 2, 16, 1, 1, 3] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1}, 'h': {'./h1': 1}, 'w': {'./w1': 2}, 'f': {'./f1': 16}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 3}}, permutation={'.': ['./b', './r', './s', './c', './h', './w', './f', './b1', './r1', './s1', './c1', './h1', './w1', './f1']}, vectorization=['./f1'], parallelization=[], unrolling={'./f1': 16, './w1': 2, './h1': 1, './c1': 3, './s1': 1, './r1': 1, './b1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: sample 0: [1, 1, 1, 1, 1, 1, 1] -# CHECK-NEXT: sample 1: [1, 1, 1, 1, 1, 1, 3] -# CHECK-NEXT: sample 2: [1, 1, 1, 1, 1, 7, 1] -# CHECK-NEXT: sample 3: [1, 1, 1, 1, 7, 1, 1] -# CHECK-NEXT: sample 4: [1, 1, 1, 2, 1, 1, 1] -# CHECK-NEXT: sample 5: [1, 1, 1, 2, 1, 1, 3] -# CHECK-NEXT: sample 6: [1, 1, 1, 2, 1, 7, 1] -# CHECK-NEXT: sample 7: [1, 1, 1, 2, 7, 1, 1] -# CHECK-NEXT: sample 8: [1, 1, 1, 4, 1, 1, 1] -# CHECK-NEXT: sample 9: [1, 1, 1, 4, 1, 1, 3] -# CHECK-NEXT: sample 10: [1, 1, 1, 4, 1, 7, 1] -# CHECK-NEXT: sample 11: [1, 1, 1, 4, 7, 1, 1] -# CHECK-NEXT: sample 12: [1, 1, 1, 8, 1, 1, 1] -# CHECK-NEXT: sample 13: [1, 1, 1, 8, 1, 1, 3] -# CHECK-NEXT: sample 14: [1, 1, 1, 8, 1, 7, 1] -# CHECK-NEXT: sample 15: [1, 1, 1, 8, 7, 1, 1] -# CHECK-NEXT: sample 16: [1, 1, 1, 16, 1, 1, 1] -# CHECK-NEXT: sample 17: [1, 1, 1, 16, 1, 1, 3] -# CHECK-NEXT: sample 18: [1, 1, 1, 16, 1, 7, 1] -# CHECK-NEXT: sample 19: [1, 1, 1, 16, 7, 1, 1] -# CHECK-NEXT: sample 20: [1, 1, 1, 32, 1, 1, 1] -# CHECK-NEXT: sample 21: [1, 1, 1, 32, 1, 1, 3] -# CHECK-NEXT: sample 22: [1, 1, 2, 1, 1, 1, 1] -# CHECK-NEXT: sample 23: [1, 1, 2, 1, 1, 1, 3] -# CHECK-NEXT: sample 24: [1, 1, 2, 2, 1, 1, 1] -# CHECK-NEXT: sample 25: [1, 1, 2, 2, 1, 1, 3] -# CHECK-NEXT: sample 26: [1, 1, 2, 4, 1, 1, 1] -# CHECK-NEXT: sample 27: [1, 1, 2, 4, 1, 1, 3] -# CHECK-NEXT: sample 28: [1, 1, 2, 8, 1, 1, 1] -# CHECK-NEXT: sample 29: [1, 1, 2, 8, 1, 1, 3] -# CHECK-NEXT: sample 30: [1, 1, 2, 16, 1, 1, 1] -# CHECK-NEXT: sample 31: [1, 1, 2, 16, 1, 1, 3] -# CHECK-NEXT: sample 32: [1, 1, 2, 32, 1, 1, 1] -# CHECK-NEXT: sample 33: [1, 2, 1, 1, 1, 1, 1] -# CHECK-NEXT: sample 34: [1, 2, 1, 1, 1, 1, 3] -# CHECK-NEXT: sample 35: [1, 2, 1, 2, 1, 1, 1] -# CHECK-NEXT: sample 36: [1, 2, 1, 2, 1, 1, 3] -# CHECK-NEXT: sample 37: [1, 2, 1, 4, 1, 1, 1] -# CHECK-NEXT: sample 38: [1, 2, 1, 4, 1, 1, 3] -# CHECK-NEXT: sample 39: [1, 2, 1, 8, 1, 1, 1] -# CHECK-NEXT: sample 40: [1, 2, 1, 8, 1, 1, 3] -# CHECK-NEXT: sample 41: [1, 2, 1, 16, 1, 1, 1] -# CHECK-NEXT: sample 42: [1, 2, 1, 16, 1, 1, 3] -# CHECK-NEXT: sample 43: [1, 2, 1, 32, 1, 1, 1] -# CHECK-NEXT: sample 44: [1, 2, 2, 1, 1, 1, 1] -# CHECK-NEXT: sample 45: [1, 2, 2, 2, 1, 1, 1] -# CHECK-NEXT: sample 46: [1, 2, 2, 4, 1, 1, 1] -# CHECK-NEXT: sample 47: [1, 2, 2, 8, 1, 1, 1] -# CHECK-NEXT: sample 48: [1, 2, 2, 16, 1, 1, 1] -# CHECK-NEXT: sample 49: [1, 2, 2, 32, 1, 1, 1] -# CHECK-NEXT: sample 50: [2, 1, 1, 1, 1, 1, 1] -# CHECK-NEXT: sample 51: [2, 1, 1, 1, 1, 1, 3] -# CHECK-NEXT: sample 52: [2, 1, 1, 2, 1, 1, 1] -# CHECK-NEXT: sample 53: [2, 1, 1, 2, 1, 1, 3] -# CHECK-NEXT: sample 54: [2, 1, 1, 4, 1, 1, 1] -# CHECK-NEXT: sample 55: [2, 1, 1, 4, 1, 1, 3] -# CHECK-NEXT: sample 56: [2, 1, 1, 8, 1, 1, 1] -# CHECK-NEXT: sample 57: [2, 1, 1, 8, 1, 1, 3] -# CHECK-NEXT: sample 58: [2, 1, 1, 16, 1, 1, 1] -# CHECK-NEXT: sample 59: [2, 1, 1, 16, 1, 1, 3] -# CHECK-NEXT: sample 60: [2, 1, 1, 32, 1, 1, 1] -# CHECK-NEXT: sample 61: [2, 1, 2, 1, 1, 1, 1] -# CHECK-NEXT: sample 62: [2, 1, 2, 2, 1, 1, 1] -# CHECK-NEXT: sample 63: [2, 1, 2, 4, 1, 1, 1] -# CHECK-NEXT: sample 64: [2, 1, 2, 8, 1, 1, 1] -# CHECK-NEXT: sample 65: [2, 1, 2, 16, 1, 1, 1] -# CHECK-NEXT: sample 66: [2, 1, 2, 32, 1, 1, 1] -# CHECK-NEXT: sample 67: [2, 2, 1, 1, 1, 1, 1] -# CHECK-NEXT: sample 68: [2, 2, 1, 2, 1, 1, 1] -# CHECK-NEXT: sample 69: [2, 2, 1, 4, 1, 1, 1] -# CHECK-NEXT: sample 70: [2, 2, 1, 8, 1, 1, 1] -# CHECK-NEXT: sample 71: [2, 2, 1, 16, 1, 1, 1] -# CHECK-NEXT: sample 72: [2, 2, 1, 32, 1, 1, 1] -# CHECK-NEXT: sample 73: [2, 2, 2, 1, 1, 1, 1] -# CHECK-NEXT: sample 74: [2, 2, 2, 2, 1, 1, 1] -# CHECK-NEXT: sample 75: [2, 2, 2, 4, 1, 1, 1] -# CHECK-NEXT: sample 76: [2, 2, 2, 8, 1, 1, 1] -# CHECK-NEXT: sample 77: [2, 2, 2, 16, 1, 1, 1] -# CHECK-NEXT: stats {'filtered': 78, 'all': 384} -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 2}, 'h': {'./h1': 2}, 'w': {'./w1': 2}, 'f': {'./f1': 16}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './r', './s', './c', './h', './w', './f', './b1', './r1', './s1', './c1', './h1', './w1', './f1']}, vectorization=['./f1'], parallelization=[], unrolling={'./f1': 16, './w1': 2, './h1': 2, './c1': 1, './s1': 1, './r1': 1, './b1': 2}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK: schedule O0: [1, 1, 1, 1, 1, 1, 1] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1}, 'h': {'./h1': 1}, 'w': {'./w1': 1}, 'f': {'./f1': 1}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './r', './s', './c', './h', './w', './f', './b1', './r1', './s1', './c1', './h1', './w1', './f1']}, vectorization=['./f1'], parallelization=[], unrolling={'./f1': 1, './w1': 1, './h1': 1, './c1': 1, './s1': 1, './r1': 1, './b1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O1: [1, 1, 1, 1, 1, 1, 1] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1}, 'h': {'./h1': 1}, 'w': {'./w1': 1}, 'f': {'./f1': 1}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './r', './s', './c', './h', './w', './f', './b1', './r1', './s1', './c1', './h1', './w1', './f1']}, vectorization=['./f1'], parallelization=[], unrolling={'./f1': 1, './w1': 1, './h1': 1, './c1': 1, './s1': 1, './r1': 1, './b1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O2: [1, 1, 2, 16, 1, 1, 1] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1}, 'h': {'./h1': 1}, 'w': {'./w1': 2}, 'f': {'./f1': 16}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './r', './s', './c', './h', './w', './f', './b1', './r1', './s1', './c1', './h1', './w1', './f1']}, vectorization=['./f1'], parallelization=[], unrolling={'./f1': 16, './w1': 2, './h1': 1, './c1': 1, './s1': 1, './r1': 1, './b1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O3: [1, 1, 2, 16, 1, 1, 3] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1}, 'h': {'./h1': 1}, 'w': {'./w1': 2}, 'f': {'./f1': 16}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 3}}, permutation={'.': ['./b', './r', './s', './c', './h', './w', './f', './b1', './r1', './s1', './c1', './h1', './w1', './f1']}, vectorization=['./f1'], parallelization=[], unrolling={'./f1': 16, './w1': 2, './h1': 1, './c1': 3, './s1': 1, './r1': 1, './b1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: sample 0: [1, 1, 1, 1, 1, 1, 1] +# CHECK-NEXT: sample 1: [1, 1, 1, 1, 1, 1, 3] +# CHECK-NEXT: sample 2: [1, 1, 1, 1, 1, 7, 1] +# CHECK-NEXT: sample 3: [1, 1, 1, 1, 7, 1, 1] +# CHECK-NEXT: sample 4: [1, 1, 1, 2, 1, 1, 1] +# CHECK-NEXT: sample 5: [1, 1, 1, 2, 1, 1, 3] +# CHECK-NEXT: sample 6: [1, 1, 1, 2, 1, 7, 1] +# CHECK-NEXT: sample 7: [1, 1, 1, 2, 7, 1, 1] +# CHECK-NEXT: sample 8: [1, 1, 1, 4, 1, 1, 1] +# CHECK-NEXT: sample 9: [1, 1, 1, 4, 1, 1, 3] +# CHECK-NEXT: sample 10: [1, 1, 1, 4, 1, 7, 1] +# CHECK-NEXT: sample 11: [1, 1, 1, 4, 7, 1, 1] +# CHECK-NEXT: sample 12: [1, 1, 1, 8, 1, 1, 1] +# CHECK-NEXT: sample 13: [1, 1, 1, 8, 1, 1, 3] +# CHECK-NEXT: sample 14: [1, 1, 1, 8, 1, 7, 1] +# CHECK-NEXT: sample 15: [1, 1, 1, 8, 7, 1, 1] +# CHECK-NEXT: sample 16: [1, 1, 1, 16, 1, 1, 1] +# CHECK-NEXT: sample 17: [1, 1, 1, 16, 1, 1, 3] +# CHECK-NEXT: sample 18: [1, 1, 1, 16, 1, 7, 1] +# CHECK-NEXT: sample 19: [1, 1, 1, 16, 7, 1, 1] +# CHECK-NEXT: sample 20: [1, 1, 1, 32, 1, 1, 1] +# CHECK-NEXT: sample 21: [1, 1, 1, 32, 1, 1, 3] +# CHECK-NEXT: sample 22: [1, 1, 2, 1, 1, 1, 1] +# CHECK-NEXT: sample 23: [1, 1, 2, 1, 1, 1, 3] +# CHECK-NEXT: sample 24: [1, 1, 2, 2, 1, 1, 1] +# CHECK-NEXT: sample 25: [1, 1, 2, 2, 1, 1, 3] +# CHECK-NEXT: sample 26: [1, 1, 2, 4, 1, 1, 1] +# CHECK-NEXT: sample 27: [1, 1, 2, 4, 1, 1, 3] +# CHECK-NEXT: sample 28: [1, 1, 2, 8, 1, 1, 1] +# CHECK-NEXT: sample 29: [1, 1, 2, 8, 1, 1, 3] +# CHECK-NEXT: sample 30: [1, 1, 2, 16, 1, 1, 1] +# CHECK-NEXT: sample 31: [1, 1, 2, 16, 1, 1, 3] +# CHECK-NEXT: sample 32: [1, 1, 2, 32, 1, 1, 1] +# CHECK-NEXT: sample 33: [1, 2, 1, 1, 1, 1, 1] +# CHECK-NEXT: sample 34: [1, 2, 1, 1, 1, 1, 3] +# CHECK-NEXT: sample 35: [1, 2, 1, 2, 1, 1, 1] +# CHECK-NEXT: sample 36: [1, 2, 1, 2, 1, 1, 3] +# CHECK-NEXT: sample 37: [1, 2, 1, 4, 1, 1, 1] +# CHECK-NEXT: sample 38: [1, 2, 1, 4, 1, 1, 3] +# CHECK-NEXT: sample 39: [1, 2, 1, 8, 1, 1, 1] +# CHECK-NEXT: sample 40: [1, 2, 1, 8, 1, 1, 3] +# CHECK-NEXT: sample 41: [1, 2, 1, 16, 1, 1, 1] +# CHECK-NEXT: sample 42: [1, 2, 1, 16, 1, 1, 3] +# CHECK-NEXT: sample 43: [1, 2, 1, 32, 1, 1, 1] +# CHECK-NEXT: sample 44: [1, 2, 2, 1, 1, 1, 1] +# CHECK-NEXT: sample 45: [1, 2, 2, 2, 1, 1, 1] +# CHECK-NEXT: sample 46: [1, 2, 2, 4, 1, 1, 1] +# CHECK-NEXT: sample 47: [1, 2, 2, 8, 1, 1, 1] +# CHECK-NEXT: sample 48: [1, 2, 2, 16, 1, 1, 1] +# CHECK-NEXT: sample 49: [1, 2, 2, 32, 1, 1, 1] +# CHECK-NEXT: sample 50: [2, 1, 1, 1, 1, 1, 1] +# CHECK-NEXT: sample 51: [2, 1, 1, 1, 1, 1, 3] +# CHECK-NEXT: sample 52: [2, 1, 1, 2, 1, 1, 1] +# CHECK-NEXT: sample 53: [2, 1, 1, 2, 1, 1, 3] +# CHECK-NEXT: sample 54: [2, 1, 1, 4, 1, 1, 1] +# CHECK-NEXT: sample 55: [2, 1, 1, 4, 1, 1, 3] +# CHECK-NEXT: sample 56: [2, 1, 1, 8, 1, 1, 1] +# CHECK-NEXT: sample 57: [2, 1, 1, 8, 1, 1, 3] +# CHECK-NEXT: sample 58: [2, 1, 1, 16, 1, 1, 1] +# CHECK-NEXT: sample 59: [2, 1, 1, 16, 1, 1, 3] +# CHECK-NEXT: sample 60: [2, 1, 1, 32, 1, 1, 1] +# CHECK-NEXT: sample 61: [2, 1, 2, 1, 1, 1, 1] +# CHECK-NEXT: sample 62: [2, 1, 2, 2, 1, 1, 1] +# CHECK-NEXT: sample 63: [2, 1, 2, 4, 1, 1, 1] +# CHECK-NEXT: sample 64: [2, 1, 2, 8, 1, 1, 1] +# CHECK-NEXT: sample 65: [2, 1, 2, 16, 1, 1, 1] +# CHECK-NEXT: sample 66: [2, 1, 2, 32, 1, 1, 1] +# CHECK-NEXT: sample 67: [2, 2, 1, 1, 1, 1, 1] +# CHECK-NEXT: sample 68: [2, 2, 1, 2, 1, 1, 1] +# CHECK-NEXT: sample 69: [2, 2, 1, 4, 1, 1, 1] +# CHECK-NEXT: sample 70: [2, 2, 1, 8, 1, 1, 1] +# CHECK-NEXT: sample 71: [2, 2, 1, 16, 1, 1, 1] +# CHECK-NEXT: sample 72: [2, 2, 1, 32, 1, 1, 1] +# CHECK-NEXT: sample 73: [2, 2, 2, 1, 1, 1, 1] +# CHECK-NEXT: sample 74: [2, 2, 2, 2, 1, 1, 1] +# CHECK-NEXT: sample 75: [2, 2, 2, 4, 1, 1, 1] +# CHECK-NEXT: sample 76: [2, 2, 2, 8, 1, 1, 1] +# CHECK-NEXT: sample 77: [2, 2, 2, 16, 1, 1, 1] +# CHECK-NEXT: stats {'filtered': 78, 'all': 384} +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 2}, 'h': {'./h1': 2}, 'w': {'./w1': 2}, 'f': {'./f1': 16}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './r', './s', './c', './h', './w', './f', './b1', './r1', './s1', './c1', './h1', './w1', './f1']}, vectorization=['./f1'], parallelization=[], unrolling={'./f1': 16, './w1': 2, './h1': 2, './c1': 1, './s1': 1, './r1': 1, './b1': 2}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] diff --git a/tests/filecheck/search/test_conv_pprprp.py b/tests/filecheck/search/test_conv_pprprp.py index 092174aee..e04795c2b 100644 --- a/tests/filecheck/search/test_conv_pprprp.py +++ b/tests/filecheck/search/test_conv_pprprp.py @@ -13,13 +13,13 @@ utils.print_exhaustive_samples(backend, strategy, 100) # CHECK: schedule O0: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 1, './w2': 1, './w3': 1}, 'f': {'./f1': 1, './f2': 1, './f3': 1}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 1, './w3': 1, './h3': 1, './b3': 1, './c1': 1, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 1, './w2': 1, './w3': 1}, 'f': {'./f1': 1, './f2': 1, './f3': 1}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 1, './w3': 1, './h3': 1, './b3': 1, './c1': 1, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: schedule O1: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 1, './w2': 1, './w3': 1}, 'f': {'./f1': 1, './f2': 1, './f3': 1}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 1, './w3': 1, './h3': 1, './b3': 1, './c1': 1, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 1, './w2': 1, './w3': 1}, 'f': {'./f1': 1, './f2': 1, './f3': 1}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 1, './w3': 1, './h3': 1, './b3': 1, './c1': 1, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: schedule O2: [1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 16, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 2, './w2': 2, './w3': 2}, 'f': {'./f1': 16, './f2': 16, './f3': 16}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 16, './w3': 2, './h3': 1, './b3': 1, './c1': 1, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 2, './w2': 2, './w3': 2}, 'f': {'./f1': 16, './f2': 16, './f3': 16}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 16, './w3': 2, './h3': 1, './b3': 1, './c1': 1, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: schedule O3: [1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 16, 1, 1, 3] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 2, './w2': 2, './w3': 2}, 'f': {'./f1': 16, './f2': 16, './f3': 16}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 3}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 16, './w3': 2, './h3': 1, './b3': 1, './c1': 3, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 2, './w2': 2, './w3': 2}, 'f': {'./f1': 16, './f2': 16, './f3': 16}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 3}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 16, './w3': 2, './h3': 1, './b3': 1, './c1': 3, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: sample 0: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] # CHECK-NEXT: sample 1: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3] # CHECK-NEXT: sample 2: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 1] @@ -121,4 +121,4 @@ # CHECK-NEXT: sample 98: [1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 16, 1, 1, 1] # CHECK-NEXT: sample 99: [1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 16, 1, 1, 3] # CHECK-NEXT: stats {'filtered': 100, 'all': 202} -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 1, './w2': 1, './w3': 1}, 'f': {'./f1': 32, './f2': 16, './f3': 16}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 3}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 16, './w3': 1, './h3': 1, './b3': 1, './c1': 3, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 1, './w2': 1, './w3': 1}, 'f': {'./f1': 32, './f2': 16, './f3': 16}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 3}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 16, './w3': 1, './h3': 1, './b3': 1, './c1': 3, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] diff --git a/tests/filecheck/search/test_conv_pprprpv.py b/tests/filecheck/search/test_conv_pprprpv.py index f326c9e0d..e0218cd77 100644 --- a/tests/filecheck/search/test_conv_pprprpv.py +++ b/tests/filecheck/search/test_conv_pprprpv.py @@ -13,13 +13,13 @@ utils.print_exhaustive_samples(backend, strategy, 100) # CHECK: schedule O0: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 1, './w2': 1, './w3': 1}, 'f': {'./f1': 1, './f2': 1, './f3': 1}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 1, './w3': 1, './h3': 1, './b3': 1, './c1': 1, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 1, './w2': 1, './w3': 1}, 'f': {'./f1': 1, './f2': 1, './f3': 1}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 1, './w3': 1, './h3': 1, './b3': 1, './c1': 1, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: schedule O1: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 1, './w2': 1, './w3': 1}, 'f': {'./f1': 1, './f2': 1, './f3': 1}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 1, './w3': 1, './h3': 1, './b3': 1, './c1': 1, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 1, './w2': 1, './w3': 1}, 'f': {'./f1': 1, './f2': 1, './f3': 1}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 1, './w3': 1, './h3': 1, './b3': 1, './c1': 1, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: schedule O2: [1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 16, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 2, './w2': 2, './w3': 2}, 'f': {'./f1': 16, './f2': 16, './f3': 16}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 16, './w3': 2, './h3': 1, './b3': 1, './c1': 1, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 2, './w2': 2, './w3': 2}, 'f': {'./f1': 16, './f2': 16, './f3': 16}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 16, './w3': 2, './h3': 1, './b3': 1, './c1': 1, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: schedule O3: [1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 16, 1, 1, 3] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 2, './w2': 2, './w3': 2}, 'f': {'./f1': 16, './f2': 16, './f3': 16}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 3}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 16, './w3': 2, './h3': 1, './b3': 1, './c1': 3, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 2, './w2': 2, './w3': 2}, 'f': {'./f1': 16, './f2': 16, './f3': 16}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 3}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 16, './w3': 2, './h3': 1, './b3': 1, './c1': 3, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: sample 0: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1] # CHECK-NEXT: sample 1: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 1, 1, 3] # CHECK-NEXT: sample 2: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 1, 7, 1] @@ -121,4 +121,4 @@ # CHECK-NEXT: sample 98: [1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 16, 7, 1, 1] # CHECK-NEXT: sample 99: [1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 32, 1, 1, 1] # CHECK-NEXT: stats {'filtered_vec': 100, 'filtered': 1520, 'all': 4521} -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 2, './h2': 2, './h3': 1}, 'w': {'./w1': 2, './w2': 2, './w3': 1}, 'f': {'./f1': 32, './f2': 32, './f3': 32}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 32, './w3': 1, './h3': 1, './b3': 1, './c1': 1, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 2, './h2': 2, './h3': 1}, 'w': {'./w1': 2, './w2': 2, './w3': 1}, 'f': {'./f1': 32, './f2': 32, './f3': 32}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 32, './w3': 1, './h3': 1, './b3': 1, './c1': 1, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] diff --git a/tests/filecheck/search/test_conv_pprprpvr.py b/tests/filecheck/search/test_conv_pprprpvr.py index 1370a663a..f5fa6c884 100644 --- a/tests/filecheck/search/test_conv_pprprpvr.py +++ b/tests/filecheck/search/test_conv_pprprpvr.py @@ -20,13 +20,13 @@ utils.print_exhaustive_samples(backend, strategy, 100) # CHECK: schedule O0: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 1, './w2': 1, './w3': 1}, 'f': {'./f1': 1, './f2': 1, './f3': 1}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 1, './w3': 1, './h3': 1, './b3': 1, './c1': 1, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 1, './w2': 1, './w3': 1}, 'f': {'./f1': 1, './f2': 1, './f3': 1}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 1, './w3': 1, './h3': 1, './b3': 1, './c1': 1, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: schedule O1: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 1, './w2': 1, './w3': 1}, 'f': {'./f1': 1, './f2': 1, './f3': 1}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 1, './w3': 1, './h3': 1, './b3': 1, './c1': 1, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 1, './w2': 1, './w3': 1}, 'f': {'./f1': 1, './f2': 1, './f3': 1}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 1, './w3': 1, './h3': 1, './b3': 1, './c1': 1, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: schedule O2: [1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 16, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 2, './w2': 2, './w3': 2}, 'f': {'./f1': 16, './f2': 16, './f3': 16}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 16, './w3': 2, './h3': 1, './b3': 1, './c1': 1, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 2, './w2': 2, './w3': 2}, 'f': {'./f1': 16, './f2': 16, './f3': 16}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 16, './w3': 2, './h3': 1, './b3': 1, './c1': 1, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: schedule O3: [1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 16, 1, 1, 3] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 2, './w2': 2, './w3': 2}, 'f': {'./f1': 16, './f2': 16, './f3': 16}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 3}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 16, './w3': 2, './h3': 1, './b3': 1, './c1': 3, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 1, './h2': 1, './h3': 1}, 'w': {'./w1': 2, './w2': 2, './w3': 2}, 'f': {'./f1': 16, './f2': 16, './f3': 16}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 3}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 16, './w3': 2, './h3': 1, './b3': 1, './c1': 3, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: sample 0: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1] # CHECK-NEXT: sample 1: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 1, 1, 3] # CHECK-NEXT: sample 2: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 1, 7, 1] @@ -128,4 +128,4 @@ # CHECK-NEXT: sample 98: [1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 32, 1, 1, 1] # CHECK-NEXT: sample 99: [1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 32, 1, 1, 3] # CHECK-NEXT: stats {'filtered_l2': 100, 'filtered_l1': 102, 'filtered_reg': 132, 'filtered_vec': 134, 'filtered': 1918, 'all': 3178} -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 2, './h2': 2, './h3': 2}, 'w': {'./w1': 2, './w2': 1, './w3': 1}, 'f': {'./f1': 32, './f2': 32, './f3': 32}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 3}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 32, './w3': 1, './h3': 2, './b3': 1, './c1': 3, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1, './b2': 1, './b3': 1}, 'h': {'./h1': 2, './h2': 2, './h3': 2}, 'w': {'./w1': 2, './w2': 1, './w3': 1}, 'f': {'./f1': 32, './f2': 32, './f3': 32}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 3}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 32, './w3': 1, './h3': 2, './b3': 1, './c1': 3, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] diff --git a/tests/filecheck/search/test_conv_pprprpvr_rnd.py b/tests/filecheck/search/test_conv_pprprpvr_rnd.py index d3f24b0ca..8d1f75cf7 100644 --- a/tests/filecheck/search/test_conv_pprprpvr_rnd.py +++ b/tests/filecheck/search/test_conv_pprprpvr_rnd.py @@ -39,4 +39,4 @@ # CHECK-NEXT: sample 18: [1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 16, 7, 1, 1] # CHECK-NEXT: sample 19: [1, 2, 1, 1, 2, 1, 2, 1, 1, 1, 1, 16, 1, 1, 1] # CHECK-NEXT: stats {'filtered_l2': 5, 'filtered_l1': 5, 'filtered_reg': 6, 'filtered_vec': 6, 'filtered': 100} -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 2, './b2': 2, './b3': 1}, 'h': {'./h1': 2, './h2': 2, './h3': 1}, 'w': {'./w1': 2, './w2': 1, './w3': 1}, 'f': {'./f1': 16, './f2': 16, './f3': 16}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 16, './w3': 1, './h3': 1, './b3': 1, './c1': 1, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 2, './b2': 2, './b3': 1}, 'h': {'./h1': 2, './h2': 2, './h3': 1}, 'w': {'./w1': 2, './w2': 1, './w3': 1}, 'f': {'./f1': 16, './f2': 16, './f3': 16}, 'r': {'./r1': 1}, 's': {'./s1': 1}, 'c': {'./c1': 1}}, permutation={'.': ['./b', './h', './w', './f', './b1', './h1', './w1', './f1', './r', './s', './c', './b2', './h2', './w2', './f2', './r1', './s1', './c1', './b3', './h3', './w3', './f3']}, vectorization=['./f3'], parallelization=['./b', './h', './w', './f'], unrolling={'./f3': 16, './w3': 1, './h3': 1, './b3': 1, './c1': 1, './s1': 1, './r1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] diff --git a/tests/filecheck/search/test_conv_prp.py b/tests/filecheck/search/test_conv_prp.py index 67c5d27dd..ab2f34a6e 100644 --- a/tests/filecheck/search/test_conv_prp.py +++ b/tests/filecheck/search/test_conv_prp.py @@ -12,60 +12,60 @@ utils.print_all_opt_schedules(backend, strategy) utils.print_exhaustive_samples(backend, strategy, 100) -# CHECK: schedule O0: [1, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1}, 'h': {'./h1': 1}, 'w': {'./w1': 1}, 'f': {'./f1': 1}, 'r': {}, 's': {}, 'c': {}}, permutation={'.': ['./b', './h', './w', './f', './r', './s', './c', './b1', './h1', './w1', './f1']}, vectorization=['./f1'], parallelization=[], unrolling={'./f1': 1, './w1': 1, './h1': 1, './b1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O1: [1, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1}, 'h': {'./h1': 1}, 'w': {'./w1': 1}, 'f': {'./f1': 1}, 'r': {}, 's': {}, 'c': {}}, permutation={'.': ['./b', './h', './w', './f', './r', './s', './c', './b1', './h1', './w1', './f1']}, vectorization=['./f1'], parallelization=[], unrolling={'./f1': 1, './w1': 1, './h1': 1, './b1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O2: [1, 1, 2, 16] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1}, 'h': {'./h1': 1}, 'w': {'./w1': 2}, 'f': {'./f1': 16}, 'r': {}, 's': {}, 'c': {}}, permutation={'.': ['./b', './h', './w', './f', './r', './s', './c', './b1', './h1', './w1', './f1']}, vectorization=['./f1'], parallelization=[], unrolling={'./f1': 16, './w1': 2, './h1': 1, './b1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O3: [1, 1, 2, 16] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1}, 'h': {'./h1': 1}, 'w': {'./w1': 2}, 'f': {'./f1': 16}, 'r': {}, 's': {}, 'c': {}}, permutation={'.': ['./b', './h', './w', './f', './r', './s', './c', './b1', './h1', './w1', './f1']}, vectorization=['./f1'], parallelization=[], unrolling={'./f1': 16, './w1': 2, './h1': 1, './b1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: sample 0: [1, 1, 1, 1] -# CHECK-NEXT: sample 1: [1, 1, 1, 2] -# CHECK-NEXT: sample 2: [1, 1, 1, 4] -# CHECK-NEXT: sample 3: [1, 1, 1, 8] -# CHECK-NEXT: sample 4: [1, 1, 1, 16] -# CHECK-NEXT: sample 5: [1, 1, 1, 32] -# CHECK-NEXT: sample 6: [1, 1, 2, 1] -# CHECK-NEXT: sample 7: [1, 1, 2, 2] -# CHECK-NEXT: sample 8: [1, 1, 2, 4] -# CHECK-NEXT: sample 9: [1, 1, 2, 8] -# CHECK-NEXT: sample 10: [1, 1, 2, 16] -# CHECK-NEXT: sample 11: [1, 1, 2, 32] -# CHECK-NEXT: sample 12: [1, 2, 1, 1] -# CHECK-NEXT: sample 13: [1, 2, 1, 2] -# CHECK-NEXT: sample 14: [1, 2, 1, 4] -# CHECK-NEXT: sample 15: [1, 2, 1, 8] -# CHECK-NEXT: sample 16: [1, 2, 1, 16] -# CHECK-NEXT: sample 17: [1, 2, 1, 32] -# CHECK-NEXT: sample 18: [1, 2, 2, 1] -# CHECK-NEXT: sample 19: [1, 2, 2, 2] -# CHECK-NEXT: sample 20: [1, 2, 2, 4] -# CHECK-NEXT: sample 21: [1, 2, 2, 8] -# CHECK-NEXT: sample 22: [1, 2, 2, 16] -# CHECK-NEXT: sample 23: [1, 2, 2, 32] -# CHECK-NEXT: sample 24: [2, 1, 1, 1] -# CHECK-NEXT: sample 25: [2, 1, 1, 2] -# CHECK-NEXT: sample 26: [2, 1, 1, 4] -# CHECK-NEXT: sample 27: [2, 1, 1, 8] -# CHECK-NEXT: sample 28: [2, 1, 1, 16] -# CHECK-NEXT: sample 29: [2, 1, 1, 32] -# CHECK-NEXT: sample 30: [2, 1, 2, 1] -# CHECK-NEXT: sample 31: [2, 1, 2, 2] -# CHECK-NEXT: sample 32: [2, 1, 2, 4] -# CHECK-NEXT: sample 33: [2, 1, 2, 8] -# CHECK-NEXT: sample 34: [2, 1, 2, 16] -# CHECK-NEXT: sample 35: [2, 1, 2, 32] -# CHECK-NEXT: sample 36: [2, 2, 1, 1] -# CHECK-NEXT: sample 37: [2, 2, 1, 2] -# CHECK-NEXT: sample 38: [2, 2, 1, 4] -# CHECK-NEXT: sample 39: [2, 2, 1, 8] -# CHECK-NEXT: sample 40: [2, 2, 1, 16] -# CHECK-NEXT: sample 41: [2, 2, 1, 32] -# CHECK-NEXT: sample 42: [2, 2, 2, 1] -# CHECK-NEXT: sample 43: [2, 2, 2, 2] -# CHECK-NEXT: sample 44: [2, 2, 2, 4] -# CHECK-NEXT: sample 45: [2, 2, 2, 8] -# CHECK-NEXT: sample 46: [2, 2, 2, 16] -# CHECK-NEXT: stats {'filtered': 47, 'all': 48} -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 2}, 'h': {'./h1': 2}, 'w': {'./w1': 2}, 'f': {'./f1': 16}, 'r': {}, 's': {}, 'c': {}}, permutation={'.': ['./b', './h', './w', './f', './r', './s', './c', './b1', './h1', './w1', './f1']}, vectorization=['./f1'], parallelization=[], unrolling={'./f1': 16, './w1': 2, './h1': 2, './b1': 2}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK: schedule O0: [1, 1, 1, 1] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1}, 'h': {'./h1': 1}, 'w': {'./w1': 1}, 'f': {'./f1': 1}, 'r': {}, 's': {}, 'c': {}}, permutation={'.': ['./b', './h', './w', './f', './r', './s', './c', './b1', './h1', './w1', './f1']}, vectorization=['./f1'], parallelization=[], unrolling={'./f1': 1, './w1': 1, './h1': 1, './b1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O1: [1, 1, 1, 1] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1}, 'h': {'./h1': 1}, 'w': {'./w1': 1}, 'f': {'./f1': 1}, 'r': {}, 's': {}, 'c': {}}, permutation={'.': ['./b', './h', './w', './f', './r', './s', './c', './b1', './h1', './w1', './f1']}, vectorization=['./f1'], parallelization=[], unrolling={'./f1': 1, './w1': 1, './h1': 1, './b1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O2: [1, 1, 2, 16] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1}, 'h': {'./h1': 1}, 'w': {'./w1': 2}, 'f': {'./f1': 16}, 'r': {}, 's': {}, 'c': {}}, permutation={'.': ['./b', './h', './w', './f', './r', './s', './c', './b1', './h1', './w1', './f1']}, vectorization=['./f1'], parallelization=[], unrolling={'./f1': 16, './w1': 2, './h1': 1, './b1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O3: [1, 1, 2, 16] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 1}, 'h': {'./h1': 1}, 'w': {'./w1': 2}, 'f': {'./f1': 16}, 'r': {}, 's': {}, 'c': {}}, permutation={'.': ['./b', './h', './w', './f', './r', './s', './c', './b1', './h1', './w1', './f1']}, vectorization=['./f1'], parallelization=[], unrolling={'./f1': 16, './w1': 2, './h1': 1, './b1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: sample 0: [1, 1, 1, 1] +# CHECK-NEXT: sample 1: [1, 1, 1, 2] +# CHECK-NEXT: sample 2: [1, 1, 1, 4] +# CHECK-NEXT: sample 3: [1, 1, 1, 8] +# CHECK-NEXT: sample 4: [1, 1, 1, 16] +# CHECK-NEXT: sample 5: [1, 1, 1, 32] +# CHECK-NEXT: sample 6: [1, 1, 2, 1] +# CHECK-NEXT: sample 7: [1, 1, 2, 2] +# CHECK-NEXT: sample 8: [1, 1, 2, 4] +# CHECK-NEXT: sample 9: [1, 1, 2, 8] +# CHECK-NEXT: sample 10: [1, 1, 2, 16] +# CHECK-NEXT: sample 11: [1, 1, 2, 32] +# CHECK-NEXT: sample 12: [1, 2, 1, 1] +# CHECK-NEXT: sample 13: [1, 2, 1, 2] +# CHECK-NEXT: sample 14: [1, 2, 1, 4] +# CHECK-NEXT: sample 15: [1, 2, 1, 8] +# CHECK-NEXT: sample 16: [1, 2, 1, 16] +# CHECK-NEXT: sample 17: [1, 2, 1, 32] +# CHECK-NEXT: sample 18: [1, 2, 2, 1] +# CHECK-NEXT: sample 19: [1, 2, 2, 2] +# CHECK-NEXT: sample 20: [1, 2, 2, 4] +# CHECK-NEXT: sample 21: [1, 2, 2, 8] +# CHECK-NEXT: sample 22: [1, 2, 2, 16] +# CHECK-NEXT: sample 23: [1, 2, 2, 32] +# CHECK-NEXT: sample 24: [2, 1, 1, 1] +# CHECK-NEXT: sample 25: [2, 1, 1, 2] +# CHECK-NEXT: sample 26: [2, 1, 1, 4] +# CHECK-NEXT: sample 27: [2, 1, 1, 8] +# CHECK-NEXT: sample 28: [2, 1, 1, 16] +# CHECK-NEXT: sample 29: [2, 1, 1, 32] +# CHECK-NEXT: sample 30: [2, 1, 2, 1] +# CHECK-NEXT: sample 31: [2, 1, 2, 2] +# CHECK-NEXT: sample 32: [2, 1, 2, 4] +# CHECK-NEXT: sample 33: [2, 1, 2, 8] +# CHECK-NEXT: sample 34: [2, 1, 2, 16] +# CHECK-NEXT: sample 35: [2, 1, 2, 32] +# CHECK-NEXT: sample 36: [2, 2, 1, 1] +# CHECK-NEXT: sample 37: [2, 2, 1, 2] +# CHECK-NEXT: sample 38: [2, 2, 1, 4] +# CHECK-NEXT: sample 39: [2, 2, 1, 8] +# CHECK-NEXT: sample 40: [2, 2, 1, 16] +# CHECK-NEXT: sample 41: [2, 2, 1, 32] +# CHECK-NEXT: sample 42: [2, 2, 2, 1] +# CHECK-NEXT: sample 43: [2, 2, 2, 2] +# CHECK-NEXT: sample 44: [2, 2, 2, 4] +# CHECK-NEXT: sample 45: [2, 2, 2, 8] +# CHECK-NEXT: sample 46: [2, 2, 2, 16] +# CHECK-NEXT: stats {'filtered': 47, 'all': 48} +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 2}, 'h': {'./h1': 2}, 'w': {'./w1': 2}, 'f': {'./f1': 16}, 'r': {}, 's': {}, 'c': {}}, permutation={'.': ['./b', './h', './w', './f', './r', './s', './c', './b1', './h1', './w1', './f1']}, vectorization=['./f1'], parallelization=[], unrolling={'./f1': 16, './w1': 2, './h1': 2, './b1': 2}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] diff --git a/tests/filecheck/search/test_conv_prp_rnd.py b/tests/filecheck/search/test_conv_prp_rnd.py index 45ef6a7f8..5ce3f6b43 100644 --- a/tests/filecheck/search/test_conv_prp_rnd.py +++ b/tests/filecheck/search/test_conv_prp_rnd.py @@ -39,4 +39,4 @@ # CHECK-NEXT: sample 18: [2, 2, 1, 8] # CHECK-NEXT: sample 19: [2, 2, 1, 4] # CHECK-NEXT: stats {'filtered': 20} -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 2}, 'h': {'./h1': 2}, 'w': {'./w1': 1}, 'f': {'./f1': 4}, 'r': {}, 's': {}, 'c': {}}, permutation={'.': ['./b', './h', './w', './f', './r', './s', './c', './b1', './h1', './w1', './f1']}, vectorization=['./f1'], parallelization=['./b', './h', './w', './f'], unrolling={'./f1': 4, './w1': 1, './h1': 2, './b1': 2}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['b', 'h', 'w', 'f'], loop_stamps=[], splits={}, tiles={'b': {}, 'h': {}, 'w': {}, 'f': {}}, permutation={'.': ['./b', './h', './w', './f']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['b', 'h', 'w', 'f', 'r', 's', 'c'], loop_stamps=[], splits={}, tiles={'b': {'./b1': 2}, 'h': {'./h1': 2}, 'w': {'./w1': 1}, 'f': {'./f1': 4}, 'r': {}, 's': {}, 'c': {}}, permutation={'.': ['./b', './h', './w', './f', './r', './s', './c', './b1', './h1', './w1', './f1']}, vectorization=['./f1'], parallelization=['./b', './h', './w', './f'], unrolling={'./f1': 4, './w1': 1, './h1': 2, './b1': 2}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] diff --git a/tests/filecheck/search/test_matmul_goto.py b/tests/filecheck/search/test_matmul_goto.py index 444f4fb7c..171366193 100644 --- a/tests/filecheck/search/test_matmul_goto.py +++ b/tests/filecheck/search/test_matmul_goto.py @@ -12,113 +12,113 @@ utils.print_all_opt_schedules(backend, strategy) utils.print_exhaustive_samples(backend, strategy, 100) -# CHECK: schedule O0: [1, 1, 1, 1, 1, 0, 0, 0] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1}, 'j': {'./j1': 1, './j2': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./j', './k', './i', './j1', './i1', './k1', './i2', './j2']}, vectorization=['./j2'], parallelization=[], unrolling={'./i2': 1, './k1': 0}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O1: [1, 1, 1, 1, 1, 0, 0, 0] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1}, 'j': {'./j1': 1, './j2': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./j', './k', './i', './j1', './i1', './k1', './i2', './j2']}, vectorization=['./j2'], parallelization=[], unrolling={'./i2': 1, './k1': 0}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O2: [1, 1, 1, 1, 1, 0, 0, 0] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1}, 'j': {'./j1': 1, './j2': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./j', './k', './i', './j1', './i1', './k1', './i2', './j2']}, vectorization=['./j2'], parallelization=[], unrolling={'./i2': 1, './k1': 0}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O3: [1, 1, 1, 1, 1, 0, 0, 0] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1}, 'j': {'./j1': 1, './j2': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./j', './k', './i', './j1', './i1', './k1', './i2', './j2']}, vectorization=['./j2'], parallelization=[], unrolling={'./i2': 1, './k1': 0}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: sample 0: [1, 1, 1, 1, 1, 1, 0, 0] -# CHECK-NEXT: sample 1: [1, 1, 1, 1, 1, 1, 0, 1] -# CHECK-NEXT: sample 2: [1, 1, 1, 1, 1, 1, 1, 0] -# CHECK-NEXT: sample 3: [1, 1, 1, 1, 1, 1, 1, 1] -# CHECK-NEXT: sample 4: [1, 1, 1, 1, 1, 2, 0, 0] -# CHECK-NEXT: sample 5: [1, 1, 1, 1, 1, 2, 0, 1] -# CHECK-NEXT: sample 6: [1, 1, 1, 1, 1, 2, 1, 0] -# CHECK-NEXT: sample 7: [1, 1, 1, 1, 1, 2, 1, 1] -# CHECK-NEXT: sample 8: [1, 1, 1, 1, 1, 3, 0, 0] -# CHECK-NEXT: sample 9: [1, 1, 1, 1, 1, 3, 0, 1] -# CHECK-NEXT: sample 10: [1, 1, 1, 1, 1, 3, 1, 0] -# CHECK-NEXT: sample 11: [1, 1, 1, 1, 1, 3, 1, 1] -# CHECK-NEXT: sample 12: [1, 1, 1, 1, 1, 4, 0, 0] -# CHECK-NEXT: sample 13: [1, 1, 1, 1, 1, 4, 0, 1] -# CHECK-NEXT: sample 14: [1, 1, 1, 1, 1, 4, 1, 0] -# CHECK-NEXT: sample 15: [1, 1, 1, 1, 1, 4, 1, 1] -# CHECK-NEXT: sample 16: [1, 1, 1, 1, 1, 6, 0, 0] -# CHECK-NEXT: sample 17: [1, 1, 1, 1, 1, 6, 0, 1] -# CHECK-NEXT: sample 18: [1, 1, 1, 1, 1, 6, 1, 0] -# CHECK-NEXT: sample 19: [1, 1, 1, 1, 1, 6, 1, 1] -# CHECK-NEXT: sample 20: [1, 1, 1, 1, 2, 1, 0, 0] -# CHECK-NEXT: sample 21: [1, 1, 1, 1, 2, 1, 0, 1] -# CHECK-NEXT: sample 22: [1, 1, 1, 1, 2, 1, 1, 0] -# CHECK-NEXT: sample 23: [1, 1, 1, 1, 2, 1, 1, 1] -# CHECK-NEXT: sample 24: [1, 1, 1, 1, 2, 2, 0, 0] -# CHECK-NEXT: sample 25: [1, 1, 1, 1, 2, 2, 0, 1] -# CHECK-NEXT: sample 26: [1, 1, 1, 1, 2, 2, 1, 0] -# CHECK-NEXT: sample 27: [1, 1, 1, 1, 2, 2, 1, 1] -# CHECK-NEXT: sample 28: [1, 1, 1, 1, 2, 3, 0, 0] -# CHECK-NEXT: sample 29: [1, 1, 1, 1, 2, 3, 0, 1] -# CHECK-NEXT: sample 30: [1, 1, 1, 1, 2, 3, 1, 0] -# CHECK-NEXT: sample 31: [1, 1, 1, 1, 2, 3, 1, 1] -# CHECK-NEXT: sample 32: [1, 1, 1, 1, 2, 6, 0, 0] -# CHECK-NEXT: sample 33: [1, 1, 1, 1, 2, 6, 0, 1] -# CHECK-NEXT: sample 34: [1, 1, 1, 1, 2, 6, 1, 0] -# CHECK-NEXT: sample 35: [1, 1, 1, 1, 2, 6, 1, 1] -# CHECK-NEXT: sample 36: [1, 1, 1, 1, 3, 1, 0, 0] -# CHECK-NEXT: sample 37: [1, 1, 1, 1, 3, 1, 0, 1] -# CHECK-NEXT: sample 38: [1, 1, 1, 1, 3, 1, 1, 0] -# CHECK-NEXT: sample 39: [1, 1, 1, 1, 3, 1, 1, 1] -# CHECK-NEXT: sample 40: [1, 1, 1, 1, 3, 2, 0, 0] -# CHECK-NEXT: sample 41: [1, 1, 1, 1, 3, 2, 0, 1] -# CHECK-NEXT: sample 42: [1, 1, 1, 1, 3, 2, 1, 0] -# CHECK-NEXT: sample 43: [1, 1, 1, 1, 3, 2, 1, 1] -# CHECK-NEXT: sample 44: [1, 1, 1, 1, 3, 4, 0, 0] -# CHECK-NEXT: sample 45: [1, 1, 1, 1, 3, 4, 0, 1] -# CHECK-NEXT: sample 46: [1, 1, 1, 1, 3, 4, 1, 0] -# CHECK-NEXT: sample 47: [1, 1, 1, 1, 3, 4, 1, 1] -# CHECK-NEXT: sample 48: [1, 1, 1, 1, 4, 1, 0, 0] -# CHECK-NEXT: sample 49: [1, 1, 1, 1, 4, 1, 0, 1] -# CHECK-NEXT: sample 50: [1, 1, 1, 1, 4, 1, 1, 0] -# CHECK-NEXT: sample 51: [1, 1, 1, 1, 4, 1, 1, 1] -# CHECK-NEXT: sample 52: [1, 1, 1, 1, 4, 3, 0, 0] -# CHECK-NEXT: sample 53: [1, 1, 1, 1, 4, 3, 0, 1] -# CHECK-NEXT: sample 54: [1, 1, 1, 1, 4, 3, 1, 0] -# CHECK-NEXT: sample 55: [1, 1, 1, 1, 4, 3, 1, 1] -# CHECK-NEXT: sample 56: [1, 1, 1, 1, 6, 1, 0, 0] -# CHECK-NEXT: sample 57: [1, 1, 1, 1, 6, 1, 0, 1] -# CHECK-NEXT: sample 58: [1, 1, 1, 1, 6, 1, 1, 0] -# CHECK-NEXT: sample 59: [1, 1, 1, 1, 6, 1, 1, 1] -# CHECK-NEXT: sample 60: [1, 1, 1, 1, 6, 2, 0, 0] -# CHECK-NEXT: sample 61: [1, 1, 1, 1, 6, 2, 0, 1] -# CHECK-NEXT: sample 62: [1, 1, 1, 1, 6, 2, 1, 0] -# CHECK-NEXT: sample 63: [1, 1, 1, 1, 6, 2, 1, 1] -# CHECK-NEXT: sample 64: [1, 1, 1, 1, 12, 1, 0, 0] -# CHECK-NEXT: sample 65: [1, 1, 1, 1, 12, 1, 0, 1] -# CHECK-NEXT: sample 66: [1, 1, 1, 1, 12, 1, 1, 0] -# CHECK-NEXT: sample 67: [1, 1, 1, 1, 12, 1, 1, 1] -# CHECK-NEXT: sample 68: [1, 1, 1, 2, 1, 1, 0, 0] -# CHECK-NEXT: sample 69: [1, 1, 1, 2, 1, 1, 0, 1] -# CHECK-NEXT: sample 70: [1, 1, 1, 2, 1, 1, 1, 0] -# CHECK-NEXT: sample 71: [1, 1, 1, 2, 1, 1, 1, 1] -# CHECK-NEXT: sample 72: [1, 1, 1, 2, 1, 2, 0, 0] -# CHECK-NEXT: sample 73: [1, 1, 1, 2, 1, 2, 0, 1] -# CHECK-NEXT: sample 74: [1, 1, 1, 2, 1, 2, 1, 0] -# CHECK-NEXT: sample 75: [1, 1, 1, 2, 1, 2, 1, 1] -# CHECK-NEXT: sample 76: [1, 1, 1, 2, 1, 3, 0, 0] -# CHECK-NEXT: sample 77: [1, 1, 1, 2, 1, 3, 0, 1] -# CHECK-NEXT: sample 78: [1, 1, 1, 2, 1, 3, 1, 0] -# CHECK-NEXT: sample 79: [1, 1, 1, 2, 1, 3, 1, 1] -# CHECK-NEXT: sample 80: [1, 1, 1, 2, 1, 4, 0, 0] -# CHECK-NEXT: sample 81: [1, 1, 1, 2, 1, 4, 0, 1] -# CHECK-NEXT: sample 82: [1, 1, 1, 2, 1, 4, 1, 0] -# CHECK-NEXT: sample 83: [1, 1, 1, 2, 1, 4, 1, 1] -# CHECK-NEXT: sample 84: [1, 1, 1, 2, 1, 6, 0, 0] -# CHECK-NEXT: sample 85: [1, 1, 1, 2, 1, 6, 0, 1] -# CHECK-NEXT: sample 86: [1, 1, 1, 2, 1, 6, 1, 0] -# CHECK-NEXT: sample 87: [1, 1, 1, 2, 1, 6, 1, 1] -# CHECK-NEXT: sample 88: [1, 1, 1, 2, 2, 1, 0, 0] -# CHECK-NEXT: sample 89: [1, 1, 1, 2, 2, 1, 0, 1] -# CHECK-NEXT: sample 90: [1, 1, 1, 2, 2, 1, 1, 0] -# CHECK-NEXT: sample 91: [1, 1, 1, 2, 2, 1, 1, 1] -# CHECK-NEXT: sample 92: [1, 1, 1, 2, 2, 2, 0, 0] -# CHECK-NEXT: sample 93: [1, 1, 1, 2, 2, 2, 0, 1] -# CHECK-NEXT: sample 94: [1, 1, 1, 2, 2, 2, 1, 0] -# CHECK-NEXT: sample 95: [1, 1, 1, 2, 2, 2, 1, 1] -# CHECK-NEXT: sample 96: [1, 1, 1, 2, 2, 3, 0, 0] -# CHECK-NEXT: sample 97: [1, 1, 1, 2, 2, 3, 0, 1] -# CHECK-NEXT: sample 98: [1, 1, 1, 2, 2, 3, 1, 0] -# CHECK-NEXT: sample 99: [1, 1, 1, 2, 2, 3, 1, 1] -# CHECK-NEXT: stats {'filtered': 100, 'all': 108} -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1}, 'j': {'./j1': 2, './j2': 2}, 'k': {'./k1': 2}}, permutation={'.': ['./j', './k', './i', './j1', './i1', './k1', './i2', './j2']}, vectorization=['./j2'], parallelization=[], unrolling={'./i2': 1, './k1': 3}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK: schedule O0: [1, 1, 1, 1, 1, 0, 0, 0] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1}, 'j': {'./j1': 1, './j2': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./j', './k', './i', './j1', './i1', './k1', './i2', './j2']}, vectorization=['./j2'], parallelization=[], unrolling={'./i2': 1, './k1': 0}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O1: [1, 1, 1, 1, 1, 0, 0, 0] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1}, 'j': {'./j1': 1, './j2': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./j', './k', './i', './j1', './i1', './k1', './i2', './j2']}, vectorization=['./j2'], parallelization=[], unrolling={'./i2': 1, './k1': 0}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O2: [1, 1, 1, 1, 1, 0, 0, 0] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1}, 'j': {'./j1': 1, './j2': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./j', './k', './i', './j1', './i1', './k1', './i2', './j2']}, vectorization=['./j2'], parallelization=[], unrolling={'./i2': 1, './k1': 0}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O3: [1, 1, 1, 1, 1, 0, 0, 0] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1}, 'j': {'./j1': 1, './j2': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./j', './k', './i', './j1', './i1', './k1', './i2', './j2']}, vectorization=['./j2'], parallelization=[], unrolling={'./i2': 1, './k1': 0}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: sample 0: [1, 1, 1, 1, 1, 1, 0, 0] +# CHECK-NEXT: sample 1: [1, 1, 1, 1, 1, 1, 0, 1] +# CHECK-NEXT: sample 2: [1, 1, 1, 1, 1, 1, 1, 0] +# CHECK-NEXT: sample 3: [1, 1, 1, 1, 1, 1, 1, 1] +# CHECK-NEXT: sample 4: [1, 1, 1, 1, 1, 2, 0, 0] +# CHECK-NEXT: sample 5: [1, 1, 1, 1, 1, 2, 0, 1] +# CHECK-NEXT: sample 6: [1, 1, 1, 1, 1, 2, 1, 0] +# CHECK-NEXT: sample 7: [1, 1, 1, 1, 1, 2, 1, 1] +# CHECK-NEXT: sample 8: [1, 1, 1, 1, 1, 3, 0, 0] +# CHECK-NEXT: sample 9: [1, 1, 1, 1, 1, 3, 0, 1] +# CHECK-NEXT: sample 10: [1, 1, 1, 1, 1, 3, 1, 0] +# CHECK-NEXT: sample 11: [1, 1, 1, 1, 1, 3, 1, 1] +# CHECK-NEXT: sample 12: [1, 1, 1, 1, 1, 4, 0, 0] +# CHECK-NEXT: sample 13: [1, 1, 1, 1, 1, 4, 0, 1] +# CHECK-NEXT: sample 14: [1, 1, 1, 1, 1, 4, 1, 0] +# CHECK-NEXT: sample 15: [1, 1, 1, 1, 1, 4, 1, 1] +# CHECK-NEXT: sample 16: [1, 1, 1, 1, 1, 6, 0, 0] +# CHECK-NEXT: sample 17: [1, 1, 1, 1, 1, 6, 0, 1] +# CHECK-NEXT: sample 18: [1, 1, 1, 1, 1, 6, 1, 0] +# CHECK-NEXT: sample 19: [1, 1, 1, 1, 1, 6, 1, 1] +# CHECK-NEXT: sample 20: [1, 1, 1, 1, 2, 1, 0, 0] +# CHECK-NEXT: sample 21: [1, 1, 1, 1, 2, 1, 0, 1] +# CHECK-NEXT: sample 22: [1, 1, 1, 1, 2, 1, 1, 0] +# CHECK-NEXT: sample 23: [1, 1, 1, 1, 2, 1, 1, 1] +# CHECK-NEXT: sample 24: [1, 1, 1, 1, 2, 2, 0, 0] +# CHECK-NEXT: sample 25: [1, 1, 1, 1, 2, 2, 0, 1] +# CHECK-NEXT: sample 26: [1, 1, 1, 1, 2, 2, 1, 0] +# CHECK-NEXT: sample 27: [1, 1, 1, 1, 2, 2, 1, 1] +# CHECK-NEXT: sample 28: [1, 1, 1, 1, 2, 3, 0, 0] +# CHECK-NEXT: sample 29: [1, 1, 1, 1, 2, 3, 0, 1] +# CHECK-NEXT: sample 30: [1, 1, 1, 1, 2, 3, 1, 0] +# CHECK-NEXT: sample 31: [1, 1, 1, 1, 2, 3, 1, 1] +# CHECK-NEXT: sample 32: [1, 1, 1, 1, 2, 6, 0, 0] +# CHECK-NEXT: sample 33: [1, 1, 1, 1, 2, 6, 0, 1] +# CHECK-NEXT: sample 34: [1, 1, 1, 1, 2, 6, 1, 0] +# CHECK-NEXT: sample 35: [1, 1, 1, 1, 2, 6, 1, 1] +# CHECK-NEXT: sample 36: [1, 1, 1, 1, 3, 1, 0, 0] +# CHECK-NEXT: sample 37: [1, 1, 1, 1, 3, 1, 0, 1] +# CHECK-NEXT: sample 38: [1, 1, 1, 1, 3, 1, 1, 0] +# CHECK-NEXT: sample 39: [1, 1, 1, 1, 3, 1, 1, 1] +# CHECK-NEXT: sample 40: [1, 1, 1, 1, 3, 2, 0, 0] +# CHECK-NEXT: sample 41: [1, 1, 1, 1, 3, 2, 0, 1] +# CHECK-NEXT: sample 42: [1, 1, 1, 1, 3, 2, 1, 0] +# CHECK-NEXT: sample 43: [1, 1, 1, 1, 3, 2, 1, 1] +# CHECK-NEXT: sample 44: [1, 1, 1, 1, 3, 4, 0, 0] +# CHECK-NEXT: sample 45: [1, 1, 1, 1, 3, 4, 0, 1] +# CHECK-NEXT: sample 46: [1, 1, 1, 1, 3, 4, 1, 0] +# CHECK-NEXT: sample 47: [1, 1, 1, 1, 3, 4, 1, 1] +# CHECK-NEXT: sample 48: [1, 1, 1, 1, 4, 1, 0, 0] +# CHECK-NEXT: sample 49: [1, 1, 1, 1, 4, 1, 0, 1] +# CHECK-NEXT: sample 50: [1, 1, 1, 1, 4, 1, 1, 0] +# CHECK-NEXT: sample 51: [1, 1, 1, 1, 4, 1, 1, 1] +# CHECK-NEXT: sample 52: [1, 1, 1, 1, 4, 3, 0, 0] +# CHECK-NEXT: sample 53: [1, 1, 1, 1, 4, 3, 0, 1] +# CHECK-NEXT: sample 54: [1, 1, 1, 1, 4, 3, 1, 0] +# CHECK-NEXT: sample 55: [1, 1, 1, 1, 4, 3, 1, 1] +# CHECK-NEXT: sample 56: [1, 1, 1, 1, 6, 1, 0, 0] +# CHECK-NEXT: sample 57: [1, 1, 1, 1, 6, 1, 0, 1] +# CHECK-NEXT: sample 58: [1, 1, 1, 1, 6, 1, 1, 0] +# CHECK-NEXT: sample 59: [1, 1, 1, 1, 6, 1, 1, 1] +# CHECK-NEXT: sample 60: [1, 1, 1, 1, 6, 2, 0, 0] +# CHECK-NEXT: sample 61: [1, 1, 1, 1, 6, 2, 0, 1] +# CHECK-NEXT: sample 62: [1, 1, 1, 1, 6, 2, 1, 0] +# CHECK-NEXT: sample 63: [1, 1, 1, 1, 6, 2, 1, 1] +# CHECK-NEXT: sample 64: [1, 1, 1, 1, 12, 1, 0, 0] +# CHECK-NEXT: sample 65: [1, 1, 1, 1, 12, 1, 0, 1] +# CHECK-NEXT: sample 66: [1, 1, 1, 1, 12, 1, 1, 0] +# CHECK-NEXT: sample 67: [1, 1, 1, 1, 12, 1, 1, 1] +# CHECK-NEXT: sample 68: [1, 1, 1, 2, 1, 1, 0, 0] +# CHECK-NEXT: sample 69: [1, 1, 1, 2, 1, 1, 0, 1] +# CHECK-NEXT: sample 70: [1, 1, 1, 2, 1, 1, 1, 0] +# CHECK-NEXT: sample 71: [1, 1, 1, 2, 1, 1, 1, 1] +# CHECK-NEXT: sample 72: [1, 1, 1, 2, 1, 2, 0, 0] +# CHECK-NEXT: sample 73: [1, 1, 1, 2, 1, 2, 0, 1] +# CHECK-NEXT: sample 74: [1, 1, 1, 2, 1, 2, 1, 0] +# CHECK-NEXT: sample 75: [1, 1, 1, 2, 1, 2, 1, 1] +# CHECK-NEXT: sample 76: [1, 1, 1, 2, 1, 3, 0, 0] +# CHECK-NEXT: sample 77: [1, 1, 1, 2, 1, 3, 0, 1] +# CHECK-NEXT: sample 78: [1, 1, 1, 2, 1, 3, 1, 0] +# CHECK-NEXT: sample 79: [1, 1, 1, 2, 1, 3, 1, 1] +# CHECK-NEXT: sample 80: [1, 1, 1, 2, 1, 4, 0, 0] +# CHECK-NEXT: sample 81: [1, 1, 1, 2, 1, 4, 0, 1] +# CHECK-NEXT: sample 82: [1, 1, 1, 2, 1, 4, 1, 0] +# CHECK-NEXT: sample 83: [1, 1, 1, 2, 1, 4, 1, 1] +# CHECK-NEXT: sample 84: [1, 1, 1, 2, 1, 6, 0, 0] +# CHECK-NEXT: sample 85: [1, 1, 1, 2, 1, 6, 0, 1] +# CHECK-NEXT: sample 86: [1, 1, 1, 2, 1, 6, 1, 0] +# CHECK-NEXT: sample 87: [1, 1, 1, 2, 1, 6, 1, 1] +# CHECK-NEXT: sample 88: [1, 1, 1, 2, 2, 1, 0, 0] +# CHECK-NEXT: sample 89: [1, 1, 1, 2, 2, 1, 0, 1] +# CHECK-NEXT: sample 90: [1, 1, 1, 2, 2, 1, 1, 0] +# CHECK-NEXT: sample 91: [1, 1, 1, 2, 2, 1, 1, 1] +# CHECK-NEXT: sample 92: [1, 1, 1, 2, 2, 2, 0, 0] +# CHECK-NEXT: sample 93: [1, 1, 1, 2, 2, 2, 0, 1] +# CHECK-NEXT: sample 94: [1, 1, 1, 2, 2, 2, 1, 0] +# CHECK-NEXT: sample 95: [1, 1, 1, 2, 2, 2, 1, 1] +# CHECK-NEXT: sample 96: [1, 1, 1, 2, 2, 3, 0, 0] +# CHECK-NEXT: sample 97: [1, 1, 1, 2, 2, 3, 0, 1] +# CHECK-NEXT: sample 98: [1, 1, 1, 2, 2, 3, 1, 0] +# CHECK-NEXT: sample 99: [1, 1, 1, 2, 2, 3, 1, 1] +# CHECK-NEXT: stats {'filtered': 100, 'all': 108} +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1}, 'j': {'./j1': 2, './j2': 2}, 'k': {'./k1': 2}}, permutation={'.': ['./j', './k', './i', './j1', './i1', './k1', './i2', './j2']}, vectorization=['./j2'], parallelization=[], unrolling={'./i2': 1, './k1': 3}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] diff --git a/tests/filecheck/search/test_matmul_goto_r.py b/tests/filecheck/search/test_matmul_goto_r.py index e46f7319f..cc3e2f867 100644 --- a/tests/filecheck/search/test_matmul_goto_r.py +++ b/tests/filecheck/search/test_matmul_goto_r.py @@ -12,113 +12,113 @@ utils.print_all_opt_schedules(backend, strategy) utils.print_exhaustive_samples(backend, strategy, 100) -# CHECK: schedule O0: [1, 1, 1, 1, 1, 0, 0, 0] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1}, 'j': {'./j1': 1, './j2': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./j', './k', './i', './j1', './i1', './k1', './i2', './j2']}, vectorization=['./j2'], parallelization=[], unrolling={'./i2': 1, './k1': 0}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O1: [1, 1, 1, 1, 1, 0, 0, 0] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1}, 'j': {'./j1': 1, './j2': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./j', './k', './i', './j1', './i1', './k1', './i2', './j2']}, vectorization=['./j2'], parallelization=[], unrolling={'./i2': 1, './k1': 0}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O2: [1, 1, 1, 1, 1, 0, 0, 0] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1}, 'j': {'./j1': 1, './j2': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./j', './k', './i', './j1', './i1', './k1', './i2', './j2']}, vectorization=['./j2'], parallelization=[], unrolling={'./i2': 1, './k1': 0}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O3: [1, 1, 1, 1, 1, 0, 0, 0] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1}, 'j': {'./j1': 1, './j2': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./j', './k', './i', './j1', './i1', './k1', './i2', './j2']}, vectorization=['./j2'], parallelization=[], unrolling={'./i2': 1, './k1': 0}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: sample 0: [3, 1, 2, 1, 1, 1, 0, 0] -# CHECK-NEXT: sample 1: [3, 1, 2, 1, 1, 1, 0, 1] -# CHECK-NEXT: sample 2: [3, 1, 2, 1, 1, 1, 1, 0] -# CHECK-NEXT: sample 3: [3, 1, 2, 1, 1, 1, 1, 1] -# CHECK-NEXT: sample 4: [3, 1, 2, 1, 1, 2, 0, 0] -# CHECK-NEXT: sample 5: [3, 1, 2, 1, 1, 2, 0, 1] -# CHECK-NEXT: sample 6: [3, 1, 2, 1, 1, 2, 1, 0] -# CHECK-NEXT: sample 7: [3, 1, 2, 1, 1, 2, 1, 1] -# CHECK-NEXT: sample 8: [3, 1, 2, 1, 1, 3, 0, 0] -# CHECK-NEXT: sample 9: [3, 1, 2, 1, 1, 3, 0, 1] -# CHECK-NEXT: sample 10: [3, 1, 2, 1, 1, 3, 1, 0] -# CHECK-NEXT: sample 11: [3, 1, 2, 1, 1, 3, 1, 1] -# CHECK-NEXT: sample 12: [3, 1, 2, 1, 2, 1, 0, 0] -# CHECK-NEXT: sample 13: [3, 1, 2, 1, 2, 1, 0, 1] -# CHECK-NEXT: sample 14: [3, 1, 2, 1, 2, 1, 1, 0] -# CHECK-NEXT: sample 15: [3, 1, 2, 1, 2, 1, 1, 1] -# CHECK-NEXT: sample 16: [3, 1, 2, 1, 2, 2, 0, 0] -# CHECK-NEXT: sample 17: [3, 1, 2, 1, 2, 2, 0, 1] -# CHECK-NEXT: sample 18: [3, 1, 2, 1, 2, 2, 1, 0] -# CHECK-NEXT: sample 19: [3, 1, 2, 1, 2, 2, 1, 1] -# CHECK-NEXT: sample 20: [3, 1, 2, 1, 2, 3, 0, 0] -# CHECK-NEXT: sample 21: [3, 1, 2, 1, 2, 3, 0, 1] -# CHECK-NEXT: sample 22: [3, 1, 2, 1, 2, 3, 1, 0] -# CHECK-NEXT: sample 23: [3, 1, 2, 1, 2, 3, 1, 1] -# CHECK-NEXT: sample 24: [3, 1, 2, 1, 3, 1, 0, 0] -# CHECK-NEXT: sample 25: [3, 1, 2, 1, 3, 1, 0, 1] -# CHECK-NEXT: sample 26: [3, 1, 2, 1, 3, 1, 1, 0] -# CHECK-NEXT: sample 27: [3, 1, 2, 1, 3, 1, 1, 1] -# CHECK-NEXT: sample 28: [3, 1, 2, 1, 3, 2, 0, 0] -# CHECK-NEXT: sample 29: [3, 1, 2, 1, 3, 2, 0, 1] -# CHECK-NEXT: sample 30: [3, 1, 2, 1, 3, 2, 1, 0] -# CHECK-NEXT: sample 31: [3, 1, 2, 1, 3, 2, 1, 1] -# CHECK-NEXT: sample 32: [3, 1, 2, 1, 4, 1, 0, 0] -# CHECK-NEXT: sample 33: [3, 1, 2, 1, 4, 1, 0, 1] -# CHECK-NEXT: sample 34: [3, 1, 2, 1, 4, 1, 1, 0] -# CHECK-NEXT: sample 35: [3, 1, 2, 1, 4, 1, 1, 1] -# CHECK-NEXT: sample 36: [3, 1, 2, 1, 4, 3, 0, 0] -# CHECK-NEXT: sample 37: [3, 1, 2, 1, 4, 3, 0, 1] -# CHECK-NEXT: sample 38: [3, 1, 2, 1, 4, 3, 1, 0] -# CHECK-NEXT: sample 39: [3, 1, 2, 1, 4, 3, 1, 1] -# CHECK-NEXT: sample 40: [3, 1, 2, 1, 6, 1, 0, 0] -# CHECK-NEXT: sample 41: [3, 1, 2, 1, 6, 1, 0, 1] -# CHECK-NEXT: sample 42: [3, 1, 2, 1, 6, 1, 1, 0] -# CHECK-NEXT: sample 43: [3, 1, 2, 1, 6, 1, 1, 1] -# CHECK-NEXT: sample 44: [3, 1, 2, 1, 6, 2, 0, 0] -# CHECK-NEXT: sample 45: [3, 1, 2, 1, 6, 2, 0, 1] -# CHECK-NEXT: sample 46: [3, 1, 2, 1, 6, 2, 1, 0] -# CHECK-NEXT: sample 47: [3, 1, 2, 1, 6, 2, 1, 1] -# CHECK-NEXT: sample 48: [3, 1, 2, 1, 12, 1, 0, 0] -# CHECK-NEXT: sample 49: [3, 1, 2, 1, 12, 1, 0, 1] -# CHECK-NEXT: sample 50: [3, 1, 2, 1, 12, 1, 1, 0] -# CHECK-NEXT: sample 51: [3, 1, 2, 1, 12, 1, 1, 1] -# CHECK-NEXT: sample 52: [3, 1, 2, 2, 1, 1, 0, 0] -# CHECK-NEXT: sample 53: [3, 1, 2, 2, 1, 1, 0, 1] -# CHECK-NEXT: sample 54: [3, 1, 2, 2, 1, 1, 1, 0] -# CHECK-NEXT: sample 55: [3, 1, 2, 2, 1, 1, 1, 1] -# CHECK-NEXT: sample 56: [3, 1, 2, 2, 1, 2, 0, 0] -# CHECK-NEXT: sample 57: [3, 1, 2, 2, 1, 2, 0, 1] -# CHECK-NEXT: sample 58: [3, 1, 2, 2, 1, 2, 1, 0] -# CHECK-NEXT: sample 59: [3, 1, 2, 2, 1, 2, 1, 1] -# CHECK-NEXT: sample 60: [3, 1, 2, 2, 1, 3, 0, 0] -# CHECK-NEXT: sample 61: [3, 1, 2, 2, 1, 3, 0, 1] -# CHECK-NEXT: sample 62: [3, 1, 2, 2, 1, 3, 1, 0] -# CHECK-NEXT: sample 63: [3, 1, 2, 2, 1, 3, 1, 1] -# CHECK-NEXT: sample 64: [3, 1, 2, 2, 2, 1, 0, 0] -# CHECK-NEXT: sample 65: [3, 1, 2, 2, 2, 1, 0, 1] -# CHECK-NEXT: sample 66: [3, 1, 2, 2, 2, 1, 1, 0] -# CHECK-NEXT: sample 67: [3, 1, 2, 2, 2, 1, 1, 1] -# CHECK-NEXT: sample 68: [3, 1, 2, 2, 2, 2, 0, 0] -# CHECK-NEXT: sample 69: [3, 1, 2, 2, 2, 2, 0, 1] -# CHECK-NEXT: sample 70: [3, 1, 2, 2, 2, 2, 1, 0] -# CHECK-NEXT: sample 71: [3, 1, 2, 2, 2, 2, 1, 1] -# CHECK-NEXT: sample 72: [3, 1, 2, 2, 2, 3, 0, 0] -# CHECK-NEXT: sample 73: [3, 1, 2, 2, 2, 3, 0, 1] -# CHECK-NEXT: sample 74: [3, 1, 2, 2, 2, 3, 1, 0] -# CHECK-NEXT: sample 75: [3, 1, 2, 2, 2, 3, 1, 1] -# CHECK-NEXT: sample 76: [3, 1, 2, 2, 3, 1, 0, 0] -# CHECK-NEXT: sample 77: [3, 1, 2, 2, 3, 1, 0, 1] -# CHECK-NEXT: sample 78: [3, 1, 2, 2, 3, 1, 1, 0] -# CHECK-NEXT: sample 79: [3, 1, 2, 2, 3, 1, 1, 1] -# CHECK-NEXT: sample 80: [3, 1, 2, 2, 3, 2, 0, 0] -# CHECK-NEXT: sample 81: [3, 1, 2, 2, 3, 2, 0, 1] -# CHECK-NEXT: sample 82: [3, 1, 2, 2, 3, 2, 1, 0] -# CHECK-NEXT: sample 83: [3, 1, 2, 2, 3, 2, 1, 1] -# CHECK-NEXT: sample 84: [3, 1, 2, 2, 4, 1, 0, 0] -# CHECK-NEXT: sample 85: [3, 1, 2, 2, 4, 1, 0, 1] -# CHECK-NEXT: sample 86: [3, 1, 2, 2, 4, 1, 1, 0] -# CHECK-NEXT: sample 87: [3, 1, 2, 2, 4, 1, 1, 1] -# CHECK-NEXT: sample 88: [3, 1, 2, 2, 4, 3, 0, 0] -# CHECK-NEXT: sample 89: [3, 1, 2, 2, 4, 3, 0, 1] -# CHECK-NEXT: sample 90: [3, 1, 2, 2, 4, 3, 1, 0] -# CHECK-NEXT: sample 91: [3, 1, 2, 2, 4, 3, 1, 1] -# CHECK-NEXT: sample 92: [3, 1, 2, 2, 6, 1, 0, 0] -# CHECK-NEXT: sample 93: [3, 1, 2, 2, 6, 1, 0, 1] -# CHECK-NEXT: sample 94: [3, 1, 2, 2, 6, 1, 1, 0] -# CHECK-NEXT: sample 95: [3, 1, 2, 2, 6, 1, 1, 1] -# CHECK-NEXT: sample 96: [3, 1, 2, 2, 6, 2, 0, 0] -# CHECK-NEXT: sample 97: [3, 1, 2, 2, 6, 2, 0, 1] -# CHECK-NEXT: sample 98: [3, 1, 2, 2, 6, 2, 1, 0] -# CHECK-NEXT: sample 99: [3, 1, 2, 2, 6, 2, 1, 1] -# CHECK-NEXT: stats {'filtered': 3256, 'all': 6620} -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 3, './i2': 1}, 'j': {'./j1': 4, './j2': 2}, 'k': {'./k1': 6}}, permutation={'.': ['./j', './k', './i', './j1', './i1', './k1', './i2', './j2']}, vectorization=['./j2'], parallelization=[], unrolling={'./i2': 1, './k1': 2}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK: schedule O0: [1, 1, 1, 1, 1, 0, 0, 0] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1}, 'j': {'./j1': 1, './j2': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./j', './k', './i', './j1', './i1', './k1', './i2', './j2']}, vectorization=['./j2'], parallelization=[], unrolling={'./i2': 1, './k1': 0}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O1: [1, 1, 1, 1, 1, 0, 0, 0] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1}, 'j': {'./j1': 1, './j2': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./j', './k', './i', './j1', './i1', './k1', './i2', './j2']}, vectorization=['./j2'], parallelization=[], unrolling={'./i2': 1, './k1': 0}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O2: [1, 1, 1, 1, 1, 0, 0, 0] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1}, 'j': {'./j1': 1, './j2': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./j', './k', './i', './j1', './i1', './k1', './i2', './j2']}, vectorization=['./j2'], parallelization=[], unrolling={'./i2': 1, './k1': 0}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O3: [1, 1, 1, 1, 1, 0, 0, 0] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1}, 'j': {'./j1': 1, './j2': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./j', './k', './i', './j1', './i1', './k1', './i2', './j2']}, vectorization=['./j2'], parallelization=[], unrolling={'./i2': 1, './k1': 0}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: sample 0: [3, 1, 2, 1, 1, 1, 0, 0] +# CHECK-NEXT: sample 1: [3, 1, 2, 1, 1, 1, 0, 1] +# CHECK-NEXT: sample 2: [3, 1, 2, 1, 1, 1, 1, 0] +# CHECK-NEXT: sample 3: [3, 1, 2, 1, 1, 1, 1, 1] +# CHECK-NEXT: sample 4: [3, 1, 2, 1, 1, 2, 0, 0] +# CHECK-NEXT: sample 5: [3, 1, 2, 1, 1, 2, 0, 1] +# CHECK-NEXT: sample 6: [3, 1, 2, 1, 1, 2, 1, 0] +# CHECK-NEXT: sample 7: [3, 1, 2, 1, 1, 2, 1, 1] +# CHECK-NEXT: sample 8: [3, 1, 2, 1, 1, 3, 0, 0] +# CHECK-NEXT: sample 9: [3, 1, 2, 1, 1, 3, 0, 1] +# CHECK-NEXT: sample 10: [3, 1, 2, 1, 1, 3, 1, 0] +# CHECK-NEXT: sample 11: [3, 1, 2, 1, 1, 3, 1, 1] +# CHECK-NEXT: sample 12: [3, 1, 2, 1, 2, 1, 0, 0] +# CHECK-NEXT: sample 13: [3, 1, 2, 1, 2, 1, 0, 1] +# CHECK-NEXT: sample 14: [3, 1, 2, 1, 2, 1, 1, 0] +# CHECK-NEXT: sample 15: [3, 1, 2, 1, 2, 1, 1, 1] +# CHECK-NEXT: sample 16: [3, 1, 2, 1, 2, 2, 0, 0] +# CHECK-NEXT: sample 17: [3, 1, 2, 1, 2, 2, 0, 1] +# CHECK-NEXT: sample 18: [3, 1, 2, 1, 2, 2, 1, 0] +# CHECK-NEXT: sample 19: [3, 1, 2, 1, 2, 2, 1, 1] +# CHECK-NEXT: sample 20: [3, 1, 2, 1, 2, 3, 0, 0] +# CHECK-NEXT: sample 21: [3, 1, 2, 1, 2, 3, 0, 1] +# CHECK-NEXT: sample 22: [3, 1, 2, 1, 2, 3, 1, 0] +# CHECK-NEXT: sample 23: [3, 1, 2, 1, 2, 3, 1, 1] +# CHECK-NEXT: sample 24: [3, 1, 2, 1, 3, 1, 0, 0] +# CHECK-NEXT: sample 25: [3, 1, 2, 1, 3, 1, 0, 1] +# CHECK-NEXT: sample 26: [3, 1, 2, 1, 3, 1, 1, 0] +# CHECK-NEXT: sample 27: [3, 1, 2, 1, 3, 1, 1, 1] +# CHECK-NEXT: sample 28: [3, 1, 2, 1, 3, 2, 0, 0] +# CHECK-NEXT: sample 29: [3, 1, 2, 1, 3, 2, 0, 1] +# CHECK-NEXT: sample 30: [3, 1, 2, 1, 3, 2, 1, 0] +# CHECK-NEXT: sample 31: [3, 1, 2, 1, 3, 2, 1, 1] +# CHECK-NEXT: sample 32: [3, 1, 2, 1, 4, 1, 0, 0] +# CHECK-NEXT: sample 33: [3, 1, 2, 1, 4, 1, 0, 1] +# CHECK-NEXT: sample 34: [3, 1, 2, 1, 4, 1, 1, 0] +# CHECK-NEXT: sample 35: [3, 1, 2, 1, 4, 1, 1, 1] +# CHECK-NEXT: sample 36: [3, 1, 2, 1, 4, 3, 0, 0] +# CHECK-NEXT: sample 37: [3, 1, 2, 1, 4, 3, 0, 1] +# CHECK-NEXT: sample 38: [3, 1, 2, 1, 4, 3, 1, 0] +# CHECK-NEXT: sample 39: [3, 1, 2, 1, 4, 3, 1, 1] +# CHECK-NEXT: sample 40: [3, 1, 2, 1, 6, 1, 0, 0] +# CHECK-NEXT: sample 41: [3, 1, 2, 1, 6, 1, 0, 1] +# CHECK-NEXT: sample 42: [3, 1, 2, 1, 6, 1, 1, 0] +# CHECK-NEXT: sample 43: [3, 1, 2, 1, 6, 1, 1, 1] +# CHECK-NEXT: sample 44: [3, 1, 2, 1, 6, 2, 0, 0] +# CHECK-NEXT: sample 45: [3, 1, 2, 1, 6, 2, 0, 1] +# CHECK-NEXT: sample 46: [3, 1, 2, 1, 6, 2, 1, 0] +# CHECK-NEXT: sample 47: [3, 1, 2, 1, 6, 2, 1, 1] +# CHECK-NEXT: sample 48: [3, 1, 2, 1, 12, 1, 0, 0] +# CHECK-NEXT: sample 49: [3, 1, 2, 1, 12, 1, 0, 1] +# CHECK-NEXT: sample 50: [3, 1, 2, 1, 12, 1, 1, 0] +# CHECK-NEXT: sample 51: [3, 1, 2, 1, 12, 1, 1, 1] +# CHECK-NEXT: sample 52: [3, 1, 2, 2, 1, 1, 0, 0] +# CHECK-NEXT: sample 53: [3, 1, 2, 2, 1, 1, 0, 1] +# CHECK-NEXT: sample 54: [3, 1, 2, 2, 1, 1, 1, 0] +# CHECK-NEXT: sample 55: [3, 1, 2, 2, 1, 1, 1, 1] +# CHECK-NEXT: sample 56: [3, 1, 2, 2, 1, 2, 0, 0] +# CHECK-NEXT: sample 57: [3, 1, 2, 2, 1, 2, 0, 1] +# CHECK-NEXT: sample 58: [3, 1, 2, 2, 1, 2, 1, 0] +# CHECK-NEXT: sample 59: [3, 1, 2, 2, 1, 2, 1, 1] +# CHECK-NEXT: sample 60: [3, 1, 2, 2, 1, 3, 0, 0] +# CHECK-NEXT: sample 61: [3, 1, 2, 2, 1, 3, 0, 1] +# CHECK-NEXT: sample 62: [3, 1, 2, 2, 1, 3, 1, 0] +# CHECK-NEXT: sample 63: [3, 1, 2, 2, 1, 3, 1, 1] +# CHECK-NEXT: sample 64: [3, 1, 2, 2, 2, 1, 0, 0] +# CHECK-NEXT: sample 65: [3, 1, 2, 2, 2, 1, 0, 1] +# CHECK-NEXT: sample 66: [3, 1, 2, 2, 2, 1, 1, 0] +# CHECK-NEXT: sample 67: [3, 1, 2, 2, 2, 1, 1, 1] +# CHECK-NEXT: sample 68: [3, 1, 2, 2, 2, 2, 0, 0] +# CHECK-NEXT: sample 69: [3, 1, 2, 2, 2, 2, 0, 1] +# CHECK-NEXT: sample 70: [3, 1, 2, 2, 2, 2, 1, 0] +# CHECK-NEXT: sample 71: [3, 1, 2, 2, 2, 2, 1, 1] +# CHECK-NEXT: sample 72: [3, 1, 2, 2, 2, 3, 0, 0] +# CHECK-NEXT: sample 73: [3, 1, 2, 2, 2, 3, 0, 1] +# CHECK-NEXT: sample 74: [3, 1, 2, 2, 2, 3, 1, 0] +# CHECK-NEXT: sample 75: [3, 1, 2, 2, 2, 3, 1, 1] +# CHECK-NEXT: sample 76: [3, 1, 2, 2, 3, 1, 0, 0] +# CHECK-NEXT: sample 77: [3, 1, 2, 2, 3, 1, 0, 1] +# CHECK-NEXT: sample 78: [3, 1, 2, 2, 3, 1, 1, 0] +# CHECK-NEXT: sample 79: [3, 1, 2, 2, 3, 1, 1, 1] +# CHECK-NEXT: sample 80: [3, 1, 2, 2, 3, 2, 0, 0] +# CHECK-NEXT: sample 81: [3, 1, 2, 2, 3, 2, 0, 1] +# CHECK-NEXT: sample 82: [3, 1, 2, 2, 3, 2, 1, 0] +# CHECK-NEXT: sample 83: [3, 1, 2, 2, 3, 2, 1, 1] +# CHECK-NEXT: sample 84: [3, 1, 2, 2, 4, 1, 0, 0] +# CHECK-NEXT: sample 85: [3, 1, 2, 2, 4, 1, 0, 1] +# CHECK-NEXT: sample 86: [3, 1, 2, 2, 4, 1, 1, 0] +# CHECK-NEXT: sample 87: [3, 1, 2, 2, 4, 1, 1, 1] +# CHECK-NEXT: sample 88: [3, 1, 2, 2, 4, 3, 0, 0] +# CHECK-NEXT: sample 89: [3, 1, 2, 2, 4, 3, 0, 1] +# CHECK-NEXT: sample 90: [3, 1, 2, 2, 4, 3, 1, 0] +# CHECK-NEXT: sample 91: [3, 1, 2, 2, 4, 3, 1, 1] +# CHECK-NEXT: sample 92: [3, 1, 2, 2, 6, 1, 0, 0] +# CHECK-NEXT: sample 93: [3, 1, 2, 2, 6, 1, 0, 1] +# CHECK-NEXT: sample 94: [3, 1, 2, 2, 6, 1, 1, 0] +# CHECK-NEXT: sample 95: [3, 1, 2, 2, 6, 1, 1, 1] +# CHECK-NEXT: sample 96: [3, 1, 2, 2, 6, 2, 0, 0] +# CHECK-NEXT: sample 97: [3, 1, 2, 2, 6, 2, 0, 1] +# CHECK-NEXT: sample 98: [3, 1, 2, 2, 6, 2, 1, 0] +# CHECK-NEXT: sample 99: [3, 1, 2, 2, 6, 2, 1, 1] +# CHECK-NEXT: stats {'filtered': 3256, 'all': 6620} +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 3, './i2': 1}, 'j': {'./j1': 4, './j2': 2}, 'k': {'./k1': 6}}, permutation={'.': ['./j', './k', './i', './j1', './i1', './k1', './i2', './j2']}, vectorization=['./j2'], parallelization=[], unrolling={'./i2': 1, './k1': 2}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] diff --git a/tests/filecheck/search/test_matmul_oo.py b/tests/filecheck/search/test_matmul_oo.py index 084cd50c4..80bb5f889 100644 --- a/tests/filecheck/search/test_matmul_oo.py +++ b/tests/filecheck/search/test_matmul_oo.py @@ -12,58 +12,58 @@ utils.print_all_opt_schedules(backend, strategy) utils.print_exhaustive_samples(backend, strategy, 100) -# CHECK: schedule O0: [1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './k', './j', './i1', './k1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 1, './k1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O1: [1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './k', './j', './i1', './k1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 1, './k1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O2: [1, 16, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 16}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './k', './j', './i1', './k1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 16, './k1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O3: [3, 16, 12] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 3}, 'j': {'./j1': 16}, 'k': {'./k1': 12}}, permutation={'.': ['./i', './k', './j', './i1', './k1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 16, './k1': 12, './i1': 3}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: sample 0: [1, 1, 1] -# CHECK-NEXT: sample 1: [1, 1, 2] -# CHECK-NEXT: sample 2: [1, 1, 3] -# CHECK-NEXT: sample 3: [1, 1, 4] -# CHECK-NEXT: sample 4: [1, 1, 6] -# CHECK-NEXT: sample 5: [1, 2, 1] -# CHECK-NEXT: sample 6: [1, 2, 2] -# CHECK-NEXT: sample 7: [1, 2, 3] -# CHECK-NEXT: sample 8: [1, 2, 4] -# CHECK-NEXT: sample 9: [1, 2, 6] -# CHECK-NEXT: sample 10: [1, 4, 1] -# CHECK-NEXT: sample 11: [1, 4, 2] -# CHECK-NEXT: sample 12: [1, 4, 3] -# CHECK-NEXT: sample 13: [1, 4, 4] -# CHECK-NEXT: sample 14: [1, 4, 6] -# CHECK-NEXT: sample 15: [1, 8, 1] -# CHECK-NEXT: sample 16: [1, 8, 2] -# CHECK-NEXT: sample 17: [1, 8, 3] -# CHECK-NEXT: sample 18: [1, 8, 4] -# CHECK-NEXT: sample 19: [1, 8, 6] -# CHECK-NEXT: sample 20: [1, 16, 1] -# CHECK-NEXT: sample 21: [1, 16, 2] -# CHECK-NEXT: sample 22: [1, 16, 3] -# CHECK-NEXT: sample 23: [1, 16, 4] -# CHECK-NEXT: sample 24: [1, 16, 6] -# CHECK-NEXT: sample 25: [1, 32, 1] -# CHECK-NEXT: sample 26: [1, 32, 2] -# CHECK-NEXT: sample 27: [1, 32, 3] -# CHECK-NEXT: sample 28: [1, 32, 4] -# CHECK-NEXT: sample 29: [3, 1, 1] -# CHECK-NEXT: sample 30: [3, 1, 2] -# CHECK-NEXT: sample 31: [3, 2, 1] -# CHECK-NEXT: sample 32: [3, 2, 2] -# CHECK-NEXT: sample 33: [3, 4, 1] -# CHECK-NEXT: sample 34: [3, 4, 2] -# CHECK-NEXT: sample 35: [3, 8, 1] -# CHECK-NEXT: sample 36: [3, 8, 2] -# CHECK-NEXT: sample 37: [3, 16, 1] -# CHECK-NEXT: sample 38: [3, 16, 2] -# CHECK-NEXT: sample 39: [3, 32, 1] -# CHECK-NEXT: sample 40: [7, 1, 1] -# CHECK-NEXT: sample 41: [7, 2, 1] -# CHECK-NEXT: sample 42: [7, 4, 1] -# CHECK-NEXT: sample 43: [7, 8, 1] -# CHECK-NEXT: sample 44: [7, 16, 1] -# CHECK-NEXT: stats {'filtered': 45, 'all': 144} -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 7}, 'j': {'./j1': 16}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './k', './j', './i1', './k1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 16, './k1': 1, './i1': 7}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK: schedule O0: [1, 1, 1] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './k', './j', './i1', './k1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 1, './k1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O1: [1, 1, 1] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './k', './j', './i1', './k1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 1, './k1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O2: [1, 16, 1] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 16}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './k', './j', './i1', './k1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 16, './k1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O3: [3, 16, 12] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 3}, 'j': {'./j1': 16}, 'k': {'./k1': 12}}, permutation={'.': ['./i', './k', './j', './i1', './k1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 16, './k1': 12, './i1': 3}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: sample 0: [1, 1, 1] +# CHECK-NEXT: sample 1: [1, 1, 2] +# CHECK-NEXT: sample 2: [1, 1, 3] +# CHECK-NEXT: sample 3: [1, 1, 4] +# CHECK-NEXT: sample 4: [1, 1, 6] +# CHECK-NEXT: sample 5: [1, 2, 1] +# CHECK-NEXT: sample 6: [1, 2, 2] +# CHECK-NEXT: sample 7: [1, 2, 3] +# CHECK-NEXT: sample 8: [1, 2, 4] +# CHECK-NEXT: sample 9: [1, 2, 6] +# CHECK-NEXT: sample 10: [1, 4, 1] +# CHECK-NEXT: sample 11: [1, 4, 2] +# CHECK-NEXT: sample 12: [1, 4, 3] +# CHECK-NEXT: sample 13: [1, 4, 4] +# CHECK-NEXT: sample 14: [1, 4, 6] +# CHECK-NEXT: sample 15: [1, 8, 1] +# CHECK-NEXT: sample 16: [1, 8, 2] +# CHECK-NEXT: sample 17: [1, 8, 3] +# CHECK-NEXT: sample 18: [1, 8, 4] +# CHECK-NEXT: sample 19: [1, 8, 6] +# CHECK-NEXT: sample 20: [1, 16, 1] +# CHECK-NEXT: sample 21: [1, 16, 2] +# CHECK-NEXT: sample 22: [1, 16, 3] +# CHECK-NEXT: sample 23: [1, 16, 4] +# CHECK-NEXT: sample 24: [1, 16, 6] +# CHECK-NEXT: sample 25: [1, 32, 1] +# CHECK-NEXT: sample 26: [1, 32, 2] +# CHECK-NEXT: sample 27: [1, 32, 3] +# CHECK-NEXT: sample 28: [1, 32, 4] +# CHECK-NEXT: sample 29: [3, 1, 1] +# CHECK-NEXT: sample 30: [3, 1, 2] +# CHECK-NEXT: sample 31: [3, 2, 1] +# CHECK-NEXT: sample 32: [3, 2, 2] +# CHECK-NEXT: sample 33: [3, 4, 1] +# CHECK-NEXT: sample 34: [3, 4, 2] +# CHECK-NEXT: sample 35: [3, 8, 1] +# CHECK-NEXT: sample 36: [3, 8, 2] +# CHECK-NEXT: sample 37: [3, 16, 1] +# CHECK-NEXT: sample 38: [3, 16, 2] +# CHECK-NEXT: sample 39: [3, 32, 1] +# CHECK-NEXT: sample 40: [7, 1, 1] +# CHECK-NEXT: sample 41: [7, 2, 1] +# CHECK-NEXT: sample 42: [7, 4, 1] +# CHECK-NEXT: sample 43: [7, 8, 1] +# CHECK-NEXT: sample 44: [7, 16, 1] +# CHECK-NEXT: stats {'filtered': 45, 'all': 144} +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 7}, 'j': {'./j1': 16}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './k', './j', './i1', './k1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 16, './k1': 1, './i1': 7}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] diff --git a/tests/filecheck/search/test_matmul_p1.py b/tests/filecheck/search/test_matmul_p1.py index df637d084..004845dd4 100644 --- a/tests/filecheck/search/test_matmul_p1.py +++ b/tests/filecheck/search/test_matmul_p1.py @@ -12,113 +12,113 @@ utils.print_all_opt_schedules(backend, strategy) utils.print_exhaustive_samples(backend, strategy, 100) -# CHECK: schedule O0: [1, 1, 1, 0] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './k', './i1', './j1', './k1']}, vectorization=[], parallelization=[], unrolling={'./k1': 1, './j1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O1: [1, 1, 1, 0] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './k', './i1', './j1', './k1']}, vectorization=[], parallelization=[], unrolling={'./k1': 1, './j1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O2: [1, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './k', './i1', './k1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 1, './k1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O3: [1, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './k', './i1', './k1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 1, './k1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: sample 0: [1, 1, 1, 0] -# CHECK-NEXT: sample 1: [1, 1, 1, 1] -# CHECK-NEXT: sample 2: [1, 1, 1, 2] -# CHECK-NEXT: sample 3: [1, 1, 1, 3] -# CHECK-NEXT: sample 4: [1, 1, 1, 4] -# CHECK-NEXT: sample 5: [1, 1, 1, 5] -# CHECK-NEXT: sample 6: [1, 1, 2, 0] -# CHECK-NEXT: sample 7: [1, 1, 2, 1] -# CHECK-NEXT: sample 8: [1, 1, 2, 2] -# CHECK-NEXT: sample 9: [1, 1, 2, 3] -# CHECK-NEXT: sample 10: [1, 1, 2, 4] -# CHECK-NEXT: sample 11: [1, 1, 2, 5] -# CHECK-NEXT: sample 12: [1, 1, 3, 0] -# CHECK-NEXT: sample 13: [1, 1, 3, 1] -# CHECK-NEXT: sample 14: [1, 1, 3, 2] -# CHECK-NEXT: sample 15: [1, 1, 3, 3] -# CHECK-NEXT: sample 16: [1, 1, 3, 4] -# CHECK-NEXT: sample 17: [1, 1, 3, 5] -# CHECK-NEXT: sample 18: [1, 1, 4, 0] -# CHECK-NEXT: sample 19: [1, 1, 4, 1] -# CHECK-NEXT: sample 20: [1, 1, 4, 2] -# CHECK-NEXT: sample 21: [1, 1, 4, 3] -# CHECK-NEXT: sample 22: [1, 1, 4, 4] -# CHECK-NEXT: sample 23: [1, 1, 4, 5] -# CHECK-NEXT: sample 24: [1, 1, 6, 0] -# CHECK-NEXT: sample 25: [1, 1, 6, 1] -# CHECK-NEXT: sample 26: [1, 1, 6, 2] -# CHECK-NEXT: sample 27: [1, 1, 6, 3] -# CHECK-NEXT: sample 28: [1, 1, 6, 4] -# CHECK-NEXT: sample 29: [1, 1, 6, 5] -# CHECK-NEXT: sample 30: [1, 2, 1, 0] -# CHECK-NEXT: sample 31: [1, 2, 1, 1] -# CHECK-NEXT: sample 32: [1, 2, 1, 2] -# CHECK-NEXT: sample 33: [1, 2, 1, 3] -# CHECK-NEXT: sample 34: [1, 2, 1, 4] -# CHECK-NEXT: sample 35: [1, 2, 1, 5] -# CHECK-NEXT: sample 36: [1, 2, 2, 0] -# CHECK-NEXT: sample 37: [1, 2, 2, 1] -# CHECK-NEXT: sample 38: [1, 2, 2, 2] -# CHECK-NEXT: sample 39: [1, 2, 2, 3] -# CHECK-NEXT: sample 40: [1, 2, 2, 4] -# CHECK-NEXT: sample 41: [1, 2, 2, 5] -# CHECK-NEXT: sample 42: [1, 2, 3, 0] -# CHECK-NEXT: sample 43: [1, 2, 3, 1] -# CHECK-NEXT: sample 44: [1, 2, 3, 2] -# CHECK-NEXT: sample 45: [1, 2, 3, 3] -# CHECK-NEXT: sample 46: [1, 2, 3, 4] -# CHECK-NEXT: sample 47: [1, 2, 3, 5] -# CHECK-NEXT: sample 48: [1, 2, 4, 0] -# CHECK-NEXT: sample 49: [1, 2, 4, 1] -# CHECK-NEXT: sample 50: [1, 2, 4, 2] -# CHECK-NEXT: sample 51: [1, 2, 4, 3] -# CHECK-NEXT: sample 52: [1, 2, 4, 4] -# CHECK-NEXT: sample 53: [1, 2, 4, 5] -# CHECK-NEXT: sample 54: [1, 2, 6, 1] -# CHECK-NEXT: sample 55: [1, 2, 6, 4] -# CHECK-NEXT: sample 56: [1, 4, 1, 0] -# CHECK-NEXT: sample 57: [1, 4, 1, 1] -# CHECK-NEXT: sample 58: [1, 4, 1, 2] -# CHECK-NEXT: sample 59: [1, 4, 1, 3] -# CHECK-NEXT: sample 60: [1, 4, 1, 4] -# CHECK-NEXT: sample 61: [1, 4, 1, 5] -# CHECK-NEXT: sample 62: [1, 4, 2, 0] -# CHECK-NEXT: sample 63: [1, 4, 2, 1] -# CHECK-NEXT: sample 64: [1, 4, 2, 2] -# CHECK-NEXT: sample 65: [1, 4, 2, 3] -# CHECK-NEXT: sample 66: [1, 4, 2, 4] -# CHECK-NEXT: sample 67: [1, 4, 2, 5] -# CHECK-NEXT: sample 68: [1, 4, 3, 1] -# CHECK-NEXT: sample 69: [1, 4, 3, 4] -# CHECK-NEXT: sample 70: [1, 4, 4, 1] -# CHECK-NEXT: sample 71: [1, 4, 4, 4] -# CHECK-NEXT: sample 72: [1, 4, 6, 1] -# CHECK-NEXT: sample 73: [1, 4, 6, 4] -# CHECK-NEXT: sample 74: [1, 8, 1, 0] -# CHECK-NEXT: sample 75: [1, 8, 1, 1] -# CHECK-NEXT: sample 76: [1, 8, 1, 2] -# CHECK-NEXT: sample 77: [1, 8, 1, 3] -# CHECK-NEXT: sample 78: [1, 8, 1, 4] -# CHECK-NEXT: sample 79: [1, 8, 1, 5] -# CHECK-NEXT: sample 80: [1, 8, 2, 1] -# CHECK-NEXT: sample 81: [1, 8, 2, 4] -# CHECK-NEXT: sample 82: [1, 8, 3, 1] -# CHECK-NEXT: sample 83: [1, 8, 3, 4] -# CHECK-NEXT: sample 84: [1, 8, 4, 1] -# CHECK-NEXT: sample 85: [1, 8, 4, 4] -# CHECK-NEXT: sample 86: [1, 8, 6, 1] -# CHECK-NEXT: sample 87: [1, 8, 6, 4] -# CHECK-NEXT: sample 88: [1, 16, 1, 1] -# CHECK-NEXT: sample 89: [1, 16, 1, 4] -# CHECK-NEXT: sample 90: [1, 16, 2, 1] -# CHECK-NEXT: sample 91: [1, 16, 2, 4] -# CHECK-NEXT: sample 92: [1, 16, 3, 1] -# CHECK-NEXT: sample 93: [1, 16, 3, 4] -# CHECK-NEXT: sample 94: [1, 16, 4, 1] -# CHECK-NEXT: sample 95: [1, 16, 4, 4] -# CHECK-NEXT: sample 96: [1, 16, 6, 1] -# CHECK-NEXT: sample 97: [1, 16, 6, 4] -# CHECK-NEXT: sample 98: [1, 32, 1, 1] -# CHECK-NEXT: sample 99: [1, 32, 1, 4] -# CHECK-NEXT: stats {'filtered': 100, 'all': 185} -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 32}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './k', './k1', './i1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 32, './i1': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK: schedule O0: [1, 1, 1, 0] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './k', './i1', './j1', './k1']}, vectorization=[], parallelization=[], unrolling={'./k1': 1, './j1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O1: [1, 1, 1, 0] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './k', './i1', './j1', './k1']}, vectorization=[], parallelization=[], unrolling={'./k1': 1, './j1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O2: [1, 1, 1, 1] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './k', './i1', './k1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 1, './k1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O3: [1, 1, 1, 1] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './k', './i1', './k1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 1, './k1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: sample 0: [1, 1, 1, 0] +# CHECK-NEXT: sample 1: [1, 1, 1, 1] +# CHECK-NEXT: sample 2: [1, 1, 1, 2] +# CHECK-NEXT: sample 3: [1, 1, 1, 3] +# CHECK-NEXT: sample 4: [1, 1, 1, 4] +# CHECK-NEXT: sample 5: [1, 1, 1, 5] +# CHECK-NEXT: sample 6: [1, 1, 2, 0] +# CHECK-NEXT: sample 7: [1, 1, 2, 1] +# CHECK-NEXT: sample 8: [1, 1, 2, 2] +# CHECK-NEXT: sample 9: [1, 1, 2, 3] +# CHECK-NEXT: sample 10: [1, 1, 2, 4] +# CHECK-NEXT: sample 11: [1, 1, 2, 5] +# CHECK-NEXT: sample 12: [1, 1, 3, 0] +# CHECK-NEXT: sample 13: [1, 1, 3, 1] +# CHECK-NEXT: sample 14: [1, 1, 3, 2] +# CHECK-NEXT: sample 15: [1, 1, 3, 3] +# CHECK-NEXT: sample 16: [1, 1, 3, 4] +# CHECK-NEXT: sample 17: [1, 1, 3, 5] +# CHECK-NEXT: sample 18: [1, 1, 4, 0] +# CHECK-NEXT: sample 19: [1, 1, 4, 1] +# CHECK-NEXT: sample 20: [1, 1, 4, 2] +# CHECK-NEXT: sample 21: [1, 1, 4, 3] +# CHECK-NEXT: sample 22: [1, 1, 4, 4] +# CHECK-NEXT: sample 23: [1, 1, 4, 5] +# CHECK-NEXT: sample 24: [1, 1, 6, 0] +# CHECK-NEXT: sample 25: [1, 1, 6, 1] +# CHECK-NEXT: sample 26: [1, 1, 6, 2] +# CHECK-NEXT: sample 27: [1, 1, 6, 3] +# CHECK-NEXT: sample 28: [1, 1, 6, 4] +# CHECK-NEXT: sample 29: [1, 1, 6, 5] +# CHECK-NEXT: sample 30: [1, 2, 1, 0] +# CHECK-NEXT: sample 31: [1, 2, 1, 1] +# CHECK-NEXT: sample 32: [1, 2, 1, 2] +# CHECK-NEXT: sample 33: [1, 2, 1, 3] +# CHECK-NEXT: sample 34: [1, 2, 1, 4] +# CHECK-NEXT: sample 35: [1, 2, 1, 5] +# CHECK-NEXT: sample 36: [1, 2, 2, 0] +# CHECK-NEXT: sample 37: [1, 2, 2, 1] +# CHECK-NEXT: sample 38: [1, 2, 2, 2] +# CHECK-NEXT: sample 39: [1, 2, 2, 3] +# CHECK-NEXT: sample 40: [1, 2, 2, 4] +# CHECK-NEXT: sample 41: [1, 2, 2, 5] +# CHECK-NEXT: sample 42: [1, 2, 3, 0] +# CHECK-NEXT: sample 43: [1, 2, 3, 1] +# CHECK-NEXT: sample 44: [1, 2, 3, 2] +# CHECK-NEXT: sample 45: [1, 2, 3, 3] +# CHECK-NEXT: sample 46: [1, 2, 3, 4] +# CHECK-NEXT: sample 47: [1, 2, 3, 5] +# CHECK-NEXT: sample 48: [1, 2, 4, 0] +# CHECK-NEXT: sample 49: [1, 2, 4, 1] +# CHECK-NEXT: sample 50: [1, 2, 4, 2] +# CHECK-NEXT: sample 51: [1, 2, 4, 3] +# CHECK-NEXT: sample 52: [1, 2, 4, 4] +# CHECK-NEXT: sample 53: [1, 2, 4, 5] +# CHECK-NEXT: sample 54: [1, 2, 6, 1] +# CHECK-NEXT: sample 55: [1, 2, 6, 4] +# CHECK-NEXT: sample 56: [1, 4, 1, 0] +# CHECK-NEXT: sample 57: [1, 4, 1, 1] +# CHECK-NEXT: sample 58: [1, 4, 1, 2] +# CHECK-NEXT: sample 59: [1, 4, 1, 3] +# CHECK-NEXT: sample 60: [1, 4, 1, 4] +# CHECK-NEXT: sample 61: [1, 4, 1, 5] +# CHECK-NEXT: sample 62: [1, 4, 2, 0] +# CHECK-NEXT: sample 63: [1, 4, 2, 1] +# CHECK-NEXT: sample 64: [1, 4, 2, 2] +# CHECK-NEXT: sample 65: [1, 4, 2, 3] +# CHECK-NEXT: sample 66: [1, 4, 2, 4] +# CHECK-NEXT: sample 67: [1, 4, 2, 5] +# CHECK-NEXT: sample 68: [1, 4, 3, 1] +# CHECK-NEXT: sample 69: [1, 4, 3, 4] +# CHECK-NEXT: sample 70: [1, 4, 4, 1] +# CHECK-NEXT: sample 71: [1, 4, 4, 4] +# CHECK-NEXT: sample 72: [1, 4, 6, 1] +# CHECK-NEXT: sample 73: [1, 4, 6, 4] +# CHECK-NEXT: sample 74: [1, 8, 1, 0] +# CHECK-NEXT: sample 75: [1, 8, 1, 1] +# CHECK-NEXT: sample 76: [1, 8, 1, 2] +# CHECK-NEXT: sample 77: [1, 8, 1, 3] +# CHECK-NEXT: sample 78: [1, 8, 1, 4] +# CHECK-NEXT: sample 79: [1, 8, 1, 5] +# CHECK-NEXT: sample 80: [1, 8, 2, 1] +# CHECK-NEXT: sample 81: [1, 8, 2, 4] +# CHECK-NEXT: sample 82: [1, 8, 3, 1] +# CHECK-NEXT: sample 83: [1, 8, 3, 4] +# CHECK-NEXT: sample 84: [1, 8, 4, 1] +# CHECK-NEXT: sample 85: [1, 8, 4, 4] +# CHECK-NEXT: sample 86: [1, 8, 6, 1] +# CHECK-NEXT: sample 87: [1, 8, 6, 4] +# CHECK-NEXT: sample 88: [1, 16, 1, 1] +# CHECK-NEXT: sample 89: [1, 16, 1, 4] +# CHECK-NEXT: sample 90: [1, 16, 2, 1] +# CHECK-NEXT: sample 91: [1, 16, 2, 4] +# CHECK-NEXT: sample 92: [1, 16, 3, 1] +# CHECK-NEXT: sample 93: [1, 16, 3, 4] +# CHECK-NEXT: sample 94: [1, 16, 4, 1] +# CHECK-NEXT: sample 95: [1, 16, 4, 4] +# CHECK-NEXT: sample 96: [1, 16, 6, 1] +# CHECK-NEXT: sample 97: [1, 16, 6, 4] +# CHECK-NEXT: sample 98: [1, 32, 1, 1] +# CHECK-NEXT: sample 99: [1, 32, 1, 4] +# CHECK-NEXT: stats {'filtered': 100, 'all': 185} +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 32}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './k', './k1', './i1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 32, './i1': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] diff --git a/tests/filecheck/search/test_matmul_p1v.py b/tests/filecheck/search/test_matmul_p1v.py index 9d20ea9d2..7e9167448 100644 --- a/tests/filecheck/search/test_matmul_p1v.py +++ b/tests/filecheck/search/test_matmul_p1v.py @@ -12,39 +12,39 @@ utils.print_all_opt_schedules(backend, strategy) utils.print_exhaustive_samples(backend, strategy, 100) -# CHECK: schedule O0: [1, 1, 1, 0] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './k', './i1', './j1', './k1']}, vectorization=[], parallelization=[], unrolling={'./k1': 1, './j1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O1: [1, 1, 1, 0] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './k', './i1', './j1', './k1']}, vectorization=[], parallelization=[], unrolling={'./k1': 1, './j1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O2: [1, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './k', './i1', './k1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 1, './k1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O3: [1, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './k', './i1', './k1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 1, './k1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: sample 0: [1, 16, 1, 1] -# CHECK-NEXT: sample 1: [1, 16, 1, 4] -# CHECK-NEXT: sample 2: [1, 16, 2, 1] -# CHECK-NEXT: sample 3: [1, 16, 2, 4] -# CHECK-NEXT: sample 4: [1, 16, 3, 1] -# CHECK-NEXT: sample 5: [1, 16, 3, 4] -# CHECK-NEXT: sample 6: [1, 16, 4, 1] -# CHECK-NEXT: sample 7: [1, 16, 4, 4] -# CHECK-NEXT: sample 8: [1, 16, 6, 1] -# CHECK-NEXT: sample 9: [1, 16, 6, 4] -# CHECK-NEXT: sample 10: [1, 32, 1, 1] -# CHECK-NEXT: sample 11: [1, 32, 1, 4] -# CHECK-NEXT: sample 12: [1, 32, 2, 1] -# CHECK-NEXT: sample 13: [1, 32, 2, 4] -# CHECK-NEXT: sample 14: [1, 32, 3, 1] -# CHECK-NEXT: sample 15: [1, 32, 3, 4] -# CHECK-NEXT: sample 16: [1, 32, 4, 1] -# CHECK-NEXT: sample 17: [1, 32, 4, 4] -# CHECK-NEXT: sample 18: [3, 16, 1, 1] -# CHECK-NEXT: sample 19: [3, 16, 1, 4] -# CHECK-NEXT: sample 20: [3, 16, 2, 1] -# CHECK-NEXT: sample 21: [3, 16, 2, 4] -# CHECK-NEXT: sample 22: [3, 32, 1, 1] -# CHECK-NEXT: sample 23: [3, 32, 1, 4] -# CHECK-NEXT: sample 24: [7, 16, 1, 1] -# CHECK-NEXT: sample 25: [7, 16, 1, 4] -# CHECK-NEXT: stats {'filtered': 154, 'all': 864} -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 7}, 'j': {'./j1': 16}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './k', './k1', './i1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 16, './i1': 7, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK: schedule O0: [1, 1, 1, 0] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './k', './i1', './j1', './k1']}, vectorization=[], parallelization=[], unrolling={'./k1': 1, './j1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O1: [1, 1, 1, 0] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './k', './i1', './j1', './k1']}, vectorization=[], parallelization=[], unrolling={'./k1': 1, './j1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O2: [1, 1, 1, 1] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './k', './i1', './k1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 1, './k1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O3: [1, 1, 1, 1] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './k', './i1', './k1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 1, './k1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: sample 0: [1, 16, 1, 1] +# CHECK-NEXT: sample 1: [1, 16, 1, 4] +# CHECK-NEXT: sample 2: [1, 16, 2, 1] +# CHECK-NEXT: sample 3: [1, 16, 2, 4] +# CHECK-NEXT: sample 4: [1, 16, 3, 1] +# CHECK-NEXT: sample 5: [1, 16, 3, 4] +# CHECK-NEXT: sample 6: [1, 16, 4, 1] +# CHECK-NEXT: sample 7: [1, 16, 4, 4] +# CHECK-NEXT: sample 8: [1, 16, 6, 1] +# CHECK-NEXT: sample 9: [1, 16, 6, 4] +# CHECK-NEXT: sample 10: [1, 32, 1, 1] +# CHECK-NEXT: sample 11: [1, 32, 1, 4] +# CHECK-NEXT: sample 12: [1, 32, 2, 1] +# CHECK-NEXT: sample 13: [1, 32, 2, 4] +# CHECK-NEXT: sample 14: [1, 32, 3, 1] +# CHECK-NEXT: sample 15: [1, 32, 3, 4] +# CHECK-NEXT: sample 16: [1, 32, 4, 1] +# CHECK-NEXT: sample 17: [1, 32, 4, 4] +# CHECK-NEXT: sample 18: [3, 16, 1, 1] +# CHECK-NEXT: sample 19: [3, 16, 1, 4] +# CHECK-NEXT: sample 20: [3, 16, 2, 1] +# CHECK-NEXT: sample 21: [3, 16, 2, 4] +# CHECK-NEXT: sample 22: [3, 32, 1, 1] +# CHECK-NEXT: sample 23: [3, 32, 1, 4] +# CHECK-NEXT: sample 24: [7, 16, 1, 1] +# CHECK-NEXT: sample 25: [7, 16, 1, 4] +# CHECK-NEXT: stats {'filtered': 154, 'all': 864} +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 7}, 'j': {'./j1': 16}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './k', './k1', './i1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 16, './i1': 7, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] diff --git a/tests/filecheck/search/test_matmul_pprprp.py b/tests/filecheck/search/test_matmul_pprprp.py index ef8fc0d42..d96304b9a 100644 --- a/tests/filecheck/search/test_matmul_pprprp.py +++ b/tests/filecheck/search/test_matmul_pprprp.py @@ -13,13 +13,13 @@ utils.print_exhaustive_samples(backend, strategy,100) # CHECK: schedule O0: [1, 1, 1, 1, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1, './i3': 1}, 'j': {'./j1': 1, './j2': 1, './j3': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 1, './i3': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1, './i3': 1}, 'j': {'./j1': 1, './j2': 1, './j3': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 1, './i3': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: schedule O1: [1, 1, 1, 1, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1, './i3': 1}, 'j': {'./j1': 1, './j2': 1, './j3': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 1, './i3': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1, './i3': 1}, 'j': {'./j1': 1, './j2': 1, './j3': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 1, './i3': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: schedule O2: [1, 1, 1, 1, 1, 16, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1, './i3': 1}, 'j': {'./j1': 16, './j2': 16, './j3': 16}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 16, './i3': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1, './i3': 1}, 'j': {'./j1': 16, './j2': 16, './j3': 16}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 16, './i3': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: schedule O3: [1, 1, 3, 1, 1, 16, 12] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 3, './i2': 3, './i3': 3}, 'j': {'./j1': 16, './j2': 16, './j3': 16}, 'k': {'./k1': 12}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 16, './i3': 3, './k1': 12}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 3, './i2': 3, './i3': 3}, 'j': {'./j1': 16, './j2': 16, './j3': 16}, 'k': {'./k1': 12}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 16, './i3': 3, './k1': 12}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: sample 0: [1, 1, 1, 1, 1, 1, 1] # CHECK-NEXT: sample 1: [1, 1, 1, 1, 1, 1, 2] # CHECK-NEXT: sample 2: [1, 1, 1, 1, 1, 1, 3] @@ -121,4 +121,4 @@ # CHECK-NEXT: sample 98: [1, 1, 1, 1, 16, 2, 6] # CHECK-NEXT: sample 99: [1, 1, 1, 1, 32, 1, 1] # CHECK-NEXT: stats {'filtered': 100, 'all': 121} -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1, './i3': 1}, 'j': {'./j1': 32, './j2': 32, './j3': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 1, './i3': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1, './i3': 1}, 'j': {'./j1': 32, './j2': 32, './j3': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 1, './i3': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] diff --git a/tests/filecheck/search/test_matmul_pprprpv.py b/tests/filecheck/search/test_matmul_pprprpv.py index 822e546ca..6ce9f7678 100644 --- a/tests/filecheck/search/test_matmul_pprprpv.py +++ b/tests/filecheck/search/test_matmul_pprprpv.py @@ -13,13 +13,13 @@ utils.print_exhaustive_samples(backend, strategy,100) # CHECK: schedule O0: [1, 1, 1, 1, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1, './i3': 1}, 'j': {'./j1': 1, './j2': 1, './j3': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 1, './i3': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1, './i3': 1}, 'j': {'./j1': 1, './j2': 1, './j3': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 1, './i3': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: schedule O1: [1, 1, 1, 1, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1, './i3': 1}, 'j': {'./j1': 1, './j2': 1, './j3': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 1, './i3': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1, './i3': 1}, 'j': {'./j1': 1, './j2': 1, './j3': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 1, './i3': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: schedule O2: [1, 1, 1, 1, 1, 16, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1, './i3': 1}, 'j': {'./j1': 16, './j2': 16, './j3': 16}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 16, './i3': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1, './i3': 1}, 'j': {'./j1': 16, './j2': 16, './j3': 16}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 16, './i3': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: schedule O3: [1, 1, 3, 1, 1, 16, 12] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 3, './i2': 3, './i3': 3}, 'j': {'./j1': 16, './j2': 16, './j3': 16}, 'k': {'./k1': 12}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 16, './i3': 3, './k1': 12}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 3, './i2': 3, './i3': 3}, 'j': {'./j1': 16, './j2': 16, './j3': 16}, 'k': {'./k1': 12}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 16, './i3': 3, './k1': 12}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: sample 0: [1, 1, 1, 1, 1, 16, 1] # CHECK-NEXT: sample 1: [1, 1, 1, 1, 1, 16, 2] # CHECK-NEXT: sample 2: [1, 1, 1, 1, 1, 16, 3] @@ -121,4 +121,4 @@ # CHECK-NEXT: sample 98: [3, 1, 1, 1, 1, 16, 3] # CHECK-NEXT: sample 99: [3, 1, 1, 1, 1, 16, 4] # CHECK-NEXT: stats {'filtered_vec': 100, 'filtered': 1472, 'all': 3052} -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 3, './i2': 1, './i3': 1}, 'j': {'./j1': 16, './j2': 16, './j3': 16}, 'k': {'./k1': 4}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 16, './i3': 1, './k1': 4}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 3, './i2': 1, './i3': 1}, 'j': {'./j1': 16, './j2': 16, './j3': 16}, 'k': {'./k1': 4}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 16, './i3': 1, './k1': 4}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] diff --git a/tests/filecheck/search/test_matmul_pprprpvr.py b/tests/filecheck/search/test_matmul_pprprpvr.py index dfe2fb9cd..29651b757 100644 --- a/tests/filecheck/search/test_matmul_pprprpvr.py +++ b/tests/filecheck/search/test_matmul_pprprpvr.py @@ -20,13 +20,13 @@ utils.print_exhaustive_samples(backend, strategy,100) # CHECK: schedule O0: [1, 1, 1, 1, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1, './i3': 1}, 'j': {'./j1': 1, './j2': 1, './j3': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 1, './i3': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1, './i3': 1}, 'j': {'./j1': 1, './j2': 1, './j3': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 1, './i3': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: schedule O1: [1, 1, 1, 1, 1, 1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1, './i3': 1}, 'j': {'./j1': 1, './j2': 1, './j3': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 1, './i3': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1, './i3': 1}, 'j': {'./j1': 1, './j2': 1, './j3': 1}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 1, './i3': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: schedule O2: [1, 1, 1, 1, 1, 16, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1, './i3': 1}, 'j': {'./j1': 16, './j2': 16, './j3': 16}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 16, './i3': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1, './i2': 1, './i3': 1}, 'j': {'./j1': 16, './j2': 16, './j3': 16}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 16, './i3': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: schedule O3: [1, 1, 3, 1, 1, 16, 12] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 3, './i2': 3, './i3': 3}, 'j': {'./j1': 16, './j2': 16, './j3': 16}, 'k': {'./k1': 12}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 16, './i3': 3, './k1': 12}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 3, './i2': 3, './i3': 3}, 'j': {'./j1': 16, './j2': 16, './j3': 16}, 'k': {'./k1': 12}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 16, './i3': 3, './k1': 12}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] # CHECK-NEXT: sample 0: [1, 1, 1, 1, 1, 16, 1] # CHECK-NEXT: sample 1: [1, 1, 1, 1, 1, 16, 2] # CHECK-NEXT: sample 2: [1, 1, 1, 1, 1, 16, 3] @@ -128,4 +128,4 @@ # CHECK-NEXT: sample 98: [1, 21, 1, 1, 1, 32, 3] # CHECK-NEXT: sample 99: [1, 21, 1, 1, 2, 16, 1] # CHECK-NEXT: stats {'filtered_l2': 100, 'filtered_l1': 105, 'filtered_reg': 115, 'filtered_vec': 154, 'filtered': 2126, 'all': 2749} -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 21, './i2': 21, './i3': 1}, 'j': {'./j1': 32, './j2': 32, './j3': 16}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 16, './i3': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 21, './i2': 21, './i3': 1}, 'j': {'./j1': 32, './j2': 32, './j3': 16}, 'k': {'./k1': 1}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 16, './i3': 1, './k1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] diff --git a/tests/filecheck/search/test_matmul_pprprpvr_rnd.py b/tests/filecheck/search/test_matmul_pprprpvr_rnd.py index ff1fa2cba..e0f9d4475 100644 --- a/tests/filecheck/search/test_matmul_pprprpvr_rnd.py +++ b/tests/filecheck/search/test_matmul_pprprpvr_rnd.py @@ -39,4 +39,4 @@ # CHECK-NEXT: sample 18: [1, 1, 1, 1, 2, 16, 3] # CHECK-NEXT: sample 19: [7, 1, 3, 1, 1, 16, 2] # CHECK-NEXT: stats {'filtered_l2': 2, 'filtered_l1': 2, 'filtered_reg': 3, 'filtered_vec': 3, 'filtered': 70} -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 21, './i2': 3, './i3': 3}, 'j': {'./j1': 16, './j2': 16, './j3': 16}, 'k': {'./k1': 2}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 16, './i3': 3, './k1': 2}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 21, './i2': 3, './i3': 3}, 'j': {'./j1': 16, './j2': 16, './j3': 16}, 'k': {'./k1': 2}}, permutation={'.': ['./i', './j', './i1', './j1', './k', './i2', './j2', './k1', './i3', './j3']}, vectorization=['./j3'], parallelization=['./i', './j'], unrolling={'./j3': 16, './i3': 3, './k1': 2}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] diff --git a/tests/filecheck/search/test_matmul_prp.py b/tests/filecheck/search/test_matmul_prp.py index 967afc2c7..bd72343aa 100644 --- a/tests/filecheck/search/test_matmul_prp.py +++ b/tests/filecheck/search/test_matmul_prp.py @@ -12,30 +12,30 @@ utils.print_all_opt_schedules(backend, strategy) utils.print_exhaustive_samples(backend, strategy, 100) -# CHECK: schedule O0: [1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {}}, permutation={'.': ['./i', './j', './k', './i1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O1: [1, 1] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {}}, permutation={'.': ['./i', './j', './k', './i1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O2: [1, 16] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 16}, 'k': {}}, permutation={'.': ['./i', './j', './k', './i1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 16, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: schedule O3: [3, 16] -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 3}, 'j': {'./j1': 16}, 'k': {}}, permutation={'.': ['./i', './j', './k', './i1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 16, './i1': 3}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] -# CHECK-NEXT: sample 0: [1, 1] -# CHECK-NEXT: sample 1: [1, 2] -# CHECK-NEXT: sample 2: [1, 4] -# CHECK-NEXT: sample 3: [1, 8] -# CHECK-NEXT: sample 4: [1, 16] -# CHECK-NEXT: sample 5: [1, 32] -# CHECK-NEXT: sample 6: [3, 1] -# CHECK-NEXT: sample 7: [3, 2] -# CHECK-NEXT: sample 8: [3, 4] -# CHECK-NEXT: sample 9: [3, 8] -# CHECK-NEXT: sample 10: [3, 16] -# CHECK-NEXT: sample 11: [3, 32] -# CHECK-NEXT: sample 12: [7, 1] -# CHECK-NEXT: sample 13: [7, 2] -# CHECK-NEXT: sample 14: [7, 4] -# CHECK-NEXT: sample 15: [7, 8] -# CHECK-NEXT: sample 16: [7, 16] -# CHECK-NEXT: stats {'filtered': 17, 'all': 24} -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 7}, 'j': {'./j1': 16}, 'k': {}}, permutation={'.': ['./i', './j', './k', './i1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 16, './i1': 7}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK: schedule O0: [1, 1] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {}}, permutation={'.': ['./i', './j', './k', './i1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O1: [1, 1] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 1}, 'k': {}}, permutation={'.': ['./i', './j', './k', './i1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 1, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O2: [1, 16] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 1}, 'j': {'./j1': 16}, 'k': {}}, permutation={'.': ['./i', './j', './k', './i1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 16, './i1': 1}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: schedule O3: [3, 16] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 3}, 'j': {'./j1': 16}, 'k': {}}, permutation={'.': ['./i', './j', './k', './i1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 16, './i1': 3}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] +# CHECK-NEXT: sample 0: [1, 1] +# CHECK-NEXT: sample 1: [1, 2] +# CHECK-NEXT: sample 2: [1, 4] +# CHECK-NEXT: sample 3: [1, 8] +# CHECK-NEXT: sample 4: [1, 16] +# CHECK-NEXT: sample 5: [1, 32] +# CHECK-NEXT: sample 6: [3, 1] +# CHECK-NEXT: sample 7: [3, 2] +# CHECK-NEXT: sample 8: [3, 4] +# CHECK-NEXT: sample 9: [3, 8] +# CHECK-NEXT: sample 10: [3, 16] +# CHECK-NEXT: sample 11: [3, 32] +# CHECK-NEXT: sample 12: [7, 1] +# CHECK-NEXT: sample 13: [7, 2] +# CHECK-NEXT: sample 14: [7, 4] +# CHECK-NEXT: sample 15: [7, 8] +# CHECK-NEXT: sample 16: [7, 16] +# CHECK-NEXT: stats {'filtered': 17, 'all': 24} +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 7}, 'j': {'./j1': 16}, 'k': {}}, permutation={'.': ['./i', './j', './k', './i1', './j1']}, vectorization=['./j1'], parallelization=[], unrolling={'./j1': 16, './i1': 7}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] diff --git a/tests/filecheck/search/test_matmul_prp_rnd.py b/tests/filecheck/search/test_matmul_prp_rnd.py index 2e6fc5fea..ef2eaf32b 100644 --- a/tests/filecheck/search/test_matmul_prp_rnd.py +++ b/tests/filecheck/search/test_matmul_prp_rnd.py @@ -39,4 +39,4 @@ # CHECK-NEXT: sample 18: [3, 2] # CHECK-NEXT: sample 19: [21, 8] # CHECK-NEXT: stats {'filtered': 19} -# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 21}, 'j': {'./j1': 8}, 'k': {}}, permutation={'.': ['./i', './j', './k', './i1', './j1']}, vectorization=['./j1'], parallelization=['./i', './j'], unrolling={'./j1': 8, './i1': 21}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused=[])] +# CHECK-NEXT: [MlirNodeSchedule(node_name='%2_0', node_ident='__xtc_id_%2_0_', dims=['i', 'j'], loop_stamps=[], splits={}, tiles={'i': {}, 'j': {}}, permutation={'.': ['./i', './j']}, vectorization=[], parallelization=[], unrolling={}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[]), MlirNodeSchedule(node_name='%2', node_ident='__xtc_id_%2_', dims=['i', 'j', 'k'], loop_stamps=[], splits={}, tiles={'i': {'./i1': 21}, 'j': {'./j1': 8}, 'k': {}}, permutation={'.': ['./i', './j', './k', './i1', './j1']}, vectorization=['./j1'], parallelization=['./i', './j'], unrolling={'./j1': 8, './i1': 21}, packed_buffers={}, memory_mesh={}, processor_mesh={}, distribution={}, distributed_buffers={}, fused_producers=[], fused_consumers=[])] From 5f3b31b757738079d944da675e2c3aee6372317a Mon Sep 17 00:00:00 2001 From: Liam Semeria Date: Thu, 6 Aug 2026 11:52:41 +0200 Subject: [PATCH 3/3] scheduler: modified fuse_consumer_at to match the in progress tvm implementation --- src/xtc/backends/jir/JIRScheduler.py | 4 +-- src/xtc/backends/mlir/MlirCompilerPasses.py | 33 +++++++++++++++++-- src/xtc/backends/mlir/MlirNodeScheduler.py | 10 +++--- src/xtc/backends/mlir/MlirScheduler.py | 6 ++-- src/xtc/backends/tvm/TVMScheduler.py | 4 +-- src/xtc/itf/schd/scheduler.py | 13 +++----- .../test_conv2d_relu_tensor_fused.py | 2 +- .../test_matmul_relu_mlir_tensor_fused.py | 2 +- 8 files changed, 44 insertions(+), 30 deletions(-) diff --git a/src/xtc/backends/jir/JIRScheduler.py b/src/xtc/backends/jir/JIRScheduler.py index bd97d258b..e12c358ca 100644 --- a/src/xtc/backends/jir/JIRScheduler.py +++ b/src/xtc/backends/jir/JIRScheduler.py @@ -319,9 +319,7 @@ def fuse_producer_at( pass @override - def fuse_consumer_at( - self, axis: str, consumer_name: str, root: str = DEFAULT_ROOT - ) -> None: + def fuse_consumer_at(self, axis: str, root: str = DEFAULT_ROOT) -> None: # TODO: not implemented for now pass diff --git a/src/xtc/backends/mlir/MlirCompilerPasses.py b/src/xtc/backends/mlir/MlirCompilerPasses.py index 1b2019bba..df7370e8f 100644 --- a/src/xtc/backends/mlir/MlirCompilerPasses.py +++ b/src/xtc/backends/mlir/MlirCompilerPasses.py @@ -389,10 +389,14 @@ def _fuse_consumers_into_loops( unscheduled_handles: set[str | None], ): assert self._named_sequence is not None - fuse_root = parent_name(schedule.fused_consumers[0][0]) - for fuse_axis, op_name in schedule.fused_consumers: + + fuse_root = parent_name(schedule.fused_consumers[0]) + for fuse_axis in schedule.fused_consumers: # derive handle of consumer - consumer_id = f"__xtc_id_{op_name}_" + consumer_handles = find_consumer_handles( + self._mlir_program.mlir_module, schedule.node_ident + ) + consumer_id = consumer_handles[0] unscheduled_handles.add(consumer_id) # fuse consumer into all loops until the fuse_axis fuse_loops = [] @@ -716,6 +720,29 @@ def _collect_fused_producers(self, unscheduled_handles: set[str | None]): return fused_producer_handles +def find_consumer_handles(module: Module, root_handle: str) -> list[str | None]: + # returns the handles for each consumer op of the operation specified by root_handle + consumer_handles: list[str | None] = [] + root_op = None + for func_op in module.body.operations: + for op in func_op.regions[0].blocks[0].operations: + if root_handle in op.attributes: + root_op = op + break + if root_op: + break + + if not root_op: + return consumer_handles + + for use in root_op.results[0].uses: + consumer_op = use.owner + for attr in consumer_op.attributes: + if attr.startswith("__xtc_id_"): + consumer_handles.append(attr) + return consumer_handles + + def find_producer_handles(module: Module, root_handle: str) -> list[str | None]: # returns the handles for each operand of the operation specified by root_handle producer_handles: list[str | None] = [] diff --git a/src/xtc/backends/mlir/MlirNodeScheduler.py b/src/xtc/backends/mlir/MlirNodeScheduler.py index 6c9c48577..eea91e4e9 100644 --- a/src/xtc/backends/mlir/MlirNodeScheduler.py +++ b/src/xtc/backends/mlir/MlirNodeScheduler.py @@ -32,7 +32,7 @@ class MlirNodeSchedule: distribution: dict[str, str] distributed_buffers: dict[str, dict] fused_producers: list[tuple[str, int]] - fused_consumers: list[tuple[str, str]] + fused_consumers: list[str] def index_of_dim(self, dim: str) -> int: return list(self.dims).index(dim) @@ -94,7 +94,7 @@ def __init__( self.distribution: dict[str, str] = {} self.distributed_buffers: dict[str, dict] = {} self.fused_producers: list[tuple[str, int]] = [] - self.fused_consumers: list[tuple[str, str]] = [] + self.fused_consumers: list[str] = [] def mlir_node_schedule(self) -> MlirNodeSchedule: if not self.permutation: @@ -234,7 +234,5 @@ def fuse_producer_at( ) -> None: self.fused_producers.append((make_loop_name(root, axis), input_idx)) - def fuse_consumer_at( - self, axis: str, consumer_name: str, root: str = DEFAULT_ROOT - ) -> None: - self.fused_consumers.append((make_loop_name(root, axis), consumer_name)) + def fuse_consumer_at(self, axis: str, root: str = DEFAULT_ROOT) -> None: + self.fused_consumers.append(make_loop_name(root, axis)) diff --git a/src/xtc/backends/mlir/MlirScheduler.py b/src/xtc/backends/mlir/MlirScheduler.py index 4a6c3c619..82a365ee7 100644 --- a/src/xtc/backends/mlir/MlirScheduler.py +++ b/src/xtc/backends/mlir/MlirScheduler.py @@ -175,10 +175,8 @@ def fuse_producer_at( self._current_scheduler.fuse_producer_at(axis, input_idx, root=root) @override - def fuse_consumer_at( - self, axis: str, consumer_name: str, root: str = DEFAULT_ROOT - ) -> None: - self._current_scheduler.fuse_consumer_at(axis, consumer_name, root=root) + def fuse_consumer_at(self, axis: str, root: str = DEFAULT_ROOT) -> None: + self._current_scheduler.fuse_consumer_at(axis, root=root) @override def define_memory_mesh(self, axes: dict[str, int]) -> None: diff --git a/src/xtc/backends/tvm/TVMScheduler.py b/src/xtc/backends/tvm/TVMScheduler.py index 233ec6bab..2f94f3acd 100644 --- a/src/xtc/backends/tvm/TVMScheduler.py +++ b/src/xtc/backends/tvm/TVMScheduler.py @@ -468,9 +468,7 @@ def fuse_producer_at( self.fused.append((axis, input_idx)) @override - def fuse_consumer_at( - self, axis: str, consumer_name: str, root: str = DEFAULT_ROOT - ) -> None: + def fuse_consumer_at(self, axis: str, root: str = DEFAULT_ROOT) -> None: # TODO: not implemented for now pass diff --git a/src/xtc/itf/schd/scheduler.py b/src/xtc/itf/schd/scheduler.py index 961f9fa70..97e17a4f2 100644 --- a/src/xtc/itf/schd/scheduler.py +++ b/src/xtc/itf/schd/scheduler.py @@ -233,19 +233,14 @@ def fuse_producer_at( ... @abstractmethod - def fuse_consumer_at( - self, axis: str, consumer_name: str, root: str = DEFAULT_ROOT - ) -> None: - """Fuse consumer computation at the given producer location. + def fuse_consumer_at(self, axis: str, root: str = DEFAULT_ROOT) -> None: + """Fuse the consumer computation at the given producer location. - Given the name of a direct consumer of the operation, - Fuse the computation at the given scheduled consumer axis. - The necessary output slices and computations will be inserted - for computing the output tile at the given axis location. + The consumer of output zero is fused at the given scheduled producer + axis. Other outputs are not currently supported. Args: axis: localisation of the fusion in the producer - consumer_name: the name of the consumer operation to be fused root: the parent split (or the operator's absolute root) """ ... diff --git a/tests/filecheck/backends/tensor_dialect/test_conv2d_relu_tensor_fused.py b/tests/filecheck/backends/tensor_dialect/test_conv2d_relu_tensor_fused.py index 99bb973c6..de64b67fc 100644 --- a/tests/filecheck/backends/tensor_dialect/test_conv2d_relu_tensor_fused.py +++ b/tests/filecheck/backends/tensor_dialect/test_conv2d_relu_tensor_fused.py @@ -18,7 +18,7 @@ impl = Backend(graph, use_tensor_dialect=True) sch = impl.get_scheduler(default_node="O") -sch.fuse_consumer_at("f","relu") +sch.fuse_consumer_at("f") sched = sch.schedule() comp = impl.get_compiler( diff --git a/tests/filecheck/backends/tensor_dialect/test_matmul_relu_mlir_tensor_fused.py b/tests/filecheck/backends/tensor_dialect/test_matmul_relu_mlir_tensor_fused.py index 6e7d99662..ad007b715 100644 --- a/tests/filecheck/backends/tensor_dialect/test_matmul_relu_mlir_tensor_fused.py +++ b/tests/filecheck/backends/tensor_dialect/test_matmul_relu_mlir_tensor_fused.py @@ -18,7 +18,7 @@ impl = Backend(graph, use_tensor_dialect=True) sch = impl.get_scheduler(default_node="matmul") -sch.fuse_consumer_at("j","relu") +sch.fuse_consumer_at("j") sched = sch.schedule() comp = impl.get_compiler(