A função StoreAlign realiza a movimentação de dados a partir de um RegTensor não contíguo e alinhado para a memória UB (Unified Buffer), operando em unidades de bloco de dados (DataBlock). Essa operação é projetada para cenários onde os dados de origem estão armazenados de forma não sequencial no registrador vetorial.
Compatibilidade de Produtos
| Produto | Suportado |
|---|---|
| Ascend 950PR / Ascend 950DT | ✓ |
| Série Atlas A3 (Treinamento e Inferência) | ✗ |
| Série Atlas A2 (Treinamento e Inferência) | ✗ |
| Atlas 200I/500 A2 (Inferência) | ✗ |
| Série Atlas Inferência (AI Core) | ✗ |
| Série Atlas Inferência (Vector Core) | ✗ |
| Série Atlas Treinamento | ✗ |
Assinaturas da Função
// Modo normal
template <typename T = DefaultType, DataCopyMode dataMode, typename U>
__simd_callee__ inline void StoreAlign(__ubuf__ T* dstAddr, U& srcReg, uint32_t dataBlockStride, MaskReg& mask);
// Modo com pós-atualização (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);
Parâmetros
Parâmetro de Template DataCopyMode
| Valor | Significado |
|---|---|
DATA_BLOCK_COPY |
Seleciona o modo de movimentação baseado em DataBlock, adequado para cenários não contíguos e alinhados. |
Parâmetros da Função
| Nome | Entrada/Saída | Descrição |
|---|---|---|
T |
Entrada | Tipo de dado suportado: b8, b16, b32. |
postMode |
Entrada | Controla a ativação da pós-atualização do endereço de destino (PostLiteral). |
U |
Entrada | Tipo RegTensor (ex.: RegTensor<half>), deduzido pelo compilador. |
srcReg |
Entrada | Operando de origem, do tipo RegTensor. |
dstAddr |
Entrada | Endereço inicial na UB onde os dados serão armazenados. |
dataBlockStride |
Entrada | Intervalo entre blocos consecutivos (do início de um bloco ao início do próximo), medido em DataBlock. |
repeatStride |
Entrada | No modo POST_MODE_NORMAL: endereço efetivo = dstAddr + repeatStride * 32. No modo POST_MODE_UPDATE: o endereço é atualizado após a operação (dstAddr += repeatStride * 32). |
mask |
Entrada | Máscara do tipo MaskReg que indica quais elementos são válidos. Se todos os 32 bits de um DataBlock forem zero, o acesso fora dos limites da UB não gera erro. |
Valor de Retorno
Nenhum.
Restrições
Nenhuma.
Exemplo de Uso
__simd_vf__ inline void Compute(__ubuf__ T* endDestino, __ubuf__ T* endFonte, uint16_t numRepeticoes)
{
AscendC::Reg::RegTensor<T> regFonte;
AscendC::Reg::MaskReg mascara = AscendC::Reg::CreateMask<T>();
for (uint16_t iter = 0; iter < numRepeticoes; ++iter) {
AscendC::Reg::LoadAlign<T, AscendC::Reg::DataCopyMode::DATA_BLOCK_COPY,
AscendC::Reg::PostLiteral::POST_MODE_UPDATE>(
regFonte, endFonte, 1, iter * 8, mascara);
AscendC::Reg::StoreAlign<T, AscendC::Reg::DataCopyMode::DATA_BLOCK_COPY,
AscendC::Reg::PostLiteral::POST_MODE_UPDATE>(
endDestino, regFonte, 1, iter * 8, mascara);
}
}