非连续对齐搬出
产品支持情况
产品 |
是否支持 |
|---|---|
Atlas 350 加速卡 |
√ |
x |
|
x |
|
x |
|
x |
|
x |
|
x |
功能说明
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);
参数说明
DataCopyMode取值 |
含义 |
|---|---|
DATA_BLOCK_COPY |
用来在非连续对齐场景选择搬运模式。当前仅支持DataBlock搬运模式,即以DataBlock为粒度进行搬运。 |
参数名 |
输入/输出 |
描述 |
|---|---|---|
T |
输入 |
模板参数,支持的数据类型为b8/b16/b32。 |
postMode |
输入 |
用于控制是否使能post update,PostLiteral类型。 |
U |
输入 |
RegTensor类型, 例如RegTensor<half>,由编译器自动推导,用户不需要填写。 |
srcReg |
输入 |
源操作数,类型为RegTensor。 |
dstAddr |
输入 |
目的操作数在UB上的起始地址。 |
dataBlockStride |
输入 |
单次搬运相邻DataBlock间的间隔(前面一个DataBlock的头与后面DataBlock的头的间隔),单位为DataBlock。 |
repeatStride |
输入 |
POST_MODE_NORMAL与POST_MODE_UPDATE场景下repeatStride含义不一致。
|
mask |
输入 |
MaskReg类型,指示在搬运过程中哪些元素有效。 某个DataBlock对应的32bit全为0时,即使该UB越界也不会报错。 |
返回值说明
无
约束说明
无
调用示例
__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);
}
}
父主题: Reg数据搬运