diff --git a/infiniop/ops/README.md b/infiniop/ops/README.md index 0633ec6..2435cb5 100644 --- a/infiniop/ops/README.md +++ b/infiniop/ops/README.md @@ -12,3 +12,12 @@ - [`Softmax`](/infiniop/ops/softmax/README.md) - [`Sub`](/infiniop/ops/sub/README.md) - [`SwiGLU`](/infiniop/ops/swiglu/README.md) +- [`Silu`](/infiniop/ops/silu/README.md) +- [`Div`](/infiniop/ops/div/README.md) +- [`And`](/infiniop/ops/and/README.md) +- [`Or`](/infiniop/ops/or/README.md) +- [`Equal`](/infiniop/ops/equal/README.md) +- [`ReLU Backward`](/infiniop/ops/relu_backward/README.md) +- [`GeLU`](/infiniop/ops/gelu/README.md) +- [`GeLU Backward`](/infiniop/ops/gelu_backward/README.md) +- [`CrossEntropyLoss Backward`](/infiniop/ops/cross_entropy_loss_backward/README.md) \ No newline at end of file diff --git a/infiniop/ops/and/README.md b/infiniop/ops/and/README.md new file mode 100644 index 0000000..8985ae1 --- /dev/null +++ b/infiniop/ops/and/README.md @@ -0,0 +1,137 @@ +# `And` + +`And`,即**逻辑与**算子,为双目逐元素算子。其计算可表述为: + +$$ +c = a \land b +$$ + +其中 `a` 和 `b` 为输入,`c` 为输出布尔张量。 + +## 接口 + +### 计算 + +```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`: + 输入张量。张量限制见[创建算子描述](#创建算子描述)部分; +- `b`: + 输入张量。张量限制见[创建算子描述](#创建算子描述)部分; +- `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 infiniopCreateAndDescriptor( + infiniopHandle_t handle, + infiniopAndDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t c_desc, + infiniopTensorDescriptor_t a_desc, + infiniopTensorDescriptor_t b_desc +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopAndDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `c_desc` - { Bool | (d1,...,dn) | (...) }: + 算子计算参数 `c` 的张量描述,支持原位计算。 +- `a_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `a` 的张量描述,支持原位计算,支持多向广播。 +- `b_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `b` 的张量描述,支持原位计算,支持多向广播。 + +参数限制: + +- `dT`: (`Float16`, `Float32`, `Float64`, `BFloat16`,`Bool`,`Int8`, `Int16`, `Int32`, `Int64`,`Uint8`, `Uint16`, `Uint32`, `Uint64`) 之一。 +- 输入 `a` 与 `b` 的形状需与 `c` 相同。`a` 与 `b` 涉及多向广播时需调整步长以匹配多向广播的映射关系。 +- 支持原位计算,即计算时 `c` 可以和 `a` 或 `b` 指向同一地址(仅`a`和`b`同为Bool类型)。当`a`或`b`不为Bool类型时,不支持原位计算。 +- 计算输出参数 `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_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 diff --git a/infiniop/ops/cross_entropy_loss_backward/README.md b/infiniop/ops/cross_entropy_loss_backward/README.md new file mode 100644 index 0000000..eeb6c91 --- /dev/null +++ b/infiniop/ops/cross_entropy_loss_backward/README.md @@ -0,0 +1,137 @@ +# `CrossEntropyLoss Backward` + +`CrossEntropyLoss Backward`,即 **交叉熵损失*- 的反向算子。梯度按元素计算如下(假设 `probs` 为已归一化的类别概率,`target` 为与 `logits` 同形状的 one-hot 张量): + +$$ +\textbf{grad\_logits}=\frac{\textbf{probs}-\textbf{target}}{N}, +$$ + +其中 $N$ 为归一化因子(常见取法:对批量求平均时 $N=$ 批大小;逐样本/逐位置计算时可取 $N=1$)。 + +`probs` 与 `target` 为输入,`grad_logits` 为输出。 + +## 接口 + +### 计算 + +```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`: + 输出张量(∂L/∂logits)。张量限制见[创建算子描述](#创建算子描述)部分; +- `probs`: + 概率张量(通常为 softmax 输出)。张量限制见[创建算子描述](#创建算子描述)部分; +- `target`: + one-hot 目标张量(形状与 `logits` 相同)。张量限制见[创建算子描述](#创建算子描述)部分; +- `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 infiniopCreateCrossEntropyLossBackwardDescriptor( + infiniopHandle_t handle, + infiniopCrossEntropyLossBackwardDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t grad_logits_desc, + infiniopTensorDescriptor_t probs_desc, + infiniopTensorDescriptor_t target_desc +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopCrossEntropyLossBackwardDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `grad_logits_desc` - { dT | (d1,...,dn) | (...) }: + 输出 `grad_logits` 的张量描述,支持原位计算; +- `probs_desc` - { dT | (d1,...,dn) | (...) }: + 输入 `probs` 的张量描述,支持原位计算; +- `target_desc` - { dT | (d1,...,dn) | (...) }: + 输入 `target` 的张量描述,支持原位计算; + +参数限制: + +- `dT`: (`Float16`, `Float32`, `Float64`, `BFloat16`) 之一。 +- 输入 `probs` 与 `target` 的形状需与 `grad_logits` 相同。 +- 支持原位计算,即计算时`grad_logits` 可与 `probs` 或 `target` 指向同一地址。 + +
返回值:
+ +- [`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_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 diff --git a/infiniop/ops/div/README.md b/infiniop/ops/div/README.md new file mode 100644 index 0000000..4163514 --- /dev/null +++ b/infiniop/ops/div/README.md @@ -0,0 +1,137 @@ +# `Div` + +`Div`,即**除法**算子,为**双目逐元素**算子。其计算可被表述为: + +$$ +c = a \div b +$$ + +其中 `a` 和 `b` 为输入,`c` 为输出。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopDiv( + infiniopDivDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *c, + const void *a, + const void *b, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateMulDescriptor()` 初始化的算子描述符; +- `workspace`: + 指向算子计算所需的额外工作空间; +- `workspace_size`: + `workspace` 的大小,单位:字节; +- `c`: + 输出张量。张量限制见创建算子描述部分; +- `a`: + 输入张量。张量限制见创建算子描述部分; +- `b`: + 输入张量。张量限制见创建算子描述部分; +- `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 infiniopCreateDivDescriptor( + infiniopHandle_t handle, + infiniopDivDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t c_desc, + infiniopTensorDescriptor_t a_desc, + infiniopTensorDescriptor_t b_desc +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopMulDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `c_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `c` 的张量描述,支持原位计算。 +- `a_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `a` 的张量描述,支持原位计算,支持多向广播。 +- `b_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `b` 的张量描述,支持原位计算,支持多向广播。 + +参数限制: + +- `dT`: (`Float16`, `Float32`, `Float64`, `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_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 diff --git a/infiniop/ops/equal/README.md b/infiniop/ops/equal/README.md new file mode 100644 index 0000000..f46e57c --- /dev/null +++ b/infiniop/ops/equal/README.md @@ -0,0 +1,137 @@ +# `Equal` + +`Equal`,即**相等比较**算子,为双目逐元素算子。其计算可被表述为: + +$$ +c = (a == b) +$$ + +其中 `a` 与 `b` 为输入张量,`c` 为输出布尔张量(元素值为 `true` 或 `false`)。 + +## 接口 + +### 计算 + +```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`: + 输入张量。张量限制见[创建算子描述](#创建算子描述)部分; +- `b`: + 输入张量。张量限制见[创建算子描述](#创建算子描述)部分; +- `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 infiniopCreateEqualDescriptor( + infiniopHandle_t handle, + infiniopEqualDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t c_desc, + infiniopTensorDescriptor_t a_desc, + infiniopTensorDescriptor_t b_desc +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopEqualDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `c_desc` - { Bool | (d1,...,dn) | (...) }: + 算子计算参数 `c` 的张量描述,支持原位计算。 +- `a_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `a` 的张量描述,支持原位计算,支持多向广播。 +- `b_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `b` 的张量描述,支持原位计算,支持多向广播。 + +参数限制: + +- `dT`: (`Float16`, `Float32`, `Float64`, `BFloat16`,`Bool`,`Int8`, `Int16`, `Int32`, `Int64`,`Uint8`, `Uint16`, `Uint32`, `Uint64`) 之一。 +- 输入 `a` 与 `b` 的形状需与 `c` 相同。`a` 与 `b` 涉及多向广播时需调整步长以匹配多向广播的映射关系。 +- 支持原位计算,即计算时 `c` 可以和 `a` 或 `b` 指向同一地址(仅`a`和`b`同为Bool类型)。当`a`或`b`不为Bool类型时,不支持原位计算。 +- 计算输出参数 `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 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_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 diff --git a/infiniop/ops/gelu/README.md b/infiniop/ops/gelu/README.md new file mode 100644 index 0000000..18c5c39 --- /dev/null +++ b/infiniop/ops/gelu/README.md @@ -0,0 +1,130 @@ +# `GELU` + +`GELU`(Gaussian Error Linear Unit),为单目逐元素激活算子。本实现采用**近似形式**,参考 `torch.nn.functional.gelu` 的 tanh 近似: + +$$ +\mathrm{GELU}(x)\approx \tfrac{1}{2}\,x\left(1+\tanh\!\Big(\sqrt{\tfrac{2}{\pi}}\,(x+0.044715\,x^{3})\Big)\right) +$$ + +其中 `input` 为输入,`output` 为输出。 + +## 接口 + +### 计算 + +```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_BAD_PARAM`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`],[`INFINI_STATUS_BAD_TENSOR_DTYPE`]. + +### 创建算子描述 + +```c +infiniStatus_t infiniopCreateGELUDescriptor( + infiniopHandle_t handle, + infiniopGELUDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output_desc, + infiniopTensorDescriptor_t input_desc +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopGELUDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `output_desc` - { dT | (d1,...,dn) | (...) }: + 参数 `output` 的张量描述,支持原位计算。 +- `input_desc` - { dT | (d1,...,dn) | (...) }: + 参数 `input` 的张量描述,支持原位计算。 + +参数限制: + +- `dT`: (`Float16`, `Float32`, `BFloat16`) 之一。 +- `output` 的形状与步长需与 `input` 对应(逐元素一一映射);不涉及广播。 +- 支持原位计算,即计算时 `output` 可以与 `input` 指向同一地址。 +- 计算输出参数 `output` 不能进行广播(其步长不得为 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 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_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 diff --git a/infiniop/ops/gelu_backward/README.md b/infiniop/ops/gelu_backward/README.md new file mode 100644 index 0000000..0dce7f1 --- /dev/null +++ b/infiniop/ops/gelu_backward/README.md @@ -0,0 +1,140 @@ +# `GeLU Backward` + +`GeLU Backward`,即 **高斯误差线性单元** 的反向算子。其梯度计算采用近似实现(tanh 近似)并逐元素进行: + +$$ +\begin{aligned} +\text{GeLU}(x) &\approx \tfrac12 x\left(1+\tanh\big(u\big)\right), \\ +u &= \alpha\,(x + \beta x^3),\quad \alpha=\sqrt{2/\pi},\ \beta=0.044715, \\ +\frac{d\,\text{GeLU}(x)}{dx} &\approx \tfrac12\left(1+\tanh(u)\right) + \tfrac12 x\,\text{sech}^2(u)\,\alpha\,(1+3\beta x^2), \\ +\textbf{grad\_input} &= \textbf{grad\_output}\ \odot\ \frac{d\,\text{GeLU}(\textbf{input})}{d\,\textbf{input}}. +\end{aligned} +$$ + +其中 `input` 与 `grad_output` 为输入,`grad_input` 为输出。 + +## 接口 + +### 计算 + +```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`: + 输出张量(∂L/∂input)。张量限制见[创建算子描述](#创建算子描述)部分; +- `input`: + 前向输入张量 `x`。张量限制见[创建算子描述](#创建算子描述)部分; +- `grad_output`: + 上游梯度张量(∂L/∂GeLU(x))。张量限制见[创建算子描述](#创建算子描述)部分; +- `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 infiniopCreateGeluBackwardDescriptor( + infiniopHandle_t handle, + infiniopGeluBackwardDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t grad_input_desc, + infiniopTensorDescriptor_t input_desc, + infiniopTensorDescriptor_t grad_output_desc +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopGeluBackwardDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `grad_input_desc` - { dT | (d1,...,dn) | (...) }: + 算子输出 `grad_input` 的张量描述,支持原位计算; +- `input_desc` - { dT | (d1,...,dn) | (...) }: + 算子输入 `input` 的张量描述,支持原位计算; +- `grad_output_desc` - { dT | (d1,...,dn) | (...) }: + 算子输入 `grad_output` 的张量描述,支持原位计算; + +参数限制: + +- `dT`: (`Float16`, `Float32`, `BFloat16`) 之一。 +- 输入 `grad_output` 与 `input` 的形状需与 `grad_input` 相同。 +- 支持原位计算,即计算时 `grad_input` 可以和 `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_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 diff --git a/infiniop/ops/or/README.md b/infiniop/ops/or/README.md new file mode 100644 index 0000000..921c294 --- /dev/null +++ b/infiniop/ops/or/README.md @@ -0,0 +1,137 @@ +# `Or` + +`Or`,即**逻辑或**算子,为双目逐元素算子。其计算可被表述为: + +$$ +c = a \lor b +$$ + +其中 `a` 和 `b` 为输入,`c` 为输出。 + +## 接口 + +### 计算 + +```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`: + 输入张量。张量限制见[创建算子描述](#创建算子描述)部分; +- `b`: + 输入张量。张量限制见[创建算子描述](#创建算子描述)部分; +- `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 infiniopCreateOrDescriptor( + infiniopHandle_t handle, + infiniopOrDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t c_desc, + infiniopTensorDescriptor_t a_desc, + infiniopTensorDescriptor_t b_desc +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopOrDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `c_desc` - { Bool | (d1,...,dn) | (...) }: + 算子计算参数 `c` 的张量描述,支持原位计算。 +- `a_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `a` 的张量描述,支持原位计算,支持多向广播。 +- `b_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `b` 的张量描述,支持原位计算,支持多向广播。 + +参数限制: + +- `dT`: (`Float16`, `Float32`, `Float64`, `BFloat16`,`Bool`,`Int8`, `Int16`, `Int32`, `Int64`,`Uint8`, `Uint16`, `Uint32`, `Uint64`) 之一。 +- 输入 `a` 与 `b` 的形状需与 `c` 相同。`a` 与 `b` 涉及多向广播时需调整步长以匹配多向广播的映射关系。 +- 支持原位计算,即计算时 `c` 可以和 `a` 或 `b` 指向同一地址(仅`a`和`b`同为Bool类型)。当`a`或`b`不为Bool类型时,不支持原位计算。 +- 计算输出参数 `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_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 diff --git a/infiniop/ops/relu_backward/README.md b/infiniop/ops/relu_backward/README.md new file mode 100644 index 0000000..bdf6984 --- /dev/null +++ b/infiniop/ops/relu_backward/README.md @@ -0,0 +1,148 @@ +# `ReLU Backward` + +`ReLU Backward`,即 **线性整流单元** 的反向算子。其梯度计算为: + +$$ +\operatorname{ReLU}(x)=\max(0,x),\quad +\frac{d\,\operatorname{ReLU}(x)}{dx}= +\begin{cases} +1, & x>0\\ +0, & x\le 0 +\end{cases} +$$ + +$$ +\textbf{grad\_input}=\textbf{grad\_output}\odot \mathbf{1}\{\textbf{input}>0\}. +$$ + +(在不可导点 $x=0$ 处采用 0 的次梯度约定。) + +其中 `input` 与 `grad_output` 为输入,`grad_input` 为输出。 + +## 接口 + +### 计算 + +```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`: + 输出张量(∂L/∂input)。张量限制见[创建算子描述](#创建算子描述)部分; +- `input`: + 前向输入张量 `x`。张量限制见[创建算子描述](#创建算子描述)部分; +- `grad_output`: + 上游梯度张量(∂L/∂ReLU(x))。张量限制见[创建算子描述](#创建算子描述)部分; +- `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 infiniopCreateReluBackwardDescriptor( + infiniopHandle_t handle, + infiniopReluBackwardDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t grad_input_desc, + infiniopTensorDescriptor_t input_desc, + infiniopTensorDescriptor_t grad_output_desc +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopReluBackwardDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `grad_input_desc` - { dT | (d1,...,dn) | (...) }: + 算子输出 `grad_input` 的张量描述,支持原位计算; +- `input_desc` - { dT | (d1,...,dn) | (...) }: + 算子输入 `input` 的张量描述,支持原位计算; +- `grad_output_desc` - { dT | (d1,...,dn) | (...) }: + 算子输入 `grad_output` 的张量描述,支持原位计算; + +参数限制: + +- `dT`: (`Float16`, `Float32`, `Float64`, `BFloat16`) 之一。 +- 输入 `grad_output` 与 `input` 的形状需与 `grad_input` 相同。 +- 支持原位计算,即计算时 `grad_input` 可以和 `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_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 diff --git a/infiniop/ops/silu/README.md b/infiniop/ops/silu/README.md new file mode 100644 index 0000000..424e57c --- /dev/null +++ b/infiniop/ops/silu/README.md @@ -0,0 +1,130 @@ +# `SiLU` + +`SiLU`(Sigmoid Linear Unit),为单目逐元素激活算子。其计算可被表述为: + +$$ +\mathrm{SiLU}(x)=x\cdot\sigma(x),\quad \sigma(x)=\frac{1}{1+e^{-x}} +$$ + +其中 `input` 为输入,`output` 为输出。 + +## 接口 + +### 计算 + +```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`: + 输入张量。张量限制见[创建算子描述](#创建算子描述)部分; +- `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 infiniopCreateSiLUDescriptor( + infiniopHandle_t handle, + infiniopSiLUDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output_desc, + infiniopTensorDescriptor_t input_desc +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopSiLUDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `output_desc` - { dT | (d1,...,dn) | (...) }: + 参数 `output` 的张量描述,支持原位计算。 +- `input_desc` - { dT | (d1,...,dn) | (...) }: + 参数 `input` 的张量描述,支持原位计算。 + +参数限制: + +- `dT`: (`Float16`, `Float32`, `BFloat16`) 之一。 +- `output` 的形状与步长需与 `input` 对应(逐元素一一映射);不涉及广播。 +- 支持原位计算,即计算时 `output` 可以与 `input` 指向同一地址。 +- 计算输出参数 `output` 不能进行广播(其步长不得为 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 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_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