diff --git a/infiniop/ops/README.md b/infiniop/ops/README.md index 0633ec6..2497c66 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) +- [`Leaky ReLU`](/infiniop/ops/leaky_relu/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) +- [`hardswish`](/infiniop/ops/hardswish/README.md) +- [`cast`](/infiniop/ops/cast/README.md) +- [`where`](/infiniop/ops/where/README.md) +- [`sigmoid_backward`](/infiniop/ops/sigmoid_backward/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..f2f8899 --- /dev/null +++ b/infiniop/ops/cast/README.md @@ -0,0 +1,130 @@ +# `Cast` + +`Cast`, 即**类型转换**算子,用于将输入张量的数据类型转换为指定的目标数据类型。其计算可被表述为: + +$$ output = cast(input, target\_dtype) $$ + +其中 `input` 为输入张量,`output` 为输出张量,`target_dtype` 为目标数据类型。 + +## 接口 + +### 计算 + +```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_out | (d1,...,dn) | (...) }: + 算子计算参数 `output` 的张量描述。 +- `input` - { dT_in | (d1,...,dn) | (...) }: + 算子计算参数 `input` 的张量描述。 + +参数限制: + +- `dT_in`, `dT_out`: 支持以下类型转换: + - 整数类型间互转:`Int8`, `Int16`, `Int32`, `Int64`, `UInt8`, `UInt16`, `UInt32`, `UInt64` + - 浮点类型间互转:`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 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 \ No newline at end of file diff --git a/infiniop/ops/cos/README.md b/infiniop/ops/cos/README.md new file mode 100644 index 0000000..06dc428 --- /dev/null +++ b/infiniop/ops/cos/README.md @@ -0,0 +1,128 @@ +# `Cos` + +`Cos`, 即**余弦**算子,为单目逐元素算子。其计算可被表述为: + +$$ 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`: + 已使用 `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, + infiniopTensorDescriptor_t input +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopCosDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `output` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `output` 的张量描述,支持原位计算。 +- `input` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `input` 的张量描述,支持原位计算。 + +参数限制: + +- `dT`: (`Float16`, `Float32`, `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 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 \ No newline at end of file diff --git a/infiniop/ops/exp/README.md b/infiniop/ops/exp/README.md new file mode 100644 index 0000000..92d5588 --- /dev/null +++ b/infiniop/ops/exp/README.md @@ -0,0 +1,128 @@ +# `Exp` + +`Exp`, 即**指数**算子,为单目逐元素算子。其计算可被表述为: + +$$ 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`: + 已使用 `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, + infiniopTensorDescriptor_t input +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopExpDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `output` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `output` 的张量描述,支持原位计算。 +- `input` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `input` 的张量描述,支持原位计算。 + +参数限制: + +- `dT`: (`Float16`, `Float32`, `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 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 \ No newline at end of file diff --git a/infiniop/ops/hardswish/README.md b/infiniop/ops/hardswish/README.md new file mode 100644 index 0000000..046c9ba --- /dev/null +++ b/infiniop/ops/hardswish/README.md @@ -0,0 +1,128 @@ +# `HardSwish` + +`HardSwish`, 即**硬Swish**算子,为单目逐元素算子。其计算可被表述为: + +$$ output = input \times \frac{\text{ReLU6}(input + 3)}{6} $$ + +其中 `input` 为输入,`output` 为输出,$\text{ReLU6}(x) = \min(\max(0, x), 6)$。 + +## 接口 + +### 计算 + +```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` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `output` 的张量描述,支持原位计算。 +- `input` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `input` 的张量描述,支持原位计算。 + +参数限制: + +- `dT`: (`Float16`, `Float32`, `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 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 \ No newline at end of file diff --git a/infiniop/ops/leaky_relu/README.md b/infiniop/ops/leaky_relu/README.md new file mode 100644 index 0000000..754eac9 --- /dev/null +++ b/infiniop/ops/leaky_relu/README.md @@ -0,0 +1,132 @@ +# `LeakyReLU` + +`LeakyReLU`, 即**带泄漏的线性整流单元**算子,为单目逐元素算子。其计算可被表述为: + +$$ output = \max(0, input) + negative\_slope \times \min(0, input) $$ + +其中 `input` 为输入,`output` 为输出,`negative_slope` 为负斜率参数。 + +## 接口 + +### 计算 + +```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, + infiniopTensorDescriptor_t input, + float negative_slope +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopLeakyReLUDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `output` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `output` 的张量描述,支持原位计算。 +- `input` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `input` 的张量描述,支持原位计算。 +- `negative_slope`: + 负斜率参数,用于控制负值部分的斜率。 + +参数限制: + +- `dT`: (`Float16`, `Float32`, `BFloat16`) 之一。 +- 输入 `input` 与输出 `output` 的形状需相同。 +- 支持原位计算,即计算时 `output` 可以和 `input` 指向同一地址。 +- 输入输出类型一致。 +- `negative_slope` 通常为小的正数,默认值为 0.01。 + +
返回值:
+ +- [`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 \ No newline at end of file diff --git a/infiniop/ops/sigmoid_backward/README.md b/infiniop/ops/sigmoid_backward/README.md new file mode 100644 index 0000000..cef7d78 --- /dev/null +++ b/infiniop/ops/sigmoid_backward/README.md @@ -0,0 +1,134 @@ +# `Sigmoid Backward` + +`Sigmoid Backward`, 即**Sigmoid反向传播**算子,用于计算Sigmoid函数的梯度。其计算可被表述为: + +$$ grad\_input = grad\_output \times sigmoid(input) \times (1 - sigmoid(input)) $$ + +其中 `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`: + 输出的输入梯度张量。张量限制见[创建算子描述](#创建算子描述)部分; +- `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 infiniopCreateSigmoidBackwardDescriptor( + infiniopHandle_t handle, + infiniopSigmoidBackwardDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t grad_input, + infiniopTensorDescriptor_t input, + infiniopTensorDescriptor_t grad_output +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopSigmoidBackwardDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `grad_input` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `grad_input` 的张量描述,支持原位计算。 +- `input` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `input` 的张量描述。 +- `grad_output` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `grad_output` 的张量描述,支持原位计算。 + +参数限制: + +- `dT`: (`Float16`, `Float32`, `BFloat16`) 之一。 +- 所有张量 `input`、`grad_output` 与 `grad_input` 的形状需相同。 +- 支持原位计算,即计算时 `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 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 \ No newline at end of file diff --git a/infiniop/ops/sin/README.md b/infiniop/ops/sin/README.md new file mode 100644 index 0000000..bdef3d2 --- /dev/null +++ b/infiniop/ops/sin/README.md @@ -0,0 +1,128 @@ +# `Sin` + +`Sin`, 即**正弦**算子,为单目逐元素算子。其计算可被表述为: + +$$ output = \sin(input) $$ + +其中 `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, + infiniopTensorDescriptor_t input +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopSinDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `output` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `output` 的张量描述,支持原位计算。 +- `input` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `input` 的张量描述,支持原位计算。 + +参数限制: + +- `dT`: (`Float16`, `Float32`, `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 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 \ No newline at end of file diff --git a/infiniop/ops/tanh/README.md b/infiniop/ops/tanh/README.md new file mode 100644 index 0000000..221a5a4 --- /dev/null +++ b/infiniop/ops/tanh/README.md @@ -0,0 +1,128 @@ +# `Tanh` + +`Tanh`, 即**双曲正切**算子,为单目逐元素算子。其计算可被表述为: + +$$ output = \tanh(input) = \frac{e^{input} - e^{-input}}{e^{input} + e^{-input}} $$ + +其中 `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, + infiniopTensorDescriptor_t input +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopTanhDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `output` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `output` 的张量描述,支持原位计算。 +- `input` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `input` 的张量描述,支持原位计算。 + +参数限制: + +- `dT`: (`Float16`, `Float32`, `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 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 \ No newline at end of file diff --git a/infiniop/ops/where/README.md b/infiniop/ops/where/README.md new file mode 100644 index 0000000..c77423f --- /dev/null +++ b/infiniop/ops/where/README.md @@ -0,0 +1,144 @@ +# `Where` + +`Where`, 即**条件选择**算子,为三目逐元素算子。其计算可被表述为: + +$$ c[i] = \begin{cases} +a[i] & \text{if } condition[i] \text{ is true} \\ +b[i] & \text{if } condition[i] \text{ is false} +\end{cases} $$ + +其中 `condition` 为条件张量(布尔类型),`a` 和 `b` 为输入张量,`c` 为输出张量。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopWhere( + infiniopWhereDescriptor_t desc, + void *workspace, + size_t workspace_size, + const void *condition, + const void *a, + const void *b, + void *c, + void *stream +); +``` + +
参数:
+ +- `desc`: + 已使用 `infiniopCreateWhereDescriptor()` 初始化的算子描述符; +- `workspace`: + 指向算子计算所需的额外工作空间; +- `workspace_size`: + `workspace` 的大小,单位:字节; +- `condition`: + 条件张量(布尔类型)。张量限制见[创建算子描述](#创建算子描述)部分; +- `a`: + 输入张量a。张量限制见[创建算子描述](#创建算子描述)部分; +- `b`: + 输入张量b。张量限制见[创建算子描述](#创建算子描述)部分; +- `c`: + 输出张量。张量限制见[创建算子描述](#创建算子描述)部分; +- `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 condition, + infiniopTensorDescriptor_t a, + infiniopTensorDescriptor_t b, + infiniopTensorDescriptor_t c +); +``` + +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopWhereDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `condition` - { Bool | (d1,...,dn) | (...) }: + 算子计算参数 `condition` 的张量描述。 +- `a` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `a` 的张量描述,支持原位计算。 +- `b` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `b` 的张量描述,支持原位计算。 +- `c` - { dT | (d1,...,dn) | (...) }: + 算子计算参数 `c` 的张量描述,支持原位计算。 + +参数限制: + +- `dT`: (`Float16`, `Float32`, `BFloat16`) 之一。 +- `condition` 的数据类型必须为 `Bool`。 +- 所有张量 `condition`、`a`、`b` 和 `c` 的形状需相同。 +- 支持原位计算,即计算时 `c` 可以和 `a` 或 `b` 指向同一地址。 +- 输入输出类型一致(`a`、`b`、`c` 类型相同)。 + +
返回值:
+ +- [`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 \ No newline at end of file