[Mlir-commits] [mlir] 6eb0332 - [mlir][sparse] test pack copy behavior
Aart Bik
llvmlistbot at llvm.org
Thu Aug 17 17:00:38 PDT 2023
Author: Aart Bik
Date: 2023-08-17T17:00:30-07:00
New Revision: 6eb0332e72e5d9c5db1f89bac28770bc6f0725c2
URL: https://github.com/llvm/llvm-project/commit/6eb0332e72e5d9c5db1f89bac28770bc6f0725c2
DIFF: https://github.com/llvm/llvm-project/commit/6eb0332e72e5d9c5db1f89bac28770bc6f0725c2.diff
LOG: [mlir][sparse] test pack copy behavior
Reviewed By: Peiming
Differential Revision: https://reviews.llvm.org/D158229
Added:
mlir/test/Dialect/SparseTensor/pack_copy.mlir
Modified:
Removed:
################################################################################
diff --git a/mlir/test/Dialect/SparseTensor/pack_copy.mlir b/mlir/test/Dialect/SparseTensor/pack_copy.mlir
new file mode 100644
index 00000000000000..93008261d9f1ea
--- /dev/null
+++ b/mlir/test/Dialect/SparseTensor/pack_copy.mlir
@@ -0,0 +1,103 @@
+// RUN: mlir-opt %s --sparsification-and-bufferization | FileCheck %s
+
+#CSR = #sparse_tensor.encoding<{
+ lvlTypes = ["dense","compressed"],
+ dimToLvl = affine_map<(i,j) -> (i,j)>,
+ crdWidth = 32,
+ posWidth = 32
+}>
+
+#trait_scale = {
+ indexing_maps = [
+ affine_map<(i,j) -> (i,j)> // X (out)
+ ],
+ iterator_types = ["parallel", "parallel"],
+ doc = "X(i,j) = X(i,j) * 2"
+}
+
+//
+// Pass in the buffers of the sparse tensor, marked non-writable.
+// This forces a copy for the values and positions.
+//
+// CHECK-LABEL: func.func @foo(
+// CHECK-SAME: %[[VAL:.*]]: memref<3xf64>,
+// CHECK-SAME: %[[CRD:.*]]: memref<3xi32>,
+// CHECK-SAME: %[[POS:.*]]: memref<11xi32>)
+// CHECK: %[[ALLOC1:.*]] = memref.alloc() {alignment = 64 : i64} : memref<3xf64>
+// CHECK: memref.copy %[[VAL]], %[[ALLOC1]] : memref<3xf64> to memref<3xf64>
+// CHECK: %[[ALLOC2:.*]] = memref.alloc() {alignment = 64 : i64} : memref<11xi32>
+// CHECK: memref.copy %[[POS]], %[[ALLOC2]] : memref<11xi32> to memref<11xi32>
+// CHECK-NOT: memref.copy
+// CHECK: return
+//
+func.func @foo(%arg0: tensor<3xf64> {bufferization.writable = false},
+ %arg1: tensor<3xi32> {bufferization.writable = false},
+ %arg2: tensor<11xi32> {bufferization.writable = false}) -> (index) {
+ //
+ // Pack the buffers into a sparse tensors.
+ //
+ %pack = sparse_tensor.pack %arg0, %arg2, %arg1
+ : tensor<3xf64>,
+ tensor<11xi32>,
+ tensor<3xi32> to tensor<10x10xf64, #CSR>
+
+ //
+ // Scale the sparse tensor "in-place" (this has no impact on the final
+ // number of entries, but introduces reading the positions buffer
+ // and writing into the value buffer).
+ //
+ %c = arith.constant 2.0 : f64
+ %s = linalg.generic #trait_scale
+ outs(%pack: tensor<10x10xf64, #CSR>) {
+ ^bb(%x: f64):
+ %1 = arith.mulf %x, %c : f64
+ linalg.yield %1 : f64
+ } -> tensor<10x10xf64, #CSR>
+
+ //
+ // Return number of entries in the scaled sparse tensor.
+ //
+ %nse = sparse_tensor.number_of_entries %s : tensor<10x10xf64, #CSR>
+ return %nse : index
+}
+
+//
+// Pass in the buffers of the sparse tensor, marked writable.
+//
+// CHECK-LABEL: func.func @bar(
+// CHECK-SAME: %[[VAL:.*]]: memref<3xf64>,
+// CHECK-SAME: %[[CRD:.*]]: memref<3xi32>,
+// CHECK-SAME: %[[POS:.*]]: memref<11xi32>)
+// CHECK-NOT: memref.copy
+// CHECK: return
+//
+func.func @bar(%arg0: tensor<3xf64> {bufferization.writable = true},
+ %arg1: tensor<3xi32> {bufferization.writable = true},
+ %arg2: tensor<11xi32> {bufferization.writable = true}) -> (index) {
+ //
+ // Pack the buffers into a sparse tensors.
+ //
+ %pack = sparse_tensor.pack %arg0, %arg2, %arg1
+ : tensor<3xf64>,
+ tensor<11xi32>,
+ tensor<3xi32> to tensor<10x10xf64, #CSR>
+
+ //
+ // Scale the sparse tensor "in-place" (this has no impact on the final
+ // number of entries, but introduces reading the positions buffer
+ // and writing into the value buffer).
+ //
+ %c = arith.constant 2.0 : f64
+ %s = linalg.generic #trait_scale
+ outs(%pack: tensor<10x10xf64, #CSR>) {
+ ^bb(%x: f64):
+ %1 = arith.mulf %x, %c : f64
+ linalg.yield %1 : f64
+ } -> tensor<10x10xf64, #CSR>
+
+ //
+ // Return number of entries in the scaled sparse tensor.
+ //
+ %nse = sparse_tensor.number_of_entries %s : tensor<10x10xf64, #CSR>
+ return %nse : index
+}
More information about the Mlir-commits
mailing list