diff --git a/infiniop/ops/README.md b/infiniop/ops/README.md index 0633ec6..c1a9a2f 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) +- [`Exp`](/infiniop/ops/exp/README.md) +- [`Sin`](/infiniop/ops/sin/README.md) +- [`Cos`](/infiniop/ops/cos/README.md) +- [`Tanh`](/infiniop/ops/tanh/README.md) +- [`Sigmoid Backward`](/infiniop/ops/sigmoid _backward/README.md) +- [`HardSwish`](/infiniop/ops/hardswish/README.md) +- [`Where`](/infiniop/ops/where/README.md) +- [`Cast`](/infiniop/ops/cast/README.md) +- [`LeakyReLU`](/infiniop/ops/leaky_relu/README.md) \ No newline at end of file diff --git a/infiniop/ops/cast/README.md b/infiniop/ops/cast/README.md new file mode 100644 index 0000000..ce25f3d --- /dev/null +++ b/infiniop/ops/cast/README.md @@ -0,0 +1,138 @@ +# `Cast` + +`Cast`(类型转换算子)为**单目逐元素算子**。用于在指定的数据类型之间进行转换: + +- **整数类型互转**:`int32`、`int64`、`uint32`、`uint64`; +- **浮点类型互转**:`f64`、`f32`、`f16`、`bf16`; +- **整数与浮点互转**:`int32/int64/uint32/uint64` ↔ `f64/f32/f16/bf16`; + +`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_desc, + infiniopTensorDescriptor_t input_desc +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopCastDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `output_desc` - { dT | (d1,...,dn) | (...) }: + 参数 `output` 的张量描述(目标数据类型由此指定)。**不支持原位计算**; +- `input_desc` - { dT | (d1,...,dn) | (...) }: + 参数 `input` 的张量描述。 + +参数限制: + +- `dT` 支持: + + - **整数**:`Int32`、`Int64`、`UInt32`、`UInt64`; + - **浮点**:`Float64`、`Float32`、`Float16`、`BFloat16`。 +- **允许的类型组合**: + + 1. 整数 ↔ 整数(上述整数集合内互转); + 2. 浮点 ↔ 浮点(上述浮点集合内互转); + 3. 整数 ↔ 浮点; +- `output` 与 `input` 的形状与步长需对应(逐元素一一映射);不涉及广播;`output` 的步长不得为 0。 +- 不支持 inplace:`output` 不能与 `input` 指向同一地址。 + +> 注:转换遵循常规数值转换语义(IEEE 754 浮点到浮点、整数到浮点的表示变换)。当整数值超出目标浮点的精确表示范围时,将发生舍入。 + +
返回值:
+ +- [`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/cos/README.md b/infiniop/ops/cos/README.md new file mode 100644 index 0000000..5a3a2c2 --- /dev/null +++ b/infiniop/ops/cos/README.md @@ -0,0 +1,130 @@ +# `Cos` + +`Cos`(余弦算子)为**单目逐元素算子**,定义: + +$$ +\mathrm{Cos}(x)=\cos(x) +$$ + +其中 `input` 为输入,`output` 为输出。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopCos( + infiniopCosDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *output, + const void *input, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateCosDescriptor()` 初始化的算子描述符; +- `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 infiniopCreateCosDescriptor( + infiniopHandle_t handle, + infiniopCosDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output_desc, + infiniopTensorDescriptor_t input_desc +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopCosDescriptor_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 infiniopGetCosWorkspaceSize( + infiniopCosDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateCosDescriptor()` 初始化的算子描述符; +- `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/exp/README.md b/infiniop/ops/exp/README.md new file mode 100644 index 0000000..ccbdfab --- /dev/null +++ b/infiniop/ops/exp/README.md @@ -0,0 +1,130 @@ +# `Exp` + +`Exp`(指数算子)为**单目逐元素算子**,定义: + +$$ +\mathrm{Exp}(x)=e^{x} +$$ + +其中 `input` 为输入,`output` 为输出。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopExp( + infiniopExpDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *output, + const void *input, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateExpDescriptor()` 初始化的算子描述符; +- `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 infiniopCreateExpDescriptor( + infiniopHandle_t handle, + infiniopExpDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output_desc, + infiniopTensorDescriptor_t input_desc +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopExpDescriptor_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 infiniopGetExpWorkspaceSize( + infiniopExpDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateExpDescriptor()` 初始化的算子描述符; +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroyExpDescriptor( + infiniopExpDescriptor_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/hardswish/README.md b/infiniop/ops/hardswish/README.md new file mode 100644 index 0000000..3135263 --- /dev/null +++ b/infiniop/ops/hardswish/README.md @@ -0,0 +1,137 @@ +# `HardSwish` + +`HardSwish`(硬化挤压线性单元)为**单目逐元素激活算子**,其常用等价形式为: + +$$ +\mathrm{HardSwish}(x)=x\cdot\frac{\mathrm{ReLU6}(x+3)}{6} += x\cdot\frac{\min(\max(x+3,\,0),\,6)}{6} += +\begin{cases} +0, & x\le -3,\\[2pt] +x, & x\ge 3,\\[2pt] +\dfrac{x(x+3)}{6}, & \text{otherwise}. +\end{cases} +$$ + +其中 `input` 为输入,`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_desc, + infiniopTensorDescriptor_t input_desc +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopHardSwishDescriptor_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 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/leaky_relu/README.md b/infiniop/ops/leaky_relu/README.md new file mode 100644 index 0000000..22a7179 --- /dev/null +++ b/infiniop/ops/leaky_relu/README.md @@ -0,0 +1,138 @@ +# `LeakyReLU` + +`LeakyReLU`(带泄露的线性整流)为**单目逐元素激活算子**,其计算为: + +$$ +\mathrm{LeakyReLU}(x)= +\begin{cases} +x, & x \ge 0,\\[2pt] +\text{negative\_slope}\cdot x, & x<0. +\end{cases} +$$ + +其中 `input` 为输入,`output` 为输出;`negative_slope` 为算子构建时设置的标量常数(`float` 类型),对所有元素生效。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopLeakyReLU( + infiniopLeakyReLUDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *output, + const void *input, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateLeakyReLUDescriptor()` 初始化的算子描述符; +- `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 infiniopCreateLeakyReLUDescriptor( + infiniopHandle_t handle, + infiniopLeakyReLUDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output_desc, + infiniopTensorDescriptor_t input_desc, + float negative_slope +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopLeakyReLUDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `output_desc` - { dT | (d1,...,dn) | (...) }: + 参数 `output` 的张量描述,支持原位计算; +- `input_desc` - { dT | (d1,...,dn) | (...) }: + 参数 `input` 的张量描述,支持原位计算; +- `negative_slope`: + 泄露系数,`float`(32 位)标量常数;在整个计算过程中保持不变; + +参数限制: + +- `dT`: (`Float64`, `Float32`, `Float16`, `BFloat16`) 之一。 +- `input` 与 `output` 的数据类型必须一致。 +- `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 infiniopGetLeakyReLUWorkspaceSize( + infiniopLeakyReLUDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateLeakyReLUDescriptor()` 初始化的算子描述符; +- `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/sigmoid _backward/README.md b/infiniop/ops/sigmoid _backward/README.md new file mode 100644 index 0000000..c601adc --- /dev/null +++ b/infiniop/ops/sigmoid _backward/README.md @@ -0,0 +1,142 @@ +# `Sigmoid Backward` + +`Sigmoid Backward`,即 **Sigmoid 函数*- 的反向算子。其梯度计算为: + +$$ +\sigma(x)=\frac{1}{1+e^{-x}},\quad +\frac{d\,\sigma(x)}{dx}=\sigma(x)\left(1-\sigma(x)\right), +$$ + +$$ +\textbf{grad\_input}=\textbf{grad\_output}\odot \sigma(\textbf{input})\odot\left(1-\sigma(\textbf{input})\right). +$$ + +其中 `input` 与 `grad_output` 为输入,`grad_input` 为输出。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopSigmoidBackward( + infiniopSigmoidBackwardDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *grad_input, + const void *input, + const void *grad_output, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateSigmoidBackwardDescriptor()` 初始化的算子描述符; +- `workspace`: + 指向算子计算所需的额外工作空间; +- `workspace_size`: + `workspace` 的大小,单位:字节; +- `grad_input`: + 输出张量(∂L/∂input)。张量限制见[创建算子描述](#创建算子描述)部分; +- `input`: + 前向输入张量 `x`。张量限制见[创建算子描述](#创建算子描述)部分; +- `grad_output`: + 上游梯度张量(∂L/∂Sigmoid(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 infiniopCreateSigmoidBackwardDescriptor( + infiniopHandle_t handle, + infiniopSigmoidBackwardDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t grad_input_desc, + infiniopTensorDescriptor_t input_desc, + infiniopTensorDescriptor_t grad_output_desc +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopSigmoidBackwardDescriptor_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 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/README.md b/infiniop/ops/sin/README.md new file mode 100644 index 0000000..0b8d612 --- /dev/null +++ b/infiniop/ops/sin/README.md @@ -0,0 +1,130 @@ +# `Sin` + +`Sin`(正弦算子)为**单目逐元素算子**,定义: + +$$ +\mathrm{Sin}(x)=\sin(x) +$$ + +其中 `input` 为输入,`output` 为输出。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopSin( + infiniopSinDescriptor_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_desc, + infiniopTensorDescriptor_t input_desc +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopSinDescriptor_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 infiniopGetSinWorkspaceSize( + infiniopSinDescriptor_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( + infiniopSinDescriptor_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/README.md b/infiniop/ops/tanh/README.md new file mode 100644 index 0000000..7722fe0 --- /dev/null +++ b/infiniop/ops/tanh/README.md @@ -0,0 +1,130 @@ +# `Tanh` + +`Tanh`(双曲正切算子)为**单目逐元素算子**,定义: + +$$ +\mathrm{Tanh}(x)=\tanh(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} +$$ + +其中 `input` 为输入,`output` 为输出。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopTanh( + infiniopTanhDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *output, + const void *input, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateTanhDescriptor()` 初始化的算子描述符; +- `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, + infiniopTanhDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output_desc, + infiniopTensorDescriptor_t input_desc +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopTanhDescriptor_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 infiniopGetTanhWorkspaceSize( + infiniopTanhDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateTanhDescriptor()` 初始化的算子描述符; +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 销毁算子描述符 + +```c +infiniStatus_t infiniopDestroyTanhDescriptor( + infiniopTanhDescriptor_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/README.md b/infiniop/ops/where/README.md new file mode 100644 index 0000000..b5070dc --- /dev/null +++ b/infiniop/ops/where/README.md @@ -0,0 +1,150 @@ +# `Where` + +`Where`,即**条件选择**算子。对每个元素位置,根据布尔条件张量 `condition`,从 `a` 或 `b` 中选择对应元素写入输出张量 `c`。本算子等价于三目运算:`c = condition ? a : b`。 + +对输入张量 `a`、`b`,布尔张量 `condition`,输出张量 `c`,逐元素计算如下: + +$$ +c_i = +\begin{cases} +a_i & \text{if } condition_i = \text{true} \\ +b_i & \text{if } condition_i = \text{false} +\end{cases} +$$ + +示例: +若 `a = [-1, 10, 3]`,`b = [0, 20, 4]`,`condition = [true, false, true]`,则输出 `c = [-1, 20, 3]`。 +当存在形状不一致时,`a`、`b` 与 `condition` 需可按多向广播规则与 `c` 对齐。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopWhere( + infiniopWhereDescriptor_t desc, + void *workspace, + size_t workspace_size, + void *c, + const void *condition, + const void *a, + const void *b, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateWhereDescriptor()` 初始化的算子描述符。 +- `workspace`: + 算子执行所需的工作空间指针。 +- `workspace_size`: + 工作空间大小(字节)。 +- `c`: + 输出张量。张量限制见[创建算子描述](#创建算子描述)部分; +- `a`: + 输入张量;当 `condition` 为 `true` 时取用。张量限制见[创建算子描述](#创建算子描述)部分; +- `b`: + 输入张量;当 `condition` 为 `false` 时取用。张量限制见[创建算子描述](#创建算子描述)部分; +- `condition`: + 布尔条件张量(`Bool`),决定在各元素位置从 `a` 或 `b` 取值。张量限制见[创建算子描述](#创建算子描述)部分; +- `stream`: + 计算流/队列。 + +
返回值:
+ +- [`INFINI_STATUS_SUCCESS`],[`INFINI_STATUS_BAD_TENSOR_DTYPE`],[`INFINI_STATUS_BAD_TENSOR_SHAPE`],[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`] +,[`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +### 创建算子描述符 + +```c +infiniStatus_t infiniopCreateWhereDescriptor( + infiniopHandle_t handle, + infiniopWhereDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t c, + infiniopTensorDescriptor_t condition, + infiniopTensorDescriptor_t a, + infiniopTensorDescriptor_t b +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详见:[`InfiniopHandle_t`] +- `desc_ptr`: + `infiniopWhereDescriptor_t` 指针,指向将被初始化的算子描述符地址。 +- `c` - {dT | (d1, ..., dn) | (...)}: + 输出张量描述。其形状应为 `a`、`b`、`condition` 的广播结果。 +- `a` - {dT | (d1, ..., dn) | (...)}: + 输入张量描述。 +- `b` - {dT | (d1, ..., dn) | (...)}: + 输入张量描述。 +- `condition` - {Bool | (d1, ..., dn) | (...)}: + 布尔条件张量描述。 + +参数限制: + +- `dT`: (`Float16`, `Float32`, `Float64`, `BFloat16`,`Bool`,`Int8`, `Int16`, `Int32`, `Int64`,`Uint8`, `Uint16`, `Uint32`, `Uint64`) 之一。 +- `a`、`b` 与 `condition` 必须与 `c` 可广播;`c` 的形状为三者广播后的结果。发生多向广播时需通过步长设置完成映射关系。 +- 支持原位计算,即 `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 infiniopGetWhereWorkspaceSize( + infiniopWhereDescriptor_t desc, + size_t *size +); +``` + +
参数:
+ +- `desc`: + 输入。已初始化的算子描述符。 +- `workspace_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_BAD_TENSOR_SHAPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_SHAPE +[`INFINI_STATUS_BAD_TENSOR_DTYPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_DTYPE +[`INFINI_STATUS_BAD_TENSOR_STRIDES`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_STRIDES +[`INFINI_STATUS_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_INSUFFICIENT_WORKSPACE`]: /common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE