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);
模板参数
参数名 |
类型 |
描述 |
|---|---|---|
TiledCopy |
typename |
copy tile策略类型。 |
dtypeD, dtypeS |
typename |
dst,src精度类型。 |
LayoutD, LayoutS |
typename |
dst,src布局类型。 |
参数
参数名 |
类型 |
描述 |
输入/输出 |
|---|---|---|---|
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转置操作。
父主题: 矩阵编程接口函数