---
title: make_tiled_mma
description: "创建tiled_mma策略，用于后续矩阵乘加操作。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_109.html
sourcePath: /source/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_109.html
indexId: 4843f84510b30103dbbc7b76d14c4adf4d1c634c4e2f437e0171075d99db349a67
---
# make_tiled_mma

创建tiled_mma策略，用于后续矩阵乘加操作。

涉及mma_atom原子矩阵乘加方法和atom_shape原子方法扩展shape输入，其中mma_atom计算矩阵大小与atom_shape相应m/n/k相乘所得乘积结果表示实际tiled_mma方法计算矩阵大小。

当前atom_shape中m/n不支持任意扩展，只能设置为1，k支持任意大小。

#### 接口定义

template<typename MmaAtom, typename Shape>

TiledMma<MmaAtom, Shape> make_tiled_mma(MmaAtom mma_atom, Shape atom_shape);


#### 模板参数


**表1 模板参数定义**

| 参数名 | 类型 | 描述 |
| --- | --- | --- |
| MmaAtom | typename | mma原子策略类型。 |
| Shape | typename | 形状类型。 |


#### 参数


**表2 参数定义**

| 参数名 | 类型 | 描述 | 输入/输出 |
| --- | --- | --- | --- |
| mma\_atom | MmaAtom，Ops<枚举mma\_atom\_t> | mma原子策略，当前mma\_atom\_t可设置为： KP36\_32x16x1\_F64F64F64：表示计算尺寸为32\*16\*1，其中A矩阵为列主序、计算步长为Stride<1, 32>，B矩阵为行主序、计算步长为Stride<16, 1>，C矩阵为行主序、计算步长为Stride<16, 1>，计算精度为float64 \* float64 = float64的mma原子行为 KP36\_32x16x512\_F64F64F64：表示计算尺寸为32\*16\*512，其中A矩阵为列主序、计算步长为Stride<1, 32>，B矩阵为行主序、计算步长为Stride<16, 1>，C矩阵为行主序、计算步长为Stride<16, 1>，计算精度为float64 \* float64 = float64的mma原子行为 KP36\_16x64x2\_BF16BF16F32：表示计算尺寸为16\*64\*2，其中A矩阵为ZZ峰形、计算步长为Stride<2, Stride<1, 32>>，B矩阵为NN峰形、计算步长为Stride<Stride<1, 128>, 2>，C矩阵为行主序、计算步长为Stride<64, 1>，计算精度为bfloat16 \* bfloat16 = float32的mma原子行为 KP36\_16x64x1\_BF16BF16F32：表示计算尺寸为16\*64\*1，其中A矩阵为列主序、计算步长为Stride<1, 16>，B矩阵为行主序、计算步长为Stride<64, 1>，C矩阵为行主序、计算步长为Stride<64, 1>，计算精度为bfloat16 \* bfloat16 = float32的mma原子行为 KP36\_16x64x4\_INT8INT8INT32：表示计算尺寸为16\*64\*4，其中A矩阵为ZZ峰形、计算步长为Stride<4, Stride<1, 64>>，B矩阵为NN峰形、计算步长为Stride<Stride<1, 256>, 4>，C矩阵为行主序、计算步长为Stride<64, 1>，计算精度为int8 \* int8 = int32的mma原子行为 KP36\_32x32x4\_INT8INT8INT32：表示计算尺寸为32\*32\*4，其中A矩阵为ZZ峰形、计算步长为Stride<4, Stride<1, 128>>，B矩阵为NN峰形、计算步长为Stride<Stride<1, 128>, 4>，C矩阵为行主序、计算步长为Stride<32, 1>，计算精度为int8 \* int8 = int32的mma原子行为 | 输入 |
| atom\_shape | Shape | 原子策略在各维度执行次数，包含m、n和k三个数值。 | 输入 |


#### 返回值

返回TiledMma<MmaAtom, Shape>对象。


#### 示例

```
#include "stdlib.h"
#include "kupl_mma.h"
using namespace kupl::tensor;
int main()
{
constexpr int MATRIX_M  = 32;
constexpr int MATRIX_N  = 16;
constexpr int MATRIX_K = 512;
double *data_a = (double *)malloc(sizeof(double) * MATRIX_M * MATRIX_K);
double *data_b = (double *)malloc(sizeof(double) * MATRIX_K * MATRIX_N);
double *data_c = (double *)malloc(sizeof(double) * MATRIX_M * MATRIX_N);
auto shape_a = make_shape(Int<32>{}, Int<512>{});
auto shape_b = make_shape(Int<512>{}, Int<16>{});
auto shape_c = make_shape(Int<32>{}, Int<16>{});
auto stride_a = make_stride(Int<1>{}, Int<32>{});
auto stride_b = make_stride(Int<16>{}, Int<1>{});
auto stride_c = make_stride(Int<16>{}, Int<1>{});
auto layout_a = make_layout(shape_a, stride_a);
auto layout_b = make_layout(shape_b, stride_b);
auto layout_c = make_layout(shape_c, stride_c);
auto mma_atom_shape = make_shape(Int<1>{}, Int<1>{}, Int<1>{});
auto tiled_mma =
make_tiled_mma
(Ops<KP36_32x16x512_F64F64F64>{}, mma_atom_shape);
auto store_atom_shape = make_shape(Int<1>{}, Int<1>{});
auto tiled_store = make_tiled_store(Ops<KP36_32x16_F64_STORE>{}, store_atom_shape);
auto tensor_a = make_tensor(data_a, layout_a);
auto tensor_b = make_tensor(data_b, layout_b);
auto tensor_c = make_tensor(data_c, layout_c);
mma(tiled_mma, tensor_c, tensor_a, tensor_b, tensor_c);
store(tiled_store, tensor_c);
free(data_a);
free(data_b);
free(data_c);
return 0;
}
```

上述示例演示了基于32*16*512_F64F64F64矩阵形状的mma流程，其中通过make_tiled_mma创建mma tile策略。
