开发者
下载

OP_OUTSHAPE

宏功能

针对需要计算结果来确定输出shape的算子,如NonZero算子,该宏用于存放此类算子输出shape的aclTensor。

宏原型

OP_OUTSHAPE(x...)

参数说明

参数

输入/输出

说明

x...

输入

包含两部分,第一个参数是存放输出tensor shape的张量(aclTensor),第二个参数是存放需要更新输出shape的tensor索引。

约束说明

只支持刷新一个输出tensor shape的Tensor(outShapeTensor),其对应shape为(9, )。每个输出tensor的shape占9位,其中第一位表示维度数,剩下8位表示每个维度的具体值。

调用示例

 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
// 表示算子将输出tensor的shape存放到outShapeTensor中,并且用来更新idx=0的输出tensor的shape
OP_OUTSHAPE({outShapeTensor, 0});

// 刷新多个输出tensor的shape的时候,可以参考如下示例,本例中需要更新idx=0,3,4三个输出tensor的shape
// host侧
Shape outShapeShape{27};
auto outShapeTensor = executor->AllocTensor(outShapeShape, DataType::DT_INT64, Format::FORMAT_ND);
aclnnStatus ret =
    ADD_TO_LAUNCHER_LIST_AICORE(
        xxx,
        OP_INPUT(...),
        OP_OUTPUT(...),
        OP_ATTR(...),
        OP_OUTSHAPE({outShapeTensor, 0}),
        OP_OUTSHAPE({outShapeTensor, 3}),
        OP_OUTSHAPE({outShapeTensor, 4}),
        );

// kernel侧
__aicore__ inline void CopyOutShape(uint64_t dimNums1, uint64_t *dimNums2, uint64_t dimNums3)
{
    LocalTensor<uint64_t> shapeTensor = shapeBuf_.Get<uint64_t>();
    shapeTensor.SetValue(0, 1);                // 第一个输出tensor的维度信息
    shapeTensor.SetValue(1, dimNums1);         // 第一个输出tensor的第一维的shape值
    shapeTensor.SetValue(9, 1);                // 第二个输出tensor的维度信息
    shapeTensor.SetValue(10, *(dimNums2));     // 第二个输出tensor的第一维的shape值
    shapeTensor.SetValue(11, *(dimNums2+1));   // 第二个输出tensor的第二维的shape值
    shapeTensor.SetValue(18, 1);               // 第三个输出tensor的维度信息
    shapeTensor.SetValue(19, dimNums3);        // 第三个输出tensor的第一维的shape值
    ...
    DataCopyPad(...);
}