Tensor
KUPL矩阵编程模块中的Tensor类用以描述矩阵对象,具体包含源数据与布局。用户通过定义创建KUPL Tensor从而让KUPL感知到用户的矩阵相关信息,用于后续Tensor operator、MMA、Copy等操作行为。
类定义
template <typename dtype, typename Layout>
class Tensor {};
类成员变量
成员变量名 |
成员变量类型 |
描述 |
|---|---|---|
ptr_ |
dtype* |
存储用户矩阵对象的原始内存空间,从而供矩阵编程模块后续操作感知;其中dtype为类模板参数,表示用户矩阵对象的精度类型。 |
layout_ |
Layout |
描述用户矩阵对象的内存排布信息,从而确保矩阵编程模块后续操作的正确性。 |
类成员函数
一、Tensor对象取下标及切片能力:Tensor(coord)
参数名 |
类型 |
描述 |
输入/输出 |
|---|---|---|---|
coord |
Coord |
表示需要获取的具体坐标;当输入Coord类型中带有Underscore类型时表示Tensor切片能力 |
输入 |
value/tensor |
dtype/Tensor |
Tensor对象取下标及切片能力的返回值信息,当坐标具体到特定点时返回具体坐标的元素值,当输入Coord类型中带有Underscore类型时返回Tensor切片后的子Tensor对象 |
输出 |
二、Tensor对象逐元素相加能力:TensorC = TensorA + TensorB
参数名 |
类型 |
描述 |
输入/输出 |
|---|---|---|---|
tensorA |
Tensor |
Tensor逐元素相加操作的A矩阵 |
输入 |
tensorB |
Tensor |
Tensor逐元素相加操作的B矩阵 |
输入 |
tensorC |
Tensor |
Tensor逐元素相加操作的结果输出C矩阵,其中A/B/C矩阵拥有相同的Layout排布 |
输出 |
三、Tensor对象标量乘能力:TensorC = A * TensorB / TensorC = TensorB * A
参数名 |
类型 |
描述 |
输入/输出 |
|---|---|---|---|
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接口参数。