常规矩阵乘matmul的功能,且可通过hasBias参数控制是否叠加偏置。
矩阵乘输入两个张量A(x)和B(weight),输出张量为C:

叠加偏置,偏置矩阵为bias:

|
硬件型号 |
支持情况 |
特殊说明 |
|---|---|---|
|
|
支持 |
- |
|
|
支持 |
不支持输入输出tensor数据类型为bf16的场景。 |
|
成员名称 |
取值范围 |
特殊说明 |
|---|---|---|
|
transposeA |
false/true |
取值为true时,不支持部分场景,详见规格说明。 |
|
transposeB |
false/true |
- |
|
hasBias |
false/true |
- |
|
outDataType |
ACL_DT_UNDEFINED |
- |
|
enAccum |
false |
- |
|
参数 |
维度 |
数据类型 |
格式 |
描述 |
|---|---|---|---|---|
|
x |
[m, k]/[batch, m, k] |
float16/bf16 |
ND |
矩阵乘的A矩阵。 |
|
weight |
[k, n]/[batch, k, n]/[1, n / 16, k, 16]/[batch, n / 16, k, 16] |
float16/bf16 |
ND/NZ |
矩阵乘的B矩阵,权重。 |
|
bias |
[1, n]/[n]/[batch, n] |
float16/bf16 |
ND |
叠加的偏置矩阵。当hasBias取值为true时输入。 |
|
参数 |
维度 |
数据类型 |
格式 |
描述 |
|---|---|---|---|---|
|
output |
[m, n]/[batch, m, n] |
float16/bf16 |
ND |
矩阵乘计算结果。 |
由于输入输出的排列组合约束较复杂,下图列举了所有输入输出属性的组合,图中没有的组合即不支持:
OP使用时,可参考算子使用指导中的使用流程部分,其中,单算子(OpsOperation)构造Operation参数的构造方法参考下列各场景的参数构造部分。
// 参数构造 atb::infer::LinearParam param; param.transposeA = false; param.transposeB = false; param.hasBias = false; param.outDataType = ACL_DT_UNDEFINED; param.enAccum = false;
# 计算示例
>>> 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;
# 根据行列转置情况,该示例和前一示例计算相同。
>>> 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;
# 计算示例
>>> 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 + 3transposeA为true时不支持部分场景。
outDataType为ACL_DT_UNDEFINED。
enAccum为false。
矩阵乘matmul与add融合,该功能类似功能1中的叠加偏置,性能较优。
矩阵乘输入两个张量A(x)和B(weight),偏置矩阵为bias,输出张量为C:

|
硬件型号 |
支持情况 |
|---|---|
|
|
支持 |
|
|
不支持 |
|
成员名称 |
取值范围 |
特殊说明 |
|---|---|---|
|
transposeA |
false/true |
取值为true时,不支持部分场景,详见规格说明。 |
|
transposeB |
false/true |
- |
|
hasBias |
true |
- |
|
outDataType |
ACL_DT_UNDEFINED |
- |
|
enAccum |
false |
- |
|
参数 |
维度 |
数据类型 |
格式 |
描述 |
|---|---|---|---|---|
|
x |
[m, k]/[batch, m, k] |
float16/bf16 |
ND |
矩阵乘的A矩阵。 |
|
weight |
[k, n]/[batch, k, n] |
float16/bf16 |
ND |
矩阵乘的B矩阵,权重。 |
|
bias |
[1, n]/[n]/[batch, n] |
float |
ND |
叠加的偏置矩阵。 |
|
参数 |
维度 |
数据类型 |
格式 |
描述 |
|---|---|---|---|---|
|
output |
[m, n]/[batch, m, n] |
float16/bf16 |
ND |
矩阵乘计算结果。 |
“transposeA”取值为true时,不支持组合2、5。
// 参数构造 atb::infer::LinearParam param; param.transposeA = false; param.transposeB = false; param.hasBias = true; param.outDataType = ACL_DT_UNDEFINED; param.enAccum = false;
# 计算示例
>>> 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时不支持部分场景。
hasBias为true。
outDataType为ACL_DT_UNDEFINED。
enAccum为false。
矩阵乘matmul与inplaceAdd融合,将矩阵乘结果累加到累加矩阵上,相较于算子拼接的方案,性能较优。
矩阵乘输入两个张量A(x)和B(weight),累加张量为C(accum),同时也是输出张量:

|
硬件型号 |
支持情况 |
|---|---|
|
|
支持 |
|
|
不支持 |
|
成员名称 |
取值范围 |
特殊说明 |
|---|---|---|
|
transposeA |
false/true |
取值为true时,不支持部分场景,详见规格说明。 |
|
transposeB |
false/true |
- |
|
hasBias |
false |
- |
|
outDataType |
ACL_DT_UNDEFINED |
- |
|
enAccum |
true |
- |
|
参数 |
维度 |
数据类型 |
格式 |
描述 |
|---|---|---|---|---|
|
x |
[m, k]/[batch, m, k] |
float16/bf16 |
ND |
矩阵乘的A矩阵。 |
|
weight |
[k, n]/[batch, k, n] |
float16/bf16 |
ND |
矩阵乘的B矩阵,权重。 |
|
bias |
[m, n]/[batch, m, n] |
float |
ND |
累加矩阵。 |
|
参数 |
维度 |
数据类型 |
格式 |
描述 |
|---|---|---|---|---|
|
output |
[m, n]/[batch, m, n] |
float |
ND |
累加矩阵,与accum为同一个Tensor,即计算结果原地写。 |
由于输入输出的排列组合约束较复杂,下表列举了所有输入输出属性的组合,表格中没有的组合即不支持:
“transposeA”取值为true时,不支持组合2、5、8、11。
OP使用时,可参考算子使用指导中的使用流程部分,其中,单算子(OpsOperation)构造Operation参数的构造方法参考以下参数构造部分。
// 参数构造 atb::infer::LinearParam param; param.transposeA = false; param.transposeB = false; param.hasBias = false; param.outDataType = ACL_DT_UNDEFINED; param.enAccum = true;
# 计算示例
>>> x
tensor([[1, 2],
[3, 4]])
>>> weight
tensor([[1, 2, 3],
[4, 5, 6]])
>>> accum
tensor([[1, 2, 3],
[4, 5, 6])
>>> output
tensor([[10, 14, 18],
[23, 31, 39]])
# 10 = 1 * 1 + 2 * 4 + 1
# 14 = 1 * 2 + 2 * 5 + 2
# 18 = 1 * 3 + 2 * 6 + 3
# 23 = 3 * 1 + 4 * 4 + 4
# 31 = 3 * 2 + 4 * 5 + 5
# 39 = 3 * 3 + 4 * 6 + 6transposeA为true时不支持部分场景。
hasBias为false。
outDataType为ACL_DT_UNDEFINED。
enAccum为true。
矩阵乘matmul加反量化处理,通过hasBias参数控制是否叠加偏置。
矩阵乘输入两个张量A(x)和B(weight),反量化步长为deqScale,输出张量为C,dequant为反量化处理函数:

叠加偏置的场景下,偏置矩阵为bias:

|
硬件型号 |
支持情况 |
特殊说明 |
|---|---|---|
|
|
支持 |
- |
|
|
支持 |
|
|
成员名称 |
取值范围 |
特殊说明 |
|---|---|---|
|
transposeA |
false/true |
取值为true时,不支持部分场景,详见规格说明。 |
|
transposeB |
false/true |
受硬件约束。 |
|
hasBias |
false/true |
受硬件约束。 |
|
outDataType |
ACL_FLOAT16/ACL_BF16 |
受硬件约束。该参数对应输出tensor的数据类型。 |
|
enAccum |
false |
- |
|
参数 |
维度 |
数据类型 |
格式 |
描述 |
|---|---|---|---|---|
|
x |
[m, k]/[batch, m, k] |
int8 |
ND |
矩阵乘的A矩阵。 |
|
weight |
[k, n]/[batch, k, n]/[1, n / 16, k, 16]/[batch, n / 16, k, 16] |
int8 |
ND/NZ |
矩阵乘的B矩阵,权重。 |
|
bias |
[1, n]/[n]/[batch, n] |
int32 |
ND |
叠加的偏置矩阵。当hasBias取值为true时输入。 |
|
deqScale |
[1, n]/[n]/[batch, n] |
int64/uint64/float |
ND |
反量化步长。 |
|
参数 |
维度 |
数据类型 |
格式 |
描述 |
|---|---|---|---|---|
|
output |
[m, n]/[batch, m, n] |
float16/bf16 |
ND |
矩阵乘反量化计算结果。 |
由于输入输出的排列组合约束较复杂,下表列举了所有输入输出属性的组合,表格中没有的组合即不支持:
OP使用时,可参考算子使用指导中的使用流程部分,其中,单算子(OpsOperation)构造Operation参数的构造方法参考以下参数构造部分。
// 参数构造 atb::infer::LinearParam param; param.transposeA = false; param.transposeB = false; param.hasBias = true; param.outDataType = ACL_FLOAT16; param.enAccum = false;
# 计算示例
>>> x
tensor([[1, 2],
[3, 4]])
>>> weight
tensor([[1, 2, 3],
[4, 5, 6]])
>>> bias
tensor([1, 2, 3])
>>> deqScale
tensor([1, 2, 3])
>>> output
tensor([[10, 28, 54],
[20, 56, 108]])
# 10 = (1 * 1 + 2 * 4 + 1) * 1
# 28 = (1 * 2 + 2 * 5 + 2) * 2
# 54 = (1 * 3 + 2 * 6 + 3) * 3
# 20 = (3 * 1 + 4 * 4 + 1) * 1
# 56 = (3 * 2 + 4 * 5 + 2) * 2
# 108 = (3 * 3 + 4 * 6 + 3) * 3