From 216a725919925cf1d1fdfdc0c46a7903043e32a7 Mon Sep 17 00:00:00 2001
From: ourkevindebruyne <651592287@qq.com>
Date: Thu, 14 Aug 2025 23:09:17 +0800
Subject: [PATCH 1/7] =?UTF-8?q?issue/12:=20=E6=B7=BB=E5=8A=A0ReduceMax?=
=?UTF-8?q?=E7=AE=97=E5=AD=90=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
infiniop/ops/README.md | 1 +
infiniop/ops/reduce_max/README.md | 123 ++++++++++++++++++++++++++++++
2 files changed, 124 insertions(+)
create mode 100644 infiniop/ops/reduce_max/README.md
diff --git a/infiniop/ops/README.md b/infiniop/ops/README.md
index 0633ec6..25a274e 100644
--- a/infiniop/ops/README.md
+++ b/infiniop/ops/README.md
@@ -12,3 +12,4 @@
- [`Softmax`](/infiniop/ops/softmax/README.md)
- [`Sub`](/infiniop/ops/sub/README.md)
- [`SwiGLU`](/infiniop/ops/swiglu/README.md)
+- [`ReduceMax`](/infiniop/ops/reduce_max/README.md)
diff --git a/infiniop/ops/reduce_max/README.md b/infiniop/ops/reduce_max/README.md
new file mode 100644
index 0000000..bca7f58
--- /dev/null
+++ b/infiniop/ops/reduce_max/README.md
@@ -0,0 +1,123 @@
+
+# `Reduce Max`
+
+`Reduce Max`, 计算输入张量指定维度中所有元素的最大值。
+
+## 接口
+
+### 计算
+
+```c
+infiniStatus_t infiniopReduceMax(
+ infiniopReduceMaxDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void * output,
+ const void * input,
+ void *stream
+);
+```
+
参数:
+
+- `desc`:
+ 已使用 `infiniopCreateReduceMaxDescriptor()` 初始化的算子描述符。
+- `workspace`:
+ 指向算子计算所需的额外工作空间;
+- `workspace_size`:
+ `workspace` 的大小,单位:字节;
+- `output`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `input`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。
+ - `stream`: 计算流/队列。
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`],[`INFINI_STATUS_BAD_TENSOR_DTYPE`].
+
+---
+
+### 创建算子描述
+
+```c
+infiniStatus_t infiniopCreateReduceMaxDescriptor(
+ infiniopHandle_t handle,
+ infiniopReduceMaxDescriptor_t *desc_ptr,
+ infiniopTensorDescriptor_t output_desc,
+ infiniopTensorDescriptor_t input_desc,
+ size_t dim
+);
+```
+ 参数:
+
+- `handle`:
+ `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
+- `desc_ptr`:
+ `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址;
+- `output_desc` - { dT | (d1,...,1,...,dn) | ($...$) }:
+ 算子计算参数 `output` 的张量描述。
+- `input_desc` - { dT | (d1,...,dn) | ($...$) }:
+ 算子计算参数 `input` 的张量描述。
+- `dim` - int: 计算最大值的维度,0 $\leq$ dim $\lt$ n。
+
+参数限制:
+
+- **`dT`**: (`Float16`, `Float32`, `Bfloat16`) 之一
+- 在`dim`维度上,`output`长度为1,其余维度`output`与`input`长度一致。
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+---
+
+### 计算额外工作空间
+
+```c
+infiniStatus_t infiniopGetReduceMaxWorkspaceSize(
+ infiniopReduceMaxDescriptor_t desc,
+ size_t *size
+);
+```
+ 参数:
+
+- `desc`: 使用 `infiniopCreateReduceMaxDescriptor()` 初始化的算子描述符。
+- `size`:
+ 额外空间大小的计算结果的写入地址;
+
+ 返回值:
+
+ - [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+---
+
+### 销毁算子描述符
+
+```c
+infiniopStatus_t infiniopDestroyReduceMaxDescriptor(
+ infiniopReduceMaxDescriptor_t desc
+);
+```
+
+ 参数:
+
+- `desc`:
+ 输入。 待销毁的算子描述符;
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+## 已知问题
+
+无
+
+
+[`InfiniopHandle_t`]: /infiniop/handle/README.md
+
+[`INFINI_STATUS_SUCCESS`]: /common/status/README.md#INFINI_STATUS_SUCCESS
+[`INFINI_STATUS_BAD_PARAM`]: /common/status/README.md#INFINI_STATUS_BAD_PARAM
+[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]: /common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE
+[`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED
+[`INFINI_STATUS_INTERNAL_ERROR`]: /common/status/README.md#INFINI_STATUS_INTERNAL_ERROR
+[`INFINI_STATUS_NULL_POINTER`]: /common/status/README.md#INFINI_STATUS_NULL_POINTER
+[`INFINI_STATUS_BAD_TENSOR_SHAPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_SHAPE
+[`INFINI_STATUS_BAD_TENSOR_DTYPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_DTYPE
+[`INFINI_STATUS_BAD_TENSOR_STRIDES`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_STRIDES
From 7da357fb5d21174fd30a7d8e4b7ff31cdf1c92d5 Mon Sep 17 00:00:00 2001
From: ourkevindebruyne <651592287@qq.com>
Date: Thu, 14 Aug 2025 23:10:34 +0800
Subject: [PATCH 2/7] =?UTF-8?q?issue/13:=20=E6=B7=BB=E5=8A=A0ReduceMean?=
=?UTF-8?q?=E7=AE=97=E5=AD=90=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
infiniop/ops/README.md | 1 +
infiniop/ops/reduce_mean/README.md | 123 +++++++++++++++++++++++++++++
2 files changed, 124 insertions(+)
create mode 100644 infiniop/ops/reduce_mean/README.md
diff --git a/infiniop/ops/README.md b/infiniop/ops/README.md
index 25a274e..540b018 100644
--- a/infiniop/ops/README.md
+++ b/infiniop/ops/README.md
@@ -13,3 +13,4 @@
- [`Sub`](/infiniop/ops/sub/README.md)
- [`SwiGLU`](/infiniop/ops/swiglu/README.md)
- [`ReduceMax`](/infiniop/ops/reduce_max/README.md)
+- [`ReduceMean`](/infiniop/ops/reduce_mean/README.md)
diff --git a/infiniop/ops/reduce_mean/README.md b/infiniop/ops/reduce_mean/README.md
new file mode 100644
index 0000000..c03ba00
--- /dev/null
+++ b/infiniop/ops/reduce_mean/README.md
@@ -0,0 +1,123 @@
+
+# `Reduce Mean`
+
+`Reduce Mean`, 计算输入张量指定维度中所有元素的平均值
+
+## 接口
+
+### 计算
+
+```c
+infiniStatus_t infiniopReduceMean(
+ infiniopReduceMeanDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void * output,
+ const void * input,
+ void *stream
+);
+```
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateReduceMeanDescriptor()` 初始化的算子描述符。
+- `workspace`:
+ 指向算子计算所需的额外工作空间;
+- `workspace_size`:
+ `workspace` 的大小,单位:字节;
+- `output`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `input`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。
+ - `stream`: 计算流/队列。
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`],[`INFINI_STATUS_BAD_TENSOR_DTYPE`].
+
+---
+
+### 创建算子描述
+
+```c
+infiniStatus_t infiniopCreateReduceMeanDescriptor(
+ infiniopHandle_t handle,
+ infiniopReduceMeanDescriptor_t *desc_ptr,
+ infiniopTensorDescriptor_t output_desc,
+ infiniopTensorDescriptor_t input_desc,
+ size_t dim
+);
+```
+ 参数:
+
+- `handle`:
+ `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
+- `desc_ptr`:
+ `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址;
+- `output_desc` - { dT | (d1,...,1,...,dn) | ($...$) }:
+ 算子计算参数 `output` 的张量描述。
+- `input_desc` - { dT | (d1,...,dn) | ($...$) }:
+ 算子计算参数 `input` 的张量描述。
+- `dim` - int: 计算平均值的维度,0 $\leq$ dim $\lt$ n。
+
+参数限制:
+
+- **`dT`**: (`Float16`, `Float32`, `Bfloat16`) 之一
+- 在`dim`维度上,`output`长度为1,其余维度`output`与`input`长度一致。
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+---
+
+### 计算额外工作空间
+
+```c
+infiniStatus_t infiniopGetReduceMeanWorkspaceSize(
+ infiniopReduceMeanDescriptor_t desc,
+ size_t *size
+);
+```
+ 参数:
+
+- `desc`: 使用 `infiniopCreateReduceMeanDescriptor()` 初始化的算子描述符。
+- `size`:
+ 额外空间大小的计算结果的写入地址;
+
+ 返回值:
+
+ - [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+---
+
+### 销毁算子描述符
+
+```c
+infiniopStatus_t infiniopDestroyReduceMeanDescriptor(
+ infiniopReduceMeanDescriptor_t desc
+);
+```
+
+ 参数:
+
+- `desc`:
+ 输入。 待销毁的算子描述符;
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+## 已知问题
+
+无
+
+
+[`InfiniopHandle_t`]: /infiniop/handle/README.md
+
+[`INFINI_STATUS_SUCCESS`]: /common/status/README.md#INFINI_STATUS_SUCCESS
+[`INFINI_STATUS_BAD_PARAM`]: /common/status/README.md#INFINI_STATUS_BAD_PARAM
+[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]: /common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE
+[`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED
+[`INFINI_STATUS_INTERNAL_ERROR`]: /common/status/README.md#INFINI_STATUS_INTERNAL_ERROR
+[`INFINI_STATUS_NULL_POINTER`]: /common/status/README.md#INFINI_STATUS_NULL_POINTER
+[`INFINI_STATUS_BAD_TENSOR_SHAPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_SHAPE
+[`INFINI_STATUS_BAD_TENSOR_DTYPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_DTYPE
+[`INFINI_STATUS_BAD_TENSOR_STRIDES`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_STRIDES
From 683e1dd08fc2ed9f62dcff1ea0a23c60f1304f37 Mon Sep 17 00:00:00 2001
From: ourkevindebruyne <651592287@qq.com>
Date: Thu, 14 Aug 2025 23:11:34 +0800
Subject: [PATCH 3/7] =?UTF-8?q?issue/14:=20=E6=B7=BB=E5=8A=A0BatchNorm?=
=?UTF-8?q?=E7=AE=97=E5=AD=90=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
infiniop/ops/README.md | 1 +
infiniop/ops/batch_norm/README.md | 161 ++++++++++++++++++++++++++++++
2 files changed, 162 insertions(+)
create mode 100644 infiniop/ops/batch_norm/README.md
diff --git a/infiniop/ops/README.md b/infiniop/ops/README.md
index 540b018..7f49d7f 100644
--- a/infiniop/ops/README.md
+++ b/infiniop/ops/README.md
@@ -14,3 +14,4 @@
- [`SwiGLU`](/infiniop/ops/swiglu/README.md)
- [`ReduceMax`](/infiniop/ops/reduce_max/README.md)
- [`ReduceMean`](/infiniop/ops/reduce_mean/README.md)
+- [`BatchNorm`](/infiniop/ops/batch_norm/README.md)
diff --git a/infiniop/ops/batch_norm/README.md b/infiniop/ops/batch_norm/README.md
new file mode 100644
index 0000000..3425feb
--- /dev/null
+++ b/infiniop/ops/batch_norm/README.md
@@ -0,0 +1,161 @@
+
+# `Batch Norm`
+
+`Batch Norm`, 对3D输入张量在中间维度进行归一化和移动放缩。其公式如下:
+
+$$
+ y=\frac{x-{\rm{E}}\left[x\right]}{\sqrt{{\rm{Var}}\left[x\right]+\epsilon}}\cdot\gamma+\beta
+$$
+
+其中`x`为输入元素,$\epsilon$ 是一个小的常数,用于避免除以零。$\gamma$ 和 $\beta$ 为权重张量和平移张量。
+
+`E[x]`和`Var[x]`为针对第一、第三维度的均值和方差,其更新根据规则如下:
+$$
+ {\rm{E}}\left[x\right]_{\rm{new}} = (1 - {\rm{momentum}})\cdot{\rm{E}}\left[x\right]_{\rm{old}} + {\rm{momentum}} \cdot{\rm{E}}\left[x\right]
+$$
+$$
+ {\rm{Var}}\left[x\right]_{\rm{new}} = (1 - {\rm{momentum}})\cdot{\rm{Var}}\left[x\right]_{\rm{old}} + {\rm{momentum}} \cdot{\rm{Var}}\left[x\right]
+$$
+
+其中`momentum`为设定动量参数。
+
+## 接口
+
+### 计算
+
+```c
+infiniStatus_t infiniopBatchNorm(
+ infiniopBatchNormDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void * output,
+ void * running_mean,
+ void * running_var,
+ const void * input,
+ const void * weight,
+ const void * bias,
+ void *stream
+);
+```
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateBatchNormDescriptor()` 初始化的算子描述符。
+- `workspace`:
+ 指向算子计算所需的额外工作空间;
+- `workspace_size`:
+ `workspace` 的大小,单位:字节;
+- `output`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `running_mean`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `running_var`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `input`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `weight`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `bias`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。
+ - `stream`: 计算流/队列。
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`],[`INFINI_STATUS_BAD_TENSOR_DTYPE`].
+
+---
+
+### 创建算子描述
+
+```c
+infiniStatus_t infiniopCreateBatchNormDescriptor(
+ infiniopHandle_t handle,
+ infiniopBatchNormDescriptor_t *desc_ptr,
+ infiniopTensorDescriptor_t output_desc,
+ infiniopTensorDescriptor_t running_mean_desc,
+ infiniopTensorDescriptor_t running_var_desc,
+ infiniopTensorDescriptor_t input_desc,
+ infiniopTensorDescriptor_t weight_desc,
+ infiniopTensorDescriptor_t bias_desc,
+ float momentum,
+ float eps
+);
+```
+ 参数:
+
+- `handle`:
+ `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
+- `desc_ptr`:
+ `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址;
+- `output_desc` - { dT | (N, C, L) | (C $\cdot$ L, L, 1) }:
+ 算子计算参数 `output` 的张量描述, N是批次大小, C是特征或通道数, L是序列长度。
+- `running_mean_desc` - { dT | (C) | (...) }:
+ 算子计算参数 `running_mean` 的张量描述,对应公式中的 ${\rm{E}}\left[x\right]$。
+- `running_var_desc` - { dT | (C) | (...) }:
+ 算子计算参数 `running_var` 的张量描述,对应公式中的 ${\rm{Var}}\left[x\right]$。
+- `input_desc` - { dT | (N, C, L) | (C $\cdot$ L, L, 1) }:
+ 算子计算参数 `input` 的张量描述。
+- `weight_desc` - { dT | (C) | (...) }:
+ 算子计算参数 `weight` 的张量描述,对应公式中的 $\gamma$。
+- `bias_desc` - { dT | (C) | (...) }:
+ 算子计算参数 `bias` 的张量描述,对应公式中的 $\beta$。
+- `momentum` - float: 即公式中的 `momentum`。
+- `eps` - float: 即公式中的 $\epsilon$。
+
+参数限制:
+
+- **`dT`**: (`Float16`, `Float32`, `Bfloat16`) 之一
+- `output`与`input`均为全连续张量。
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+---
+
+### 计算额外工作空间
+
+```c
+infiniStatus_t infiniopGetBatchNormWorkspaceSize(
+ infiniopBatchNormDescriptor_t desc,
+ size_t *size
+);
+```
+ 参数:
+
+- `desc`: 使用 `infiniopCreateBatchNormDescriptor()` 初始化的算子描述符。
+- `size`:
+ 额外空间大小的计算结果的写入地址;
+
+ 返回值:
+
+ - [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+---
+
+### 销毁算子描述符
+
+```c
+infiniopStatus_t infiniopDestroyBatchNormDescriptor(
+ infiniopBatchNormDescriptor_t desc
+);
+```
+
+ 参数:
+
+- `desc`:
+ 输入。 待销毁的算子描述符;
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+## 已知问题
+
+无
+
+
+[`InfiniopHandle_t`]: /infiniop/handle/README.md
+
+[`INFINI_STATUS_SUCCESS`]: /common/status/README.md#INFINI_STATUS_SUCCESS
+[`INFINI_STATUS_BAD_PARAM`]: /common/status/README.md#INFINI_STATUS_BAD_PARAM
+[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]: /common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE
+[`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED
+[`INFINI_STATUS_INTERNAL_ERROR`]: /common/status/README.md#INFINI_STATUS_INTERNAL_ERROR
+[`INFINI_STATUS_NULL_POINTER`]: /common/status/README.md#INFINI_STATUS_NULL_POINTER
+[`INFINI_STATUS_BAD_TENSOR_SHAPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_SHAPE
+[`INFINI_STATUS_BAD_TENSOR_DTYPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_DTYPE
+[`INFINI_STATUS_BAD_TENSOR_STRIDES`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_STRIDES
From 45b2136bf38ff8d24360f17bdedcdb915c219cbf Mon Sep 17 00:00:00 2001
From: ourkevindebruyne <651592287@qq.com>
Date: Thu, 14 Aug 2025 23:12:35 +0800
Subject: [PATCH 4/7] =?UTF-8?q?issue/15:=20=E6=B7=BB=E5=8A=A0BatchNorm=20B?=
=?UTF-8?q?ackward=E7=AE=97=E5=AD=90=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
infiniop/ops/README.md | 1 +
infiniop/ops/batch_norm_backward/README.md | 158 +++++++++++++++++++++
2 files changed, 159 insertions(+)
create mode 100644 infiniop/ops/batch_norm_backward/README.md
diff --git a/infiniop/ops/README.md b/infiniop/ops/README.md
index 7f49d7f..f306dd4 100644
--- a/infiniop/ops/README.md
+++ b/infiniop/ops/README.md
@@ -15,3 +15,4 @@
- [`ReduceMax`](/infiniop/ops/reduce_max/README.md)
- [`ReduceMean`](/infiniop/ops/reduce_mean/README.md)
- [`BatchNorm`](/infiniop/ops/batch_norm/README.md)
+- [`BatchNormBackward`](/infiniop/ops/batch_norm_backward/README.md)
diff --git a/infiniop/ops/batch_norm_backward/README.md b/infiniop/ops/batch_norm_backward/README.md
new file mode 100644
index 0000000..2d50dd6
--- /dev/null
+++ b/infiniop/ops/batch_norm_backward/README.md
@@ -0,0 +1,158 @@
+
+# `Batch Norm Backward`
+
+`Batch Norm Backward`, 即`Batch Norm`算子所对应的反向传播算子。其正向公式如下:
+$$
+ y=\frac{x-{\rm{E}}\left[x\right]}{\sqrt{{\rm{Var}}\left[x\right]}}\cdot\gamma+\beta
+$$
+
+其中`x`为输入元素。$\gamma$ 和 $\beta$ 为权重张量和平移张量。
+
+`E[x]`和`Var[x]`为同时针对第一、第三维度的均值和方差。
+
+## 接口
+
+### 计算
+
+```c
+infiniStatus_t infiniopBatchNormBackward(
+ infiniopBatchNormBackwardDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void * grad_input,
+ void * grad_weight,
+ void * grad_bias,
+ const void * input,
+ const void * grad_output,
+ const void * weight,
+ const void * running_mean,
+ const void * running_var,
+ void *stream
+);
+```
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateBatchNormBackwardDescriptor()` 初始化的算子描述符。
+- `workspace`:
+ 指向算子计算所需的额外工作空间;
+- `workspace_size`:
+ `workspace` 的大小,单位:字节;
+- `grad_input`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `grad_weight`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `grad_bias`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `input`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `grad_output`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `weight`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `running_mean`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `running_var`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。
+ - `stream`: 计算流/队列。
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`],[`INFINI_STATUS_BAD_TENSOR_DTYPE`].
+
+---
+
+### 创建算子描述
+
+```c
+infiniStatus_t infiniopCreateBatchNormBackwardDescriptor(
+ infiniopHandle_t handle,
+ infiniopBatchNormBackwardDescriptor_t *desc_ptr,
+ infiniopTensorDescriptor_t grad_input_desc,
+ infiniopTensorDescriptor_t grad_weight_desc,
+ infiniopTensorDescriptor_t grad_bias_desc,
+ infiniopTensorDescriptor_t input_desc,
+ infiniopTensorDescriptor_t grad_output_desc,
+ infiniopTensorDescriptor_t weight_desc,
+ infiniopTensorDescriptor_t running_mean_desc,
+ infiniopTensorDescriptor_t running_var_desc
+);
+```
+ 参数:
+
+- `handle`:
+ `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
+- `desc_ptr`:
+ `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址;
+- `grad_input_desc` - { dT | (N, C, L) | (C $\cdot$ L, L, 1) }:
+ 算子计算参数 `output` 的张量描述,对应输入张量`input`的梯度,N是批次大小, C是特征或通道数, L是序列长度。
+- `grad_weight_desc` - { dT | (C) | (...) }:
+ 算子计算参数 `grad_weight` 的张量描述, 对应公式中权重向量 $\gamma$ 的梯度。
+- `grad_bias_desc` - { dT | (C) | (...) }:
+ 算子计算参数 `grad_bias` 的张量描述, 对应公式中向量 $\beta$ 的梯度。
+- `input_desc` - { dT | (N, C, L) | (C $\cdot$ L, L, 1) }:
+ 算子计算参数 `input` 的张量描述。
+- `grad_output_desc` - { dT | (N, C, L) | (C $\cdot$ L, L, 1) }:
+ 算子计算参数 `grad_output` 的张量描述, 对应`output`的梯度。
+- `weight_desc` - { dT | (C) | (...) }:
+ 算子计算参数 `weight` 的张量描述,对应公式中权重向量 $\gamma$ 。
+- `running_mean_desc` - { dT | (C) | (...) }:
+ 算子计算参数 `running_mean` 的张量描述, 对应于${\rm{E}}[x]$,即`input`针对中间维度的均值。
+- `running_var_desc` - { dT | (C) | (...) }:
+ 算子计算参数 `running_var` 的张量描述, 对应于${\rm{Var}}[x]$,即`input`针对中间维度的方差。
+
+参数限制:
+
+- **`dT`**: (`Float16`, `Float32`, `Bfloat16`) 之一
+- `grad_input`、`grad_output`、`input`均为全连续张量。
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+---
+
+### 计算额外工作空间
+
+```c
+infiniStatus_t infiniopGetBatchNormBackwardWorkspaceSize(
+ infiniopBatchNormBackwardDescriptor_t desc,
+ size_t *size
+);
+```
+ 参数:
+
+- `desc`: 使用 `infiniopCreateBatchNormBackwardDescriptor()` 初始化的算子描述符。
+- `size`:
+ 额外空间大小的计算结果的写入地址;
+
+ 返回值:
+
+ - [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+---
+
+### 销毁算子描述符
+
+```c
+infiniopStatus_t infiniopDestroyBatchNormBackwardDescriptor(
+ infiniopBatchNormBackwardDescriptor_t desc
+);
+```
+
+ 参数:
+
+- `desc`:
+ 输入。 待销毁的算子描述符;
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+## 已知问题
+
+无
+
+
+[`InfiniopHandle_t`]: /infiniop/handle/README.md
+
+[`INFINI_STATUS_SUCCESS`]: /common/status/README.md#INFINI_STATUS_SUCCESS
+[`INFINI_STATUS_BAD_PARAM`]: /common/status/README.md#INFINI_STATUS_BAD_PARAM
+[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]: /common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE
+[`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED
+[`INFINI_STATUS_INTERNAL_ERROR`]: /common/status/README.md#INFINI_STATUS_INTERNAL_ERROR
+[`INFINI_STATUS_NULL_POINTER`]: /common/status/README.md#INFINI_STATUS_NULL_POINTER
+[`INFINI_STATUS_BAD_TENSOR_SHAPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_SHAPE
+[`INFINI_STATUS_BAD_TENSOR_DTYPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_DTYPE
+[`INFINI_STATUS_BAD_TENSOR_STRIDES`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_STRIDES
From 17b3d501efbf94dff6acc76ef9a54176105dcded Mon Sep 17 00:00:00 2001
From: ourkevindebruyne <651592287@qq.com>
Date: Thu, 14 Aug 2025 23:13:31 +0800
Subject: [PATCH 5/7] =?UTF-8?q?issue/16:=20=E6=B7=BB=E5=8A=A0LayerNorm?=
=?UTF-8?q?=E7=AE=97=E5=AD=90=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
infiniop/ops/README.md | 1 +
infiniop/ops/layer_norm/README.md | 152 ++++++++++++++++++++++++++++++
2 files changed, 153 insertions(+)
create mode 100644 infiniop/ops/layer_norm/README.md
diff --git a/infiniop/ops/README.md b/infiniop/ops/README.md
index f306dd4..8fc3122 100644
--- a/infiniop/ops/README.md
+++ b/infiniop/ops/README.md
@@ -16,3 +16,4 @@
- [`ReduceMean`](/infiniop/ops/reduce_mean/README.md)
- [`BatchNorm`](/infiniop/ops/batch_norm/README.md)
- [`BatchNormBackward`](/infiniop/ops/batch_norm_backward/README.md)
+- [`LayerNorm`](/infiniop/ops/layer_norm/README.md)
diff --git a/infiniop/ops/layer_norm/README.md b/infiniop/ops/layer_norm/README.md
new file mode 100644
index 0000000..9827178
--- /dev/null
+++ b/infiniop/ops/layer_norm/README.md
@@ -0,0 +1,152 @@
+
+# `Layer Norm`
+
+`Layer Norm`, 对3D输入张量在最后一维进行归一化和移动放缩。其公式如下:
+
+$$
+ y=\frac{x-{\rm{E}}\left[x\right]}{\sqrt{{\rm{Var}}\left[x\right]+\epsilon}}\cdot\gamma+\beta
+$$
+
+其中`x`为输入元素,$\epsilon$ 是一个小的常数,用于避免除以零。$\gamma$ 和 $\beta$ 为权重张量和平移张量。
+`E[x]`和`Var[x]`为针对最后一维的均值和方差。
+
+## 接口
+
+### 计算
+
+```c
+infiniStatus_t infiniopLayerNorm(
+ infiniopLayerNormDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void * output,
+ void * input_standardization,
+ void * input_std_deviation,
+ const void * input,
+ const void * weight,
+ const void * bias,
+ void *stream
+);
+```
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateLayerNormDescriptor()` 初始化的算子描述符。
+- `workspace`:
+ 指向算子计算所需的额外工作空间;
+- `workspace_size`:
+ `workspace` 的大小,单位:字节;
+- `output`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `input_standardization`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `input_std_deviation`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `input`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `weight`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `bias`:输入张量(可选)。张量限制见[创建算子描述](#创建算子描述)部分。
+ - `stream`: 计算流/队列。
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`],[`INFINI_STATUS_BAD_TENSOR_DTYPE`].
+
+---
+
+### 创建算子描述
+
+```c
+infiniStatus_t infiniopCreateLayerNormDescriptor(
+ infiniopHandle_t handle,
+ infiniopLayerNormDescriptor_t *desc_ptr,
+ infiniopTensorDescriptor_t output_desc,
+ infiniopTensorDescriptor_t input_standardization_desc,
+ infiniopTensorDescriptor_t input_std_deviation_desc,
+ infiniopTensorDescriptor_t input_desc,
+ infiniopTensorDescriptor_t weight_desc,
+ infiniopTensorDescriptor_t bias_desc,
+ float eps
+);
+```
+ 参数:
+
+- `handle`:
+ `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
+- `desc_ptr`:
+ `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址;
+- `output_desc` - { dT | (N1, N2, L) | (..., 1) }:
+ 算子计算参数 `output` 的张量描述, 。
+- `input_standardization_desc` - { dT | (N1, N2, L) | (...) }:
+ 算子计算参数 `input_standardization` 的张量描述,,对应公式中的`input`归一化的结果: $\left({x-{\rm{E}}\left[x\right]}\right)/{\sqrt{{\rm{Var}}\left[x\right]+\epsilon}}$。
+- `input_std_deviation_desc` - { dT | (N1, N2) | (...) }:
+ 算子计算参数 `input_std_deviation` 的张量描述,对应公式中的标准差: $\sqrt{{\rm{Var}}\left[x\right]+\epsilon}$。
+- `input_desc` - { dT | (N1, N2, L) | (..., 1) }:
+ 算子计算参数 `input` 的张量描述。
+- `weight_desc` - { dT | (L) | (...) }:
+ 算子计算参数 `weight` 的张量描述,对应公式中的 $\gamma$。
+- `bias_desc` - { dT | (L) | (...) }:
+ 算子计算参数 `bias` 的张量描述(可选),对应公式中的 $\beta$ 。
+- `eps` - float:
+ 对应公式中的 $\epsilon$。
+
+参数限制:
+
+- **`dT`**: (`Float16`, `Float32`, `Bfloat16`) 之一
+- `output`与`input`最后一维连续。
+- 对于没有`bias`的情况,`bias_desc`应传入nullptr。
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+---
+
+### 计算额外工作空间
+
+```c
+infiniStatus_t infiniopGetLayerNormWorkspaceSize(
+ infiniopLayerNormDescriptor_t desc,
+ size_t *size
+);
+```
+ 参数:
+
+- `desc`: 使用 `infiniopCreateLayerNormDescriptor()` 初始化的算子描述符。
+- `size`:
+ 额外空间大小的计算结果的写入地址;
+
+ 返回值:
+
+ - [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+---
+
+### 销毁算子描述符
+
+```c
+infiniopStatus_t infiniopDestroyLayerNormDescriptor(
+ infiniopLayerNormDescriptor_t desc
+);
+```
+
+ 参数:
+
+- `desc`:
+ 输入。 待销毁的算子描述符;
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+## 已知问题
+
+无
+
+
+[`InfiniopHandle_t`]: /infiniop/handle/README.md
+
+[`INFINI_STATUS_SUCCESS`]: /common/status/README.md#INFINI_STATUS_SUCCESS
+[`INFINI_STATUS_BAD_PARAM`]: /common/status/README.md#INFINI_STATUS_BAD_PARAM
+[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]: /common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE
+[`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED
+[`INFINI_STATUS_INTERNAL_ERROR`]: /common/status/README.md#INFINI_STATUS_INTERNAL_ERROR
+[`INFINI_STATUS_NULL_POINTER`]: /common/status/README.md#INFINI_STATUS_NULL_POINTER
+[`INFINI_STATUS_BAD_TENSOR_SHAPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_SHAPE
+[`INFINI_STATUS_BAD_TENSOR_DTYPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_DTYPE
+[`INFINI_STATUS_BAD_TENSOR_STRIDES`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_STRIDES
From 36fa4807360417978c23dc8d115b834c667f6e34 Mon Sep 17 00:00:00 2001
From: ourkevindebruyne <651592287@qq.com>
Date: Thu, 14 Aug 2025 23:14:19 +0800
Subject: [PATCH 6/7] =?UTF-8?q?issue/17:=20=E6=B7=BB=E5=8A=A0LayerNorm=20B?=
=?UTF-8?q?ackward=E7=AE=97=E5=AD=90=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
infiniop/ops/README.md | 1 +
infiniop/ops/layer_norm_backward/README.md | 154 +++++++++++++++++++++
2 files changed, 155 insertions(+)
create mode 100644 infiniop/ops/layer_norm_backward/README.md
diff --git a/infiniop/ops/README.md b/infiniop/ops/README.md
index 8fc3122..171c98c 100644
--- a/infiniop/ops/README.md
+++ b/infiniop/ops/README.md
@@ -17,3 +17,4 @@
- [`BatchNorm`](/infiniop/ops/batch_norm/README.md)
- [`BatchNormBackward`](/infiniop/ops/batch_norm_backward/README.md)
- [`LayerNorm`](/infiniop/ops/layer_norm/README.md)
+- [`LayerNormBackward`](/infiniop/ops/layer_norm_backward/README.md)
diff --git a/infiniop/ops/layer_norm_backward/README.md b/infiniop/ops/layer_norm_backward/README.md
new file mode 100644
index 0000000..0bc1911
--- /dev/null
+++ b/infiniop/ops/layer_norm_backward/README.md
@@ -0,0 +1,154 @@
+
+# `Layer Norm Backward`
+
+`Layer Norm Backward`, 是`Layer Norm`算子对应的反向传播算子。其正向算子的计算公式如下:
+
+$$
+ y=\frac{x-{\rm{E}}\left[x\right]}{\sqrt{{\rm{Var}}\left[x\right]+\epsilon}}\cdot\gamma+\beta
+$$
+
+其中`x`为输入元素,$\epsilon$ 是一个小的常数,用于避免除以零。$\gamma$ 和 $\beta$ 为权重张量和平移张量。
+`E[x]`和`Var[x]`为针对最后一维的均值和方差。
+
+## 接口
+
+### 计算
+
+```c
+infiniStatus_t infiniopLayerNormBackward(
+ infiniopLayerNormBackwardDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void * grad_input,
+ void * grad_weight,
+ void * grad_bias,
+ const void * grad_output,
+ const void * weight,
+ const void * input_standardization,
+ const void * input_std_deviation,
+ void *stream
+);
+```
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateLayerNormBackwardDescriptor()` 初始化的算子描述符。
+- `workspace`:
+ 指向算子计算所需的额外工作空间;
+- `workspace_size`:
+ `workspace` 的大小,单位:字节;
+- `grad_input`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `grad_weight`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `grad_bias`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `grad_output`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `weight`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `input_standardization`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `input_std_deviation`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。
+ - `stream`: 计算流/队列。
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`],[`INFINI_STATUS_BAD_TENSOR_DTYPE`].
+
+---
+
+### 创建算子描述
+
+```c
+infiniStatus_t infiniopCreateLayerNormBackwardDescriptor(
+ infiniopHandle_t handle,
+ infiniopLayerNormBackwardDescriptor_t *desc_ptr,
+ infiniopTensorDescriptor_t grad_input_desc,
+ infiniopTensorDescriptor_t grad_weight_desc,
+ infiniopTensorDescriptor_t grad_bias_desc,
+ infiniopTensorDescriptor_t grad_output_desc,
+ infiniopTensorDescriptor_t weight_desc,
+ infiniopTensorDescriptor_t input_standardization_desc,
+ infiniopTensorDescriptor_t input_std_deviation_desc
+);
+```
+ 参数:
+
+- `handle`:
+ `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
+- `desc_ptr`:
+ `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址;
+- `grad_input_desc` - { dT | (N1, N2, L) | (...,1) }:
+ 算子计算参数 `grad_input` 的张量描述, 。
+- `grad_weight_desc` - { dT | (L) | (...) }:
+ 算子计算参数 `grad_weight` 的张量描述, 。
+- `grad_bias_desc` - { dT | (L) | (...) }:
+ 算子计算参数 `grad_bias` 的张量描述, 。
+- `grad_output_desc` - { dT | (N1, N2, L) | (...,1) }:
+ 算子计算参数 `grad_output` 的张量描述, 。
+- `weight_desc` - { dT | (L) | (...) }:
+ 算子计算参数 `weight` 的张量描述, 。
+- `input_standardization_desc` - { dT | (N1, N2, L) | (..., 1) }:
+ 算子计算参数 `input_standardization` 的张量描述,,对应公式中的`input`归一化的结果: $\left({x-{\rm{E}}\left[x\right]}\right)/{\sqrt{{\rm{Var}}\left[x\right]+\epsilon}}$。
+- `input_std_deviation_desc` - { dT | (N1, N2) | (...) }:
+ 算子计算参数 `input_std_deviation` 的张量描述,对应公式中的标准差: $\sqrt{{\rm{Var}}\left[x\right]+\epsilon}$。
+
+参数限制:
+
+- **`dT`**: (`Float16`, `Float32`, `Bfloat16`) 之一
+- `grad_input_desc`、`grad_output_desc`和 `input_standardization_desc`的最后一维要求连续。
+
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+---
+
+### 计算额外工作空间
+
+```c
+infiniStatus_t infiniopGetLayerNormBackwardWorkspaceSize(
+ infiniopLayerNormBackwardDescriptor_t desc,
+ size_t *size
+);
+```
+ 参数:
+
+- `desc`: 使用 `infiniopCreateLayerNormBackwardDescriptor()` 初始化的算子描述符。
+- `size`:
+ 额外空间大小的计算结果的写入地址;
+
+ 返回值:
+
+ - [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+---
+
+### 销毁算子描述符
+
+```c
+infiniopStatus_t infiniopDestroyLayerNormBackwardDescriptor(
+ infiniopLayerNormBackwardDescriptor_t desc
+);
+```
+
+ 参数:
+
+- `desc`:
+ 输入。 待销毁的算子描述符;
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+## 已知问题
+
+无
+
+
+[`InfiniopHandle_t`]: /infiniop/handle/README.md
+
+[`INFINI_STATUS_SUCCESS`]: /common/status/README.md#INFINI_STATUS_SUCCESS
+[`INFINI_STATUS_BAD_PARAM`]: /common/status/README.md#INFINI_STATUS_BAD_PARAM
+[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]: /common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE
+[`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED
+[`INFINI_STATUS_INTERNAL_ERROR`]: /common/status/README.md#INFINI_STATUS_INTERNAL_ERROR
+[`INFINI_STATUS_NULL_POINTER`]: /common/status/README.md#INFINI_STATUS_NULL_POINTER
+[`INFINI_STATUS_BAD_TENSOR_SHAPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_SHAPE
+[`INFINI_STATUS_BAD_TENSOR_DTYPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_DTYPE
+[`INFINI_STATUS_BAD_TENSOR_STRIDES`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_STRIDES
From d40148c9b049bb46f8a09d51c7675be382c296ce Mon Sep 17 00:00:00 2001
From: ourkevindebruyne <651592287@qq.com>
Date: Thu, 14 Aug 2025 23:15:02 +0800
Subject: [PATCH 7/7] =?UTF-8?q?issue/18:=20=E6=B7=BB=E5=8A=A0RMSNorm=20Bac?=
=?UTF-8?q?kward=E7=AE=97=E5=AD=90=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
infiniop/ops/README.md | 1 +
infiniop/ops/rms_norm_backward/README.md | 142 +++++++++++++++++++++++
2 files changed, 143 insertions(+)
create mode 100644 infiniop/ops/rms_norm_backward/README.md
diff --git a/infiniop/ops/README.md b/infiniop/ops/README.md
index 171c98c..7640f45 100644
--- a/infiniop/ops/README.md
+++ b/infiniop/ops/README.md
@@ -18,3 +18,4 @@
- [`BatchNormBackward`](/infiniop/ops/batch_norm_backward/README.md)
- [`LayerNorm`](/infiniop/ops/layer_norm/README.md)
- [`LayerNormBackward`](/infiniop/ops/layer_norm_backward/README.md)
+- [`RMSNormBackward`](/infiniop/ops/rms_norm_backward/README.md)
diff --git a/infiniop/ops/rms_norm_backward/README.md b/infiniop/ops/rms_norm_backward/README.md
new file mode 100644
index 0000000..c662e2e
--- /dev/null
+++ b/infiniop/ops/rms_norm_backward/README.md
@@ -0,0 +1,142 @@
+
+# `RMS Norm Backward`
+
+`RMS Norm Backward`, 是`RMS Norm`算子所对应的反向传播算子。其正向公式如下:
+
+$$
+ y_i=\frac{x_i}{\sqrt{\frac{1}{\rm{D}}\sum_{i=1}^{\rm{D}}x_i^2}}\cdot \gamma_i
+$$
+
+其中分母是针对3D输入张量的第三维向量的二范数,D为输入张量第三维的长度。
+
+## 接口
+
+### 计算
+
+```c
+infiniStatus_t infiniopRMSNormBackward(
+ infiniopRMSNormBackwardDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void * grad_x,
+ void * grad_w,
+ const void * grad_y,
+ const void * x,
+ const void * w,
+ void *stream
+);
+```
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateRMSNormBackwardDescriptor()` 初始化的算子描述符。
+- `workspace`:
+ 指向算子计算所需的额外工作空间;
+- `workspace_size`:
+ `workspace` 的大小,单位:字节;
+- `grad_x`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `grad_w`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `grad_y`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `x`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。
+- `w`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。
+ - `stream`: 计算流/队列。
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`],[`INFINI_STATUS_BAD_TENSOR_DTYPE`].
+
+---
+
+### 创建算子描述
+
+```c
+infiniStatus_t infiniopCreateRMSNormBackwardDescriptor(
+ infiniopHandle_t handle,
+ infiniopRMSNormBackwardDescriptor_t *desc_ptr,
+ infiniopTensorDescriptor_t grad_x_desc,
+ infiniopTensorDescriptor_t grad_w_desc,
+ infiniopTensorDescriptor_t grad_y_desc,
+ infiniopTensorDescriptor_t x_desc,
+ infiniopTensorDescriptor_t w_desc
+);
+```
+ 参数:
+
+- `handle`:
+ `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
+- `desc_ptr`:
+ `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址;
+- `grad_x_desc` - { dT | (N1, N2, D) | (...,1) }:
+ 算子计算参数 `grad_x` 的张量描述,对应于`x`的梯度。
+- `grad_w_desc` - { dT | (D) | (...) }:
+ 算子计算参数 `grad_w` 的张量描述,对应于公式中 $\gamma$ 的梯度。
+- `grad_y_desc` - { dT | (N1, N2, D) | (...,1) }:
+ 算子计算参数 `grad_y` 的张量描述,对应于公式中`y`的梯度。
+- `x_desc` - { dT | (N1, N2, D) | (...,1) }:
+ 算子计算参数 `x` 的张量描述。
+- `w_desc` - { dT | (D) | (...) }:
+ 算子计算参数 `w` 的张量描述,对应于公式中的 $\gamma$。
+
+参数限制:
+
+- **`dT`**: (`Float16`, `Float32`, `Bfloat16`) 之一
+- `grad_x`、`grad_y`、`x`的最后一维均连续
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+---
+
+### 计算额外工作空间
+
+```c
+infiniStatus_t infiniopGetRMSNormBackwardWorkspaceSize(
+ infiniopRMSNormBackwardDescriptor_t desc,
+ size_t *size
+);
+```
+ 参数:
+
+- `desc`: 使用 `infiniopCreateRMSNormBackwardDescriptor()` 初始化的算子描述符。
+- `size`:
+ 额外空间大小的计算结果的写入地址;
+
+ 返回值:
+
+ - [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+---
+
+### 销毁算子描述符
+
+```c
+infiniopStatus_t infiniopDestroyRMSNormBackwardDescriptor(
+ infiniopRMSNormBackwardDescriptor_t desc
+);
+```
+
+ 参数:
+
+- `desc`:
+ 输入。 待销毁的算子描述符;
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+## 已知问题
+
+无
+
+
+[`InfiniopHandle_t`]: /infiniop/handle/README.md
+
+[`INFINI_STATUS_SUCCESS`]: /common/status/README.md#INFINI_STATUS_SUCCESS
+[`INFINI_STATUS_BAD_PARAM`]: /common/status/README.md#INFINI_STATUS_BAD_PARAM
+[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]: /common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE
+[`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED
+[`INFINI_STATUS_INTERNAL_ERROR`]: /common/status/README.md#INFINI_STATUS_INTERNAL_ERROR
+[`INFINI_STATUS_NULL_POINTER`]: /common/status/README.md#INFINI_STATUS_NULL_POINTER
+[`INFINI_STATUS_BAD_TENSOR_SHAPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_SHAPE
+[`INFINI_STATUS_BAD_TENSOR_DTYPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_DTYPE
+[`INFINI_STATUS_BAD_TENSOR_STRIDES`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_STRIDES