CuTe Layout笔记

并不严谨

cutlass3引入cute,cute的layout抽象很强大,但由于资料介绍不到位导致这部分不是那么好懂,为了理解其本质,这里记录一些相关内容

Layout

一个布局LL是由一对具有相同维度的正整数元组SSDD组成的,其中SS被称为shape,DDstride,写作L=S:DL = S:D

扁平化的布局意味着shape和stride中没有内部括号。例如, L=(1,2,3):(1,1,2)L=(1,2,3):(1,1,2)是一个扁平化布局,而L=((1,2),3):((1,1),2)L=((1,2),3):((1,1),2)不是,当然,两者含义完全相等

Layout本质上是一个函数,且满足双射,输入xx可以是坐标(x0,x1)(x_0,x_1)也可以是等价的线性坐标x=x0+x1S[0]x=x_0+x_1{S[0]}

布局的大小,长度,模式

L=S:D=(M0,M1,...,Mα):(d0,d1,...,dα)L=S:D=(M_0,M_1,...,M_\alpha):(d_0,d_1,...,d_\alpha)是一个布局,其中α\alpha是一个满足α0\alpha \ge 0的整数,那么

为方便书写,(x0,x1,...,xα)(x_0,x_1,...,x_\alpha)记为

(xi)i=0α(x_i)_{i=0}^{\alpha}

连接

给定两个布局L=S:DL=S:DL=S:D, L'=S':D',则

(L,L)=(S,S):(D,D)(L,L')=(S,S'):(D,D')

同构

S=(Mi)i=0αS=(M_i)_{i=0}^{\alpha}D=(di)i=0αD=(d_i)_{i=0}^{\alpha} 组成 L=S:DL = S : DM=i=0αMiM=\prod_{i=0}^{\alpha} M_iLL的大小,对于任意x[0,M)x\in[0,M)

x(xmodM0,xM0modM1,...,xi=0α1MimodMα)x\mapsto(x \bmod M_0, \lfloor \frac{x}{M_0} \rfloor \bmod M_1, ..., \lfloor \frac{x}{\prod_{i=0}^{\alpha-1} M_i} \rfloor \bmod M_\alpha)

布局函数

对于一个布局LL,其布局函数fL:[0,M)Nf_L:[0,M)\rightarrow\mathbb{N}

MM为布局LL的大小,比如内存连续矩阵A:(5,6)A:(5,6),其大小为3030,输入可以是坐标(0...4,0...5)(0...4,0...5),换到线性坐标上即[0,30)[0,30)

给定输入xx,fLf_L的输出为

x(xmodM0,xM0modM1,...,xi=0α1MimodMα)=(xi)i=0αx\mapsto(x \bmod M_0, \lfloor \frac{x}{M_0} \rfloor \bmod M_1, ..., \lfloor \frac{x}{\prod_{i=0}^{\alpha-1} M_i} \rfloor \bmod M_\alpha) = (x_i)_{i=0}^{\alpha}

fL(x)=fL((xi)i=0α)=xd,其中 x=(xi)i=0α,d=(di)i=0αf_L(x) = f_L((x_i)_{i=0}^{\alpha}) = \vec{x} \cdot \vec{d}, \quad \text{其中 } \vec{x} = (x_i)_{i=0}^{\alpha}, \vec{d} = (d_i)_{i=0}^{\alpha}

可以看出

fL(x)=fL((xi)i=0α)=i=0αfLi(xi)f_L(x) =f_L((x_i)_{i=0}^{\alpha}) = \sum_{i=0}^{\alpha}f_{L_i}(x_i)

合并

合并不会改变布局

合并规则

考虑一个只有2个mode的布局A=(N0,N1):(d0,d1)A=(N_0,N_1):(d_0,d_1),当N0N_0N1N_111时,这一个mode可以直接去除,如

N0=1M0[0,1)0N_0=1 \rightarrow M_0 \in [0,1) \rightarrow 0

A=(N1):(d!)A=(N_1):(d_!)

另一种情况是紧密的排布,即d1=N0d0d_1 = N_0d_0,对于A=(N0,N1):(d0,N0d0)A=(N_0,N_1):(d_0,N_0d_0),我们有x(x0,x1)x\mapsto(x_0,x_1),

fL(x)=x0d0+x1N0d0,其中x0=xmodN0,x1=xN0f_L(x) = x_0d_0 + x_1N_0d_0,其中x_0 = x \bmod N_0, x_1 = \lfloor \frac{x}{N_0} \rfloor

fL(x)=x0d0+xN0N0d0=x0d0+[x(xmodN0)]d0=x0d0+(xx0)d0=xd0f_L(x) = x_0d_0 + \lfloor \frac{x}{N_0} \rfloor N_0d_0 = x_0d_0 + [x-(x \bmod N_0)]d_0 = x_0d_0 + (x-x_0)d_0 = xd_0

所以可以合并为A=(N0N1):(d0)A=(N_0N_1):(d_0),其他情况不可合并

具有两个以上mode的布局,我们可以递归地应用上述情况,每次尝试合并两个相邻的积分模式,直到不能再合并为止。这保证了布局函数保持不变。

L=(Ni)i=0α:(di)i=0αL=(N_i)_{i=0}^{\alpha}:(d_i)_{i=0}^{\alpha},其输入x(xi)i=0αx \mapsto (x_i)_{i=0}^{\alpha},

fL(x)=fL((xi)i=0α)=i=0αfL(xi)f_L(x) =f_L((x_i)_{i=0}^{\alpha}) = \sum_{i=0}^{\alpha}f_L(x_i)

考虑两个连续的mode可合并,即

(x0,...,xi,xi+1,...,xα)(x0,...,x,...,xα)x=xi+xi+1Ni(x_0,...,x_i,x_{i+1},...,x_\alpha) \rightarrow (x_0,...,x',...,x_\alpha),x'=x_i+x_{i+1}N_i

(d0,...,di,di+1,...,dα)(d0,...,di,...,dα)(d_0,...,d_i,d_{i+1},...,d_\alpha) \rightarrow (d_0,...,d_i,...,d_\alpha)

fL(xi)+fL(xi+1)=xidi+xi+1di+1=xidi+xi+1Nidi=fL(x)=xdi=(xi+xi+1Ni)d0f_L(x_i) + f_L(x_{i+1}) = x_id_i + x_{i+1}d_{i+1} = x_id_i+x_{i+1}N_id_i=f_L(x') = x'd_i = (x_i+x_{i+1}N_i)d_0

fL(x)=i=0αfL(xi)=i=0i1fL(xi)+fL(x)+i=i+2αfL(xi)f_L(x) = \sum_{i=0}^{\alpha}f_L(x_i) = \sum_{i=0}^{i'-1}f_L(x_i) + f_L(x') + \sum_{i=i'+2}^{\alpha}f_L(x_i)

这个写法不严谨,因为mode改变了,fLf_L也发生了变化,应该分解fLf_L到各个mode得到fLif_{L_i},总之就这个意思

补集

排序布局

L=(Ni)i=0α:(di)i=0αL=(N_i)_{i=0}^{\alpha}:(d_i)_{i=0}^{\alpha}, 如果d0d1...dαd_0 \le d_1 \le ...\le d_\alpha且如果di=djd_i=d_j,那么NiNjN_i \le N_j

排序后的布局改变了布局的意义,因为mode的顺序被交换了,但其点积的本质导致函数的签名不会改变

可补

A=(Ni)i=0α:(di)i=0αA=(N_i)_{i=0}^{\alpha}:(d_i)_{i=0}^{\alpha}, MM为一个正整数, 如果AA未排序那么将AA替换为其排序版本AA',若满足以下条件则称{A,M}\{A,M\}可补

补集

A=(Ni)i=0α:(di)i=0αA=(N_i)_{i=0}^{\alpha}:(d_i)_{i=0}^{\alpha}, MM为一个正整数, 如果{A,M}\{A,M\}是可补的,则其补集定义为

complement(A,M)=(d0,d1N0d0,...,dαNα1dα1,MNαdα):(1,N0d0,...,Nαdα)complement(A,M) = (d_0,\frac{d_1}{N_0d_0},...,\frac{d_\alpha}{N_{\alpha-1}d_{\alpha-1}},\frac{M}{N_\alpha d_\alpha}):(1,N_0d_0,...,N_\alpha d_\alpha)

不难看出其是排序好的,严格递增的,当x+1x+1,可能会在新的一个维度上进一,而Ni+1di+1>(di+1Nidi1)NidiN_{i+1}d_{i+1} >(\frac{d_{i+1}}{N_id_i}-1)N_id_i,即Ni+1>1Nididi+1N_{i+1} > 1-\frac{N_id_i}{d_{i+1}} , 由于dimodNi1di1=0d_i \bmod N_{i-1}d_{i-1} = 0,故Nididi+11\frac{N_id_i}{d_{i+1}} \le 1,不等式成立

complement(A,M)complement(A,M)的大小为Msize(A)=Mi=0αNi\frac{M}{size(A)}=\frac{M}{\prod_{i=0}^{\alpha} N_i}

当我们将complement(A,M)complement(A,M)AA拼(连接并按某种规则交换mode)在一起会得到

(d0,N0,d1N0d0,N1,...,dαNα1dα1,Nα,MNαdα):(1,d0,N0d0,d1,...,Nα1dα1,dα,Nαdα)(d_0,N_0,\frac{d_1}{N_0d_0},N_1,...,\frac{d_\alpha}{N_{\alpha-1}d_{\alpha-1}},N_\alpha,\frac{M}{N_\alpha d_\alpha}):(1,d_0,N_0d_0,d_1,...,N_{\alpha-1} d_{\alpha-1},d_\alpha,N_\alpha d_\alpha)

可合并为

(M)(1)(M):(1)

虽然不一定按这种方便的情况去排布但我们知道mode的交换不会影响fL[0,M)[0,M)的性质f_L:[0,M) \rightarrow [0,M)的性质

组合

因为是函数,自然可以g(f(x))g(f(x))这样使用,记fg(x)f*g(x)fg的组合f与g的组合,有

y=g(f(x))=fg(x)y=g(f(x)) = f*g(x)

显然f(x)的值域需要是g(x)定义域的子集f(x)的值域需要是g(x)定义域的子集,且fg(x)f*g(x)的定义域和f(x)f(x)相同,考虑一个简单的情况x[0,M),f(x)=x,g(f(x))=g(x)=g((xi)i=0α)=i=0αg(xi)x \in [0,M), f(x)=x, g(f(x)) = g(x) = g((x_i)_{i=0}^{\alpha}) = \sum_{i=0}^{\alpha}g(x_i),其过程为

x(x0,x1,...,xα)x \mapsto (x_0,x_1,...,x_\alpha)

y=f((xi)i=0α)=x0d0+x1d1+...+xαdαy = f((x_i)_{i=0}^{\alpha}) = x_0d_0 + x_1d_1 + ... + x_\alpha d_\alpha

y(x0,x1,...,xα)y \mapsto (x_0',x_1',...,x_{\alpha'}')

z=g((xi)i=0α)=x0d0+x1d1+...+xαdαz = g((x_i')_{i=0}^{\alpha'}) = x_0'd_0' + x_1'd_1' + ... + x_{\alpha'}' d_{\alpha'}'

若我们能够找出一个LL能直接描述这种映射关系,则是可组合的,在上面的例子中

(x0,x1,...,xα)=(x0,x1,...,xα)(x_0',x_1',...,x_{\alpha'}') = (x_0,x_1,...,x_\alpha)

g((xi)i=0α)=x0d0+x1d1+...+xαdαg((x_i')_{i=0}^{\alpha'}) = x_0d_0' + x_1d_1' + ... + x_{\alpha} d_{\alpha}'

fg(x)=g(x)f*g(x) = g(x)

同理可以有

(x0,x1,...,xα)=a(x0,x1,...,xα)(x_0',x_1',...,x_{\alpha'}') = a(x_0,x_1,...,x_\alpha)

g((xi)i=0α)=ax0d0+ax1d1+...+axαdαg((x_i')_{i=0}^{\alpha'}) = ax_0d_0' + ax_1d_1' + ... + ax_{\alpha} d_{\alpha}'

fg(x)=ag(x)f*g(x) = ag(x)

左可除性

M,d>0M,d >0,为正整数,设M=M0M1...MαM=M_0M_1...M_\alpha为一种可能的分解,我们说MM对于dd是左可除的,如果存在0iα0 \le i\le \alpha满足

若满足前两个条件而不满足第三条,则称为弱左可除

对于一个M=M0M1...MαM=M_0M_1...M_\alpha,可表示为M=M0M1...Mi1cMicMi+1...MαM=M_0M_1...M_{i-1}c \frac{M_i}{c} M_{i+1}...M_\alpha

约束

上面提到f(x)f(x)的值域需要是g(x)g(x)定义域的子集,这是一种约束,考虑简单情况,一般来说可以这样定义这个约束

S=(M0,M1,...,Mα)S=(M_0,M_1,...,M_\alpha)M=M0M1...MαM=M_0M_1...M_\alphaB=(N):(r)B=(N):(r),说{S,B}\{S,B\}是可组合的,如果满足

如此约束的原因是

x(x0,x1,...,xα)x \mapsto (x_0,x_1,...,x_\alpha)

fg(x)=x0d0+x1d1+...+xαdαf*g(x) = x_0d_0'' + x_1d_1'' + ... + x_{\alpha} d_{\alpha}''

我们渴望找到一种DD直接能够提供等价变换,但我们知道

x(x0,x1,...,xα)x \mapsto (x_0,x_1,...,x_\alpha)

y=f((xi)i=0α)=x0d0+x1d1+...+xαdαy = f((x_i)_{i=0}^{\alpha}) = x_0d_0 + x_1d_1 + ... + x_\alpha d_\alpha

y(x0,x1,...,xα)y \mapsto (x_0',x_1',...,x_{\alpha'}')

z=g((xi)i=0α)=x0d0+x1d1+...+xαdαz = g((x_i')_{i=0}^{\alpha'}) = x_0'd_0' + x_1'd_1' + ... + x_{\alpha'}' d_{\alpha'}'

显然我们要寻找的(di)i=0α(d_i'')_{i=0}^{\alpha}来源于(di)i=0α(d_i')_{i=0}^{\alpha'},换句话说(di)i=0α(d_i'')_{i=0}^{\alpha}(di)i=0α(d_i')_{i=0}^{\alpha'}切片,同理(xi)i=0α(x_i)_{i=0}^{\alpha}也是(xi)i=0α(x_i')_{i=0}^{\alpha'}切片,实际上M0M1...Mi1M_0M_1...M_{i-1}就是一个在ii位置上为11的向量坐标:(0,...,1,...,0)(0,...,1,...,0),要求左除本质是找到切片开始的起始坐标,弱左除则是约束切片开始位置加上切片长度不会超过总长

组合

特殊情况

S=(Mi)i=0αS=(M_i)_{i=0}^{\alpha}D=(di)i=0αD=(d_i)_{i=0}^{\alpha} 组成 A=S:DA = S : D,B=(N):(r)B=(N):(r),且{S,B}\{S,B\}是满足上述约束的,ABA*B的定义分两种情况

假设0iα0\le i \le \alpha,有

r=M0M1...Mi1cr=M_0M_1...M_{i-1}c

M=MicMi+1...MαM'=\frac{M_i}{c} M_{i+1}...M_\alpha

NMicN \le \frac{M_i}{c},则AB=(N):(cdi)A*B=(N):(cd_i)

否则,存在一个j[i+1,α]j\in[i+1,\alpha],使得N=MicMi+1...Mj1cN=\frac{M_i}{c} M_{i+1}...M_{j-1}c',其中ic<Mji \le c' < M_j如果jαj \ne \alpha

AB={(Mic,Mi+1,...,Mj1,c):(cdi,di+1,...,dj1,dj)c>1(Mic,Mi+1,...,Mj1):(cdi,di+1,...,dj1),c=1A*B= \begin{cases} (\frac{M_i}{c}, M_{i+1},...,M_{j-1},c'):(cd_i,d_{i+1},...,d_{j-1},d_j) & c' > 1 \\ (\frac{M_i}{c}, M_{i+1},...,M_{j-1}):(cd_i,d_{i+1},...,d_{j-1}), & c' = 1 \end{cases}

区间

设布局 BB 的映射函数为 fB:[0,N)Nf_B : [0,N) \to \mathbb{N}。 记 I=[minfB([1,N)), maxfB([1,N))]I = [\min f_B([1,N)),\ \max f_B([1,N))]fBf_B 在区间 [1,N)[1,N) 上的值域的最小连续整数区间。 再设 M=M0M1Mα1M' = M_0 M_1 \cdots M_{\alpha-1},则SS 允许访问的位置范围为 [1,M)[1,M')。于是,{S,B}\{S,B\} 的 区间 为 J=I[1,M)J = I \cap [1,M')。 若 α=0\alpha = 0,则 M=1M' = 1,于是 J=J = \varnothing

一般情况

设形状元组

S=(M0,M1,,Mα)S = (M_0, M_1, \ldots, M_\alpha)

以及布局

B=(N0,N1,,Nβ):(r0,r1,,rβ)B = (N_0, N_1, \ldots, N_\beta) : (r_0, r_1, \ldots, r_\beta)

并记

Bk=(Nk):(rk),0kβB_k = (N_k):(r_k), \quad 0 \le k \le \beta

我们称二元组 {S,B}\{S,B\} 是可组合的,若满足:

  1. 对所有 0kβ0 \le k \le \beta,二元组 {S,Bk}\{S,B_k\} 在上述约束下都是可组合的

  2. 对所有二元组 {S,Bk}\{S,B_k\}0kβ0 \le k \le \beta)的区间两两互不相交。


在这种情况下,如果

D=(d0,d1,,dα)\mathbf{D} = (d_0, d_1, \ldots, d_\alpha)

是一个步长元组,并且

A=S:DA = S : \mathbf{D}

那么我们将组合 ABA * B 定义为连接得到的布局:

AB:=(AB0, AB1, , ABβ)A * B := (A * B_0,\ A * B_1,\ \ldots,\ A * B_\beta)

其中每个 ABkA \circ B_k 的定义如特殊情况相同

我们知道,

fA(fB(x))=fA(fB0(x0)+fB1(x1)+...+fBβ(xβ))f_A(f_B(x)) = f_A(f_{B_0}(x_0)+f_{B_1}(x_1)+...+f_{B_{\beta}}(x_\beta))

根据定义

fAfB(x)=fA(fB0(x0))+fA(fB1(x1))+...+fA(fBβ(xβ))f_A*f_B(x) = f_A(f_{B_0}(x_0)) + f_A(f_{B_1}(x_1)) +...+ f_A(f_{B_\beta}(x_\beta))

一般情况下二者是不等的,但是要求了{S,Bk}\{S,B_k\}不许相交则满足了

fA(fB(x))=fAfB(x)f_A(f_B(x)) = f_A*f_B(x)

不严谨但是比较好理解的说,每个fBi(xi)f_{B_i}(x_i)分解为向量坐标后都处于不同的有效维度中,通过点积公式很容易就发现二者相等