diff --git a/infiniop/ops/README.md b/infiniop/ops/README.md
index 0633ec6..98f6706 100644
--- a/infiniop/ops/README.md
+++ b/infiniop/ops/README.md
@@ -3,12 +3,19 @@
- [`Add`](/infiniop/ops/add/README.md)
- [`Causal Softmax`](/infiniop/ops/causal_softmax/README.md)
- [`Clip`](/infiniop/ops/clip/README.md)
+- [`Gather`](/infiniop/ops/gather/README.md)
- [`GEMM`](/infiniop/ops/gemm/README.md)
+- [`IndexCopyInplace`](/infiniop/ops/index_copy_inplace/README.md)
+- [`Linear`](/infiniop/ops/linear/README.md)
+- [`Linear Backward`](/infiniop/ops/linear_backward/README.md)
- [`Mul`](/infiniop/ops/mul/README.md)
- [`Random Sample`](/infiniop/ops/random_sample/README.md)
- [`Rearrange`](/infiniop/ops/rearrange/README.md)
- [`RMS Norm`](/infiniop/ops/rms_norm/README.md)
- [`RoPE`](/infiniop/ops/rope/README.md)
+- [`Scatter`](/infiniop/ops/scatter/README.md)
- [`Softmax`](/infiniop/ops/softmax/README.md)
- [`Sub`](/infiniop/ops/sub/README.md)
- [`SwiGLU`](/infiniop/ops/swiglu/README.md)
+- [`Tril`](/infiniop/ops/tril/README.md)
+- [`Triu`](/infiniop/ops/triu/README.md)
diff --git a/infiniop/ops/gather/README.md b/infiniop/ops/gather/README.md
new file mode 100644
index 0000000..14b9c05
--- /dev/null
+++ b/infiniop/ops/gather/README.md
@@ -0,0 +1,142 @@
+# `Gather`
+
+`Gather`,即**聚集**算子。该算子沿着指定维度从输入张量中收集值,根据索引张量指定的位置进行聚集操作。其计算可被表述为:
+
+$$ output[i][j][k] = input[index[i][j][k]][j][k] $$
+
+(当 `dim=0` 时的示例)
+
+其中 `input` 为输入张量,`output` 为输出张量,`index` 为索引张量,`dim` 为聚集维度。
+
+参考 `torch.gather` 实现,不用考虑 `sparse_grad`。
+
+## 接口
+
+### 计算
+
+```c
+infiniStatus_t infiniopGather(
+ infiniopGatherDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void *output,
+ const void *input,
+ const void *index,
+ void *stream
+);
+```
+
+
参数:
+
+- `desc`:
+ 已使用 `infiniopCreateGatherDescriptor()` 初始化的算子描述符;
+- `workspace`:
+ 指向算子计算所需的额外工作空间;
+- `workspace_size`:
+ `workspace` 的大小,单位:字节;
+- `output`:
+ 输出张量。张量限制见[创建算子描述](#创建算子描述)部分;
+- `input`:
+ 输入张量。张量限制见[创建算子描述](#创建算子描述)部分;
+- `index`:
+ 索引张量。张量限制见[创建算子描述](#创建算子描述)部分;
+- `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 infiniopCreateGatherDescriptor(
+ infiniopHandle_t handle,
+ infiniopGatherDescriptor_t *desc_ptr,
+ infiniopTensorDescriptor_t output_desc,
+ infiniopTensorDescriptor_t input_desc,
+ infiniopTensorDescriptor_t index_desc,
+ int dim
+);
+```
+
+ 参数:
+
+- `handle`:
+ `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
+- `desc_ptr`:
+ `infiniopGatherDescriptor_t` 指针,指向将被初始化的算子描述符地址;
+- `output_desc` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `output` 的张量描述,支持原位计算。
+- `input_desc` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `input` 的张量描述。
+- `index_desc` - { int32/int64 | (d1,...,dn) | (...) }:
+ 算子计算参数 `index` 的张量描述。
+- `dim`:
+ 聚集维度。
+
+参数限制:
+
+- `dT`: 所有合法类型。
+- 支持原位计算,即计算时 `output` 可以和 `input` 指向同一地址。
+- `index` 张量的数据类型必须为 `int32` 或 `int64`。
+- `output` 和 `index` 张量必须具有相同的形状。
+- `input` 张量在除 `dim` 维度外的其他维度必须与 `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 infiniopGetGatherWorkspaceSize(
+ infiniopGatherDescriptor_t desc,
+ size_t *size
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateGatherDescriptor()` 初始化的算子描述符;
+- `size`:
+ 额外空间大小的计算结果的写入地址;
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+### 销毁算子描述符
+
+```c
+infiniStatus_t infiniopDestroyGatherDescriptor(
+ infiniopGatherDescriptor_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/index_copy_inplace/README.md b/infiniop/ops/index_copy_inplace/README.md
new file mode 100644
index 0000000..a554c3f
--- /dev/null
+++ b/infiniop/ops/index_copy_inplace/README.md
@@ -0,0 +1,139 @@
+# `IndexCopyInplace`
+
+`IndexCopyInplace`,即**索引复制原位**算子。该算子将源张量中指定索引的元素复制到目标张量的对应位置,支持原位操作。其计算可被表述为:
+
+$$ output[index[i]] = input[i] $$
+
+其中 `input` 为输入张量,`output` 为输出张量,`index` 为索引张量,`dim` 为操作维度。
+
+参考 `torch.Tensor.index_copy_` 实现。
+
+## 接口
+
+### 计算
+
+```c
+infiniStatus_t infiniopIndexCopyInplace(
+ infiniopIndexCopyInplaceDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void *output,
+ const void *input,
+ const void *index,
+ void *stream
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateIndexCopyInplaceDescriptor()` 初始化的算子描述符;
+- `workspace`:
+ 指向算子计算所需的额外工作空间;
+- `workspace_size`:
+ `workspace` 的大小,单位:字节;
+- `output`:
+ 输出张量。张量限制见[创建算子描述](#创建算子描述)部分;
+- `input`:
+ 输入张量。张量限制见[创建算子描述](#创建算子描述)部分;
+- `index`:
+ 索引张量。张量限制见[创建算子描述](#创建算子描述)部分;
+- `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 infiniopCreateIndexCopyInplaceDescriptor(
+ infiniopHandle_t handle,
+ infiniopIndexCopyInplaceDescriptor_t *desc_ptr,
+ infiniopTensorDescriptor_t output_desc,
+ infiniopTensorDescriptor_t input_desc,
+ infiniopTensorDescriptor_t index_desc,
+ int dim
+);
+```
+
+ 参数:
+
+- `handle`:
+ `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
+- `desc_ptr`:
+ `infiniopIndexCopyInplaceDescriptor_t` 指针,指向将被初始化的算子描述符地址;
+- `output_desc` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `output` 的张量描述,支持原位计算。
+- `input_desc` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `input` 的张量描述。
+- `index_desc` - { int32/int64 | (d1,...,dn) | (...) }:
+ 算子计算参数 `index` 的张量描述。
+- `dim`:
+ 操作维度。
+
+参数限制:
+
+- `dT`: 所有合法类型。
+- 支持任意步长,可以复用rearrange算子代码。
+- 支持原位计算,即计算时 `output` 可以和 `input` 指向同一地址。
+- `index` 张量的数据类型必须为 `int32` 或 `int64`。
+
+ 返回值:
+
+- [`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 infiniopGetIndexCopyInplaceWorkspaceSize(
+ infiniopIndexCopyInplaceDescriptor_t desc,
+ size_t *size
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateIndexCopyInplaceDescriptor()` 初始化的算子描述符;
+- `size`:
+ 额外空间大小的计算结果的写入地址;
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+### 销毁算子描述符
+
+```c
+infiniStatus_t infiniopDestroyIndexCopyInplaceDescriptor(
+ infiniopIndexCopyInplaceDescriptor_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/linear/README.md b/infiniop/ops/linear/README.md
new file mode 100644
index 0000000..d363b49
--- /dev/null
+++ b/infiniop/ops/linear/README.md
@@ -0,0 +1,148 @@
+# `Linear`
+
+`Linear`,即**线性变换**算子。该算子执行线性变换操作,计算公式为:
+
+$$ y = x \cdot w^T + b $$
+
+其中:
+
+- `x` 为输入张量。
+- `w` 为权重张量,形状为 `(out_features, in_features)`。
+- `b` 为偏置张量,形状为 `(out_features,)`,可选参数。
+- `y` 为输出张量。
+
+参考 `torch.nn.functional.linear` 实现。
+
+## 接口
+
+### 计算
+
+```c
+infiniStatus_t infiniopLinear(
+ infiniopLinearDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void *y,
+ const void *x,
+ const void *w,
+ const void *b,
+ void *stream
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateLinearDescriptor()` 初始化的算子描述符;
+- `workspace`:
+ 指向算子计算所需的额外工作空间;
+- `workspace_size`:
+ `workspace` 的大小,单位:字节;
+- `y`:
+ 输出张量。张量限制见[创建算子描述](#创建算子描述)部分;
+- `x`:
+ 输入张量。张量限制见[创建算子描述](#创建算子描述)部分;
+- `w`:
+ 权重张量。张量限制见[创建算子描述](#创建算子描述)部分;
+- `b`:
+ 偏置张量,可为 `NULL`。张量限制见[创建算子描述](#创建算子描述)部分;
+- `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 infiniopCreateLinearDescriptor(
+ infiniopHandle_t handle,
+ infiniopLinearDescriptor_t *desc_ptr,
+ infiniopTensorDescriptor_t x_desc,
+ infiniopTensorDescriptor_t w_desc,
+ infiniopTensorDescriptor_t b_desc,
+ infiniopTensorDescriptor_t y_desc
+);
+```
+
+ 参数:
+
+- `handle`:
+ `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
+- `desc_ptr`:
+ `infiniopLinearDescriptor_t` 指针,指向将被初始化的算子描述符地址;
+- `x_desc` - { dT | (..., in_features) | (...) }:
+ 算子计算参数 `x` 的张量描述。
+- `w_desc` - { dT | (out_features, in_features) | (...) }:
+ 算子计算参数 `w` 的张量描述,权重数据为2D。
+- `b_desc` - { dT | (out_features,) | (...) }:
+ 算子计算参数 `b` 的张量描述,偏置数据为1D,可为 `NULL`。
+- `y_desc` - { dT | (..., out_features) | (...) }:
+ 算子计算参数 `y` 的张量描述。
+
+参数限制:
+
+- `dT`: (`Float16`, `Float32`, `BFloat16`) 之一。
+- `w` 权重张量的数据为2D。
+- `b` 偏置张量的数据为1D,需要支持不传 `bias` 的情况。
+- 输入 `x` 的最后一个维度必须与权重 `w` 的第二个维度相匹配。
+- 输出 `y` 的最后一个维度必须与权重 `w` 的第一个维度相匹配。
+
+ 返回值:
+
+- [`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 infiniopGetLinearWorkspaceSize(
+ infiniopLinearDescriptor_t desc,
+ size_t *size
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateLinearDescriptor()` 初始化的算子描述符;
+- `size`:
+ 额外空间大小的计算结果的写入地址;
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+### 销毁算子描述符
+
+```c
+infiniStatus_t infiniopDestroyLinearDescriptor(
+ infiniopLinearDescriptor_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/linear_backward/README.md b/infiniop/ops/linear_backward/README.md
new file mode 100644
index 0000000..72dc94d
--- /dev/null
+++ b/infiniop/ops/linear_backward/README.md
@@ -0,0 +1,165 @@
+# `Linear Backward`
+
+`Linear Backward`,即**线性变换反向传播**算子。该算子计算线性变换的梯度,用于神经网络的反向传播过程。
+
+给定前向传播的计算公式:
+$$ y = x \cdot w^T + b $$
+
+反向传播计算以下梯度:
+- 对输入 `x` 的梯度:$$ \frac{\partial L}{\partial x} = \frac{\partial L}{\partial y} \cdot w $$
+- 对权重 `w` 的梯度:$$ \frac{\partial L}{\partial w} = \frac{\partial L}{\partial y}^T \cdot x $$
+- 对偏置 `b` 的梯度:$$ \frac{\partial L}{\partial b} = \sum \frac{\partial L}{\partial y} $$
+
+其中:
+- `grad_output` 为输出梯度张量 $\frac{\partial L}{\partial y}$。
+- `input` 为前向传播的输入张量 `x`。
+- `weight` 为前向传播的权重张量 `w`。
+- `grad_input`、`grad_weight`、`grad_bias` 分别为对应的梯度输出。
+
+参考 `torch.nn.functional.linear` 的反向传播实现。
+
+## 接口
+
+### 计算
+
+```c
+infiniStatus_t infiniopLinearBackward(
+ infiniopLinearBackwardDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void *grad_x,
+ void *grad_w,
+ void *grad_b,
+ const void *grad_y,
+ const void *x,
+ const void *w,
+ void *stream
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateLinearBackwardDescriptor()` 初始化的算子描述符;
+- `workspace`:
+ 指向算子计算所需的额外工作空间;
+- `workspace_size`:
+ `workspace` 的大小,单位:字节;
+- `grad_x`:
+ 输入梯度张量,可为 `NULL`。张量限制见[创建算子描述](#创建算子描述)部分;
+- `grad_w`:
+ 权重梯度张量,可为 `NULL`。张量限制见[创建算子描述](#创建算子描述)部分;
+- `grad_b`:
+ 偏置梯度张量,可为 `NULL`。张量限制见[创建算子描述](#创建算子描述)部分;
+- `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 infiniopCreateLinearBackwardDescriptor(
+ infiniopHandle_t handle,
+ infiniopLinearBackwardDescriptor_t *desc_ptr,
+ infiniopTensorDescriptor_t grad_y_desc,
+ infiniopTensorDescriptor_t x_desc,
+ infiniopTensorDescriptor_t w_desc,
+ infiniopTensorDescriptor_t grad_x_desc,
+ infiniopTensorDescriptor_t grad_w_desc,
+ infiniopTensorDescriptor_t grad_b_desc
+);
+```
+
+ 参数:
+
+- `handle`:
+ `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
+- `desc_ptr`:
+ `infiniopLinearBackwardDescriptor_t` 指针,指向将被初始化的算子描述符地址;
+- `grad_y_desc` - { dT | (..., out_features) | (...) }:
+ 算子计算参数 `grad_output` 的张量描述。
+- `x_desc` - { dT | (..., in_features) | (...) }:
+ 算子计算参数 `input` 的张量描述。
+- `w_desc` - { dT | (out_features, in_features) | (...) }:
+ 算子计算参数 `weight` 的张量描述。
+- `grad_x_desc` - { dT | (..., in_features) | (...) }:
+ 算子计算参数 `grad_input` 的张量描述,可为 `NULL`。
+- `grad_w_desc` - { dT | (out_features, in_features) | (...) }:
+ 算子计算参数 `grad_weight` 的张量描述,可为 `NULL`。
+- `grad_b_desc` - { dT | (out_features,) | (...) }:
+ 算子计算参数 `grad_bias` 的张量描述,可为 `NULL`。
+
+参数限制:
+
+- `dT`: (`Float16`, `Float32`, `BFloat16`) 之一。
+- `weight` 权重张量的数据为2D。
+- `grad_bias` 偏置梯度张量的数据为1D,可为 `NULL`。
+- 输入和输出张量的维度必须与前向传播保持一致。
+- 至少需要计算一个梯度(`grad_input`、`grad_weight`、`grad_bias` 不能全为 `NULL`)。
+
+ 返回值:
+
+- [`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 infiniopGetLinearBackwardWorkspaceSize(
+ infiniopLinearBackwardDescriptor_t desc,
+ size_t *size
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateLinearBackwardDescriptor()` 初始化的算子描述符;
+- `size`:
+ 额外空间大小的计算结果的写入地址;
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+### 销毁算子描述符
+
+```c
+infiniStatus_t infiniopDestroyLinearBackwardDescriptor(
+ infiniopLinearBackwardDescriptor_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/scatter/README.md b/infiniop/ops/scatter/README.md
new file mode 100644
index 0000000..fe85aeb
--- /dev/null
+++ b/infiniop/ops/scatter/README.md
@@ -0,0 +1,142 @@
+# `Scatter`
+
+`Scatter`,即**散布**算子。该算子将源张量中的值按照索引张量指定的位置散布到输出张量中。其计算可被表述为:
+
+$$ output[index[i][j][k]][j][k] = input[i][j][k] $$
+
+(当 `dim=0` 时的示例)
+
+其中 `input` 为输入张量,`output` 为输出张量,`index` 为索引张量,`dim` 为散布维度。
+
+参考 `torch.Tensor.scatter_` 实现,不需要考虑 `reduce` 参数。
+
+## 接口
+
+### 计算
+
+```c
+infiniStatus_t infiniopScatter(
+ infiniopScatterDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void *output,
+ const void *input,
+ const void *index,
+ void *stream
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateScatterDescriptor()` 初始化的算子描述符;
+- `workspace`:
+ 指向算子计算所需的额外工作空间;
+- `workspace_size`:
+ `workspace` 的大小,单位:字节;
+- `output`:
+ 输出张量。张量限制见[创建算子描述](#创建算子描述)部分;
+- `input`:
+ 输入张量。张量限制见[创建算子描述](#创建算子描述)部分;
+- `index`:
+ 索引张量。张量限制见[创建算子描述](#创建算子描述)部分;
+- `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 infiniopCreateScatterDescriptor(
+ infiniopHandle_t handle,
+ infiniopScatterDescriptor_t *desc_ptr,
+ infiniopTensorDescriptor_t output_desc,
+ infiniopTensorDescriptor_t input_desc,
+ infiniopTensorDescriptor_t index_desc,
+ int dim
+);
+```
+
+ 参数:
+
+- `handle`:
+ `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
+- `desc_ptr`:
+ `infiniopScatterDescriptor_t` 指针,指向将被初始化的算子描述符地址;
+- `output_desc` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `output` 的张量描述,支持原位计算。
+- `input_desc` - { dT | (d1,...,dn) | (...) }:
+ 算子计算参数 `input` 的张量描述。
+- `index_desc` - { int32/int64 | (d1,...,dn) | (...) }:
+ 算子计算参数 `index` 的张量描述。
+- `dim`:
+ 散布维度。
+
+参数限制:
+
+- `dT`: 所有合法类型。
+- 支持原位计算,即计算时 `output` 可以和 `input` 指向同一地址。
+- `index` 张量的数据类型必须为 `int32` 或 `int64`。
+- `input` 和 `index` 张量必须具有相同的形状。
+- `output` 张量在除 `dim` 维度外的其他维度必须与 `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 infiniopGetScatterWorkspaceSize(
+ infiniopScatterDescriptor_t desc,
+ size_t *size
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateScatterDescriptor()` 初始化的算子描述符;
+- `size`:
+ 额外空间大小的计算结果的写入地址;
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+### 销毁算子描述符
+
+```c
+infiniStatus_t infiniopDestroyScatterDescriptor(
+ infiniopScatterDescriptor_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/tril/README.md b/infiniop/ops/tril/README.md
new file mode 100644
index 0000000..e5bcd4e
--- /dev/null
+++ b/infiniop/ops/tril/README.md
@@ -0,0 +1,145 @@
+# `Tril`
+
+`Tril`,即**下三角**算子。该算子返回输入张量的下三角部分,其余部分设置为零。其计算可被表述为:
+
+$$ output[i][j] = \begin{cases}
+input[i][j] & \text{if } j \leq i + diagonal \\
+0 & \text{otherwise}
+\end{cases} $$
+
+其中 `input` 为输入张量,`output` 为输出张量,`diagonal` 为对角线偏移量。
+
+参考 `torch.tril` 实现,只需要支持2D连续张量。
+
+## 接口
+
+### 计算
+
+```c
+infiniStatus_t infiniopTril(
+ infiniopTrilDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void *output,
+ const void *input,
+ void *stream
+);
+
+infiniStatus_t infiniopTrilInplace(
+ infiniopTrilDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void *input_output,
+ void *stream
+);```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateTrilDescriptor()` 初始化的算子描述符;
+- `workspace`:
+ 指向算子计算所需的额外工作空间;
+- `workspace_size`:
+ `workspace` 的大小,单位:字节;
+- `output`:
+ 输出张量。张量限制见[创建算子描述](#创建算子描述)部分;
+- `input`:
+ 输入张量。张量限制见[创建算子描述](#创建算子描述)部分;
+- `input_output`:
+ 输入输出张量(用于Inplace版本)。张量限制见[创建算子描述](#创建算子描述)部分;
+- `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 infiniopCreateTrilDescriptor(
+ infiniopHandle_t handle,
+ infiniopTrilDescriptor_t *desc_ptr,
+ infiniopTensorDescriptor_t output_desc,
+ infiniopTensorDescriptor_t input_desc,
+ int diagonal
+);
+```
+
+ 参数:
+
+- `handle`:
+ `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
+- `desc_ptr`:
+ `infiniopTrilDescriptor_t` 指针,指向将被初始化的算子描述符地址;
+- `output_desc` - { dT | (M, N) | (...) }:
+ 算子计算参数 `output` 的张量描述,支持原位计算。
+- `input_desc` - { dT | (M, N) | (...) }:
+ 算子计算参数 `input` 的张量描述。
+- `diagonal`:
+ 对角线偏移量。默认为0(主对角线)。
+
+参数限制:
+
+- `dT`: 所有合法类型。
+- 只支持2D连续张量。
+- 支持原位计算,即计算时 `output` 可以和 `input` 指向同一地址。
+- `input` 和 `output` 张量必须具有相同的形状 `(M, N)`。
+
+ 返回值:
+
+- [`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 infiniopGetTrilWorkspaceSize(
+ infiniopTrilDescriptor_t desc,
+ size_t *size
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateTrilDescriptor()` 初始化的算子描述符;
+- `size`:
+ 额外空间大小的计算结果的写入地址;
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+### 销毁算子描述符
+
+```c
+infiniStatus_t infiniopDestroyTrilDescriptor(
+ infiniopTrilDescriptor_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/triu/README.md b/infiniop/ops/triu/README.md
new file mode 100644
index 0000000..ca2a04b
--- /dev/null
+++ b/infiniop/ops/triu/README.md
@@ -0,0 +1,146 @@
+# `Triu`
+
+`Triu`,即**上三角**算子。该算子返回输入张量的上三角部分,其余部分设置为零。其计算可被表述为:
+
+$$ output[i][j] = \begin{cases}
+input[i][j] & \text{if } j \geq i + diagonal \\
+0 & \text{otherwise}
+\end{cases} $$
+
+其中 `input` 为输入张量,`output` 为输出张量,`diagonal` 为对角线偏移量。
+
+参考 `torch.triu` 实现,只需要支持2D连续张量。
+
+## 接口
+
+### 计算
+
+```c
+infiniStatus_t infiniopTriu(
+ infiniopTriuDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void *output,
+ const void *input,
+ void *stream
+);
+
+infiniStatus_t infiniopTriuInplace(
+ infiniopTriuDescriptor_t desc,
+ void *workspace,
+ size_t workspace_size,
+ void *input_output,
+ void *stream
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateTriuDescriptor()` 初始化的算子描述符;
+- `workspace`:
+ 指向算子计算所需的额外工作空间;
+- `workspace_size`:
+ `workspace` 的大小,单位:字节;
+- `output`:
+ 输出张量。张量限制见[创建算子描述](#创建算子描述)部分;
+- `input`:
+ 输入张量。张量限制见[创建算子描述](#创建算子描述)部分;
+- `input_output`:
+ 输入输出张量(用于Inplace版本)。张量限制见[创建算子描述](#创建算子描述)部分;
+- `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 infiniopCreateTriuDescriptor(
+ infiniopHandle_t handle,
+ infiniopTriuDescriptor_t *desc_ptr,
+ infiniopTensorDescriptor_t output_desc,
+ infiniopTensorDescriptor_t input_desc,
+ int diagonal
+);
+```
+
+ 参数:
+
+- `handle`:
+ `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。
+- `desc_ptr`:
+ `infiniopTriuDescriptor_t` 指针,指向将被初始化的算子描述符地址;
+- `output_desc` - { dT | (M, N) | (...) }:
+ 算子计算参数 `output` 的张量描述,支持原位计算。
+- `input_desc` - { dT | (M, N) | (...) }:
+ 算子计算参数 `input` 的张量描述。
+- `diagonal`:
+ 对角线偏移量。默认为0(主对角线)。
+
+参数限制:
+
+- `dT`: 所有合法类型。
+- 只支持2D连续张量。
+- 支持原位计算,即计算时 `output` 可以和 `input` 指向同一地址。
+- `input` 和 `output` 张量必须具有相同的形状 `(M, N)`。
+
+ 返回值:
+
+- [`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 infiniopGetTriuWorkspaceSize(
+ infiniopTriuDescriptor_t desc,
+ size_t *size
+);
+```
+
+ 参数:
+
+- `desc`:
+ 已使用 `infiniopCreateTriuDescriptor()` 初始化的算子描述符;
+- `size`:
+ 额外空间大小的计算结果的写入地址;
+
+ 返回值:
+
+- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].
+
+### 销毁算子描述符
+
+```c
+infiniStatus_t infiniopDestroyTriuDescriptor(
+ infiniopTriuDescriptor_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