slice

产品支持情况

  • Ascend 950PR&950DT系列产品:支持
  • Atlas A3系列产品:不支持
  • Atlas A2系列产品:不支持
  • Atlas 200I/500 A2推理产品:不支持
  • Atlas推理系列产品AI Core:不支持
  • Atlas推理系列产品Vector Core:不支持
  • Atlas训练系列产品:不支持

功能说明

头文件路径为:tensor_api/tensor.h。

slice用于从张量指定坐标处切出一个子张量。根据输入的起始坐标coord和切片描述信息info,计算新的起始存储位置,并构造对应的子张量,子张量保持与原张量相同的存储位置类型。

函数原型

template <typename Tensor, typename Coord, typename Info>
__aicore__ inline decltype(auto) slice(Tensor&& tensor, const Coord& coord, const Info& info)

参数说明

表1 模板参数说明

参数名 类型 描述
Tensor 输入 张量类型,通常为global_tensor<...>或local_tensor<...>。
Coord 输入 坐标类型,通常为coord<...>元组类型。
Info 输入 切片描述类型,可以为shape类型或layout类型。传入shape时,表示按给定形状截取子张量;传入layout时,表示按layout中的shape信息截取子张量并保持原有布局模式和stride结构。

表2 参数说明

参数名 类型 描述
tensor 输入 待切片的张量对象。
coord 输入 切片起始坐标。
info 输入 切片描述信息。可以传入shape或layout。

返回值说明

返回从coord指定位置开始的子张量对象。返回结果包含新的layout信息,Engine指向切片后的起始位置。

约束说明

  • coord的tuple结构必须与当前Tensor的layout.shape()结构一致。
  • 当info为shape时:info必须是二维shape;当前Tensor的layout必须为二维或四维。
  • 当info为layout时,info必须与当前Tensor的layout的维度相同。

调用示例

#include "tensor_api/tensor.h"

using namespace asc::te;

constexpr uint64_t gm_addr = 128;

// 示例1:按shape切片
auto layout1 = make_layout(make_shape(10, 20), make_stride(20, 1));
auto tensor1 = make_tensor(make_mem_ptr<location::gm, float>(gm_addr), layout1);
auto sub1 = slice(tensor1, make_coord(2, 4), make_shape(4, 8));
// 起始坐标为(2, 4),子张量形状为(4, 8)

// 示例2:按layout切片
auto layout2 = make_layout(make_shape(10, 20), make_stride(20, 1));
auto tensor2 = make_tensor(make_mem_ptr<location::gm, float>(gm_addr), layout2);
auto sub2 = slice(tensor2, make_coord(1, 2), make_layout(make_shape(3, 5), make_stride(20, 1)));
// 从(1, 2)开始切出一个shape为(3, 5)的子张量,并保持stride结构

// 示例3:等价于调用成员函数
auto sub3 = tensor2.slice(make_coord(1, 2), make_shape(3, 5));
// sub3与slice(tensor2, make_coord(1, 2), make_shape(3, 5))等价