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