|
| 1 | +# `Mul` |
| 2 | + |
| 3 | +`Mul`, 即**乘法**算子,为双目逐元素算子。其计算可被表述为: |
| 4 | + |
| 5 | +$$ c = a * b $$ |
| 6 | + |
| 7 | +其中 `a` 和 `b` 为输入,`c` 为输出。 |
| 8 | + |
| 9 | +## 接口 |
| 10 | + |
| 11 | +### 计算 |
| 12 | + |
| 13 | +```c |
| 14 | +infiniStatus_t infiniopMul( |
| 15 | + infiniopMulDescriptor_t desc, |
| 16 | + void *workspace, |
| 17 | + size_t workspace_size, |
| 18 | + void *c, |
| 19 | + const void *a, |
| 20 | + const void *b, |
| 21 | + void *stream |
| 22 | +); |
| 23 | +``` |
| 24 | + |
| 25 | +<div style="background-color: lightblue; padding: 1px;"> 参数: </div> |
| 26 | + |
| 27 | +- `desc`: |
| 28 | + 已使用 `infiniopCreateMulDescriptor()` 初始化的算子描述符; |
| 29 | +- `workspace`: |
| 30 | + 指向算子计算所需的额外工作空间; |
| 31 | +- `workspace_size`: |
| 32 | + `workspace` 的大小,单位:字节; |
| 33 | +- `c`: |
| 34 | + 输出张量。张量限制见创建算子描述部分; |
| 35 | +- `a`: |
| 36 | + 输入张量。张量限制见创建算子描述部分; |
| 37 | +- `b`: |
| 38 | + 输入张量。张量限制见创建算子描述部分; |
| 39 | +- `stream`: |
| 40 | + 计算流/队列; |
| 41 | + |
| 42 | +<div style="background-color: lightblue; padding: 1px;"> 返回值:</div> |
| 43 | + |
| 44 | +- [`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`]. |
| 45 | + |
| 46 | +### 创建算子描述 |
| 47 | + |
| 48 | +```c |
| 49 | +infiniStatus_t infiniopCreateMulDescriptor( |
| 50 | + infiniopHandle_t handle, |
| 51 | + infiniopMulDescriptor_t *desc_ptr, |
| 52 | + infiniopTensorDescriptor_t c_desc, |
| 53 | + infiniopTensorDescriptor_t a_desc, |
| 54 | + infiniopTensorDescriptor_t b_desc |
| 55 | +); |
| 56 | +``` |
| 57 | + |
| 58 | +<div style="background-color: lightblue; padding: 1px;"> 参数:</div> |
| 59 | + |
| 60 | +- `handle`: |
| 61 | + `infiniopHandle_t` 类型的硬件控柄。详情请看:[`InfiniopHandle_t`]。 |
| 62 | +- `desc_ptr`: |
| 63 | + `infiniopMulDescriptor_t` 指针,指向将被初始化的算子描述符地址; |
| 64 | +- `c_desc` - { dT | (d1,...,dn) | (...) }: |
| 65 | + 算子计算参数 `c` 的张量描述,支持原位计算。 |
| 66 | +- `a_desc` - { dT | (d1,...,dn) | (...) }: |
| 67 | + 算子计算参数 `a` 的张量描述,支持原位计算,支持多向广播。 |
| 68 | +- `b_desc` - { dT | (d1,...,dn) | (...) }: |
| 69 | + 算子计算参数 `b` 的张量描述,支持原位计算,支持多向广播。 |
| 70 | + |
| 71 | +参数限制: |
| 72 | + |
| 73 | +- `dT`: (`Float16`, `Float32`, `Float64`) 之一。 |
| 74 | +- 输入 `a` 与 `b` 的形状需与 `c` 相同。`a` 与 `b` 涉及多向广播时需调整步长以匹配多向广播的映射关系。 |
| 75 | +- 支持原位计算,即计算时 `c` 可以和 `a` 或 `b` 指向同一地址。 |
| 76 | +- 计算输出参数 `c` 不能进行广播(`c` 的步长不能涉及广播设置,即步长不能有 0) |
| 77 | + |
| 78 | +<div style="background-color: lightblue; padding: 1px;"> 返回值:</div> |
| 79 | + |
| 80 | +- [`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`]. |
| 81 | + |
| 82 | +### 计算额外工作空间 |
| 83 | + |
| 84 | +```c |
| 85 | +infiniStatus_t infiniopGetMulWorkspaceSize( |
| 86 | + infiniopMulDescriptor_t desc, |
| 87 | + size_t *size |
| 88 | +); |
| 89 | +``` |
| 90 | + |
| 91 | +<div style="background-color: lightblue; padding: 1px;"> 参数:</div> |
| 92 | + |
| 93 | +- `desc`: |
| 94 | + 已使用 `infiniopCreateMulDescriptor()` 初始化的算子描述符; |
| 95 | +- `size`: |
| 96 | + 额外空间大小的计算结果的写入地址; |
| 97 | + |
| 98 | +<div style="background-color: lightblue; padding: 1px;"> 返回值:</div> |
| 99 | + |
| 100 | +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_NULL_POINTER`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. |
| 101 | + |
| 102 | +### 销毁算子描述符 |
| 103 | + |
| 104 | +```c |
| 105 | +infiniStatus_t infiniopDestroyMulDescriptor( |
| 106 | + infiniopMulDescriptor_t desc |
| 107 | +); |
| 108 | +``` |
| 109 | + |
| 110 | +<div style="background-color: lightblue; padding: 1px;"> 参数: </div> |
| 111 | + |
| 112 | +- `desc`: |
| 113 | + 输入。 待销毁的算子描述符; |
| 114 | + |
| 115 | +<div style="background-color: lightblue; padding: 1px;"> 返回值: </div> |
| 116 | + |
| 117 | +- [`INFINI_STATUS_SUCCESS`], [`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]. |
| 118 | + |
| 119 | +## 已知问题 |
| 120 | + |
| 121 | +无 |
| 122 | + |
| 123 | +<!-- 链接 --> |
| 124 | +[`InfiniopHandle_t`]: README.md |
| 125 | + |
| 126 | +[`INFINI_STATUS_SUCCESS`]: /common/status/README.md#INFINI_STATUS_SUCCESS |
| 127 | +[`INFINI_STATUS_BAD_PARAM`]: /common/status/README.md#INFINI_STATUS_BAD_PARAM |
| 128 | +[`INFINI_STATUS_INSUFFICIENT_WORKSPACE`]: /common/status/README.md#INFINI_STATUS_INSUFFICIENT_WORKSPACE |
| 129 | +[`INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED`]: /common/status/README.md#INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED |
| 130 | +[`INFINI_STATUS_INTERNAL_ERROR`]: /common/status/README.md#INFINI_STATUS_INTERNAL_ERROR |
| 131 | +[`INFINI_STATUS_NULL_POINTER`]: /common/status/README.md#INFINI_STATUS_NULL_POINTER |
| 132 | +[`INFINI_STATUS_BAD_TENSOR_SHAPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_SHAPE |
| 133 | +[`INFINI_STATUS_BAD_TENSOR_DTYPE`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_DTYPE |
| 134 | +[`INFINI_STATUS_BAD_TENSOR_STRIDES`]: /common/status/README.md#INFINI_STATUS_BAD_TENSOR_STRIDES |
0 commit comments