Fonction Select du kit de développement asc-devkit CANN

Select

L'asc-devkit est le langage de développement de programmes d'opérateurs dédié aux processeurs AI Ascend de Huawei CANN. Il supporte nativement les normes C et C++ et est principalement composé d'une bibliothèque de classes et d'une couche d'extensions linguistiques, fournissant une API multi-niveaux pour répondre aux besoins de développement d'opérateurs dans diverses scénarios.

Compatibilité matérielle

Produit Support
Ascend 950PR / Ascend 950DT Oui
Séries d'entraînement / inférence Atlas A3 Non
Séries d'entraînement / inférence Atlas A2 Non
Produits d'inférence Atlas 200I/500 A2 Non
Produits d'inférence Atlas AI Core Non
Produits d'inférence Atlas Vector Core Non
Séries d'entraînement Atlas Non

Description fonctionnelle

À partir de deux opérandes sources srcReg0 et srcReg1, la fonction sélectionne les éléments en fonction des bits du masque pour produire l'opérande destination dstReg. La règle de sélection est la suivante : lorsqu'un bit du masque vaut 1, l'élément correspondant est pris depuis srcReg0 ; lorsque le bit vaut 0, l'élément proveint de srcReg1.

Prototype de la fonction

template <typename T = DefaultType, typename U>
__simd_callee__ inline void Select(U& dstReg, U& srcReg0, U& srcReg1, MaskReg& mask)

Paramètres

Paramètres template

Nom Description
T Type de données des opérandes. Pour les Ascend 950PR/950DT, les types supportés sont : bool, uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, half, float, bfloat16_t, uint64_t, int64_t.
U Type RegTensor des opérandes sources et destination, par exemple RegTensor<half>. Ce type est déduit automatiquement par le compilateur.

Paramètres de la fonction

Nom Entrée/Sortie Description
dstReg Sortie Opérande destination, de type RegTensor.
srcReg0, srcReg1 Entrée Opérandes sources, de type RegTensor. Leurs types de données doivent correspondre à celui de la destination.
mask Entrée Définit la règle de sélection : un bit à 1 dans le masque entraîne la sélection dans srcReg0, un bit à 0 la sélection dans srcReg1.

Valeur de retour

Aucune.

Contraintes

Aucune.

Exemple d'appel

template<typename T>
__simd_vf__ inline void ProcessSelection(__ubuf__ T* output, __ubuf__ T* inputA, __ubuf__ T* inputB, 
                                         uint32_t elementCount, uint32_t blockSize, uint16_t blocks)
{
    AscendC::Reg::RegTensor<T> regA;
    AscendC::Reg::RegTensor<T> regB;
    AscendC::Reg::RegTensor<T> resultReg;
    AscendC::Reg::MaskReg selMask;
    AscendC::Reg::MaskReg conditionMask;
    
    for (uint16_t blockIdx = 0; blockIdx < blocks; blockIdx++) {
        selMask = AscendC::Reg::UpdateMask<T>(elementCount);
        AscendC::Reg::LoadAlign(regA, inputA + blockIdx * blockSize);
        AscendC::Reg::LoadAlign(regB, inputB + blockIdx * blockSize);
        AscendC::Reg::Compare<T, AscendC::CMPMODE::EQ>(conditionMask, regA, regB, selMask);
        AscendC::Reg::Select(resultReg, regA, regB, conditionMask);
        AscendC::Reg::StoreAlign(output + blockIdx * blockSize, resultReg, selMask);
    }
}

Étiquettes: cann Ascend asc-devkit programmation vectorielle opérateurs IA

Publié le 12 juillet à 01h34