产品 |
是否支持 |
|---|---|
Ascend 950PR/Ascend 950DT |
√ |
√ |
|
√ |
|
√ |
|
√ |
|
x |
|
√ |
逐元素比较两个tensor大小,如果比较后的结果为真,则输出结果的对应比特位为1,否则为0。
支持多种比较模式:
1 2 3 4 5 6 | dst = src0 < src1; dst = src0 > src1; dst = src0 <= src1; dst = src0 >= src1; dst = src0 == src1; dst = src0 != src1; |
1 2 | template <typename T, typename U> __aicore__ inline void Compare(const LocalTensor<U>& dst, const LocalTensor<T>& src0, const LocalTensor<T>& src1, CMPMODE cmpMode, uint32_t count) |
1 2 | template <typename T, typename U, bool isSetMask = true> __aicore__ inline void Compare(const LocalTensor<U>& dst, const LocalTensor<T>& src0, const LocalTensor<T>& src1, CMPMODE cmpMode, const uint64_t mask[], uint8_t repeatTime, const BinaryRepeatParams& repeatParams) |
1 2 | template <typename T, typename U, bool isSetMask = true> __aicore__ inline void Compare(const LocalTensor<U>& dst, const LocalTensor<T>& src0, const LocalTensor<T>& src1, CMPMODE cmpMode, const uint64_t mask, uint8_t repeatTime, const BinaryRepeatParams& repeatParams) |
参数名 |
描述 |
|---|---|
T |
源操作数数据类型。 Ascend 950PR/Ascend 950DT,支持的数据类型为:int8_t、uint8_t、int16_t、uint16_t、half、bfloat16_t、int32_t、uint32_t、float、int64_t、uint64_t、double。 |
U |
目的操作数数据类型。 Ascend 950PR/Ascend 950DT,支持的数据类型为:int8_t、uint8_t。 |
isSetMask |
保留参数,保持默认值即可。 |
参数名称 |
输入/输出 |
含义 |
|---|---|---|
dst |
输出 |
目的操作数。 类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。 LocalTensor的起始地址需要32字节对齐。 dst用于存储比较结果,将dst中uint8_t类型的数据按照bit位展开,由左至右依次表征对应位置的src0和src1的比较结果,如果比较后的结果为真,则对应比特位为1,否则为0。 |
src0、src1 |
输入 |
源操作数。 类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。 LocalTensor的起始地址需要32字节对齐。 |
cmpMode |
输入 |
CMPMODE类型,表示比较模式,包括EQ,NE,GE,LE,GT,LT。
|
mask/mask[] |
输入 |
mask用于控制每次迭代内参与计算的元素。 Ascend 950PR/Ascend 950DT,设置有效。
|
repeatTime |
输入 |
重复迭代次数。矢量计算单元,每次读取连续的256Bytes数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。repeatTime表示迭代的次数。 关于该参数的具体描述请参考高维切分API。 |
repeatParams |
输入 |
控制操作数地址步长的参数。BinaryRepeatParams类型,包含操作数相邻迭代间相同datablock的地址步长,操作数同一迭代内不同datablock的地址步长等参数。 相邻迭代间的地址步长参数说明请参考repeatStride;同一迭代内DataBlock的地址步长参数说明请参考dataBlockStride。 |
count |
输入 |
参与计算的元素个数。设置count时,需要保证count个元素所占空间256字节对齐。 |
无
本样例中,源操作数src0和src1各存储了256个float类型的数据。样例实现的功能为,逐元素对src0和src1中的数据进行比较,如果src0中的元素小于src1中的元素,dst结果中对应的比特位置1;反之,则置0。dst结果使用uint8_t类型数据存储。
1 2 3 4 5 6 | dstLocal = src0Local < src1Local; // 小于 LT dstLocal = src0Local > src1Local; // 大于 GT dstLocal = src0Local <= src1Local; // 小于等于 LE dstLocal = src0Local >= src1Local; // 大于等于 GE dstLocal = src0Local == src1Local; // 等于 EQ dstLocal = src0Local != src1Local; // 不等于 NE |
1 2 3 4 5 6 7 | // srcDataSize:参与计算的元素个数 AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::LT, srcDataSize); AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::GT, srcDataSize); AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::LE, srcDataSize); AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::GE, srcDataSize); AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::EQ, srcDataSize); AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::NE, srcDataSize); |
LT:小于
输入数据src0Local:[ 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 7 7 7 7 7 7 7 7
11 11 11 11 11 11 11 11 13 13 13 13 13 13 13 13 17 17 17 17 17 17 17 17 19 19 19 19 19 19 19 19 ]
输入数据src1Local:[ 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4 4 6 6 6 6 6 6 6 6 8 8 8 8 8 8 8 8
10 10 10 10 10 10 10 10 12 12 12 12 12 12 12 12 14 14 14 14 14 14 14 14 16 16 16 16 16 16 16 16 ]
输出数据dstLocal: [ 0 127 127 127 0 0 0 0 ]
GT:大于
输入数据src0Local:[ 2 3 5 7 11 13 17 19 ... ]
输入数据src1Local:[ 2 4 6 8 10 12 14 16 ... ]
逐元素比较结果: [ 0 0 0 0 1 1 1 1 ... ]
输出数据dstLocal: [ 240(0b11110000) ... ]
GE:大于或等于
输入数据src0Local:[ 2 3 5 7 11 13 17 19 ... ]
输入数据src1Local:[ 2 4 6 8 10 12 14 16 ... ]
输出数据dstLocal: [ 241(0b11110001) ... ]
LE:小于或等于
输入数据src0Local:[ 2 3 5 7 11 13 17 19 ... ]
输入数据src1Local:[ 2 4 6 8 10 12 14 16 ... ]
输出数据dstLocal: [ 15(0b00001111) ... ]
EQ:等于
输入数据src0Local:[ 2 3 5 7 11 13 17 19 ... ]
输入数据src1Local:[ 2 4 6 8 10 12 14 16 ... ]
输出数据dstLocal: [ 1(0b00000001) ... ]
NE:不等于
输入数据src0Local:[ 2 3 5 7 11 13 17 19 ... ]
输入数据src1Local:[ 2 4 6 8 10 12 14 16 ... ]
输出数据dstLocal: [ 126(0b11111110) ... ]
1 2 3 4 5 6 7 8 9 10 11 | // masks数组控制每次迭代参与计算的元素,两个uint64_t的值一共128bit,每个bit可以控制一个元素,为1则参与计算,为0则不参与计算 // masks[0]可以控制前64个元素,低bit位控制索引小的元素;masks[1]同理,可以控制后64个元素 // 例如,对float类型数据,每次迭代处理256B / sizeof(float) = 64个元素,因此只需要通过masks[0]即可进行控制 uint64_t masks[2] = {858993459, 0}; // 858993459(0x33333333) // repeat: 1, dstBlkStride: 1, src0BlkStride: 1, src1BlkStride: 1, dstRepStride: 1, src0RepStride: 8, src1RepStride: 8 AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::LT, masks, 1, { 1, 1, 1, 1, 8, 8 }); AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::GT, masks, 1, { 1, 1, 1, 1, 8, 8 }); AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::LE, masks, 1, { 1, 1, 1, 1, 8, 8 }); AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::GE, masks, 1, { 1, 1, 1, 1, 8, 8 }); AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::EQ, masks, 1, { 1, 1, 1, 1, 8, 8 }); AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::NE, masks, 1, { 1, 1, 1, 1, 8, 8 }); |
LE:小于等于
输入数据src0Local:[ 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 7 7 7 7 7 7 7 7
11 11 11 11 11 11 11 11 13 13 13 13 13 13 13 13 17 17 17 17 17 17 17 17 19 19 19 19 19 19 19 19 ]
输入数据src1Local:[ 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4 4 6 6 6 6 6 6 6 6 8 8 8 8 8 8 8 8
10 10 10 10 10 10 10 10 12 12 12 12 12 12 12 12 14 14 14 14 14 14 14 14 16 16 16 16 16 16 16 16 ]
输入数据masks:{ 858993459, 0 }
输出数据dstLocal: [ 51 51 51 51 0 0 0 0 ]
1 2 3 4 5 6 7 8 9 10 | // mask控制每次迭代参与计算的连续元素个数 // 例如,对float类型数据,每次迭代处理256B / sizeof(float) = 64个元素,因此mask可取值1至64 uint64_t mask = 28; // repeat: 1, dstBlkStride: 1, src0BlkStride: 1, src1BlkStride: 1, dstRepStride: 1, src0RepStride: 8, src1RepStride: 8 AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::LT, mask, 1, { 1, 1, 1, 1, 8, 8 }); AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::GT, mask, 1, { 1, 1, 1, 1, 8, 8 }); AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::LE, mask, 1, { 1, 1, 1, 1, 8, 8 }); AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::GE, mask, 1, { 1, 1, 1, 1, 8, 8 }); AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::EQ, mask, 1, { 1, 1, 1, 1, 8, 8 }); AscendC::Compare(dstLocal, src0Local, src1Local, AscendC::CMPMODE::NE, mask, 1, { 1, 1, 1, 1, 8, 8 }); |
LE:小于等于
输入数据src0Local:[ 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 7 7 7 7 7 7 7 7
11 11 11 11 11 11 11 11 13 13 13 13 13 13 13 13 17 17 17 17 17 17 17 17 19 19 19 19 19 19 19 19 ]
输入数据src1Local:[ 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4 4 6 6 6 6 6 6 6 6 8 8 8 8 8 8 8 8
10 10 10 10 10 10 10 10 12 12 12 12 12 12 12 12 14 14 14 14 14 14 14 14 16 16 16 16 16 16 16 16 ]
输入数据mask:28
输出数据dstLocal: [ 127 127 127 16 0 0 0 0 ]