From 93e6520dc7836ec4bc47d8b3c564b1cc9bcc48fc Mon Sep 17 00:00:00 2001 From: wawahejun Date: Sun, 24 Aug 2025 13:02:56 +0800 Subject: [PATCH] docs: add T1-1-2 ops --- infiniop/ops/README.md | 9 ++ infiniop/ops/and/README.md | 138 +++++++++++++++++ .../ops/crossentropyloss_backward/README.md | 144 +++++++++++++++++ infiniop/ops/div/README.md | 138 +++++++++++++++++ infiniop/ops/equal/README.md | 140 +++++++++++++++++ infiniop/ops/gelu/README.md | 135 ++++++++++++++++ infiniop/ops/gelu_backward/README.md | 145 ++++++++++++++++++ infiniop/ops/or/README.md | 138 +++++++++++++++++ infiniop/ops/relu_backward/README.md | 140 +++++++++++++++++ infiniop/ops/silu/README.md | 130 ++++++++++++++++ 10 files changed, 1257 insertions(+) create mode 100644 infiniop/ops/and/README.md create mode 100644 infiniop/ops/crossentropyloss_backward/README.md create mode 100644 infiniop/ops/div/README.md create mode 100644 infiniop/ops/equal/README.md create mode 100644 infiniop/ops/gelu/README.md create mode 100644 infiniop/ops/gelu_backward/README.md create mode 100644 infiniop/ops/or/README.md create mode 100644 infiniop/ops/relu_backward/README.md create mode 100644 infiniop/ops/silu/README.md diff --git a/infiniop/ops/README.md b/infiniop/ops/README.md index 0633ec6..51535db 100644 --- a/infiniop/ops/README.md +++ b/infiniop/ops/README.md @@ -1,14 +1,23 @@ # `InfiniOP` 算子列表 - [`Add`](/infiniop/ops/add/README.md) +- [`And`](/infiniop/ops/and/README.md) - [`Causal Softmax`](/infiniop/ops/causal_softmax/README.md) - [`Clip`](/infiniop/ops/clip/README.md) +- [`CrossEntropyLossBackward`](/infiniop/ops/crossentropyloss_backward/README.md) +- [`Div`](/infiniop/ops/div/README.md) +- [`Equal`](/infiniop/ops/equal/README.md) - [`GEMM`](/infiniop/ops/gemm/README.md) +- [`Gelu`](/infiniop/ops/gelu/README.md) +- [`Gelu Backward`](/infiniop/ops/gelu_backward/README.md) - [`Mul`](/infiniop/ops/mul/README.md) +- [`Or`](/infiniop/ops/or/README.md) - [`Random Sample`](/infiniop/ops/random_sample/README.md) - [`Rearrange`](/infiniop/ops/rearrange/README.md) +- [`ReLU Backward`](/infiniop/ops/relu_backward/README.md) - [`RMS Norm`](/infiniop/ops/rms_norm/README.md) - [`RoPE`](/infiniop/ops/rope/README.md) +- [`Silu`](/infiniop/ops/silu/README.md) - [`Softmax`](/infiniop/ops/softmax/README.md) - [`Sub`](/infiniop/ops/sub/README.md) - [`SwiGLU`](/infiniop/ops/swiglu/README.md) diff --git a/infiniop/ops/and/README.md b/infiniop/ops/and/README.md new file mode 100644 index 0000000..1d2304b --- /dev/null +++ b/infiniop/ops/and/README.md @@ -0,0 +1,138 @@ +# And 算子 + +And 算子用于执行张量的逐元素逻辑与运算。该算子参考 `torch.logical_and` 的行为。 + +## 数学定义 + +给定两个布尔张量 $a$ 和 $b$,And 算子的计算公式为: + +$$c = \text{and}(a, b) = a \land b$$ + +其中 $c$ 是输出张量,$a$ 和 $b$ 是输入张量。该算子支持多向广播。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopAnd( + infiniopAndDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *c, + const void *a, + const void *b, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateAndDescriptor()` 初始化的算子描述符。 +- `workspace`: + 额外工作空间地址。 +- `workspace_size`: + `workspace` 的大小,单位:字节。 +- `c`: + 计算结果地址,支持原位计算。 +- `a`: + 输入张量 `a` 的数据指针。 +- `b`: + 输入张量 `b` 的数据指针。 +- `stream`: + 计算流/队列。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`]. + +### 创建算子描述 + +```c +infiniStatus_t infiniopCreateAndDescriptor( + infiniopHandle_t handle, + infiniopAndDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t c, + infiniopTensorDescriptor_t a, + infiniopTensorDescriptor_t b +); +``` + +
参数:
+ +- `handle`: + 硬件控柄。详见 [`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopAndDescriptor_t` 指针,指向将被初始化的算子描述符地址。 +- `c` - { BOOL | (d1,...,dn) | (...) }: + 算子计算参数 `c` 的张量描述,支持原位计算。 +- `a` - { BOOL | (d1,...,dn) | (...) }: + 算子计算参数 `a` 的张量描述,支持原位计算,支持多向广播。 +- `b` - { BOOL | (d1,...,dn) | (...) }: + 算子计算参数 `b` 的张量描述,支持原位计算,支持多向广播。 + +参数限制: + +- 所有张量的数据类型必须为 `Bool`。 +- 输入 `a` 与 `b` 的形状需与 `c` 相同。`a` 与 `b` 涉及多向广播时需调整步长以匹配多向广播的映射关系。 +- 支持原位计算,即计算时 `c` 可以和 `a` 或 `b` 指向同一地址。 +- 计算输出参数 `c` 不能进行广播(`c` 的步长不能涉及广播设置,即步长不能有 0)。 + +
返回值:
+ +- [`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 infiniopGetAndWorkspaceSize( + infiniopAndDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateAndDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroyAndDescriptor( + infiniopAndDescriptor_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_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED +[`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 +[`INFINI_STATUS_NULL_POINTER`]:/common/status/README.md#INFINI_STATUS_NULL_POINTER +[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]:/common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE +[`INFINI_STATUS_INTERNAL_ERROR`]:/common/status/README.md#INFINI_STATUS_INTERNAL_ERROR \ No newline at end of file diff --git a/infiniop/ops/crossentropyloss_backward/README.md b/infiniop/ops/crossentropyloss_backward/README.md new file mode 100644 index 0000000..5cfd28a --- /dev/null +++ b/infiniop/ops/crossentropyloss_backward/README.md @@ -0,0 +1,144 @@ +# CrossEntropyLoss Backward 算子 + +CrossEntropyLoss Backward 算子用于计算交叉熵损失函数的反向传播梯度。该算子参考 `torch.nn.CrossEntropyLoss` 的反向传播行为。 + +## 数学定义 + +给定概率分布 $p$ 和目标标签 $t$,CrossEntropyLoss Backward 算子的计算公式为: + +$$\frac{\partial L}{\partial \text{logits}_i} = p_i - \mathbf{1}_{t=i}$$ + +其中: +- $p_i$ 是经过 softmax 后的概率分布中第 $i$ 个类别的概率 +- $\mathbf{1}_{t=i}$ 是指示函数,当目标标签 $t$ 等于 $i$ 时为 1,否则为 0 +- $\frac{\partial L}{\partial \text{logits}_i}$ 是对 logits 第 $i$ 个元素的梯度 + +对于批量处理,每个样本的梯度计算相互独立。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopCrossEntropyLossBackward( + infiniopCrossEntropyLossBackwardDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *grad_logits, + const void *probs, + const void *target, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateCrossEntropyLossBackwardDescriptor()` 初始化的算子描述符。 +- `workspace`: + 额外工作空间地址。 +- `workspace_size`: + `workspace` 的大小,单位:字节。 +- `grad_logits`: + logits 梯度的计算结果地址,支持原位计算。 +- `probs`: + 经过 softmax 后的概率分布张量数据指针。 +- `target`: + 目标标签张量数据指针。 +- `stream`: + 计算流/队列。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`]. + +### 创建算子描述 + +```c +infiniStatus_t infiniopCreateCrossEntropyLossBackwardDescriptor( + infiniopHandle_t handle, + infiniopCrossEntropyLossBackwardDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t grad_logits, + infiniopTensorDescriptor_t probs, + infiniopTensorDescriptor_t target +); +``` + +
参数:
+ +- `handle`: + 硬件控柄。详见 [`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopCrossEntropyLossBackwardDescriptor_t` 指针,指向将被初始化的算子描述符地址。 +- `grad_logits` - { FP16 | FP32 | BF16 | (batch_size, num_classes) | (...) }: + logits 梯度张量描述,支持原位计算。 +- `probs` - { FP16 | FP32 | BF16 | (batch_size, num_classes) | (...) }: + 概率分布张量描述,支持原位计算。 +- `target` - { INT32 | INT64 | (batch_size,) | (...) }: + 目标标签张量描述。 + +参数限制: + +- `grad_logits` 和 `probs` 张量的数据类型必须相同,支持 `FP16`、`FP32`、`BF16`。 +- `target` 张量的数据类型必须为 `INT32` 或 `INT64`。 +- `grad_logits` 和 `probs` 张量的形状必须相同,通常为 `(batch_size, num_classes)`。 +- `target` 张量的形状必须为 `(batch_size,)`,包含每个样本的目标类别索引。 +- 支持原位计算,即计算时 `grad_logits` 可以和 `probs` 指向同一地址。 + +
返回值:
+ +- [`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 infiniopGetCrossEntropyLossBackwardWorkspaceSize( + infiniopCrossEntropyLossBackwardDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateCrossEntropyLossBackwardDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroyCrossEntropyLossBackwardDescriptor( + infiniopCrossEntropyLossBackwardDescriptor_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_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED +[`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 +[`INFINI_STATUS_NULL_POINTER`]:/common/status/README.md#INFINI_STATUS_NULL_POINTER +[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]:/common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE +[`INFINI_STATUS_INTERNAL_ERROR`]:/common/status/README.md#INFINI_STATUS_INTERNAL_ERROR \ No newline at end of file diff --git a/infiniop/ops/div/README.md b/infiniop/ops/div/README.md new file mode 100644 index 0000000..e4a2fd9 --- /dev/null +++ b/infiniop/ops/div/README.md @@ -0,0 +1,138 @@ +# Div 算子 + +Div 算子用于执行张量的逐元素除法运算。该算子参考 `torch.div` 的行为。 + +## 数学定义 + +给定两个张量 $a$ 和 $b$,Div 算子的计算公式为: + +$$c = \text{div}(a, b) = \frac{a}{b}$$ + +其中 $c$ 是输出张量,$a$ 和 $b$ 是输入张量。该算子支持多向广播。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopDiv( + infiniopDivDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *c, + const void *a, + const void *b, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateDivDescriptor()` 初始化的算子描述符。 +- `workspace`: + 额外工作空间地址。 +- `workspace_size`: + `workspace` 的大小,单位:字节。 +- `c`: + 计算结果地址,支持原位计算。 +- `a`: + 输入张量 `a` 的数据指针。 +- `b`: + 输入张量 `b` 的数据指针。 +- `stream`: + 计算流/队列。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`]. + +### 创建算子描述 + +```c +infiniStatus_t infiniopCreateDivDescriptor( + infiniopHandle_t handle, + infiniopDivDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t c, + infiniopTensorDescriptor_t a, + infiniopTensorDescriptor_t b +); +``` + +
参数:
+ +- `handle`: + 硬件控柄。详见 [`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopDivDescriptor_t` 指针,指向将被初始化的算子描述符地址。 +- `c` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `c` 的张量描述,支持原位计算。 +- `a` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `a` 的张量描述,支持原位计算,支持多向广播。 +- `b` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `b` 的张量描述,支持原位计算,支持多向广播。 + +参数限制: + +- `dT`: (`Float16`, `Float32`, `BFloat16`) 之一。 +- 输入 `a` 与 `b` 的形状需与 `c` 相同。`a` 与 `b` 涉及多向广播时需调整步长以匹配多向广播的映射关系。 +- 支持原位计算,即计算时 `c` 可以和 `a` 或 `b` 指向同一地址。 +- 计算输出参数 `c` 不能进行广播(`c` 的步长不能涉及广播设置,即步长不能有 0)。 + +
返回值:
+ +- [`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 infiniopGetDivWorkspaceSize( + infiniopDivDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateDivDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroyDivDescriptor( + infiniopDivDescriptor_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_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED +[`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 +[`INFINI_STATUS_NULL_POINTER`]:/common/status/README.md#INFINI_STATUS_NULL_POINTER +[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]:/common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE +[`INFINI_STATUS_INTERNAL_ERROR`]:/common/status/README.md#INFINI_STATUS_INTERNAL_ERROR \ No newline at end of file diff --git a/infiniop/ops/equal/README.md b/infiniop/ops/equal/README.md new file mode 100644 index 0000000..55e2e8d --- /dev/null +++ b/infiniop/ops/equal/README.md @@ -0,0 +1,140 @@ +# Equal 算子 + +Equal 算子比较两个输入张量是否完全相等,返回一个布尔标量。该算子参考 `torch.equal` 的行为。 + +## 数学定义 + +给定两个张量 $a$ 和 $b$,Equal 算子的计算公式为: + +$$c = \text{equal}(a, b) = \begin{cases} +\text{true} & \text{if } a = b \text{ (形状和所有元素都相同)} \\ +\text{false} & \text{otherwise} +\end{cases}$$ + +其中 $c$ 是输出的布尔标量,$a$ 和 $b$ 是输入张量。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopEqual( + infiniopEqualDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *c, + const void *a, + const void *b, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateEqualDescriptor()` 初始化的算子描述符。 +- `workspace`: + 额外工作空间地址。 +- `workspace_size`: + `workspace` 的大小,单位:字节。 +- `c`: + 计算结果地址,类型为布尔标量。 +- `a`: + 输入张量 `a` 的数据指针。 +- `b`: + 输入张量 `b` 的数据指针。 +- `stream`: + 计算流/队列。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`]. + +### 创建算子描述 + +```c +infiniStatus_t infiniopCreateEqualDescriptor( + infiniopHandle_t handle, + infiniopEqualDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t c, + infiniopTensorDescriptor_t a, + infiniopTensorDescriptor_t b +); +``` + +
参数:
+ +- `handle`: + 硬件控柄。详见 [`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopEqualDescriptor_t` 指针,指向将被初始化的算子描述符地址。 +- `c` - { BOOL | () | (...) }: + 计算结果 `c` 的张量描述,必须是布尔标量。 +- `a` - { dT | (d1,...,dn) | (...) }: + 输入张量 `a` 的张量描述,支持多向广播。 +- `b` - { dT | (d1,...,dn) | (...) }: + 输入张量 `b` 的张量描述,支持多向广播。 + +参数限制: + +- `dT`: 所有合法类型(`Float16`, `Float32`, `Float64`, `BFloat16`, `Int8`, `Int16`, `Int32`, `Int64`, `Uint8`, `Uint16`, `Uint32`, `Uint64`, `Bool`)。 +- 输入张量 `a` 和 `b` 必须具有相同的形状和数据类型。 +- 输出 `c` 必须是布尔标量(形状为空或所有维度为1)。 +- 不支持原位计算。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 计算额外工作空间 + +```c +infiniStatus_t infiniopGetEqualWorkspaceSize( + infiniopEqualDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateEqualDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroyEqualDescriptor( + infiniopEqualDescriptor_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_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED +[`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_NULL_POINTER`]:/common/status/README.md#INFINI_STATUS_NULL_POINTER +[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]:/common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE +[`INFINI_STATUS_INTERNAL_ERROR`]:/common/status/README.md#INFINI_STATUS_INTERNAL_ERROR \ No newline at end of file diff --git a/infiniop/ops/gelu/README.md b/infiniop/ops/gelu/README.md new file mode 100644 index 0000000..6ead167 --- /dev/null +++ b/infiniop/ops/gelu/README.md @@ -0,0 +1,135 @@ +# GeLU 算子 + +GeLU 算子用于执行高斯误差线性单元(Gaussian Error Linear Unit)激活函数。该算子参考 `torch.gelu` 的行为。 + +## 数学定义 + +给定输入张量 $x$,GeLU 算子的计算公式为: + +$$\text{GeLU}(x) = x \cdot \Phi(x) = x \cdot \frac{1}{2}\left[1 + \text{erf}\left(\frac{x}{\sqrt{2}}\right)\right]$$ + +其中 $\Phi(x)$ 是标准正态分布的累积分布函数,$\text{erf}$ 是误差函数。 + +近似计算公式为: + +$$\text{GeLU}(x) \approx 0.5 \cdot x \cdot \left(1 + \tanh\left(\sqrt{\frac{2}{\pi}} \cdot (x + 0.044715 \cdot x^3)\right)\right)$$ + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopGelu( + infiniopGeluDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *output, + const void *input, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateGeluDescriptor()` 初始化的算子描述符。 +- `workspace`: + 额外工作空间地址。 +- `workspace_size`: + `workspace` 的大小,单位:字节。 +- `output`: + 计算结果地址,支持原位计算。 +- `input`: + 输入张量数据指针。 +- `stream`: + 计算流/队列。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`]. + +### 创建算子描述 + +```c +infiniStatus_t infiniopCreateGeluDescriptor( + infiniopHandle_t handle, + infiniopGeluDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output, + infiniopTensorDescriptor_t input +); +``` + +
参数:
+ +- `handle`: + 硬件控柄。详见 [`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopGeluDescriptor_t` 指针,指向将被初始化的算子描述符地址。 +- `output` - { FP16 | FP32 | BF16 | (d1,...,dn) | (...) }: + 输出张量描述,支持原位计算。 +- `input` - { FP16 | FP32 | BF16 | (d1,...,dn) | (...) }: + 输入张量描述,支持原位计算。 + +参数限制: + +- 输入和输出张量的数据类型必须相同,支持 `FP16`、`FP32`、`BF16`。 +- 输入和输出张量的形状必须相同。 +- 支持原位计算,即计算时 `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 infiniopGetGeluWorkspaceSize( + infiniopGeluDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateGeluDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroyGeluDescriptor( + infiniopGeluDescriptor_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_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED +[`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 +[`INFINI_STATUS_NULL_POINTER`]:/common/status/README.md#INFINI_STATUS_NULL_POINTER +[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]:/common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE +[`INFINI_STATUS_INTERNAL_ERROR`]:/common/status/README.md#INFINI_STATUS_INTERNAL_ERROR \ No newline at end of file diff --git a/infiniop/ops/gelu_backward/README.md b/infiniop/ops/gelu_backward/README.md new file mode 100644 index 0000000..2f584b6 --- /dev/null +++ b/infiniop/ops/gelu_backward/README.md @@ -0,0 +1,145 @@ +# GeLU Backward 算子 + +GeLU Backward 算子用于计算 GeLU 激活函数的反向传播梯度。该算子参考 `torch.gelu` 的反向传播行为。 + +## 数学定义 + +给定输入张量 $x$ 和输出梯度 $\frac{\partial L}{\partial y}$,GeLU Backward 算子的计算公式为: + +$$\frac{\partial L}{\partial x} = \frac{\partial L}{\partial y} \cdot \frac{\partial \text{GeLU}(x)}{\partial x}$$ + +其中 GeLU 函数的导数为: + +$$\frac{\partial \text{GeLU}(x)}{\partial x} = \Phi(x) + x \cdot \phi(x)$$ + +这里 $\Phi(x)$ 是标准正态分布的累积分布函数,$\phi(x) = \frac{1}{\sqrt{2\pi}}e^{-\frac{x^2}{2}}$ 是标准正态分布的概率密度函数。 + +近似计算的导数公式为: + +$$\frac{\partial \text{GeLU}(x)}{\partial x} \approx 0.5 \cdot \tanh\left(\sqrt{\frac{2}{\pi}} \cdot (x + 0.044715 \cdot x^3)\right) + \frac{0.5 \cdot x \cdot \text{sech}^2\left(\sqrt{\frac{2}{\pi}} \cdot (x + 0.044715 \cdot x^3)\right) \cdot \sqrt{\frac{2}{\pi}} \cdot (1 + 0.134145 \cdot x^2)}{1}$$ + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopGeluBackward( + infiniopGeluBackwardDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *grad_input, + const void *input, + const void *grad_output, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateGeluBackwardDescriptor()` 初始化的算子描述符。 +- `workspace`: + 额外工作空间地址。 +- `workspace_size`: + `workspace` 的大小,单位:字节。 +- `grad_input`: + 输入梯度的计算结果地址,支持原位计算。 +- `input`: + 前向传播的输入张量数据指针。 +- `grad_output`: + 输出梯度张量数据指针。 +- `stream`: + 计算流/队列。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`]. + +### 创建算子描述 + +```c +infiniStatus_t infiniopCreateGeluBackwardDescriptor( + infiniopHandle_t handle, + infiniopGeluBackwardDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t grad_input, + infiniopTensorDescriptor_t input, + infiniopTensorDescriptor_t grad_output +); +``` + +
参数:
+ +- `handle`: + 硬件控柄。详见 [`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopGeluBackwardDescriptor_t` 指针,指向将被初始化的算子描述符地址。 +- `grad_input` - { FP16 | FP32 | BF16 | (d1,...,dn) | (...) }: + 输入梯度张量描述,支持原位计算。 +- `input` - { FP16 | FP32 | BF16 | (d1,...,dn) | (...) }: + 前向传播输入张量描述。 +- `grad_output` - { FP16 | FP32 | BF16 | (d1,...,dn) | (...) }: + 输出梯度张量描述,支持原位计算。 + +参数限制: + +- 所有张量的数据类型必须相同,支持 `FP16`、`FP32`、`BF16`。 +- 所有张量的形状必须相同。 +- 支持原位计算,即计算时 `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 infiniopGetGeluBackwardWorkspaceSize( + infiniopGeluBackwardDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateGeluBackwardDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroyGeluBackwardDescriptor( + infiniopGeluBackwardDescriptor_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_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED +[`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 +[`INFINI_STATUS_NULL_POINTER`]:/common/status/README.md#INFINI_STATUS_NULL_POINTER +[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]:/common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE +[`INFINI_STATUS_INTERNAL_ERROR`]:/common/status/README.md#INFINI_STATUS_INTERNAL_ERROR \ No newline at end of file diff --git a/infiniop/ops/or/README.md b/infiniop/ops/or/README.md new file mode 100644 index 0000000..ac56926 --- /dev/null +++ b/infiniop/ops/or/README.md @@ -0,0 +1,138 @@ +# Or 算子 + +Or 算子用于执行张量的逐元素逻辑或运算。该算子参考 `torch.logical_or` 的行为。 + +## 数学定义 + +给定两个布尔张量 $a$ 和 $b$,Or 算子的计算公式为: + +$$c = \text{or}(a, b) = a \lor b$$ + +其中 $c$ 是输出张量,$a$ 和 $b$ 是输入张量。该算子支持多向广播。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopOr( + infiniopOrDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *c, + const void *a, + const void *b, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateOrDescriptor()` 初始化的算子描述符。 +- `workspace`: + 额外工作空间地址。 +- `workspace_size`: + `workspace` 的大小,单位:字节。 +- `c`: + 计算结果地址,支持原位计算。 +- `a`: + 输入张量 `a` 的数据指针。 +- `b`: + 输入张量 `b` 的数据指针。 +- `stream`: + 计算流/队列。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`]. + +### 创建算子描述 + +```c +infiniStatus_t infiniopCreateOrDescriptor( + infiniopHandle_t handle, + infiniopOrDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t c, + infiniopTensorDescriptor_t a, + infiniopTensorDescriptor_t b +); +``` + +
参数:
+ +- `handle`: + 硬件控柄。详见 [`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopOrDescriptor_t` 指针,指向将被初始化的算子描述符地址。 +- `c` - { BOOL | (d1,...,dn) | (...) }: + 算子计算参数 `c` 的张量描述,支持原位计算。 +- `a` - { BOOL | (d1,...,dn) | (...) }: + 算子计算参数 `a` 的张量描述,支持原位计算,支持多向广播。 +- `b` - { BOOL | (d1,...,dn) | (...) }: + 算子计算参数 `b` 的张量描述,支持原位计算,支持多向广播。 + +参数限制: + +- 所有张量的数据类型必须为 `Bool`。 +- 输入 `a` 与 `b` 的形状需与 `c` 相同。`a` 与 `b` 涉及多向广播时需调整步长以匹配多向广播的映射关系。 +- 支持原位计算,即计算时 `c` 可以和 `a` 或 `b` 指向同一地址。 +- 计算输出参数 `c` 不能进行广播(`c` 的步长不能涉及广播设置,即步长不能有 0)。 + +
返回值:
+ +- [`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 infiniopGetOrWorkspaceSize( + infiniopOrDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateOrDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroyOrDescriptor( + infiniopOrDescriptor_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_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED +[`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 +[`INFINI_STATUS_NULL_POINTER`]:/common/status/README.md#INFINI_STATUS_NULL_POINTER +[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]:/common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE +[`INFINI_STATUS_INTERNAL_ERROR`]:/common/status/README.md#INFINI_STATUS_INTERNAL_ERROR \ No newline at end of file diff --git a/infiniop/ops/relu_backward/README.md b/infiniop/ops/relu_backward/README.md new file mode 100644 index 0000000..ea51ca8 --- /dev/null +++ b/infiniop/ops/relu_backward/README.md @@ -0,0 +1,140 @@ +# ReLU Backward 算子 + +ReLU Backward 算子用于计算 ReLU 激活函数的反向传播梯度。该算子参考 `torch.relu` 的反向传播行为。 + +## 数学定义 + +给定输入张量 $x$ 和输出梯度 $\frac{\partial L}{\partial y}$,ReLU Backward 算子的计算公式为: + +$$\frac{\partial L}{\partial x} = \begin{cases} +\frac{\partial L}{\partial y} & \text{if } x > 0 \\ +0 & \text{if } x \leq 0 +\end{cases}$$ + +其中 $\frac{\partial L}{\partial x}$ 是输入梯度,$x$ 是前向传播的输入张量,$\frac{\partial L}{\partial y}$ 是输出梯度。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopReluBackward( + infiniopReluBackwardDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *grad_input, + const void *input, + const void *grad_output, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateReluBackwardDescriptor()` 初始化的算子描述符。 +- `workspace`: + 额外工作空间地址。 +- `workspace_size`: + `workspace` 的大小,单位:字节。 +- `grad_input`: + 输入梯度的计算结果地址,支持原位计算。 +- `input`: + 前向传播的输入张量数据指针。 +- `grad_output`: + 输出梯度张量数据指针。 +- `stream`: + 计算流/队列。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`]. + +### 创建算子描述 + +```c +infiniStatus_t infiniopCreateReluBackwardDescriptor( + infiniopHandle_t handle, + infiniopReluBackwardDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t grad_input, + infiniopTensorDescriptor_t input, + infiniopTensorDescriptor_t grad_output +); +``` + +
参数:
+ +- `handle`: + 硬件控柄。详见 [`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopReluBackwardDescriptor_t` 指针,指向将被初始化的算子描述符地址。 +- `grad_input` - { FP16 | FP32 | BF16 | (d1,...,dn) | (...) }: + 输入梯度张量描述,支持原位计算。 +- `input` - { FP16 | FP32 | BF16 | (d1,...,dn) | (...) }: + 前向传播输入张量描述。 +- `grad_output` - { FP16 | FP32 | BF16 | (d1,...,dn) | (...) }: + 输出梯度张量描述,支持原位计算。 + +参数限制: + +- 所有张量的数据类型必须相同,支持 `FP16`、`FP32`、`BF16`。 +- 所有张量的形状必须相同。 +- 支持原位计算,即计算时 `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 infiniopGetReluBackwardWorkspaceSize( + infiniopReluBackwardDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateReluBackwardDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroyReluBackwardDescriptor( + infiniopReluBackwardDescriptor_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_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED +[`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 +[`INFINI_STATUS_NULL_POINTER`]:/common/status/README.md#INFINI_STATUS_NULL_POINTER +[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]:/common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE +[`INFINI_STATUS_INTERNAL_ERROR`]:/common/status/README.md#INFINI_STATUS_INTERNAL_ERROR \ No newline at end of file diff --git a/infiniop/ops/silu/README.md b/infiniop/ops/silu/README.md new file mode 100644 index 0000000..cf4c227 --- /dev/null +++ b/infiniop/ops/silu/README.md @@ -0,0 +1,130 @@ +# Silu 算子 + +Silu(Sigmoid Linear Unit)算子是一种激活函数,也被称为 Swish 激活函数。该算子参考 `torch.silu` 的行为。 + +## 数学定义 + +给定输入张量 $x$,Silu 算子的计算公式为: + +$$\text{silu}(x) = x \cdot \sigma(x) = x \cdot \frac{1}{1 + e^{-x}}$$ + +其中 $\sigma(x)$ 是 sigmoid 函数。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopSilu( + infiniopSiluDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *output, + const void *input, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateSiluDescriptor()` 初始化的算子描述符。 +- `workspace`: + 额外工作空间地址。 +- `workspace_size`: + `workspace` 的大小,单位:字节。 +- `output`: + 计算结果地址,当与 `input` 相同时为原地操作。 +- `input`: + 输入张量的数据指针。 +- `stream`: + 计算流/队列。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`]. + +### 创建算子描述 + +```c +infiniStatus_t infiniopCreateSiluDescriptor( + infiniopHandle_t handle, + infiniopSiluDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output, + infiniopTensorDescriptor_t input +); +``` + +
参数:
+ +- `handle`: + 硬件控柄。详见 [`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopSiluDescriptor_t` 指针,指向将被初始化的算子描述符地址。 +- `output` - { dT | (d1,...,dn) | (...) }: + 计算结果 `output` 的张量描述,支持原位计算。 +- `input` - { dT | (d1,...,dn) | (...) }: + 输入张量 `input` 的张量描述。 + +参数限制: + +- `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_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 计算额外工作空间 + +```c +infiniStatus_t infiniopGetSiluWorkspaceSize( + infiniopSiluDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateSiluDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroySiluDescriptor( + infiniopSiluDescriptor_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_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED +[`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_NULL_POINTER`]:/common/status/README.md#INFINI_STATUS_NULL_POINTER +[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]:/common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE +[`INFINI_STATUS_INTERNAL_ERROR`]:/common/status/README.md#INFINI_STATUS_INTERNAL_ERROR \ No newline at end of file