CANN/asc-devkit: Operação StoreAlign para Movimentação Não Contígua

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);
    }
}

Tags: StoreAlign RegTensor DataBlock CANN asc-devkit

Publicado em 9-12 04:03