Layout
Layout<Shape, Stride>数据结构是描述多维张量内存布局的基础模板类,通过编译时的形状Shape和步长Stride信息,实现逻辑坐标空间到一维内存地址空间的映射。借助模板元编程技术,该类在编译时完成计算和代码生成,从而降低运行时开销。
Layout包含两个核心组成部分:
- Shape:定义数据的逻辑形状,例如二维矩阵的行数和列数或多维张量的各维度大小。
- Stride:定义各维度在内存中的步长,即同维度相邻元素在内存中的间隔,单位为元素,并与Shape的维度信息一一对应。
例如,一个二维矩阵的Shape为(4,2),Stride为(4,1),表示:
- 矩阵有4行2列。
- 列方向步长为1,即每行中相邻元素间隔1个元素;行方向步长为4,即相邻行的起始地址间隔4个元素。
表1 线性地址视图
| 地址 | 0 | 1 | 2 | 4 | 5 | 6 | 8 | 9 | 10 | 12 | 13 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 元素 | a00 | a01 | - | a10 | a11 | - | a20 | a21 | - | a30 | a31 |
表2 矩阵逻辑视图
| 索引 | 列0 | 列1 |
|---|---|---|
| 行0 | a00(地址0) | a01(地址1) |
| 行1 | a10(地址4) | a11(地址5) |
| 行2 | a20(地址8) | a21(地址9) |
| 行3 | a30(地址12) | a31(地址13) |
需要包含的头文件
#include "tensor_api/tensor.h"
原型定义
template <typename T, typename U, typename Info = Std::ignore_t>
struct Layout : private Std::tuple<T, U>
{
static constexpr auto depth = NestingDepthV<T>;
static constexpr auto rank = Std::tuple_size_v<T>;
__aicore__ inline constexpr Layout(const T& shape = {}, const U& stride = {})
: Std::tuple<T, U>(shape, stride)
template <size_t... I>
__aicore__ inline constexpr decltype(auto) Capacity() const
__aicore__ inline constexpr decltype(auto) layout()
__aicore__ inline constexpr decltype(auto) layout() const
template <size_t... I>
__aicore__ inline constexpr decltype(auto) Shape()
template <size_t... I>
__aicore__ inline constexpr decltype(auto) Shape() const
template <size_t... I>
__aicore__ inline constexpr decltype(auto) Stride()
template <size_t... I>
__aicore__ inline constexpr decltype(auto) Stride() const
template <typename S>
__aicore__ inline constexpr auto operator()(const S& coord) const
template <size_t... I>
__aicore__ inline constexpr decltype(auto) Rank() const
template <size_t... I>
__aicore__ inline constexpr decltype(auto) Size() const
template <size_t... I>
__aicore__ inline constexpr decltype(auto) Get()
template <size_t... I>
__aicore__ inline constexpr decltype(auto) Get() const
};
模板参数
| 参数名 | 描述 |
|---|---|
| T | Std::tuple结构类型,用于定义数据的逻辑形状。 |
| U | Std::tuple结构类型,用于定义各维度在内存中的步长,并与Shape的维度信息一一对应。 |
| Info | 可选模板参数,默认为Std::ignore_t。当Layout由MakeFrameLayout或相关接口构造时,该参数可携带布局模式和布局特征等附加信息。 |
成员函数
Layout()
-
功能说明
构造Layout对象,使用给定的Shape和Stride初始化布局信息。
-
函数原型
__aicore__ inline constexpr Layout(const T& shape = {}, const U& stride = {})
-
参数说明
参数名 输入/输出 描述 shape 输入 张量的形状信息,必须为Std::tuple类型。 stride 输入 张量的步长信息,必须为Std::tuple类型。 -
返回值说明
构造函数,无返回值。
Capacity()
-
功能说明
获取当前Layout布局所需的实际内存容量。
传入模板参数I...时,会先选取指定子维度,再计算对应子布局的容量。
-
函数原型
template <size_t... I> __aicore__ inline constexpr decltype(auto) Capacity() const -
返回值说明
返回当前Layout或指定子维度对应布局的实际容量。
layout()
-
功能说明
获取Layout对象自身,用于统一接口中返回Layout布局实例。
-
函数原型
__aicore__ inline constexpr decltype(auto) layout() __aicore__ inline constexpr decltype(auto) layout() const -
返回值说明
返回当前Layout对象的(常量)引用。
Shape()
-
功能说明
获取Layout中的Shape信息。
不指定模板参数I...时返回完整Shape;传入I...时返回指定子维度对应的子结构。
-
函数原型
template <size_t... I> __aicore__ inline constexpr decltype(auto) Shape() template <size_t... I> __aicore__ inline constexpr decltype(auto) Shape() const -
返回值说明
返回Shape对象或其子结构的(常量)引用。
Stride()
-
功能说明
获取Layout中的Stride信息。
不指定模板参数I...时返回完整Stride;传入I...时返回指定子维度对应的子结构。
-
函数原型
template <size_t... I> __aicore__ inline constexpr decltype(auto) Stride() template <size_t... I> __aicore__ inline constexpr decltype(auto) Stride() const -
返回值说明
返回Stride对象或其子结构的(常量)引用。
operator()
-
功能说明
将多维逻辑坐标映射为一维线性索引。
该接口内部调用Crd2Idx,根据当前Layout的Shape和Stride计算坐标在内存中的线性位置。
-
函数原型
template <typename S> __aicore__ inline constexpr auto operator()(const S& coord) const -
参数说明
参数名 输入/输出 描述 coord 输入 多维逻辑坐标。 -
返回值说明
返回坐标coord对应的一维线性索引。
Rank()
-
功能说明
获取Layout的秩,即维度数。
不指定模板参数I...时返回完整Layout的秩;传入I...时返回指定子维度的秩。
-
函数原型
template <size_t... I> __aicore__ inline constexpr decltype(auto) Rank() const -
返回值说明
返回当前Layout或指定子维度的秩。
Size()
-
功能说明
获取Layout覆盖的元素总数。
不指定模板参数I...时返回完整Shape对应的元素总数;传入I...时返回指定子维度下的元素总数。
-
函数原型
template <size_t... I> __aicore__ inline constexpr decltype(auto) Size() const -
返回值说明
返回当前Layout或指定子维度覆盖的元素总数。
Get()
-
功能说明
从Layout中提取指定位置的元素或子结构。
位置0对应Shape,位置1对应Stride;配合模板参数I...可进一步提取子tuple中的元素。
-
函数原型
template <size_t... I> __aicore__ inline constexpr decltype(auto) Get() template <size_t... I> __aicore__ inline constexpr decltype(auto) Get() const -
返回值说明
返回指定位置元素或子结构的(常量)引用。
depth
-
功能说明
编译期常量,表示Shape类型的嵌套深度,用于判断当前Layout是否为嵌套布局结构。
rank
-
功能说明
编译期常量,表示完整Layout的秩。
Layout及成员函数示例
下面通过一个二维Layout示例,说明Layout对象本身以及各成员函数的使用方式和返回结果。
using namespace AscendC::Te;
auto layout = Layout(MakeShape(4, 2), MakeStride(4, 1));
auto self = layout.layout();
// self = Layout(MakeShape(4, 2), MakeStride(4, 1))
auto shape = layout.Shape();
// shape = (4, 2)
auto shape0 = layout.Shape<0>();
// shape0 = 4
auto stride = layout.Stride();
// stride = (4, 1)
auto stride1 = layout.Stride<1>();
// stride1 = 1
auto rank = layout.Rank();
// rank = 2
auto size = layout.Size();
// size = 8
auto capacity = layout.Capacity();
// capacity = 16
auto index = layout(MakeCoord(1, 1));
// index = 5
auto shapeInfo = layout.Get<0>();
// shapeInfo = (4, 2)
auto strideInfo = layout.Get<1>();
// strideInfo = (4, 1)
constexpr auto depth = decltype(layout)::depth;
// depth = 1
constexpr auto fullRank = decltype(layout)::rank;
// fullRank = 2