跳转至

Layout

Layout 描述

历史阶段

  • BLAS: row/column major + leading dimension
  • Tensor: shape + stride
  • Hierarchy Tensor

一维向量

shape(8), stride(1) 表示包括 8 个逻辑位置,逻辑位置和物理位置映射时每个元素之间的差为 1

其计算逻辑为 \(index_{physical} = index_{logical} * stride\)

shape(8), stride(1)
logical:   0 1 2 3 4 5 6 7
physical:  0 1 2 3 4 5 6 7
shape(8), stride(2)
logical:   0   1   2   3   4   5     6     7
physical:  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
shape(8), stride(0)
logical:   0 1 2 3 4 5 6 7
physical:  0
shape(8), stride(-1)
logical:                        0 1 2 3 4 5 6 7
physical:  -7 -6 -5 -4 -3 -2 -1 0

二维矩阵

shape(2, 3), stride(3, 1) 表示 2 行 3 列的矩阵。对于每行之间,逻辑位置和物理位置映射时每个元素之间的差为 3;对于每列之间,逻辑位置和物理位置映射时每个元素之间的差为 1

二维空间的列优先描述:shape(3, 4), stride(1, 3) ;行优先描述:shape(3, 4), stride(4, 1)

shape(2, 3), stride(3, 1)

logical:   (0,0) (0,1) (0,2)
           (1,0) (1,1) (1,2)

offset:    0 1 2
           3 4 5

pyhsical:  0 1 2 3 4 5

其映射关系为 \(index_{physical} = \sum_{i:dim} index_{logical,i} * stride_i\)

有层次的 Layout

Alt text

其中

A:
(4, 8) <- shape
(1, 4) <- stride

表示 4 行 8 列,每行物理位置之差为 1,每列物理位置之差为 4

C:
[4, (2, 4)] <- shape
[2, (1, 8)] <- stride

表示 4 行 8 列的矩阵,且对列进行分块大小为 2 的分块,每行物理位置之差为 1,每列中分块内相邻元素物理位置之差为 1,相邻分块之间物理位置之差为 8。

cute 提供了 make_shapemake_stride 两个函数来构造层次的 shape 和 stride.

常量 shape:

auto shape = make_shape(Int<2>{}, Int<3>{});
auto shape1 = make_shape(shape, Int<3>{});

变量 shape:

auto shape = make_shape(m, n);

Layout 的代数和几何解释

基本属性

Alt text

如上 Layout ,基本属性如下表:

shape stride size rank depth coshape cosize
((2, 4),
(3, 5))
((3, 6),
(1, 24))
120 2 2 120 120
  • shape 和 stride 表示 layout 的逻辑形状和每个维度在地址中的步长
  • size 表示逻辑空间的大小
  • rank 表示 layout 的秩,等于 shape 第一层的元素个数
  • depth 表示 layout 的嵌套深度,定义非嵌套 layout 的 depth 为 1
  • coshape 表示 codomain 的空间大小
  • cosize 表示占用空间大小,如果 stride 不紧凑,则 cosize 可能大于 size

Coordinate 坐标

  • 一层 layout:指定行列坐标auto coord = make_coord(1, 2);
  • 多层:将 make_coord 进行嵌套:

    auto coord = make_coord(make_coord(1, 3), make_coord(2, 4));
    

    注意 make_coord 参数从内到外。上述指定的坐标如下:

    Alt text

Slice 切片

cute 提供了 Underscore 类型对某个维度进行全选,对应变量为 _,类似 python 中 :

Complement 补集

当 codomain 不连续时,可以构造原 layout 的补集 layout2 补上 codomain 空缺的空间(注意:layout 的 codomain 和 layout2 的 codomain 可能有重合部分),为了表示的简洁性,补集会被压缩为最小表示,周期性重复的部分会被约掉。

Alt text

Product 乘法