mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-25 15:46:06 +00:00

1. Explicit value means the non-zero value in a sparse tensor. If explicitVal is set, then all the non-zero values in the tensor have the same explicit value. The default value Attribute() indicates that it is not set. 2. Implicit value means the "zero" value in a sparse tensor. If implicitVal is set, then the "zero" value in the tensor is equal to the implicit value. For now, we only support `0` as the implicit value but it could be extended in the future. The default value Attribute() indicates that the implicit value is `0` (same type as the tensor element type). Example: ``` #CSR = #sparse_tensor.encoding<{ map = (d0, d1) -> (d0 : dense, d1 : compressed), posWidth = 64, crdWidth = 64, explicitVal = 1 : i64, implicitVal = 0 : i64 }> ``` Note: this PR tests that implicitVal could be set to other values as well. The following PR will add verifier and reject any value that's not zero for implicitVal.
91 lines
3.2 KiB
C
91 lines
3.2 KiB
C
//===- sparse_tensor.c - Test of sparse_tensor APIs -----------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM
|
|
// Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// RUN: mlir-capi-sparse-tensor-test 2>&1 | FileCheck %s
|
|
|
|
#include "mlir-c/Dialect/SparseTensor.h"
|
|
#include "mlir-c/IR.h"
|
|
#include "mlir-c/RegisterEverything.h"
|
|
|
|
#include <assert.h>
|
|
#include <inttypes.h>
|
|
#include <math.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
// CHECK-LABEL: testRoundtripEncoding()
|
|
static int testRoundtripEncoding(MlirContext ctx) {
|
|
fprintf(stderr, "testRoundtripEncoding()\n");
|
|
// clang-format off
|
|
const char *originalAsm =
|
|
"#sparse_tensor.encoding<{ "
|
|
"map = [s0](d0, d1) -> (s0 : dense, d0 : compressed, d1 : compressed), "
|
|
"posWidth = 32, crdWidth = 64, explicitVal = 1 : i64}>";
|
|
// clang-format on
|
|
MlirAttribute originalAttr =
|
|
mlirAttributeParseGet(ctx, mlirStringRefCreateFromCString(originalAsm));
|
|
// CHECK: isa: 1
|
|
fprintf(stderr, "isa: %d\n",
|
|
mlirAttributeIsASparseTensorEncodingAttr(originalAttr));
|
|
MlirAffineMap dimToLvl =
|
|
mlirSparseTensorEncodingAttrGetDimToLvl(originalAttr);
|
|
// CHECK: (d0, d1)[s0] -> (s0, d0, d1)
|
|
mlirAffineMapDump(dimToLvl);
|
|
// CHECK: level_type: 65536
|
|
// CHECK: level_type: 262144
|
|
// CHECK: level_type: 262144
|
|
MlirAffineMap lvlToDim =
|
|
mlirSparseTensorEncodingAttrGetLvlToDim(originalAttr);
|
|
int lvlRank = mlirSparseTensorEncodingGetLvlRank(originalAttr);
|
|
MlirSparseTensorLevelType *lvlTypes =
|
|
malloc(sizeof(MlirSparseTensorLevelType) * lvlRank);
|
|
for (int l = 0; l < lvlRank; ++l) {
|
|
lvlTypes[l] = mlirSparseTensorEncodingAttrGetLvlType(originalAttr, l);
|
|
fprintf(stderr, "level_type: %" PRIu64 "\n", lvlTypes[l]);
|
|
}
|
|
// CHECK: posWidth: 32
|
|
int posWidth = mlirSparseTensorEncodingAttrGetPosWidth(originalAttr);
|
|
fprintf(stderr, "posWidth: %d\n", posWidth);
|
|
// CHECK: crdWidth: 64
|
|
int crdWidth = mlirSparseTensorEncodingAttrGetCrdWidth(originalAttr);
|
|
fprintf(stderr, "crdWidth: %d\n", crdWidth);
|
|
|
|
// CHECK: explicitVal: 1 : i64
|
|
MlirAttribute explicitVal =
|
|
mlirSparseTensorEncodingAttrGetExplicitVal(originalAttr);
|
|
fprintf(stderr, "explicitVal: ");
|
|
mlirAttributeDump(explicitVal);
|
|
// CHECK: implicitVal: <<NULL ATTRIBUTE>>
|
|
MlirAttribute implicitVal =
|
|
mlirSparseTensorEncodingAttrGetImplicitVal(originalAttr);
|
|
fprintf(stderr, "implicitVal: ");
|
|
mlirAttributeDump(implicitVal);
|
|
|
|
MlirAttribute newAttr = mlirSparseTensorEncodingAttrGet(
|
|
ctx, lvlRank, lvlTypes, dimToLvl, lvlToDim, posWidth, crdWidth,
|
|
explicitVal, implicitVal);
|
|
mlirAttributeDump(newAttr); // For debugging filecheck output.
|
|
// CHECK: equal: 1
|
|
fprintf(stderr, "equal: %d\n", mlirAttributeEqual(originalAttr, newAttr));
|
|
free(lvlTypes);
|
|
return 0;
|
|
}
|
|
|
|
int main(void) {
|
|
MlirContext ctx = mlirContextCreate();
|
|
mlirDialectHandleRegisterDialect(mlirGetDialectHandle__sparse_tensor__(),
|
|
ctx);
|
|
if (testRoundtripEncoding(ctx))
|
|
return 1;
|
|
|
|
mlirContextDestroy(ctx);
|
|
return 0;
|
|
}
|