Gather
产品支持情况
|
产品 |
是否支持 |
|---|---|
|
Atlas 350 加速卡 |
√ |
|
|
√ |
|
|
√ |
|
|
√ |
|
|
√ |
|
|
x |
|
|
x |
功能说明
给定输入的张量和一个地址偏移张量,本接口根据偏移地址将输入张量按元素收集到结果张量中。
函数原型
- tensor前n个数据计算
1 2
template <typename T> __aicore__ inline void Gather(const LocalTensor<T>& dst, const LocalTensor<T>& src, const LocalTensor<uint32_t>& srcOffset, const uint32_t srcBaseAddr, const uint32_t count)
- tensor高维切分计算
- mask逐bit模式
1 2
template <typename T> __aicore__ inline void Gather(const LocalTensor<T>& dst, const LocalTensor<T>& src, const LocalTensor<uint32_t>& srcOffset, const uint32_t srcBaseAddr, const uint64_t mask[], const uint8_t repeatTime, const uint16_t dstRepStride)
- mask连续模式
1 2
template <typename T> __aicore__ inline void Gather(const LocalTensor<T>& dst, const LocalTensor<T>& src, const LocalTensor<uint32_t>& srcOffset, const uint32_t srcBaseAddr, const uint64_t mask, const uint8_t repeatTime, const uint16_t dstRepStride)
- mask逐bit模式
参数说明
|
参数名 |
描述 |
|---|---|
|
T |
操作数数据类型。 Atlas 350 加速卡,支持的数据类型为:uint8_t/int8_t/uint16_t/int16_t/half/bfloat16_t/uint32_t/int32_t/float/uint64_t/int64_t |
|
参数名称 |
输入/输出 |
含义 |
|---|---|---|
|
dst |
输出 |
目的操作数。 类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。 LocalTensor的起始地址需要32字节对齐。 |
|
src |
输入 |
源操作数。 类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。 LocalTensor的起始地址需要32字节对齐。 数据类型和dst保持一致。 |
|
srcOffset |
输入 |
每个元素在src中对应的地址偏移。 类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。 LocalTensor的起始地址需要32字节对齐。 该偏移量相对于src的起始基地址而言。单位为Bytes。取值要求如下: |
|
srcBaseAddr |
输入 |
src的起始基地址,用于指定Gather操作中源操作数的起始位置,单位为Bytes。取值应保证src元素类型位宽对齐,否则会导致非预期行为。 |
|
count |
输入 |
执行处理的数据个数。 |
|
mask/mask[] |
输入 |
|
|
repeatTime |
输入 |
指令迭代次数,每次迭代完成8个datablock(32Bytes)的数据收集,数据范围:repeatTime∈[0,255]。
特别地,针对以下型号:
操作数为8位时,每次迭代完成4个datablock(32Bytes)的数据收集。 |
|
dstRepStride |
输入 |
相邻迭代间的地址步长,单位是datablock(32Bytes)。 |
约束说明
- 针对Atlas 350 加速卡,uint8_t/int8_t数据类型仅支持tensor前n个数据计算接口。
调用示例
本样例中只展示Compute流程中的部分代码。
- tensor高维切分计算样例-mask连续模式
1 2 3 4 5
// repeatTime = 4, mask = 128, 128 elements one repeat, 512 elements total // srcLocal数据类型为half,srcOffsetLocal数据类型为uint32_t,dstLocal数据类型为half // srcBaseAddr = 0, srcLocal的起始基地址为0 // dstRepStride = 8, no gap between repeats AscendC::Gather(dstLocal, srcLocal, srcOffsetLocal, (uint32_t)0, 128, 4, 8);
- tensor高维切分计算样例-mask逐bit模式
1 2 3 4 5 6
uint64_t mask[2] = { 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF }; // repeatTime = 4, 128 elements one repeat, 512 elements total // srcLocal数据类型为half,srcOffsetLocal数据类型为uint32_t,dstLocal数据类型为half // srcBaseAddr = 0, srcLocal的起始基地址为0 // dstRepStride = 8, no gap between repeats AscendC::Gather(dstLocal, srcLocal, srcOffsetLocal, (uint32_t)0, mask, 4, 8);
- tensor前n个数据计算样例
1 2 3 4
uint32_t count = 512; // 参与计算的元素个数 // srcLocal数据类型为half,srcOffsetLocal数据类型为uint32_t,dstLocal数据类型为half // srcBaseAddr = 0, srcLocal的起始基地址为0 AscendC::Gather(dstLocal, srcLocal, srcOffsetLocal, (uint32_t)0, count);
结果示例如下:
输入数据srcOffsetLocal: [254 252 250 ... 4 2 0] 输入数据srcLocal(128个half类型数据): [0 1 2 ... 125 126 127] 输出数据(dstLocal)初始值: [0. 0. 0. 0. 0. 0. ... 0.] 进行Gather计算后,输出数据(dstLocal): [127 126 125 ... 2 1 0]