diff --git a/infiniop/ops/README.md b/infiniop/ops/README.md index 0633ec6..35e4690 100644 --- a/infiniop/ops/README.md +++ b/infiniop/ops/README.md @@ -3,12 +3,21 @@ - [`Add`](/infiniop/ops/add/README.md) - [`Causal Softmax`](/infiniop/ops/causal_softmax/README.md) - [`Clip`](/infiniop/ops/clip/README.md) +- [`CrossEntropyLoss Backward`](/infiniop/ops/crossentropyloss_backward/README.md) +- [`Div`](/infiniop/ops/div/README.md) +- [`GELU`](/infiniop/ops/gelu/README.md) +- [`GELU Backward`](/infiniop/ops/gelu_backward/README.md) - [`GEMM`](/infiniop/ops/gemm/README.md) +- [`Logical And`](/infiniop/ops/logical_and/README.md) +- [`Logical Equal`](/infiniop/ops/logical_equal/README.md) +- [`Logical Or`](/infiniop/ops/logical_or/README.md) - [`Mul`](/infiniop/ops/mul/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/crossentropyloss_backward/README.md b/infiniop/ops/crossentropyloss_backward/README.md new file mode 100644 index 0000000..57c4c8e --- /dev/null +++ b/infiniop/ops/crossentropyloss_backward/README.md @@ -0,0 +1,139 @@ +# `CrossEntropyLoss Backward` + +`CrossEntropyLoss Backward`,即 **交叉熵损失函数反向传播**算子,计算交叉熵损失函数的梯度。 +计算为: +$$grad\_logits = (probs - target) / N$$ +其中probs为概率,target为形状与logits相同的one-hot张量 +## 接口 + +### 计算 + +```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_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, + int64_t reduction, + int64_t ignore_index +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopCrossEntropyLossBackwardDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `grad_logits_desc` - { dT | (N, C) | (...) }: + 算子计算参数 `grad_logits` 的张量描述。 +- `probs_desc` - { dT | (N, C) | (...) }: + 算子计算参数 `probs` 的张量描述。 +- `target_desc` - { iT | (N,) | (...) }: + 算子计算参数 `target` 的张量描述。 +- `reduction`: + 损失缩减方式。0: 无缩减,1: 求平均,2: 求和。 +- `ignore_index`: + 忽略的目标索引值,通常用于忽略填充标记。 + +参数限制: + +- `dT`: (`Float16`, `Float32`, `Float64`, `BFloat16`) 之一。 +- `iT`: (`Int32`, `Int64`) 之一。 +- `probs` 张量形状为 (N, C),其中 N 为批次大小,C 为类别数。 +- `target` 张量形状为 (N,),包含类别索引。 +- `grad_logits` 张量形状为 (N, C),与 `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_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..326c14a --- /dev/null +++ b/infiniop/ops/div/README.md @@ -0,0 +1,144 @@ +# `Div` + +`Div`, 即**除法**算子,为双目逐元素算子。其计算可被表述为: + +$$ c = \frac{a}{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, + const void *mode, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateDivDescriptor()` 初始化的算子描述符; +- `workspace`: + 指向算子计算所需的额外工作空间; +- `workspace_size`: + `workspace` 的大小,单位:字节; +- `c`: + 输出张量。张量限制见[创建算子描述](#创建算子描述)部分; +- `a`: + 输入张量(被除数)。张量限制见[创建算子描述](#创建算子描述)部分; +- `b`: + 输入张量(除数)。张量限制见[创建算子描述](#创建算子描述)部分; +- 'mode': + 除法模式,0为默认除法,1为trunc截断除法,2为floor向下取整, + 在python层以如下代码封装 +``` + class InfiniDivMode(IntEnum): + DEFAULT = 0 + TRUNC = 1 + FLOOR = 2 +``` +- `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`: + `infiniopDivDescriptor_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/gelu/README.md b/infiniop/ops/gelu/README.md new file mode 100644 index 0000000..9e64501 --- /dev/null +++ b/infiniop/ops/gelu/README.md @@ -0,0 +1,134 @@ +# `GELU` + +`GELU` (Gaussian Error Linear Unit),即 **GELU 激活函数**算子,为单目逐元素算子。其计算可被表述为: + +$$ y = x \cdot \Phi(x) = x \cdot \frac{1}{2}(1 + \text{erf}(\frac{x}{\sqrt{2}})) $$ + +或者近似计算: + +$$ y = x \cdot \sigma(1.702 \cdot x) $$ + +其中 `x` 为输入,`y` 为输出,$\Phi(x)$ 为标准正态分布的累积分布函数。我们的实现为近似计算 + +## 接口 + +### 计算 + +```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, + bool approximate +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopGeluDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `output_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `output` 的张量描述,支持原位计算。 +- `input_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `input` 的张量描述,支持原位计算。 +- `approximate`: + 是否使用近似计算。`true` 表示使用 tanh 近似,`false` 表示使用精确的 erf 计算。 + +参数限制: + +- `dT`: (`Float16`, `Float32`, `Float64`, `BFloat16`) 之一。 +- 输入 `input` 与输出 `output` 的形状需相同。 +- 支持原位计算,即计算时 `output` 可以和 `input` 指向同一地址。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 计算额外工作空间 + +```c +infiniStatus_t 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..ce806a5 --- /dev/null +++ b/infiniop/ops/gelu_backward/README.md @@ -0,0 +1,143 @@ +# `GELU Backward` + +`GELU Backward`,即 **GELU 激活函数反向传播**算子,计算 GELU 函数的梯度。其计算可被表述为: + +$$ \frac{\partial}{\partial x} \text{GELU}(x) = \Phi(x) + x \cdot \phi(x) $$ + +其中 $\Phi(x)$ 为标准正态分布的累积分布函数,$\phi(x)$ 为标准正态分布的概率密度函数。 +采取近似计算 + +$$ \text{GELU}(x) = 0.5 \times x \times (1 + \text{Tanh}(\sqrt{\frac{2}{\pi}} \times (x + 0.044715 \times x^3))) $$ +令 +$$inner(x) =\sqrt{\frac{2}{\pi}} \times (x + 0.044715 \times x^3) $$ +那么 +$$ \frac{\partial}{\partial x} \text{GELU}(x)= 0.5 \times [ (1 + \text{Tanh}(inner)) + x \times ( 1- \text{Tanh}^2(inner)\times \frac{\partial }{\partial x}inner) ]$$ + +## 接口 + +### 计算 + +```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_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, + bool approximate +); +``` + +
参数:
+ +- `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` 的张量描述,支持原位计算。 +- `approximate`: + 是否使用近似计算。`true` 表示使用 tanh 近似,`false` 表示使用精确的 erf 计算。 + +参数限制: + +- `dT`: (`Float16`, `Float32`, `Float64`, `BFloat16`) 之一。 +- 所有张量的形状需相同。 +- 支持原位计算,即计算时 `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_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/logical_and/README.md b/infiniop/ops/logical_and/README.md new file mode 100644 index 0000000..b157c9f --- /dev/null +++ b/infiniop/ops/logical_and/README.md @@ -0,0 +1,134 @@ +# `Logical And` + +`Logical And`, 即**逻辑与**算子,为双目逐元素算子。其计算可被表述为: + +$$ c = a \land b $$ + +其中 `a` 和 `b` 为输入,`c` 为输出。对于非零元素视为 `true`,零元素视为 `false`。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopLogicalAnd( + infiniopLogicalAndDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *c, + const void *a, + const void *b, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateLogicalAndDescriptor()` 初始化的算子描述符; +- `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 infiniopCreateLogicalAndDescriptor( + infiniopHandle_t handle, + infiniopLogicalAndDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t c_desc, + infiniopTensorDescriptor_t a_desc, + infiniopTensorDescriptor_t b_desc +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopLogicalAndDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `c_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `c` 的张量描述,支持原位计算。 +- `a_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `a` 的张量描述,支持原位计算,支持多向广播。 +- `b_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `b` 的张量描述,支持原位计算,支持多向广播。 + +参数限制: + +- `dT`: (`Bool`, `Int8`, `Int16`, `Int32`, `Int64`, `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 infiniopGetLogicalAndWorkspaceSize( + infiniopLogicalAndDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateLogicalAndDescriptor()` 初始化的算子描述符; +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroyLogicalAndDescriptor( + infiniopLogicalAndDescriptor_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/logical_equal/README.md b/infiniop/ops/logical_equal/README.md new file mode 100644 index 0000000..e690d8d --- /dev/null +++ b/infiniop/ops/logical_equal/README.md @@ -0,0 +1,134 @@ +# `Logical Equal` + +`Logical Equal`, 即**逻辑相等**算子,为双目逐元素算子。其计算可被表述为: + +$$ c = (a == b) $$ + +其中 `a` 和 `b` 为输入,`c` 为输出。对于相等的元素输出 `true`(1),不相等的元素输出 `false`(0)。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopLogicalEqual( + infiniopLogicalEqualDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *c, + const void *a, + const void *b, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateLogicalEqualDescriptor()` 初始化的算子描述符; +- `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 infiniopCreateLogicalEqualDescriptor( + infiniopHandle_t handle, + infiniopLogicalEqualDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t c_desc, + infiniopTensorDescriptor_t a_desc, + infiniopTensorDescriptor_t b_desc +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopLogicalEqualDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `c_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `c` 的张量描述,支持原位计算。 +- `a_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `a` 的张量描述,支持原位计算,支持多向广播。 +- `b_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `b` 的张量描述,支持原位计算,支持多向广播。 + +参数限制: + +- `dT`: (`Bool`, `Int8`, `Int16`, `Int32`, `Int64`, `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 infiniopGetLogicalEqualWorkspaceSize( + infiniopLogicalEqualDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateLogicalEqualDescriptor()` 初始化的算子描述符; +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroyLogicalEqualDescriptor( + infiniopLogicalEqualDescriptor_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/logical_or/README.md b/infiniop/ops/logical_or/README.md new file mode 100644 index 0000000..44a8166 --- /dev/null +++ b/infiniop/ops/logical_or/README.md @@ -0,0 +1,134 @@ +# `Logical Or` + +`Logical Or`, 即**逻辑或**算子,为双目逐元素算子。其计算可被表述为: + +$$ c = a \lor b $$ + +其中 `a` 和 `b` 为输入,`c` 为输出。对于非零元素视为 `true`,零元素视为 `false`。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopLogicalOr( + infiniopLogicalOrDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *c, + const void *a, + const void *b, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateLogicalOrDescriptor()` 初始化的算子描述符; +- `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 infiniopCreateLogicalOrDescriptor( + infiniopHandle_t handle, + infiniopLogicalOrDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t c_desc, + infiniopTensorDescriptor_t a_desc, + infiniopTensorDescriptor_t b_desc +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopLogicalOrDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `c_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `c` 的张量描述,支持原位计算。 +- `a_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `a` 的张量描述,支持原位计算,支持多向广播。 +- `b_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `b` 的张量描述,支持原位计算,支持多向广播。 + +参数限制: + +- `dT`: (`Bool`, `Int8`, `Int16`, `Int32`, `Int64`, `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 infiniopGetLogicalOrWorkspaceSize( + infiniopLogicalOrDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateLogicalOrDescriptor()` 初始化的算子描述符; +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroyLogicalOrDescriptor( + infiniopLogicalOrDescriptor_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..e69de29 diff --git a/infiniop/ops/silu/README.md b/infiniop/ops/silu/README.md new file mode 100644 index 0000000..d7b6d54 --- /dev/null +++ b/infiniop/ops/silu/README.md @@ -0,0 +1,127 @@ +# `SiLU` + +`SiLU` (Sigmoid Linear Unit),即 **Swish 激活函数**算子,为单目逐元素算子。其计算可被表述为: + +$$ y = x \cdot \sigma(x) = x \cdot \frac{1}{1 + e^{-x}} $$ + +其中 `x` 为输入,`y` 为输出,$\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`: + 输入张量。张量限制见[创建算子描述](#创建算子描述)部分; +- `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`, `Float64`, `BFloat16`) 之一。 +- 输入 `input` 与输出 `output` 的形状需相同。 +- 支持原位计算,即计算时 `output` 可以和 `input` 指向同一地址。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 计算额外工作空间 + +```c +infiniStatus_t 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