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

tensor_tiled_copy(Trans)

Trans类型的tensor_tiled_copy接口表示不同排布矩阵之间的转置Copy操作。

涉及TiledCopy策略和Tensor dst/src矩阵输入,其中Tensor dst/src的形状Shape和跨度步长Stride必须与TiledCopy策略定义一致。

接口定义

template<typename TiledCopy,

typename dtypeD, typename LayoutD,

typename dtypeS, typename LayoutS>

void tensor_tiled_copy(TiledCopy copy, Tensor<dtypeD, LayoutD> dst, Tensor<dtypeS, LayoutS> src);

模板参数

表1 模板参数定义

参数名

类型

描述

TiledCopy

typename

copy tile策略类型。

dtypeD, dtypeS

typename

dst,src精度类型。

LayoutD, LayoutS

typename

dst,src布局类型。

参数

表2 参数定义

参数名

类型

描述

输入/输出

copy

TiledCopy

copy tile策略。

输入

dst

Tensor<dtypeD, LayoutD>

转置目标矩阵。

输出

src

Tensor<dtypeS, LayoutS>

转置源矩阵。

输入

返回值

void

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <stdlib.h>
#include "kupl_mma.h"
using namespace kupl::tensor;

int main()
{
    constexpr int MATRIX_M = 32;
    constexpr int MATRIX_N = 512;
    double *dst = (double*)malloc(sizeof(double) * MATRIX_M * MATRIX_N);
    double *src = (double*)malloc(sizeof(double) * MATRIX_M * MATRIX_N);
    for (int i = 0; i < MATRIX_M; i++) {
        for (int j = 0; j < MATRIX_N; j++) {
            dst[i * MATRIX_N + j] = 0.0;
            src[i * MATRIX_N + j] = i * MATRIX_N + j;
        }
    }

    auto shape_d = make_shape(Int<MATRIX_M>{}, Int<MATRIX_N>{});
    auto shape_s = make_shape(Int<MATRIX_M>{}, Int<MATRIX_N>{});

    auto stride_d = make_stride(Int<1>{}, Int<MATRIX_M>{});
    auto stride_s = make_stride(Int<MATRIX_N>{}, Int<1>{});

    auto layout_d = make_layout(shape_d, stride_d);
    auto layout_s = make_layout(shape_s, stride_s);

    auto atom_copy_shape = make_shape(Int<1>{}, Int<MATRIX_N>{});
    auto tiled_copy = make_tiled_copy(Ops<COPY_32x1_F64_RM2CM>{}, atom_copy_shape);

    auto tensor_d = make_tensor(dst, layout_d);
    auto tensor_s = make_tensor(src, layout_s);
    tensor_tiled_copy(tiled_copy, tensor_d, tensor_s);

    free(src);
    free(dst);
    return 0;
}

上述示例演示了基于32*512_F64矩阵形状从行主序到列主序的copy流程,其中通过tensor_tiled_copy根据创建的copy tile策略执行具体的copy转置操作。