MaskReg搬入
产品支持情况
产品 |
是否支持 |
|---|---|
Atlas 350 加速卡 |
√ |
x |
|
x |
|
x |
|
x |
|
x |
|
x |
功能说明
Reg矢量计算数据搬运接口,适用于从UB或RegTensor搬入MaskReg。
函数原型
1 2 3 4 5 6 7 8 9 10 11 12 | // MaskReg搬入使用 AddrReg 存储偏移量 template <typename T, MaskDist dist = MaskDist::DIST_NORM> __simd_callee__ inline void LoadAlign(MaskReg& mask, __ubuf__ T* srcAddr, AddrReg offset); // MaskReg搬入POST_MODE_NORMAL 场景 template <typename T, MaskDist dist = MaskDist::DIST_NORM> __simd_callee__ inline void LoadAlign(MaskReg& mask, __ubuf__ T* srcAddr); // MaskReg搬入POST_MODE_UPDATE 场景 template <typename T, PostLiteral postMode, MaskDist dist = MaskDist::DIST_NORM> __simd_callee__ inline void LoadAlign(MaskReg& mask, __ubuf__ T* &srcAddr, int32_t offset); // MaskReg从RegTensor搬入 template <typename T = DefaultType, int16_t offset, typename U> __simd_callee__ inline void MaskGenWithRegTensor(MaskReg& dst, U& srcReg); |
参数说明
参数名 |
输入/输出 |
描述 |
|---|---|---|
T |
输入 |
操作数数据类型。支持的数据类型为b8/b16/b32。 |
dist |
输入 |
搬运模式, MaskDist类型。取值如下:
|
mask |
输出 |
目的操作数,类型为MaskReg。 |
srcAddr |
输入/输出 |
源操作数在UB上的起始地址。 |
offset |
输入 |
实际搬运UB起始地址为 srcAddr + offset。 |
参数名 |
输入/输出 |
描述 |
|---|---|---|
T |
输入 |
操作数数据类型。支持的数据类型为b8/b16/b32/b64。 |
dist |
输入 |
搬运模式, MaskDist类型。取值如下:
|
mask |
输出 |
目的操作数,类型为MaskTensor。 |
srcAddr |
输入/输出 |
源操作数在UB上的起始地址。 |
参数名 |
输入/输出 |
描述 |
|---|---|---|
T |
输入 |
操作数数据类型。支持的数据类型为b8/b16/b32/b64。 |
dist |
输入 |
搬运模式, MaskDist类型。取值如下:
|
postMode |
输入 |
用于控制是否使能post update。
|
mask |
输出 |
目的操作数,类型为MaskTensor。 |
srcAddr |
输入/输出 |
源操作数在UB上的起始地址。 |
offset |
输入 |
当offset为int32_t类型时,POST_MODE_NORMAL与POST_MODE_UPDATE含义不一致。
|
参数名 |
输入/输出 |
描述 |
|---|---|---|
T |
输入 |
操作数数据类型。支持的数据类型为b16/b32。 |
U |
输入 |
源操作数的RegTensor类型,例如RegTensor<half>,由编译器自动推导,用户不需要填写。 |
dst |
输出 |
目的操作数,类型为MaskTensor。 |
srcReg |
输入 |
源操作数,类型为RegTensor。 |
offset |
输入 |
offset决定了srcReg中数据搬运的起始地址,当数据类型为T为b16时,计算公式为offset* 16,由于VL为256Byte,因此此时offset取值范围为0-15,同理,T为b32数据类型时,计算公式为offset* 8,offset的取值范围为0-31。 当数据类型为B16时,dst[i] = srcReg[offset*VL/16 + i/2],按bit位进行计算。 当数据类型为B32时,dst[i] = srcReg[offset*VL/32 + i/4],,按bit位进行计算。 |

返回值说明
无
约束说明
无
调用示例
template <typename T>
__simd_vf__ inline void LoadAlignVF(__ubuf__ T* dstAddr, __ubuf__ T* srcAddr, uint32_t count, uint32_t oneRepeatSize, uint16_t repeatTimes)
{
AscendC::Reg::MaskReg mask;;
for (uint16_t i = 0; i < repeatTimes; ++i) {
mask = AscendC::Reg::UpdateMask<T>(count);
AscendC::Reg::AddrReg offset = AscendC::Reg::CreateAddrReg<T>(i, oneRepeatSize);
AscendC::Reg::LoadAlign(mask, srcAddr, offset);
AscendC::Reg::StoreAlign(dstAddr, mask, offset);
}
}
template <typename T, int16_t offset>
__simd_vf__ inline void MaskGenWithRegTensorVF(__ubuf__ T* dstAddr, __ubuf__ T* srcAddr)
{
AscendC::Reg::RegTensor<T> srcReg;
AscendC::Reg::MaskReg mask = AscendC::Reg::CreateMask<T>();
AscendC::Reg::LoadAlign(srcReg, srcAddr);
AscendC::Reg::MaskGenWithRegTensor<T, offset>(mask, srcReg);
AscendC::Reg::StoreAlign(dstAddr, mask);
}