diff --git a/infiniop/ops/README.md b/infiniop/ops/README.md
index 0633ec6..2497c66 100644
--- a/infiniop/ops/README.md
+++ b/infiniop/ops/README.md
@@ -12,3 +12,12 @@
- [`Softmax`](/infiniop/ops/softmax/README.md)
- [`Sub`](/infiniop/ops/sub/README.md)
- [`SwiGLU`](/infiniop/ops/swiglu/README.md)
+- [`Leaky ReLU`](/infiniop/ops/leaky_relu/README.md)
+- [`exp`](/infiniop/ops/exp/README.md)
+- [`sin`](/infiniop/ops/sin/README.md)
+- [`cos`](/infiniop/ops/cos/README.md)
+- [`tanh`](/infiniop/ops/tanh/README.md)
+- [`hardswish`](/infiniop/ops/hardswish/README.md)
+- [`cast`](/infiniop/ops/cast/README.md)
+- [`where`](/infiniop/ops/where/README.md)
+- [`sigmoid_backward`](/infiniop/ops/sigmoid_backward/README.md)
\ No newline at end of file
diff --git a/infiniop/ops/cast/README.md b/infiniop/ops/cast/README.md
new file mode 100644
index 0000000..f2f8899
--- /dev/null
+++ b/infiniop/ops/cast/README.md
@@ -0,0 +1,130 @@
+# `Cast`
+
+`Cast`, 即**类型转换**算子,用于将输入张量的数据类型转换为指定的目标数据类型。其计算可被表述为:
+
+$$ output = cast(input, target\_dtype) $$
+
+其中 `input` 为输入张量,`output` 为输出张量,`target_dtype` 为目标数据类型。
+
+## 接口
+
+### 计算
+
+```c
+infiniStatus_t infiniopCast(
+ infiniopCastDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void *output,
+ const void *input,
+ void *stream
+);
+```
+
+
参数:
+
+- `desc`:
+ 已使用 `infiniopCreateCastDescriptor()` 初始化的算子描述符;
+- `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 infiniopCreateCastDescriptor(
+ infiniopHandle_t handle,
+ infiniopCastDescriptor_t *desc_ptr,
+ infiniopTensorDescriptor_t output,
+ infiniopTensorDescriptor_t input
+);
+```
+
+ 参数:
+
+- `handle`:
+ `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
+- `desc_ptr`:
+ `infiniopCastDescriptor_t` 指针,指向将被初始化的算子描述符地址;
+- `output` - { dT_out | (d1,...,dn) | (...) }:
+ 算子计算参数 `output` 的张量描述。
+- `input` - { dT_in | (d1,...,dn) | (...) }:
+ 算子计算参数 `input` 的张量描述。
+
+参数限制:
+
+- `dT_in`, `dT_out`: 支持以下类型转换:
+ - 整数类型间互转:`Int8`, `Int16`, `Int32`, `Int64`, `UInt8`, `UInt16`, `UInt32`, `UInt64`
+ - 浮点类型间互转:`Float16`, `Float32`, `Float64`, `BFloat16`
+ - 整数转浮点:从上述整数类型转换为上述浮点类型
+- 输入 `input` 与输出 `output` 的形状需相同。
+- 不支持原位计算,即计算时 `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 infiniopGetCastWorkspaceSize(
+ infiniopCastDescriptor_t desc,
+ size_t *size
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateCastDescriptor()` 初始化的算子描述符;
+- `size`:
+ 额外空间大小的计算结果的写入地址;
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+### 销毁算子描述符
+
+```c
+infiniStatus_t infiniopDestroyCastDescriptor(
+ infiniopCastDescriptor_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
\ No newline at end of file
diff --git a/infiniop/ops/cos/README.md b/infiniop/ops/cos/README.md
new file mode 100644
index 0000000..06dc428
--- /dev/null
+++ b/infiniop/ops/cos/README.md
@@ -0,0 +1,128 @@
+# `Cos`
+
+`Cos`, 即**余弦**算子,为单目逐元素算子。其计算可被表述为:
+
+$$ output = \cos(input) $$
+
+其中 `input` 为输入,`output` 为输出。
+
+## 接口
+
+### 计算
+
+```c
+infiniStatus_t infiniopCos(
+ infiniopCosDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void *output,
+ const void *input,
+ void *stream
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateCosDescriptor()` 初始化的算子描述符;
+- `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 infiniopCreateCosDescriptor(
+ infiniopHandle_t handle,
+ infiniopCosDescriptor_t *desc_ptr,
+ infiniopTensorDescriptor_t output,
+ infiniopTensorDescriptor_t input
+);
+```
+
+ 参数:
+
+- `handle`:
+ `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
+- `desc_ptr`:
+ `infiniopCosDescriptor_t` 指针,指向将被初始化的算子描述符地址;
+- `output` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `output` 的张量描述,支持原位计算。
+- `input` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `input` 的张量描述,支持原位计算。
+
+参数限制:
+
+- `dT`: (`Float16`, `Float32`, `BFloat16`) 之一。
+- 输入 `input` 与输出 `output` 的形状需相同。
+- 支持原位计算,即计算时 `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 infiniopGetCosWorkspaceSize(
+ infiniopCosDescriptor_t desc,
+ size_t *size
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateCosDescriptor()` 初始化的算子描述符;
+- `size`:
+ 额外空间大小的计算结果的写入地址;
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+### 销毁算子描述符
+
+```c
+infiniStatus_t infiniopDestroyCosDescriptor(
+ infiniopCosDescriptor_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
\ No newline at end of file
diff --git a/infiniop/ops/exp/README.md b/infiniop/ops/exp/README.md
new file mode 100644
index 0000000..92d5588
--- /dev/null
+++ b/infiniop/ops/exp/README.md
@@ -0,0 +1,128 @@
+# `Exp`
+
+`Exp`, 即**指数**算子,为单目逐元素算子。其计算可被表述为:
+
+$$ output = e^{input} $$
+
+其中 `input` 为输入,`output` 为输出。
+
+## 接口
+
+### 计算
+
+```c
+infiniStatus_t infiniopExp(
+ infiniopExpDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void *output,
+ const void *input,
+ void *stream
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateExpDescriptor()` 初始化的算子描述符;
+- `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 infiniopCreateExpDescriptor(
+ infiniopHandle_t handle,
+ infiniopExpDescriptor_t *desc_ptr,
+ infiniopTensorDescriptor_t output,
+ infiniopTensorDescriptor_t input
+);
+```
+
+ 参数:
+
+- `handle`:
+ `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
+- `desc_ptr`:
+ `infiniopExpDescriptor_t` 指针,指向将被初始化的算子描述符地址;
+- `output` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `output` 的张量描述,支持原位计算。
+- `input` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `input` 的张量描述,支持原位计算。
+
+参数限制:
+
+- `dT`: (`Float16`, `Float32`, `BFloat16`) 之一。
+- 输入 `input` 与输出 `output` 的形状需相同。
+- 支持原位计算,即计算时 `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 infiniopGetExpWorkspaceSize(
+ infiniopExpDescriptor_t desc,
+ size_t *size
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateExpDescriptor()` 初始化的算子描述符;
+- `size`:
+ 额外空间大小的计算结果的写入地址;
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+### 销毁算子描述符
+
+```c
+infiniStatus_t infiniopDestroyExpDescriptor(
+ infiniopExpDescriptor_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
\ No newline at end of file
diff --git a/infiniop/ops/hardswish/README.md b/infiniop/ops/hardswish/README.md
new file mode 100644
index 0000000..046c9ba
--- /dev/null
+++ b/infiniop/ops/hardswish/README.md
@@ -0,0 +1,128 @@
+# `HardSwish`
+
+`HardSwish`, 即**硬Swish**算子,为单目逐元素算子。其计算可被表述为:
+
+$$ output = input \times \frac{\text{ReLU6}(input + 3)}{6} $$
+
+其中 `input` 为输入,`output` 为输出,$\text{ReLU6}(x) = \min(\max(0, x), 6)$。
+
+## 接口
+
+### 计算
+
+```c
+infiniStatus_t infiniopHardSwish(
+ infiniopHardSwishDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void *output,
+ const void *input,
+ void *stream
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateHardSwishDescriptor()` 初始化的算子描述符;
+- `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 infiniopCreateHardSwishDescriptor(
+ infiniopHandle_t handle,
+ infiniopHardSwishDescriptor_t *desc_ptr,
+ infiniopTensorDescriptor_t output,
+ infiniopTensorDescriptor_t input
+);
+```
+
+ 参数:
+
+- `handle`:
+ `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
+- `desc_ptr`:
+ `infiniopHardSwishDescriptor_t` 指针,指向将被初始化的算子描述符地址;
+- `output` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `output` 的张量描述,支持原位计算。
+- `input` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `input` 的张量描述,支持原位计算。
+
+参数限制:
+
+- `dT`: (`Float16`, `Float32`, `BFloat16`) 之一。
+- 输入 `input` 与输出 `output` 的形状需相同。
+- 支持原位计算,即计算时 `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 infiniopGetHardSwishWorkspaceSize(
+ infiniopHardSwishDescriptor_t desc,
+ size_t *size
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateHardSwishDescriptor()` 初始化的算子描述符;
+- `size`:
+ 额外空间大小的计算结果的写入地址;
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+### 销毁算子描述符
+
+```c
+infiniStatus_t infiniopDestroyHardSwishDescriptor(
+ infiniopHardSwishDescriptor_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
\ No newline at end of file
diff --git a/infiniop/ops/leaky_relu/README.md b/infiniop/ops/leaky_relu/README.md
new file mode 100644
index 0000000..754eac9
--- /dev/null
+++ b/infiniop/ops/leaky_relu/README.md
@@ -0,0 +1,132 @@
+# `LeakyReLU`
+
+`LeakyReLU`, 即**带泄漏的线性整流单元**算子,为单目逐元素算子。其计算可被表述为:
+
+$$ output = \max(0, input) + negative\_slope \times \min(0, input) $$
+
+其中 `input` 为输入,`output` 为输出,`negative_slope` 为负斜率参数。
+
+## 接口
+
+### 计算
+
+```c
+infiniStatus_t infiniopLeakyReLU(
+ infiniopLeakyReLUDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void *output,
+ const void *input,
+ void *stream
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateLeakyReLUDescriptor()` 初始化的算子描述符;
+- `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 infiniopCreateLeakyReLUDescriptor(
+ infiniopHandle_t handle,
+ infiniopLeakyReLUDescriptor_t *desc_ptr,
+ infiniopTensorDescriptor_t output,
+ infiniopTensorDescriptor_t input,
+ float negative_slope
+);
+```
+
+ 参数:
+
+- `handle`:
+ `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
+- `desc_ptr`:
+ `infiniopLeakyReLUDescriptor_t` 指针,指向将被初始化的算子描述符地址;
+- `output` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `output` 的张量描述,支持原位计算。
+- `input` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `input` 的张量描述,支持原位计算。
+- `negative_slope`:
+ 负斜率参数,用于控制负值部分的斜率。
+
+参数限制:
+
+- `dT`: (`Float16`, `Float32`, `BFloat16`) 之一。
+- 输入 `input` 与输出 `output` 的形状需相同。
+- 支持原位计算,即计算时 `output` 可以和 `input` 指向同一地址。
+- 输入输出类型一致。
+- `negative_slope` 通常为小的正数,默认值为 0.01。
+
+ 返回值:
+
+- [`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 infiniopGetLeakyReLUWorkspaceSize(
+ infiniopLeakyReLUDescriptor_t desc,
+ size_t *size
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateLeakyReLUDescriptor()` 初始化的算子描述符;
+- `size`:
+ 额外空间大小的计算结果的写入地址;
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+### 销毁算子描述符
+
+```c
+infiniStatus_t infiniopDestroyLeakyReLUDescriptor(
+ infiniopLeakyReLUDescriptor_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
\ No newline at end of file
diff --git a/infiniop/ops/sigmoid_backward/README.md b/infiniop/ops/sigmoid_backward/README.md
new file mode 100644
index 0000000..cef7d78
--- /dev/null
+++ b/infiniop/ops/sigmoid_backward/README.md
@@ -0,0 +1,134 @@
+# `Sigmoid Backward`
+
+`Sigmoid Backward`, 即**Sigmoid反向传播**算子,用于计算Sigmoid函数的梯度。其计算可被表述为:
+
+$$ grad\_input = grad\_output \times sigmoid(input) \times (1 - sigmoid(input)) $$
+
+其中 `input` 为前向传播的输入,`grad_output` 为从后续层传回的梯度,`grad_input` 为计算得到的输入梯度。
+
+## 接口
+
+### 计算
+
+```c
+infiniStatus_t infiniopSigmoidBackward(
+ infiniopSigmoidBackwardDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void *grad_input,
+ const void *input,
+ const void *grad_output,
+ void *stream
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateSigmoidBackwardDescriptor()` 初始化的算子描述符;
+- `workspace`:
+ 指向算子计算所需的额外工作空间;
+- `workspace_size`:
+ `workspace` 的大小,单位:字节;
+- `grad_input`:
+ 输出的输入梯度张量。张量限制见[创建算子描述](#创建算子描述)部分;
+- `input`:
+ 前向传播的输入张量。张量限制见[创建算子描述](#创建算子描述)部分;
+- `grad_output`:
+ 从后续层传回的梯度张量。张量限制见[创建算子描述](#创建算子描述)部分;
+- `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 infiniopCreateSigmoidBackwardDescriptor(
+ infiniopHandle_t handle,
+ infiniopSigmoidBackwardDescriptor_t *desc_ptr,
+ infiniopTensorDescriptor_t grad_input,
+ infiniopTensorDescriptor_t input,
+ infiniopTensorDescriptor_t grad_output
+);
+```
+
+ 参数:
+
+- `handle`:
+ `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
+- `desc_ptr`:
+ `infiniopSigmoidBackwardDescriptor_t` 指针,指向将被初始化的算子描述符地址;
+- `grad_input` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `grad_input` 的张量描述,支持原位计算。
+- `input` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `input` 的张量描述。
+- `grad_output` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `grad_output` 的张量描述,支持原位计算。
+
+参数限制:
+
+- `dT`: (`Float16`, `Float32`, `BFloat16`) 之一。
+- 所有张量 `input`、`grad_output` 与 `grad_input` 的形状需相同。
+- 支持原位计算,即计算时 `grad_input` 可以和 `grad_output` 指向同一地址。
+- 所有张量类型一致。
+
+ 返回值:
+
+- [`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 infiniopGetSigmoidBackwardWorkspaceSize(
+ infiniopSigmoidBackwardDescriptor_t desc,
+ size_t *size
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateSigmoidBackwardDescriptor()` 初始化的算子描述符;
+- `size`:
+ 额外空间大小的计算结果的写入地址;
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+### 销毁算子描述符
+
+```c
+infiniStatus_t infiniopDestroySigmoidBackwardDescriptor(
+ infiniopSigmoidBackwardDescriptor_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
\ No newline at end of file
diff --git a/infiniop/ops/sin/README.md b/infiniop/ops/sin/README.md
new file mode 100644
index 0000000..bdef3d2
--- /dev/null
+++ b/infiniop/ops/sin/README.md
@@ -0,0 +1,128 @@
+# `Sin`
+
+`Sin`, 即**正弦**算子,为单目逐元素算子。其计算可被表述为:
+
+$$ output = \sin(input) $$
+
+其中 `input` 为输入,`output` 为输出。
+
+## 接口
+
+### 计算
+
+```c
+infiniStatus_t infiniopSin(
+ infiniopSinDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void *output,
+ const void *input,
+ void *stream
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateSinDescriptor()` 初始化的算子描述符;
+- `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 infiniopCreateSinDescriptor(
+ infiniopHandle_t handle,
+ infiniopSinDescriptor_t *desc_ptr,
+ infiniopTensorDescriptor_t output,
+ infiniopTensorDescriptor_t input
+);
+```
+
+ 参数:
+
+- `handle`:
+ `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
+- `desc_ptr`:
+ `infiniopSinDescriptor_t` 指针,指向将被初始化的算子描述符地址;
+- `output` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `output` 的张量描述,支持原位计算。
+- `input` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `input` 的张量描述,支持原位计算。
+
+参数限制:
+
+- `dT`: (`Float16`, `Float32`, `BFloat16`) 之一。
+- 输入 `input` 与输出 `output` 的形状需相同。
+- 支持原位计算,即计算时 `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 infiniopGetSinWorkspaceSize(
+ infiniopSinDescriptor_t desc,
+ size_t *size
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateSinDescriptor()` 初始化的算子描述符;
+- `size`:
+ 额外空间大小的计算结果的写入地址;
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+### 销毁算子描述符
+
+```c
+infiniStatus_t infiniopDestroySinDescriptor(
+ infiniopSinDescriptor_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
\ No newline at end of file
diff --git a/infiniop/ops/tanh/README.md b/infiniop/ops/tanh/README.md
new file mode 100644
index 0000000..221a5a4
--- /dev/null
+++ b/infiniop/ops/tanh/README.md
@@ -0,0 +1,128 @@
+# `Tanh`
+
+`Tanh`, 即**双曲正切**算子,为单目逐元素算子。其计算可被表述为:
+
+$$ output = \tanh(input) = \frac{e^{input} - e^{-input}}{e^{input} + e^{-input}} $$
+
+其中 `input` 为输入,`output` 为输出。
+
+## 接口
+
+### 计算
+
+```c
+infiniStatus_t infiniopTanh(
+ infiniopTanhDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void *output,
+ const void *input,
+ void *stream
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateTanhDescriptor()` 初始化的算子描述符;
+- `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 infiniopCreateTanhDescriptor(
+ infiniopHandle_t handle,
+ infiniopTanhDescriptor_t *desc_ptr,
+ infiniopTensorDescriptor_t output,
+ infiniopTensorDescriptor_t input
+);
+```
+
+ 参数:
+
+- `handle`:
+ `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
+- `desc_ptr`:
+ `infiniopTanhDescriptor_t` 指针,指向将被初始化的算子描述符地址;
+- `output` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `output` 的张量描述,支持原位计算。
+- `input` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `input` 的张量描述,支持原位计算。
+
+参数限制:
+
+- `dT`: (`Float16`, `Float32`, `BFloat16`) 之一。
+- 输入 `input` 与输出 `output` 的形状需相同。
+- 支持原位计算,即计算时 `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 infiniopGetTanhWorkspaceSize(
+ infiniopTanhDescriptor_t desc,
+ size_t *size
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateTanhDescriptor()` 初始化的算子描述符;
+- `size`:
+ 额外空间大小的计算结果的写入地址;
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+### 销毁算子描述符
+
+```c
+infiniStatus_t infiniopDestroyTanhDescriptor(
+ infiniopTanhDescriptor_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
\ No newline at end of file
diff --git a/infiniop/ops/where/README.md b/infiniop/ops/where/README.md
new file mode 100644
index 0000000..c77423f
--- /dev/null
+++ b/infiniop/ops/where/README.md
@@ -0,0 +1,144 @@
+# `Where`
+
+`Where`, 即**条件选择**算子,为三目逐元素算子。其计算可被表述为:
+
+$$ c[i] = \begin{cases}
+a[i] & \text{if } condition[i] \text{ is true} \\
+b[i] & \text{if } condition[i] \text{ is false}
+\end{cases} $$
+
+其中 `condition` 为条件张量(布尔类型),`a` 和 `b` 为输入张量,`c` 为输出张量。
+
+## 接口
+
+### 计算
+
+```c
+infiniStatus_t infiniopWhere(
+ infiniopWhereDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ const void *condition,
+ const void *a,
+ const void *b,
+ void *c,
+ void *stream
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateWhereDescriptor()` 初始化的算子描述符;
+- `workspace`:
+ 指向算子计算所需的额外工作空间;
+- `workspace_size`:
+ `workspace` 的大小,单位:字节;
+- `condition`:
+ 条件张量(布尔类型)。张量限制见[创建算子描述](#创建算子描述)部分;
+- `a`:
+ 输入张量a。张量限制见[创建算子描述](#创建算子描述)部分;
+- `b`:
+ 输入张量b。张量限制见[创建算子描述](#创建算子描述)部分;
+- `c`:
+ 输出张量。张量限制见[创建算子描述](#创建算子描述)部分;
+- `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 infiniopCreateWhereDescriptor(
+ infiniopHandle_t handle,
+ infiniopWhereDescriptor_t *desc_ptr,
+ infiniopTensorDescriptor_t condition,
+ infiniopTensorDescriptor_t a,
+ infiniopTensorDescriptor_t b,
+ infiniopTensorDescriptor_t c
+);
+```
+
+ 参数:
+
+- `handle`:
+ `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
+- `desc_ptr`:
+ `infiniopWhereDescriptor_t` 指针,指向将被初始化的算子描述符地址;
+- `condition` - { Bool | (d1,...,dn) | (...) }:
+ 算子计算参数 `condition` 的张量描述。
+- `a` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `a` 的张量描述,支持原位计算。
+- `b` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `b` 的张量描述,支持原位计算。
+- `c` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `c` 的张量描述,支持原位计算。
+
+参数限制:
+
+- `dT`: (`Float16`, `Float32`, `BFloat16`) 之一。
+- `condition` 的数据类型必须为 `Bool`。
+- 所有张量 `condition`、`a`、`b` 和 `c` 的形状需相同。
+- 支持原位计算,即计算时 `c` 可以和 `a` 或 `b` 指向同一地址。
+- 输入输出类型一致(`a`、`b`、`c` 类型相同)。
+
+ 返回值:
+
+- [`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 infiniopGetWhereWorkspaceSize(
+ infiniopWhereDescriptor_t desc,
+ size_t *size
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateWhereDescriptor()` 初始化的算子描述符;
+- `size`:
+ 额外空间大小的计算结果的写入地址;
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+### 销毁算子描述符
+
+```c
+infiniStatus_t infiniopDestroyWhereDescriptor(
+ infiniopWhereDescriptor_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
\ No newline at end of file