---
title: Tensor
description: "KUPL矩阵编程模块中的Tensor类用以描述矩阵对象，具体包含源数据与布局。用户通过定义创建KUPL Tensor从而让KUPL感知到用户的矩阵相关信息，用于后续Tensor operator、MMA、Copy等操作行为。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_241.html
sourcePath: /source/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_241.html
indexId: 329e9ed2f524880f556090dcd9cb29669c554f2984ef16a1e56458d37380358567
---
# Tensor

KUPL矩阵编程模块中的Tensor类用以描述矩阵对象，具体包含源数据与布局。用户通过定义创建KUPL Tensor从而让KUPL感知到用户的矩阵相关信息，用于后续Tensor operator、MMA、Copy等操作行为。

#### 类定义

template <typename dtype, typename Layout>

class Tensor {};


#### 类成员变量


**表1 类成员变量定义**

| 成员变量名 | 成员变量类型 | 描述 |
| --- | --- | --- |
| ptr\_ | dtype\* | 存储用户矩阵对象的原始内存空间，从而供矩阵编程模块后续操作感知；其中dtype为类模板参数，表示用户矩阵对象的精度类型。 |
| layout\_ | Layout | 描述用户矩阵对象的内存排布信息，从而确保矩阵编程模块后续操作的正确性。 |


#### 类成员函数

一、Tensor对象取下标及切片能力：Tensor(coord)


**表2 类成员函数Tensor()输入输出定义**

| 参数名 | 类型 | 描述 | 输入/输出 |
| --- | --- | --- | --- |
| coord | Coord | 表示需要获取的具体坐标；当输入Coord类型中带有Underscore类型时表示Tensor切片能力 | 输入 |
| value/tensor | dtype/Tensor | Tensor对象取下标及切片能力的返回值信息，当坐标具体到特定点时返回具体坐标的元素值，当输入Coord类型中带有Underscore类型时返回Tensor切片后的子Tensor对象 | 输出 |


二、Tensor对象逐元素相加能力：TensorC = TensorA + TensorB


**表3 类成员函数Tensor operator+输入输出定义**

| 参数名 | 类型 | 描述 | 输入/输出 |
| --- | --- | --- | --- |
| tensorA | Tensor | Tensor逐元素相加操作的A矩阵 | 输入 |
| tensorB | Tensor | Tensor逐元素相加操作的B矩阵 | 输入 |
| tensorC | Tensor | Tensor逐元素相加操作的结果输出C矩阵，其中A/B/C矩阵拥有相同的Layout排布 | 输出 |


三、Tensor对象标量乘能力：TensorC = A * TensorB / TensorC = TensorB * A


**表4 类成员函数Tensor operator*输入输出定义**

| 参数名 | 类型 | 描述 | 输入/输出 |
| --- | --- | --- | --- |
| A | dtype | Tensor标量乘操作的标量元素 | 输入 |
| tensorB | Tensor | Tensor标量乘操作的被乘矩阵 | 输入 |
| tensorC | Tensor | Tensor标量乘操作的相乘结果输出C矩阵，其中B/C矩阵拥有相同的Layout排布 | 输出 |


#### 示例

```
#include "stdlib.h"
#include "kupl_mma.h"
using namespace kupl::tensor;
int main()
{
constexpr int MATRIX_M  = 32;
constexpr int MATRIX_N  = 16;
double *data_a = (double *)malloc(sizeof(double) * MATRIX_M * MATRIX_N);
double *data_b = (double *)malloc(sizeof(double) * MATRIX_M * MATRIX_N);
double *data_c = (double *)malloc(sizeof(double) * MATRIX_M * MATRIX_N);
auto shape = make_shape(Int<32>{}, Int<16>{});
auto stride = make_stride(Int<16>{}, Int<1>{});
auto layout = make_layout(shape, stride);
atuo tensor_a = make_tensor(data_a, layout);
auto tensor_b = make_tensor(data_b, layout);
auto tensor_c = make_tensor(data_c, layout);
// Tensor对象取下标及切片操作如下所述
// 获取下标为（2，2）的Tensor元素
auto coord1 = make_coord(Int<2>{}, Int<2>{});
auto ret1 =
tensor(coord1)
;
// 通过Underscore类型变量实现Tensor切片效果，coord2表示获取第2行所有Tensor元素
auto coord2 = make_coord(Int<2>{}, Underscore{});
auto ret2 =
tensor(coord2)
;
auto coord3 = make_coord(Int<2>{});
auto ret3 =
ret2(coord3)
;
// Tensor对象逐元素相加操作如下所述
tensor_c = tensor_a + tensor_b
;
// Tensor对象标量乘操作如下所述
tensor_c = tensor_b * 2.0
;
tensor_c = 2.0 * tensor_a
;
free(data_c);
free(data_b);
free(data_a);
return 0;
}
```

上述示例演示了基于32*16*512_F64F64F64矩阵形状的mma流程，其中通过make_tensor创建矩阵对象tensor，作为后续mma/store接口参数。
