[Mlir-commits] [mlir] 7cf203e - [mlir][Linalg][Transform] Drop spurious assertion in packGreedilyOp
Nicolas Vasilache
llvmlistbot at llvm.org
Tue Mar 28 00:58:52 PDT 2023
Author: Nicolas Vasilache
Date: 2023-03-28T00:56:44-07:00
New Revision: 7cf203e73922b8eaa4c23fba30702d7954eba107
URL: https://github.com/llvm/llvm-project/commit/7cf203e73922b8eaa4c23fba30702d7954eba107
DIFF: https://github.com/llvm/llvm-project/commit/7cf203e73922b8eaa4c23fba30702d7954eba107.diff
LOG: [mlir][Linalg][Transform] Drop spurious assertion in packGreedilyOp
`transform.pack_greedily` supports skipping dimensions in which case we
may well end up with e.g. a matvec innermost.
We should not spuriously crash in such cases.
Added:
Modified:
mlir/lib/Dialect/Linalg/TransformOps/LinalgTransformOps.cpp
mlir/test/Dialect/Linalg/transform-pack-greedily.mlir
Removed:
################################################################################
diff --git a/mlir/lib/Dialect/Linalg/TransformOps/LinalgTransformOps.cpp b/mlir/lib/Dialect/Linalg/TransformOps/LinalgTransformOps.cpp
index 44ef944682a1a..e818069bb6376 100644
--- a/mlir/lib/Dialect/Linalg/TransformOps/LinalgTransformOps.cpp
+++ b/mlir/lib/Dialect/Linalg/TransformOps/LinalgTransformOps.cpp
@@ -1442,11 +1442,10 @@ packMatmulGreedily(RewriterBase &rewriter, LinalgOp linalgOp,
DBGSNL(););
// TODO: If we wanted to give the genericOp a name after packing, after
- // calling `pack` would be a good time.
- auto packingRes = linalg::pack(rewriter, genericOp, adjustedPackedSizes);
- assert(containsMostMinorMatmul(packingRes->packedLinalgOp) &&
- "failed to pack to a most minor matmul");
- return packingRes;
+ // calling `pack` would be a good time. One would still need to check that
+ // `containsMostMinorMatmul(packingRes->packedLinalgOp)` is true, since we
+ // also allow degenerate matmul cases (i.e. matvec, dot).
+ return linalg::pack(rewriter, genericOp, adjustedPackedSizes);
}
DiagnosedSilenceableFailure
diff --git a/mlir/test/Dialect/Linalg/transform-pack-greedily.mlir b/mlir/test/Dialect/Linalg/transform-pack-greedily.mlir
index fdb1699e7bb4a..bd567e55b081f 100644
--- a/mlir/test/Dialect/Linalg/transform-pack-greedily.mlir
+++ b/mlir/test/Dialect/Linalg/transform-pack-greedily.mlir
@@ -275,3 +275,54 @@ transform.sequence failures(propagate) {
matmul_inner_dims_order = [1, 2, 0]
: (!transform.op<"linalg.generic">) -> !transform.op<"linalg.generic">
}
+
+
+// -----
+
+!A_mk = tensor<1023x255xf32>
+!B_nk = tensor<127x255xf32>
+!C_nm = tensor<127x1023xf32>
+
+#mkn_accesses = [
+ affine_map<(m, n, k) -> (m, k)>,
+ affine_map<(m, n, k) -> (n, k)>,
+ affine_map<(m, n, k) -> (n, m)>
+]
+#mkn_trait = {
+ indexing_maps = #mkn_accesses,
+ iterator_types = ["parallel", "parallel", "reduction"]
+}
+
+// Normalized dims are: ( k, m, n)(kk, mm)
+// CHECK-DAG: #[[$km_kkmm:.*]] = affine_map<(d0, d1, d2, d3, d4) -> (d1, d0, d3)>
+// CHECK-DAG: #[[$kn_kknn:.*]] = affine_map<(d0, d1, d2, d3, d4) -> (d2, d0, d3, d4)>
+// CHECK-DAG: #[[$mn_mmnn:.*]] = affine_map<(d0, d1, d2, d3, d4) -> (d2, d1, d4)>
+
+// CHECK-LABEL: @matmul_mk_nk_nm(
+func.func @matmul_mk_nk_nm(%A : !A_mk, %B : !B_nk, %C : !C_nm) -> !C_nm {
+ // CHECK: linalg.generic
+ // CHECK-SAME: indexing_maps = [#[[$mk_kkmm]], #[[$kn_kknn]], #[[$mn_mmnn]]]
+ // CHECK-SAME: ["reduction", "parallel", "parallel", "reduction", "parallel"]}
+ // CHECK-SAME: ins(%{{.*}} : tensor<1023x8x32xf32>, tensor<1x8x32x130xf32>)
+ // CHECK-SAME: outs(%{{.*}} : tensor<1x1023x130xf32>)
+ %0 = linalg.generic #mkn_trait ins(%A, %B : !A_mk, !B_nk) outs(%C : !C_nm) {
+ ^bb0(%a: f32, %b: f32, %c: f32):
+ %d = arith.mulf %a, %b : f32
+ %e = arith.addf %c, %d : f32
+ linalg.yield %e : f32
+ } -> !C_nm
+ return %0 : !C_nm
+}
+
+transform.sequence failures(propagate) {
+^bb1(%module_op: !pdl.operation):
+ %generic = transform.structured.match ops{["linalg.generic"]} in %module_op : (!pdl.operation) -> !transform.op<"linalg.generic">
+ transform.structured.pack_greedily %generic
+ // In this spec, the "n" dimension is neither packed not unpacked.
+ // We don't end up with an innermost matmul after packing but only with an
+ // innermost matvec.
+ matmul_packed_sizes = [0, 0, 32]
+ matmul_padded_sizes_next_multiple_of = [0, 10, 0]
+ matmul_inner_dims_order = [1, 2, 0]
+ : (!transform.op<"linalg.generic">) -> !transform.op<"linalg.generic">
+}
More information about the Mlir-commits
mailing list