对 [object Object] 的每个32元素块,与 [object Object] 中对应的索引一起进行排序,并将排序后的值-索引对写入 [object Object]。底层SFU指令为 VBS32([object Object]),单次调用可排序一个或多个独立的32元素列表。
VBS32运行在 SFU(非向量流水线)上。一次调用排序 [object Object] 个连续的32元素块,每个块由32个值 + 32个索引组成,打包为值-索引对:
[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] 按独立的32元素块处理。设块 [object Object] 覆盖列 [object Object],[object Object] 为其有效元素数。
按值降序排序,输出重排后的序列:
其中 [object Object] 为该块的排序置换。
注:
[object Object]是输入Tile(索引随值一起被重排),不是输出。[object Object]存储排序后的值-索引对,而非仅排序后的值。
声明于 [object Object]:
[object Object]
对于 [object Object] 形状为 (有效区域)、块大小32:
[object Object] 扩展因子([object Object]):每个输入元素生成一个8Byte的tuple [object Object]——[object Object] 的value占满4Byte;[object Object] 的2Byte value零扩展至4Byte。因此 [object Object] 恒为 字节。
设 = [object Object], = [object Object] 字节数, = 32(块大小)。实现根据整行大小是否满足 [object Object] 进行分支(Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品按元素数,Ascend 950PR/Ascend 950DT按字节数):
[object Object]= 向上取整到32的倍数。- Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品:阈值单位为元素数(
[object Object]),即 ,与dtype无关(float → ,half → )。 - Ascend 950PR/Ascend 950DT:阈值单位为字节(
[object Object]),即 (float → ,half → )。该阈值为[object Object](MOV_UB_TO_UB)的repeat上限 = 255块 × 32Byte。 - 尾块 = 个元素(末尾不完整块),扩展至 并以 填充。
- Path A(,小行):从行首整行复制到tmp,然后原地填充最后32个元素。
- Path B(,大行):仅复制尾块到tmp;完整块直接从
[object Object]排序。 - VBS32硬件上限:每次调用
[object Object]块(≤ 8160元素);超过255块的行拆分为多次[object Object]调用。 - UB布局:
[object Object]应放置在[object Object]之后(32Byte对齐),大小为[object Object]字节(等价于[object Object],因 整除32)——不应使用固定的8KB偏移,因为Path A(Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品)在接近阈值时对float需要最多 ~32KB( 元素 = float 32KB)。
当 [object Object] 时,末尾不完整块( 个元素)须填充为完整的32元素块后才能送入 [object Object]。两条路径:
- Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品:(元素数) / Ascend 950PR/Ascend 950DT:(字节)(小行):整行复制到
[object Object],然后通过[object Object]原地覆盖最后32个元素为 填充;从[object Object]排序整行。 - Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品:(元素数) / Ascend 950PR/Ascend 950DT:(字节)(大行):仅复制尾块到
[object Object]并填充;完整块直接从[object Object]排序,仅尾块从[object Object]排序。
填充值( = [object Object] 或 [object Object])落在降序排序的底部。若 [object Object],行按 [object Object] 大小的组拆分,每组通过独立的 [object Object] 调用排序。