Squeeze
产品支持情况
- Ascend 950PR/Ascend 950DT:支持
- Atlas A3 训练系列产品/Atlas A3 推理系列产品:不支持
- Atlas A2 训练系列产品/Atlas A2 推理系列产品:不支持
- Atlas 200I/500 A2 推理产品:不支持
- Atlas 推理系列产品 AI Core:不支持
- Atlas 推理系列产品 Vector Core:不支持
- Atlas 训练系列产品:不支持
功能说明
头文件路径为:"basic_api/reg_compute/kernel_reg_compute_gather_mask_intf.h"。
将传入的srcReg中被mask选择的有效元素依次复制到dstReg中,有效元素在dstReg中从低到高连续排列,剩余位置元素置为0,如图1所示。

特别地,当模板参数store取值为GatherMaskMode::STORE_REG时,Squeeze会将有效元素的总字节数存入AR特殊寄存器。此时配合使用连续非对齐搬出的场景3接口(无需显式传入偏移量),StoreUnAlign会自动从AR寄存器读取有效字节数作为地址偏移,参考调用示例。
函数原型
C++
template <typename T = DefaultType, GatherMaskMode store = GatherMaskMode::NO_STORE_REG, typename U>
__simd_callee__ inline void Squeeze(U& dstReg, U& srcReg, MaskReg& mask)
参数说明
表1 模板参数说明
| 参数名 | 描述 |
|---|---|
| T | 目的操作数和源操作数的数据类型。 |
| store | GatherMaskMode选择是否将有效元素的总字节数存入AR寄存器,AR寄存器描述参考表 模板参数说明。 • NO_STORE_REG,有效元素的总字节数不存入AR寄存器; • STORE_REG,有效元素的总字节数存入AR寄存器。 |
| U | 目的操作数和源操作数的RegTensor类型,例如RegTensor<uint32_t>,由编译器自动推导,用户不需要填写。 |
表2 函数参数说明
| 参数名 | 输入/输出 | 描述 |
|---|---|---|
| dstReg | 输出 | 目的操作数。 类型为RegTensor。 |
| srcReg | 输入 | 源操作数。 类型为RegTensor。 |
| mask | 输入 | mask用于控制每次迭代内参与计算的元素。 |
返回值说明
无
数据类型
支持的数据类型为:int8_t、uint8_t、int16_t、uint16_t、half、int32_t、uint32_t、float。
约束说明
当模板参数store取值为
GatherMaskMode::STORE_REG时,由于硬件约束,StoreUnAlign指令和Squeeze指令必须交替使用,例如:C++Squeeze(dstVreg, srcVreg, mask); StoreUnAlign(dstAddr, dstVreg, ureg); Squeeze(dstVreg, srcVreg, mask); StoreUnAlign(dstAddr, dstVreg, ureg);当store取值为
GatherMaskMode::NO_STORE_REG时,不涉及AR寄存器,Squeeze和StoreUnAlign不强制交替。
调用示例
以下示例展示了Squeeze与StoreUnAlign的典型配合方式(Squeeze的STORE_REG模式,StoreUnAlign使用AR寄存器中的有效元素字节数作为偏移量):
C++
template<typename T>
__simd_vf__ inline void SqueezeVF(__ubuf__ T* dstAddr, __ubuf__ T* srcAddr, uint32_t oneRepeatSize, uint16_t repeatTimes)
{
AscendC::Reg::RegTensor<T> srcReg0;
AscendC::Reg::RegTensor<T> srcReg1;
AscendC::Reg::UnalignRegForStore ureg;
AscendC::Reg::MaskReg sqzMask = AscendC::Reg::CreateMask<T, AscendC::Reg::MaskPattern::H>();
for (uint16_t i = 0; i < repeatTimes; ++i) {
AscendC::Reg::LoadAlign<T, AscendC::Reg::PostLiteral::POST_MODE_UPDATE>(srcReg0, srcAddr, oneRepeatSize);
AscendC::Reg::Squeeze<T, AscendC::Reg::GatherMaskMode::STORE_REG>(srcReg1, srcReg0, sqzMask);
AscendC::Reg::StoreUnAlign<T, AscendC::Reg::PostLiteral::POST_MODE_UPDATE>(dstAddr, srcReg1, ureg);
}
AscendC::Reg::StoreUnAlignPost(dstAddr, ureg);
}