25#ifndef TVM_S_TIR_DATA_LAYOUT_H_
26#define TVM_S_TIR_DATA_LAYOUT_H_
28#include <tvm/ffi/optional.h>
29#include <tvm/ffi/reflection/registry.h>
57 inline bool IsPrimal()
const {
return name_ >=
'A' && name_ <=
'Z'; }
58 inline std::string
name()
const {
return std::string(1, name_); }
63 if (name_ >=
'A' && name_ <=
'Z') {
113 ffi::Array<s_tir::IterVar>
axes;
116 namespace refl = tvm::ffi::reflection;
117 refl::ObjectDef<SLayoutNode>()
130 explicit SLayout(
const ffi::Array<s_tir::IterVar>& axes);
149 TVM_DLL
static ffi::Optional<SLayout>
Create(
const std::string&
name,
162 static ffi::Optional<SLayout>
Undef() {
return std::nullopt; }
188 ffi::Optional<SLayout>
SubLayout(
size_t pos,
size_t len)
const;
201 if (!defined())
return 0;
207 if (!defined())
return 0;
211 for (
auto x : iter_vars) {
227 std::string new_src_layout_str =
"";
228 for (
auto packed_axis : dst_layout->
axes) {
230 for (
auto dst_axis : iter_vars) {
233 new_src_layout_str += dst_axis->var->name;
239 new_src_layout_str += this->
name();
250 inline int32_t
IndexOf(
const std::string& axis)
const {
251 if (!this->defined())
return -1;
253 for (
size_t i = 0; i < axes.size(); ++i) {
254 if (axes[i]->var->name == axis)
return static_cast<int32_t
>(i);
292 if (!defined())
return false;
295 for (
auto var : iter_vars) {
296 if (var->var->name == axis.
name()) {
305 TVM_FFI_ICHECK(defined()) <<
"Try to access axis from an undefined layout.";
306 int32_t index = i < 0 ? static_cast<int32_t>(
ndim() + i) : i;
307 TVM_FFI_ICHECK(index >= 0 &&
static_cast<size_t>(index) <
ndim()) <<
"Invalid index " << i;
313 TVM_FFI_ICHECK(defined()) <<
"Try to access axis from an undefined layout.";
314 int32_t index = i < 0 ? static_cast<int32_t>(
ndim() + i) : i;
315 TVM_FFI_ICHECK(index >= 0 &&
static_cast<size_t>(index) <
ndim()) <<
"Invalid index " << i;
321 inline std::string
name()
const {
322 if (!defined())
return "__undef__";
371 namespace refl = tvm::ffi::reflection;
372 refl::ObjectDef<SBijectiveLayoutNode>()
392 : ffi::ObjectRef(tag) {
393 data_ = std::move(data);
405 TVM_DLL ffi::Array<PrimExpr>
ForwardShape(
const ffi::Array<PrimExpr>& shape)
const;
407 TVM_DLL ffi::Array<PrimExpr>
BackwardShape(
const ffi::Array<PrimExpr>& dst_shape)
const;
409 TVM_DLL ffi::Array<PrimExpr>
ForwardIndex(
const ffi::Array<PrimExpr>& index)
const;
411 TVM_DLL ffi::Array<PrimExpr>
BackwardIndex(
const ffi::Array<PrimExpr>& dst_index)
const;
Definition base_expr.h:161
static TVM_TIRX_DLL PrimType Int(int bits, int lanes=1)
Construct a signed integer type with fixed lanes.
Iteration Variable, represents an iteration over an integer interval.
Definition iter_var.h:147
Definition data_layout.h:348
ffi::Array< PrimExpr > index_forward_rule
Describes how source axes can be mapped to the destination axes, e.g., [i0 / 16, i1,...
Definition data_layout.h:357
ffi::Array< PrimExpr > shape_forward_rule
Describes how source shapes can be mapped to the destination shapes.
Definition data_layout.h:361
static void RegisterReflection()
Definition data_layout.h:370
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("s_tir.SBijectiveLayout", SBijectiveLayoutNode, ffi::Object)
SBijectiveLayoutNode(SLayout src, SLayout dst)
Definition data_layout.h:352
SLayout dst_layout
The destination layout.
Definition data_layout.h:368
SLayout src_layout
The source layout.
Definition data_layout.h:366
ffi::Array< PrimExpr > index_backward_rule
Describes how destination axes can be mapped to the source axes.
Definition data_layout.h:359
ffi::Array< PrimExpr > shape_backward_rule
Describes how destination shapes can be mapped to the source shapes.
Definition data_layout.h:363
SBijectiveLayoutNode(ffi::UnsafeInit tag)
Definition data_layout.h:350
Bijective function mapping for data layout transformation. Given two SLayout, SBijectiveLayout build ...
Definition data_layout.h:389
static ffi::Optional< SBijectiveLayout > Create(SLayout src_layout, SLayout dst_layout)
SBijectiveLayout(SLayout src_layout, SLayout dst_layout)
The constructor.
SBijectiveLayout(ffi::UnsafeInit tag, ffi::ObjectPtr< SBijectiveLayoutNode > data)
Definition data_layout.h:391
ffi::Array< PrimExpr > BackwardIndex(const ffi::Array< PrimExpr > &dst_index) const
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(SBijectiveLayout, ffi::ObjectRef, SBijectiveLayoutNode)
ffi::Array< PrimExpr > BackwardShape(const ffi::Array< PrimExpr > &dst_shape) const
ffi::Array< PrimExpr > ForwardIndex(const ffi::Array< PrimExpr > &index) const
ffi::Array< PrimExpr > ForwardShape(const ffi::Array< PrimExpr > &shape) const
Definition data_layout.h:47
static const SLayoutAxis & Get(const char name)
bool IsPrimal() const
Definition data_layout.h:57
static const SLayoutAxis & Get(const s_tir::IterVar &itvar)
static const SLayoutAxis & Get(const std::string &name)
const SLayoutAxis & ToSubordinate() const
Definition data_layout.h:74
friend std::ostream & operator<<(std::ostream &os, const SLayoutAxis &l)
Definition data_layout.h:78
std::string name() const
Definition data_layout.h:58
bool operator==(const SLayoutAxis &rhs) const
Definition data_layout.h:76
const SLayoutAxis & ToDual() const
Definition data_layout.h:62
const SLayoutAxis & ToPrimal() const
Definition data_layout.h:71
SLayout is to describe how data is organized within an N-dimention tensor. It is composed of upper ca...
Definition data_layout.h:103
ffi::Array< s_tir::IterVar > axes
specify each axis of the layout, in which the variable name is the name of the axis....
Definition data_layout.h:113
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("s_tir.SLayout", SLayoutNode, ffi::Object)
ffi::String name
string representation of layout, "" for scalar.
Definition data_layout.h:106
static void RegisterReflection()
Definition data_layout.h:115
Managed reference to SLayoutNode.
Definition data_layout.h:128
int32_t IndexOf(const std::string &axis) const
return the index of the input axis. If it is not found in the layout or the layout is undefined,...
Definition data_layout.h:250
friend std::ostream & operator<<(std::ostream &os, const SLayout &l)
allow output string of layout to ostream
Definition data_layout.h:339
size_t ndim() const
Definition data_layout.h:200
ffi::Optional< SLayout > ExpandPrimal(const SLayout &dst_layout)
Returns a new layout where the dims have been expanded to match the primal dimensions.
Definition data_layout.h:225
SLayout(const tvm::ffi::String &name)
construct from a string
Definition data_layout.h:133
int32_t IndexOf(const SLayoutAxis &axis) const
return the index of the input axis. If it is not found in the layout or the layout is undefined,...
Definition data_layout.h:266
static s_tir::IterVar PackIterVar(ffi::Array< s_tir::IterVar > iters)
Packs the Given Array of IterVars into a Single s_tir::IterVar. Each s_tir::IterVar in the Array shou...
s_tir::IterVar PackedAxisAt(int32_t i) const
Definition data_layout.h:312
SLayout Split(const SLayoutAxis &axis, size_t target_pos, int32_t factor) const
Split axis by size and put the sub-axis to position target_pos.
std::string name() const
Definition data_layout.h:321
bool Equals(const SLayout &rhs) const
Whether the two layouts are equal.
Definition data_layout.h:331
int32_t IndexOf(const s_tir::IterVar &iter) const
return the index of the input axis. If it is not found in the layout or the layout is undefined,...
Definition data_layout.h:275
SLayout(const char *name)
construct from a string
Definition data_layout.h:136
SLayoutNode * operator->()
access the internal node container
Definition data_layout.h:156
size_t ndim_primal() const
Definition data_layout.h:206
SLayout(const std::string &name, PrimType index_ty=PrimType::Int(32))
construct from a string.
ffi::Optional< SLayout > SubLayout(size_t pos, size_t len) const
Returns a sub-layout which is the portion of the object that starts at dimension pos and spans len di...
bool Contains(const SLayoutAxis &axis) const
Whether the layout contains an axis.
Definition data_layout.h:291
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(SLayout, ffi::ObjectRef, SLayoutNode)
static ffi::Array< s_tir::IterVar > UnpackIterVar(s_tir::IterVar packed_iter)
Unpacks a Packed s_tir::IterVar into its constituents.
static ffi::Optional< SLayout > Undef()
Return an undefined layout.
Definition data_layout.h:162
const SLayoutAxis & operator[](int32_t i) const
Definition data_layout.h:304
static ffi::Optional< SLayout > Create(const std::string &name, PrimType index_ty=PrimType::Int(32))
int32_t FactorOf(const SLayoutAxis &axis) const
Get the factor size of the subordinate axis.
SLayout(const ffi::Array< s_tir::IterVar > &axes)
Shared primitive construction and constant helpers.
Axis metadata for schedulable tensor computations.
An object that builds and maintains block scope and StmtSref mapping for Dependence analysis.
Definition attr.h:23