开发者
资源
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

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接口参数。