diff --git a/infiniop/ops/README.md b/infiniop/ops/README.md index 0633ec6..e2e7678 100644 --- a/infiniop/ops/README.md +++ b/infiniop/ops/README.md @@ -12,3 +12,10 @@ - [`Softmax`](/infiniop/ops/softmax/README.md) - [`Sub`](/infiniop/ops/sub/README.md) - [`SwiGLU`](/infiniop/ops/swiglu/README.md) +- [`IndexCopyInplace`](/infiniop/ops/index_copy_inplace/README.md) +- [`Gather`](/infiniop/ops/gather/README.md) +- [`Scatter`](/infiniop/ops/scatter/README.md) +- [`Tril`](/infiniop/ops/tril/README.md) +- [`Triu`](/infiniop/ops/triu/README.md) +- [`Linear`](/infiniop/ops/linear/README.md) +- [`LinearBackward`](/infiniop/ops/linear_backward/README.md) diff --git a/infiniop/ops/gather/README.md b/infiniop/ops/gather/README.md new file mode 100644 index 0000000..8b69479 --- /dev/null +++ b/infiniop/ops/gather/README.md @@ -0,0 +1,129 @@ + +# `Gather` + +对于输入张量`input`、`index`和输出张量`output`,`Gather` 算子为`output`的每个位置赋值,所赋之值在`input`中的来源位置由 `index` 指定。对于 `output` 中的每个值,其来源位置由 `output` 中相对于 dimension != `dim` 的索引,以及 `index` 中对应的值指定。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopGather( + infiniopGatherDescriptor_t desc, + void *workspace, + size_t workspace_size, + void * output, + const void * input, + const void * index, + void *stream +); +``` +
参数:
+ +- `desc`: + 已使用 `infiniopCreateGatherDescriptor()` 初始化的算子描述符。 +- `workspace`: + 指向算子计算所需的额外工作空间; +- `workspace_size`: + `workspace` 的大小,单位:字节; +- `output`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `input`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `index`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 + - `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 infiniopCreateGatherDescriptor( + infiniopHandle_t handle, + infiniopGatherDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output_desc, + infiniopTensorDescriptor_t input_desc, + infiniopTensorDescriptor_t index_desc, + size_t dim +); +``` +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `output_desc` - { dT | ($\rm{d_o1}$, ..., $\rm{d_on}$) | ($...$) }: + 算子计算参数 `output` 的张量描述。 +- `input_desc` - { dT | ($\rm{d_i1}$, ..., $\rm{d_in}$) | ($...$) }: + 算子计算参数 `input` 的张量描述。 +- `index_desc` - { int | ($\rm{d_o1}$, ..., $\rm{d_on}$) | ($...$) }: + 算子计算参数 `index` 的张量描述,每一个元素值 i 应满足 0 $\leq$ i $\lt$ input_shape[dim]。 +- `dim` - int: + 算子针对的维度, 满足 0 $\leq$ dim $\lt$ n。 + +参数限制: + +- **`dT`**: (`Float16`, `Float32`, `Bfloat16`) 之一 +- `output`与`index`形状一致,且对于除`dim`的每一维度d, 满足$\rm{d_o}$[d] $\leq$ $\rm{d_i}$[d]。 + +
返回值:
+ +- [`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 infiniopGetGatherWorkspaceSize( + infiniopGatherDescriptor_t desc, + size_t *size +); +``` +
参数:
+ +- `desc`: 使用 `infiniopCreateGatherDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ + - [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +--- + +### 销毁算子描述符 + +```c +infiniopStatus_t infiniopDestroyGatherDescriptor( + infiniopGatherDescriptor_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/index_copy_inplace/README.md b/infiniop/ops/index_copy_inplace/README.md new file mode 100644 index 0000000..87c4ffb --- /dev/null +++ b/infiniop/ops/index_copy_inplace/README.md @@ -0,0 +1,132 @@ + +# `Index Copy Inplace` + +对于输入张量`input`、`index`和输出张量`output`,`Index Copy Inplace` 将 `input` 中的元素按 `index` 提供的针对`dim`维度的顺序复制到 `output` 张量中。 + +例如,如果 `dim` 等于 0 且 `index`[i] 等于 j,则 `input` 的第 i 行将被复制到 `output` 的第 j 行。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopIndexCopyInplace( + infiniopIndexCopyInplaceDescriptor_t desc, + void *workspace, + size_t workspace_size, + void * output, + const void * input, + const void * index, + void *stream +); +``` +
参数:
+ +- `desc`: + 已使用 `infiniopCreateIndexCopyInplaceDescriptor()` 初始化的算子描述符。 +- `workspace`: + 指向算子计算所需的额外工作空间; +- `workspace_size`: + `workspace` 的大小,单位:字节; +- `output`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `input`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `index`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 + - `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 infiniopCreateIndexCopyInplaceDescriptor( + infiniopHandle_t handle, + infiniopIndexCopyInplaceDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output_desc, + infiniopTensorDescriptor_t input_desc, + infiniopTensorDescriptor_t index_desc, + size_t dim +); +``` +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `output_desc` - { dT | (d1, ..., $\rm{d_{o,dim}}$,..., dn) | ($...$) }: + 算子计算参数 `output` 的张量描述。 +- `input_desc` - { dT | (d1, ..., $\rm{d_{i,dim}}$,..., dn) | ($...$) }: + 算子计算参数 `input` 的张量描述。 +- `index_desc` - { int | ($\rm{d_{i,dim}}$) | ($...$) }: + 算子计算参数 `index` 的张量描述,每一个元素值i应满足 0 $\leq$ i $\lt$ $\rm{d_{o,dim}}$。 +- `dim` - int: + 算子针对的维度, 满足 0 $\leq$ dim $\lt$ n。 + +参数限制: + +- **`dT`**: 所有合法类型 +- `output`与`input`除`dim`外全部维度长度相等。 +- 如果`input`中多组指向`output`同一位置,会出现不确定性。故测试时,通过规定`index`的不可重复,避免此情况发生。 + +
返回值:
+ +- [`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 infiniopGetIndexCopyInplaceWorkspaceSize( + infiniopIndexCopyInplaceDescriptor_t desc, + size_t *size +); +``` +
参数:
+ +- `desc`: 使用 `infiniopCreateIndexCopyInplaceDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ + - [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +--- + +### 销毁算子描述符 + +```c +infiniopStatus_t infiniopDestroyIndexCopyInplaceDescriptor( + infiniopIndexCopyInplaceDescriptor_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/linear/README.md b/infiniop/ops/linear/README.md new file mode 100644 index 0000000..c92124f --- /dev/null +++ b/infiniop/ops/linear/README.md @@ -0,0 +1,136 @@ + +# `Linear` + +`Linear`, 即线性变换算子。其公式如下: + +$$ + \mathrm{\it{y}}=\mathrm{A}\mathrm{\it{x}} + \mathrm{\it{b}} +$$ +其中`x`和`b`为1D输入向量, `A`为2D输入矩阵, `y`为1D输出向量。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopLinear( + infiniopLinearDescriptor_t desc, + void *workspace, + size_t workspace_size, + void * y, + const void * x, + const void * w, + const void * b, + void *stream +); +``` +
参数:
+ +- `desc`: + 已使用 `infiniopCreateLinearDescriptor()` 初始化的算子描述符。 +- `workspace`: + 指向算子计算所需的额外工作空间; +- `workspace_size`: + `workspace` 的大小,单位:字节; +- `y`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `x`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `w`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `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 infiniopCreateLinearDescriptor( + infiniopHandle_t handle, + infiniopLinearDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t y_desc, + infiniopTensorDescriptor_t x_desc, + infiniopTensorDescriptor_t w_desc, + infiniopTensorDescriptor_t b_desc +); +``` +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `y_desc` - { dT | (out_features) | (...) }: + 算子计算参数 `y` 的张量描述。 +- `x_desc` - { dT | (in_features) | (...) }: + 算子计算参数 `x` 的张量描述。 +- `w_desc` - { dT | (out_features, in_features) | (...) }: + 算子计算参数 `w` 的张量描述。 +- `b_desc` - { dT | (out_features) | (...) }: + 算子计算参数 `b` 的张量描述(可选)。 + +参数限制: + +- **`dT`**: (`Float16`, `Float32`, `Bfloat16`) 之一 +- 对于没有bias的情况,`b_desc`传入nullptr。 + +
返回值:
+ +- [`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 infiniopGetLinearWorkspaceSize( + infiniopLinearDescriptor_t desc, + size_t *size +); +``` +
参数:
+ +- `desc`: 使用 `infiniopCreateLinearDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ + - [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +--- + +### 销毁算子描述符 + +```c +infiniopStatus_t infiniopDestroyLinearDescriptor( + infiniopLinearDescriptor_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/linear_backward/README.md b/infiniop/ops/linear_backward/README.md new file mode 100644 index 0000000..4816477 --- /dev/null +++ b/infiniop/ops/linear_backward/README.md @@ -0,0 +1,146 @@ + +# `Linear Backward` + +`Linear Backward`, 即`Linear`对应的反向传播算子。其正向公式如下: + +$$ + \mathrm{\it{y}}=\mathrm{A}\mathrm{\it{x}} + \mathrm{\it{b}} +$$ +其中`x`和`b`为正向运算的1D输入向量, `A`为正向运算的2D输入矩阵, `y`为正向运算的1D输出向量。 + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopLinearBackward( + infiniopLinearBackwardDescriptor_t desc, + void *workspace, + size_t workspace_size, + void * grad_x, + void * grad_w, + void * grad_b, + const void * grad_y, + const void * x, + const void * w, + void *stream +); +``` +
参数:
+ +- `desc`: + 已使用 `infiniopCreateLinearBackwardDescriptor()` 初始化的算子描述符。 +- `workspace`: + 指向算子计算所需的额外工作空间; +- `workspace_size`: + `workspace` 的大小,单位:字节; +- `grad_x`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `grad_w`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `grad_b`:输出张量(可选)。张量限制见[创建算子描述](#创建算子描述)部分。 +- `grad_y`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `x`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `w`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 + - `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 infiniopCreateLinearBackwardDescriptor( + infiniopHandle_t handle, + infiniopLinearBackwardDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t grad_x_desc, + infiniopTensorDescriptor_t grad_w_desc, + infiniopTensorDescriptor_t grad_b_desc, + infiniopTensorDescriptor_t grad_y_desc, + infiniopTensorDescriptor_t x_desc, + infiniopTensorDescriptor_t w_desc +); +``` +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `grad_x_desc` - { dT | (in_features) | (...) }: + 算子计算参数 `grad_x` 的张量描述,对应`x`的梯度 。 +- `grad_w_desc` - { dT | (out_features, in_features) | (...) }: + 算子计算参数 `grad_w` 的张量描述,对应`w`的梯度 。 +- `grad_b_desc` - { dT | (out_features) | (...) }: + 算子计算参数 `grad_b` 的张量描述(可选),对应`b`的梯度 。 +- `grad_y_desc` - { dT | (out_features) | (...) }: + 算子计算参数 `grad_y` 的张量描述,对应`y`的梯度 。 +- `x_desc` - { dT | (in_features) | (...) }: + 算子计算参数 `x` 的张量描述。 +- `w_desc` - { dT | (out_features, in_features) | (...) }: + 算子计算参数 `w` 的张量描述。 + +参数限制: + +- **`dT`**: (`Float16`, `Float32`, `Bfloat16`) 之一 +- 对于没有bias的情况,`grad_b_desc`传入nullptr。 + +
返回值:
+ +- [`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 infiniopGetLinearBackwardWorkspaceSize( + infiniopLinearBackwardDescriptor_t desc, + size_t *size +); +``` +
参数:
+ +- `desc`: 使用 `infiniopCreateLinearBackwardDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ + - [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +--- + +### 销毁算子描述符 + +```c +infiniopStatus_t infiniopDestroyLinearBackwardDescriptor( + infiniopLinearBackwardDescriptor_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/scatter/README.md b/infiniop/ops/scatter/README.md new file mode 100644 index 0000000..8295682 --- /dev/null +++ b/infiniop/ops/scatter/README.md @@ -0,0 +1,132 @@ + +# `Scatter` + +对于输入张量`input`、`index`和输出张量`output`,`Scatter` 算子将 `input` 张量中的所有值写入 `output` 中,写入位置由 `index` 指定。对于 `input` 中的每个值,其输出索引由 `input` 中相对于 dimension != `dim` 的索引,以及 `index` 中对应的值指定。 + + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopScatter( + infiniopScatterDescriptor_t desc, + void *workspace, + size_t workspace_size, + void * output, + const void * input, + const void * index, + void *stream +); +``` +
参数:
+ +- `desc`: + 已使用 `infiniopCreateScatterDescriptor()` 初始化的算子描述符。 +- `workspace`: + 指向算子计算所需的额外工作空间; +- `workspace_size`: + `workspace` 的大小,单位:字节; +- `output`:输出张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `input`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 +- `index`:输入张量。张量限制见[创建算子描述](#创建算子描述)部分。 + - `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 infiniopCreateScatterDescriptor( + infiniopHandle_t handle, + infiniopScatterDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output_desc, + infiniopTensorDescriptor_t input_desc, + infiniopTensorDescriptor_t index_desc, + size_t dim +); +``` +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `output_desc` - { dT | ($\rm{d_o1}$, ..., $\rm{d_on}$) | ($...$) }: + 算子计算参数 `output` 的张量描述。 +- `input_desc` - { dT | ($\rm{d_i1}$, ..., $\rm{d_in}$) | ($...$) }: + 算子计算参数 `input` 的张量描述。 +- `index_desc` - { dT | ($\rm{d_{idx}1}$, ..., $\rm{d_{idx}n}$) | ($...$) }: + 算子计算参数 `index` 的张量描述,每一个元素值 i 应满足 0 $\leq$ i $\lt$ $\rm{d_o}$[dim]。 +- `dim` - int: + 算子针对的维度, 满足 0 $\leq$ dim $\lt$ n。 + +参数限制: + +- **`dT`**: 全部合法类型 +- 对于每一维度n,满足$\rm{d_{idx}n} \leq \rm{d_{i}n}$ +- 对于除`dim`外的每一维度n,满足$\rm{d_{idx}n} \leq \rm{d_{o}n}$ +- 如果`input`中多个元素指向`output`同一位置,会出现不确定性。故测试时,通过规定`index`的不可重复,避免此情况发生。 + +
返回值:
+ +- [`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 infiniopGetScatterWorkspaceSize( + infiniopScatterDescriptor_t desc, + size_t *size +); +``` +
参数:
+ +- `desc`: 使用 `infiniopCreateScatterDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ + - [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +--- + +### 销毁算子描述符 + +```c +infiniopStatus_t infiniopDestroyScatterDescriptor( + infiniopScatterDescriptor_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/tril/README.md b/infiniop/ops/tril/README.md new file mode 100644 index 0000000..9e4830e --- /dev/null +++ b/infiniop/ops/tril/README.md @@ -0,0 +1,126 @@ + +# `Tril` + +`Tril`算子返回输入2D张量`input`的对角分界线下三角部分,其他元素设置为 0。 +参数 `diagonal` 控制的此操作的对角分界线位置。如果`diagonal`为 0,则保留主对角线及其下的所有元素。以此为基准,`diagonal`取正值对应向上偏移,负值对应向下偏移。 + + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopTril( + infiniopTrilDescriptor_t desc, + void *workspace, + size_t workspace_size, + void * output, + const void * input, + void *stream +); +``` +
参数:
+ +- `desc`: + 已使用 `infiniopCreateTrilDescriptor()` 初始化的算子描述符。 +- `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 infiniopCreateTrilDescriptor( + infiniopHandle_t handle, + infiniopTrilDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output_desc, + infiniopTensorDescriptor_t input_desc, + int diagonal +); +``` +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `output_desc` - { dT | (M, N) | (N, 1)}: + 算子计算参数 `output` 的张量描述。 +- `input_desc` - { dT | (M, N) | (N, 1)}: + 算子计算参数 `input` 的张量描述。 +- `diagonal` - int: + 设定对角分界线位置的参数。 + +参数限制: + +- **`dT`**: 全部合法类型 +- `output`与`input`均为2D全连续张量。 + +
返回值:
+ +- [`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 infiniopGetTrilWorkspaceSize( + infiniopTrilDescriptor_t desc, + size_t *size +); +``` +
参数:
+ +- `desc`: 使用 `infiniopCreateTrilDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ + - [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +--- + +### 销毁算子描述符 + +```c +infiniopStatus_t infiniopDestroyTrilDescriptor( + infiniopTrilDescriptor_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/triu/README.md b/infiniop/ops/triu/README.md new file mode 100644 index 0000000..85247c2 --- /dev/null +++ b/infiniop/ops/triu/README.md @@ -0,0 +1,126 @@ + +# `Triu` + +`Triu`算子返回输入2D张量`input`的对角分界线上三角部分,其他元素设置为 0。 +参数 `diagonal` 控制的此操作的对角分界线位置。如果`diagonal`为 0,则保留主对角线及其上的所有元素。以此为基准,`diagonal`取正值对应分界线向上偏移,负值对应向下偏移。 + + +## 接口 + +### 计算 + +```c +infiniStatus_t infiniopTriu( + infiniopTriuDescriptor_t desc, + void *workspace, + size_t workspace_size, + void * output, + const void * input, + void *stream +); +``` +
参数:
+ +- `desc`: + 已使用 `infiniopCreateTriuDescriptor()` 初始化的算子描述符。 +- `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 infiniopCreateTriuDescriptor( + infiniopHandle_t handle, + infiniopTriuDescriptor_t *desc_ptr, + infiniopTensorDescriptor_t output_desc, + infiniopTensorDescriptor_t input_desc, + int diagonal +); +``` +
参数:
+ +- `handle`: + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 +- `desc_ptr`: + `infiniopAddDescriptor_t` 指针,指向将被初始化的算子描述符地址; +- `output_desc` - { dT | (M, N) | (N, 1)}: + 算子计算参数 `output` 的张量描述。 +- `input_desc` - { dT | (M, N) | (N, 1)}: + 算子计算参数 `input` 的张量描述。 +- `diagonal` - int: + 设定对角分界线位置的参数。 + +参数限制: + +- **`dT`**: 全部合法类型 +- `output`与`input`均为2D全连续张量。 + +
返回值:
+ +- [`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 infiniopGetTriuWorkspaceSize( + infiniopTriuDescriptor_t desc, + size_t *size +); +``` +
参数:
+ +- `desc`: 使用 `infiniopCreateTriuDescriptor()` 初始化的算子描述符。 +- `size`: + 额外空间大小的计算结果的写入地址; + +
返回值:
+ + - [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. + +--- + +### 销毁算子描述符 + +```c +infiniopStatus_t infiniopDestroyTriuDescriptor( + infiniopTriuDescriptor_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