forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[mlir][sparse] add assemble test for Batched-CSR and CSR-Dense (llvm#…
…81660) These are formats supported by PyTorch sparse, so good to make sure that our assemble instructions work on these.
- Loading branch information
Showing
1 changed file
with
95 additions
and
0 deletions.
There are no files selected for viewing
95 changes: 95 additions & 0 deletions
95
mlir/test/Integration/Dialect/SparseTensor/CPU/sparse_pack_d.mlir
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
//-------------------------------------------------------------------------------------------------- | ||
// WHEN CREATING A NEW TEST, PLEASE JUST COPY & PASTE WITHOUT EDITS. | ||
// | ||
// Set-up that's shared across all tests in this directory. In principle, this | ||
// config could be moved to lit.local.cfg. However, there are downstream users that | ||
// do not use these LIT config files. Hence why this is kept inline. | ||
// | ||
// DEFINE: %{sparsifier_opts} = enable-runtime-library=true | ||
// DEFINE: %{sparsifier_opts_sve} = enable-arm-sve=true %{sparsifier_opts} | ||
// DEFINE: %{compile} = mlir-opt %s --sparsifier="%{sparsifier_opts}" | ||
// DEFINE: %{compile_sve} = mlir-opt %s --sparsifier="%{sparsifier_opts_sve}" | ||
// DEFINE: %{run_libs} = -shared-libs=%mlir_c_runner_utils,%mlir_runner_utils | ||
// DEFINE: %{run_opts} = -e entry -entry-point-result=void | ||
// DEFINE: %{run} = mlir-cpu-runner %{run_opts} %{run_libs} | ||
// DEFINE: %{run_sve} = %mcr_aarch64_cmd --march=aarch64 --mattr="+sve" %{run_opts} %{run_libs} | ||
// | ||
// DEFINE: %{env} = | ||
//-------------------------------------------------------------------------------------------------- | ||
|
||
// RUN: %{compile} | %{run} | FileCheck %s | ||
// | ||
// Do the same run, but now with direct IR generation. | ||
// REDEFINE: %{sparsifier_opts} = enable-runtime-library=false | ||
// RUN: %{compile} | %{run} | FileCheck %s | ||
|
||
#BatchedCSR = #sparse_tensor.encoding<{ | ||
map = (d0, d1, d2) -> (d0 : dense, d1 : dense, d2 : compressed), | ||
posWidth = 64, | ||
crdWidth = 32 | ||
}> | ||
|
||
#CSRDense = #sparse_tensor.encoding<{ | ||
map = (d0, d1, d2) -> (d0 : dense, d1 : compressed, d2 : dense), | ||
posWidth = 64, | ||
crdWidth = 32 | ||
}> | ||
|
||
// Test with batched-CSR and CSR-dense. | ||
module { | ||
// | ||
// Main driver. | ||
// | ||
func.func @entry() { | ||
%c0 = arith.constant 0 : index | ||
%f0 = arith.constant 0.0 : f32 | ||
|
||
// | ||
// Setup BatchedCSR. | ||
// | ||
|
||
%data1 = arith.constant dense< | ||
[ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, | ||
9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0 ]> : tensor<16xf32> | ||
%pos1 = arith.constant dense< | ||
[ 0, 2, 3, 4, 6, 6, 7, 9, 11, 13, 14, 15, 16 ]> : tensor<13xi64> | ||
%crd1 = arith.constant dense< | ||
[ 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1]> : tensor<16xi32> | ||
|
||
%s1 = sparse_tensor.assemble %data1, %pos1, %crd1 : tensor<16xf32>, tensor<13xi64>, tensor<16xi32> to tensor<4x3x2xf32, #BatchedCSR> | ||
|
||
// | ||
// Setup CSRDense. | ||
// | ||
|
||
%data2 = arith.constant dense< | ||
[ 1.0, 2.0, 0.0, 3.0, 4.0, 0.0, 5.0, 6.0, 0.0, 7.0, 8.0, | ||
9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 0.0, 0.0, 15.0, 0.0, 16.0 ]> : tensor<22xf32> | ||
%pos2 = arith.constant dense< | ||
[ 0, 3, 5, 8, 11 ]> : tensor<5xi64> | ||
%crd2 = arith.constant dense< | ||
[ 0, 1, 2, 0, 2, 0, 1, 2, 0, 1, 2 ]> : tensor<11xi32> | ||
|
||
%s2 = sparse_tensor.assemble %data2, %pos2, %crd2 : tensor<22xf32>, tensor<5xi64>, tensor<11xi32> to tensor<4x3x2xf32, #CSRDense> | ||
|
||
// | ||
// Verify. | ||
// | ||
// CHECK: ( ( ( 1, 2 ), ( 0, 3 ), ( 4, 0 ) ), ( ( 5, 6 ), ( 0, 0 ), ( 0, 7 ) ), ( ( 8, 9 ), ( 10, 11 ), ( 12, 13 ) ), ( ( 14, 0 ), ( 0, 15 ), ( 0, 16 ) ) ) | ||
// CHECK: ( ( ( 1, 2 ), ( 0, 3 ), ( 4, 0 ) ), ( ( 5, 6 ), ( 0, 0 ), ( 0, 7 ) ), ( ( 8, 9 ), ( 10, 11 ), ( 12, 13 ) ), ( ( 14, 0 ), ( 0, 15 ), ( 0, 16 ) ) ) | ||
// | ||
|
||
%d1 = sparse_tensor.convert %s1 : tensor<4x3x2xf32, #BatchedCSR> to tensor<4x3x2xf32> | ||
%v1 = vector.transfer_read %d1[%c0, %c0, %c0], %f0 : tensor<4x3x2xf32>, vector<4x3x2xf32> | ||
vector.print %v1 : vector<4x3x2xf32> | ||
|
||
%d2 = sparse_tensor.convert %s2 : tensor<4x3x2xf32, #CSRDense> to tensor<4x3x2xf32> | ||
%v2 = vector.transfer_read %d1[%c0, %c0, %c0], %f0 : tensor<4x3x2xf32>, vector<4x3x2xf32> | ||
vector.print %v2 : vector<4x3x2xf32> | ||
|
||
// FIXME: doing this explicitly crashes runtime | ||
// bufferization.dealloc_tensor %s1 : tensor<4x3x2xf32, #BatchedCSR> | ||
// bufferization.dealloc_tensor %s2 : tensor<4x3x2xf32, #CSRDense> | ||
return | ||
} | ||
} |