# Addgrad — MindSpore Signal+ 使用手册 alpha 文档

# Addgrad

逐元素计算加法梯度

\[\begin{split}dx1 = \frac{\partial L}{\partial X1} = \frac{\partial L}{\partial Y} * 1 = \frac{\partial L}{\partial Y}\\ dx2 = \frac{\partial L}{\partial X2} = \frac{\partial L}{\partial Y} * 1 = \frac{\partial L}{\partial Y}\end{split}\]

输入：

  - dy - dy数据地址。

  - dx1_dim - x1的维度信息。

  - dx2_dim - x2的维度信息。

  - dy_dims - dy的维度信息。

  - num_dims - 维度数

  - core_mask - 核掩码。

输出：

  - dx1 - dx1的数据地址。

  - dx2 - dx2的数据地址。

支持平台：

  `FT78NE` `MT7004`

备注

- FT78NE 支持fp32

- MT7004 支持fp16, fp32

共享存储版本:

void fp_addgrad_s(float *dy, int *x1_dims, int *x2_dims, int *dy_dims, int num_dims, float *dx1, float *dx2, int core_mask)

void hp_addgrad_s(half *dy, int *x1_dims, int *x2_dims, int *dy_dims, int num_dims, half *dx1, half *dx2, int core_mask)

C调用示例：

     1//FT78NE示例
     2#include <stdio.h>
     3#include <addgrad.h>
     4
     5int main(int argc, char* argv[]) {
     6    float *dy = (float *)0xA0000000;   //input在DDR空间
     7    float *dx1 = (float *)0xB0000000;   //dx1
     8    float *dx2 = (float *)0xC0000000;   //dxx
     9    int dx1_dims[] = {13, 183, 47};  // 2x2
    10    int dx2_dims[] = {1, 183, 47};  // 2x2
    11    int dy_dims[] = {13, 183, 47};  // 2x2
    12    int num_dims = 3;
    13    int core_mask = 0xff;
    14    fp_addgrad_s(dy, dx1_dims, dx2_dims, dy_dims, num_dims, dx1, dx2, core_mask);
    15    return 0;
    16}

私有存储版本:

void fp_addgrad_p(float *dy, int *x1_dims, int *x2_dims, int *dy_dims, int num_dims, float *dx1, float *dx2)

void hp_addgrad_p(half *dy, int *x1_dims, int *x2_dims, int *dy_dims, int num_dims, half *dx1, half *dx2)

C调用示例：

     1//FT78NE示例
     2#include <stdio.h>
     3#include <addgrad.h>
     4
     5int main(int argc, char* argv[]) {
     6    float *dy = (float *)0x10000000;   //input在L2空间
     7    float *dx1 = (float *)0x10001000;   //dx1
     8    float *dx2 = (float *)0x10002000;   //dxx
     9    int dx1_dims[] = {13, 183, 47};  // 2x2
    10    int dx2_dims[] = {1, 183, 47};  // 2x2
    11    int dy_dims[] = {13, 183, 47};  // 2x2
    12    int num_dims = 3;
    13    fp_addgrad_p(dy, dx1_dims, dx2_dims, dy_dims, num_dims, dx1, dx2);
    14    return 0;
    15}