CANN坐标转换函数Crd2Idx

📅 2026/7/15 14:56:01
CANN坐标转换函数Crd2Idx
Crd2Idx产品支持情况产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品 / Atlas A3 推理系列产品√Atlas A2 训练系列产品 / Atlas A2 推理系列产品√Atlas 200I/500 A2 推理产品xAtlas 推理系列产品 AI CorexAtlas 推理系列产品 Vector CorexAtlas 训练系列产品x功能说明Crd2Idx函数用于将多维坐标Coordinate通过布局Layout转换为内存位置索引Index这里的Layout包含了Shape和Stride信息。对于一个布局Layout其Shape为(d0, d1, ..., dn)Stride为(s0, s1, ..., sn)Coordinate为(c0, c1, ..., cn)到线性索引Index的转换公式为例如对于Shape (3, 4, 5)Stride (20, 5, 1)和Coordinate (1, 2, 3)维度0: c₀ * s₀ 1 * 20 20 维度1: c₁ * s₁ 2 * 5 10 维度2: c₂ * s₂ 3 * 1 3 Index 20 10 3 33当Coordinate维度和Stride维度不相同时可以采用去线性化delinearize的方法使得Coordinate维度和Stride维度相同再使用上述公式计算得到最终结果。去线性化的方法介绍如下对于一个n维数组形状为(d0, d1, ..., dn)线性坐标c对应的多维坐标(c0, c1, ..., cn)可以通过以下公式进行转换例如对于Shape ((2, 4), (3, 5))Stride((3, 6), (1, 24))Layout ((2, 4), (3, 5)) : ((3, 6), (1, 24))Coordinate11, 12按照列优先原则Crd2Idx的结果为crd2idx delinearize(11, 12) * stride ((11 % 2, 11 / 2), (12 % 3, 12 / 3)) * ((3, 6), (1, 24)) ((1, 5), (0, 4)) * ((3, 6), (1, 24)) 1 * 3 5 * 6 0 * 1 4 * 24 129总结上述过程计算公式如下其中(d0, d1, ..., dn)为Shape(s0, s1, ..., sn)为Stridedelinearize公式展开如下函数原型// Layout输入Coordinate转换为Index template typename CoordType, typename ShapeType, typename StrideType __aicore__ inline constexpr auto Crd2Idx(const CoordType coord, const LayoutShapeType, StrideType layout) // Shape和Stride输入Coordinate转换为Index template typename CoordType, typename ShapeType, typename StrideType __aicore__ inline constexpr auto Crd2Idx(const CoordType coord, const ShapeType shape, const StrideType stride)参数说明参数名输入/输出描述coord输入Std::tuple结构类型用于表示张量在不同维度上的坐标值。输入的数据类型支持size_t和Std::Int。layout输入输入的Layout对象。输入的数据类型支持size_t和Std::Int。shape输入Std::tuple结构类型用于定义数据的逻辑形状例如二维矩阵的行数和列数或多维张量的各维度大小。输入的数据类型支持size_t和Std::Int。stride输入Std::tuple结构类型用于定义各维度在内存中的步长即同维度相邻元素在内存中的间隔间隔的单位为元素与Shape的维度信息一一对应。输入的数据类型支持size_t和Std::Int。返回值说明返回根据Coordinate信息转换之后的索引值。约束说明输入参数需满足对应的数据类型要求。调用示例// Layout形式入参计算索引值 constexpr int M 11; constexpr int N 12; constexpr int blockM 13; constexpr int blockN 14; auto coord AscendC::MakeCoord(AscendC::Std::Int20{}, AscendC::Std::Int30{}); auto shape AscendC::MakeShape(AscendC::MakeShape(AscendC::Std::IntblockM{}, AscendC::Std::IntM/blockM{}), AscendC::MakeShape(AscendC::Std::IntblockN{}, AscendC::Std::IntN/blockN{})); auto stride AscendC::MakeStride(AscendC::MakeStride(AscendC::Std::IntblockN{}, AscendC::Std::IntblockM*blockN{}),AscendC::MakeStride(AscendC::Std::Int1{}, AscendC::Std::IntM*blockN{})); auto layout AscendC::MakeLayout(shape, stride); auto index layout(coord); // decltype(index)::value 590 index AscendC::Crd2Idx(coord, layout); // decltype(index)::value 590 // Shape和Stride形式入参计算索引值 auto blockCoordM AscendC::Std::Int11{}; auto blockCoordN AscendC::Std::Int12{}; auto baseShapeM AscendC::Std::Int13{}; auto baseShapeN AscendC::Std::Int14{}; auto basestrideM AscendC::Std::Int15{}; auto basestrideN AscendC::Std::Int16{}; auto coord AscendC::MakeCoord(AscendC::Std::Int0{}, blockCoordN); auto shape AscendC::MakeShape(AscendC::MakeShape(baseShapeM, baseShapeM), AscendC::MakeShape(baseShapeN, baseShapeN)); auto stride AscendC::MakeStride(AscendC::MakeStride(basestrideM, basestrideM),AscendC::MakeStride(basestrideN, basestrideN)); auto index AscendC::Crd2Idx(coord, shape, stride); // decltype(index)::value 192创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考