---
title: 常规matmul与叠加偏置
description: "| 硬件型号 | 是否支持 | 特殊说明 |"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/API/ascendtb/ascendtb_01_0162.html
sourcePath: /source/zh/canncommercial/900/API/ascendtb/ascendtb_01_0162.html
indexId: c2b77180715a24b4daa57c91937a9d9922a0627d1a5301da20afa1b6262baa4564
---
# 常规matmul与叠加偏置

#### 产品支持情况

| 硬件型号 | 是否支持 | 特殊说明 |
| --- | --- | --- |
| Atlas 350 加速卡 | x | \- |
| Atlas A3 推理系列产品 / Atlas A3 训练系列产品 | √ | \- |
| Atlas A2 训练系列产品 / Atlas A2 推理系列产品 | √ | \- |
| Atlas 训练系列产品 | x | \- |
| Atlas 推理系列产品 | √ | \- |
| Atlas 200I/500 A2 推理产品 | √ | 不支持输入输出tensor数据类型为bf16的场景。 |


#### 功能说明

常规矩阵乘matmul的功能，且可通过hasBias参数控制是否叠加偏置。


#### 计算公式

矩阵乘输入两个张量A（x）和B（weight），输出张量为C：


叠加偏置，偏置矩阵为bias：


#### 参数配置

| 成员名称 | 取值范围 | 特殊说明 |
| --- | --- | --- |
| transposeA | false/true | 取值为true时，不支持部分场景，详见规格说明。float只支持false。 |
| transposeB | false/true | float只支持true。 |
| hasBias | false/true | float只支持false。 |
| outDataType | ACL\_DT\_UNDEFINED | \- |
| enAccum | false | \- |
| matmulType | MATMUL\_UNDEFINED | \- |
| quantMode | QUANT\_UNDEFINED | \- |


#### 输入

| 参数 | 维度 | 数据类型 | 格式 | 描述 |
| --- | --- | --- | --- | --- |
| x | [m, k]/[batch, m, k] | float16/bf16/float | ND | 矩阵乘的A矩阵。float只支持维度为[m, k]。 |
| weight | [k, n]/[batch, k, n]/[1, n / 16, k, 16]/[batch, n / 16, k, 16] | float16/bf16/float | ND/NZ | 矩阵乘的B矩阵，权重。float只支持维度[k, n]，ND格式。 |
| bias | [1, n]/[n]/[batch, n] | float16/bf16/float | ND | 叠加的偏置矩阵。当hasBias取值为true时输入。 |


#### 输出

| 参数 | 维度 | 数据类型 | 格式 | 描述 |
| --- | --- | --- | --- | --- |
| output | [m, n]/[batch, m, n] | float16/bf16/float | ND | 矩阵乘计算结果。float只支持维度为[m, n]。 |


#### 规格说明

由于输入输出的排列组合约束较复杂，下图列举了所有输入输出属性的组合，图中没有的组合即不支持：

图1 输入输出属性排列组合

- Atlas 推理系列产品不支持组合7-13。
- “transposeA”取值为true时，不支持组合2、5、8、11。
- 所有输入输出tensor的数据类型均相同。
- 当weight维度为4维时，k和n的值均为16的整数倍。
- 组合13仅保证如下shape的性能：m=1~256，k=7168, n=256，其他shape功能支持，性能可能会有下降。


#### OP使用与典型场景

OP使用时，可参考算子使用指导（ATB C++ API）中的使用流程部分，其中，单算子构造Operation参数的构造方法参考下列各场景的参数构造部分。

- 场景一

```
//
参数构造
atb::infer::LinearParam param;
param.transposeA = false;
param.transposeB = false;
param.hasBias = false;
param.outDataType = ACL_DT_UNDEFINED;
param.enAccum = false;
param.matmulType = MATMUL_UNDEFINED;
param.quantMode = QUANT_UNDEFINED;
```

```
#
计算示例
>>> x
tensor([[1, 2],
[3, 4]])
>>> weight
tensor([[1, 2, 3],
[4, 5, 6]])
>>> output
tensor([[9, 12, 15],
[19, 26, 33]])
# 9  = 1 * 1 + 2 * 4
# 12 = 1 * 2 + 2 * 5
# 15 = 1 * 3 + 2 * 6
# 19 = 3 * 1 + 4 * 4
# 26 = 3 * 2 + 4 * 5
# 33 = 3 * 3 + 4 * 6
```


- 场景二

```
// 参数构造
atb::infer::LinearParam param;
param.transposeA = true;
param.transposeB = true;
param.hasBias = false;
param.outDataType = ACL_DT_UNDEFINED;
param.enAccum = false;
param.matmulType = MATMUL_UNDEFINED;
param.quantMode = QUANT_UNDEFINED;
```

```
# 根据行列转置情况，该示例和前一示例计算相同。
>>> x
tensor([[1, 3],
[2, 4]])
>>> weight
tensor([[1, 4],
[2, 5],
[3, 6]])
>>> output
tensor([[9, 12, 15],
[19, 26, 33]])
```


- 场景三

```
// 参数构造
atb::infer::LinearParam param;
param.transposeA = false;
param.transposeB = false;
param.hasBias = true;
param.outDataType = ACL_DT_UNDEFINED;
param.enAccum = false;
param.matmulType = MATMUL_UNDEFINED;
param.quantMode = QUANT_UNDEFINED;
```

```
# 计算示例
>>> x
tensor([[1, 2],
[3, 4]])
>>> weight
tensor([[1, 2, 3],
[4, 5, 6]])
>>> bias
tensor([1, 2, 3])
>>> output
tensor([[10, 14, 18],
[20, 28, 36]])
# 10 = 1 * 1 + 2 * 4 + 1
# 14 = 1 * 2 + 2 * 5 + 2
# 18 = 1 * 3 + 2 * 6 + 3
# 20 = 3 * 1 + 4 * 4 + 1
# 28 = 3 * 2 + 4 * 5 + 2
# 36 = 3 * 3 + 4 * 6 + 3
```


#### 功能约束

- “transposeA”为true时不支持部分场景。
- “outDataType”为ACL_DT_UNDEFINED。
- “enAccum”为false。
