开发者
下载
[object Object][object Object]

[object Object]

[object Object] 的每个32元素块,与 [object Object] 中对应的索引一起进行排序,并将排序后的值-索引对写入 [object Object]。底层SFU指令为 VBS32[object Object]),单次调用可排序一个或多个独立的32元素列表。

[object Object]

VBS32运行在 SFU(非向量流水线)上。一次调用排序 [object Object] 个连续的32元素块,每个块由32个值 + 32个索引组成,打包为值-索引对:

[object Object]
  • [object Object](上限 [object Object])打包到 [object Object]
  • 块在内存中连续分布,步长为32个元素:块 [object Object] 读取 [object Object][object Object],写入 [object Object],其中 [object Object] = 2(float)或4(half)——值-索引对的扩展因子。
  • 排序顺序:按值降序;相同值时索引小者优先。
[object Object]

对每一行 [object Object][object Object] 按独立的32元素块处理。设块 [object Object] 覆盖列 [object Object][object Object] 为其有效元素数。

(vk,ik)=(srcr,32b+k,  idxr,32b+k),0k<nb(v_k, i_k) = (\mathrm{src}_{r,32b+k},\; \mathrm{idx}_{r,32b+k}), \quad 0 \le k < n_b

按值降序排序,输出重排后的序列:

[(vπ(0),iπ(0)),  (vπ(1),iπ(1)),  ][(v_{\pi(0)}, i_{\pi(0)}),\; (v_{\pi(1)}, i_{\pi(1)}),\; \ldots]

其中 [object Object] 为该块的排序置换。

注:

  • [object Object] 是输入Tile(索引随值一起被重排),不是输出。
  • [object Object] 存储排序后的值-索引对,而非仅排序后的值。
[object Object]

声明于 [object Object]

[object Object]
[object Object]
[object Object]

对于 [object Object] 形状为 R×CR \times C(有效区域)、块大小32:

[object Object]undefined

[object Object] 扩展因子[object Object]):每个输入元素生成一个8Byte的tuple [object Object]——[object Object] 的value占满4Byte;[object Object] 的2Byte value零扩展至4Byte。因此 [object Object] 恒为 C×8C \times 8 字节。

[object Object]undefined
[object Object][object Object]undefined
[object Object]

CC = [object Object]BB = [object Object] 字节数,GG = 32(块大小)。实现根据整行大小是否满足 [object Object] 进行分支(Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品按元素数,Ascend 950PR/Ascend 950DT按字节数):

tmpSize={ceilG(C)Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品:C8160(元素数)    (Ascend 950PR/Ascend 950DT:Cb8160(字节))G=32Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品:C>8160(元素数)    (Ascend 950PR/Ascend 950DT:Cb>8160(字节))\mathrm{tmpSize} = \begin{cases} \mathrm{ceil}_{G}(C) & \text{Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品:} C \le 8160 \text{(元素数)} \;\; \text{(Ascend 950PR/Ascend 950DT:} C \cdot b \le 8160 \text{(字节))} \\ G = 32 & \text{Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品:} C > 8160 \text{(元素数)} \;\; \text{(Ascend 950PR/Ascend 950DT:} C \cdot b > 8160 \text{(字节))} \end{cases}
  • [object Object] = CC 向上取整到32的倍数。
  • Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品:阈值单位为元素数[object Object]),即 C8160C \le 8160,与dtype无关(float → C8160C \le 8160,half → C8160C \le 8160)。
  • Ascend 950PR/Ascend 950DT:阈值单位为字节[object Object]),即 Cb8160C \cdot b \le 8160(float → C2040C \le 2040,half → C4080C \le 4080)。该阈值为 [object Object](MOV_UB_TO_UB)的repeat上限 = 255块 × 32Byte。
  • 尾块 = t=CmodGt = C \bmod G 个元素(末尾不完整块),扩展至 GG 并以 -\infty 填充。
  • Path A(Cb8160C \cdot b \le 8160,小行):从行首整行复制到tmp,然后原地填充最后32个元素。
  • Path B(Cb>8160C \cdot b > 8160,大行):仅复制尾块到tmp;完整块直接从 [object Object] 排序。
  • VBS32硬件上限:每次调用 [object Object] 块(≤ 8160元素);超过255块的行拆分为多次 [object Object] 调用。
  • UB布局: [object Object] 应放置在 [object Object] 之后(32Byte对齐),大小为 [object Object] 字节(等价于 [object Object],因 b{2,4}b \in \{2,4\} 整除32)——不应使用固定的8KB偏移,因为Path A(Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品)在接近阈值时对float需要最多 ~32KB(C8160C \le 8160 元素 = float 32KB)。
[object Object]

[object Object] 时,末尾不完整块(t=Cmod32t = C \bmod 32 个元素)须填充为完整的32元素块后才能送入 [object Object]。两条路径:

  • Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品:C8160C \le 8160(元素数) / Ascend 950PR/Ascend 950DT:Cb8160C \cdot b \le 8160(字节)(小行):整行复制到 [object Object],然后通过 [object Object] 原地覆盖最后32个元素为 -\infty 填充;从 [object Object] 排序整行。
  • Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品:C>8160C > 8160(元素数) / Ascend 950PR/Ascend 950DT:Cb>8160C \cdot b > 8160(字节)(大行):仅复制尾块[object Object] 并填充;完整块直接从 [object Object] 排序,仅尾块从 [object Object] 排序。

填充值(-\infty = [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]