CuTe Layout笔记
并不严谨
cutlass3引入cute,cute的layout抽象很强大,但由于资料介绍不到位导致这部分不是那么好懂,为了理解其本质,这里记录一些相关内容
Layout
一个布局L是由一对具有相同维度的正整数元组S和D组成的,其中S被称为shape,D为stride,写作L=S:D
扁平化的布局意味着shape和stride中没有内部括号。例如, L=(1,2,3):(1,1,2)是一个扁平化布局,而L=((1,2),3):((1,1),2)不是,当然,两者含义完全相等
Layout本质上是一个函数,且满足双射,输入x可以是坐标(x0,x1)也可以是等价的线性坐标x=x0+x1S[0]
布局的大小,长度,模式
L=S:D=(M0,M1,...,Mα):(d0,d1,...,dα)是一个布局,其中α是一个满足α≥0的整数,那么
- L的size为M=M0⋅M1⋅...⋅Mα,即∏i=0αMi
- L的length为α+1
- L的一个mode为 (M0,M1,...,Mα):(d0,d1,...,dα) 中的一对 (Mk):(dk),0≤k≤α
为方便书写,(x0,x1,...,xα)记为
(xi)i=0α
连接
给定两个布局L=S:D,L′=S′:D′,则
(L,L′)=(S,S′):(D,D′)
同构
设 S=(Mi)i=0α 和 D=(di)i=0α 组成 L=S:D,M=∏i=0αMi为L的大小,对于任意x∈[0,M)有
x↦(xmodM0,⌊M0x⌋modM1,...,⌊∏i=0α−1Mix⌋modMα)
布局函数
对于一个布局L,其布局函数fL:[0,M)→N
M为布局L的大小,比如内存连续矩阵A:(5,6),其大小为30,输入可以是坐标(0...4,0...5),换到线性坐标上即[0,30)
给定输入x,fL的输出为
x↦(xmodM0,⌊M0x⌋modM1,...,⌊∏i=0α−1Mix⌋modMα)=(xi)i=0α
fL(x)=fL((xi)i=0α)=x⋅d,其中 x=(xi)i=0α,d=(di)i=0α
可以看出
fL(x)=fL((xi)i=0α)=i=0∑αfLi(xi)
合并
合并不会改变布局
合并规则
考虑一个只有2个mode的布局A=(N0,N1):(d0,d1),当N0或N1为1时,这一个mode可以直接去除,如
N0=1→M0∈[0,1)→0
A=(N1):(d!)
另一种情况是紧密的排布,即d1=N0d0,对于A=(N0,N1):(d0,N0d0),我们有x↦(x0,x1),
fL(x)=x0d0+x1N0d0,其中x0=xmodN0,x1=⌊N0x⌋
fL(x)=x0d0+⌊N0x⌋N0d0=x0d0+[x−(xmodN0)]d0=x0d0+(x−x0)d0=xd0
所以可以合并为A=(N0N1):(d0),其他情况不可合并
具有两个以上mode的布局,我们可以递归地应用上述情况,每次尝试合并两个相邻的积分模式,直到不能再合并为止。这保证了布局函数保持不变。
设L=(Ni)i=0α:(di)i=0α,其输入x↦(xi)i=0α,
fL(x)=fL((xi)i=0α)=i=0∑αfL(xi)
考虑两个连续的mode可合并,即
(x0,...,xi,xi+1,...,xα)→(x0,...,x′,...,xα),x′=xi+xi+1Ni
(d0,...,di,di+1,...,dα)→(d0,...,di,...,dα)
fL(xi)+fL(xi+1)=xidi+xi+1di+1=xidi+xi+1Nidi=fL(x′)=x′di=(xi+xi+1Ni)d0
fL(x)=i=0∑αfL(xi)=i=0∑i′−1fL(xi)+fL(x′)+i=i′+2∑αfL(xi)
这个写法不严谨,因为mode改变了,fL也发生了变化,应该分解fL到各个mode得到fLi,总之就这个意思
补集
排序布局
设L=(Ni)i=0α:(di)i=0α, 如果d0≤d1≤...≤dα且如果di=dj,那么Ni≤Nj
排序后的布局改变了布局的意义,因为mode的顺序被交换了,但其点积的本质导致函数的签名不会改变
可补
设A=(Ni)i=0α:(di)i=0α, M为一个正整数, 如果A未排序那么将A替换为其排序版本A′,若满足以下条件则称{A,M}可补
- dimodNi−1di−1=0
- MmodNαdα=0
补集
设A=(Ni)i=0α:(di)i=0α, M为一个正整数, 如果{A,M}是可补的,则其补集定义为
complement(A,M)=(d0,N0d0d1,...,Nα−1dα−1dα,NαdαM):(1,N0d0,...,Nαdα)
不难看出其是排序好的,严格递增的,当x+1,可能会在新的一个维度上进一,而Ni+1di+1>(Nididi+1−1)Nidi,即Ni+1>1−di+1Nidi , 由于dimodNi−1di−1=0,故di+1Nidi≤1,不等式成立
complement(A,M)的大小为size(A)M=∏i=0αNiM
当我们将complement(A,M)与A拼(连接并按某种规则交换mode)在一起会得到
(d0,N0,N0d0d1,N1,...,Nα−1dα−1dα,Nα,NαdαM):(1,d0,N0d0,d1,...,Nα−1dα−1,dα,Nαdα)
可合并为
(M):(1)
虽然不一定按这种方便的情况去排布但我们知道mode的交换不会影响fL:[0,M)→[0,M)的性质
组合
因为是函数,自然可以g(f(x))这样使用,记f∗g(x)为f与g的组合,有
y=g(f(x))=f∗g(x)
显然f(x)的值域需要是g(x)定义域的子集,且f∗g(x)的定义域和f(x)相同,考虑一个简单的情况x∈[0,M),f(x)=x,g(f(x))=g(x)=g((xi)i=0α)=∑i=0αg(xi),其过程为
x↦(x0,x1,...,xα)
y=f((xi)i=0α)=x0d0+x1d1+...+xαdα
y↦(x0′,x1′,...,xα′′)
z=g((xi′)i=0α′)=x0′d0′+x1′d1′+...+xα′′dα′′
若我们能够找出一个L能直接描述这种映射关系,则是可组合的,在上面的例子中
(x0′,x1′,...,xα′′)=(x0,x1,...,xα)
g((xi′)i=0α′)=x0d0′+x1d1′+...+xαdα′
f∗g(x)=g(x)
同理可以有
(x0′,x1′,...,xα′′)=a(x0,x1,...,xα)
g((xi′)i=0α′)=ax0d0′+ax1d1′+...+axαdα′
f∗g(x)=ag(x)
左可除性
设M,d>0,为正整数,设M=M0M1...Mα为一种可能的分解,我们说M对于d是左可除的,如果存在0≤i≤α满足
- dmodM0M1...Mi−1==0
- 上一个条件下,c=M0M1...Mi−1d, 如果i<α,还需要满足1≤c≤Mi
- 上一个条件下,如果i<α ,还需要Mimodc==0
若满足前两个条件而不满足第三条,则称为弱左可除
对于一个M=M0M1...Mα,可表示为M=M0M1...Mi−1ccMiMi+1...Mα
约束
上面提到f(x)的值域需要是g(x)定义域的子集,这是一种约束,考虑简单情况,一般来说可以这样定义这个约束
设S=(M0,M1,...,Mα),M=M0M1...Mα,B=(N):(r),说{S,B}是可组合的,如果满足
- M能被r左除,记M=rM′,其中r=M0M1...Mi−1c,M′=cMiMi+1...Mα
- M′可被N弱左除
如此约束的原因是
x↦(x0,x1,...,xα)
f∗g(x)=x0d0′′+x1d1′′+...+xαdα′′
我们渴望找到一种D直接能够提供等价变换,但我们知道
x↦(x0,x1,...,xα)
y=f((xi)i=0α)=x0d0+x1d1+...+xαdα
y↦(x0′,x1′,...,xα′′)
z=g((xi′)i=0α′)=x0′d0′+x1′d1′+...+xα′′dα′′
显然我们要寻找的(di′′)i=0α来源于(di′)i=0α′,换句话说(di′′)i=0α是(di′)i=0α′的切片,同理(xi)i=0α也是(xi′)i=0α′的切片,实际上M0M1...Mi−1就是一个在i位置上为1的向量坐标:(0,...,1,...,0),要求左除本质是找到切片开始的起始坐标,弱左除则是约束切片开始位置加上切片长度不会超过总长
组合
特殊情况
设 S=(Mi)i=0α 和 D=(di)i=0α 组成 A=S:D,B=(N):(r),且{S,B}是满足上述约束的,A∗B的定义分两种情况
假设0≤i≤α,有
r=M0M1...Mi−1c
M′=cMiMi+1...Mα
若N≤cMi,则A∗B=(N):(cdi)
否则,存在一个j∈[i+1,α],使得N=cMiMi+1...Mj−1c′,其中i≤c′<Mj如果j=α
A∗B={(cMi,Mi+1,...,Mj−1,c′):(cdi,di+1,...,dj−1,dj)(cMi,Mi+1,...,Mj−1):(cdi,di+1,...,dj−1),c′>1c′=1
区间
设布局 B 的映射函数为 fB:[0,N)→N。
记 I=[minfB([1,N)), maxfB([1,N))] 为 fB 在区间 [1,N) 上的值域的最小连续整数区间。
再设 M′=M0M1⋯Mα−1,则S 允许访问的位置范围为 [1,M′)。于是,{S,B} 的 区间 为 J=I∩[1,M′)。
若 α=0,则 M′=1,于是 J=∅。
一般情况
设形状元组
S=(M0,M1,…,Mα)
以及布局
B=(N0,N1,…,Nβ):(r0,r1,…,rβ)
并记
Bk=(Nk):(rk),0≤k≤β
我们称二元组 {S,B} 是可组合的,若满足:
-
对所有 0≤k≤β,二元组 {S,Bk} 在上述约束下都是可组合的
-
对所有二元组 {S,Bk}(0≤k≤β)的区间两两互不相交。
在这种情况下,如果
D=(d0,d1,…,dα)
是一个步长元组,并且
A=S:D
那么我们将组合 A∗B 定义为连接得到的布局:
A∗B:=(A∗B0, A∗B1, …, A∗Bβ)
其中每个 A∘Bk 的定义如特殊情况相同
我们知道,
fA(fB(x))=fA(fB0(x0)+fB1(x1)+...+fBβ(xβ))
根据定义
fA∗fB(x)=fA(fB0(x0))+fA(fB1(x1))+...+fA(fBβ(xβ))
一般情况下二者是不等的,但是要求了{S,Bk}不许相交则满足了
fA(fB(x))=fA∗fB(x)
不严谨但是比较好理解的说,每个fBi(xi)分解为向量坐标后都处于不同的有效维度中,通过点积公式很容易就发现二者相等