昇腾社区首页
中文
注册

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(倒角距离)正向算子计算公式为:

      dist1i=Min((x1ix2)2+(y1iy2)2)x2,y2xyz2dist1_i=Min((x_{1_i}−x_2)^2+(y_{1_i}−y_2)^2),x_2, y_2∈xyz2 dist2i=Min((x2ix1)2+(y2iy1)2)x1,y1xyz1dist2_i=Min((x_{2_i}-x_1)^2+(y_{2_i}-y_1)^2),x_1,y_1∈xyz1

    • 反向算子即为对该公式求导,计算公式为:

      • dist1ix1idist1_i 对x_{1_i}的导数=2grad_dist1(x1ix2)=2*grad\_dist1*(x_{1_i}-x_2)

        其中:x1ixyz1x_{1_i}∈xyz1x2x_2是根据正向输出的id1的索引值从xyz2中取出距离最小的点的横坐标,单点求导公式如上,因为单点梯度更新的位置是连续的,所以考虑多点并行计算。

      • dist1iy1idist1_i 对y_{1_i}的导数=2grad_dist1(y1iy2)=2*grad\_dist1*(y_{1_i}-y_2)

        其中y1ixyz1y_{1_i}∈xyz1y2y_2是根据正向输出的id1的索引值从xyz2中取出距离最小的点的纵坐标,单点求导公式如上,因为单点梯度更新的位置是连续的,所以也可以考虑多点并行计算。

      • dist1ix2dist1_i 对x_2的导数=2grad_dist1(x1ix2)=-2*grad\_dist1*(x_{1_i}-x_2)

        其中x1ixyz1x2x_{1_i}∈xyz1,x_2是根据正向输出的id1的索引值从xyz2中取出距离最小的点的横坐标,单点求导公式如上,因为单点梯度需要根据最小距离值对应的索引值去更新,所以这块无法并行只能单点计算。

      • dist1iy2dist1_i 对y_2的导数=2grad_dist1(y1iy2)=-2*grad\_dist1*(y_{1_i}-y_2)

        其中y1ixyz1y2y_{1_i}∈xyz1,y_2是根据正向输出的id1的索引值从xyz2中取出距离最小的点的纵坐标,单点求导公式如上,因为单点梯度需要根据最小值对应的索引值去更新,所以这块也无法并行只能单点计算。

    对应dist2idist2_ix2ix1y2iy1x_{2_i} 、x_1、y_{2_i} 、y_1的导数和上述过程类似,这边不再赘述。

    最终计算公式如下,i∈[0,n):

    gradxyz1[2i]=2grad_dist1(x1ix2)2grad_dist1(x1ix2)grad_xyz1[2*i] = 2*grad\_dist_1*(x_{1_i}-x_2) - 2*grad\_dist_1*(x_{1_i}-x_2)

    gradxyz1[2i+1]=2grad_dist1(y1iy2)2grad_dist1(y1iy2)grad_xyz1[2*i+1] = 2*grad\_dist1*(y_{1_i}-y_2) - 2*grad\_dist1*(y_{1_i}-y_2)

    gradxyz2[2i]=2grad_dist2(x1ix2)2grad_dist2(x1ix2)grad_xyz2[2*i] = 2*grad\_dist2*(x_{1_i}-x_2) - 2*grad\_dist2*(x_{1_i}-x_2)

    gradxyz2[2i+1]=2grad_dist2(y1iy2)2grad_dist2(y1iy2)grad_xyz2[2*i+1] = 2*grad\_dist2*(y_{1_i}-y_2) - 2*grad\_dist2*(y_{1_i}-y_2)

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

[object Object]