Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions infiniop/ops/README.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,23 @@
# `InfiniOP` 算子列表

- [`Add`](/infiniop/ops/add/README.md)
- [`And`](/infiniop/ops/and/README.md)
- [`Causal Softmax`](/infiniop/ops/causal_softmax/README.md)
- [`Clip`](/infiniop/ops/clip/README.md)
- [`CrossEntropyLossBackward`](/infiniop/ops/crossentropyloss_backward/README.md)
- [`Div`](/infiniop/ops/div/README.md)
- [`Equal`](/infiniop/ops/equal/README.md)
- [`GEMM`](/infiniop/ops/gemm/README.md)
- [`Gelu`](/infiniop/ops/gelu/README.md)
- [`Gelu Backward`](/infiniop/ops/gelu_backward/README.md)
- [`Mul`](/infiniop/ops/mul/README.md)
- [`Or`](/infiniop/ops/or/README.md)
- [`Random Sample`](/infiniop/ops/random_sample/README.md)
- [`Rearrange`](/infiniop/ops/rearrange/README.md)
- [`ReLU Backward`](/infiniop/ops/relu_backward/README.md)
- [`RMS Norm`](/infiniop/ops/rms_norm/README.md)
- [`RoPE`](/infiniop/ops/rope/README.md)
- [`Silu`](/infiniop/ops/silu/README.md)
- [`Softmax`](/infiniop/ops/softmax/README.md)
- [`Sub`](/infiniop/ops/sub/README.md)
- [`SwiGLU`](/infiniop/ops/swiglu/README.md)
138 changes: 138 additions & 0 deletions infiniop/ops/and/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
# And 算子

And 算子用于执行张量的逐元素逻辑与运算。该算子参考 `torch.logical_and` 的行为。

## 数学定义

给定两个布尔张量 $a$ 和 $b$,And 算子的计算公式为:

$$c = \text{and}(a, b) = a \land b$$

其中 $c$ 是输出张量,$a$ 和 $b$ 是输入张量。该算子支持多向广播。

## 接口

### 计算

```c
infiniStatus_t infiniopAnd(
infiniopAndDescriptor_t desc,
void *workspace,
size_t workspace_size,
void *c,
const void *a,
const void *b,
void *stream
);
```

<div style="background-color: lightblue; padding: 1px;"> 参数:</div>

- `desc`:
已使用 `infiniopCreateAndDescriptor()` 初始化的算子描述符。
- `workspace`:
额外工作空间地址。
- `workspace_size`:
`workspace` 的大小,单位:字节。
- `c`:
计算结果地址,支持原位计算。
- `a`:
输入张量 `a` 的数据指针。
- `b`:
输入张量 `b` 的数据指针。
- `stream`:
计算流/队列。

<div style="background-color: lightblue; padding: 1px;"> 返回值:</div>

- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`].

### 创建算子描述

```c
infiniStatus_t infiniopCreateAndDescriptor(
infiniopHandle_t handle,
infiniopAndDescriptor_t *desc_ptr,
infiniopTensorDescriptor_t c,
infiniopTensorDescriptor_t a,
infiniopTensorDescriptor_t b
);
```

<div style="background-color: lightblue; padding: 1px;"> 参数:</div>

- `handle`:
硬件控柄。详见 [`InfiniopHandle_t`]。
- `desc_ptr`:
`infiniopAndDescriptor_t` 指针,指向将被初始化的算子描述符地址。
- `c` - { BOOL | (d1,...,dn) | (...) }:
算子计算参数 `c` 的张量描述,支持原位计算。
- `a` - { BOOL | (d1,...,dn) | (...) }:
算子计算参数 `a` 的张量描述,支持原位计算,支持多向广播。
- `b` - { BOOL | (d1,...,dn) | (...) }:
算子计算参数 `b` 的张量描述,支持原位计算,支持多向广播。

参数限制:

- 所有张量的数据类型必须为 `Bool`。
- 输入 `a` 与 `b` 的形状需与 `c` 相同。`a` 与 `b` 涉及多向广播时需调整步长以匹配多向广播的映射关系。
- 支持原位计算,即计算时 `c` 可以和 `a` 或 `b` 指向同一地址。
- 计算输出参数 `c` 不能进行广播(`c` 的步长不能涉及广播设置,即步长不能有 0)。

<div style="background-color: lightblue; padding: 1px;"> 返回值:</div>

- [`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 infiniopGetAndWorkspaceSize(
infiniopAndDescriptor_t desc,
size_t *size
);
```

<div style="background-color: lightblue; padding: 1px;"> 参数:</div>

- `desc`:
已使用 `infiniopCreateAndDescriptor()` 初始化的算子描述符。
- `size`:
额外空间大小的计算结果的写入地址。

<div style="background-color: lightblue; padding: 1px;"> 返回值:</div>

- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].

### 销毁算子描述符

```c
infiniStatus_t infiniopDestroyAndDescriptor(
infiniopAndDescriptor_t desc
);
```

<div style="background-color: lightblue; padding: 1px;"> 参数: </div>

- `desc`:
待销毁的算子描述符。

<div style="background-color: lightblue; padding: 1px;"> 返回值: </div>

- [`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_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED
[`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_NULL_POINTER`]:/common/status/README.md#INFINI_STATUS_NULL_POINTER
[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]:/common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE
[`INFINI_STATUS_INTERNAL_ERROR`]:/common/status/README.md#INFINI_STATUS_INTERNAL_ERROR
144 changes: 144 additions & 0 deletions infiniop/ops/crossentropyloss_backward/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
# CrossEntropyLoss Backward 算子

CrossEntropyLoss Backward 算子用于计算交叉熵损失函数的反向传播梯度。该算子参考 `torch.nn.CrossEntropyLoss` 的反向传播行为。

## 数学定义

给定概率分布 $p$ 和目标标签 $t$,CrossEntropyLoss Backward 算子的计算公式为:

$$\frac{\partial L}{\partial \text{logits}_i} = p_i - \mathbf{1}_{t=i}$$

其中:
- $p_i$ 是经过 softmax 后的概率分布中第 $i$ 个类别的概率
- $\mathbf{1}_{t=i}$ 是指示函数,当目标标签 $t$ 等于 $i$ 时为 1,否则为 0
- $\frac{\partial L}{\partial \text{logits}_i}$ 是对 logits 第 $i$ 个元素的梯度

对于批量处理,每个样本的梯度计算相互独立。

## 接口

### 计算

```c
infiniStatus_t infiniopCrossEntropyLossBackward(
infiniopCrossEntropyLossBackwardDescriptor_t desc,
void *workspace,
size_t workspace_size,
void *grad_logits,
const void *probs,
const void *target,
void *stream
);
```

<div style="background-color: lightblue; padding: 1px;"> 参数:</div>

- `desc`:
已使用 `infiniopCreateCrossEntropyLossBackwardDescriptor()` 初始化的算子描述符。
- `workspace`:
额外工作空间地址。
- `workspace_size`:
`workspace` 的大小,单位:字节。
- `grad_logits`:
logits 梯度的计算结果地址,支持原位计算。
- `probs`:
经过 softmax 后的概率分布张量数据指针。
- `target`:
目标标签张量数据指针。
- `stream`:
计算流/队列。

<div style="background-color: lightblue; padding: 1px;"> 返回值:</div>

- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_INSUFFICIENT_WORKSPACE`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`], [`INFINI_STATUS_INTERNAL_ERROR`].

### 创建算子描述

```c
infiniStatus_t infiniopCreateCrossEntropyLossBackwardDescriptor(
infiniopHandle_t handle,
infiniopCrossEntropyLossBackwardDescriptor_t *desc_ptr,
infiniopTensorDescriptor_t grad_logits,
infiniopTensorDescriptor_t probs,
infiniopTensorDescriptor_t target
);
```

<div style="background-color: lightblue; padding: 1px;"> 参数:</div>

- `handle`:
硬件控柄。详见 [`InfiniopHandle_t`]。
- `desc_ptr`:
`infiniopCrossEntropyLossBackwardDescriptor_t` 指针,指向将被初始化的算子描述符地址。
- `grad_logits` - { FP16 | FP32 | BF16 | (batch_size, num_classes) | (...) }:
logits 梯度张量描述,支持原位计算。
- `probs` - { FP16 | FP32 | BF16 | (batch_size, num_classes) | (...) }:
概率分布张量描述,支持原位计算。
- `target` - { INT32 | INT64 | (batch_size,) | (...) }:
目标标签张量描述。

参数限制:

- `grad_logits` 和 `probs` 张量的数据类型必须相同,支持 `FP16`、`FP32`、`BF16`。
- `target` 张量的数据类型必须为 `INT32` 或 `INT64`。
- `grad_logits` 和 `probs` 张量的形状必须相同,通常为 `(batch_size, num_classes)`。
- `target` 张量的形状必须为 `(batch_size,)`,包含每个样本的目标类别索引。
- 支持原位计算,即计算时 `grad_logits` 可以和 `probs` 指向同一地址。

<div style="background-color: lightblue; padding: 1px;"> 返回值:</div>

- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_BAD_PARAM`], [`INFINI_STATUS_BAD_TENSOR_SHAPE`], [`INFINI_STATUS_BAD_TENSOR_DTYPE`], [`INFINI_STATUS_BAD_TENSOR_STRIDES`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].

### 计算额外工作空间

```c
infiniStatus_t infiniopGetCrossEntropyLossBackwardWorkspaceSize(
infiniopCrossEntropyLossBackwardDescriptor_t desc,
size_t *size
);
```

<div style="background-color: lightblue; padding: 1px;"> 参数:</div>

- `desc`:
已使用 `infiniopCreateCrossEntropyLossBackwardDescriptor()` 初始化的算子描述符。
- `size`:
额外空间大小的计算结果的写入地址。

<div style="background-color: lightblue; padding: 1px;"> 返回值:</div>

- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`].

### 销毁算子描述符

```c
infiniStatus_t infiniopDestroyCrossEntropyLossBackwardDescriptor(
infiniopCrossEntropyLossBackwardDescriptor_t desc
);
```

<div style="background-color: lightblue; padding: 1px;"> 参数: </div>

- `desc`:
待销毁的算子描述符。

<div style="background-color: lightblue; padding: 1px;"> 返回值: </div>

- [`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_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED
[`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_NULL_POINTER`]:/common/status/README.md#INFINI_STATUS_NULL_POINTER
[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]:/common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE
[`INFINI_STATUS_INTERNAL_ERROR`]:/common/status/README.md#INFINI_STATUS_INTERNAL_ERROR
Loading