[object Object] 通过UB索引Tile从GM [object Object] 中读取数据到UB目标Tile。操作模式通过 [object Object] 模板参数显式选择:
[object Object](默认)——从[object Object]收集整行到[object Object]。索引tile是1-D形式([object Object]行主序;Ascend 950PR/Ascend 950DT上也支持[object Object]列主序)。允许[object Object]。[object Object]——通过[object Object]从一维化[object Object]收集元素到[object Object]。索引tile必须与目标具有相同的有效形状。允许退化的[object Object]情况。
越界处理通过 [object Object] 模板参数选择。[object Object] 没有原子或冲突策略:每个目标槽有唯一的源索引,因此不会发生冲突。
目标也可以是 L1 / cube [object Object] tile(NZ布局)(索引以GM tensor形式提供)。此GM → L1路径(支持 [object Object] 和 [object Object],适用于Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品和Ascend 950PR/Ascend 950DT)见下方 章节。
按目标分发摘要:
- CPU模拟器 ——纯C++参考实现。遍历
[object Object]并读取[object Object](Elem语义);CPU sim没有单独的Row coalesce路径。 - Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品VEC-CORE ——标量pipe驱动的单线程 / MTE2遍历。Row模式每行通过
[object Object]发出一次宽[object Object]DMA;Elem模式每元素执行标量GM→UB拷贝。支持ND-GM与ND-UB以及NZ-GM与NZ-UB tile配对。 - Ascend 950PR/Ascend 950DT SIMT ——通过
[object Object]以[object Object](1024线程)进行SIMT启动。Row模式使用warp并行通道读取;Elem模式将每个通道映射到一个元素。Row内核将GM table视为打包ND(行步长 =[object Object]);[object Object]在编译时强制[object Object]。Ascend 950PR/Ascend 950DT不支持NZ块步长布局。退化的Elem[object Object]情况绕过SIMT启动,在AIV向量核心上运行[object Object]。
目标 [object Object],索引 [object Object](Ascend 950PR/Ascend 950DT上也为 [object Object]),表 [object Object]:
目标 [object Object],索引 [object Object](与 [object Object] 相同有效形状),一维表长度为 [object Object]:
同步形式:
声明于 [object Object]:
[object Object]
[object Object]—UB目标tile([object Object]);形状[object Object]。[object Object]—源GM[object Object]。[object Object]必须是[object Object],与目标元素类型匹配。[object Object]—UB索引tile([object Object])。[object Object]—[object Object]值([object Object]或[object Object])。作为第一个模板参数,操作模式在调用点始终显式指定。[object Object]/[object Object]—[object Object]值,用于越界处理。
支持的数据类型:
[object Object]/[object Object]元素类型必须是以下之一:[object Object]、[object Object]、[object Object]、[object Object]、[object Object]、[object Object]、[object Object]、[object Object]、[object Object]。- 在AICore目标上(CPU模拟器以
[object Object]编译时),还支持[object Object]和[object Object]。 [object Object]元素类型必须是[object Object]或[object Object]。
Tile与内存类型:
[object Object]必须是向量Tile([object Object])。[object Object]必须是向量Tile([object Object])。[object Object]和[object Object]必须使用行主序布局([object Object])。[object Object]必须是位于GM内存中的[object Object]。[object Object]必须使用[object Object]。
形状约束:
[object Object]。[object Object]的形状必须为[object Object](按行gather)或[object Object](按元素gather)。[object Object]行宽必须满足32字节对齐,即[object Object]必须是32的倍数。[object Object]的静态shape必须满足[object Object]。
支持的数据类型:
[object Object]/[object Object]元素类型必须是以下之一:[object Object]、[object Object]、[object Object]、[object Object]、[object Object]、[object Object]、[object Object]、[object Object]。Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品不支持[object Object]、[object Object]、[object Object]。[object Object]元素类型必须是[object Object]或[object Object]。
Tile与内存类型:
[object Object]必须是向量Tile([object Object])。[object Object]必须是向量Tile([object Object])。- 索引tile 始终 是
[object Object](ND),无论表布局如何。 [object Object]必须是位于GM内存中的[object Object];[object Object]。- 目标tile的bulk + sub布局必须与表布局精确配对:
[object Object]⇒[object Object]是[object Object]。[object Object]⇒[object Object]是[object Object](= 512Byte)。
形状约束:
- 填充后的
[object Object]必须在两种布局中均为32字节对齐。[object Object]/[object Object]不受此规则约束。 - 对于
[object Object]:[object Object]且[object Object]。 - 对于
[object Object]:[object Object]且[object Object]。 - 两种模式均要求
[object Object]且[object Object]。 - NZ表额外要求
[object Object](= 16)、[object Object](= 32Byte / 元素宽度)、[object Object]且[object Object]。
支持的数据类型:
[object Object]/[object Object]元素类型必须是以下之一:[object Object]、[object Object]、[object Object]、[object Object]、[object Object]、[object Object]、[object Object]、[object Object]、[object Object]。在[object Object]构建中还包含[object Object]、[object Object]、[object Object]。[object Object]元素类型必须是[object Object]或[object Object]。
Tile与内存类型:
[object Object]必须是向量Tile([object Object])。[object Object]必须是向量Tile([object Object])。- SIMT内核对UB tile的布局无感知:每次UB读写均通过
[object Object],因此[object Object]可以为[object Object]或[object Object](搭配[object Object])。 [object Object]必须是位于GM内存中的[object Object];[object Object]。- GM表布局:仅
[object Object]。 Ascend 950PR/Ascend 950DT SIMT内核将GM寻址为扁平行主序缓冲区,行步长硬编码为[object Object];[object Object]强制[object Object],因此表不能有任何行间填充。
形状约束:
- 填充后的
[object Object](RowMajor)或[object Object](ColMajor)必须32字节对齐。 - 对于
[object Object]:索引tile的有效形状为[object Object]([object Object])或[object Object]([object Object])。 - 对于
[object Object]:[object Object]且[object Object]。[object Object]的[object Object]与[object Object]无关。 - 两种模式均要求
[object Object]且[object Object]。Elem模式中退化的[object Object]形状绕过SIMT启动。
[object Object] 同时接受编译时和运行时动态形状:
[object Object]中[object Object]及/或[object Object]将运行时有效范围存储在tile对象中;实现通过[object Object]/[object Object]读取。[object Object]/[object Object]中一个或多个[object Object]条目使用运行时尺寸构造;实现通过[object Object]读取。
[object Object] 中的静态断言以 [object Object] 为门控,仅对编译时已知维度生效。
示例:
Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品和Ascend 950PR/Ascend 950DT上模式是显式的,不会自动检测。[object Object] 中的静态断言根据所选的 [object Object] 值验证提供的tile形状:
当 [object Object] 且 [object Object] 是匹配的 [object Object] tile时,[object Object](Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品)运行专用的NZ路径([object Object]、[object Object])。
- 常量。
[object Object];[object Object]。每个分形块为[object Object]元素(= 512Byte)。 - 逻辑形状。 逻辑行 =
[object Object]。逻辑列 =[object Object]。Row模式的OOB以逻辑行数进行限制/取模;Elem模式以总元素数进行。 - Row模式。 对每个逻辑行
[object Object],内核将[object Object]映射到[object Object],将[object Object]映射到[object Object],然后对每个外层批次发出 一次多burst MTE2传输。当[object Object]时,内核在DMA循环前对整个tile预填[object Object]并跳过OOB行的DMA。 - Elem模式。 对每个
[object Object],内核将[object Object]映射到[object Object],然后通过[object Object]转换为NZ物理偏移。遍历顺序为块列 → 行 → 块内列,确保连续写入目标连续32Byte UB块。
调用者不需要插入任何额外屏障,只需在 [object Object] 之前使用标准的 [object Object] 后置 [object Object] / [object Object] 对,将索引tile带到向量pipe上的干净状态。
Ascend 950PR/Ascend 950DT实现将几乎整个pipe模型隐藏在 [object Object] 之后。唯一显式的内核端握手在标量回退路径([object Object],用于Elem [object Object]):
AIV向量核心具有标准的CANN 192KB UB布局。[object Object] 不从内核内部分配任何UB scratch—唯一的UB消费者是调用者分配的目标tile和索引tile。
Ascend 950PR/Ascend 950DT SIMT内核在AIV向量核心上运行。所有用户tile必须适应AIV的256KB Unified Buffer,加上两个固定的运行时预留:8KB保留区域和Data Cache(最少32KB)。因此最大可用为:
当使用 [object Object] 手动放置tile时,编译器看到 [object Object],全部 216KB 可作为 [object Object] 使用。当工作集在默认预算下超过128KB时,通过 [object Object] 显式声明。
除上述GM → UB gather外,[object Object] 还支持直接收集索引选择的数据到 L1 / cube [object Object] tile(NZ fractal布局) 中。当 [object Object] 时,自动选择GM → L1路径。
GM → L1变体将索引作为GM [object Object]([object Object] / [object Object])提供。Row模式复用三参数形式;Elem模式需要第四个参数 [object Object](GM workspace):
- Dtypes。 Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品:
[object Object]。Ascend 950PR/Ascend 950DT额外支持[object Object]。Row模式进一步要求[object Object]。 - 索引。
[object Object]必须是GM[object Object],类型为[object Object]或[object Object]。 - 表。
[object Object],[object Object]。 - Scratch(仅Elem)。
[object Object]。 - 目标。
[object Object],NZ形式([object Object]),[object Object],[object Object]。
Ascend 950PR/Ascend 950DT上Elem GM → L1路径有两个executor,通过第三个模板参数 [object Object] 选择:
[object Object](四参数形式的默认值)——cube核心通过标量加载遍历索引。[object Object]—— AIV向量核心通过SIMT内核并行化gather。
- Row vs. Elem。 Row coalesce实现最佳聚合带宽。Elem coalesce每个活跃通道发出一条标量GM读取 + UB写入。
- 顺序标量循环(Elem)。 Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品以单线程顺序遍历
[object Object]个通道。 - DMA成本(Row)。 ND:每行一次
[object Object]调用。NZ:每个(逻辑行,批次)对一次调用。 - OOB成本。
[object Object]免费;[object Object]/[object Object]每通道增加一次算术remap;[object Object]写入[object Object]内联(Elem)或预零tile并跳过OOB行的DMA(Row)。
- 形状自适应启动。 SIMT网格大小根据解析的
[object Object]/[object Object]确定。 - OOB策略成本。
[object Object]:零开销。[object Object]/[object Object]:每通道一次算术remap。[object Object]:每通道一次比较和选择。 - 模式/OOB无线程分支。 所有决策均为
[object Object]。 - Row vs. Elem带宽。 Row coalesce实现最佳聚合带宽;Elem coalesce每通道执行一次标量GM加载。