aclnnChamferDistanceBackward
支持的产品型号
- [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品[object Object]。
接口原型
每个算子分为undefined,必须先调用“aclnnChamferDistanceBackwardGetWorkspaceSize”接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用“aclnnChamferDistanceBackward”接口执行计算。
aclnnStatus aclnnChamferDistanceBackwardGetWorkspaceSize(const aclTensor* xyz1, const aclTensor* xyz2, const aclTensor* idx1, const aclTensor* idx2, const aclTensor* gradDist1, const aclTensor* gradDist2, aclTensor* gradXyz1, aclTensor* gradXyz2, uint64_t *workspaceSize, aclOpExecutor **executor)
aclnnStatus aclnnChamferDistanceBackward(void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream)
功能描述
功能描述: ChamferDistance(倒角距离)的反向算子,根据正向的输入对输出的贡献及初始梯度求出输入对应的梯度。
计算公式:
假设有两个点集: xyz1=[B,N,2], xyz2=[B,M,2]
ChamferDistance(倒角距离)正向算子计算公式为:
反向算子即为对该公式求导,计算公式为:
的导数
其中:,是根据正向输出的id1的索引值从xyz2中取出距离最小的点的横坐标,单点求导公式如上,因为单点梯度更新的位置是连续的,所以考虑多点并行计算。
的导数
其中,是根据正向输出的id1的索引值从xyz2中取出距离最小的点的纵坐标,单点求导公式如上,因为单点梯度更新的位置是连续的,所以也可以考虑多点并行计算。
的导数
其中是根据正向输出的id1的索引值从xyz2中取出距离最小的点的横坐标,单点求导公式如上,因为单点梯度需要根据最小距离值对应的索引值去更新,所以这块无法并行只能单点计算。
的导数
其中是根据正向输出的id1的索引值从xyz2中取出距离最小的点的纵坐标,单点求导公式如上,因为单点梯度需要根据最小值对应的索引值去更新,所以这块也无法并行只能单点计算。
对应对的导数和上述过程类似,这边不再赘述。
最终计算公式如下,i∈[0,n):
aclnnChamferDistanceBackwardGetWorkspaceSize
参数说明:
- xyz1(aclTensor*, 计算输入):算子正向输入的点集1的坐标,Device侧的aclTensor,数据类型支持FLOAT、FLOAT16,且数据类型与xyz2、grad_dist1、grad_dist2、grad_xyz1、grad_xyz2一致,shape为(B,N,2),undefined支持ND
- xyz2(aclTensor*, 计算输入):算子正向输入的点集2的坐标,Device侧的aclTensor,数据类型支持FLOAT、FLOAT16,且数据类型与xyz2、grad_dist1、grad_dist2、grad_xyz1、grad_xyz2一致,shape为(B,N,2),undefined支持ND
- idx1(aclTensor*, 计算输入):算子正向输出的距离xyz1最小距离的xyz2中的点的索引tensor,Device侧的aclTensor,数据类型支持INT32,且数据类型与idx2一致,shape为(B,N),undefined支持ND
- idx2(aclTensor*, 计算输入):算子正向输出的距离xyz2最小距离的xyz1中的点的索引tensor,Device侧的aclTensor,数据类型支持INT32,且数据类型与idx1一致,shape为(B,N),undefined支持ND
- gradDist1(aclTensor*, 计算输入):正向输出dist1的反向梯度,也是反向算子的初始梯度,Device侧的aclTensor,数据类型支持FLOAT、FLOAT16,且数据类型与xyz2、xyz1、grad_dist2、grad_xyz1、grad_xyz2一致,shape为(B,N),undefined支持ND
- gradDist2(aclTensor*, 计算输出):正向输出dist2的反向梯度,也是反向算子的初始梯度,Device侧的aclTensor,数据类型支持FLOAT、FLOAT16,且数据类型与xyz2、xyz1、grad_dist2、grad_xyz1、grad_xyz2一致,shape为(B,N),undefined支持ND
- gradXyz1(aclTensor*, 计算输出):梯度更新之后正向算子输入xyz1对应的梯度,Device侧的aclTensor,数据类型支持FLOAT、FLOAT16,且数据类型与xyz1、xyz2、grad_dist1、grad_dist2、grad_xyz2一致,shape为(B,N,2),undefined支持ND
- gradXyz2(aclTensor*, 计算输出):正向输出dist2的反向梯度,也是反向算子的初始梯度,Device侧的aclTensor,数据类型支持FLOAT、FLOAT16,且数据类型与xyz1、xyz2、grad_dist1、grad_dist2、grad_xyz1一致,shape为(B,N,2),undefined支持ND
- workspaceSize(uint64_t*, 出参):返回需要在Device侧申请的workspace大小。
- executor(aclOpExecutor**, 出参):返回op执行器,包含了算子计算流程。
返回值:
aclnnStatus:返回状态码,具体参见undefined。
[object Object]
aclnnChamferDistanceBackward
参数说明:
- workspace(void*, 入参):在Device侧申请的workspace内存地址。
- workspaceSize(uint64_t, 入参):在Device侧申请的workspace大小,由第一段接口aclnnChamferDistanceBackwardGetWorkspaceSize获取。
- executor(aclOpExecutor*, 入参):op执行器,包含了算子计算流程。
- stream(aclrtStream, 入参):指定执行任务的AscendCL Stream流。
返回值:
aclnnStatus:返回状态码,具体参见undefined。
约束与限制
无
调用示例
示例代码如下,仅供参考,具体编译和执行过程请参考undefined。