Scatter(ISASI)
产品支持情况
功能说明
给定一个连续的输入张量和一个目的地址偏移张量,Scatter指令根据偏移地址生成新的结果张量后将输入张量分散到结果张量中。
将源操作数src中的元素按照指定的位置(由dst_offset和base_addr共同作用)分散到目的操作数dst中。
函数原型
-
tensor前n个数据计算
template <typename T> __aicore__ inline void Scatter(const LocalTensor<T>& dst, const LocalTensor<T>& src, const LocalTensor<uint32_t>& dstOffset, const uint32_t dstBaseAddr, const uint32_t count) -
tensor高维切分计算
-
mask逐bit模式
template <typename T> __aicore__ inline void Scatter(const LocalTensor<T>& dst, const LocalTensor<T>& src, const LocalTensor<uint32_t>& dstOffset, const uint32_t dstBaseAddr, const uint64_t mask[], const uint8_t repeatTime, const uint8_t srcRepStride) -
mask连续模式
template <typename T> __aicore__ inline void Scatter(const LocalTensor<T>& dst, const LocalTensor<T>& src, const LocalTensor<uint32_t>& dstOffset, const uint32_t dstBaseAddr, const uint64_t mask, const uint8_t repeatTime, const uint8_t srcRepStride)
-
参数说明
表 1 模板参数说明
|
Ascend 950PR/Ascend 950DT,支持的数据类型为:uint8_t/int8_t/uint16_t/int16_t/half/bfloat16_t/uint32_t/int32_t/float/uint64_t/int64_t |
表 2 参数说明
约束说明
-
操作数地址对齐要求请参见通用地址对齐约束。
-
操作数地址重叠约束请参考通用地址重叠约束。
-
dstOffset中的偏移地址不能有相同值,如果存在2个或者多个偏移重复的情况,行为是不可预期的。
-
针对Ascend 950PR/Ascend 950DT,uint8_t/int8_t数据类型仅支持tensor前n个数据计算接口。
调用示例
#include "kernel_operator.h"
AscendC::TPipe m_pipe;
AscendC::TQue<AscendC::TPosition::VECIN, 1> m_queCalc;
AscendC::GlobalTensor<T> m_valueGlobal;
uint32_t m_concatRepeatTimes;
uint32_t m_sortRepeatTimes;
uint32_t m_extractRepeatTimes;
uint32_t m_elementCount;
AscendC::GlobalTensor<uint32_t> m_dstOffsetGlobal;
AscendC::GlobalTensor<T> m_srcGlobal;
AscendC::GlobalTensor<T> m_dstGlobal;
AscendC::TQue<AscendC::TPosition::VECIN, 2> m_queIn;
AscendC::TQue<AscendC::TPosition::VECOUT, 1> m_queOut;
AscendC::LocalTensor<T> srcLocal = m_queIn.AllocTensor<T>();
AscendC::DataCopy(srcLocal, m_srcGlobal, m_elementCount);
m_queIn.EnQue(srcLocal);
AscendC::LocalTensor<uint32_t> dstOffsetLocal = m_queIn.AllocTensor<uint32_t>();
AscendC::DataCopy(dstOffsetLocal, m_dstOffsetGlobal, m_elementCount);
m_queIn.EnQue(dstOffsetLocal);
AscendC::LocalTensor<T> srcLocal = m_queIn.DeQue<T>();
AscendC::LocalTensor<uint32_t> dstOffsetLocal = m_queIn.DeQue<uint32_t>();
AscendC::LocalTensor<T> dstLocal = m_queOut.AllocTensor<T>();
dstLocal.SetSize(m_elementCount);
AscendC::Scatter(dstLocal, srcLocal, dstOffsetLocal, (uint32_t)0, m_elementCount);
m_queIn.FreeTensor(srcLocal);
m_queIn.FreeTensor(dstOffsetLocal);
m_queOut.EnQue(dstLocal);
AscendC::LocalTensor<T> dstLocal = m_queOut.DeQue<T>();
AscendC::DataCopy(m_dstGlobal, dstLocal, m_elementCount);
m_queOut.FreeTensor(dstLocal)
结果示例:
输入数据dstOffsetLocal:
[254 252 250 ... 4 2 0]
输入数据srcLocal(128个half类型数据):
[0 1 2 ... 125 126 127]
输出数据dstGlobal:
[127 126 125 ... 2 1 0]