cann/asc-devkit Layout层次化表述法
Layout和层次化表述法【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkitLayout我们使用Shape和Stride来表示Layout排布格式例如下图中的行优先和列优先排布。Shape用于表达Tensor形状Stride则用于区分不同的排布方式。行优先Shape(2, 4)Stride(4, 1)列优先Shape(2, 4)Stride(1, 2)图中每个方格中的数字表示该位置元素在内存中按顺序排列时的下标。对于相同的矩阵位置排布方式不同时其在内存中的顺序可能不同。例如矩阵坐标(1, 0)在行优先和列优先的情况下对应元素在内存中的顺序分别是4和1。图1行优先排布图2列优先排布层次化表述法通常Shape或Stride中的元素是一个单独的整数但遇到一些复杂的内存排布情况时普通二维表述可能无法准确表达因此这里采用层次化表述法。在这种方式中元素也可以是一个元组。元组的第一个元素用于描述不同行层次中的矩阵行数第二个元素用于描述不同层次中的矩阵列数。例如在下图中Layout的Shape和Stride分别为Shape((2, 3), (2, 4))Stride((1, 4), (2, 12))图3层次化表述法图中展示了两层矩阵内层矩阵为内部用灰色线包裹的矩阵外层矩阵为将内层矩阵视为一个元素时用黑色线包裹的矩阵。Shape的第一个元素描述行方向的形状23表示内层矩阵和外层矩阵的行数分别为2和3Shape的第二个元素描述列方向的形状24表示内层矩阵和外层矩阵的列数分别为2和4。Stride中的每个元素与Shape中的元素对应表示该对应维度下相邻元素首地址在内存地址上的间隔。图片中用箭头表示了每个维度相邻元素的首地址间隔。常见的Layout分形在基于Ascend C进行矩阵编程的场景中会用到以下几种常用的Layout。这些格式都采用如上文介绍的层次化表述法来表达要求有内外层两层矩阵具体表达方式如下其中_x是Std::Int 的简写形式比如_16表示类型Std::Int16值16保存在类型中Layout ((Shape): (Stride)) Shape ((ShapeRow0, ShapeRow1), (ShapeColumn0, ShapeColumn1)) Stride ((StrideRow0, StrideRow1), (StrideColumn0, StrideColumn1))NZ LayoutNZ Layout格式的ShapeRow0、ShapeColumn0为固定值。内层分形的Shape为16 * (32Byte / sizeof(T))StrideRow0、StrideColumn0也为固定值即内层分形按Z字形组织外层分形按N字形组织因此StrideColumn1需要满足按整块对齐的要求。Layout ((Shape) : (Stride)) Shape ((_16{}, ShapeRow1), (_32{} / sizeof(T), ShapeColumn1)) Stride ((_32{} / sizeof(T), StrideRow1), (_1{}, StrideColumn1)) // StrideColumn1应满足 // StrideColumn1 % (ShapeRow0 * ShapeColumn0) 0图4NZ Layout下面是一个连续的NZ Layout示例其中C0_ELEMENT _32{} / sizeof(T)。Layout ((Shape) : (Stride)) Shape ((_16{}, ceil_div(row, _16{})), (C0_ELEMENT, ceil_div(column, C0_ELEMENT))) Stride ((C0_ELEMENT, C0_ELEMENT * _16{}), (_1{}, C0_ELEMENT * ceil_align(row, _16{})))ZN LayoutZN Layout格式的ShapeRow0、ShapeColumn0为固定值。内层分形的Shape为32Byte / sizeof(T)* 16StrideRow0、StrideColumn0也为固定值即内层分形按N字形组织外层分形按Z字形组织因此StrideRow1需要满足按整块对齐的要求。Layout ((Shape) : (Stride)) Shape ((C0_ELEMENT, ShapeRow1), (_16{}, ShapeColumn1)) Stride ((_1{}, StrideRow1), (C0_ELEMENT, StrideColumn1)) // StrideRow1应满足 // StrideRow1 % (ShapeRow0 * ShapeColumn0) 0图5ZN Layout下面是一个连续的ZN Layout示例其中C0_ELEMENT _32{} / sizeof(T)。Layout ((Shape) : (Stride)) Shape ((C0_ELEMENT, ceil_div(row, C0_ELEMENT)), (_16{}, ceil_div(column, _16{}))) Stride ((_1{}, C0_ELEMENT * ceil_align(column, _16{})), (C0_ELEMENT, C0_ELEMENT * _16{}))DNExt LayoutDNExt Layout格式的ShapeRow0、ShapeColumn0为固定值即内层分形固定为1 * 1。StrideRow0、StrideColumn0也固定为0表示内层只有一个元素没有额外的步长概念。外层按列优先方式连续存储因此StrideColumn1等于行数。Layout ((Shape) : (Stride)) Shape ((_1{}, ShapeRow1), (_1{}, ShapeColumn1)) Stride ((_0{}, _1{}), (_0{}, StrideColumn1))图6DNExt Layout下面是一个连续的DNExt Layout示例。Layout ((Shape) : (Stride)) Shape ((_1{}, row), (_1{}, column)) Stride ((_0{}, _1{}), (_0{}, row))NDExt LayoutNDExt Layout格式的ShapeRow0、ShapeColumn0为固定值即内层分形固定为1 * 1。StrideRow0、StrideColumn0也固定为0表示内层只有一个元素没有额外的步长概念。外层按行优先方式连续存储因此StrideRow1等于列数StrideColumn1固定为1。Layout ((Shape) : (Stride)) Shape ((_1{}, ShapeRow1), (_1{}, ShapeColumn1)) Stride ((_0{}, StrideRow1), (_0{}, _1{}))图7NDExt Layout下面是一个连续的NDExt Layout示例。Layout ((Shape) : (Stride)) Shape ((_1{}, row), (_1{}, column)) Stride ((_0{}, column), (_0{}, _1{}))DN LayoutDN Layout是一种二维列优先排布格式。从层次化表述法角度看它可以视为只有外层矩阵的特例其中行方向步长固定为1列方向步长等于行数。Layout ((Shape) : (Stride)) Shape (ShapeRow, ShapeColumn) Stride (_1{}, ShapeRow)下面是一个连续的DN Layout示例。Layout ((Shape) : (Stride)) Shape (row, column) Stride (_1{}, row)ND LayoutND Layout是一种二维行优先排布格式。从层次化表述法角度看它可以视为只有外层矩阵的特例其中列方向步长固定为1行方向步长等于列数。Layout ((Shape) : (Stride)) Shape (ShapeRow, ShapeColumn) Stride (ShapeColumn, _1{})下面是一个连续的ND Layout示例。Layout ((Shape) : (Stride)) Shape (row, column) Stride (column, _1{})ZZ LayoutZZ Layout格式的ShapeRow0、ShapeColumn0为固定值。内层分形的Shape与NZ Layout一致StrideRow0、StrideColumn0也为固定值即内层分形按Z字形组织外层分形同样按Z字形组织因此列方向连续行方向跨度由整行分形块数决定。Layout ((Shape) : (Stride)) Shape ((_16{}, ShapeRow1), (C0_ELEMENT, ShapeColumn1)) Stride ((C0_ELEMENT, StrideRow1), (_1{}, C0_ELEMENT * _16{}))下面是一个连续的ZZ Layout示例其中C0_ELEMENT _32{} / sizeof(T)。Layout ((Shape) : (Stride)) Shape ((_16{}, ceil_div(row, _16{})), (C0_ELEMENT, ceil_div(column, C0_ELEMENT))) Stride ((C0_ELEMENT, _16{} * ceil_align(column, C0_ELEMENT)), (_1{}, C0_ELEMENT * _16{}))NN LayoutNN Layout格式的ShapeRow0、ShapeColumn0为固定值仅用于fp8_e8m0_t场景。内层分形固定为2 * 16StrideRow0、StrideColumn0也为固定值即内层分形按N字形组织。外层分形同样按N字形组织。Layout ((Shape) : (Stride)) Shape ((_2{}, ShapeRow1), (_16{}, ShapeColumn1)) Stride ((_1{}, _32{}), (_2{}, StrideColumn1))下面是一个连续的NN Layout示例。Layout ((Shape) : (Stride)) Shape ((_2{}, row / _2{}), (_16{}, ceil_div(column, _16{}))) Stride ((_1{}, _32{}), (_2{}, row * _16{}))ScaleAND LayoutScaleAND Layout格式的ShapeRow0、ShapeColumn0为固定值仅支持fp8_e8m0_t的scaleA数据且要求C0_ELEMENT 2。其物理布局与连续的NDExt Layout一致即内层固定为1 * 1外层按行优先方式连续存储语义上用于描述scaleA不转置的场景。Layout ((Shape) : (Stride)) Shape ((_1{}, ShapeRow1), (_1{}, ShapeColumn1)) Stride ((_0{}, StrideRow1), (_0{}, _1{}))下面是一个连续的ScaleAND Layout示例。Layout ((Shape) : (Stride)) Shape ((_1{}, row), (_1{}, column)) Stride ((_0{}, column), (_0{}, _1{}))ScaleADN LayoutScaleADN Layout格式的ShapeRow0、ShapeColumn0为固定值仅支持fp8_e8m0_t的scaleA数据且要求C0_ELEMENT 2。其列方向内层分形固定为2行方向内层固定为1外层按列优先方式组织。语义上用于描述scaleA转置的场景。Layout ((Shape) : (Stride)) Shape ((_1{}, ShapeRow1), (_2{}, ShapeColumn1)) Stride ((_0{}, _2{}), (_1{}, StrideColumn1))下面是一个连续的ScaleADN Layout示例。Layout ((Shape) : (Stride)) Shape ((_1{}, row), (_2{}, column / _2{})) Stride ((_0{}, _2{}), (_1{}, _2{} * row))ScaleBND LayoutScaleBND Layout格式的ShapeRow0、ShapeColumn0为固定值仅支持fp8_e8m0_t的scaleB数据且要求C0_ELEMENT 2。其行方向内层分形固定为2列方向内层固定为1外层按行优先方式组织。语义上用于描述scaleB转置的场景。Layout ((Shape) : (Stride)) Shape ((_2{}, ShapeRow1), (_1{}, ShapeColumn1)) Stride ((_1{}, StrideRow1), (_0{}, _2{}))下面是一个连续的ScaleBND Layout示例。Layout ((Shape) : (Stride)) Shape ((_2{}, row / _2{}), (_1{}, column)) Stride ((_1{}, _2{} * column), (_0{}, _2{}))ScaleBDN LayoutScaleBDN Layout格式的ShapeRow0、ShapeColumn0为固定值仅支持fp8_e8m0_t的scaleB数据且要求C0_ELEMENT 2。其物理布局与连续的DNExt Layout一致即内层固定为1 * 1外层按列优先方式连续存储语义上用于描述scaleB不转置的场景。Layout ((Shape) : (Stride)) Shape ((_1{}, ShapeRow1), (_1{}, ShapeColumn1)) Stride ((_0{}, _1{}), (_0{}, StrideColumn1))下面是一个连续的ScaleBDN Layout示例。Layout ((Shape) : (Stride)) Shape ((_1{}, row), (_1{}, column)) Stride ((_0{}, _1{}), (_0{}, row))MX scaleA要求在矩阵GM上按照ScaleAND Layout或ScaleADN Layout格式排布在L1上需满足按行读取需求即按照ZZ Layout格式排布。如下图所示若GM上scaleA矩阵为ScaleAND或者ScaleADN分形排布搬运到L1后分形为ZZ排布。图8scaleA矩阵在不同位置上的排布格式MX scaleB要求在矩阵GM上按照ScaleBND Layout或ScaleBDN Layout格式排布在L1上需满足按列读取需求即按照NN Layout格式排布。如下图所示若GM上scaleB矩阵为ScaleBND或者ScaleBDN分形排布搬运到L1后分形为NN排布。图9scaleB矩阵在不同位置上的排布格式Layout分形结构数据表每种分形对应的Layout格式如下表所示其中T指的是支持的数据类型中除fp8_e8m0_t之外的数据类型C0_ELEMENT _32{} / sizeof(T)特殊情况下当T为fp4x2_e2m1_t或fp4x2_e1m2_t时C0_ELEMENT _64{}。LayoutFormatPattern类型ShapeRow0ShapeRow1ShapeColumn0ShapeColumn1StrideRow0StrideRow1StrideColumn0StrideColumn1NZLayoutPtnT_16{}ceil_div(row, _16{})C0_ELEMENTceil_div(column, C0_ELEMENT)C0_ELEMENTC0_ELEMENT * _16{}_1{}C0_ELEMENT * ceil_align(row, _16{})ZNLayoutPtnTC0_ELEMENTceil_div(row, C0_ELEMENT)_16{}ceil_div(column, _16{})_1{}C0_ELEMENT * ceil_align(column, _16{})C0_ELEMENTC0_ELEMENT * _16{}DNExtLayoutPtnT_1{}row_1{}column_0{}_1{}_0{}rowNDExtLayoutPtnT_1{}row_1{}column_0{}column_0{}_1{}DNLayoutPtnTrow-column-_1{}-row-NDLayoutPtnTrow-column-column-_1{}-ZZLayoutPtnT_16{}ceil_div(row, _16{})C0_ELEMENTceil_div(column, C0_ELEMENT)C0_ELEMENT_16{} * ceil_align(column, C0_ELEMENT)_1{}C0_ELEMENT * _16{}ZZLayoutPtnfp8_e8m0_t_16{}ceil_div(row, _16{})_2{}column / _2{}_2{}column * _16{}_1{}_32{}NNLayoutPtnfp8_e8m0_t_2{}row / _2{}_16{}ceil_div(column, _16{})_1{}_32{}_2{}row * _16{}ScaleANDLayoutPtnfp8_e8m0_t_1{}row_1{}column_0{}column_0{}_1{}ScaleADNLayoutPtnfp8_e8m0_t_1{}row_2{}column / _2{}_0{}_2{}_1{}_2{} * rowScaleBNDLayoutPtnfp8_e8m0_t_2{}row / _2{}_1{}column_1{}_2{} * column_0{}_2{}ScaleBDNLayoutPtnfp8_e8m0_t_1{}row_1{}column_0{}_1{}_0{}row【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考