MaskReg搬出
产品支持情况
产品 |
是否支持 |
|---|---|
Atlas 350 加速卡 |
√ |
x |
|
x |
|
x |
|
x |
|
x |
|
x |
函数原型
// MaskReg搬出使用AddrReg存储偏移量 template <typename T, MaskDist dist = MaskDist::DIST_NORM> __simd_callee__ inline void StoreAlign(__ubuf__ T* dstAddr, MaskReg& mask, AddrReg offset); // MaskReg搬出POST_MODE_NORMAL场景 template <typename T, MaskDist dist = MaskDist::DIST_NORM> __simd_callee__ inline void StoreAlign(__ubuf__ T* dstAddr, MaskReg& mask); // MaskReg搬出POST_MODE_UPDATE场景 template <typename T, PostLiteral postMode, MaskDist dist = MaskDist::DIST_NORM> __simd_callee__ inline void StoreAlign(__ubuf__ T*& dstAddr, MaskReg& mask, int32_t offset); // MaskReg非对齐搬出 template <typename T> __simd_callee__ inline void StoreUnAlign(__ubuf__ T*& dstAddr, MaskReg& mask, UnalignRegForStore& ureg);
参数说明
参数名 |
输入/输出 |
描述 |
|---|---|---|
T |
输入 |
支持的数据类型为b8/b16/b32。 |
dist |
输入 |
搬运模式,MaskDist类型。取值如下:
|
mask |
输入 |
源操作数,类型为MaskTensor。 |
dstAddr |
输出 |
目的操作数在UB上的起始地址。 |
offset |
输入 |
实际搬运UB起始地址为srcAddr + offset。 |
参数名 |
输入/输出 |
描述 |
|---|---|---|
T |
输入 |
支持的数据类型为b8/b16/b32/b64。 |
dist |
输入 |
搬运模式,MaskDist类型。取值如下:
|
mask |
输入 |
源操作数,类型为MaskReg。 |
dstAddr |
输出 |
目的操作数在UB上的起始地址。 |
参数名 |
输入/输出 |
描述 |
|---|---|---|
T |
输入 |
支持的数据类型为b8/b16/b32/b64。 |
dist |
输入 |
搬运模式,MaskDist类型。取值如下:
|
postMode |
输入 |
用于控制是否使能post update。
|
mask |
输入 |
源操作数,类型为MaskTensor。 |
dstAddr |
输出 |
目的操作数在UB上的起始地址。 |
offset |
输入 |
当offset为int32_t类型时:POST_MODE_NORMAL与POST_MODE_UPDATE含义不一致。
|
参数名 |
输入/输出 |
描述 |
|---|---|---|
T |
输入 |
支持的数据类型为b16/b32。 |
mask |
输入 |
源操作数,类型为MaskTensor。 |
dstAddr |
输出 |
目的操作数在UB上的起始地址。 |
ureg |
输出 |
UnalignRegForStore,非对齐寄存器,用于保存非对齐数据,长度32B。调用完StoreUnAlign(MaskReg非对齐搬出接口)后,需要调用StoreUnAlignPost接口,传入该非对齐寄存器,将未写出的数据写出到目的地址中。 |
返回值说明
无
约束说明
无
调用示例
template <typename T>
__simd_vf__ inline void StoreAlignVF(__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);
}
}