非连续对齐搬入
产品支持情况
产品 |
是否支持 |
|---|---|
Atlas 350 加速卡 |
√ |
x |
|
x |
|
x |
|
x |
|
x |
|
x |
功能说明
Reg矢量计算数据搬运接口,适用于从UB非连续对齐搬入RegTensor(以DataBlock为单位)。
函数原型
// 正常场景 template <typename T = DefaultType, DataCopyMode dataMode, typename U> __simd_callee__ inline void LoadAlign(U& dstReg, __ubuf__ T* srcAddr, uint32_t dataBlockStride, MaskReg& mask); // POST_MODE_UPDATE场景 template <typename T = DefaultType, DataCopyMode dataMode, PostLiteral postMode, typename U> __simd_callee__ inline void LoadAlign(U& dstReg, __ubuf__ T*& srcAddr, 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>,由编译器自动推导,用户不需要填写。 |
dstReg |
输出 |
目的操作数,类型为RegTensor。 |
srcAddr |
输入/输出 |
源操作数在UB上的起始地址。 |
dataBlockStride |
输入 |
单次搬运相邻DataBlock间的间隔(前面一个DataBlock的头与后面DataBlock的头的间隔),单位为DataBlock。 |
repeatStride |
输入 |
POST_MODE_NORMAL与POST_MODE_UPDATE场景下repeatStride含义不一致。
|
mask |
输入 |
MaskReg类型,指示在搬运过程中哪些DataBlock有效。 某个DataBlock对应的32bit有任意一位为1,该DataBlock对应的数据会搬入到dst。 某个DataBlock对应的32bit全为0时,该DataBlock对应的数据不会被读取,对应位置的dst设置为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);
}
}