diff --git a/infiniop/ops/Cos/Cos.md b/infiniop/ops/Cos/Cos.md new file mode 100644 index 0000000..a102537 --- /dev/null +++ b/infiniop/ops/Cos/Cos.md @@ -0,0 +1,134 @@ + +# Cos + +Cos, 即**余弦运算**算子,为单目逐元素算子。其计算可被表述为: + +$$ +output = e^{input} +$$ + +其中 `input` 和 为输入,`output` 为输出。 + +## 接口 + +### 计算 + +```c + +infiniStatus_t infiniopExp( + infiniopExpDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *output, + const void *input, + void *stream +); + +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateAddDescriptor()` 初始化的算子描述符; +- `workspace`: + 指向算子计算所需的额外工作空间; +- `workspace_size`: + `workspace` 的大小,单位:字节; +- `output`: + 输出张量。张量限制见[创建算子描述](#创建算子描述)部分; +- `input`: + 输入张量。张量限制见[创建算子描述](#创建算子描述)部分; +- `stream`: + 计算流/队列; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`]. + +### 创建算子描述 + +```c +infiniStatus_t infiniopCreateExpDescriptor( + infiniopHandle_t handle, + infiniopAddDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output_desc, + infiniopTensorDescriptor_t input_desc, +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- output_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 output` 的张量描述,支持原位计算。 +- input_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 input` 的张量描述,支持原位计算。 + + + +参数限制: + +- `dT`: (`Float16`, `Float32`, `BFloat16`) 之一。 +- 输入 `input ` 的形状需与 `output` 相同。 +- 支持原位计算,即计算时`input` 可以和 `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 infiniopGetAddWorkspaceSize( + infiniopAddDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateAddDescriptor()` 初始化的算子描述符; +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroyAddDescriptor( + infiniopAddDescriptor_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/Exp/Exp.md b/infiniop/ops/Exp/Exp.md new file mode 100644 index 0000000..7f4fc34 --- /dev/null +++ b/infiniop/ops/Exp/Exp.md @@ -0,0 +1,134 @@ + +# Exp + +Exp, 即**指数运算**算子,为单目逐元素算子。其计算可被表述为: + +$$ +output = cos({input}) +$$ + +其中 `input` 和 为输入,`output` 为输出。 + +## 接口 + +### 计算 + +```c + +infiniStatus_t infiniopCos( + infiniopCosDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *output, + const void *input, + void *stream +); + +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateAddDescriptor()` 初始化的算子描述符; +- `workspace`: + 指向算子计算所需的额外工作空间; +- `workspace_size`: + `workspace` 的大小,单位:字节; +- `output`: + 输出张量。张量限制见[创建算子描述](#创建算子描述)部分; +- `input`: + 输入张量。张量限制见[创建算子描述](#创建算子描述)部分; +- `stream`: + 计算流/队列; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`]. + +### 创建算子描述 + +```c +infiniStatus_t infiniopCreateCosDescriptor( + infiniopHandle_t handle, + infiniopCosDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output, + infiniopTensorDescriptor_t input +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- output_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 output` 的张量描述,支持原位计算。 +- input_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 input` 的张量描述,支持原位计算。 + + + +参数限制: + +- `dT`: (`Float16`, `Float32`, `BFloat16`) 之一。 +- 输入 `input ` 的形状需与 `output` 相同。 +- 支持原位计算,即计算时`input` 可以和 `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 infiniopGetCosWorkspaceSize( + infiniopCosDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateAddDescriptor()` 初始化的算子描述符; +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroyCosDescriptor( + infiniopCosDescriptor_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/LeakyRelu/LeakyReLU.md b/infiniop/ops/LeakyRelu/LeakyReLU.md new file mode 100644 index 0000000..08525b5 --- /dev/null +++ b/infiniop/ops/LeakyRelu/LeakyReLU.md @@ -0,0 +1,148 @@ + +# LeakyReLU + +LeakyReLU, 即 **非线性激活函数**算子,为单目逐元素算子。其计算可被表述为: + +$$ +output = \text{LeakyReLU}({input}) = +\begin{cases} +{input}, & \text{if } {input} \geq 0 \\ +{negative\\_slope}* {input}, & \text{if } {input} < 0 +\end{cases} +$$ + +其中 `input` 和 为输入,`output` 为输出, `negative_slope`为构建函数时的常数。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopLeakyRelu( + infiniopLeakyReluDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *output, + const void *input, + float negative_slope, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateAddDescriptor()` 初始化的算子描述符; + +- `workspace`: + 指向算子计算所需的额外工作空间; + +- `workspace_size`: + `workspace` 的大小,单位:字节; + +- `output`: + 输出张量。张量限制见[创建算子描述](#创建算子描述)部分; + +- `input`: + 输入张量。张量限制见[创建算子描述](#创建算子描述)部分; + +- `negative_slope` + + 常量,构建函数时设置 + +- `stream`: + 计算流/队列; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`]. + +### 创建算子描述 + +```c +infiniStatus_t infiniopCreateLeakyReluDescriptor( + infiniopHandle_t handle, + infiniopLeakyReluDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output, + infiniopTensorDescriptor_t input +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- output_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 output` 的张量描述,支持原位计算。 +- input_desc` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 input` 的张量描述,支持原位计算。 + + + +参数限制: + +- `dT`: (`Float16`, `Float32`, `BFloat16`) 之一。 +- 输入 `input ` 的形状需与 `output` 相同。 +- 支持原位计算,即计算时`input` 可以和 `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 infiniopGetLeakyReluWorkspaceSize( + infiniopLeakyReluDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateAddDescriptor()` 初始化的算子描述符; +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroyLeakyReluDescriptor( + infiniopLeakyReluDescriptor_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/README.md b/infiniop/ops/README.md index 0633ec6..3e1db1f 100644 --- a/infiniop/ops/README.md +++ b/infiniop/ops/README.md @@ -12,3 +12,13 @@ - [`Softmax`](/infiniop/ops/softmax/README.md) - [`Sub`](/infiniop/ops/sub/README.md) - [`SwiGLU`](/infiniop/ops/swiglu/README.md) + +- [`Exp`](/infiniop/ops/Exp/README.md) +- [`Sin`](/infiniop/ops/Sin/README.md) +- [`Cos`](/infiniop/ops/Cos/README.md) +- [`LeakyRelu`](/infiniop/ops/LeakyRelu/README.md) +- [`Tanh`](/infiniop/ops/Tanh/README.md) +- [`sigmoid_backward`](/infiniop/ops/sigmoid_backward/README.md) +- [`Hard_swish`](/infiniop/ops/hard_swish/README.md) +- [`Cast`](/infiniop/ops/cast/README.md) +- [`Where`](/infiniop/ops/where/README.md) diff --git a/infiniop/ops/cast/README.md b/infiniop/ops/cast/README.md new file mode 100644 index 0000000..c1b85d1 --- /dev/null +++ b/infiniop/ops/cast/README.md @@ -0,0 +1,134 @@ + +# `Cast` + +`Cast`,即**类型转换**算子,用于将输入张量中的数据转换为目标数据类型。其计算可表述为: + +$$ +\text{output} = \text{cast}(\text{input}) +$$ + +其中 `input` 为输入张量,`output` 为输出张量。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopCast( + infiniopCastDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *output, + const void *input, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateCastDescriptor()` 初始化的算子描述符; +- `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 infiniopCreateCastDescriptor( + infiniopHandle_t handle, + infiniopCastDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output, + infiniopTensorDescriptor_t input +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopCastDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `output` - { dT | (d1,...,dn) | (...) }: + 输出张量描述符,必须与输入张量形状完全一致,数据类型可不同。 +- `input` - { dT | (d1,...,dn) | (...) }: + 输入张量描述符,必须与输出张量形状一致。 + +参数限制: + +- 输入输出张量需拥有相同的形状; +- 支持的数据类型转换包括: +- 浮点类型间转换:Float64, Float32, Float16 +- 整数类型间转换:Int32, Int64, UInt32, UInt64 +- 整数类型转换为浮点类型 +- 不支持原位操作; + + +
返回值:
+ +- [`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 infiniopGetCastWorkspaceSize( + infiniopCastDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateCastDescriptor()` 初始化的算子描述符; +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroyCastDescriptor( + infiniopCastDescriptor_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/hard_swish/README.md b/infiniop/ops/hard_swish/README.md new file mode 100644 index 0000000..7ebd17b --- /dev/null +++ b/infiniop/ops/hard_swish/README.md @@ -0,0 +1,131 @@ + +# `HardSwish` + +`HardSwish`,即 HardSwish 激活函数算子,为单输入逐元素非线性算子。其计算公式如下: + +$$ +\text{output} = \frac{\text{x} \cdot \text{ReLU6}(\text{x}+3)}{6} = \frac{x \cdot \min\left(\max(x+3,0),6\right)}{6} +$$ + +其中 `x` 为输入张量,`output` 为输出张量。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopHardSwish( + infiniopHardSwishDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *output, + const void *input, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateHardSwishDescriptor()` 初始化的算子描述符; +- `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 infiniopCreateHardSwishDescriptor( + infiniopHandle_t handle, + infiniopHardSwishDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output, + infiniopTensorDescriptor_t input +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopHardSwishDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `output`: + 输出张量的描述符,支持原位计算; +- `input`: + 输入张量的描述符; + +参数限制: + +- 输入输出张量需拥有相同的形状; +- 支持的数据类型包括:`Float16`, `Float32`, `Float64`, `BFloat16`; +- 支持原位计算; + + +
返回值:
+ +- [`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 infiniopGetHardSwishWorkspaceSize( + infiniopHardSwishDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateHardSwishDescriptor()` 初始化的算子描述符; +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroyHardSwishDescriptor( + infiniopHardSwishDescriptor_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/sigmoid_backward/README.md b/infiniop/ops/sigmoid_backward/README.md new file mode 100644 index 0000000..d90b023 --- /dev/null +++ b/infiniop/ops/sigmoid_backward/README.md @@ -0,0 +1,144 @@ +# `SigmoidBackward` + +`SigmoidBackward`,即 **Sigmoid 函数的反向传播算子**,为单输入、单输出的逐元素算子。其计算公式如下: + +$$ +\text{grad\\_input} = \text{grad\\_output} \cdot \text{sigmoid}(x) \cdot (1 - \text{sigmoid}(x)) +$$ + +$$ +\text{sigmoid}(x) = \frac{1}{1 + e^{-x}} +$$ + +其中: + +- `input`:正向传播中的输入 `x` +- `grad_output`:来自上一层的反向梯度 +- `grad_input`: 输出张量指针,用于存储本层反向传播计算结果; + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopSigmoidBackward( + infiniopSigmoidBackwardDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *grad_input, + const void *grad_output, + const void *input, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateSigmoidBackwardDescriptor()` 初始化的算子描述符; +- `workspace`: + 算子计算所需的额外工作空间指针(如无需可为 `NULL`); +- `workspace_size`: + `workspace` 的大小,单位为字节; +- `grad_input`: + 输出张量(反向传播计算结果)描述符; +- `grad_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 infiniopCreateSigmoidBackwardDescriptor( + infiniopHandle_t handle, + infiniopSigmoidBackwardDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t grad_input, + infiniopTensorDescriptor_t grad_output, + infiniopTensorDescriptor_t input +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopSigmoidBackwardDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `grad_input`: + 反向输出张量描述符,支持原位计算; +- `grad_output`: + 反向输入张量描述符; +- `input`: + 正向输入张量描述符; + +参数限制: + +- 输入输出张量需拥有相同的形状; +- 支持的数据类型:`Float16`, `Float32`, `Float64`, `BFloat16`; +- 支持原位计算; + + +
返回值:
+ +- [`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 infiniopGetSigmoidBackwardWorkspaceSize( + infiniopSigmoidBackwardDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateSigmoidBackwardDescriptor()` 初始化的算子描述符; +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroySigmoidBackwardDescriptor( + infiniopSigmoidBackwardDescriptor_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/sin/sin.md b/infiniop/ops/sin/sin.md new file mode 100644 index 0000000..84d899b --- /dev/null +++ b/infiniop/ops/sin/sin.md @@ -0,0 +1,128 @@ +# Sin + +`Sin`, 即**正弦**算子,为单目算子。其计算可被表述为: + +$$ +output = sin(input) +$$ + +其中 `input` 为输入,`output` 为输出。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopAdd( + infiniopAddDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *output, + const void *input, + void *stream +); +``` + +参数: + +- `desc`: + 已使用 `infiniopCreateSinDescriptor()` 初始化的算子描述符; +- `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 infiniopCreateSinDescriptor(infiniopHandle_t handle, + infiniopSinDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output, + infiniopTensorDescriptor_t input); +``` + +参数: + +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `output - { dT | (d1,...,dn) | (...) }:` + 算子计算参数 `output` 的张量描述,支持原位计算。 +- `input - { dT | (d1,...,dn) | (...) }:` + 算子计算参数 `input` 的张量描述,支持原位计算,支持多向广播。 + +参数限制: + +- `dT`: (`Float16`, `Float32`, `Float64`, `BFloat16`) 之一。 +- 输入 `input` 的形状需与 `output` 相同。 +- 支持原位计算,即计算时 `output` 可以和 `input` 指向同一地址。 +- 计算输出参数 `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 infiniopGetSinWorkspaceSize( + infiniopAddDescriptor_t desc, + size_t *size +); +``` + +参数: + +- `desc`: + 已使用 `infiniopCreateSinDescriptor()` 初始化的算子描述符; +- `size`: + 额外空间大小的计算结果的写入地址; + +返回值: + +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroySinDescriptor( + infiniopAddDescriptor_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/tanh/tanh.md b/infiniop/ops/tanh/tanh.md new file mode 100644 index 0000000..d26f997 --- /dev/null +++ b/infiniop/ops/tanh/tanh.md @@ -0,0 +1,128 @@ +# Tanh + +`Tanh`, 对输入张量的每个元素执行双曲正切变换,为单目算子。其计算可被表述为: + +$$ +\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} +$$ + +其中 `x` 为输入,`tan(x)` 为输出。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopTanh( + infiniopAddDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *output, + const void *input, + void *stream +); +``` + +参数: + +- `desc`: + 已使用 `infiniopCreateSinDescriptor()` 初始化的算子描述符; +- `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 infiniopCreateTanhDescriptor(infiniopHandle_t handle, + infiniopSinDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output, + infiniopTensorDescriptor_t input); +``` + +参数: + +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `output - { dT | (d1,...,dn) | (...) }:` + 算子计算参数 `output` 的张量描述,支持原位计算。 +- `input - { dT | (d1,...,dn) | (...) }:` + 算子计算参数 `input` 的张量描述,支持原位计算,支持多向广播。 + +参数限制: + +- `dT`: (`Float16`, `Float32`, `Float64`, `BFloat16`) 之一。 +- 输入 `input` 的形状需与 `output` 相同。 +- 支持原位计算,即计算时 `output` 可以和 `input` 指向同一地址。 +- 计算输出参数 `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 infiniopGetTanhWorkspaceSize( + infiniopAddDescriptor_t desc, + size_t *size +); +``` + +参数: + +- `desc`: + 已使用 `infiniopCreateSinDescriptor()` 初始化的算子描述符; +- `size`: + 额外空间大小的计算结果的写入地址; + +返回值: + +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroyTanhDescriptor( + infiniopAddDescriptor_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/where/where.md b/infiniop/ops/where/where.md new file mode 100644 index 0000000..082eb9d --- /dev/null +++ b/infiniop/ops/where/where.md @@ -0,0 +1,142 @@ +# `Where` + +`Where` 算子为三目元素选择算子,其计算可表示为: + +$$ +c_i = \text{cond}_i ? a_i : b_i +$$ + +其中 `cond` 为条件张量,`a` 和 `b` 为输入张量,`c` 为输出张量。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopWhere( + infiniopWhereDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *c, + const void *a, + const void *b, + const void *condition, + void *stream); +``` + + 参数: + +- `desc` + 已使用 `infiniopCreateWhereDescriptor()` 初始化的算子描述符; +- `workspace` + 指向算子计算所需的额外工作空间; +- `workspace_size` + `workspace` 的大小,单位:字节; +- `c` + 输出张量。张量限制见创建算子描述部分; +- `condition` + 条件张量。张量限制见创建算子描述部分; +- `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 infiniopCreateWhereDescriptor( + infiniopHandle_t handle, + infiniopWhereDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t c_desc, + infiniopTensorDescriptor_t a_desc, + infiniopTensorDescriptor_t b_desc, + infiniopTensorDescriptor_t condition_desc); +``` + + 参数: + +- `handle` + `infiniopHandle_t` 类型的硬件句柄。详情请参见 `InfiniopHandle_t`。 +- `desc_ptr` + `infiniopWhereDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `c_desc - { dT | (d1,…,dn) | (…) }` + 算子输出张量 `c` 的张量描述,支持原位计算; +- `condition_desc- { Bool | (d1,…,dn) | (…) }` + 条件张量 `condition` 的张量描述,支持多向广播; +- `a_desc- { dT | (d1,…,dn) | (…) }` + 输入张量 `a` 的张量描述,支持原位计算,支持多向广播; +- `b_desc- { dT | (d1,…,dn) | (…) }` + 输入张量 `b` 的张量描述,支持原位计算,支持多向广播。 + +参数限制: + +- `dT` ∈ { `int8`,`int16`,`int32`,`int164`,`Float16`, `Float32`, `Float64`, `BFloat16`,`BOOL`}; +- `cond` 的数据类型为 `Bool`,其形状需与 `a`、`b` 以及 `c` 通过多向广播后得到的形状一致; +- 输入 `a`、`b` 必须与 `c` 的形状一致,或可通过多向广播匹配 `c`; +- `condition`、`a`、`b` 的步长需与多向广播后的映射关系一致; +- 支持原位计算:`c` 可与 `a` 或 `b` 指向同一地址,但不可与 `condition` 共址; +- 输出张量 `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 infiniopGetWhereWorkspaceSize( + infiniopWhereDescriptor_t desc, + size_t *size +); +``` + + 参数: + +- `desc` + 已使用 `infiniopCreateWhereDescriptor()` 初始化的算子描述符; +- `size` + 额外空间大小的计算结果写入地址; + +回值: + +- `INFINI_STATUS_SUCCESS`, `INFINI_STATUS_NULL_POINTER`, `INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroyWhereDescriptor( + infiniopWhereDescriptor_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