非连续对齐搬出
产品支持情况
功能说明
Reg矢量计算数据搬运接口,适用于从RegTensor非连续对齐搬出到UB(以DataBlock为单位)。
函数原型
// 正常场景
template <typename T = DefaultType, DataCopyMode dataMode, typename U>
__simd_callee__ inline void StoreAlign(__ubuf__ T* dstAddr, U& srcReg, uint32_t dataBlockStride, MaskReg& mask);
// POST_MODE_UPDATE场景
template <typename T = DefaultType, DataCopyMode dataMode, PostLiteral postMode, typename U>
__simd_callee__ inline void StoreAlign(__ubuf__ T*& dstAddr, U& srcReg, uint32_t dataBlockStride, uint32_t repeatStride, MaskReg& mask);
参数说明
表 1 DataCopyMode模板参数说明
表 2 参数说明
用于控制是否使能post update,PostLiteral类型。 |
||
单次搬运相邻DataBlock间的间隔(前面一个DataBlock的头与后面DataBlock的头的间隔),单位为DataBlock。 |
||
POST_MODE_NORMAL与POST_MODE_UPDATE场景下repeatStride含义不一致。
|
||
返回值说明
无
约束说明
无
调用示例
__simd_vf__ inline void Compute(__ubuf__ T* dstAddr, __ubuf__ T* srcAddr, uint16_t repeatTimes)
{
AscendC::Reg::RegTensor<T> srcReg;
AscendC::Reg::MaskReg mask = AscendC::Reg::CreateMask<T>();
for (uint16_t i = 0; i < repeatTimes; ++i) {
AscendC::Reg::LoadAlign<T, AscendC::Reg::DataCopyMode::DATA_BLOCK_COPY, AscendC::Reg::PostLiteral::POST_MODE_UPDATE>(srcReg, srcAddr, 1, i * 8, mask);
AscendC::Reg::StoreAlign<T, AscendC::Reg::DataCopyMode::DATA_BLOCK_COPY, AscendC::Reg::PostLiteral::POST_MODE_UPDATE>(dstAddr, srcReg, 1, i * 8, mask);
}
}