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.
116 lines
4.3 KiB
C
116 lines
4.3 KiB
C
//===-- mlir-c/Dialect/SparseTensor.h - C API for SparseTensor ----*- C -*-===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef MLIR_C_DIALECT_SPARSETENSOR_H
|
|
#define MLIR_C_DIALECT_SPARSETENSOR_H
|
|
|
|
#include "mlir-c/AffineMap.h"
|
|
#include "mlir-c/IR.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
MLIR_DECLARE_CAPI_DIALECT_REGISTRATION(SparseTensor, sparse_tensor);
|
|
|
|
/// Dimension level types (and properties) that define sparse tensors.
|
|
/// See the documentation in SparseTensorAttrDefs.td for their meaning.
|
|
///
|
|
/// These correspond to SparseTensorEncodingAttr::LevelType in the C++ API.
|
|
/// If updating, keep them in sync and update the static_assert in the impl
|
|
/// file.
|
|
typedef uint64_t MlirSparseTensorLevelType;
|
|
|
|
enum MlirSparseTensorLevelFormat {
|
|
MLIR_SPARSE_TENSOR_LEVEL_DENSE = 0x000000010000,
|
|
MLIR_SPARSE_TENSOR_LEVEL_BATCH = 0x000000020000,
|
|
MLIR_SPARSE_TENSOR_LEVEL_COMPRESSED = 0x000000040000,
|
|
MLIR_SPARSE_TENSOR_LEVEL_SINGLETON = 0x000000080000,
|
|
MLIR_SPARSE_TENSOR_LEVEL_LOOSE_COMPRESSED = 0x000000100000,
|
|
MLIR_SPARSE_TENSOR_LEVEL_N_OUT_OF_M = 0x000000200000,
|
|
};
|
|
|
|
enum MlirSparseTensorLevelPropertyNondefault {
|
|
MLIR_SPARSE_PROPERTY_NON_UNIQUE = 0x0001,
|
|
MLIR_SPARSE_PROPERTY_NON_ORDERED = 0x0002,
|
|
};
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// SparseTensorEncodingAttr
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
/// Checks whether the given attribute is a `sparse_tensor.encoding` attribute.
|
|
MLIR_CAPI_EXPORTED bool
|
|
mlirAttributeIsASparseTensorEncodingAttr(MlirAttribute attr);
|
|
|
|
/// Creates a `sparse_tensor.encoding` attribute with the given parameters.
|
|
MLIR_CAPI_EXPORTED MlirAttribute mlirSparseTensorEncodingAttrGet(
|
|
MlirContext ctx, intptr_t lvlRank,
|
|
MlirSparseTensorLevelType const *lvlTypes, MlirAffineMap dimToLvl,
|
|
MlirAffineMap lvlTodim, int posWidth, int crdWidth,
|
|
MlirAttribute explicitVal, MlirAttribute implicitVal);
|
|
|
|
/// Returns the level-rank of the `sparse_tensor.encoding` attribute.
|
|
MLIR_CAPI_EXPORTED intptr_t
|
|
mlirSparseTensorEncodingGetLvlRank(MlirAttribute attr);
|
|
|
|
/// Returns a specified level-type of the `sparse_tensor.encoding` attribute.
|
|
MLIR_CAPI_EXPORTED MlirSparseTensorLevelType
|
|
mlirSparseTensorEncodingAttrGetLvlType(MlirAttribute attr, intptr_t lvl);
|
|
|
|
/// Returns a specified level-format of the `sparse_tensor.encoding` attribute.
|
|
MLIR_CAPI_EXPORTED enum MlirSparseTensorLevelFormat
|
|
mlirSparseTensorEncodingAttrGetLvlFmt(MlirAttribute attr, intptr_t lvl);
|
|
|
|
/// Returns the dimension-to-level mapping of the `sparse_tensor.encoding`
|
|
/// attribute.
|
|
MLIR_CAPI_EXPORTED MlirAffineMap
|
|
mlirSparseTensorEncodingAttrGetDimToLvl(MlirAttribute attr);
|
|
|
|
/// Returns the level-to-dimension mapping of the `sparse_tensor.encoding`
|
|
/// attribute.
|
|
MLIR_CAPI_EXPORTED MlirAffineMap
|
|
mlirSparseTensorEncodingAttrGetLvlToDim(MlirAttribute attr);
|
|
|
|
/// Returns the position bitwidth of the `sparse_tensor.encoding` attribute.
|
|
MLIR_CAPI_EXPORTED int
|
|
mlirSparseTensorEncodingAttrGetPosWidth(MlirAttribute attr);
|
|
|
|
/// Returns the coordinate bitwidth of the `sparse_tensor.encoding` attribute.
|
|
MLIR_CAPI_EXPORTED int
|
|
mlirSparseTensorEncodingAttrGetCrdWidth(MlirAttribute attr);
|
|
|
|
/// Returns the explicit value of the `sparse_tensor.encoding` attribute.
|
|
MLIR_CAPI_EXPORTED MlirAttribute
|
|
mlirSparseTensorEncodingAttrGetExplicitVal(MlirAttribute attr);
|
|
|
|
/// Returns the implicit value of the `sparse_tensor.encoding` attribute.
|
|
MLIR_CAPI_EXPORTED MlirAttribute
|
|
mlirSparseTensorEncodingAttrGetImplicitVal(MlirAttribute attr);
|
|
|
|
MLIR_CAPI_EXPORTED unsigned
|
|
mlirSparseTensorEncodingAttrGetStructuredN(MlirSparseTensorLevelType lvlType);
|
|
|
|
MLIR_CAPI_EXPORTED unsigned
|
|
mlirSparseTensorEncodingAttrGetStructuredM(MlirSparseTensorLevelType lvlType);
|
|
|
|
MLIR_CAPI_EXPORTED MlirSparseTensorLevelType
|
|
mlirSparseTensorEncodingAttrBuildLvlType(
|
|
enum MlirSparseTensorLevelFormat lvlFmt,
|
|
const enum MlirSparseTensorLevelPropertyNondefault *properties,
|
|
unsigned propSize, unsigned n, unsigned m);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#include "mlir/Dialect/SparseTensor/Transforms/Passes.capi.h.inc"
|
|
|
|
#endif // MLIR_C_DIALECT_SPARSETENSOR_H
|