已关闭
[Requirement|需求建议]: [CANNBot]ChamferDistanceGrad算子支持Ascend950 #4419
小王!创建于  7月29日关闭于  26 天前
小王!
小王!成员
7月29日 创建

Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.

Backgroud(背景信息)

为ChamferDistanceGrad新增了对Ascend 950架构的完整支持,并实现了配套的Tiling策略和SIMT计算内核。

本次开发主要针对ChamferDistanceGrad中存在的多点梯度聚合、并行写冲突以及Inf、NaN等特殊值精度不一致问题进行优化,保证算子在Ascend 950上的功能正确性、计算确定性和精度稳定性。

Origin(信息来源)

Vector算子开发七组

Benefit / Necessity (价值/作用)

Chamfer Distance主要用于衡量两个点集之间的相似程度,广泛应用于点云匹配、点云补全、三维重建、自动驾驶和三维生成模型等场景。

ChamferDistanceGrad负责Chamfer Distance的反向梯度计算,其结果会直接影响点云网络的训练精度。

该算子的梯度计算中,多个点可能同时向同一个目标点累加梯度。传统原子累加方案可能由于执行顺序不固定,导致普通浮点数及Inf、NaN场景下的结果存在差异。

本次实现通过确定性的梯度聚合方式,避免原子操作带来的累加顺序不确定问题,保证相同输入多次执行结果一致,并提升算子在特殊值场景下与Golden结果的一致性。

Design(设计方案)

1)实现ChamferDistanceGrad Tiling策略

新增ChamferDistanceGrad的Tiling实现,负责获取Ascend 950平台核数和UB资源,并完成输入Shape及维度关系校验。

Tiling侧校验两个点集的Batch和坐标维度保持一致,同时校验索引张量、上游梯度张量的Shape是否合法,并对元素数量和Workspace大小进行溢出保护。

2)采用按Batch维度切核

根据Batch数量和可用AIV核数计算实际使用核数,每个Batch仅由一个AICore负责处理。

该方案避免同一Batch被多个AICore同时写入,消除跨核数据竞争和跨核同步依赖,同时能够在多Batch场景下充分利用多核并行能力。

3)实现SIMT模板化计算内核

基于AscendC SIMT编程模型实现ChamferDistanceGrad计算内核,通过多个SIMT线程并行处理不同点及不同坐标维度的梯度。

内核支持不同浮点数据类型,并统一使用FP32完成中间计算,以提升低精度数据类型下的计算精度。

4)采用确定性Gather聚合方式

针对多个输入点可能映射到同一个目标点的场景,不使用AtomicAdd进行并行散射累加。

每个输出元素由唯一SIMT线程负责,该线程遍历索引信息并按照固定顺序收集所有相关梯度贡献,从而将Scatter累加转换为Gather聚合。

该方案能够避免原子操作执行顺序不同导致的结果波动,保证算子计算结果具有确定性。

5)优化Inf和NaN特殊值处理

针对输入或梯度中包含Inf、-Inf和NaN的场景,实现符合IEEE语义的加法、减法和乘法处理。

通过固定的计算与累加顺序,保证正负无穷相加、零乘无穷以及NaN传播等场景下的结果稳定,提升与竞品Golden的精度一致性。

6)增加异常与边界保护

内核侧增加维度、核数和索引范围保护,避免非法索引导致越界访问。

Tiling侧增加Shape合法性、整数范围、元素数量及Workspace大小检查,提高算子的稳定性和可维护性。

likedislike
小王!小王!成员
7月29日 添加了label:requirement
小王!小王!成员
7月29日 将 qq_52056150 设为负责人
小王!小王!成员
7月29日 修改标题为 “[Requirement|需求建议]: [CANNBot]ChamferDistanceGrad算子支持Ascend950”,原标题为“[Requirement|需求建议]: ”
小王!小王!成员
26 天前 issue状态由 进行中 改变为 已解决
小王!小王!成员
26 天前 关闭了 issue