已开启
[Feature]: 【社区任务】MaskedScatter算子贡献 #3310
Tream创建于 6月12日
6月12日 关联了pull request:[社区任务]MaskedScatter算子
6月12日 关联了pull request:[社区任务]MaskedScatter算子
6月12日 将 TreamTik 设为负责人
tangweiwei2
7月27日 评论:
7月27日 评论:
@Tream 您好,该社区任务自 6 月 12 日以来已有一段时间未更新,想跟进一下当前进展:
- 基于 Ascend C 改造 MaskedScatter 算子的开发进度如何?aclnn 直调方式的编译和 example 验证是否已完成?
- 开发过程中是否有阻塞问题需要协助?
欢迎同步最新状态,方便及时推进。感谢!


Tream
7月27日 评论:
7月27日 评论:
@Tream 您好,该社区任务自 6 月 12 日以来已有一段时间未更新,想跟进一下当前进展:
- 基于 Ascend C 改造 MaskedScatter 算子的开发进度如何?aclnn 直调方式的编译和 example 验证是否已完成?
- 开发过程中是否有阻塞问题需要协助?
欢迎同步最新状态,方便及时推进。感谢!


tangweiwei2
7月27日 评论:
7月27日 评论:
@Tream 感谢确认!既然关联 MR !6001 已合并,该社区任务已完成。
麻烦您确认下是否可以关闭本 issue?如还有遗留事项可在关闭时补充说明。再次感谢贡献!


Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
Backgroud(背景信息)
需求背景
需求来源
基于 TBE MaskedScatter 算子历史版本,使用 Ascend C 进行改造与适配。改造目标是保持 TBE 语义和关键调度逻辑一致,并通过 aclnn 直调方式完成自定义 experimental 算子的编译、安装和 example 验证。
MaskedScatter 的语义为:按一维扁平顺序扫描
x和mask,当mask[i]为 false 时输出y[i] = x[i];当mask[i]为 true 时,按 true mask 出现顺序从updates中取值写入y[i]。等价伪代码如下:
int64_t updateIndex = 0; for (int64_t i = 0; i < numElemX; ++i) { if (mask[i] != 0) { y[i] = updates[updateIndex]; updateIndex++; } else { y[i] = x[i]; } }TBE 源码分析
通过对 TBE 内置 MaskedScatter 算子源码(
masked_scatter.py中MaskedScatter类、masked_scatter()顶层函数、task_schedule()、calc_updates_start()、compute())进行逐行分析,当前支持的能力与核心逻辑如下。TBE 算子源码路径:
算子原型路径:
算子信息库路径:
1. 支持的数据类型
TBE
masked_scatter.py的 dtype 字节表支持如下类型:mask使用 bool,TBE 内部按 int8 Tensor 读写当前 Ascend C experimental 算子注册支持:
TBE 整体流程图
流程图源码文件:
TBE task_schedule 流程图
流程图源码文件:
TBE calc_updates_start 流程图
流程图源码文件:
TBE compute 流程图
流程图源码文件:
需求分析
外部组件依赖
不涉及新增外部组件依赖。
本算子依赖 CANN 基础能力:
需求模块设计
算子原型
属性:
MaskedScatter 当前无属性。
算子支持型号
Atlas A2 训练系列产品 / Atlas 800I A2 推理产品(ascend910b)。
需求详细设计
使能方式
需求总体设计
host侧设计方案
MaskedScatter host 侧负责输出 shape 推导、输入合法性校验、tiling data 写入和 block dim 设置。
1) tiling 参数
Ascend C 使用与 TBE
tiling_gm一致的 4 个字段:struct MaskedScatterTilingData { int64_t numElemX; int64_t numElemMask; int64_t numElemUpdates; int64_t tilingCoreNum; };host 侧写入规则:
2) 分核策略
host 侧设置:
context->SetBlockDim(static_cast<uint32_t>(coreNum));具体逻辑 task 长度、逻辑 task 数、每核 task 数在 kernel
Init()和Process()中计算。该设计与 TBE 一致:host 只传入tiling_core_num,kernel 内按TASK_ALIGN和MAX_VEC_PROCESS_NUM计算分段。Ascend C Host Tiling 流程图
流程图源码文件:
kernel侧设计方案
Kernel 侧执行
Init和Process两个阶段。1) Kernel 入口
masked_scatter.cpp中入口逻辑如下:REGISTER_TILING_DEFAULT(MaskedScatterTilingData); GET_TILING_DATA_WITH_STRUCT(MaskedScatterTilingData, tilingData, tiling); NsMaskedScatter::MaskedScatter<DTYPE_X> op; op.Init(x, mask, updates, y, &tilingData); op.Process();当前
schMode仅作为模板参数声明存在,实际 kernel 使用单一路径,语义对应 TBE Python 版本的通用实现。2) GetTaskBlockSize
Ascend C 与 TBE 保持一致:
int64_t blockSizeAligned = MAX_VEC_PROCESS_NUM; if (tilingCoreNum_ != 0) { int64_t blockSize = numElemX_ / tilingCoreNum_; blockSizeAligned = AlignDiv(blockSize, MAX_VEC_PROCESS_NUM); } if (numElemX_ >= tilingCoreNum_ * TASK_ALIGN) { blockSizeAligned = TASK_ALIGN; } if (numElemX_ <= MAX_VEC_PROCESS_NUM) { blockSizeAligned = MAX_VEC_PROCESS_NUM; } return blockSizeAligned;这里的
TASK_ALIGN = 4096、MAX_VEC_PROCESS_NUM = 64与 TBE 常量保持一致。3) Process
每个 AI Core 只处理分配给自己的逻辑 task:
aicoreIdx = GetBlockIdx()。coreTaskNum。preCoreTaskNum。coreTaskNum > 0,先调用:taskUpdatesStart = CalcUpdatesStart(preCoreTaskNum * alignedElemPerCore_);taskUpdatesStart = Compute((preCoreTaskNum + taskIdx) * alignedElemPerCore_, taskUpdatesStart);该逻辑与 TBE
task_schedule()一致:每核只在开头统计一次前缀 mask true 数,本核内部 task 通过Compute返回值继续推进updatesStart。4) CalcUpdatesStart
Ascend C 的 mask 前缀计数流程与 TBE 对齐,核心常量为:
constexpr int64_t TASK_ALIGN = 4096; constexpr int64_t COUNT_REDUCE_LEN = TASK_ALIGN;5) Compute
Compute(inputOffset, updatesStart)处理一个逻辑 task。Ascend C Kernel 流程图
1. Kernel 入口与 Init 流程图
流程图源码文件:
2. Process 分核调度流程图
流程图源码文件:
3. CalcUpdatesStart 流程图
流程图源码文件:
4. Compute 流程图
流程图源码文件:

算子约束限制
x、mask、yshape 必须完全相同。maskdtype 必须为 bool。x、updates、ydtype 必须完全相同。int64,即使 TBE dtype 字节表包含int64。updates元素数量必须大于等于 mask true 数;当当前 task 可读 updates 不足时,updatesOffsetUb < numRemainUpdates会阻止继续写入,后续位置保留原始x值。特性交叉分析可维可测分析
精度标准/性能标准
关联的 Issue
暂无。
文档更新
本文档。
类型标签
Origin(信息来源)
社区任务
Benefit / Necessity (价值/作用)
Design(设计方案)